[AITech] 20220211 - Python Visualization Libraries
학습 내용
라이브러리 다운로드 및 버전 확인
# !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)
row당 결측치의 개수가 다르기 때문에 다음과 같이 정렬을 진행할 수 있습니다.
msno.matrix(titanic,
sort='descending', # ascending
)
위의 방법 외에는 개수를 직접적으로 bar chart를 그려주는 방법이 있습니다.
msno.bar(titanic)
Squarify
Squarify
는 계층적 데이터를 표현하는 시각화인 Treemap을 위한 라이브러리입니다.
import squarify
values = [100, 200, 300, 400]
squarify.plot(values)
다음과 같은 파라미터들로 커스텀할 수 있습니다.
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()
PyWaffle
PyWaffle이 만들어주는 Waffle Chart
는 와플 형태로 discrete하게 값을 나타내는 차트로, 기본적인 형태는 정사각형이나 원하는 벡터 이미지로도 사용이 가능합니다. 다양한 Icon을 활용하여 인포그래픽에서 유용하게 사용할 수 있습니다.
기본 Waffle
rows
와coloums
로 사각형의 전체 형태를 지정할 수 있습니다.values
로 값 전달
from pywaffle import Waffle
fig = plt.figure(
FigureClass=Waffle,
rows=5,
columns=10,
values=[48, 46, 6],
figsize=(5, 3)
)
plt.show()
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()
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()
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()
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()
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()
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',
)
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()
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>
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>
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()
Leave a comment