시각화 (Visualisation)

이 책의 첫 번째 부분을 읽고 나면, 데이터 과학을 수행하기 위한 가장 중요한 도구들의 기초를 이해하게 됩니다. 이제 세부 사항으로 뛰어들 시간입니다. 책의 이 부분에서는 데이터 시각화에 대해 더 깊이 배우고( 레이어 (Layers) 에서), 다양한 종류의 데이터 시각화에 대한 세부 사항들을 본격적으로 다룰 것입니다( 탐색적 데이터 분석 (Exploratory Data Analysis)소통을 위한 시각화 (Graphics for Communication) 에서). 이 짧은 장에서는 시각화를 만드는 다양한 방법과 시각화의 다양한 목적에 대해 논의합니다.

데이터 시각화의 철학 (Philosophies of data visualisation)

코드를 사용하여 데이터 시각화를 만드는 방식에는 크게 두 가지 카테고리가 있습니다: 명령형(imperative) (개별 요소들로부터 원하는 것을 구축함) 방식과 선언적(declarative) (기존 옵션 목록에서 원하는 것을 말함) 방식입니다. 어떤 것을 선택할지는 트레이드오프 관계에 있습니다: 명령형 라이브러리는 유연성을 제공하지만 코드가 다소 장황해질 수 있습니다. 선언적 라이브러리는 데이터를 플롯하는 빠른 방법을 제공하지만, 데이터가 처음부터 올바른 형식이어야 하며 특수한 차트 유형으로 커스텀하기가 더 어렵습니다.

파이썬에는 아마도 현존하는 가장 강력한 명령형 플로팅 패키지인 matplotlib와 이미 보았던 놀라운 선언적 라이브러리인 lets-plot을 포함하여 훌륭한 플로팅 패키지들이 많이 있습니다. 이 두 라이브러리만으로도 많은 일을 할 수 있으며, 각각 한 권의 책이 될 만큼 가치가 있습니다. 하지만 다행히도 우리는 이 중 하나에서 몇 가지 명령어만으로 필요한 작업의 95%를 처리할 수 있습니다. 일반적으로 이 책을 최대한 가볍게 유지하기 위해 가능한 모든 곳에서 lets-plot을 사용하기로 했습니다—그리고 레이어 (Layers) 장에서 이를 직접 사용하는 방법에 대한 더 심층적인 투어를 제공할 것입니다.

데이터 시각화의 목적 (Purposes of data visualisation)

데이터 시각화에는 온갖 다양한 목적이 있습니다. 시중의 시각화를 크게 세 가지 범주로 나누어 생각하면 유용할 수 있습니다:

  • 탐색적 (exploratory)
  • 과학적 (scientific)
  • 서사적 (narrative)

각각에 대해 좀 더 자세히 살펴보겠습니다.

탐색적 데이터 시각화 (Exploratory Data Viz)

세 가지 중 첫 번째는 탐색적 데이터 시각화이며, 데이터를 살펴보고 이해하려고 노력할 때 수행하는 종류입니다. 단순히 데이터를 플롯하는 것만으로도 발생할 수 있는 모든 문제를 파악하는 데 정말 좋은 전략이 됩니다. 이는 동일한 평균, 표준 편차, 상관관계를 가지면서도 데이터 분포는 매우 다른 네 개의 서로 다른 데이터셋인 앤스컴의 콰르텟(Anscombe’s quartet)으로 가장 유명하게 증명되었습니다.

코드 보기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib_inline.backend_inline

# Plot settings
plt.style.use("plot_style.txt")
matplotlib_inline.backend_inline.set_matplotlib_formats("svg")

# Set max rows displayed for readability
pd.set_option("display.max_rows", 6)

x = [10, 8, 13, 9, 11, 14, 6, 4, 12, 7, 5]
y1 = [8.04, 6.95, 7.58, 8.81, 8.33, 9.96, 7.24, 4.26, 10.84, 4.82, 5.68]
y2 = [9.14, 8.14, 8.74, 8.77, 9.26, 8.10, 6.13, 3.10, 9.13, 7.26, 4.74]
y3 = [7.46, 6.77, 12.74, 7.11, 7.81, 8.84, 6.08, 5.39, 8.15, 6.42, 5.73]
x4 = [8, 8, 8, 8, 8, 8, 8, 19, 8, 8, 8]
y4 = [6.58, 5.76, 7.71, 8.84, 8.47, 7.04, 5.25, 12.50, 5.56, 7.91, 6.89]

datasets = {"I": (x, y1), "II": (x, y2), "III": (x, y3), "IV": (x4, y4)}

fig, axs = plt.subplots(
    2,
    2,
    sharex=True,
    sharey=True,
    figsize=(10, 6),
    gridspec_kw={"wspace": 0.08, "hspace": 0.08},
)
axs[0, 0].set(xlim=(0, 20), ylim=(2, 14))
axs[0, 0].set(xticks=(0, 10, 20), yticks=(4, 8, 12))

for ax, (label, (x, y)) in zip(axs.flat, datasets.items()):
    ax.text(0.1, 0.9, label, fontsize=20, transform=ax.transAxes, va="top")
    ax.tick_params(direction="in", top=True, right=True)
    ax.plot(x, y, "o")

    # linear regression
    p1, p0 = np.polyfit(x, y, deg=1)  # slope, intercept
    ax.axline(xy1=(0, p0), slope=p1, color="r", lw=2)

    # add text box for the statistics
    stats = (
        f"$\\mu$ = {np.mean(y):.2f}\n"
        f"$\\sigma$ = {np.std(y):.2f}\n"
        f"$r$ = {np.corrcoef(x, y)[0][1]:.2f}"
    )
    bbox = dict(boxstyle="round", fc="blanchedalmond", ec="orange", alpha=0.5)
    ax.text(
        0.95,
        0.07,
        stats,
        fontsize=9,
        bbox=bbox,
        transform=ax.transAxes,
        horizontalalignment="right",
    )

plt.suptitle("Anscombe's Quartet")
plt.show()

탐색적 시각화는 대개 빠르고 거칠며(quick and dirty), 유연하기도 합니다. 일부 탐색적 데이터 시각화는 자동화될 수 있으며, skimpy를 포함하여 이를 돕는 수많은 패키지가 있습니다.

본인과 공동 저자/협업자 외에는 탐색적 시각화를 보게 될 사람이 많지 않아야 합니다! 이들은 대개 빠르게 만들어지고, 수가 많으며, 일회용입니다. 이에 대해서는 탐색적 데이터 분석 (Exploratory Data Analysis) 에서 더 자세히 살펴보겠습니다.

과학적 데이터 시각화 (Scientific Data Viz)

두 번째 종류인 과학적 데이터 시각화는 탐색적 시각화의 정수입니다. 더 기술적인 논문에 포함할 법한 종류의 플롯이며, 천 마디 말보다 한 장의 그림이 더 많은 것을 말해줍니다. 저는 블랙홀의 첫 번째 이미지 (akiyama2019first를?) 이 분야의 전형적인 예로 생각하곤 합니다. 과학적 플롯에서는 정보 밀도가 높아도 괜찮으며, 짧은 형식의 저널에서는 그래야만 할 수도 있습니다. 8페이지 제한이 있는 Physical Review Letters 저널에는 거의 매 호마다 이 장르의 고전적인 예시들이 실립니다. 이러한 종류의 차트에서는 중요한 값들을 플롯에서 정확하게 읽어낼 수 있도록 보장하는 것이 특히 중요합니다. 또한 연구에서 결정적인 결과를 제시하는 플롯이 될 수도 있습니다. 차트를 업으로 하지 않는 사람들에게는 흥미롭지 않을 수도 있지만, 동료들에게는 흥미롭고, 그만큼 중요하게 이해 가능할 것입니다.

이 유형의 시각화는 공간이 부족한 NatureScience와 같은 대형 과학 저널에서 특히 인기가 많습니다. 매우 맞춤형으로 제작되는 경향이 있기 때문에 이 책에서는 다루지 않겠습니다.

서사적 데이터 시각화 (Narrative Data Viz)

세 번째이자 마지막 종류는 서사적 데이터 시각화입니다. 첫 번째 뷰에서 최종 결과물로 가는 단계에서 가장 많은 고민이 필요한 시각화입니다. 단순히 그림을 보여주는 것이 아니라 통찰력을 제공하는 시각화입니다. 이들은 Financial Times, The Economist, 또는 BBC News 웹사이트에서 볼 수 있는 종류의 시각화들입니다. 제작자가 시청자에게 강조하고 싶었던 측면에 집중할 수 있도록 돕는 보조 장치들이 함께 제공됩니다(이러한 보조 장치나 강조점들은 텍스트의 굵은 글씨가 하는 역할을 시각화에서 수행한다고 생각할 수 있습니다). 특정 서사를 전달하려고 할 때, 특히 소통하려는 사람들이 해당 주제에 대한 깊은 지식이 없을 때 작업에 활용할 가치가 충분히 있습니다. 넓은 독자층을 기대하는 논문이나, 작업을 요약한 블로그 포스트, 또는 정책 결정자를 위한 리포트 등에서 사용할 수 있습니다.

데이터 시각화를 통한 소통 주제에 대한 더 많은 정보는 소통을 위한 시각화 (Graphics for Communication) 장에서 찾을 수 있습니다.