[AITech] 20220211 - Python Visualization Libraries

4 minute read


학습 내용

라이브러리 다운로드 및 버전 확인

# !pip install --upgrade pip
# !pip install missingno squarify pywaffle matplotlib_venn

import missingno as msno
import squarify
import pywaffle
import matplotlib_venn


MissingNo

missingno 라이브러리는 결측치(NaN)를 시각화하는 파이썬 시각화 라이브러리입니다.

missingno 실습을 위해 결측치가 있는 titanic dataset를 사용하겠습니다.

titanic = sns.load_dataset('titanic')
titanic.head()
survived pclass sex age sibsp parch fare embarked class who adult_male deck embark_town alive alone
0 0 3 male 22.0 1 0 7.2500 S Third man True NaN Southampton no False
1 1 1 female 38.0 1 0 71.2833 C First woman False C Cherbourg yes False
2 1 3 female 26.0 0 0 7.9250 S Third woman False NaN Southampton yes True
3 1 1 female 35.0 1 0 53.1000 S First woman False C Southampton yes False
4 0 3 male 35.0 0 0 8.0500 S Third man True NaN Southampton no True
titanic.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):
 #   Column       Non-Null Count  Dtype   
---  ------       --------------  -----   
 0   survived     891 non-null    int64   
 1   pclass       891 non-null    int64   
 2   sex          891 non-null    object  
 3   age          714 non-null    float64 
 4   sibsp        891 non-null    int64   
 5   parch        891 non-null    int64   
 6   fare         891 non-null    float64 
 7   embarked     889 non-null    object  
 8   class        891 non-null    category
 9   who          891 non-null    object  
 10  adult_male   891 non-null    bool    
 11  deck         203 non-null    category
 12  embark_town  889 non-null    object  
 13  alive        891 non-null    object  
 14  alone        891 non-null    bool    
dtypes: bool(2), category(2), float64(2), int64(4), object(5)
memory usage: 80.6+ KB


import missingno as msno

missingno는 결측치를 matrix로 나타내어 흰 부분으로 표시합니다.

msno.matrix(titanic)

output_11_1

row당 결측치의 개수가 다르기 때문에 다음과 같이 정렬을 진행할 수 있습니다.

msno.matrix(titanic, 
            sort='descending', # ascending
           ) 

output_13_1

위의 방법 외에는 개수를 직접적으로 bar chart를 그려주는 방법이 있습니다.

msno.bar(titanic)

output_15_1


Squarify

Squarify는 계층적 데이터를 표현하는 시각화인 Treemap을 위한 라이브러리입니다.

image-20220213003449103


import squarify

values = [100, 200, 300, 400]
squarify.plot(values)

image-20220213004212911

다음과 같은 파라미터들로 커스텀할 수 있습니다.

  • label : 텍스트 라벨을 달아줍니다. (Pie차트와 유사)
  • color : 색을 개별적으로 지정 가능
  • pad
  • text_kwargs : 텍스트 요소를 딕셔너리로 전달
fig, ax = plt.subplots()
values = [100, 200, 300, 400]
label = list('ABCD')
color = ['#4285F4', '#DB4437', '#F4B400', '#0F9D58']

squarify.plot(values, label=label, color=color, pad=0.2, 
               text_kwargs={'color':'white', 'weight':'bold'}, ax=ax)

ax.axis('off')
plt.show()

image-20220213004338568


PyWaffle

PyWaffle이 만들어주는 Waffle Chart는 와플 형태로 discrete하게 값을 나타내는 차트로, 기본적인 형태는 정사각형이나 원하는 벡터 이미지로도 사용이 가능합니다. 다양한 Icon을 활용하여 인포그래픽에서 유용하게 사용할 수 있습니다.

image-20220213004707088

기본 Waffle

  • rowscoloums로 사각형의 전체 형태를 지정할 수 있습니다.
  • values로 값 전달
from pywaffle import Waffle
fig = plt.figure(
    FigureClass=Waffle, 
    rows=5, 
    columns=10, 
    values=[48, 46, 6],
    figsize=(5, 3)
)
plt.show()

output_31_0

legend

  • legend는 딕셔너리로 전달합니다. 우측 상단 또는 중앙 하단을 추천합니다.
data = {'A': 50, 'B': 45, 'C': 15}

fig = plt.figure(
    FigureClass=Waffle, 
    rows=5, 
    values=data, 
    legend={'loc': 'upper left', 'bbox_to_anchor': (1.1, 1)}
)
plt.show()

output_33_0

Color

  • cmap_name : 컬러맵을 전달해서 색을 변경할 수 있습니다.
data = {'A': 50, 'B': 45, 'C': 15}

fig = plt.figure(
    FigureClass=Waffle, 
    rows=5, 
    values=data, 
    cmap_name='tab10',
    legend={'loc': 'lower left', 'bbox_to_anchor': (0, -0.4), 'ncol': len(data), 'framealpha': 0},
)

plt.show()

output_35_0

  • colors : 각 범주의 색을 전달할 수도 있습니다.
data = {'A': 50, 'B': 45, 'C': 15}

fig = plt.figure(
    FigureClass=Waffle, 
    rows=5, 
    values=data, 
    colors=["#232066", "#983D3D", "#DCB732"],
    legend={'loc': 'lower left', 'bbox_to_anchor': (0, -0.4), 'ncol': len(data), 'framealpha': 0},
)

plt.show()

output_37_0

Block Arraging Style

  • starting_location : 네 꼭지점을 기준으로 시작점을 잡을 수 있습니다.
data = {'A': 50, 'B': 45, 'C': 15}

fig = plt.figure(
    FigureClass=Waffle, 
    rows=5, 
    values=data, 
    legend={'loc': 'lower left', 'bbox_to_anchor': (0, -0.4), 'ncol': len(data), 'framealpha': 0},
    starting_location='SE' # NW, SW, NE and SE
)

plt.show()

output_39_0

  • vertical : 기본적으로는 가로로 진행합니다. 세로로 진행하고 싶다면 True를 전달하면 됩니다.
data = {'A': 50, 'B': 45, 'C': 15}

fig = plt.figure(
    FigureClass=Waffle, 
    rows=5, 
    values=data, 
    legend={'loc': 'lower left', 'bbox_to_anchor': (0, -0.4), 'ncol': len(data), 'framealpha': 0},
    vertical=True
)

plt.show()

output_41_0

  • block_arranging_style : 어떤 식으로 나열 할지 정할 수 있습니다. 기본은 snake 방식입니다.
fig = plt.figure(
    FigureClass=Waffle,
    rows=7,
    values=data, 
    legend={'loc': 'lower left', 'bbox_to_anchor': (0, -0.4), 'ncol': len(data), 'framealpha': 0},
    block_arranging_style= 'new-line',
)

output_43_0

Icon

Font Awesome의 아이콘을 사용할 수 있습니다.

  • icons : 아이콘 명칭
  • icon_legend : 아이콘을 범례로 사용할 것인가
  • font_size : 아이콘 사이즈
fig = plt.figure(
    FigureClass=Waffle, 
    rows=10,     
    values=data, 
    legend={'loc': 'lower left', 'bbox_to_anchor': (0, -0.4), 'ncol': len(data), 'framealpha': 0},
    icons='child',
    icon_legend=True,
    font_size=15,
)
plt.show()

output_45_0


Matplotlib_venn

Venn은 집합 등에서 사용하는 익숙한 벤 다이어그램을 나타냅니다. EDA보다는 출판 및 프레젠테이션에 사용하고, 디테일한 사용이 draw.io나 ppt에 비해 어렵습니다.

2개의 Subset

이진법을 사용하여 각각에 들어갈 값을 정할 수 있습니다.

  • 01 : 1번째 Set에 들어갈 내용
  • 10 : 2번째 Set에 들어갈 내용
  • 11 : 교집합에 들어갈 내용
from matplotlib_venn import venn2
venn2(subsets = (3, 2, 1))
<matplotlib_venn._common.VennDiagram at 0x243d2beeb50>

output_47_1

3개의 서브셋

  • 1개만 포함되는 인덱스
    • 1 : 001
    • 2 : 010
    • 4 : 100
  • 2개가 포함되는 인덱스
    • 3 : 011
    • 5 : 101
    • 6 : 110
  • 3개가 포함되는 인덱스
    • 7 : 111
from matplotlib_venn import venn3
venn3(subsets = (1, 2, 3, 4, 5, 6, 7), set_labels = ('Set1', 'Set2', 'Set3'))
<matplotlib_venn._common.VennDiagram at 0x243d2335e20>

output_49_1

Set으로 전달하기

set을 전달하면 자동적으로 counting 하여 표현해줍니다.

set1 = set(['A', 'B', 'C', 'D'])
set2 = set(['B', 'C', 'D', 'E'])
set3 = set(['C', 'D',' E', 'F', 'G'])

venn3([set1, set2, set3], ('Set1', 'Set2', 'Set3'))
plt.show()

output_51_0



참고 자료


Leave a comment