Matplotlib / Seaborn — 데이터 시각화

선 그래프, 막대 그래프, 히트맵, 페어플롯으로 데이터 분포와 상관관계를 파악하고 AI 모델의 학습 곡선을 읽는 법 정리

2026.04.10

MatplotlibSeabornvisualizationheatmapboxplotpairplotlearning curvePython

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 비교

비교 항목MatplotlibSeaborn
코드 길이길다짧다
기본 디자인단순세련됨
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 모델 분석