본문 바로가기
프로그래밍 언어(Programming Languages)/파이썬(Python)

파이썬으로 데이터에 생명을 불어넣자: Pynarrative를 활용한 스토리텔링 가이드 ✨

by 데이터 AI 벌집 2025. 4. 29.
반응형

파이썬으로 데이터에 생명을 불어넣자: Pynarrative를 활용한 스토리텔링 가이드 ✨

 

요즘 데이터는 넘쳐나는데, 그걸 '이야기'로 풀어내는 사람은 생각보다 드뭅니다. 숫자만 던지는 시대는 갔어요.
이제는 데이터를 통해 세상을 이해시키는 능력이 훨씬 중요합니다. 🌎 하지만 대부분의 데이터 시각화 도구(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 기능을 활용하면 특정 포인트를 강조하여 독자의 이해를 돕고, 기억에 남게 만들 수 있다.
  • 숫자와 그래프만 보여주는 시대는 끝났고, 이야기까지 함께 전달할 줄 아는 사람이 차별화된다.

 

반응형