Skip to content

Matplotlib 기본 시각화


학습 목표

  1. Matplotlib과 Pandas의 plot 기능 관계를 이해한다
  2. 한글 폰트 설정 방법을 익힌다
  3. 선 그래프(line), 막대 그래프(bar), 히스토그램(hist)을 그릴 수 있다
  4. figure 크기, 라벨 회전, 정렬 등 그래프 커스터마이징을 할 수 있다
  5. 박스 플롯(box)으로 5가지 요약 수치를 시각화할 수 있다

전체 구조


1. 한글 폰트 설정

Matplotlib은 기본 폰트로 한글을 지원하지 않아, 한글이 깨져서 표시된다.

python
import matplotlib.pyplot as plt

# macOS
plt.rc("font", family="AppleGothic")

# Windows
# plt.rc("font", family="Malgun Gothic")

# 마이너스 기호 깨짐 방지
plt.rc("axes", unicode_minus=False)

# 그래프 선명도 향상 (Jupyter Notebook)
from IPython.display import set_matplotlib_formats
set_matplotlib_formats("retina")

2. Pandas 내장 plot 기능

Pandas의 DataFrame과 Series에는 Matplotlib 기반의 plot 메서드가 내장되어 있다.

선 그래프 (기본값)

python
# groupby로 연산 후 바로 시각화
g = df_last.groupby("지역명")["평당분양가격"].mean()

# 기본 plot → 선 그래프
g.plot()

막대 그래프

python
# 방법 1: kind 옵션
g.plot(kind="bar")

# 방법 2: plot.bar() 직접 호출
g.plot.bar()

# 가로 막대 그래프
g.plot.barh()

그래프 커스터마이징

python
# 정렬 + 크기 + 라벨 회전
g.sort_values(ascending=False).plot.bar(
    rot=0,               # x축 라벨 회전 (0: 가로)
    figsize=(10, 3)      # 그래프 크기 (너비, 높이)
)

3. 히스토그램

히스토그램은 수치형 데이터의 빈도 분포를 보여준다.

python
# 전체 수치 데이터의 히스토그램
df_last.hist()

# 특정 컬럼만
df_last["평당분양가격"].hist()

# bins 조정 (구간 개수)
df_last["평당분양가격"].hist(bins=30)

bins(비닝, Bucketing): 수치 데이터를 카테고리 형태로 나누는 작업이다. bins 값이 클수록 그래프가 세밀해지고, 작을수록 뭉뚝해진다.


4. 박스 플롯 (Box Plot)

박스 플롯은 5가지 요약 수치(Five-Number Summary)를 시각화한다.

python
# 피벗 테이블 + 박스 플롯
t = df_last.pivot_table(
    index="월",
    columns="연도",
    values="평당분양가격"
)
t.plot.box(figsize=(10, 3))

박스 플롯 구성 요소

이상치(Outlier) 판별 기준

IQR(Inter-Quartile Range)은 Q3 - Q1 값이다.

  • 상한 이상치: Q3 + 1.5 x IQR 초과
  • 하한 이상치: Q1 - 1.5 x IQR 미만
python
# IQR 계산 예시
Q1 = df["평당분양가격"].quantile(0.25)
Q3 = df["평당분양가격"].quantile(0.75)
IQR = Q3 - Q1

# 이상치 범위
upper_bound = Q3 + 1.5 * IQR
lower_bound = Q1 - 1.5 * IQR

print(f"이상치 상한: {upper_bound}")
print(f"이상치 하한: {lower_bound}")

5. 피벗 테이블과 시각화 조합

python
# 연도별 + 월별 피벗 테이블
t = df_last.pivot_table(
    index="월",
    columns="연도",
    values="평당분양가격"
)

# 선 그래프 → 연도별 추세
t.plot(figsize=(10, 3))

# 막대 그래프 → 월별 비교
t.plot.bar(figsize=(15, 3), rot=30)

# 박스 플롯 → 연도별 분포
t.plot.box(figsize=(10, 3))

그래프 유형 선택 가이드


6. 연도별 추세 시각화 예시

python
# 연도별 평균 분양가격 선 그래프
df_last.groupby("연도")["평당분양가격"].mean().plot()
plt.title("연도별 전국 평균 평당 분양가격")
plt.ylabel("평당분양가격 (천원)")
plt.xlabel("연도")
python
# 지역별 평균 분양가격 막대 그래프 (정렬)
g = df_last.groupby("지역명")["평당분양가격"].mean()
g.sort_values(ascending=False).plot.bar(
    rot=0,
    figsize=(12, 4),
    color="steelblue"
)
plt.title("지역별 평균 평당 분양가격")
plt.ylabel("평당분양가격 (천원)")

핵심 정리

  • Pandas의 plot은 Matplotlib 기반이므로, plt.rc로 한글 폰트를 설정해야 한다
  • 기본 plot()선 그래프, plot.bar()막대 그래프를 그린다
  • figsize로 크기, rot으로 라벨 회전, sort_values로 정렬 후 시각화한다
  • 히스토그램은 수치 데이터의 빈도 분포, 박스 플롯은 5가지 요약 수치를 보여준다
  • 박스 플롯의 이상치는 IQR x 1.5 범위를 벗어나는 값이다
  • groupby/pivot_table 결과에 바로 .plot()을 체이닝하여 빠르게 시각화한다