[Day 7] Python 시각화 & API 기초
matplotlib · pandas · YouTube API
MySQL 연결부터 차트 그리기, 그리고 API로 외부 데이터 가져오기까지
1 MySQL 연결 & pandas 기초
DB에서 데이터를 직접 불러와 pandas DataFrame으로 만드는 것이 이번 파트의 핵심이다. 이후 모든 시각화의 재료가 된다.
설치 & 연결
# 최초 1회만 실행
!pip install pymysql sqlalchemy -q
import pandas as pd
from sqlalchemy import create_engine, text
URI_HOST = "" # avnadmin:PASSWORD@HOST:PORT/defaultdb
engine = create_engine(
"mysql+pymysql://" + URI_HOST + "?charset=utf8mb4"
)
pandas로 SQL 데이터 불러오기
# 기본: 테이블 전체
df = pd.read_sql("SELECT * FROM users", engine)
# 응용: 집계 쿼리 결과도 DataFrame으로
df = pd.read_sql("""
SELECT channel, SUM(conversions) AS total_conversions
FROM ad_campaigns
GROUP BY channel
ORDER BY total_conversions DESC
""", engine)
print(df)
pd.read_sql(쿼리, engine)이 반환하는 df(DataFrame)가 이후 모든 차트의 재료다. SQL로 데이터를 정제하고, Python으로 시각화한다.
2 matplotlib 시각화 핵심 개념
차트를 그리기 전에 딱 3가지 개념만 이해하면 된다. 이 구조를 모르면 코드가 뒤죽박죽 된다.
matplotlib의 3계층 구조 — fig(도화지) ▸ ax(차트 영역) ▸ plt.show()(출력)
① fig = 도화지 전체 (Figure) — plt.subplots()로 생성
② ax = 차트를 실제로 그리는 영역 (Axes) — 차트 함수들은 여기에
③ plt.show() = 완성된 도화지를 화면에 출력
두 가지 방식 — 어떤 걸 써야 할까?
pyplot 방식 (간단)
plt.plot([1,2,3], [1,4,9])
plt.title('제곱 그래프')
plt.show()
간단한 테스트에 적합. 복잡한 레이아웃에서 관리가 어려워짐.
✅ 객체지향 방식 (권장)
fig, ax = plt.subplots(figsize=(8,5))
ax.plot([1,2,3], [1,4,9])
ax.set_title('제곱 그래프')
plt.show()
코드가 조금 길어도 명확하고, 실무·권장 스타일.
subplots — 한 도화지에 여러 차트
subplots(행, 열)로 여러 차트 영역을 한 번에 만든다
# 1행 2열 = 차트 2개 나란히
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
axes[0].plot(months, revenue, marker='o') # 왼쪽
axes[0].set_title('월별 매출')
axes[1].bar(months, new_subs) # 오른쪽
axes[1].set_title('월별 신규 구독자')
plt.tight_layout() # 여백 자동 정리
plt.show()
ax, 여러 개면 axes라고 쓰는 게 관례다. axes[0], axes[1]로 인덱스로 접근.
3 차트 종류 & 꾸미기 함수 레퍼런스
이 표를 기억해두면 상황에 맞는 차트를 바로 고를 수 있다.
차트 그리는 함수
| 함수 | 차트 종류 | 언제 쓰나 |
|---|---|---|
ax.bar(x, y) | 세로 막대 | 항목 간 크기 비교할 때 |
ax.barh(y, x) | 가로 막대 | 항목명이 길거나 순위 볼 때 |
ax.plot(x, y) | 선 (꺾은선) | 시간 흐름·추이 볼 때 |
ax.pie(y) | 파이 | 전체 중 비율 볼 때 |
차트 꾸미는 함수
| 함수 | 역할 |
|---|---|
ax.set_title("제목") | 차트 제목 설정 |
ax.set_xlabel("이름") | X축 레이블 |
ax.set_ylabel("이름") | Y축 레이블 |
ax.axhline(값) | 가로 기준선 추가 |
plt.tight_layout() | 여백 자동 정리 (항상 써주기) |
figsize=(가로, 세로) | 차트 크기 (인치 단위) |
실습 예시 — 막대 → 선 → 파이까지
# 막대 차트 (색상 지정 포함)
fig, ax = plt.subplots(figsize=(8, 5))
ax.bar(df['channel'], df['total_conversions'],
color='steelblue', edgecolor='white')
ax.set_title("채널별 전환수")
ax.set_xlabel("채널")
ax.set_ylabel("전환수")
plt.tight_layout()
plt.show()
# 선 차트 (marker='o' = 각 점에 동그라미)
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(df_monthly['month'], df_monthly['revenue'],
marker='o', color='green', linewidth=2)
ax.set_title("월별 매출 추이")
plt.tight_layout()
plt.show()
# 파이 차트 (autopct = 퍼센트 자동 표시)
fig, ax = plt.subplots(figsize=(8, 8))
ax.pie(df_signup['user_count'],
labels=df_signup['signup_channel'],
autopct='%1.1f%%')
ax.axis('equal') # 원형 유지
ax.set_title("유저 가입 채널별 비율", fontsize=16, pad=20)
plt.show()
'steelblue' · 'salmon' · 'seagreen' · 'orange' · '#3498db' (HEX도 가능)
4 API & JSON 이란?
오늘 수업에서 개념적으로 가장 중요한 파트다. API를 이해하면 유튜브·네이버·카카오 등 외부 서비스 데이터를 직접 가져와 분석할 수 있게 된다.
API = 상대 서비스 DB에서 데이터를 꺼내서 딕셔너리로 돌려주는 창구
JSON = API가 데이터를 포장하는 방식 (Python 딕셔너리와 구조 동일)
JSON vs Python 딕셔너리 — 거의 같다
JSON (API 응답)
{
"author": "김민준",
"text": "진짜 좋다!!!",
"like_count": 42
}
큰따옴표 사용
Python 딕셔너리
{
'author': '김민준',
'text': '진짜 좋다!!!',
'like_count': 42
}
작은따옴표 사용 — 구조는 동일!
API 데이터 수집부터 DataFrame 분석까지의 전체 흐름
무료 API로 실습 — 구조 확인하기
import requests
# 1. API 호출
response = requests.get("https://jsonplaceholder.typicode.com/posts/1")
print("상태 코드:", response.status_code) # 200 = 성공
# 2. raw 텍스트 확인 (이게 JSON)
print(response.text)
# 3. Python 딕셔너리로 변환
data = response.json() # 딱 한 줄!
print(data['title']) # 값 꺼내기
response = 호출.execute() → ② raw 먼저 눈으로 확인 (print(response)) → ③ 필요한 키로 접근 (data['items']).raw를 확인하지 않으면 데이터 구조를 모른 채 코드를 짜게 되어 오류가 난다.
딕셔너리 목록 → DataFrame 변환 흐름
# 여러 건 가져오기
response = requests.get("https://jsonplaceholder.typicode.com/posts?_limit=5")
data_list = response.json() # → list of dict
# DataFrame으로 변환 (read_sql 과 같은 결과!)
df = pd.DataFrame(data_list)
print(df[['userId', 'id', 'title']])
read_sql(쿼리, engine) ↔ response.json() → pd.DataFrame()데이터 출처가 내부 DB냐, 외부 API냐의 차이일 뿐, 최종 결과는 똑같이 DataFrame이다.
5 YouTube API로 댓글 수집하기
API 개념을 실전에 적용한 파트. 유튜브 영상 통계·댓글을 직접 수집해 DataFrame으로 만든다.
YouTube Data API v3 키 발급 (최초 1회)
- 1console.cloud.google.com 접속 후 새 프로젝트 생성
- 2API 및 서비스 → 라이브러리 → "YouTube Data API v3" 검색 후 사용 설정
- 3API 및 서비스 → 사용자 인증 정보 → API 키 만들기 → 복사
영상 통계 가져오기
from googleapiclient.discovery import build
youtube = build("youtube", "v3", developerKey=API_KEY)
# raw 응답 확인 (항상 먼저!)
response = youtube.videos().list(
part="snippet,statistics",
id=VIDEO_ID
).execute()
import json
print(json.dumps(response, indent=2, ensure_ascii=False))
# 중첩 딕셔너리에서 값 꺼내기
video = response['items'][0]
views = video['statistics']['viewCount']
likes = video['statistics']['likeCount']
print(f"조회수: {int(views):,}")
response['items'][0]['statistics']['viewCount'] — 계층을 따라 순서대로 접근.
댓글 여러 개 → DataFrame
# 댓글 50개 수집
response_comm = youtube.commentThreads().list(
part="snippet",
videoId=VIDEO_ID,
maxResults=50
).execute()
# 딕셔너리 목록으로 정리
rows = []
for item in response_comm['items']:
c = item['snippet']['topLevelComment']['snippet']
rows.append({
'author': c['authorDisplayName'],
'text': c['textDisplay'],
'likes': c['likeCount'],
'date': c['publishedAt'][:10]
})
df_comments = pd.DataFrame(rows)
print(f"댓글 {len(df_comments)}개 수집!")
df_comments
✓ 오늘 수업 핵심 요약
pd.read_sql(쿼리, engine)로 DB 데이터를 DataFrame으로. 이게 시각화의 재료.
fig, ax = plt.subplots() → 차트 함수 → plt.show(). 이 순서가 틀리지 않으면 된다.
bar), 추이→선(plot), 비율→파이(pie), 순위→가로막대(barh)
.json() → 딕셔너리 → pd.DataFrame() → 분석·시각화. DB의 read_sql과 같은 흐름.
'부트캠프' 카테고리의 다른 글
| 멋쟁이사자처럼 부트캠프 그로스마케팅 4기 25일차_260414 (2) | 2026.04.14 |
|---|---|
| 멋쟁이사자처럼 부트캠프 그로스마케팅 4기 24일차_260413 (0) | 2026.04.13 |
| 멋쟁이사자처럼 부트캠프 그로스마케팅 4기 22일차_260409 (0) | 2026.04.09 |
| 멋쟁이사자처럼 부트캠프 그로스마케팅 4기 21일차_260408 (2) | 2026.04.08 |
| 멋쟁이사자처럼 부트캠프 그로스마케팅 4기 20일차(2)_260407 (0) | 2026.04.07 |