본문으로 건너뛰기
Advertisement

데이터 시각화

Python의 3대 시각화 라이브러리 Matplotlib, Seaborn, Plotly를 실전 예제로 익힙니다.


설치

pip install matplotlib seaborn plotly

Matplotlib — 기초 그래프

import matplotlib.pyplot as plt
import numpy as np

# 기본 선 그래프
x = np.linspace(0, 2 * np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)

plt.figure(figsize=(10, 4))
plt.plot(x, y1, label="sin(x)", color="blue", linewidth=2)
plt.plot(x, y2, label="cos(x)", color="red", linestyle="--")
plt.xlabel("x")
plt.ylabel("y")
plt.title("삼각함수")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.savefig("trig.png", dpi=150)
plt.show()
# 여러 그래프 (subplot)
fig, axes = plt.subplots(2, 2, figsize=(12, 8))

# 산점도
axes[0, 0].scatter(x_data, y_data, alpha=0.6, c=colors, cmap="viridis")
axes[0, 0].set_title("산점도")

# 막대 그래프
categories = ["A", "B", "C", "D"]
values = [23, 45, 12, 67]
axes[0, 1].bar(categories, values, color="steelblue", edgecolor="black")
axes[0, 1].set_title("막대 그래프")

# 히스토그램
data = np.random.randn(1000)
axes[1, 0].hist(data, bins=30, color="skyblue", edgecolor="white")
axes[1, 0].set_title("히스토그램")

# 파이 차트
sizes = [30, 25, 20, 15, 10]
labels = ["Python", "JavaScript", "Java", "Go", "Rust"]
axes[1, 1].pie(sizes, labels=labels, autopct="%1.1f%%", startangle=90)
axes[1, 1].set_title("언어 점유율")

plt.tight_layout()
plt.show()

Seaborn — 통계 시각화

import seaborn as sns
import pandas as pd

# 기본 테마 설정
sns.set_theme(style="whitegrid", palette="muted")

# 샘플 데이터
tips = sns.load_dataset("tips") # 식당 팁 데이터
iris = sns.load_dataset("iris") # 붓꽃 데이터


# 1. boxplot — 분포와 이상치
plt.figure(figsize=(10, 5))
sns.boxplot(data=tips, x="day", y="total_bill", hue="sex")
plt.title("요일별 계산서 금액")
plt.show()


# 2. violinplot — 분포 형태까지 표현
sns.violinplot(data=tips, x="day", y="tip", hue="smoker", split=True)


# 3. heatmap — 상관관계 행렬
plt.figure(figsize=(8, 6))
corr = tips.select_dtypes(include="number").corr()
sns.heatmap(corr, annot=True, fmt=".2f", cmap="coolwarm", vmin=-1, vmax=1)
plt.title("상관관계 히트맵")
plt.show()


# 4. pairplot — 모든 변수 쌍의 관계
sns.pairplot(iris, hue="species", diag_kind="kde")
plt.show()


# 5. scatterplot + 회귀선
sns.lmplot(data=tips, x="total_bill", y="tip", hue="smoker",
col="time", height=5)


# 6. barplot (평균 + 신뢰구간)
sns.barplot(data=tips, x="day", y="total_bill", estimator="mean",
errorbar="ci", palette="Blues_d")


# 7. countplot (빈도)
sns.countplot(data=tips, x="day", order=["Thur", "Fri", "Sat", "Sun"])

Plotly — 인터랙티브 차트

import plotly.express as px
import plotly.graph_objects as go

# 샘플 데이터
df = px.data.gapminder()

# 1. 산점도 (버블 차트)
fig = px.scatter(
df[df.year == 2007],
x="gdpPercap",
y="lifeExp",
size="pop",
color="continent",
hover_name="country",
log_x=True,
title="2007 GDP vs 기대수명",
)
fig.show()


# 2. 선 그래프 (시계열)
korea = df[df.country == "Korea, Rep."]
fig = px.line(korea, x="year", y="gdpPercap", markers=True,
title="한국 GDP 변화")
fig.update_traces(line_width=3)
fig.show()


# 3. 막대 그래프
fig = px.bar(
df[df.year == 2007].nlargest(10, "pop"),
x="country", y="pop",
color="continent",
title="인구 상위 10개국",
)
fig.show()


# 4. 애니메이션 (시간 변화)
fig = px.scatter(
df,
x="gdpPercap", y="lifeExp",
size="pop", color="continent",
animation_frame="year",
animation_group="country",
range_x=[100, 100000], range_y=[20, 90],
log_x=True,
title="연도별 GDP vs 기대수명 변화",
)
fig.show()


# 5. Graph Objects — 세밀한 제어
fig = go.Figure()
fig.add_trace(go.Scatter(x=[1, 2, 3], y=[4, 5, 6], mode="lines+markers", name="데이터1"))
fig.add_trace(go.Bar(x=["A", "B", "C"], y=[10, 20, 15], name="데이터2"))
fig.update_layout(
title="복합 차트",
xaxis_title="X축",
yaxis_title="Y축",
template="plotly_white",
)
fig.show()

차트 저장

# Matplotlib
plt.savefig("chart.png", dpi=300, bbox_inches="tight")
plt.savefig("chart.pdf") # 벡터 형식

# Plotly
fig.write_html("chart.html") # 인터랙티브 HTML
fig.write_image("chart.png") # 정적 이미지 (kaleido 필요)
# pip install kaleido

라이브러리 선택 가이드

Matplotlib
✅ 완전한 제어가 필요할 때
✅ 논문/보고서 수준 품질
✅ 커스텀 차트 구현
❌ 코드량이 많음

Seaborn
✅ 통계적 시각화 (분포, 관계, 카테고리)
✅ pandas DataFrame과 완벽 호환
✅ 최소 코드로 예쁜 차트
❌ 인터랙티브 기능 없음

Plotly
✅ 웹 대시보드, 인터랙티브 탐색
✅ 애니메이션, 3D 차트
✅ Dash와 연동하여 웹앱 구축
❌ 파일 크기가 큼

정리

라이브러리강점주요 차트
Matplotlib세밀한 제어선/막대/산점도/파이
Seaborn통계 시각화boxplot/heatmap/pairplot
Plotly인터랙티브버블/애니메이션/3D

데이터 탐색은 Seaborn, 최종 발표는 Plotly, 논문/보고서는 Matplotlib이 적합합니다.

Advertisement