진행 중기획·개발 (개인 프로젝트)약 2분

문화 콘텐츠 데이터 파이프라인 — 수집부터 추천까지

개인 프로젝트로 영화 데이터를 수집·정제해 공통 데이터 모델로 쌓고 추천과 트렌드, 시대별·인물별 분석, 대시보드까지 end-to-end로 만들었다. 같은 인물을 하나로 합치는 엔티티 해소와 여러 분야에서 재사용되는 데이터 구조가 핵심이었다.

데이터 파이프라인추천 시스템데이터 전처리엔티티 해소데이터 시각화개인 프로젝트

한눈에 보기

소속·기간
개인 프로젝트 · 2026.07–
역할
기획·개발 (개인 프로젝트)
문제
콘텐츠 데이터는 흔하지만 바로 분석할 수 있게 정리돼 있지 않다. 같은 인물이 "봉준호", "Bong Joon-ho"처럼 제각각 적혀 필모그래피조차 셀 수 없었다.
결과
영화 12편 샘플로 수집에서 대시보드까지 전 과정이 실제로 도는 것을 확인했다. 추천·트렌드·시대별·인물별 분석을 한 데이터 모델 위에 올렸다.
문화 콘텐츠 데이터 파이프라인 — 수집부터 추천까지

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년 단위 버킷 집계시대별 작품 수와 평균 평점 — 10년 단위 버킷 집계

인물 협업 네트워크 — 봉준호와 3회 함께한 송강호가 상단에인물 협업 네트워크 — 봉준호와 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편이라 통계적 의미가 제한적이고, 추천도 콘텐츠 기반뿐이다. 실데이터 연결과 협업 필터링(사용자 로그 기반) 추가가 다음 항해다.

Links