[Python.Seaborn] Seaborn 필수 그래프 정리 3 - Heatmap과 KDE Plot (feat. tips, flights, iris dataset)

2021. 1. 20. 05:00Python과 머신러닝/MatPlotLib 데이터 시각화

0. 지난 포스트

  • 이번 포스트에서는 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]:

Out[14]

  • 이번에 사용할 dataset은 seaborn이 제공하는 flights dataset이다.
  • 이 Dataset은 1949년부터 1960년까지의 월별 비행기 승객 수 데이터이다.
  • 월별/연도별 데이터를 따로 보자니 그래프가 너무 많은데, 보고자 하는 데이터는 승객수뿐이라면 heatmap을 사용하기 적합한 데이터 셋이다.
In [15]:flights = flights.pivot('month', 'year', 'passengers') 
        flights
Out[15]:

Out[15]

In [16]:ax = sns.heatmap(flights) # heat map
Out[16]:

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]:

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]:

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)

Out[20]

  • 이번엔 iris dataset을 통해서 KDE Plot에 대해서 조금 더 정리해보자.
  • iris dataset은 꽃들의 꽃입과 꽃받침 잎의 넓이와 길이를 기록한 데이터이다.
  • 여러 종류의 꽃들이 있을텐데 이번 예제에서는 setosa 종과 virginica 종의 꽃을 정리해보자.
  • 나처럼 꽃에 대해서 전혀 모르는 사람들을 위해 검색을 해보니 iris꽃은 붓꽃이고, setosa와 virginica는 세부 종이라고 한다. 아래 그림을 보면 꽃알못들은 절대 구분할 수 없고, 데이터로 구분하기 위해 KDE Plot의 parameter를 정리해보자.

출처 / Reference : http://www.lac.inpe.br/~rafael.santos/Docs/CAP394/WholeStory-Iris.html

  • In[20] Parameter 정리
    • setosa.sepal_width : X축 데이터
    • setosa.sepal_length : Y축 데이터
    • cmap='Reds' : Color Map의 약자이고 색깔/style을 지정할 수 있다.
  • 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)

Out[21]

  • 이번엔 virginica 종의 꽃받침 잎의 넓이와 길이의 분포도를 KDE Plot으로 그려봤다.
  • Sepal의 넓이는 둘다 비슷하지만, 길이는 평균적으로도 큰 차이가 있다.
  • Virginica는 평균 6.5 정도의 값을 갖고 가장 짧은 잎이 5인데, Setosa는 평균이 5이고 제일 긴 것이 6 정도이다.
  • 다시 사진으로 돌아가 보면 Virginca의 꽃받침이 약간 더 긴 것 같다는 느낌도 들지만, 역시나 꽃은 어렵다.
반응형