부트캠프

멋쟁이사자처럼 부트캠프 그로스마케팅 4기 23일차_260410

Yuuma 2026. 4. 10. 17:49
[Day7] Python 시각화 & API 기초 | 그로스마케팅 부트캠프

[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 핵심 구조: fig, ax, plt.show()

matplotlib의 3계층 구조 — fig(도화지) ▸ ax(차트 영역) ▸ plt.show()(출력)

🎨 matplotlib 3계층 구조

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 — 한 도화지에 여러 차트

plt.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()
⚠️
subplot 변수명 규칙 차트 1개면 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도 가능)
🔗
차트 갤러리 참고 사이트 matplotlib Gallery  |  Seaborn (더 예쁜 통계 차트)

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 → JSON → DataFrame 전체 흐름

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'])  # 값 꺼내기
💡
API 사용 황금 순서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']])
🔁
DB와 API의 흐름은 동일하다 read_sql(쿼리, engine)response.json() → pd.DataFrame()
데이터 출처가 내부 DB냐, 외부 API냐의 차이일 뿐, 최종 결과는 똑같이 DataFrame이다.

5 YouTube API로 댓글 수집하기

API 개념을 실전에 적용한 파트. 유튜브 영상 통계·댓글을 직접 수집해 DataFrame으로 만든다.

YouTube Data API v3 키 발급 (최초 1회)

  • 1
    console.cloud.google.com 접속 후 새 프로젝트 생성
  • 2
    API 및 서비스 → 라이브러리 → "YouTube Data API v3" 검색 후 사용 설정
  • 3
    API 및 서비스 → 사용자 인증 정보 → API 키 만들기 → 복사
🔐
API 키 = 비밀번호! 코드에 하드코딩해서 GitHub 등 외부에 절대 공유하지 말 것. 환경변수나 별도 설정 파일로 관리.

영상 통계 가져오기

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):,}")
🗂
중첩 딕셔너리 접근 패턴 API 응답은 딕셔너리 안에 딕셔너리가 여러 겹 중첩된다.
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

오늘 수업 핵심 요약


pandas pd.read_sql(쿼리, engine)로 DB 데이터를 DataFrame으로. 이게 시각화의 재료.
matplotlib fig, ax = plt.subplots() → 차트 함수 → plt.show(). 이 순서가 틀리지 않으면 된다.
차트선택 비교→막대(bar), 추이→선(plot), 비율→파이(pie), 순위→가로막대(barh)
API 외부 서비스 DB에 접근하는 창구. 응답은 JSON = Python 딕셔너리. raw 먼저 확인하는 습관이 중요.
데이터흐름 API 호출 → .json() → 딕셔너리 → pd.DataFrame() → 분석·시각화. DB의 read_sql과 같은 흐름.

#Python #pandas #matplotlib #API #JSON #YouTubeAPI #데이터분석