8 / 8

파이썬 pandas 데이터 분석 입문 · 8장

matplotlib 시각화와 탐색적 데이터 분석(EDA)

한글 글꼴 설정, plot으로 선·막대 그래프, pct_change, corr, 미니 EDA 실습

4분 읽기

숫자 표만으로는 흐름이 잘 보이지 않습니다. 마지막 장에서는 pandas와 matplotlib으로 그래프를 그리고, 지금까지 배운 것을 묶어 탐색적 데이터 분석(EDA) 을 처음부터 끝까지 해 봅니다.

그래프 준비 — 한글 글꼴 설정

matplotlib은 기본 글꼴에 한글이 없어 글자가 네모로 깨집니다. 그래프를 그리기 전에 한 번 설정합니다.

Pythonimport matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'Malgun Gothic'   # macOS는 'AppleGothic'
plt.rcParams['axes.unicode_minus'] = False       # 음수 기호 깨짐 방지

Google Colab에서는 나눔 글꼴을 설치한 뒤 'NanumGothic'으로 지정합니다.

pandas로 바로 그리기 — plot

DataFrame과 Series에는 plot 메서드가 있어 한 줄로 그래프를 그릴 수 있습니다.

Pythondaily = sales.groupby('date')['revenue'].sum()
daily.plot(kind='line', marker='o', title='일별 매출')
plt.show()

daily의 값은 다음과 같습니다. 3월 2일을 정점으로 매출이 줄어드는 흐름이 선 그래프로 보입니다.

결과date
2026-03-01    195000
2026-03-02    202500
2026-03-03    171500
2026-03-04    133500
Name: revenue, dtype: int64
질문그래프코드
시간에 따라 어떻게 변하나선kind='line'
그룹끼리 크기 비교막대kind='bar'
값이 어떻게 퍼져 있나히스토그램kind='hist'
두 숫자의 관계산점도kind='scatter', x=..., y=...

매장·메뉴별 매출을 막대그래프로 비교하려면 6장의 피벗 테이블을 그대로 그리면 됩니다.

Pythonpivot = sales.pivot_table(index='store', columns='menu', values='revenue', aggfunc='sum')
pivot.plot(kind='bar', rot=0, title='매장별 메뉴 매출')
plt.show()

변화량과 누적값

Pythondaily.pct_change().round(3)   # 전날 대비 증감률
결과date
2026-03-01      NaN
2026-03-02    0.038
2026-03-03   -0.153
2026-03-04   -0.222
Name: revenue, dtype: float64

3월 3일에는 전날보다 15.3%, 4일에는 22.2% 줄었습니다. daily.cumsum()을 쓰면 누적 매출(702,500원까지)을 볼 수 있습니다.

상관관계 보기 — corr

Pythonsales[['qty', 'price', 'revenue']].corr().round(2)
결과          qty  price  revenue
qty      1.00  -0.86     1.00
price   -0.86   1.00    -0.82
revenue  1.00  -0.82     1.00

이 데이터에서는 가격이 높은 메뉴(케이크)일수록 판매 수량이 적어 qty와 price의 상관계수가 -0.86입니다. 매출은 거의 수량에 따라 움직입니다.

처음부터 끝까지 — 미니 EDA

지금까지 배운 함수만으로 "어느 매장에 어떤 메뉴를 더 준비해야 할까?"에 답해 봅니다.

Pythonimport io
import pandas as pd

# 1. 읽기 (3장)
df = pd.read_csv(io.StringIO(csv_text))

# 2. 정리하기 (5장)
df = df.drop_duplicates()
df['qty'] = df['qty'].fillna(df['qty'].median()).astype(int)
df['date'] = pd.to_datetime(df['date'])
df['revenue'] = df['qty'] * df['price']

# 3. 요약하기 (6장)
summary = df.pivot_table(index='store', columns='menu', values='qty', aggfunc='sum')
print(summary)

# 4. 시각화 (8장)
summary.plot(kind='bar', rot=0, title='매장별 메뉴 판매 수량')

결론을 한두 문장으로 적는 것까지가 분석입니다. 예를 들어 "강남은 아메리카노 수요가 가장 크고, 홍대는 라떼가 꾸준하다. 케이크는 두 매장 모두 판매량이 적어 재고를 줄일 만하다"처럼 정리합니다.

다음으로 공부할 것

  • pandas 100제 — 이 책에서 배운 문법을 연습문제 100개로 다시 풀어 보기
  • numpy — pandas 아래에서 돌아가는 배열 계산
  • seaborn — 통계 그래프를 더 쉽게 그리는 시각화 라이브러리
  • scikit-learn — 정리한 데이터로 머신러닝 모델 만들기

전체 메뉴