Kwon's 데이터분석기
Python시각화 패키지 - Seaborn 본문
데이터 분석이나 데이터를 파악하기 위해서는 통계분석도 중요하지만 직관적으로 확인할 수 있는 시각화 패키지 또한 매우 중요하다. 이러한 시각화 패키지 중 Python Seaborn 시각화 코드에 대해서 살펴보겠다.
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore')
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
tip = sns.load_dataset('tips')
tip.head()
필요 파이썬 패키지를 들고와준 후, 사용할 데이터는 간단하게 seaborn 패키지에서 제공해주는 tips 데이터를 사용할 것이다.

● swarmplot
swarmplot() 함수는 데이터의 분산까지 고려하여 데이터 포인트가 서로 중복되지 않도록 그린다. 이를 통해 데이터가 퍼져있는 정도를 입체적으로 볼 수 있다.
# swarmplot 그리기 - time 범주에 따른 total_bill 분포플롯
sns.swarmplot(x = 'total_bill', y = 'time', data=tip, hue = 'sex')

위 그림을 통해 total_bill이 Lunch보다 Dinner가 많은 것을 알 수 있고, 여성은 대부분 Lunch시간에, 남성은 대부분 Dinner 시간에 식당 식사를 한다는 것을 파악할 수 있다.
이러한 swarmplot의 문제점으로는 개별 데이터에 대해서 데이터 포인트가 서로 중복되지 않도록 그리기 때문에 데이터의 양이 크면 클수록 실행 속도가 느려지고, 시각화가 원활하지 않다는 것이다.
우리가 다루는 데이터의 크기는 매우 방대한 크기를 가지고 있기 때문에 이러한 swarmplot을 잘 사용하지 않고 전체적인 분포를 쉽게 파악가능한 boxplot이나 violinplot을 사용을 한다.
●Box Plot
데이터의 분포를 시각적으로 표현하는 시각화 방법, 데이터의 중앙값과 분산, 이상치를 쉽게 파악할 수 있도록 도와준다,
Box Plot는 상자(Box)와 수염(Whiskers), 이상치(Outliers)로 이루어져 있다.
- 상자: 데이터의 중간 50%와 상자의 아래 경계인 25% 백분위수, 상자의 상단 경계인 75%를 알려준다.
- 수염: 데이터의 전체 분포를 나타내며, BoxPlot에서 수염을 벗어나는 데이터는 통계적으로 이상치로 구분한다.
- 이상치: 상자와 수염을 벗어나는 개별적인 데이터 포인트를 나타낸다.
아래는 Box Plot의 시각화 코드이다.
# 성별에 따른 total_bill의 BoxPlot & 시간대 별 total_bill의 BoxPlot
sns.boxplot(x = 'sex', y = 'total_bill', data = tip, hue = 'time')

위 그림을 보면, 상자와 선, 점이 있는데 상자에서 중앙의 선은 중위수를 뜻하고, 그 위 아래로 상단 경계 75%와 하단 경계 25%로 상자의 크기가 정해진 것이다. 선이 있는 구역은 수염을 칭하며 이러한 수염은 데이터의 전체 분포를 알려준다. 마지막으로 수염에서 벗어난 이상치는 점 형태로 표시가 되어 있으며 이러한 점들을 통해 이상치를 간접적으로 파악할 수 있는 것이다. 다만 이러한 BoxPlot의 이상치는 데이터의 통계적으로 정의된 기준에 따라 결정 되기 때문에 그 자체로는 실제로 문제가 있는 데이터를 나타내는 것이 아닐 수 있다. 그러므로 이상치를 처리할 때 주의가 필요하다.
●Violin Plot
데이터의 분포를 표현하는 시각화 방법 중 하나로, 커널 밀도 추정을 기반으로 한다. 데이터의 분포를 표현하는 시각화 방법인 BoxPlot과 유사하지만 차이도 존재한다.
Box Plot과 Violin Plot 공통점
- 중앙 경향성 표현: 두 시각화 방법은 모두 데이터의 중앙 경향성을 나타낸다.
-사분위수 표현: 두 시각화 방법은 데이터 분포를 나타나는데에 있어 사분위수(Q1, Q3)를 사용
Box Plot과 Violin Plot 차이점
- 분포 정보: BoxPlot은 데이터의 중간 50%를 나타내고 이상치 확인하는 데 중점을 두는 반면, Violin Plot은 커널 밀도 추정을 사용해 전체 데이터 분포를 그림으로 나타낸다.
- 가시성: Violin Plot이 Box Plot에 비해 데이터의 분포를 더 쉽게 이해할 수 있다.
- 이상치 표현: Violin Plot은 이상치를 명확하게 표현 하지 않는다.
아래는 Violin Plot의 시각화 코드이다.
# 성별과 시간대에 따른 팁 분포 파악
sns.violinplot(x = 'sex', y = 'tip', data = tip, hue = 'time')

위 그림을 보면 BoxPlot에 비해서 데이터의 분포가 더욱 명확하게 그려지는 것을 확인할 수 있으며, 이상치를 명확하게 표현하는 Box Plot과 다르게 이상치에 대한 정보가 명확하게 표시되지 않는 것을 확인할 수 있다.
●Bar Plot
범주형 데이터의 평균 또는 기타 통계량을 막대그래프로 나타내어 데이터 간 비교를 용이하게 해주는 시각화 방법이다.
Bar Plot의 주요 특징으로 범주형 데이터에 대한 평균, 합계, 빈도 등의 통계량을 시각적으로 표현이 가능하고, 여러 범주를 한 번에 비교하기 용이하며, 각 범주의 차이를 쉽게 파악할 수 있어 데이터 시각화 중 가장 많이 사용되는 시각화 중 하나이다.
아래는 BarPlot의 시각화 코드이다.
# 시간대와 성별 별 total_bill의 Bar Plot
sns.barplot(x = 'time', y = 'total_bill', data = tip, hue = 'sex')

위 그래프를 통하여 확인할 수 있는 것은, 시간대가 Lunch와 Dinner 중 total_bill이 Dinner가 더 높고, 남자와 여자 중 남자가 여자에 비해 total_bill이 높다는 것을 확인할 수 있다.
●DistPlot
선 그래프로 변화 추이를 나타내기 위한 시각화 방법이며, matplotlib의 hist와 kdeplot을 통합한 그래프이다.
이를 통하여 분포와 밀도를 BoxPlot보다 더욱 명확하게 확인할 수 있다.
이러한 분포와 밀도를 통하여 데이터가 정규분포를 따르는지 판단을 하는데 도움을 줄 수 있어, 자주 사용하는 시각화 방법이다.
아래는 DistPlot의 시각화 코드이다.
# tip 데이터 total_bill의 distplot 코드
sns.distplot(tip['total_bill'], bins = 20, kde = True)

위 그래프를 통해 total_bill 데이터가 이러한 분포를 따른다는 것을 확인할 수 있다.
●ScatterPlot
ScatterPlot은 두 변수 간의 관계를 시각화하기 위한 산점도를 그리는데 사용된다.
산점도를 통하여 데이터의 분포 및 경향성을 파악을 할 수 있으며, 특이값이나 이상치를 시각적으로 확인이 가능하고, 두 연속형 변수간의 상관 관계또한 시각적으로 파악을 할 수 있다. ScatterPlot 또한 자주 사용하는 시각화 방법이다.
아래는 ScatterPlot의 시각화 코드이다.
# x축에 total_bill, y축에 tip을 두고 hue를 smoker로 지정하여 산점도를 그림
sns.scatterplot(x = 'total_bill', y = 'tip', data = tip, hue = 'smoker')

위 ScatterPlot 산점도 그림을 통하여 total_bill과 tip에는 상관 관계가 존재하는 것으로 파악되며, 흡연 여부는 total_bill과 tip에 영향을 미치지 않는다는 것을 파악할 수 있다.
●CatPlot
Catplot은 hue와 row 등을 동시에 사용해 3개 이상의 카테고리 값에 의한 분포 변화를 보여준다.
Catplot에서 kind라는 매개변수가 있는데 이는 자신이 그리고 싶은 종류의 시각화를 적으면 그 그래프에 맞춰서 시각화를 시켜준다.
아래는 Catplot의 시각화 코드이다.
#plt.rc('font', family='Malgun Gothic') -> 한글 깨짐현상을 해결
# 팁을 기준으로 성별과 흡연여부, 시간대를 한꺼번에 검사를 하며, kind = 'violin'으로
# 그림을 violin plot으로 그려준다.
sns.catplot(x = 'tip', y = 'sex', hue = 'smoker', row = 'time', data = tip, kind = 'violin', split = True, height = 2, aspect = 4)
plt.title('성별, 흡연여부, 시간대에 따른 tip의 Catplot')
plt.show()

위에서 kind = 'violin'으로 하여 violin plot을 그려주었다. 또한 두개의 카테고리값이 아닌 3개 이상의 카테고리 값에 의한 시각화를 그려준다.
●LmPlot
lmplot은 열 간의 선형관계를 확인하기에 용이한 차트로써 outlier도 간접적으로 짐작해 볼 수 있다. 이 시각화 방법은 산점도를 그리고 산점도에 맞는 선형을 그려준다.
아래는 lmplot의 시각화 코드이다.
# total_bill과 tip의 선형관계 확인
sns.lmplot(x = 'total_bill', y = 'tip', data = tip)

이를 통해 산점도만 그려서 선형관계가 있는지 확인하는 것 보다 조금 더 원활하게 선형관계가 있는지 확인할 수 있다.
●JointPlot
JointPlot은 ScatterPlot 산점도와 Histogram을 동시에 그려주는 시각화 방법이다.
이러한 JointPlot은 수치형 데이터만 표현이 가능하다.
아래는 JointPlot의 시각화 코드이다.
# x축에 total_bill, y축에 tip을 넣어 jointplot 시각화를 수행
sns.jointplot(x = 'total_bill', y = 'tip', data = tip)

위 그림을 확인해보면 기본적으로 ScatterPlot이 그려져 있으며, 빈 x축 위쪽에는 total_bill의 히스토그램, 빈 y축 오른쪽에는 tip의 히스토그램이 한꺼번에 그려져 있는 것을 확인할 수 있다. JointPlot을 사용함으로써 히스토그램과 산점도를 따로 그릴필요 없이 한꺼번에 그릴 수 있어 시각화를 효율적으로 할 수 있을 것이다.
●PairPlot
데이터프레임의 변수들 간의 관계를 한 눈에 파악할 수 있도록 모든 변수를 사용하여 시각화하는 방식이다.
데이터프레임의 변수가 수치형 변수 쌍에 대해 산점도를 그리고 각 변수의 분포를 대각선 상에 히스토그램으로 나타낸다.
아래는 PairPlot의 시각화 코드이다.
# 전체 데이터인 tip 에 대한 pairplot 코드
sns.pairplot(tip)

위 그림처럼 tip 데이터 내부에 존재하는 모든 수치형 변수 쌍 끼리의 ScatterPlot(산점도)를 그리고 대각선으로는 Histogram(히스토그램)을 그려준다. 모든 수치형 변수 쌍 끼리의 산점도와 히스토그램을 그려줘서 편하지만, 데이터의 열 중 수치형 변수의 열이 많아질수록 크기가 커지기 때문에 너무 많은 수치형 변수가 존재할 때 사용하면 보기 힘들다는 단점이 존재한다.
●HeatMap
2차원 데이터의 각 셀에 색상을 사용하여 값을 시각적으로 나타내는데 사용한다. 주로 행렬 형태의 데이터를 시각화할 때 유용하다. 이러한 히트맵으로는 주로 상관 관계를 많이 확인하는 편이다.
아래는 HeatMap의 시각화 코드이다.
# tip 데이터 프레임의 데이터를 .corr()을 통해 얻은 상관 계수를 corr_tip에 저장
corr_tip = tip.corr()
# 상관 계수를 저장한 데이터를 넣고 시각화
sns.heatmap(corr_tip, annot = True)

위 시각화 결과를 확인하면 데이터 중 수치형 변수에 대한 상관관계 수치를 확인할 수 있다. 또한 더욱 명확한 시각화를 하기 위하여 annot이라는 수치까지 포함해주는 매개 변수를 사용하였다.
이 이외에도 사용할 색상 맵을 지정하는 cmap, 셀 간 경계의 두께와 색상을 지정하는 linewidths와 linecolor, 컬러바(색상막대)를 표시할지 여부를 지정하는 cbar, 각각 x축과 y축의 눈금 레이블을 표시할지 여부를 지정하는 xticklabels, yticklabels 등이 존재합니다. 위 다양한 매개변수를 활용하여 시각화를 더욱 보기 좋게 만드는 것도 다른사람이 보는 입장에서 매우 좋을 것이다.
이 이외에도 seaborn 패키지의 시각화는 더 존재할 것이지만, 이정도의 시각화 방법만 가지고 있으면 데이터의 분포, 추세, 특징을 찾아내는데에는 문제 없을 것이다.
이제부터 위 설명한 시각화 방법에 대한 주요 매개변수를 설명을 할 것이다.
●Seaborn 패키지의 주요 매개변수들
- hue: 범주형 변수를 지정하여 데이터를 색상으로 구분
- size: 점의 크기를 조절하는데 사용
- palette: hue에 사용될 색상 팔레트를 지정
- markers: 각 범주형 변수의 마커를 지정
- col, row: 데이터를 여러 서브플롯으로 나눌 때 사용되는 변수를 지정
- alpha: 각 점의 투명도를 지정 (0~1 사이)
- legend: 범례를 표시할지 여부 지정 -> 파생된 매개변수 legend_out: 범례를 서브플롯 밖으로 위치시킬지 여부 지정
- sharex, sharey: 서브플롯 간 x축 또는 y축을 공유할지 여부 지정
- colors, col_colors, row_colors: 데이터에 색을 지정, col_colors, row_colors는 col과 row의 변수 색 지정
이렇게 Seaborn 패키지의 시각화 방법과 주요 매개변수들에 대해서 살펴보았다. 이를 활용해서 데이터에 대한 인사이트를 얻는데 도움이 되었으면 좋겠다.
'Python 공부 - 잡다한 것들' 카테고리의 다른 글
| Python .txt 파일 다루기 - RadishSurvey.txt 데이터 다루기 (0) | 2023.12.28 |
|---|