AI 파이썬 Lab · 심화 · 3주차
심화 · 데이터 분석 ②

데이터 분석 ② 시각화

숫자 100개보다 그래프 1개가 더 강해요. 오늘은 지난주 정제한 데이터를 그래프로 그리고, 데이터 이야기로 엮어 발표까지 합니다.

오늘의 목표

오늘 배우는 것

데이터 분석 2주의 마무리예요. 지난주 찾은 사실을 그래프로 그리고, '데이터 이야기'로 엮어 친구들 앞에서 발표하는 것까지 해봅니다.

📊
GOAL 1
보여줄 것에 맞는 그래프를 골라 그린다
📖
GOAL 2
그래프를 모아 '데이터 이야기'로 엮는다
🎤
GOAL 3
내가 찾은 발견을 그래프와 함께 발표한다
새 도구 ①②

matplotlib · seaborn이란?

파이썬에서 막대·꺾은선·원그래프 같은 그래프를 그리는 도구예요. 데이터의 숫자를 눈에 보이는 그림으로 바꿔 줍니다.

🔤
matplotlib (맷플롯립)
파이썬에서 그래프를 그리는 가장 기본 도구예요. 막대·꺾은선·원그래프 등을 코드로 그릴 수 있어요.
비유: 그래프는 숫자를 그림으로 번역하는 번역기예요. "Drama 220, Comedy 180"이라는 숫자보다, 막대 두 개의 높이 차이가 훨씬 빨리 와닿죠. matplotlib은 이 번역을 해 주는 기본 번역기입니다.
👕
seaborn (시본)
matplotlib을 더 쉽고 예쁘게 쓰게 해주는 도구예요. 짧은 코드 한 줄로 보기 좋은 그래프가 나옵니다. import seaborn as sns로 불러와요.
비유: matplotlib은 그림을 그리는 기본 크레파스예요. seaborn은 그 크레파스에 씌우는 예쁜 캡이에요. 크레파스는 똑같지만, 캡을 씌우면 색이 더 곱고 선이 더 깔끔하게 나와요. 그래서 코드를 짧게 써도 그래프가 훨씬 멋지게 나옵니다.
개념

무엇을 보여줄까 → 그래프 고르기

그래프는 아무거나 쓰는 게 아니에요. 무엇을 보여주고 싶은지에 따라 어울리는 그래프가 정해져 있어요. 이 매칭만 알면 그래프 고르기가 쉬워집니다.

📈
변화 → 꺾은선그래프
시간에 따라 값이 어떻게 변했는지 (예: 연도별 영화 수)
📊
비교 → 막대그래프
항목끼리 크기를 견주기 (예: 장르별 개수)
🥧
비율 → 원그래프
전체 중 차지하는 몫 (예: 장르 비율)
관계 → 산점도
두 값이 함께 움직이는지 (예: 예산과 수익)
🍕 그래프 = 급식판 칸
급식판에도 밥칸·국칸·반찬칸이 따로 있죠. 그래프도 보여줄 내용에 맞는 칸(종류)이 정해져 있어요. 변화는 꺾은선 칸에, 비율은 원그래프 칸에 담아야 딱 맞아요. 아무 칸에나 담으면 국물이 밥에 스미듯 내용이 잘 안 보입니다.
💡 핵심 메시지

숫자 100개보다, 그래프 1개가 더 강해요. 보여줄 것에 맞는 그래프를 고르는 게 시각화의 첫걸음입니다.

미션 1

그래프 그려보기

🎯 목표: 지난주 데이터로 서로 다른 종류의 그래프를 그리고, 제목·축 이름·한글 폰트를 설정한다.

① 도구 설치하기

터미널에 (venv) 표시를 확인하고 설치하세요. (한 번만 하면 돼요.)

터미널
pip install matplotlib seaborn

② 그래프 코드 만들기

기본 코드를 보면서 한글이 깨지지 않게 폰트 설정을 확인합니다.

bar_chart.py — AI가 준 기본 코드
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams["font.family"] = "AppleGothic"  # 맥: AppleGothic / 윈도우: Malgun Gothic

df = pd.read_csv("movies.csv")
counts = df["genre"].value_counts()   # 장르별 개수 세기

plt.bar(counts.index, counts.values)
plt.title("장르별 영화 개수")
plt.show()
bar_chart.py 실행 결과 — 장르별 영화 개수 막대그래프 창이 뜨고, 제목과 축에 한글이 깨지지 않고 나온다

③ 핵심 구조 이해하기

그래프 코드는 보통 이런 구조예요. 폰트 설정과 plt.show()가 핵심이에요.

viz.py
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

plt.rcParams["font.family"] = "Malgun Gothic"  # 한글 폰트

df = pd.read_csv("movies.csv")
sns.countplot(data=df, x="genre")   # 장르별 개수
plt.title("장르별 영화 개수")
plt.show()                            # 그래프 띄우기
viz_3_countplot.py 실행 결과 — 장르별 영화 개수 막대그래프 (countplot, 한글 폰트 정상 적용)
viz_3_countplot.py 실행 결과 — 장르별 영화 개수 막대그래프 (countplot, 한글 폰트 정상 적용)

④ 코드 한 줄씩 따라가기

코드가 어렵게 느껴지면, 아래 설명을 보면서 한 줄씩 무엇을 하는지 확인해 보세요.

1
import pandas as pd 등 3줄
도구 상자를 꺼내요. pandas는 표, seaborn·matplotlib은 그래프 도구예요. 맨 위에 한 번만 써요.
2
plt.rcParams["font.family"] = "..."
한글이 □□로 깨지지 않게 폰트를 미리 설정해요. 윈도우 → Malgun Gothic, 맥 → AppleGothic.
3
df = pd.read_csv("movies.csv")
CSV 파일을 표(df)로 불러와요. 지난주에 만든 파일 이름을 그대로 써요.
4
sns.countplot(data=df, x="genre")
장르(genre) 열을 기준으로 막대그래프를 그려요. x= 뒤에 보고 싶은 열 이름을 넣으면 돼요.
5
plt.title("장르별 영화 개수")
그래프 맨 위에 제목을 달아요. 따옴표 안에 원하는 제목을 쓰면 돼요.
6
plt.show()
화면에 그래프를 띄워요. 이 줄이 없으면 그래프가 안 나타나요! 항상 맨 끝에 써요.
🖥️ OS별 한글 폰트 이름
윈도우는 Malgun Gothic, 맥은 AppleGothic을 쓰면 한글이 안 깨져요. AI에게 "내 OS는 ○○야, 폰트를 맞게 설정해줘"라고 알려주세요.
⚠️ 자주 하는 실수
  • 그래프가 안 떠요 → 맨 끝에 plt.show()가 빠졌어요.
  • 한글이 □□로 깨져요 → font.family 폰트 설정이 빠졌어요.
  • 글자가 겹쳐요 → "그래프 크기를 키우고 글자가 안 겹치게 해줘"라고 요청.

⑤ 다른 항목으로 막대그래프 비교하기

이번엔 장르별 개수 대신, 장르별 평균 평점을 비교하는 막대그래프를 만들어 볼게요. 아래 코드를 그대로 따라 쳐 보세요.

viz.py
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

plt.rcParams["font.family"] = "AppleGothic"  # 한글 폰트

df = pd.read_csv("movies.csv")
avg_rating = df.groupby("genre")["rating"].mean()   # 장르별 평균 평점 계산

sns.barplot(x=avg_rating.index, y=avg_rating.values)
plt.title("장르별 평균 평점")
plt.xlabel("장르")
plt.ylabel("평균 평점")
plt.show()
viz_5_barplot.py 실행 결과 — 장르별 평균 평점 막대그래프 (groupby + barplot, 한글 폰트 정상 적용)
viz_5_barplot.py 실행 결과 — 장르별 평균 평점 막대그래프 (groupby + barplot, 한글 폰트 정상 적용)
1
df.groupby("genre")["rating"].mean()
장르별로 묶어서(groupby) 평점(rating)의 평균을 구해요. 결과는 장르마다 평균 점수 하나씩!
2
sns.barplot(x=..., y=...)
countplot과 달리, 이미 계산한 값(평균)을 x(장르)·y(평균값)에 각각 넣어 그려요.
3
plt.xlabel("장르") / plt.ylabel("평균 평점")
가로축·세로축에 이름을 붙여요. 이게 있어야 그래프만 봐도 무슨 값인지 알 수 있어요.

⑥ 산점도로 두 값의 관계 보기

막대그래프 말고 다른 종류도 그려 볼게요. 예산과 평점 사이에 관계가 있는지 산점도(scatter plot)로 확인합니다.

viz.py
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

plt.rcParams["font.family"] = "AppleGothic"

df = pd.read_csv("movies.csv")

sns.scatterplot(data=df, x="budget", y="rating", hue="genre")
plt.title("예산과 평점의 관계")
plt.xlabel("예산(만 달러)")
plt.ylabel("평점")
plt.show()
viz_6_scatterplot.py 실행 결과 — 예산과 평점의 관계 산점도 (scatterplot + hue="genre", 장르별 색상 구분)
viz_6_scatterplot.py 실행 결과 — 예산과 평점의 관계 산점도 (scatterplot + hue="genre", 장르별 색상 구분)
1
sns.scatterplot(data=df, x=..., y=...)
점 하나가 영화 한 편이에요. x축은 예산, y축은 평점 — 두 값이 만나는 자리에 점을 찍어요.
2
hue="genre"
장르별로 점 색깔을 다르게 나눠요. hue는 "색으로 구분할 기준"이라는 뜻이에요.
3
점들이 흩어진 모양 보기
점들이 오른쪽 위로 몰려 있으면 "예산이 클수록 평점도 높다"는 관계가 있다는 뜻이에요. 흩어져 있으면 관계가 약해요.
🔒 힌트 — 한글이 깨지거나 그래프가 안 떠요 (참고 코드)

폰트 설정은 그래프를 그리기 전에, plt.show()는 맨 끝에 둡니다.

viz.py (참고)
plt.rcParams["font.family"] = "AppleGothic"  # 맥
sns.countplot(data=df, x="genre")
plt.title("장르별 영화 개수")
plt.show()
미션 2

데이터 이야기 만들기

🎯 목표: 그래프 여러 개를 모아 '무엇을 발견했는가'를 설명하는 리포트를 만든다.

그래프를 그렸다면, 이제 이야기로 엮을 차례예요. 그런데 바로 그리지 말고, 어떤 그래프가 어울릴지 먼저 정해 보는 것부터 시작해요.

✏️ 먼저 스스로 해보기
내 사실에는 어떤 그래프가 어울릴까?
지난주 찾은 사실 3가지를 변화·비교·비율·관계 중 무엇인지 분류해 보세요. 그리고 각각 어떤 그래프(꺾은선·막대·원·산점도)가 어울릴지 먼저 적어 봅니다.
정했다면, 그때 AI에게 "이 사실을 ○○그래프로 그려줘"라고 요청해 보세요.

이야기 3단계로 엮기

그래프만 나열하면 이야기가 안 돼요. 질문 → 발견 → 해석 순서로 엮으면 데이터 이야기가 완성됩니다.

1
질문
"어떤 장르가 가장 많을까?" — 알고 싶은 점을 한 문장으로.
2
발견
그래프를 보여주며 "Drama가 가장 많았다" — 그래프가 답을 보여줘요.
3
해석
"사람들이 드라마를 좋아하나 봐" — 내 생각을 한 줄 더해요.
📝 AI 답을 그대로 쓰지 않기
AI가 써준 설명을 복붙하지 말고, 내 생각을 한 줄 더하세요. "나는 ○○라고 생각해"가 들어가야 진짜 내 이야기가 됩니다.

📋 코드 로직 파악 활동지

오늘은 페어 2주차예요. 내가 쓴 코드를 세 부분으로 나눠 한글로 설명하는 활동지를 작성합니다.

📋
코드 로직 파악 활동지
① 불러오기 · ② 청소 · ③ 그래프 — 세 부분의 핵심 줄을 골라, "이 줄은 무엇을 한다"를 한글로 적어 보세요.
🔒 힌트 — 그래프 여러 개를 어떻게 모으지? (참고 코드)

그래프를 그릴 때마다 plt.figure()로 새 창을 열면 여러 개를 따로 만들 수 있어요.

viz.py (참고)
plt.figure()                       # 새 그래프 창
sns.countplot(data=df, x="genre")
plt.title("장르별 개수")

plt.figure()                       # 또 다른 그래프
sns.histplot(data=df, x="rating")
plt.show()
미션 3

미니 발표하기

🎯 목표: 내가 찾은 데이터 이야기를 친구들 앞에서 그래프와 함께 발표한다.

발표는 외우는 게 아니에요. 무슨 데이터? → 뭘 발견? → 왜 흥미로워? 순서로, 키워드 3개만 메모해 말합니다.

1
무슨 데이터?
"저는 영화 1000편 데이터를 분석했어요"
2
뭘 발견?
그래프를 가리키며 "드라마가 가장 많았어요"
3
왜 흥미로워?
"의외로 액션보다 드라마가 많아서 놀랐어요"

🃏 선택지 카드 — 발표의 메인 그래프 고르기

발표에서 가장 보여주고 싶은 그래프를 하나 골라 준비하세요.

A
막대그래프로 '비교'
항목끼리 크기를 견주며 발표
난이도 ★☆☆
→ "장르별 개수를 막대그래프로 비교 발표"
B
꺾은선으로 '변화'
시간에 따른 변화를 보여주며 발표
난이도 ★★☆
→ "연도별 변화를 꺾은선으로 발표"
C
원그래프로 '비율'
전체 중 차지하는 몫을 보여주며 발표
난이도 ★★☆
→ "전체 중 비율을 원그래프로 발표"
D
산점도로 '관계'
두 값의 관계를 보여주며 발표
난이도 ★★★
→ "두 값의 관계를 산점도로 발표"
E
나만의 그래프 조합!
그래프 2개 이상을 엮어 발표하기
🎤 발표 팁

문장을 통째로 외우지 마세요. 키워드 3개만 보고 말하면 막히지 않아요. 그래프를 손으로 가리키며 설명하면 훨씬 잘 전달됩니다.

⚠️ 자주 하는 실수
  • 그래프 없이 말로만 발표 → 지루해요. 꼭 그래프를 화면에 띄우기.
  • 문장을 통째로 암기 → 중간에 막혀요. 키워드 3개만 보기.
보너스 미션

더 해보고 싶다면

미션 3까지 끝내고 시간이 남는다면 도전해 보세요. 끝내지 못해도 괜찮습니다.

보너스 ① 움직이는 그래프 — plotly

마우스를 올리면 정확한 값이 뜨는 그래프예요. 발표 때 훨씬 멋져 보여요.

viz.py (plotly 예시)
import plotly.express as px
fig = px.bar(df, x="genre")
fig.show()   # 마우스를 올리면 값이 떠요

보너스 ② 대시보드로 만들기 — Streamlit

1주차에서 배운 Streamlit으로 내 그래프들을 웹 대시보드에 올려요.

dashboard.py
import streamlit as st
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

plt.rcParams["font.family"] = "AppleGothic"

st.title("🎬 영화 데이터 대시보드")

df = pd.read_csv("movies.csv")

fig, ax = plt.subplots()
sns.countplot(data=df, x="genre", ax=ax)   # 만들어둔 그래프 재사용
ax.set_title("장르별 영화 개수")
st.pyplot(fig)                                # 웹 화면에 그래프 띄우기

# ── 장르별 평균 평점 그래프도 하나 더 추가 ──
genre_avg = df.groupby("genre")["rating"].mean()

fig2, ax2 = plt.subplots()
sns.barplot(x=genre_avg.index, y=genre_avg.values, ax=ax2)
ax2.set_title("장르별 평균 평점")
ax2.set_ylim(0, 10)
st.pyplot(fig2)                               # 두 번째 그래프도 웹 화면에
dashboard.py 실행 결과 — 브라우저에 열린 Streamlit 웹 대시보드, 제목 "🎬 영화 데이터 대시보드"와 장르별 그래프 2개(영화 개수·평균 평점)가 온전히 보인다
🎯 성공 기준
plotly 그래프에 마우스를 올려 숫자가 뜨거나, Streamlit에서 그래프가 웹 화면에 보이면 성공이에요.
정리

오늘의 핵심 정리

1️⃣
시각화
데이터에 맞는 종류의 그래프를 골라 그렸다
2️⃣
이야기
질문→발견→해석으로 데이터 이야기를 엮었다
3️⃣
발표
내가 찾은 발견을 그래프와 함께 발표했다
📌 다음 주 예고

데이터 분석 2주가 끝났어요. 다음 주에는 여러 곳의 데이터를 실시간으로 가져와 합치는 API 매시업 프로젝트를 시작합니다.

🔧 막혔을 때 — 자가 디버깅 4단계

에러가 떠도 당황하지 마세요. 선생님께 묻기 전에 이 순서대로 스스로 해결해 봅니다.

1
에러 메시지 읽기
빨간 글자에서 '몇 번째 줄'과 '무슨 에러'인지 찾아본다.
2
AI에게 보여주기
에러 메시지를 복사해서 "이 에러를 수정해줘"라고 AI에게 요청한다.
3
고쳐서 다시 실행
AI가 준 수정 코드를 적용하고 다시 실행해 본다.
4
선생님께 질문
그래도 안 되면 '에러 메시지 + 내가 시도한 것'을 함께 설명한다.