seaborn은 파이썬 시각화의 대표 주자로, matplotlib를 기반으로 작동하는 패키지입니다. 데이터 분석을 하다보면 숫자만으로는 데이터를 파악하기 어려울 때가 있죠. 시각화는 분석가가 데이터를 이해하기 위해서, 더 나아가 데이터를 기반으로 상대를 설득하기 위해서 반드시 알아야할 기술입니다. 미적 감각이 갖춰져있다면 더 예쁘고 요약이 잘 된 그림을 그릴 수 있겠지만..😓 많은 분석가들에게 그런 스킬은 어렵기 때문에 seaborn의 도움을 많이 받고 있습니다. 데이터가 저장된 판다스 데이터프레임 객체를 쉽게 시각화할 수 있으니, 사용하지 않을 이유가 더욱 없죠.
seaborn 1편에서는 seaborn에서 제공하는 다양한 시각화 함수(displot, scatterplot, regplot, countplot, barplot, boxplot, heatmap)들을 소개하고,
2편에서는 그림을 원하는 대로 커스터마이징하는 방법들(색상 변경, 축 이름 추가, 축 범위 조절 등)에 대해 알아보겠습니다.
본 포스트에서 시각화를 위해 사용하는 예제는 와인 품질 데이터로, 아래에서 다운로드할 수 있습니다.
https://www.kaggle.com/uciml/red-wine-quality-cortez-et-al-2009
Red Wine Quality
Simple and clean practice dataset for regression or classification modelling
www.kaggle.com
먼저 seaborn 패키지를 불러오고, 데이터도 읽어와서 어떻게 생겼는지 확인해보겠습니다. 판다스는 1.1.0, seaborn은 0.11.2, matplotlib는 3.4.3 버전을 사용하였습니다.
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.read_csv('./data/winequality-red.csv')
df.columns = [col.replace(' ', '_') for col in df.columns]
display(df.shape, df.head())
저는 아래 시각화 코드에서 사용하기 위해 임시로 범주형 변수를 생성했습니다. alcohol_grp 칼럼은 alcohol 칼럼의 값이 10 이하이면 under10, 10 초과 12 이하이면 10to12, 12 초과이면 over12 라는 범주값을 갖습니다.
df['alcohol_grp'] = pd.cut(df.alcohol, bins=(-np.inf, 10, 12, np.inf), labels=['under10', '10to12', 'over12'])
display(df.alcohol_grp.value_counts())
1. displot: 연속형 변수의 분포 그리기
displot 함수는 연속형 변수의 분포를 시각화합니다. kde 파라미터를 True로 설정하면 커널밀도추정함수를 함께 그릴 수 있죠. 연속형 변수의 분포를 시각화하여 우측(혹은 좌측)으로 쏠려있는지, 특정 범위 내에서 고르게 분포되어 있는지, 평균이 다른 정규분포를 두개 합친 형태를 갖고있는지(Gaussian Mixture Model) 등을 확인할 수 있습니다.
sns.displot(df['alcohol'], kde=True, color='blue')
plt.show()
2. scatterplot, regplot: 두 연속형 변수의 관계 확인하기
scatterplot 함수를 사용하면 두 연속형 변수의 관계를 시각화할 수 있습니다. 한 변수의 값이 증가할 때, 다른 변수의 값이 증가하는지 감소하는지를 말이죠.
regplot은 여기에 회귀선을 함께 그려줍니다.
sns.scatterplot(x='fixed_acidity', y='pH', data=df)
plt.show()
이 그림에 범주형 변수 정보를 추가할 수도 있습니다. 점 하나가 데이터 하나를 나타내는데, 이 데이터가 어떤 범주형 변수에서 어떤 값을 갖는지를 말이죠. 위에서 생성했던 alcohol_grp 변수를 hue 파라미터에 지정해주면, alcohol_grp 값에 따라 다른 색을 갖도록 그림을 그릴 수 있습니다.
sns.scatterplot(x='fixed_acidity', y='pH', hue='alcohol_grp', data=df)
plt.show()
동일한 변수를 이용하여 regplot을 그린 결과입니다. 반비례하는 두 변수의 관계를 회귀선으로 나타내주어 분석가가 분석을 하는 데 확신을 더해줄 수 있죠.
sns.regplot(x='fixed_acidity', y='pH', data=df)
plt.show()
3. countplot: 범주형 변수의 범주별 데이터수 세기
countplot은 범주형 변수를 시각화하는 데 사용합니다. 범주형 변수에 어떤 범주(그룹)들이 있는지, 범주가 몇 개 있는지, 범주마다 속하는 데이터의 수는 몇 개인지 알 수 있죠.
아래 결과에서는 quality라는 범주형 변수에서 3, 4, 5, 6, 7, 8이라는 6개의 그룹을 갖고 있으며, 그룹 5가 가장 많은 데이터를 포함하는 것을 확인할 수 있습니다.
sns.countplot(x='quality', data=df)
plt.show()
마찬가지로 hue 파라미터를 이용해 두 범주의 조합마다 데이터 수를 파악할 수도 있습니다.
sns.countplot(x='quality', hue='alcohol_grp', data=df)
plt.show()
4. barplot: 그룹별 연속형 변수 값 요약 후 시각화하기
barplot은 범주형 변수와 연속형 변수의 관계를 파악하는 데 사용합니다. 결과 그림이 유사해서 countplot과 혼동될 수 있는데요, barplot은 연속형 변수를 함께 파라미터로 넣는다는 점이 다릅니다.
예를 들어 범주형 변수인 quality에 따라 연속형 변수인 alcohol의 평균이 어떻게 다른지 알고 싶다면, 아래와 같이 코드를 작성합니다. 디폴트가 범주별 평균을 산출하는 것이기 때문에, 최댓값이나 다른 집계를 하고 싶다면 estimator 파라미터를 사용하시면 됩니다.(어렵지 않으니 직접 시도해보세요)
sns.barplot(x='quality', y='alcohol', data=df)
plt.show()
5. boxplot: 그룹별 연속형 변수의 분포 파악하기
barplot은 그룹별로 연속형 변수의 집계 결과(하나의 값)를 시각화했습니다. boxplot은 그룹별로 연속형 변수의 분포를 시각화합니다. 박스 모양이어서 boxplot이라고 하죠. 그룹별로 중앙값이 다른지, 어느 범위에서 값이 분포되어 있는지, 이상치를 포함하는지 등을 한번에 파악하기에 용이합니다.
sns.boxplot(x='quality', y='alcohol', data=df)
plt.show()
물론 연속형 변수 하나의 분포를 boxplot으로 그릴 수도 있습니다.
sns.boxplot(x='alcohol', data=df)
plt.show()
6. heatmap: 두 범주형 변수의 집계 결과 시각화하기
마지막으로 소개드릴 heatmap은 두 범주형 변수와 하나의 연속형 변수를 필요로 합니다. 두 개 범주형 변수에 속하는 범주 조합에 따라 연속형 변수의 평균 등이 어떻게 변하는지 파악하는 데 사용하죠.
범주형 변수인 quality와 alcohol_grp의 조합에 따라 연속형 변수인 fixed_acidity의 평균이 어떻게 다른지 그려보기에 앞서, 먼저 pivot_table 함수를 이용해 집계를 해보겠습니다. 평균이 아닌 중앙값, 최댓값 혹은 원하는 함수를 이용해 집계를 하고 싶다면 aggfunc 파라미터를 적절하게 변경하여 사용하세요.
pv = pd.pivot_table(df, values='fixed_acidity', index='quality', columns='alcohol_grp',
aggfunc='mean', fill_value=0)
display(pv)
quality의 그룹인 3~8과 alcohol_grp의 그룹인 under10, 10to12, over12의 조합에 따라 평균을 집계한 결과, quality 그룹의 숫자가 증가함에 따라 평균이 증가하는 양상을 보이고 있는 것을 확인할 수 있었습니다. 숫자만으로는 한눈에 결과를 해석하기 어렵고, 예쁘지도 않으니.. heatmap을 이용해서 결과를 그림으로 그려봅시다. cmap 파라미터는 시각화에 사용할 색상을 변경하는 데 사용합니다.
sns.heatmap(pv, cmap="YlGnBu")
plt.show()
더 자세한 파라미터와 사용 방법은 seaborn 홈페이지를 참고하시길 바랍니다. 처음 시각화를 공부할 때는 이런 것까지 알아야하나..! 싶었습니다. 그렇지만 데이터 시각화를 할 줄 알아야 데이터를 제대로 파악할 수 있고, 동료들과 커뮤니케이션 하기도 쉬워지고, 성과를 멋지게 표현할 수도 있죠. 안타깝게도 그림만 그린다고 끝은 아닙니다. 분석가는 시각화된 결과를 보고 해석도 하고, 그에 따른 의견을 개진하고 앞으로의 분석 방향성을 잡을 줄도 알아야 하죠. 데이터 분석가의 길은 험난하네요🙃 시각화 마스터하시고 능력 쩌는 데이터 분석가가 됩시다~ 👊
참고
https://seaborn.pydata.org/index.html
seaborn: statistical data visualization — seaborn 0.11.2 documentation
Seaborn is a Python data visualization library based on matplotlib. It provides a high-level interface for drawing attractive and informative statistical graphics. For a brief introduction to the ideas behind the library, you can read the introductory note
seaborn.pydata.org
http://datacamp-community-prod.s3.amazonaws.com/263130e2-2c92-4348-a356-9ed9b5034247
'繩鋸木斷水滴石穿 > Python' 카테고리의 다른 글
[YML/YAML] 파이썬에서 YAML(야믈) 파일 다루는 방법 (0) | 2022.03.04 |
---|---|
[시각화][seaborn] 2) 시각화 커스터마이징하기 (0) | 2021.11.14 |
[pandas] 칼럼 이름 변경하기: rename, set_index, columns (0) | 2021.10.31 |
imblearn 모듈을 이용한 불균형 데이터 다루기 (0) | 2021.10.11 |
[numpy] random 모듈을 이용하여 랜덤추출하기 (0) | 2021.10.02 |