Seaborn Intro - Countplot

Page content

강의 홍보

Seaborn 개요

Matplotlib 라이브러리가 Python에서 제공하는 기본적인 시각화 도구이지만, 기본객체는 리스트 형태를 따르기 때문에, 엑셀 데이터, 즉 데이터 프레임에 익숙한 사용자들에게는 조금 불친절한 것은 아쉬움이 있습니다. 실제, 입문자를 대상으로 강의를 할 때에도 Seaborn부터 알려드리는데, 그 이유는 Pandas를 활용한 데이터 가공 직후에 보다 쉽게 연동할 수 있도록 Seaborn이 개발되었기 때문입니다. 또한, Matplotlib에서는 회귀선과 같은 통계적 내용의 그래프도 보다 쉽게 구현할 수 있도록 제작되었습니다. 보다 정교한 시각적인 디자인을 추가 및 수정하려면, Matplotlib를 보다 더 잘 활용해야 합니다. 이는 마지막 본 포스트의 마지막 장에서 다루도록 합니다.

먼저, 간단한 예제를 통해서 익히도록 합니다.

(1) 라이브러리 불러오기

필요한 모듈을 불러옵니다.

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

(2) 데이터 불러오기

이번에는 seaborn 패키지 내 load_data 데이터를 활용합니다. 실전에서는 csv, excel, 또는 DB에서 직접 데이터를 불러오는 영역이 이 부분이 됩니다.

# tips 데이터셋 가져오기
tips = sns.load_dataset("tips")

# tips 데이터셋 살펴보기
print(tips.head())
print("\n")
print(tips.info())
   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


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 244 entries, 0 to 243
Data columns (total 7 columns):
 #   Column      Non-Null Count  Dtype   
---  ------      --------------  -----   
 0   total_bill  244 non-null    float64 
 1   tip         244 non-null    float64 
 2   sex         244 non-null    category
 3   smoker      244 non-null    category
 4   day         244 non-null    category
 5   time        244 non-null    category
 6   size        244 non-null    int64   
dtypes: category(4), float64(2), int64(1)
memory usage: 7.3 KB
None

(3) 빈도 그래프

빈도 그래프는 범주형 데이터에 대한 빈도를 시각화 해주는 그래프입니다. 즉 각 범주에 속하는 데이터의 개수를 센다는 의미로 countplot()함수를 사용합니다. 이 때 주의해야 하는 것은, x축에 수치형이 아닌 범주형의 데이터를 입력해야 하며 옵션을 통해서 hue변수를 분리하지 않고, 누적 그래프로 출력 할 수 있습니다. 코드를 통해 확인해봅니다.

sns.countplot(x = "day", data = tips)
plt.show()

png

이번에는 월별이 아닌, 개수가 많은 것이 앞에 올 수 있도록 조정합니다. 그러기 위해서는 먼저 각 요일별의 개수를 세어봅니다.

tips['day'].value_counts()
Sat     87
Sun     76
Thur    62
Fri     19
Name: day, dtype: int64

앞선 시각화 그래프와 마찬가지로 출력값이 잘 나온 것을 확인할 수 있습니다. 이번에는 위 결과값을 근거로 이제 order 옵션에 추가하도록 합니다.

sns.countplot(x = "day", data = tips, order = tips['day'].value_counts().index)
plt.show()

png

보다 데이터가 정렬되어 출력되는 것을 확인할 수 있습니다. 이번에는 hue 옵션을 추가하여, 병렬로 그래프를 그리는 방법과 누적으로 그리는 방법 두개를 동시에 보여드리도록 합니다. 데이터의 문맥에 맞춰서 두개 중 하나를 택하여 사용하시는 것을 권합니다.

fig, ax = plt.subplots(nrows = 1, ncols = 2, figsize=(15, 5))

# dodge = False
# 누적 그래프로 출력
sns.countplot(x = "day", 
              data = tips, 
              hue = "sex", 
              dodge = False, 
              order = tips['day'].value_counts().index, 
              ax = ax[0])

# dodge = True
# 병렬 방향으로 출력
sns.countplot(x = "day", 
              data = tips, 
              hue = "sex", 
              dodge = True,
              order = tips['day'].value_counts().index, 
              ax = ax[1])

plt.show()

png