Seaborn 시각화 튜토리얼
1. Seaborn
matplotlib 기반으로 만들어진 데이터 시각화 모듈
다양한 색상과 예쁜 디자인, 다양한 통계 관련 그래프를 지원하며, matplotlib 보다 사용법이 쉽다는 장점을 가진다고 함
지원하는 그래프
공식 홈페이지에서 이미지로 확인 가능
- Relational: 두가지 변수의 관계를 나타내기 위한 그래프
- scatterplot
- lineplot
- relplot
- Distribution: 변수 하나 혹은 두개의 값 분포를 나타내기 위한 그래프
- histplot
- kdeplot
- ecdfplot
- rugplot
- displot
- Categorical: 범주형 변수와 연속형 변수간의 관계를 나타내기 위한 그래프
- catplot
- stripplot
- boxplot
- violinplot
- pointplot
- barplot
- Regression: 회귀 분석 결과를 나타내기 위한 그래프
- Matrix: 연속형 변수간의 관계 비율을 시각화하기 위한 그래프
- Multi-plot: 여러 그래프를 함께 그려 비교하기 위한 그래프
- FacetGrid
- pairplot
- PairGrid
- jointplot
- JointGrid
2. 모듈 및 데이터 셋
모듈
1
2
3
4
| import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
|
데이터 셋
1
2
3
| # 붓꽃 데이터 셋
iris = sns.load_dataset("iris")
print(iris)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
.. ... ... ... ... ...
145 6.7 3.0 5.2 2.3 virginica
146 6.3 2.5 5.0 1.9 virginica
147 6.5 3.0 5.2 2.0 virginica
148 6.2 3.4 5.4 2.3 virginica
149 5.9 3.0 5.1 1.8 virginica
[150 rows x 5 columns]
|
1
2
3
| # 타이타닉 데이터 셋
titanic = sns.load_dataset("titanic")
titanic
|
| 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 |
---|
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
---|
886 | 0 | 2 | male | 27.0 | 0 | 0 | 13.0000 | S | Second | man | True | NaN | Southampton | no | True |
---|
887 | 1 | 1 | female | 19.0 | 0 | 0 | 30.0000 | S | First | woman | False | B | Southampton | yes | True |
---|
888 | 0 | 3 | female | NaN | 1 | 2 | 23.4500 | S | Third | woman | False | NaN | Southampton | no | False |
---|
889 | 1 | 1 | male | 26.0 | 0 | 0 | 30.0000 | C | First | man | True | C | Cherbourg | yes | True |
---|
890 | 0 | 3 | male | 32.0 | 0 | 0 | 7.7500 | Q | Third | man | True | NaN | Queenstown | no | True |
---|
891 rows × 15 columns
1
2
3
| # 팁 데이터 셋
tips = sns.load_dataset("tips")
tips
|
| total_bill | tip | sex | smoker | day | time | size |
---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
---|
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
---|
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
---|
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
---|
4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 |
---|
... | ... | ... | ... | ... | ... | ... | ... |
---|
239 | 29.03 | 5.92 | Male | No | Sat | Dinner | 3 |
---|
240 | 27.18 | 2.00 | Female | Yes | Sat | Dinner | 2 |
---|
241 | 22.67 | 2.00 | Male | Yes | Sat | Dinner | 2 |
---|
242 | 17.82 | 1.75 | Male | No | Sat | Dinner | 2 |
---|
243 | 18.78 | 3.00 | Female | No | Thur | Dinner | 2 |
---|
244 rows × 7 columns
1
2
3
| # mri 데이터 셋
fmri = sns.load_dataset("fmri")
fmri
|
| subject | timepoint | event | region | signal |
---|
0 | s13 | 18 | stim | parietal | -0.017552 |
---|
1 | s5 | 14 | stim | parietal | -0.080883 |
---|
2 | s12 | 18 | stim | parietal | -0.081033 |
---|
3 | s11 | 18 | stim | parietal | -0.046134 |
---|
4 | s10 | 18 | stim | parietal | -0.037970 |
---|
... | ... | ... | ... | ... | ... |
---|
1059 | s0 | 8 | cue | frontal | 0.018165 |
---|
1060 | s13 | 7 | cue | frontal | -0.029130 |
---|
1061 | s12 | 7 | cue | frontal | -0.004939 |
---|
1062 | s11 | 7 | cue | frontal | -0.025367 |
---|
1063 | s0 | 0 | cue | parietal | -0.006899 |
---|
1064 rows × 5 columns
그래프 정리
참고
1. Relational: 두가지 변수의 관계를 나타내기 위한 그래프
- scatterplot: 산점도
- lineplot: 라인
- relplot: scatterplot과 lineplot을 합친 그래프
scatterplot
scatter(x, y, data)
1
| sns.scatterplot(x='total_bill', y='tip', data=tips)
|
1
| <AxesSubplot:xlabel='total_bill', ylabel='tip'>
|
hue와 stlye 옵션을 줄 수 있음
- hue: 의미에 따라 점의 색을 변경
- style: 모양 구분
1
| sns.scatterplot(x='total_bill', y='tip', data=tips, hue='day', style='time')
|
1
| <AxesSubplot:xlabel='total_bill', ylabel='tip'>
|
lineplot
데이터가 연속적일 경우 주로 사용
1
| sns.lineplot(x='timepoint', y='signal', data=fmri)
|
1
| <AxesSubplot:xlabel='timepoint', ylabel='signal'>
|
- 색이 칠해져 있는 부분은 신뢰구간(confidene interval)로
ci
파라미터로 조절 가능 hue
와 style
옵션을 사용할 수 있음
1
| sns.lineplot(x='timepoint', y='signal', data=fmri, hue='event', style='event', ci=None)
|
1
| <AxesSubplot:xlabel='timepoint', ylabel='signal'>
|
relplot
kind
파라미터에 scatter
나 line
으로 형식 선택 가능 (default=scatter
)- scatterplot과 lineplot은
AxeSubplot
을 반환하지만, relplot은 FaceGrid
를 반환 FaceGrid
를 반환하는 경우 여러 그래프를 한 번에 그릴수 있음hue
와 style
옵션 모두 사용 가능
1
| sns.relplot(x='total_bill', y='tip', kind='scatter', hue='time', data=tips)
|
1
| <seaborn.axisgrid.FacetGrid at 0x2841a3b09d0>
|
2. Distribution: 변수 하나 혹은 두개의 값 분포를 나타내기 위한 그래프
- histplot
- kdeplot
- ecdfplot
- rugplot
- distplot -> 삭제 예정
- displot -> Distribution 함수들의 통합 개념
histplot
히스토그램 그래프를 그리는 함수로, 데이터의 빈도를 나타낼 때 사용
1
| sns.histplot(data=iris, x='sepal_length')
|
1
| <AxesSubplot:xlabel='sepal_length', ylabel='Count'>
|
hue
옵션으로 레이블 구분multiple
옵션으로 hue
로 분류된 레이블을 중첩되게 설정 가능
1
| sns.histplot(data=iris, x='sepal_length', hue='species')
|
1
| <AxesSubplot:xlabel='sepal_length', ylabel='Count'>
|
1
| sns.histplot(data=iris, x='sepal_length', hue='species', multiple='stack')
|
1
| <AxesSubplot:xlabel='sepal_length', ylabel='Count'>
|
2차원으로도 그릴수 있는데, count 정보는 나타나지 않음 -> multiple
옵션을 줘도 달라지는게 없음
1
| sns.histplot(data=iris, x='sepal_length', y='sepal_width', hue='species')
|
1
| <AxesSubplot:xlabel='sepal_length', ylabel='sepal_width'>
|
1
| sns.histplot(data=iris, x='sepal_length', y='sepal_width', hue='species', multiple='stack')
|
1
| <AxesSubplot:xlabel='sepal_length', ylabel='sepal_width'>
|
kdeplot
커널 밀도 추정(kernal density estimation) 그래프로,
히스토그램이 절대량(count)을 표현한다면 kdeplotdms 상대량(비율)을 시각화
히스토그램과 마찬가지로 한개 혹은 두개의 변수에 대한 분포를 그릴 수 있음
1
| sns.kdeplot(data=iris, x='sepal_length')
|
1
| <AxesSubplot:xlabel='sepal_length', ylabel='Density'>
|
hue
옵션 사용 가능
1
| sns.kdeplot(data=iris, x='sepal_length', hue='species')
|
1
| <AxesSubplot:xlabel='sepal_length', ylabel='Density'>
|
1
| sns.kdeplot(data=iris, x='sepal_length', y='sepal_width', hue='species')
|
1
| <AxesSubplot:xlabel='sepal_length', ylabel='sepal_width'>
|
1
2
| # histplot과 kedplot을 함께 사용하는 경우
sns.histplot(data=iris, x='sepal_length', hue='species', multiple='stack', kde=True)
|
1
| <AxesSubplot:xlabel='sepal_length', ylabel='Count'>
|
rugplot
데이터 값을 x축과 y축 위에 그려주는 그래프 -> 단독으로 사용되기보다는 다른 그래프와 함께 사용된다(i.e. kdeplot)
다른 그래프를 보완해주는 느낌
1
| sns.kdeplot(data=iris, x='sepal_length', y='sepal_width', hue='species')
|
1
| <AxesSubplot:xlabel='sepal_length', ylabel='sepal_width'>
|
1
| sns.rugplot(data=iris, x='sepal_length', y='sepal_width', hue='species')
|
1
| <AxesSubplot:xlabel='sepal_length', ylabel='sepal_width'>
|
1
2
3
| sns.kdeplot(data=iris, x='sepal_length', y='sepal_width', hue='species')
sns.rugplot(data=iris, x='sepal_length', y='sepal_width', hue='species')
|
1
| <AxesSubplot:xlabel='sepal_length', ylabel='sepal_width'>
|
ecdfplot
분포를 누적화해 보여줌
1
| sns.ecdfplot(data=iris, x='sepal_length')
|
1
| <AxesSubplot:xlabel='sepal_length', ylabel='Proportion'>
|
displot
- 앞선 함수들의 통합 개념들로, relplot과 유사함
row
와 col
파라미터로 subplot 생성 가능rug
옵션으로 rugplot
의 표시 여부를 선택 가능
1
| sns.displot(data=iris, x='sepal_length', hue='species') # kind default = hist
|
1
| <seaborn.axisgrid.FacetGrid at 0x2841cc68e50>
|
1
| sns.displot(data=iris, x='sepal_length', hue='species', col='species')
|
1
| <seaborn.axisgrid.FacetGrid at 0x2841c8678e0>
|
1
| sns.displot(data=iris, kind='kde', x='sepal_length', hue='species', row='species', rug=True)
|
1
| <seaborn.axisgrid.FacetGrid at 0x2841c72f490>
|
3. Categorical: 범주형 변수와 연속형 변수간의 관계를 나타내기 위한 그래프
- catplot
- stripplot
- boxplot
- violinplot
- pointplot
- barplot
barplot
- 이변량(bivariate) 분석을 위한 그래프
- x축에는 범주형 변수, y축에는 연속형 변수를 입력
- x와 y의 형을 바꾸면 수평 그래프가 출력
1
| sns.barplot(data=tips, x='day', y='tip')
|
1
| <AxesSubplot:xlabel='day', ylabel='tip'>
|
1
| sns.barplot(data=tips, x='day', y='tip', hue='smoker')
|
1
| <AxesSubplot:xlabel='day', ylabel='tip'>
|
검은 막대는 오차를 의미하며, ci
옵션으로 설정 가능함
ci
- 숫자: 신뢰 구간(%)
- sd: 표준 편차
- None: 표현하지 않음
1
| sns.barplot(data=tips, x='tip', y='day', ci='sd')
|
1
| <AxesSubplot:xlabel='tip', ylabel='day'>
|
countplot
- histplot과 동일하게 데이터의 갯수를 출력 (histplot은 연속형 데이터, countplot은 범주형 데이터)
- x와 y의 데이터를 통해 수직, 수평을 조절 가능
1
| sns.countplot(data=tips, x='smoker', hue='sex')
|
1
| <AxesSubplot:xlabel='smoker', ylabel='count'>
|
boxplot
특정 데이터의 전체적인 분포를 확인하기 좋은 그래프
- 변수 1개인 경우, 연속형 변수 사용
- 변수 2개인 경우, 연속형 변수와 범주형 변수 사용
- 통계치(최대/최소/사분위수(1,3)/평균)를 함께 표시
- 특이치(outliar)를 발견하기에 용이
1
| sns.boxplot(data=tips, x='tip')
|
1
| <AxesSubplot:xlabel='tip'>
|
1
| sns.boxplot(data=tips, x='day', y='total_bill')
|
1
| <AxesSubplot:xlabel='day', ylabel='total_bill'>
|
violinplot
- boxplot은 이상치를 한번에 파악할 수 있고, violinplot은 데이터 분포를 한번에 파악할 수 있음
- 분포에 따라 모양이 달라짐
1
| sns.violinplot(data=tips, x='day', y='total_bill')
|
1
| <AxesSubplot:xlabel='day', ylabel='total_bill'>
|
stripplot
- 연속형 변수와 범주형 변수의 관계를 나타내는 산점도
- scatterplot은 연속형과 연속형의 관계를 나타냄
- x, y의 데이터 형에 따라 수직, 수평이 달라짐
1
| sns.stripplot(data=tips, x='day', y='total_bill')
|
1
| <AxesSubplot:xlabel='day', ylabel='total_bill'>
|
swarmplot
- stripplot과 유사
- 분포 정도를 함께 표현
- violinplot과 함께 쓰이는 경우가 많음 -> violinplot이 세부적인 데이터 분포를 보여주지 못한다는 점을 보완
1
| sns.swarmplot(data=tips, x='day', y='total_bill')
|
1
| <AxesSubplot:xlabel='day', ylabel='total_bill'>
|
1
2
| sns.violinplot(data=tips, x='day', y='total_bill')
sns.swarmplot(data=tips, x='day', y='total_bill', color='white')
|
1
| <AxesSubplot:xlabel='day', ylabel='total_bill'>
|
boxenplot
- boxplot과 유사
- 데이터 분포가 박스의 크기로 나타남
1
| sns.boxenplot(data=tips, x='day', y='total_bill')
|
1
| <AxesSubplot:xlabel='day', ylabel='total_bill'>
|
pointplot
- 연속형 변수와 범주형 변수의 관계를 나타내는 그래프
- 오차바(error bar)도 함께 표시 됨
1
| sns.pointplot(data=tips, x='day', y='tip', hue='sex')
|
1
| <AxesSubplot:xlabel='day', ylabel='tip'>
|
catplot
- 앞선 함수들의 통합 개념들로, relplot, displot 과 유사함
row
와 col
파라미터로 subplot 생성 가능
1
| sns.catplot(data=tips, x='day', y='total_bill', col='sex', kind='bar')
|
1
| <seaborn.axisgrid.FacetGrid at 0x2841d101ca0>
|
4. Regression: 회귀 분석 결과를 나타내기 위한 그래프
regplot
- scatterplot과 lineplot을 합쳐 놓은 그래프
- scatterplot의 경향성을 lineplot이 예측하는 방향으로 그려짐
1
| sns.regplot(data=tips, x='total_bill', y='tip')
|
1
| <AxesSubplot:xlabel='total_bill', ylabel='tip'>
|
lmplot
- regplot의 상위 그래프
- 여러개의 그래프를 그릴 수 있으며,
hue
옵션 사용 가능 - regplot 보다 많이 사용된다고 함
1
| sns.lmplot(data=tips, x='total_bill', y='tip', hue='smoker')
|
1
| <seaborn.axisgrid.FacetGrid at 0x2841e9e3e50>
|
col
과 row
옵션을 이용해 그래프를 분리 가능
1
| sns.lmplot(data=tips, x='total_bill', y='tip', hue='smoker', col='smoker')
|
1
| <seaborn.axisgrid.FacetGrid at 0x2841ea35610>
|
residplot
- 회귀선을 기준으로 오차를 나타낸 그래프
- regplot의 회귀선이 x축가 평행하게 나타남
1
| sns.residplot(data=tips, x='total_bill', y='tip')
|
1
| <AxesSubplot:xlabel='total_bill', ylabel='tip'>
|
5. Matrix: 연속형 변수간의 관계 비율을 시각화하기 위한 그래프
heatmap
- 데이터의 상관관계 정도에 따라 색차이를 부여한 그래프
- pivot-table과 correlation 개념이 적용되어 있음
1
2
| # pivot-table
tips.pivot_table(index='day', columns='size', values='tip')
|
size | 1 | 2 | 3 | 4 | 5 | 6 |
---|
day | | | | | | |
---|
Thur | 1.83 | 2.442500 | 2.692500 | 4.218000 | 5.000000 | 5.3 |
---|
Fri | 1.92 | 2.644375 | 3.000000 | 4.730000 | NaN | NaN |
---|
Sat | 1.00 | 2.517547 | 3.797778 | 4.123846 | 3.000000 | NaN |
---|
Sun | NaN | 2.816923 | 3.120667 | 4.087778 | 4.046667 | 5.0 |
---|
1
| sns.heatmap(tips.pivot_table(index='day', columns='size', values='tip'), annot=True)
|
1
| <AxesSubplot:xlabel='size', ylabel='day'>
|
1
| sns.heatmap(iris.corr(), annot=True)
|
clustermap
1
| <seaborn.matrix.ClusterGrid at 0x28420112220>
|
6. Multi-plot: 여러 그래프를 함께 그려 비교하기 위한 그래프
주로 반환형으로 사용되는거 같아서 따로 정리하지는 않았음
- FacetGrid
- pairplot
- PairGrid
- jointplot
- JointGrid
Comments powered by Disqus.