Home Seaborn 시각화 튜토리얼
Post
Cancel

Seaborn 시각화 튜토리얼

Seaborn 시각화 튜토리얼

1. Seaborn

matplotlib 기반으로 만들어진 데이터 시각화 모듈
다양한 색상과 예쁜 디자인, 다양한 통계 관련 그래프를 지원하며, matplotlib 보다 사용법이 쉽다는 장점을 가진다고 함

지원하는 그래프

공식 홈페이지에서 이미지로 확인 가능

  1. Relational: 두가지 변수의 관계를 나타내기 위한 그래프
    • scatterplot
    • lineplot
    • relplot
  2. Distribution: 변수 하나 혹은 두개의 값 분포를 나타내기 위한 그래프
    • histplot
    • kdeplot
    • ecdfplot
    • rugplot
    • displot
  3. Categorical: 범주형 변수와 연속형 변수간의 관계를 나타내기 위한 그래프
    • catplot
    • stripplot
    • boxplot
    • violinplot
    • pointplot
    • barplot
  4. Regression: 회귀 분석 결과를 나타내기 위한 그래프
    • regplot
    • lmplot
    • residplot
  5. Matrix: 연속형 변수간의 관계 비율을 시각화하기 위한 그래프
    • heatmap
    • clustermap
  6. 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
survivedpclasssexagesibspparchfareembarkedclasswhoadult_maledeckembark_townalivealone
003male22.0107.2500SThirdmanTrueNaNSouthamptonnoFalse
111female38.01071.2833CFirstwomanFalseCCherbourgyesFalse
213female26.0007.9250SThirdwomanFalseNaNSouthamptonyesTrue
311female35.01053.1000SFirstwomanFalseCSouthamptonyesFalse
403male35.0008.0500SThirdmanTrueNaNSouthamptonnoTrue
................................................
88602male27.00013.0000SSecondmanTrueNaNSouthamptonnoTrue
88711female19.00030.0000SFirstwomanFalseBSouthamptonyesTrue
88803femaleNaN1223.4500SThirdwomanFalseNaNSouthamptonnoFalse
88911male26.00030.0000CFirstmanTrueCCherbourgyesTrue
89003male32.0007.7500QThirdmanTrueNaNQueenstownnoTrue

891 rows × 15 columns

1
2
3
# 팁 데이터 셋
tips = sns.load_dataset("tips")
tips
total_billtipsexsmokerdaytimesize
016.991.01FemaleNoSunDinner2
110.341.66MaleNoSunDinner3
221.013.50MaleNoSunDinner3
323.683.31MaleNoSunDinner2
424.593.61FemaleNoSunDinner4
........................
23929.035.92MaleNoSatDinner3
24027.182.00FemaleYesSatDinner2
24122.672.00MaleYesSatDinner2
24217.821.75MaleNoSatDinner2
24318.783.00FemaleNoThurDinner2

244 rows × 7 columns

1
2
3
# mri 데이터 셋
fmri = sns.load_dataset("fmri")
fmri
subjecttimepointeventregionsignal
0s1318stimparietal-0.017552
1s514stimparietal-0.080883
2s1218stimparietal-0.081033
3s1118stimparietal-0.046134
4s1018stimparietal-0.037970
..................
1059s08cuefrontal0.018165
1060s137cuefrontal-0.029130
1061s127cuefrontal-0.004939
1062s117cuefrontal-0.025367
1063s00cueparietal-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'>

png

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'>

png

lineplot

데이터가 연속적일 경우 주로 사용

1
sns.lineplot(x='timepoint', y='signal', data=fmri)
1
<AxesSubplot:xlabel='timepoint', ylabel='signal'>

png

  • 색이 칠해져 있는 부분은 신뢰구간(confidene interval)로 ci 파라미터로 조절 가능
  • huestyle 옵션을 사용할 수 있음
1
sns.lineplot(x='timepoint', y='signal', data=fmri, hue='event', style='event', ci=None)
1
<AxesSubplot:xlabel='timepoint', ylabel='signal'>

png

relplot

  • kind 파라미터에 scatterline으로 형식 선택 가능 (default=scatter)
  • scatterplot과 lineplot은 AxeSubplot을 반환하지만, relplot은 FaceGrid를 반환
  • FaceGrid를 반환하는 경우 여러 그래프를 한 번에 그릴수 있음
  • huestyle 옵션 모두 사용 가능
1
sns.relplot(x='total_bill', y='tip', kind='scatter', hue='time', data=tips)
1
<seaborn.axisgrid.FacetGrid at 0x2841a3b09d0>

png

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'>

png

  • hue 옵션으로 레이블 구분
  • multiple 옵션으로 hue로 분류된 레이블을 중첩되게 설정 가능
1
sns.histplot(data=iris, x='sepal_length', hue='species')
1
<AxesSubplot:xlabel='sepal_length', ylabel='Count'>

png

1
sns.histplot(data=iris, x='sepal_length', hue='species', multiple='stack')
1
<AxesSubplot:xlabel='sepal_length', ylabel='Count'>

png

2차원으로도 그릴수 있는데, count 정보는 나타나지 않음 -> multiple 옵션을 줘도 달라지는게 없음

1
sns.histplot(data=iris, x='sepal_length', y='sepal_width', hue='species')
1
<AxesSubplot:xlabel='sepal_length', ylabel='sepal_width'>

png

1
sns.histplot(data=iris, x='sepal_length', y='sepal_width', hue='species', multiple='stack')
1
<AxesSubplot:xlabel='sepal_length', ylabel='sepal_width'>

png

kdeplot

커널 밀도 추정(kernal density estimation) 그래프로,
히스토그램이 절대량(count)을 표현한다면 kdeplotdms 상대량(비율)을 시각화
히스토그램과 마찬가지로 한개 혹은 두개의 변수에 대한 분포를 그릴 수 있음

1
sns.kdeplot(data=iris, x='sepal_length')
1
<AxesSubplot:xlabel='sepal_length', ylabel='Density'>

png

hue 옵션 사용 가능

1
sns.kdeplot(data=iris, x='sepal_length', hue='species')
1
<AxesSubplot:xlabel='sepal_length', ylabel='Density'>

png

1
sns.kdeplot(data=iris, x='sepal_length', y='sepal_width', hue='species')
1
<AxesSubplot:xlabel='sepal_length', ylabel='sepal_width'>

png

1
2
# histplot과 kedplot을 함께 사용하는 경우
sns.histplot(data=iris, x='sepal_length', hue='species', multiple='stack', kde=True)
1
<AxesSubplot:xlabel='sepal_length', ylabel='Count'>

png

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'>

png

1
sns.rugplot(data=iris, x='sepal_length', y='sepal_width', hue='species')
1
<AxesSubplot:xlabel='sepal_length', ylabel='sepal_width'>

png

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'>

png

ecdfplot

분포를 누적화해 보여줌

1
sns.ecdfplot(data=iris, x='sepal_length')
1
<AxesSubplot:xlabel='sepal_length', ylabel='Proportion'>

png

displot

  • 앞선 함수들의 통합 개념들로, relplot과 유사함
  • rowcol 파라미터로 subplot 생성 가능
  • rug 옵션으로 rugplot의 표시 여부를 선택 가능
1
sns.displot(data=iris, x='sepal_length', hue='species') # kind default = hist
1
<seaborn.axisgrid.FacetGrid at 0x2841cc68e50>

png

1
sns.displot(data=iris, x='sepal_length', hue='species', col='species')
1
<seaborn.axisgrid.FacetGrid at 0x2841c8678e0>

png

1
sns.displot(data=iris, kind='kde', x='sepal_length', hue='species', row='species', rug=True)
1
<seaborn.axisgrid.FacetGrid at 0x2841c72f490>

png

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'>

png

1
sns.barplot(data=tips, x='day', y='tip', hue='smoker')
1
<AxesSubplot:xlabel='day', ylabel='tip'>

png

검은 막대는 오차를 의미하며, ci 옵션으로 설정 가능함

ci

  • 숫자: 신뢰 구간(%)
  • sd: 표준 편차
  • None: 표현하지 않음
1
sns.barplot(data=tips, x='tip', y='day', ci='sd')
1
<AxesSubplot:xlabel='tip', ylabel='day'>

png

countplot

  • histplot과 동일하게 데이터의 갯수를 출력 (histplot은 연속형 데이터, countplot은 범주형 데이터)
  • x와 y의 데이터를 통해 수직, 수평을 조절 가능
1
sns.countplot(data=tips, x='smoker', hue='sex')
1
<AxesSubplot:xlabel='smoker', ylabel='count'>

png

boxplot

특정 데이터의 전체적인 분포를 확인하기 좋은 그래프

  • 변수 1개인 경우, 연속형 변수 사용
  • 변수 2개인 경우, 연속형 변수와 범주형 변수 사용
  • 통계치(최대/최소/사분위수(1,3)/평균)를 함께 표시
  • 특이치(outliar)를 발견하기에 용이

img

1
sns.boxplot(data=tips, x='tip')
1
<AxesSubplot:xlabel='tip'>

png

1
sns.boxplot(data=tips, x='day', y='total_bill')
1
<AxesSubplot:xlabel='day', ylabel='total_bill'>

png

violinplot

  • boxplot은 이상치를 한번에 파악할 수 있고, violinplot은 데이터 분포를 한번에 파악할 수 있음
  • 분포에 따라 모양이 달라짐
1
sns.violinplot(data=tips, x='day', y='total_bill')
1
<AxesSubplot:xlabel='day', ylabel='total_bill'>

png

stripplot

  • 연속형 변수와 범주형 변수의 관계를 나타내는 산점도
  • scatterplot은 연속형과 연속형의 관계를 나타냄
  • x, y의 데이터 형에 따라 수직, 수평이 달라짐
1
sns.stripplot(data=tips, x='day', y='total_bill')
1
<AxesSubplot:xlabel='day', ylabel='total_bill'>

png

swarmplot

  • stripplot과 유사
  • 분포 정도를 함께 표현
  • violinplot과 함께 쓰이는 경우가 많음 -> violinplot이 세부적인 데이터 분포를 보여주지 못한다는 점을 보완
1
sns.swarmplot(data=tips, x='day', y='total_bill')
1
<AxesSubplot:xlabel='day', ylabel='total_bill'>

png

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'>

png

boxenplot

  • boxplot과 유사
  • 데이터 분포가 박스의 크기로 나타남
1
sns.boxenplot(data=tips, x='day', y='total_bill')
1
<AxesSubplot:xlabel='day', ylabel='total_bill'>

png

pointplot

  • 연속형 변수와 범주형 변수의 관계를 나타내는 그래프
  • 오차바(error bar)도 함께 표시 됨
1
sns.pointplot(data=tips, x='day', y='tip', hue='sex')
1
<AxesSubplot:xlabel='day', ylabel='tip'>

png

catplot

  • 앞선 함수들의 통합 개념들로, relplot, displot 과 유사함
  • rowcol 파라미터로 subplot 생성 가능
1
sns.catplot(data=tips, x='day', y='total_bill', col='sex', kind='bar')
1
<seaborn.axisgrid.FacetGrid at 0x2841d101ca0>

png

4. Regression: 회귀 분석 결과를 나타내기 위한 그래프

  • regplot
  • lmplot
  • residplot

regplot

  • scatterplot과 lineplot을 합쳐 놓은 그래프
  • scatterplot의 경향성을 lineplot이 예측하는 방향으로 그려짐
1
sns.regplot(data=tips, x='total_bill', y='tip')
1
<AxesSubplot:xlabel='total_bill', ylabel='tip'>

png

lmplot

  • regplot의 상위 그래프
  • 여러개의 그래프를 그릴 수 있으며, hue 옵션 사용 가능
  • regplot 보다 많이 사용된다고 함
1
sns.lmplot(data=tips, x='total_bill', y='tip', hue='smoker')
1
<seaborn.axisgrid.FacetGrid at 0x2841e9e3e50>

png

colrow 옵션을 이용해 그래프를 분리 가능

1
sns.lmplot(data=tips, x='total_bill', y='tip', hue='smoker', col='smoker')
1
<seaborn.axisgrid.FacetGrid at 0x2841ea35610>

png

residplot

  • 회귀선을 기준으로 오차를 나타낸 그래프
  • regplot의 회귀선이 x축가 평행하게 나타남
1
sns.residplot(data=tips, x='total_bill', y='tip')
1
<AxesSubplot:xlabel='total_bill', ylabel='tip'>

png

5. Matrix: 연속형 변수간의 관계 비율을 시각화하기 위한 그래프

  • heatmap
  • clustermap

heatmap

  • 데이터의 상관관계 정도에 따라 색차이를 부여한 그래프
  • pivot-table과 correlation 개념이 적용되어 있음
1
2
# pivot-table
tips.pivot_table(index='day', columns='size', values='tip')
size123456
day
Thur1.832.4425002.6925004.2180005.0000005.3
Fri1.922.6443753.0000004.730000NaNNaN
Sat1.002.5175473.7977784.1238463.000000NaN
SunNaN2.8169233.1206674.0877784.0466675.0
1
sns.heatmap(tips.pivot_table(index='day', columns='size', values='tip'), annot=True)
1
<AxesSubplot:xlabel='size', ylabel='day'>

png

1
sns.heatmap(iris.corr(), annot=True)
1
<AxesSubplot:>

png

clustermap

  • heatmap과 유사하나 잘 사용되지 않음
1
sns.clustermap(iris)
1
<seaborn.matrix.ClusterGrid at 0x28420112220>

png

6. Multi-plot: 여러 그래프를 함께 그려 비교하기 위한 그래프

주로 반환형으로 사용되는거 같아서 따로 정리하지는 않았음

  • FacetGrid
  • pairplot
  • PairGrid
  • jointplot
  • JointGrid
This post is licensed under CC BY 4.0 by the author.

백준 3046 R2

백준 2914 저작권

Comments powered by Disqus.