Matplotlib / Seaborn — 데이터 시각화
선 그래프, 막대 그래프, 히트맵, 페어플롯으로 데이터 분포와 상관관계를 파악하고 AI 모델의 학습 곡선을 읽는 법 정리
2026.04.10
0. 시리즈
| 편 | 제목 | 역할 |
|---|---|---|
| 1편 | NumPy 완벽 정리 — 숫자 배열 다루기 | 데이터 기초 |
| 2편 | Pandas 완벽 정리 — 데이터 불러오고 정리하기 | 데이터 전처리 |
| 3편⬅️ | Matplotlib / Seaborn — 데이터 시각화 | 시각화 |
| 4편 | Scikit-learn — 머신러닝 실습 입문 | ML 실습 |
| 5편 | TensorFlow / Keras — 딥러닝 모델 만들기 | DL 실습 |
| 6편 | PyTorch 입문 — Keras와 무엇이 다를까? | DL 심화 |
1. 시각화 도구 소개
1-1. Matplotlib이란?
Matplotlib 은 Python에서 가장 기본이 되는 시각화 라이브러리입니다. 선 그래프, 막대 그래프, 산점도 등 거의 모든 종류의 그래프를 그릴 수 있으며, 다른 시각화 라이브러리들의 기반이 됩니다.
bashpip install matplotlib
pythonimport matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams["font.family"] = "Malgun Gothic" # 한글 폰트 설정 (Windows)
matplotlib.rcParams["axes.unicode_minus"] = False # 마이너스 기호 깨짐 방지
💡 Google Colab은 기본 설치되어 있고, 한글 폰트는 별도 설정 필요합니다.
1-2. Seaborn이란?
Seaborn 은 Matplotlib을 기반으로 만들어진 통계 시각화 라이브러리입니다. 코드가 훨씬 짧고, 기본 디자인이 더 세련되며, Pandas DataFrame을 직접 입력으로 받습니다.
bashpip install seaborn
pythonimport seaborn as sns
1-3. Matplotlib vs Seaborn 비교
| 비교 항목 | Matplotlib | Seaborn |
|---|---|---|
| 코드 길이 | 길다 | 짧다 |
| 기본 디자인 | 단순 | 세련됨 |
| DataFrame 지원 | 간접 지원 | 직접 지원 |
| 커스터마이징 | 자유도 높음 | 비교적 제한적 |
| 주 용도 | 기본 그래프 | 통계 분석 그래프 |
💡 실무에서는 두 가지를 함께 씁니다. Seaborn으로 빠르게 그리고, 세부 조정은 Matplotlib으로 합니다.
2. Matplotlib 기본 사용법
2-1. 그래프의 기본 구조
pythonimport matplotlib.pyplot as plt
fig, ax = plt.subplots() # fig: 도화지 전체, ax: 그래프 영역
ax.plot([1, 2, 3], [4, 5, 6])
plt.show()
- fig (Figure) — 전체 도화지
- ax (Axes) — 실제 그래프가 그려지는 영역
- 그래프 여러 개를 한 번에 그릴 때 ax를 여러 개 만듭니다
2-2. 선 그래프 (Line Plot)
시간에 따른 변화, 연속적인 데이터에 적합합니다.
pythonx = [1, 2, 3, 4, 5]
y = [10, 25, 18, 40, 35]
plt.plot(x, y,
color="blue",
linewidth=2,
linestyle="--",
marker="o",
label="점수 추이")
plt.title("월별 점수 변화")
plt.xlabel("월")
plt.ylabel("점수")
plt.legend()
plt.grid(True)
plt.show()
2-3. 막대 그래프 (Bar Chart)
카테고리별 비교에 적합합니다.
pythoncategories = ["공학", "경영", "디자인", "의학"]
values = [85, 72, 91, 88]
plt.bar(categories, values,
color=["skyblue", "salmon", "lightgreen", "gold"],
edgecolor="black",
width=0.6)
plt.title("학과별 평균 점수")
plt.ylabel("점수")
for i, v in enumerate(values):
plt.text(i, v + 1, str(v), ha="center", fontsize=11)
plt.show()
2-4. 산점도 (Scatter Plot)
두 변수 사이의 관계(상관관계) 파악에 적합합니다.
pythonimport numpy as np
x = np.random.randn(100)
y = x * 2 + np.random.randn(100)
plt.scatter(x, y, alpha=0.5, color="purple", s=50)
plt.title("공부시간 vs 점수")
plt.xlabel("공부시간")
plt.ylabel("점수")
plt.show()
2-5. 히스토그램 (Histogram)
데이터의 분포를 파악할 때 사용합니다. AI에서 데이터 편향 여부 확인에 자주 씁니다.
pythondata = np.random.normal(70, 10, 500)
plt.hist(data, bins=20, color="steelblue", edgecolor="white")
plt.title("점수 분포")
plt.xlabel("점수")
plt.ylabel("빈도")
plt.show()
2-6. 여러 그래프 한 번에 그리기 (subplot)
pythonfig, axes = plt.subplots(1, 2, figsize=(12, 4))
axes[0].plot([1, 2, 3], [4, 5, 6])
axes[0].set_title("선 그래프")
axes[1].bar(["A", "B", "C"], [3, 7, 5])
axes[1].set_title("막대 그래프")
plt.tight_layout()
plt.show()
3. Seaborn 기본 사용법
3-1. 샘플 데이터셋 불러오기
Seaborn은 연습용 데이터셋을 내장하고 있습니다.
pythonimport seaborn as sns
iris = sns.load_dataset("iris")
print(iris.head())
# sepal_length sepal_width petal_length petal_width species
# 0 5.1 3.5 1.4 0.2 setosa
3-2. 분포도 (histplot / kdeplot)
pythonsns.histplot(iris["sepal_length"], kde=True, color="steelblue")
plt.title("꽃받침 길이 분포")
plt.show()
sns.kdeplot(iris["sepal_length"], fill=True)
plt.show()
3-3. 산점도 (scatterplot)
pythonsns.scatterplot(data=iris,
x="sepal_length",
y="petal_length",
hue="species",
style="species",
s=80)
plt.title("꽃받침 길이 vs 꽃잎 길이")
plt.show()
💡
hue옵션 하나로 카테고리별 색상 구분이 자동으로 됩니다. Matplotlib에서는 직접 구현해야 합니다.
3-4. 박스플롯 (boxplot)
데이터의 분포, 중앙값, 이상값을 한눈에 보여줍니다.
pythonsns.boxplot(data=iris, x="species", y="petal_length", palette="Set2")
plt.title("품종별 꽃잎 길이 분포")
plt.show()
박스플롯 읽는 법:
━━━━━━━━━━━━━━━━━━━━
─── 최댓값 (이상값 제외)
┌─┐
│ │ 75% 지점 (Q3)
│─│ 중앙값 (50%)
│ │ 25% 지점 (Q1)
└─┘
─── 최솟값 (이상값 제외)
● 이상값 (outlier)
━━━━━━━━━━━━━━━━━━━━
3-5. 히트맵 (heatmap) — 상관관계 분석
AI에서 어떤 변수가 서로 관련 있는지 파악할 때 핵심 도구입니다.
pythoncorr = iris.drop(columns=["species"]).corr()
sns.heatmap(corr, annot=True, fmt=".2f", cmap="coolwarm", vmin=-1, vmax=1)
plt.title("변수 간 상관관계")
plt.show()
- 1에 가까울수록 양의 상관관계 (한 쪽이 오르면 다른 쪽도 오름)
- -1에 가까울수록 음의 상관관계 (한 쪽이 오르면 다른 쪽은 내려감)
- 0에 가까울수록 관계 없음
3-6. 페어플롯 (pairplot) — 전체 변수 한 번에 보기
pythonsns.pairplot(iris, hue="species", diag_kind="kde")
plt.show()
모든 변수 조합의 산점도를 한 번에 그려줍니다. 데이터를 처음 받았을 때 전체 파악용으로 매우 유용합니다.
4. AI와의 연결
4-1. 학습 곡선 시각화 — 모델이 잘 학습되고 있나?
딥러닝 모델을 학습할 때 에폭(epoch)마다 손실(loss)과 정확도(accuracy)를 그래프로 확인합니다.
pythonepochs = range(1, 21)
train_loss = [0.9, 0.75, 0.6, 0.5, 0.42, 0.36, 0.31, 0.27, 0.24, 0.22,
0.20, 0.18, 0.17, 0.16, 0.15, 0.14, 0.13, 0.13, 0.12, 0.12]
val_loss = [0.95, 0.80, 0.66, 0.58, 0.52, 0.48, 0.46, 0.45, 0.44, 0.44,
0.45, 0.47, 0.49, 0.51, 0.53, 0.55, 0.57, 0.59, 0.61, 0.63]
plt.plot(epochs, train_loss, label="학습 손실", color="blue")
plt.plot(epochs, val_loss, label="검증 손실", color="red", linestyle="--")
plt.axvline(x=10, color="gray", linestyle=":", label="과적합 시작")
plt.title("학습 곡선")
plt.xlabel("에폭")
plt.ylabel("손실")
plt.legend()
plt.grid(True)
plt.show()
💡 검증 손실이 다시 올라가는 지점 = 과적합(Overfitting) 시작점. 이 그래프로 모델 학습을 언제 멈춰야 하는지 판단합니다.
4-2. 이상값(Outlier) 탐지
AI 모델은 이상값에 민감합니다. 학습 전 반드시 시각화로 확인합니다.
pythonimport pandas as pd
import numpy as np
data = pd.DataFrame({"점수": [72, 85, 78, 91, 69, 200, 83, 76, 88, 74]})
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
axes[0].hist(data["점수"], bins=10, color="skyblue", edgecolor="black")
axes[0].set_title("점수 분포 (이상값 포함)")
axes[1].boxplot(data["점수"])
axes[1].set_title("박스플롯 (● = 이상값)")
plt.tight_layout()
plt.show()
5. 마무리
5-1. 오늘 배운 것 한눈에 정리
| 도구 | 그래프 종류 | 주요 용도 |
|---|---|---|
| Matplotlib | 선, 막대, 산점도, 히스토그램 | 기본 그래프, 세밀한 커스터마이징 |
| Seaborn | 분포도, 박스플롯, 히트맵, 페어플롯 | 통계 분석, 빠른 탐색 |
| 둘 다 | 학습 곡선, 이상값 탐지 | AI 모델 분석 |