범주형 변수의 비교 :: Python 시각화 기초 - mindscale
Skip to content

범주형 변수의 비교

데이터를 범주로 나누어 각 범주의 분포를 시각화는 방법을 알아보겠습니다.

import seaborn as sns

시본에는 몇 가지 예제 데이터가 내장되어 있습니다. 팁 데이터를 사용해보겠습니다. 데이터는 pandasDataFrame 형식으로 되어 있습니다.

df = sns.load_dataset('tips')
df.head()
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

df의 범주형 변수 time에는 DinnerLunch 2개의 범주가 있습니다. 점심 시간과 저녁 시간의 팁 액수를 시각화를 통해 비교해보겠습니다.

df['time'].unique()
[Dinner, Lunch]
Categories (2, object): [Dinner, Lunch]

막대 그래프

Lunch에서 팁의 평균과 Dinner에서 팁의 평균을 막대 그래프로 나타냅니다. 상단의 검은 막대는 95% 신뢰구간을 표시합니다.

sns.barplot(x='time', y='tip', data=df)
<matplotlib.axes._subplots.AxesSubplot at 0x2375830cd68>

ci=None이라고 하면 신뢰구간을 표시하지 않습니다.

sns.barplot(x='time', y='tip', data=df, ci=None)
<matplotlib.axes._subplots.AxesSubplot at 0x23758375a90>

스트립플롯

각 범주의 평균만을 나타내면 분포에 대해 파악하기 어렵습니다. 스트립플롯은 데이터를 점으로 찍어 나타낸 것입니다. 대체로 1~4달러 정도의 범위에 팁이 집중되어 있는 것을 볼 수 있습니다.

sns.stripplot(x='time', y='tip', data=df)
<matplotlib.axes._subplots.AxesSubplot at 0x237583b46d8>

바이올린 플롯

바이올린 플롯은 데이터가 많은 범위는 두껍게, 데이터가 적은 범위는 얇게 그린 것입니다. 중고등학교 시절 연령별 인구를 표현할 때 이 그래프를 사용한 것을 보셨을 겁니다.

sns.violinplot(x='time', y='tip', data=df)
<matplotlib.axes._subplots.AxesSubplot at 0x237592a9908>

박슨 플롯

박슨 플롯은 바이올린 플롯과 비슷하지만 데이터를 구간으로 나누어 사각형들로 표현한 것입니다. 가운데의 굵은 수평선은 LunchDinner에서 팁의 중간값을 나타냅니다. Lunchtip 중간값은 2.25이고 Dinner에서 tip의 중간값은 3.0입니다.

중간값은 50%의 위치이므로 0%에서 50%를 다시 반으로 나눈 25% 지점(제1사분위수)부터 50%에서100%를 반으로 나눈 75% 지점(제3사분위수)까지를 하나의 사각형으로 그립니다.

그리고 0%에서 25%를 반으로 나눈 12.5% 지점까지 작은 사각형을 그리고, 75%에서 100%를 반으로 나눈 87.5% 지점까지 작은 사각형을 그립니다. 이 과정을 계속 반복해서 그립니다.

sns.boxenplot(x='time', y='tip', data=df)
<matplotlib.axes._subplots.AxesSubplot at 0x237593665c0>

상자-수염 그림

상자-수염 그림은 바이올린 플롯과 비슷한 그래프입니다.

상자-수염 그림에서 사각형의 가운데 있는 선은 중간값을 나타냅니다. 상자의 아랫면은 제1사분위수, 하위 25%지점을 나타냅니다. 상자의 윗면은 제3사분위수, 상위 25%지점을 나타냅니다.

상자의 높이는 사분위간 범위(IQR)라고 합니다.

상자에서 아래로 뻗어나온 수염은 최솟값을 나타냅니다. 위로 뻗어나온 수염은 최댓값을 나타냅니다. 만약 최솟값이나 최댓값이 상자에서 IQR의 1.5배보다 멀리 떨어져 있으면 IQR의 1.5배 되는 지점까지만 수염을 그립니다. 그리고 수염의 범위를 벗어난 사례들은 점으로 찍어 표시합니다. 아래 그림에서 점들은 제3사분위수에서 IQR의 1.5배를 벗어나는 매우 많은 팁을 준 사례입니다.

sns.boxplot(x='time', y='tip', data=df)
<matplotlib.axes._subplots.AxesSubplot at 0x237596ff978>