데이터 분석 ② 시각화
숫자 100개보다 그래프 1개가 더 강해요. 오늘은 지난주 정제한 데이터를 그래프로 그리고, 데이터 이야기로 엮어 발표까지 합니다.
오늘 배우는 것
데이터 분석 2주의 마무리예요. 지난주 찾은 사실을 그래프로 그리고, '데이터 이야기'로 엮어 친구들 앞에서 발표하는 것까지 해봅니다.
matplotlib · seaborn이란?
파이썬에서 막대·꺾은선·원그래프 같은 그래프를 그리는 도구예요. 데이터의 숫자를 눈에 보이는 그림으로 바꿔 줍니다.
import seaborn as sns로 불러와요.무엇을 보여줄까 → 그래프 고르기
그래프는 아무거나 쓰는 게 아니에요. 무엇을 보여주고 싶은지에 따라 어울리는 그래프가 정해져 있어요. 이 매칭만 알면 그래프 고르기가 쉬워집니다.
숫자 100개보다, 그래프 1개가 더 강해요. 보여줄 것에 맞는 그래프를 고르는 게 시각화의 첫걸음입니다.
그래프 그려보기
① 도구 설치하기
터미널에 (venv) 표시를 확인하고 설치하세요. (한 번만 하면 돼요.)
pip install matplotlib seaborn② 그래프 코드 만들기
기본 코드를 보면서 한글이 깨지지 않게 폰트 설정을 확인합니다.
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()
③ 핵심 구조 이해하기
그래프 코드는 보통 이런 구조예요. 폰트 설정과 plt.show()가 핵심이에요.
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() # 그래프 띄우기
④ 코드 한 줄씩 따라가기
코드가 어렵게 느껴지면, 아래 설명을 보면서 한 줄씩 무엇을 하는지 확인해 보세요.
import pandas as pd 등 3줄plt.rcParams["font.family"] = "..."df = pd.read_csv("movies.csv")sns.countplot(data=df, x="genre")x= 뒤에 보고 싶은 열 이름을 넣으면 돼요.plt.title("장르별 영화 개수")plt.show()- 그래프가 안 떠요 → 맨 끝에
plt.show()가 빠졌어요. - 한글이 □□로 깨져요 →
font.family폰트 설정이 빠졌어요. - 글자가 겹쳐요 → "그래프 크기를 키우고 글자가 안 겹치게 해줘"라고 요청.
⑤ 다른 항목으로 막대그래프 비교하기
이번엔 장르별 개수 대신, 장르별 평균 평점을 비교하는 막대그래프를 만들어 볼게요. 아래 코드를 그대로 따라 쳐 보세요.
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()
df.groupby("genre")["rating"].mean()sns.barplot(x=..., y=...)countplot과 달리, 이미 계산한 값(평균)을 x(장르)·y(평균값)에 각각 넣어 그려요.plt.xlabel("장르") / plt.ylabel("평균 평점")⑥ 산점도로 두 값의 관계 보기
막대그래프 말고 다른 종류도 그려 볼게요. 예산과 평점 사이에 관계가 있는지 산점도(scatter plot)로 확인합니다.
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()
sns.scatterplot(data=df, x=..., y=...)x축은 예산, y축은 평점 — 두 값이 만나는 자리에 점을 찍어요.hue="genre"hue는 "색으로 구분할 기준"이라는 뜻이에요.🔒 힌트 — 한글이 깨지거나 그래프가 안 떠요 (참고 코드)
폰트 설정은 그래프를 그리기 전에, plt.show()는 맨 끝에 둡니다.
plt.rcParams["font.family"] = "AppleGothic" # 맥
sns.countplot(data=df, x="genre")
plt.title("장르별 영화 개수")
plt.show()데이터 이야기 만들기
그래프를 그렸다면, 이제 이야기로 엮을 차례예요. 그런데 바로 그리지 말고, 어떤 그래프가 어울릴지 먼저 정해 보는 것부터 시작해요.
정했다면, 그때 AI에게 "이 사실을 ○○그래프로 그려줘"라고 요청해 보세요.
이야기 3단계로 엮기
그래프만 나열하면 이야기가 안 돼요. 질문 → 발견 → 해석 순서로 엮으면 데이터 이야기가 완성됩니다.
📋 코드 로직 파악 활동지
오늘은 페어 2주차예요. 내가 쓴 코드를 세 부분으로 나눠 한글로 설명하는 활동지를 작성합니다.
🔒 힌트 — 그래프 여러 개를 어떻게 모으지? (참고 코드)
그래프를 그릴 때마다 plt.figure()로 새 창을 열면 여러 개를 따로 만들 수 있어요.
plt.figure() # 새 그래프 창
sns.countplot(data=df, x="genre")
plt.title("장르별 개수")
plt.figure() # 또 다른 그래프
sns.histplot(data=df, x="rating")
plt.show()미니 발표하기
발표는 외우는 게 아니에요. 무슨 데이터? → 뭘 발견? → 왜 흥미로워? 순서로, 키워드 3개만 메모해 말합니다.
🃏 선택지 카드 — 발표의 메인 그래프 고르기
발표에서 가장 보여주고 싶은 그래프를 하나 골라 준비하세요.
문장을 통째로 외우지 마세요. 키워드 3개만 보고 말하면 막히지 않아요. 그래프를 손으로 가리키며 설명하면 훨씬 잘 전달됩니다.
- 그래프 없이 말로만 발표 → 지루해요. 꼭 그래프를 화면에 띄우기.
- 문장을 통째로 암기 → 중간에 막혀요. 키워드 3개만 보기.
더 해보고 싶다면
미션 3까지 끝내고 시간이 남는다면 도전해 보세요. 끝내지 못해도 괜찮습니다.
보너스 ① 움직이는 그래프 — plotly
마우스를 올리면 정확한 값이 뜨는 그래프예요. 발표 때 훨씬 멋져 보여요.
import plotly.express as px
fig = px.bar(df, x="genre")
fig.show() # 마우스를 올리면 값이 떠요보너스 ② 대시보드로 만들기 — Streamlit
1주차에서 배운 Streamlit으로 내 그래프들을 웹 대시보드에 올려요.
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) # 두 번째 그래프도 웹 화면에
오늘의 핵심 정리
데이터 분석 2주가 끝났어요. 다음 주에는 여러 곳의 데이터를 실시간으로 가져와 합치는 API 매시업 프로젝트를 시작합니다.
🔧 막혔을 때 — 자가 디버깅 4단계
에러가 떠도 당황하지 마세요. 선생님께 묻기 전에 이 순서대로 스스로 해결해 봅니다.