Seaborn의 통계 차트 및 데이터 시각화 예제
Apr 8, 2020

seabornmatplotlib의 상위 호환 데이터 시각화를 위한 라이브러리입니다. seaborn패키지는 데이터프레임으로 다양한 통계 지표를 낼 수 있는 시각화 차트를 제공하기 때문에 데이터 분석에 활발히 사용되고 있는 라이브러리입니다.

이번 seaborn 튜토리얼에서는 matplotlib에는 없고 seaborn에서만 제공되는 통계 차트 위주로 설명드리겠습니다.

In [1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
In [2]:
# 한글 폰트 적용
plt.rc('font', family='NanumBarunGothic') 
# 캔버스 사이즈 적용
plt.rcParams["figure.figsize"] = (12, 9)

통계 기반의 시각화를 제공해주는 Seaborn

seaborn 라이브러리가 매력적인 이유는 바로 통계 차트 입니다.

이번 실습에서는 seaborn의 다양한 통계 차트 중 대표적인 차트 몇 개를 뽑아서 다뤄볼 예정입니다.

더 많은 통계 차트를 경험해보고 싶으신 분은 공식 도큐먼트에서 확인하실 수 있습니다.

In [3]:
titanic = sns.load_dataset('titanic')
titanic
Out[3]:
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

  • survived: 생존여부
  • pclass: 좌석등급
  • sex: 성별
  • age: 나이
  • sibsp: 형제자매 숫자
  • parch: 부모자식 숫자
  • fare: 요금
  • embarked: 탑승 항구
  • class: 좌석등급 (영문)
  • who: 사람 구분
  • deck: 데크
  • embark_town: 탑승 항구 (영문)
  • alive: 생존여부 (영문)
  • alone: 혼자인지 여부
In [4]:
tips = sns.load_dataset('tips')
tips
Out[4]:
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

  • total_bill: 총 합계 요금표
  • tip: 팁
  • sex: 성별
  • smoker: 흡연자 여부
  • day: 요일
  • time: 식사 시간
  • size: 식사 인원

1. Countplot

항목별 갯수를 세어주는 countplot 입니다.

알아서 해당 column을 구성하고 있는 value들을 구분하여 보여줍니다.

In [5]:
# 배경을 darkgrid 로 설정
sns.set(style='darkgrid')

1-1 세로로 그리기

In [6]:
sns.countplot(x="class", hue="who", data=titanic)
plt.show()

1-2. 가로로 그리기

In [7]:
sns.countplot(y="class", hue="who", data=titanic)
plt.show()

1-3. 색상 팔레트 설정

In [8]:
sns.countplot(x="class", hue="who", palette='Paired', data=titanic)
plt.show()

2. distplot

matplotlib의 hist 그래프와 kdeplot을 통합한 그래프 입니다.

분포밀도를 확인할 수 있습니다.

In [9]:
# 샘플데이터 생성
x = np.random.randn(100)

2-1. 기본 distplot

In [10]:
sns.distplot(x)
plt.show()

2-2. 데이터가 Series 일 경우

In [11]:
x = pd.Series(x, name="x variable")
sns.distplot(x)
plt.show()

2-3. rugplot

rugrugplot이라고도 불리우며, 데이터 위치를 x축 위에 작은 선분(rug)으로 나타내어 데이터들의 위치 및 분포를 보여준다.

In [12]:
sns.distplot(x, rug=True, hist=False)
plt.show()

2-4. kde (kernel density)

kde는 histogram보다 부드러운 형태의 분포 곡선을 보여주는 방법

In [13]:
sns.distplot(x, rug=False, hist=False, kde=True)
plt.show()

2-5. 가로로 표현하기

In [14]:
 sns.distplot(x, vertical=True)
Out[14]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fd477b66cf8>

2-6. 컬러 바꾸기

In [15]:
sns.distplot(x, color="y")
plt.show()

heatmap

색상으로 표현할 수 있는 다양한 정보를 일정한 이미지위에 열분포 형태의 비쥬얼한 그래픽으로 출력하는 것이 특징이다

3-1. 기본 heatmap

In [16]:
uniform_data = np.random.rand(10, 12)
sns.heatmap(uniform_data, annot=True)
plt.show()

3-2. pivot table을 활용하여 그리기

In [17]:
tips.head()
Out[17]:
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
In [18]:
pivot = tips.pivot_table(index='day', columns='size', values='tip')
pivot
Out[18]:
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
In [19]:
sns.heatmap(pivot, annot=True)
plt.show()

3-3. correlation(상관관계)를 시각화

corr() 함수는 데이터의 상관관계를 보여줍니다.

In [20]:
titanic.corr()
Out[20]:
survived pclass age sibsp parch fare adult_male alone
survived 1.000000 -0.338481 -0.077221 -0.035322 0.081629 0.257307 -0.557080 -0.203367
pclass -0.338481 1.000000 -0.369226 0.083081 0.018443 -0.549500 0.094035 0.135207
age -0.077221 -0.369226 1.000000 -0.308247 -0.189119 0.096067 0.280328 0.198270
sibsp -0.035322 0.083081 -0.308247 1.000000 0.414838 0.159651 -0.253586 -0.584471
parch 0.081629 0.018443 -0.189119 0.414838 1.000000 0.216225 -0.349943 -0.583398
fare 0.257307 -0.549500 0.096067 0.159651 0.216225 1.000000 -0.182024 -0.271832
adult_male -0.557080 0.094035 0.280328 -0.253586 -0.349943 -0.182024 1.000000 0.404744
alone -0.203367 0.135207 0.198270 -0.584471 -0.583398 -0.271832 0.404744 1.000000
In [21]:
sns.heatmap(titanic.corr(), annot=True, cmap="YlGnBu")
plt.show()

4. pairplot

pairplot은 그리도(grid) 형태로 각 집합의 조합에 대해 히스토그램과 분포도를 그립니다.

또한, 숫자형 column에 대해서만 그려줍니다.

In [22]:
tips.head()
Out[22]:
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

4-1. 기본 pairplot 그리기

In [23]:
sns.pairplot(tips)
plt.show()

4-2. hue 옵션으로 특성 구분

In [24]:
sns.pairplot(tips, hue='size')
plt.show()

4-3. 컬러 팔레트 적용

In [25]:
sns.pairplot(tips, hue='size', palette="rainbow")
plt.show()

4-4. 사이즈 적용

In [26]:
sns.pairplot(tips, hue='size', palette="rainbow", height=5,)
plt.show()

5. violinplot

바이올린처럼 생긴 violinplot 입니다.

column에 대한 데이터의 비교 분포도를 확인할 수 있습니다.

  • 곡선진 부분 (뚱뚱한 부분)은 데이터의 분포를 나타냅니다.
  • 양쪽 끝 뾰족한 부분은 데이터의 최소값과 최대값을 나타냅니다.

5-1. 기본 violinplot 그리기

In [27]:
sns.violinplot(x=tips["total_bill"])
plt.show()

5-2. 비교 분포 확인

x, y축을 지정해줌으로썬 바이올린을 분할하여 비교 분포를 볼 수 있습니다.

In [28]:
sns.violinplot(x="day", y="total_bill", data=tips)
plt.show()

5-3. 가로로 뉘인 violinplot

In [29]:
sns.violinplot(y="day", x="total_bill", data=tips)
plt.show()

5-4. hue 옵션으로 분포 비교

사실 hue 옵션을 사용하지 않으면 바이올린이 대칭이기 때문에 비교 분포의 큰 의미는 없습니다.

하지만, hue 옵션을 주면, 단일 column에 대한 바이올린 모양의 비교를 할 수 있습니다.

In [30]:
sns.violinplot(x="day", y="total_bill", hue="smoker", data=tips, palette="muted")
plt.show()