본문 바로가기
두두 IT/파이썬

[PYTHON 시각화] Pandas 내장 시각화

by DoDo's 2026. 5. 7.
반응형

📊 [파이썬 시각화 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()을 붙이는 패턴이 아주 강력합니다.

Python
 
# 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)

Python
 
tips['day'].value_counts().plot(kind='pie', autopct="%d%%", explode=[0.1, 0, 0, 0], shadow=True)
  • Matplotlib에서 배웠던 autopct(퍼센트 표시), explode(조각 분리), shadow(그림자) 옵션을 판다스 .plot() 괄호 안에도 똑같이 쓸 수 있습니다.

③ 히스토그램(hist)과 밀도 그래프(kde)

Python
 
# 히스토그램: 구간(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())를 색깔의 농도로 보여주면 엄청 멋진 시각화가 됩니다.

Python
 
# 숫자형 데이터들의 상관계수 표 만들기
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)들을 섞어서 써야 완성됩니다.

Python
 
# 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() 기능을 이용해 지시사항에 맞는 그래프를 그려보세요!

(준비물) 아래 코드를 복사해서 실행해 주세요.

Python
 
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%%')가 나오는 파이 차트를 한 줄의 코드로 작성해 보세요.

💡 [정답 확인란]

직접 고민해서 코드를 짜보신 후 정답과 비교해 보세요!

Python
 
# [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()
반응형