📊 [파이썬 시각화 3탄] 코드 한 줄로 끝! Pandas 내장 시각화 완벽 가이드
Matplotlib으로 도화지를 만들고, X축 Y축 데이터를 일일이 지정해 주는 과정이 조금 번거로우셨나요? 그렇다면 아주 기쁜 소식이 있습니다!
우리가 데이터를 다룰 때 매일 사용하는 Pandas(판다스) 안에는 이미 Matplotlib이 내장되어 있어서, 단 한 줄의 코드만으로 표(DataFrame)를 뚝딱 그래프로 바꿀 수 있습니다. 데이터프레임의 index가 자동으로 X축 이름표가 되고, column들이 알아서 범례(Legend)와 Y축이 되는 판다스 시각화의 마법! 교재에 나온 핵심 기능들을 블로그 스타일로 완벽하게 씹어먹어 봅시다. 🚀
🔑 1. 마법의 주문: plot(kind="???")
판다스 데이터프레임이나 시리즈 뒤에 .plot()을 붙이기만 하면 바로 그래프가 그려집니다. 이때 kind라는 옵션에 어떤 단어를 넣느냐에 따라 그래프의 모양이 자유자재로 변신합니다!
| kind 옵션 | 그래프 종류 | 언제 사용할까? |
| 'line' | 선 그래프 (기본값) | 시간에 따른 데이터의 변화, 추세를 볼 때 |
| 'bar' / 'barh' | 수직 / 수평 막대그래프 | 카테고리별 수량을 비교할 때 |
| 'hist' | 히스토그램 | 데이터가 어느 구간에 많이 몰려있는지 분포를 볼 때 |
| 'box' | 상자그래프(Boxplot) | 데이터의 중심, 퍼짐 정도, 이상치를 확인할 때 |
| 'kde' | 밀도 그래프 (선) | 히스토그램을 부드러운 곡선으로 연결해 보고 싶을 때 |
| 'pie' | 파이 차트 | 전체 중 각 항목이 차지하는 비율(%)을 볼 때 |
| 'scatter' | 산점도 (점 그래프) | 두 수치형 데이터 간의 상관관계를 볼 때 |
(💡 꿀팁: df.plot(kind='bar') 대신 df.plot.bar() 처럼 직접 함수 형태로 써도 완벽하게 똑같이 작동합니다!)
🎨 2. 그래프별 실전 활용법 및 옵션 파헤치기
① 막대그래프 (bar, barh)와 누적 막대(stacked)
가장 많이 쓰이는 막대그래프입니다. 판다스의 value_counts()나 pivot_table()로 데이터를 요약한 뒤 바로 뒤에 .plot()을 붙이는 패턴이 아주 강력합니다.
# 1. 성별 고객 수 세고 바로 막대그래프 그리기 (rot=0은 X축 글자 수평으로 눕히기)
tips['sex'].value_counts().plot(kind='bar', rot=0)
# 2. 피벗테이블 누적 막대그래프 (stacked=True) 🌟실무 빈도 100%
result = tips.pivot_table(index="smoker", columns='day', values='total_bill', aggfunc="sum")
result.plot(kind='bar', stacked=True)
- stacked=True: 이 옵션을 켜면 각각 분리되어 있던 막대가 하나의 막대 위로 층층이 쌓입니다. "전체 매출 중 요일별 비율"을 한눈에 볼 때 엄청나게 유용하죠!
② 파이 차트 (pie)
tips['day'].value_counts().plot(kind='pie', autopct="%d%%", explode=[0.1, 0, 0, 0], shadow=True)
- Matplotlib에서 배웠던 autopct(퍼센트 표시), explode(조각 분리), shadow(그림자) 옵션을 판다스 .plot() 괄호 안에도 똑같이 쓸 수 있습니다.
③ 히스토그램(hist)과 밀도 그래프(kde)
# 히스토그램: 구간(bins)을 15개로 나누고 테두리를 검정색('k')으로!
tips['total_bill'].plot(kind="hist", bins=15, edgecolor="k")
# 밀도 그래프 (KDE - Kernel Density Estimation)
tips['total_bill'].plot(kind="kde")
- KDE란? 히스토그램의 각진 막대들을 부드러운 산봉우리(곡선) 형태로 깎아놓은 그래프입니다. 데이터의 연속적인 분포 형태를 볼 때 아주 세련되어 보입니다. (※ 주의: scipy라는 라이브러리가 설치되어 있어야 작동합니다. pip install scipy)
④ 상관관계 시각화 (히트맵 흉내내기: imshow)
산점도(scatter)로 두 변수의 관계를 볼 수도 있지만, 데이터프레임의 모든 컬럼 간 상관계수(corr())를 색깔의 농도로 보여주면 엄청 멋진 시각화가 됩니다.
# 숫자형 데이터들의 상관계수 표 만들기
v = dia.select_dtypes(include="number").corr()
# 상관계수 표를 이미지(색상 맵) 형태로 출력!
plt.imshow(v, cmap="Blues") # 파란색 톤으로 진하고 연함을 표현
plt.colorbar() # 옆에 색상별 수치 가이드라인 바 붙이기
plt.show()
⑤ 선 그래프(line)와 행/열 뒤집기 (T - Transpose)
데이터프레임을 그대로 선 그래프로 그리면, 컬럼(열)들이 각각 하나의 꺾은선이 되고 인덱스(행)가 X축으로 들어갑니다.
만약 내가 X축에 놓고 싶은 데이터가 컬럼(열) 쪽 이름으로 가 있다면 어떻게 할까요?
- 해결책: df.T (Transpose) 를 사용해 표를 가로세로를 눕혀버린 다음 .plot()을 하면 완벽하게 해결됩니다! (교재의 강수량 비교 데이터 예시가 바로 이 스킬입니다.)
🤝 3. Pandas와 Matplotlib의 환상적인 콜라보
판다스 .plot()은 그래프를 쉽게 '그려만' 줍니다. 세세한 꾸미기(제목 달기, X/Y축 이름 달기, 범례 위치 옮기기 등)는 Matplotlib의 함수(plt.xxx)들을 섞어서 써야 완성됩니다.
# 1. 판다스로 쉽게 그리기
df.plot(figsize=(15,4))
# 2. 맷플롯립으로 디테일 살리기
plt.title("강수량 비교")
# 범례(Legend) 박스를 그래프 바깥(1, 1 위치)으로 밀어내기
plt.legend(bbox_to_anchor=(1,1), loc="upper left", title="년도", ncols=3)
plt.show()
💻 [실습 TODO] Pandas 한 줄 코딩으로 그래프 마스터하기!
주피터 노트북 빈 셀을 열고 아래의 가상 데이터프레임을 생성한 뒤, 판다스 .plot() 기능을 이용해 지시사항에 맞는 그래프를 그려보세요!
(준비물) 아래 코드를 복사해서 실행해 주세요.
import pandas as pd
import matplotlib.pyplot as plt
# 한글 폰트 설정
plt.rcParams['font.family'] = 'Malgun Gothic'
# 가상의 과일 가게 요일별 판매량 데이터프레임
data = {
'사과': [50, 60, 45, 80, 100, 120, 110],
'바나나': [30, 40, 50, 40, 60, 80, 90],
'포도': [20, 25, 15, 30, 40, 50, 45]
}
index = ['월', '화', '수', '목', '금', '토', '일']
df = pd.DataFrame(data, index=index)
- TODO 1 (선 그래프): df 전체를 이용하여 요일별 3가지 과일의 판매량 변화를 보여주는 선 그래프를 그리세요. (크기 figsize=(10, 4), 마커 marker='o')
- TODO 2 (막대그래프): df를 이용하여 각 요일별 판매량을 '누적 수직 막대그래프(stacked bar)' 형태로 그리세요. X축 요일 글자가 눕지 않게 rot=0을 줍니다.
- TODO 3 (KDE 분포): '사과' 컬럼(df['사과']) 데이터의 분포를 밀도 그래프(KDE)로 그려보세요.
- TODO 4 (산점도): '사과'의 판매량이 높을 때 '바나나'의 판매량도 높은지 확인하려고 합니다. X축을 '사과', Y축을 '바나나'로 하는 산점도를 그리세요.
- TODO 5 (파이 차트): 요일과 상관없이, 이 가게의 일주일 총 과일별 판매량 비율을 파이 차트로 그리고 싶습니다. 먼저 df.sum()을 이용해 과일별 총합을 구한 뒤, 퍼센트(autopct='%d%%')가 나오는 파이 차트를 한 줄의 코드로 작성해 보세요.
💡 [정답 확인란]
직접 고민해서 코드를 짜보신 후 정답과 비교해 보세요!
# [TODO 1] 선 그래프 (여러 컬럼 동시에 그리기)
df.plot(kind='line', figsize=(10, 4), marker='o')
plt.title('요일별 과일 판매량 추이')
plt.show()
# [TODO 2] 누적 막대그래프
df.plot(kind='bar', stacked=True, rot=0, figsize=(8, 5))
plt.title('요일별 과일 누적 판매량')
plt.show()
# [TODO 3] 밀도 그래프 (KDE)
df['사과'].plot(kind='kde')
plt.title('사과 판매량 밀도 분포')
plt.show()
# [TODO 4] 산점도
df.plot(kind='scatter', x='사과', y='바나나', color='red', s=50) # s는 점의 크기
plt.title('사과 vs 바나나 판매량 상관관계')
plt.show()
# [TODO 5] 데이터 집계 후 파이 차트 그리기
df.sum().plot(kind='pie', autopct='%d%%', figsize=(5, 5), shadow=True)
plt.title('일주일 과일별 총 판매량 비율')
plt.ylabel('') # Y축 글자 지우기 (파이차트가 깔끔해짐)
plt.show()
'두두 IT > 파이썬' 카테고리의 다른 글
| [PYTHON] 파이썬 데이터 분석 기초 Numpy (0) | 2026.05.08 |
|---|---|
| [PYTHON] 시각화 3가지 방식 비교 (1) | 2026.05.08 |
| [PYTHON 시각화] Matplotlib 주요그래프 (1) | 2026.05.07 |
| [PYTHON 시각화] Matplotlib 개요 (0) | 2026.05.07 |
| [PYTHON-Pandas 04-01]데이터프레임 합치기 (concat, join, merge) (0) | 2026.05.06 |