Python에서 데이터 시각화하는 다양한 방법


  • Python에서 데이터 시각화할 때 사용하는 다양한 라이브러리를 정리한 글입니다
  • 데이터 분석가들은 주로 Python(또는 R, SQL)을 가지고 데이터 분석을 합니다
    • R에는 ggplot이란 시각화에 좋은 라이브러리가 있는 반면 Python에는 어느 춘추전국시대처럼 다양한 라이브러리들이 있습니다
    • 각 라이브러리들마다 특징이 있기 때문에, 자유롭게 사용하면 좋을 것 같습니다
    • Zeppelin도 시각화할 때 사용할 수 있지만, 라이브러리는 아니기 때문에 이 문서에선 다루지 않습니다
  • 저는 Jupyter Notebook으로 레포트를 작성해, 레포트의 보는 사람이 누구인지에 따라 다르게 그래프를 그렸습니다
    • 직접 그래프를 더 탐색해보고 싶은 목적이 있는 분들에게 보내는 그래프라면 동적인(Interactive) 그래프를 그렸습니다
    • 반복적인 레포트는 정적인 그래프 기반으로 작성한 후, 추가적인 내용이 궁금하면 대시보드로 가도록 유도했습니다
  • 이 문서는 맥북에서 작성되었으며, 부족한 내용이 있으면 연락주세요 :)
  • 현재 프론트단의 문제로 자바스크립트 기반 그래프는 처음엔 보이지 않을 수 있습니다. 10초 뒤 새로고침하면 나올거에요-!
  • plot.ly, pyecharts는 웹에서 정말 강력합니다. 꼭 직접 사용해보세요!
  • 라이브러리
    • matplotlib
    • seaborn
    • plotnine
    • folium
    • plot.ly
    • pyecharts

Matplotlib


import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

print("Matplotlib version", matplotlib.__version__)
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
Matplotlib version 2.2.3

Figure의 구성 요소

  • 처음 matplotlib을 사용해 그래프를 그릴 때, 그래프와 관련된 명칭을 (영어 표현으로) 몰라 애를 먹었습니다
  • 여기 나온 표현을 숙지해두기만 해도 좋을 것 같습니다

Figure

  • Figure는 그림이 그려지는 도화지라고 생각할 수 있습니다
    • 우선 Figure를 그린 후, plt.subplots로 도화지를 분할해 각 부분에 그래프를 그리는 방식으로 진행합니다
    • plt.figure를 명시적으로 표현해주는 것이 좋으나, plot 함수에서 자동으로 figure를 생성하기 때문에 자주 사용하진 않습니다
    • 그러나 현재 figure에 접근해야 할 필요성이 있다면, plt.gcf()로 접근할 수 있습니다
  • size를 조절하고 싶은 경우엔 fig.set_size_inches(18.5, 10.5)
    • 또는 plt.figure(figsize=(10,5))
    • 또는 plt.rcParams['figure.figsize'] = (10,7)

Axes

  • Axes는 plot이 그려지는 공간입니다

Axis

  • plot의 축입니다

fig = plt.figure()
fig.suptitle('figure sample plots')  

fig, ax_lst = plt.subplots(2, 2, figsize=(8,5))  

ax_lst[0][0].plot([1,2,3,4], 'ro-')
ax_lst[0][1].plot(np.random.randn(4, 10), np.random.randn(4,10), 'bo--')
ax_lst[1][0].plot(np.linspace(0.0, 5.0), np.cos(2 * np.pi * np.linspace(0.0, 5.0)))
ax_lst[1][1].plot([3,5], [3,5], 'bo:')
ax_lst[1][1].plot([3,7], [5,4], 'kx')
plt.show()
df = pd.DataFrame(np.random.randn(4,4))
df.plot(kind='barh')
Out[4]:
<matplotlib.axes._subplots.AxesSubplot at 0x121af8390>
  • ggplot 스타일로 그리고 싶다면 아래 옵션 추가
plt.style.use('ggplot')
pd.options.display.mpl_style = 'default'
fig = plt.figure()
fig.suptitle('ggplot style')  

fig, ax_lst = plt.subplots(2, 2, figsize=(8,5))  

ax_lst[0][0].plot([1,2,3,4], 'ro-')
ax_lst[0][1].plot(np.random.randn(4, 10), np.random.randn(4,10), 'bo--')
ax_lst[1][0].plot(np.linspace(0.0, 5.0), np.cos(2 * np.pi * np.linspace(0.0, 5.0)))
ax_lst[1][1].plot([3,5], [3,5], 'bo:')
ax_lst[1][1].plot([3,7], [5,4], 'kx')
plt.show()
<Figure size 432x288 with 0 Axes>

Seaborn


  • seaborn은 matplotlib을 기반으로 다양한 색 테마, 차트 기능을 추가한 라이브러리입니다
  • matplotlib에 의존성을 가지고 있습니다
  • matplotlib에 없는 그래프(히트맵, 카운트플랏 등)을 가지고 있습니다
  • 설치

      pip3 install seaborn
  • Seaborn Tutorials
import seaborn as sns
print("Seaborn version : ", sns.__version__)
sns.set()
sns.set_style('whitegrid')
sns.set_color_codes()
Seaborn version :  0.9.0
current_palette = sns.color_palette()
sns.palplot(current_palette)

relplot

tips = sns.load_dataset("tips")
sns.relplot(x="total_bill", y="tip", hue="smoker", style="smoker",
            data=tips)
Out[11]:
<seaborn.axisgrid.FacetGrid at 0x1249898d0>
df = pd.DataFrame(dict(time=np.arange(500),
                       value=np.random.randn(500).cumsum()))
g = sns.relplot(x="time", y="value", kind="line", data=df)
g.fig.autofmt_xdate()

Catplot

sns.catplot(x="day", y="total_bill", hue="smoker",
            col="time", aspect=.6,
            kind="swarm", data=tips)
Out[12]:
<seaborn.axisgrid.FacetGrid at 0x124978a20>
titanic = sns.load_dataset("titanic")
g = sns.catplot(x="fare", y="survived", row="class",
                kind="box", orient="h", height=1.5, aspect=4,
                data=titanic.query("fare > 0"))
g.set(xscale="log");

Pairplot

iris = sns.load_dataset("iris")
sns.pairplot(iris)
Out[16]:
<seaborn.axisgrid.PairGrid at 0x125319a90>
g = sns.PairGrid(iris)
g.map_diag(sns.kdeplot)
g.map_offdiag(sns.kdeplot, n_levels=6);