파이썬 pandas 데이터 분석 입문 · 8장
matplotlib 시각화와 탐색적 데이터 분석(EDA)
한글 글꼴 설정, plot으로 선·막대 그래프, pct_change, corr, 미니 EDA 실습
숫자 표만으로는 흐름이 잘 보이지 않습니다. 마지막 장에서는 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 — 정리한 데이터로 머신러닝 모델 만들기