일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 백준
- U_stage
- 최단경로
- dfs
- 기술면접
- dp
- 알고리즘스터디
- 개인회고
- 부스트캠프_AITech_3기
- 백트랙킹
- 구현
- 다이나믹프로그래밍
- 정렬
- 파이썬 3
- Level2_PStage
- 프로그래머스
- python3
- Level1
- 이코테
- 주간회고
- ODQA
- 단계별문제풀이
- 그래프이론
- 다시보기
- 알고리즘_스터디
- mrc
- 그리디
- 부스트캠프_AITech3기
- Level2
- 이진탐색
- Today
- Total
국문과 유목민
Seaborn API별 사용법 본문
Seaborn의 다양한 API들을 가볍게 다루는 포스팅입니다. API가 어떻게 표현되고, 각 API에서 파라메터가 어떤 역할을 하는지 등에 대해 다룰 예정입니다. 파라메터에 대한 설명이 간단할 경우 코드블럭 내 주석으로 설명할 수 있습니다.
Seaborn 개요
MatPlotlib 기반 통계 시각화 라이브러리로 쉬운 문법과 깔끔한 디자인이 특징이다. Seaborn은 시각화의 목적과 방법에 따라 다음과 같은 API를 분류하여 제공하고 있다. 해당 포스팅에서는 하단의 분류 5가지의 기본적인 통계 시각화와 형태에 대해 정리하고자 한다.
- Categorical API (범주)
- Distribution API (분포)
- Relational API (관계)
- Regression API (회귀)
- Matrix API (행렬)
- Theme API
Seaborn은 Matplotlib을 기반으로 하기에 Matplotlib의 pyplot을 사용하기도 하며, 데이터는 pandas의 형식을 사용한다.
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
print('seaborn version : ', sns.__version__)
# seaborn version : 0.11.0
1.Seaborn Basic
1-1. CountPlot
Seaborn의 categorical API에서 대표적인 시각화 방법으로 범주형 데이터를 이산적으로 세서 막대 그래프로 그려주는 함수이다. CountPlot에서 사용가능한 파라미터는 다음과 같으며, 아래의 파라메터들의 경우 후에 나올 다른 API에서도 사용할 수 있다.
- Pameters: x, y, data, hue, hue_order, palette, color, saturate, ax
fig, axes = plt.subplots(1, 2, figsize=(12, 5)) # Pyplot을 활용해서 subplots를 그림
sns.countplot(x='race/ethnicity',data=student,ax=axes[0], # axes 지정
hue='gender', # hue: 데이터의 구분 기준을 정해 색상을 통해 내용 구분
palette='Set2' # pallete: 주어진 색 조합으로 색상을 변경할 수 있다.
)
sns.countplot(x='gender',data=student,ax=axes[1],
hue='race/ethnicity',
hue_order=sorted(student['race/ethnicity'].unique()), # hueoreder: col의 순서 설정
color = 'red', # color: hue로 지정된 그룹에 Gradient 색상을 전달할 수 있다.
saturation=0.3 # saturation: 색상을 어둡게 조정가능 (비추천)
)
plt.show()
2.Categorical API
2-1. BoxPlot
수치형 데이터의 경우 그래프를 그리기 전 데이터의 통게량을 살펴볼 수 있다. 이때 데이터가 정규분포에 가깝다면 평균과 표준 편차를 살피는 게 의미가 있을 수 있다. 하지만 데이터가 정규분포에 가깝지 않다면 대신해서 '사분위수'를 활용할 수 있다. 사분위수란 데이터를 4등분한 관측값이다. 여기서 25%는 lower quartile, 50%는 median, 75%는 upper quartile이라고 한다.
BoxPlot은 분포를 살피는 대표적인 시각화 방법으로 중간의 사각형은 중간의 사각형은 25%, medium, 75% 값을 의미한다. 추가적으로 BoxPlot을 이해하기 위해서는 IQR을 알아야 하며, whisker와 outlier라는 표현도 알아둘 필요가 있다.
- interquartile range (IQR): 25th to the 75th percentile.
- whisker : 박스 외부의 범위를 나타내는 선
- outlier : -IQR1.5과 +IQR1.5을 벗어나는 값
BoxPlot을 보게 되면 whisker의 길이가 같지 않은 경우를 보게 될텐데 이는 실제 데이터의 위치를 반영해 min값과 max값을 나타내기 때문이다.
- min : -IQR * 1.5 보다 크거나 같은 값들 중 최솟값
- max : +IQR * 1.5 보다 작거나 같은 값들 중 최댓값
BoxPlot에서의 파라메터는 앞선 CountPlot에서 기본적으로 사용했던 파라메터들 이외에 시각화를 커스텀할 수 있는 다음과 같은 파라메터들이 있다.
- width, linewidth, fliersize
fig, ax = plt.subplots(1,2, figsize=(10, 5))
sns.boxplot(x='race/ethnicity', y='math score', data=student,
hue='gender',
order=sorted(student['race/ethnicity'].unique()),
ax=ax[0])
sns.boxplot(x='race/ethnicity', y='math score', data=student,
hue='gender',
order=sorted(student['race/ethnicity'].unique()),
width=0.5, # 박스 두께
linewidth=3, # 선 두께
fliersize=10, # outlier 두께
ax=ax[1])
plt.show()
2-2. ViolinPlot
BoxPlot은 대푯값을 나타낼 때는 효과적이지만,실제 분포를 표현하기에는 부족하다는 단점을 가지고 있다. 따라서 분포에 대한 정보를 제공해주고자할 때 사용하는 방식이 ViolinPlot이다. 그래프의 흰점이 50%(median)을 나타내며, 중간 검정 막대가 IQR범위를 의미한다.
Vioin Plot은 연속적이지 않은 데이터도 연속적으로 표현되기에 데이터의 손실과 오차가 발생할 수 도 있고, 데이터의 범위가 없는 데이터도 표시될 수 있어 오해가 생길 수 있다. 따라서 이러한 오해를 줄이기 위해 다음과 같은 파라메터들을 활용할 수 있다.
- bw : 분포 표현을 얼마나 자세하게 보여줄 것인가 (‘scott’, ‘silverman’, float)
- cut : 끝부분을 얼마나 자를 것인가? (float)
- inner : 내부를 어떻게 표현할 것인가 (“box”, “quartile”(사분위수), “point”, “stick”, None)
fig, ax = plt.subplots(1,1, figsize=(12, 5))
sns.violinplot(x='math score', data=student, ax=ax,
bw=0.1,
cut=0,
inner='quartile'
)
plt.show()
ViolinPlot또한 hue를 사용해 분포를 비교할 수 있는데, 이 때 적합한 비교를 위해 다음과 같은 파라메터를 조정할 수 있다.
- scale : 각 바이올린의 종류 (“area”, “count”, “width”)
- split : 동시에 비교
fig, ax = plt.subplots(1,1, figsize=(12, 7))
sns.violinplot(x='race/ethnicity', y='math score', data=student, ax=ax,
order=sorted(student['race/ethnicity'].unique()),
hue='gender', split=True,
bw=0.2, cut=0
)
plt.show()
2-3. ETC
자주 사용하게 되는 BoxPlot과 ViolinPlot 외에도 Categorical API에는 boxenplot, swarmplot, stripplot 등이 존재한다.
fig, axes = plt.subplots(3,1, figsize=(12, 21))
sns.boxenplot(x='race/ethnicity', y='math score', data=student, ax=axes[0],
order=sorted(student['race/ethnicity'].unique()))
sns.swarmplot(x='race/ethnicity', y='math score', data=student, ax=axes[1], # 바이올린 플롯과 같이 사용하면 좋다
order=sorted(student['race/ethnicity'].unique()))
sns.stripplot(x='race/ethnicity', y='math score', data=student, ax=axes[2], # 밀도를 확인하기 좋은 플롯
order=sorted(student['race/ethnicity'].unique()))
plt.show()
3. Distribution API
범주형과 연속형 데이터 모두를 살펴볼 수 있는 분포 시각화 방법이다.
3-1.Univariate Distribution
Univariate Distribution (일변량 분포)일 경우 다음과 같은 plot들을 그릴 수 있다. 각 plot에서 활용가능한 파라메터들 또한 플롯 옆에 명시하였다.
- histplot : 히스토그램 (binwidth, bins, element, multiple)
- kdeplot : Kernel Density Estimate, smooting 및 분포 시각화 보조 정보로 많이 사용 (fill, bw_method, stack, multiple, cumulative, cut)
- ecdfplot : 누적 밀도 함수 (stat, coplementary)
- rugplot : 선을 사용한 밀도함수, 한정된 공간 내에서 분포 표현 시 사용 (비추)
fig, axes = plt.subplots(2,2, figsize=(12, 10))
axes = axes.flatten()
sns.histplot(x='math score', data=student, ax=axes[0],
binwidth=10, # 간격
# bins=10, # 개수,
# element='step' # bars(default), step, poly
hue='gender',multiple='layer', # layer(default), dodge, stack, fill
)
sns.kdeplot(x='math score', data=student, ax=axes[1],
fill=True, bw_method=0.15,
hue='race/ethnicity', hue_order=sorted(student['race/ethnicity'].unique()),
multiple="layer", # layer, stack
# cumulative=True,
cut=0
)
sns.ecdfplot(x='math score', data=student, ax=axes[2],
hue='gender',
stat='count', # proportion
# complementary=True # 오름, 내림차순
)
sns.rugplot(x='math score', data=student, ax=axes[3])
plt.show()
3-2. Bivariate Distribution
Bivariate Distribution(이변량 분포) 2개 이상 변수에 대해 결합확률분포를 살펴볼 수 있다. 위에서 살펴봤던 histplot과 kdeplot을 사용하고, 입력에 1개의 축만 넣는 것이 아니라 x축과 y축 2개의 축을 모두 입력해서 사용한다. 후에 배울 sactterplot의 경우 밀도를 확인하기 어렵다는 단점이 있는데, histplot과 같이 사용하면 밀도를 확인할 수 없다는 단점을 보완할 수 있다.
fig, axes = plt.subplots(1,3, figsize=(12, 7))
# scatterplot
axes[0].scatter(student['math score'], student['reading score'], alpha=0.3)
# histplot(스캐터플롯의 밀도를 잘 확인할 수 없다는 단점 보완)
sns.histplot(x='math score', y='reading score',
data=student, ax=axes[1],
# color='orange', # 단일 색상이나 팔레트로 설정 가능
cbar=True,
bins=(20, 20),
)
axes[2].set_aspect(1)
sns.kdeplot(x='math score', y='reading score',
data=student, ax=axes[2],
fill=True,
# bw_method=0.1
)
plt.show()
4. Relation & Regression API
데이터의 관계를 표현할 때 사용하는 방법이다.
4-1. ScatterPlot
ScatterPlot은 흔히 산점도라고 하는 그래프이다. 앞서 다루었던 요소들인 style, hue, size 등을 활용할 수 있고, 각각에 대한 순서를 style_order, hue_order, size_order로 전달할 수 있다. 또한 markers 도 활용할 수 있다. 간단하게 코드를 통해 사용법을 살펴보고 넘어가도록 하자.
fig, ax = plt.subplots(figsize=(7, 7))
sns.scatterplot(x='math score', y='reading score', data=student,
style='gender', markers={'male':'s', 'female':'o'},
hue='race/ethnicity', alpha=0.5
# size='writing score',
)
plt.show()
4-2. LinePlot
선그래프는 x축과 y축에 값을 이용해서 그래프를 그리며 style, markers, dashes와 같은 파라메터를 활용할 수 있다. 자동으로 평균과 표준편차로 오차범위를 시각화해서 확인할 수 있다. (hue를 설정할 경우 X)간단하게 살펴보고 넘어가도록 한다.
fig, ax = plt.subplots(1, 2, figsize=(12, 7))
sns.lineplot(data=flights, x="year", y="passengers", ax=ax[0])
sns.lineplot(data=flights, x="year", y="passengers", hue='month',
style='month', markers=True, dashes=False,
ax=ax[1])
plt.show()
4-3. RegPlot
회귀선을 추가한 ScatterPlot이라고 생각하면 된다. 다음과 같은 파라메터를 활용할 수 있다.
- x_estimation: 한 축에 한 개의 값만 보여주기 위함
- x_bins: 보여주는 개수 지정
- order: 다차원 회귀선 표현 시
- logx: 로그를 활용할 수 있다.
fig, ax = plt.subplots(2, 2, figsize=(10, 10))
sns.regplot(x='math score', y='reading score', data=student, ax=ax[0,0]
)
sns.regplot(x='math score', y='reading score', data=student,
x_estimator=np.mean, x_bins=20 , ax=ax[0,1]
)
sns.regplot(x='math score', y='reading score', data=student,
order=2, ax=ax[1,0]
)
sns.regplot(x='reading score', y='writing score', data=student,
logx=True, ax = ax[1,1]
)
plt.show()
5. Matrix API
5-1. Heatmap
히트맵은 다양한 방식으로 사용될 수 있는데 대표적으로는 상관관계 시각화에 많이 사용된다.
- 상관계수
방법 | 설명 |
Pearson Linear correlation coefficient | - 모수적 방법(두 변수의 정규성 가정), 연속형 & 연속형 변수 사이의 선형 관계 검정, (-1,1)사이의 값을 가지며 0으로 갈수록 선형 상관관계가 없다는 해석 가능 |
Spearman Rank-order correlation coefficient | - 비모수적 방법(정규성 가정 x), 연속형 & 연속형 변수 사이의 단조 관계 검정, 값에 순위를 매겨 순위에 대한 상관성을 계수로 표현 - 연속형 변수가 아닌 순서형 변수에도 사용 가능 단조성(monotonicity) 평가 - 곡선 관계도 가능 |
kendall Rank-order correlation coefficient | - 비모수적 방법(정규성 가정 x), 연속형 & 연속형 변수 사이의 단조 관계 검정, 값에 순위를 매겨 순위에 대한 상관성을 계수로 표현함 - 연속형 변수가 아닌 순서형 변수에도 사용 가능 단조성(monotonicity) 평가. 일반적으로 Spearman의 rho 상관 관계보다 값이 작다. 일치/불일치 쌍을 기반으로 계산하며 오류에 덜 민감 |
히트맵의 경우 다음과 같은 파라메터들이 존재한다.
- vmin, vmax: 상관계수의 범위 조절
- center: 0을 기준으로 음/양을 지정
- cmap: Pallete로 색 변경
- annot, fmt: 실제 값에 들어갈 내용 작성 가능 (fmt == formatting)
- linewidth: 칸 나누기
- square: 정사각형 사용
상관관계의 경우 대칭 행렬이기 때문에 하삼각행렬만 남기는 방법도 있다. (mask변수)
fig, ax = plt.subplots(1,1 ,figsize=(12, 9))
# mask = np.zeros_like(heart.corr())
# mask[np.triu_indices_from(mask)] = True # 하삼각행렬만 본다.
sns.heatmap(heart.corr(), ax=ax,
vmin=-1, vmax=1, center=0,
cmap='coolwarm',
annot=True, fmt='.2f',
linewidth=0.1, square=True # 정사각형
# mask=mask
)
plt.show()
'IT 견문록 > 함수 및 코드 (디지털치매 대비)' 카테고리의 다른 글
Matplotlib [polar, pie] 사용법 (0) | 2022.02.10 |
---|---|
Seaborn 멀티차트 사용법 (0) | 2022.02.06 |
Pytorch Trouble Shooting (0) | 2022.01.26 |
[git]Git 기본 명령어 정리 (0) | 2022.01.21 |
Pandas 함수 정리 (0) | 2022.01.21 |