Overview
개인 프로젝트 · 2026.07~ · 기획·개발
"영화·음악·책 같은 문화 콘텐츠를 데이터로 모으면 무엇을 알 수 있을까?"라는 질문에서 출발해, 수집부터 분석·대시보드까지 혼자 end-to-end로 구현했다. 첫 대상은 **영화(TMDB)**지만, 처음부터 다른 분야로 확장 가능한 공통 구조로 설계했다.
- Skill: 데이터 파이프라인 설계, 데이터 전처리, 엔티티 해소, 추천(콘텐츠 기반), 데이터 시각화, 제품 사고
- Stack: Python(pandas·scikit-learn), PostgreSQL, TMDB API, rapidfuzz, matplotlib, Flask
Problem
콘텐츠 데이터는 흔하지만, 곧바로 분석에 쓸 수 있는 형태로 정리돼 있지 않다. 특히 두 가지가 문제였다.
- 같은 인물이 제각각 표기된다. "봉준호" / "Bong Joon-ho" / "Joon-ho Bong"을 하나로 합치지 못하면, "이 감독의 필모그래피"조차 정확히 셀 수 없다.
- 분야마다 데이터를 새로 설계하면 확장이 막힌다. 영화용 구조, 음악용 구조를 따로 만들면 나중에 통합이 불가능해진다.
모델보다 구조가 먼저다. 화려한 추천 알고리즘보다, "데이터를 어떻게 정리해 쌓을 것인가"가 이 프로젝트의 진짜 문제였다.
Solution
물이 정수장을 거치듯, 데이터가 단계를 거쳐 분석 가능해지도록 파이프라인을 설계했다.
수집 → 원본저장 → 전처리(정규화·인물병합) → 정리된 표 → 분석 → 대시보드
TMDB raw_payload normalize/entity work/person… SQL+계산 Flask
1. 공통 데이터 모델 — 작품·인물·관계를 각각 다른 표로 분리했다. 영화든 음악이든 domain만 바꾸면 같은 구조에 담긴다.
work -- 작품 공통 정보 (영화·음악·책…)
person -- 인물 (병합된 표준 인물)
credit -- 작품 ↔ 인물 관계 (감독/배우…)
metric -- 시간별 인기·평점 (트렌드의 원천)2. 엔티티 해소 — 전처리의 척추. 3단계로 같은 인물을 병합했다. (같은 출처 ID → 이름 정규화 일치 → 문자열 유사도 rapidfuzz, 임계값 92) 검증 결과 송강호는 5편에 출연하지만 정확히 한 명으로 저장됐다.
3. 추천 — 줄거리를 숫자로 — 장르·태그(단어 TF-IDF)에 시놉시스(한국어 대응 문자 n-gram TF-IDF)를 가중 결합하고 코사인 유사도로 유사 작품을 골랐다.
combined = hstack([tag_mat * (1 - w), syn_mat * w]) # w = 줄거리 비중
시대별 작품 수와 평균 평점 — 10년 단위 버킷 집계
인물 협업 네트워크 — 봉준호와 3회 함께한 송강호가 상단에
Result
영화 12편(샘플)으로 수집→전처리→분석→시각화→대시보드 전 과정이 실제로 작동함을 검증했다.
- 추천 — "기생충" 기준, 줄거리를 반영하자 가족 서사 "미나리"가 상위로 (0.143)
- 트렌드 — 인기 급상승 작품, 연도별 장르 추이
- 시대별 — 2000/2010/2020년대 작품 수·평균 평점·러닝타임 비교
- 인물별 — 봉준호 필모그래피(4편)와 주요 협업자(송강호 3회)
- 대시보드 — Flask로 4개 결과를 웹 UI + JSON API로 노출, 영화를 고르면 추천이 막대그래프로 즉시 표시
장르 분포 — 전체 작품 기준
TMDB API 키를 연결하면 seed_sample.py를 run_collect.py로 바꾸는 것만으로 실데이터로 전환되고, 이후 파이프라인은 코드 수정 없이 동일하게 동작하도록 만들었다.
Retrospective
구조가 곧 확장성이다 — 추천 알고리즘 자체는 몇 줄이었다. 진짜 일은 인물을 하나로 합치고(엔티티 해소), 분야를 넘어 재사용되는 표를 설계하는 데 있었다. 이 토대 덕에 Spotify 같은 새 분야를 붙일 길이 열렸다.
원본은 원본대로 — raw를 손대지 않고 보관해, 전처리 로직을 바꿔도 재수집 없이 다시 처리할 수 있었다. 반복 가능한 자산으로서의 데이터.
한계도 솔직하게 — 지금은 샘플 12편이라 통계적 의미가 제한적이고, 추천도 콘텐츠 기반뿐이다. 실데이터 연결과 협업 필터링(사용자 로그 기반) 추가가 다음 항해다.
