반응형
요즘 데이터는 넘쳐나는데, 그걸 '이야기'로 풀어내는 사람은 생각보다 드뭅니다. 숫자만 던지는 시대는 갔어요.
이제는 데이터를 통해 세상을 이해시키는 능력이 훨씬 중요합니다. 🌎 하지만 대부분의 데이터 시각화 도구(matplotlib, seaborn, plotly 등)는 그래프는 쉽게 그리지만, 스토리는 직접 작성해야 합니다. 🥲
오늘은 Python의 seaborn 패키지에 내장된 식당 팁 데이터셋(tips)을 이용해서
pynarrative로 "데이터 → 그래프 → 스토리"를 만드는 방법을 소개할게요! 🚀
📚 Pynarrative란 무엇인가요?
pynarrative는
- pandas 데이터프레임 📊
- Altair 그래프 🧩
이 두 가지를 기반으로
👉 자동으로 '읽기 쉬운 이야기'를 생성해주는 도구입니다.
필요한 건 간단해요:
- x/y축에 뭘 보여줄지
- 어떤 흐름을 강조할지
- 스토리의 목적이 무엇인지
딱 이 정도만 설정하면, pynarrative가 나머지를 알아서 처리해줍니다. 😎
설치도 한 줄이면 끝!
!pip install pynarrative altair pandas seaborn
📚 데이터셋 소개: tips (식당 팁 데이터)
seaborn 라이브러리에 내장되어 있는 tips 데이터는 이런 컬럼들로 되어있어요:
칼럼 | 설명 |
total_bill | 총 식사 금액 |
tip | 팁 금액 |
sex | 손님 성별 |
smoker | 흡연 여부 |
day | 요일 (Thu/Fri/Sat/Sun) |
time | 시간대 (Lunch/Dinner) |
size | 일행 인원 수 |
import seaborn as sns
import pandas as pd
# 데이터 불러오기
tips = sns.load_dataset('tips')
print(tips.head())
✨ 첫 번째 스토리: 총 식사 금액 vs 팁 금액
목표:
"식사 금액이 높을수록 팁을 많이 줄까?"를 스토리로 보여주기
import altair as alt
import pynarrative as pn
# Altair 그래프 그리기
chart = alt.Chart(tips).mark_point().encode(
x='total_bill:Q',
y='tip:Q'
).properties(
width=600,
height=400,
title='총 식사 금액 vs 팁 금액'
)
# Pynarrative 스토리 만들기
story_chart = pn.Story(tips).mark_point().encode(
x=alt.X("total_bill:Q"),
y="tip:Q"
).add_title(
"비싼 식사 = 높은 팁? 🤔",
"식사비와 팁 사이의 관계",
title_color="#1a1a1a",
subtitle_color="#4a4a4a"
).add_context(
text=[
"전반적으로 식사 금액이 클수록 팁 금액도 높아지는 경향이 보입니다.",
"하지만 반드시 정비례하지는 않고, 약간의 편차가 존재합니다."
],
position="left",
dx=-100,
color="black"
).render()
story_chart
그래프 + "비싼 식사 = 높은 팁인가?" 해석까지 자동 생성 완료! 🎉
(흥미로운 건, 식사비가 비싸도 가끔 팁이 적은 경우도 있다는 것!)
🧭 두 번째 스토리: 요일별 팁 비교
목표:
"요일에 따라 팁 문화가 다를까?"를 스토리로 풀어내기
# 흡연자/비흡연자 그룹 나누기
smoker_avg = tips.groupby('smoker')['tip'].mean().reset_index()
# 스토리 + 주석 추가
story_chart = pn.Story(smoker_avg).mark_bar().encode(
x=alt.X("smoker:N", title="흡연 여부 (Yes/No)"),
y="tip:Q",
color="smoker:N"
).add_title(
"흡연자 vs 비흡연자 팁 차이 🚬🚭",
"팁 평균 비교",
title_color="#1a1a1a",
subtitle_color="#4a4a4a"
).add_context(
text=[
"비흡연자가 평균적으로 약간 더 높은 팁을 주는 경향이 보입니다.",
"사회적 요인일까요? 식사 분위기 차이일까요?"
],
position="bottom",
dx=-80,
color="black"
).add_annotation(
'No', 3.2, "비흡연자 평균 팁 > 흡연자",
arrow_direction='left',
arrow_dx=30,
arrow_dy=-20,
arrow_color='red',
arrow_size=50,
label_color='black',
label_size=16,
show_point=True
).render()
story_chart
🎯 최종 정리
오늘은 seaborn 내장 'tips' 데이터셋을 가지고 pynarrative를 이용해서 2가지 다른 스토리를 만들어봤습니다.
- 데이터를 분석하는 것만으로는 부족하고, 스토리를 함께 전달해야 사람들에게 더 강하게 다가갈 수 있다.
- pynarrative 라이브러리를 사용하면, 복잡한 설명 없이도 데이터와 함께 자연스러운 스토리를 자동으로 생성할 수 있다.
- Altair 그래프에 스토리를 더하면 보고서나 대시보드의 품질이 확연히 올라간다.
- add_annotation 기능을 활용하면 특정 포인트를 강조하여 독자의 이해를 돕고, 기억에 남게 만들 수 있다.
- 숫자와 그래프만 보여주는 시대는 끝났고, 이야기까지 함께 전달할 줄 아는 사람이 차별화된다.
반응형
'프로그래밍 언어(Programming Languages) > 파이썬(Python)' 카테고리의 다른 글
아직도 구닥다리 파이썬 코드 짜시나요? 모던 파이썬 스타일 10가지 (0) | 2025.04.08 |
---|---|
[파이썬 (Python)] If/Else: 파이썬 제어 흐름의 새로운 접근법 🐍✨ (0) | 2025.01.25 |
[파이썬 Python] Python 라이브러리 Camelot으로 PDF에서 테이블 추출하기! 🧙♂️📊 (1) | 2025.01.22 |
[Python 파이썬] Drawdata로 데이터셋 직접 그려보기 🖌️: 데이터 과학자가 꼭 알아야 할 꿀팁! (0) | 2025.01.21 |
[파이썬 Python]🧑💻 파이썬으로 이해하는 동시성, 스레딩, 병렬 처리 🛠️ (1) | 2025.01.16 |