[Python.Seaborn] Seaborn 필수 그래프 정리 3 - Heatmap과 KDE Plot (feat. tips, flights, iris dataset)
2021. 1. 20. 05:00ㆍPython과 머신러닝/MatPlotLib 데이터 시각화
0. 지난 포스트
- 지난 포스트에서 필수 그래프들을 여러 가지 정리했다 (Line Plot, Scatter Plot, Count PLot, Bar Plot, Dist Plot)
- 2021/01/18 - [Python과 머신러닝/MatPlotLib 데이터 시각화] - [Python.Seaborn] Seaborn 필수 그래프 정리 1 - Line plot과 Scatter plot
- 이번 포스트에서는 HeatMap과 KDE Plot을 정리해보자
1. Heatmap 그리기
In [14]:import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
flights = sns.load_dataset('flights')
flights
Out[14]:
- 이번에 사용할 dataset은 seaborn이 제공하는 flights dataset이다.
- 이 Dataset은 1949년부터 1960년까지의 월별 비행기 승객 수 데이터이다.
- 월별/연도별 데이터를 따로 보자니 그래프가 너무 많은데, 보고자 하는 데이터는 승객수뿐이라면 heatmap을 사용하기 적합한 데이터 셋이다.
In [15]:flights = flights.pivot('month', 'year', 'passengers')
flights
Out[15]:
In [16]:ax = sns.heatmap(flights) # heat map
Out[16]:
- In[15] : Heatmap을 그리기 위해서는 Table형태로 데이터를 전처리할 필요가 있다.
- 그래서 Pivot함수를 사용해서 연도별/월별 승객수의 피벗 테이블을 생성한다.
- In[16] : 그렇게 만든 Pivot 함수를 sns.heatmap 함수의 parameter로 전달하면, Out[16]의 결과가 나온다.
- Out[16]을 분석하면 다음과 같은 결과가 나온다
- 한 연도를 잡고 월별로 분석하면, 대부분의 경우 7월에 승객이 제일 많고, 7/8월이 전반적으로 더 높다. 미국의 여름휴가/방학이 이때에 있어서 그런 게 아닐까 생각해본다.
- 한 달을 잡고 연도별로 분석을 해보면, 1960년에 가까워질수록 꾸준히 승객수가 증가하는 것을 볼 수 있다.
- 1960년까지 밖에 데이터가 없어서 아쉬운데, 2021년까지 데이터가 있었다면 얼마나 급격하게 늘다가 코로나로 승객수가 급락했는지 볼 수 있었을 것 같다.
- 다시 말하지만, seaborn의 매력은 이러한 편리함이라고 생각한다.
- 가끔 MatPlotLib이랑 Seaborn이 뭐가 다르고, 왜 둘다 알아야 하냐고 질문하는 분들이 있는데, MatPlotLib을 잘 쓸 수 있고 완벽하게 이해했다면 MatPlotLib을 사용하면 된다.
- 하지만 그때 그때 Parameter를 다 찾아서 쓰려면 MatPlotLib의 높은 자유도가 오히려 짐이 되는 사람들이 있고, 그런 사람들은 Seaborn을 통해 제공되는 몇 가지 기능을 사골 우려내듯 반복적으로 사용하면 된다.
- 어차피 Tool은 데이터를 시각화해주는 도구일 뿐이기 때문에, Tool 사용의 시간을 줄이고 시각화된 결과물로부터 insight를 추출하는 데에 집중하는 것이 한 데이터 분석가의 가치를 높이는 일이라고 생각한다.
2. KDE Plot
In [17]:sns.kdeplot(tips['total_bill'], shade=True)
Out[17]:
- KDE Plot은 Kernel Density Estimate Plot의 줄임말이다.
- 쉽게 말해 Histogram에 아주 많은 bins를 가지고 있는 것과 같다고 생각하면 된다.
- y축을 Density라고 표현했는데, total_bill의 분포도를 '밀도'라는 기준으로 표현한 것인데, histogram과 유사한 개념이라고 이해하면 쉽다.
In [18]:sns.kdeplot(tips['total_bill'], tips['tip'], shade=True, vertical=True)
Out[18]:
- Histogram과 다른 것이 있다면 2차원으로도 그릴 수 있다는 장점이 있다.
- Total bill과 tip의 분포도를 마치 지도에 산을 그리듯 등고선으로 표현하여 각 값들이 어떻게 분포되어있는지 볼 수 있다.
- 두 변수가 양의 상관관계를 가지고 있다는 정보와 분포도를 동시에 파악할 수 있어서 분석에 큰 도움이 될 때가 있다.
3. KDE Plot 2 - iris dataset
In [19]:iris = sns.load_dataset('iris')
setosa = iris.loc[iris.species == 'setosa']
virginica = iris.loc[iris.species == 'virginica']
In [20]:ax = sns.kdeplot(setosa.sepal_width,
setosa.sepal_length,
cmap='Reds',
shade=True,
shade_lowest=False)
- 이번엔 iris dataset을 통해서 KDE Plot에 대해서 조금 더 정리해보자.
- iris dataset은 꽃들의 꽃입과 꽃받침 잎의 넓이와 길이를 기록한 데이터이다.
- 여러 종류의 꽃들이 있을텐데 이번 예제에서는 setosa 종과 virginica 종의 꽃을 정리해보자.
- 나처럼 꽃에 대해서 전혀 모르는 사람들을 위해 검색을 해보니 iris꽃은 붓꽃이고, setosa와 virginica는 세부 종이라고 한다. 아래 그림을 보면 꽃알못들은 절대 구분할 수 없고, 데이터로 구분하기 위해 KDE Plot의 parameter를 정리해보자.
- In[20] Parameter 정리
- setosa.sepal_width : X축 데이터
- setosa.sepal_length : Y축 데이터
- cmap='Reds' : Color Map의 약자이고 색깔/style을 지정할 수 있다.
- 종류가 매우 많고 특정 색을 원한다면 다음 주소에서 직접 보고 선택하는 것이 좋다.
- matplotlib.org/3.2.1/tutorials/colors/colormaps.html
- shade=True : fill 변수와 동일한 기능을 하여 같은 Density를 가지는 면적을 같은 농도로 칠해준다.
- shade_lowest=False : 배경을 흰색으로 유지하는 것과 같은 기능이다. 이를 True로 할 경우 그래프 전체가 가장 연한 빨간색(핑크색)으로 채워지기 때문에, 대부분의 경우 False로 사용하는 것이 가독성에 좋다.
In [21]:ax = sns.kdeplot(virginica.sepal_width,
virginica.sepal_length,
cmap='Blues',
shade=True,
shade_lowest=False)
- 이번엔 virginica 종의 꽃받침 잎의 넓이와 길이의 분포도를 KDE Plot으로 그려봤다.
- Sepal의 넓이는 둘다 비슷하지만, 길이는 평균적으로도 큰 차이가 있다.
- Virginica는 평균 6.5 정도의 값을 갖고 가장 짧은 잎이 5인데, Setosa는 평균이 5이고 제일 긴 것이 6 정도이다.
- 다시 사진으로 돌아가 보면 Virginca의 꽃받침이 약간 더 긴 것 같다는 느낌도 들지만, 역시나 꽃은 어렵다.