HSEOM GeckoHSEOM
Instagram

흑섬 TECH 블로그 - 데이터 기반 브리딩 기술

레오파드게코 브리딩에 데이터 분석과 AI 기술을 접목합니다. Python, NumPy를 활용한 체중 관리, 성장 추이 분석, 환경 데이터 시각화 등 실무에서 직접 사용하는 기술을 일반인도 이해하기 쉽게 설명합니다.

주요 카테고리

Play 카테고리

흑섬 TECH 블로그의 Play 카테고리입니다.

6개의 글이 있습니다.

[소셜 미디어 트렌드 4편] LDA 토픽 모델링 + Streamlit 대시보드로 시리즈 완결

수집한 523건 댓글에 LDA 토픽 모델링을 적용해 5개 주제를 자동 분류하고, Streamlit으로 인터랙티브 대시보드를 만듭니다. 감성 분석 + 토픽 분석 + 시각화를 하나로 합친 시리즈 최종편입니다.

카테고리: Play

작성일: 2026-03-15T21:00:00

예상 읽기 시간: 16

Back to Tech
Play·16min read·

[소셜 미디어 트렌드 4편] LDA 토픽 모델링 + Streamlit 대시보드로 시리즈 완결

수집한 523건 댓글에 LDA 토픽 모델링을 적용해 5개 주제를 자동 분류하고, Streamlit으로 인터랙티브 대시보드를 만듭니다. 감성 분석 + 토픽 분석 + 시각화를 하나로 합친 시리즈 최종편입니다.

시작하며 — 수집한 데이터, 이제 정리해볼 차례

1편에서 감성 분석 모델을 만들었고, 2편에서 텍스트 EDA로 데이터를 들여다봤고,
3편에서 YouTube API로 실제 댓글 523건을 수집했습니다.

이번 4편(최종편)에서는 두 가지를 합니다.
1) LDA 토픽 모델링으로 댓글 속 숨은 주제를 자동 분류하고,
2) Streamlit 대시보드로 모든 분석 결과를 한눈에 보는 인터랙티브 웹앱을 만듭니다.

LDA 토픽 모델링 개념도 — 523건 댓글에서 5개 토픽 자동 분류

Step 1. LDA 토픽 모델링이란?

LDA(Latent Dirichlet Allocation)는 비지도 학습 기반 토픽 모델입니다.
문서(여기선 댓글)들을 분석해서 숨겨진 주제(토픽)를 자동으로 찾아내죠.

쉽게 말하면 이런 겁니다:
"코딩 강의 감사합니다" → Topic 0 (교육/코딩)
"이 영화 정말 재미있어요" → Topic 4 (영화/추천)
사람이 일일이 분류하지 않아도 알고리즘이 패턴을 찾아줍니다.


Step 2. 데이터 준비 — gensim Dictionary + Corpus

LDA 전처리 파이프라인 — Dictionary → Corpus → LDA Model

3편에서 저장한 youtube_comments_with_sentiment.csv를 불러옵니다.
1편의 tokenize() 함수로 전처리된 clean 컬럼이 핵심입니다.

cap0 — 데이터 로드 + 기본 확인
데이터 로드 완료 — 523건, 6개 컬럼, 긍정 364건 / 부정 159건

gensim을 써서 3단계로 전처리합니다:

  1. Dictionary — 단어 → ID 매핑 (필터로 희귀/빈출 단어 제거)
  2. Corpus (BoW) — 각 문서를 (단어ID, 빈도) 벡터로 변환
  3. LDA 학습 — Corpus를 입력해서 토픽 추출
cap1 — Dictionary + Corpus 생성
Dictionary 필터 전 2847 → 필터 후 단어 수, Corpus 523개 생성

filter_extremes(no_below=3, no_above=0.7)로 3번 미만 등장하거나,
전체 문서의 70% 이상에서 나오는 너무 흔한 단어를 제거합니다.
"하다", "있다" 같은 범용 단어가 토픽을 오염시키는 걸 막아주죠.


Step 3. LDA 모델 학습 + 토픽 확인

LdaModel을 학습시킵니다. 핵심 파라미터는:

  • num_topics=5 — 토픽 수 (나중에 Coherence Score로 검증)
  • passes=15 — 학습 반복 횟수 (높을수록 안정적)
  • alpha='auto' — 문서-토픽 분포 자동 최적화
cap2 — LDA 모델 학습 결과
LDA 5개 토픽 학습 완료 — 각 토픽별 상위 10개 키워드와 가중치

결과를 보면 각 토픽이 나름의 테마를 갖고 있습니다:
Topic 0은 "코딩/공부/감사" 키워드가 강하고,
Topic 2는 영어 댓글이 모인 토픽이고,
Topic 4는 "영화/추천/정보" 관련 댓글이 모였습니다.

cap3 — 토픽별 키워드 바차트
5개 토픽별 Top-8 키워드 가중치 수평 바차트

Step 4. 토픽 할당 + 감성 결합

각 댓글에 "가장 확률이 높은 토픽"을 할당하고,
3편에서 붙인 감성 라벨(긍정/부정)과 결합합니다.

cap4 — 토픽별 감성 분포 + 데이터 저장
토픽별 감성 크로스탭 + 긍정 비율 + CSV/JSON 저장

토픽별 긍정 비율을 보면 재밌는 패턴이 보입니다.
교육 관련 토픽(Topic 0, 1)은 긍정 비율이 높고,
영어 댓글 토픽(Topic 2)은 상대적으로 부정 비율이 높습니다.

여기서 최종 데이터 두 개를 저장합니다:
youtube_comments_final.csv — 토픽 라벨이 추가된 최종 데이터
topic_keywords.json — 각 토픽의 상위 30개 키워드 (워드클라우드용)


Step 5. Coherence Score — 토픽 수 최적화

Coherence Score 그래프 + 토픽별 긍정 비율 바차트

"토픽 수를 5개로 잡은 건 감이었나?"하고 물을 수 있습니다.
Coherence Score로 검증합니다. 토픽 수를 2~10개까지 바꿔가면서
모델이 생성한 토픽의 의미적 일관성을 측정하는 거죠.

cap5 — Coherence Score 계산 결과
Coherence Score — 토픽 수 2~10개 비교 + 최적 토픽 수 시각화

Score가 가장 높은 지점이 최적 토픽 수입니다.
데이터 특성상 크게 차이가 나지 않을 수도 있는데,
523건으로는 5~7개 범위가 적절하다는 걸 확인할 수 있었습니다.


Step 6. Streamlit 대시보드 만들기

Streamlit 대시보드 구성 요소 — 사이드바 필터 + KPI + 차트 + 워드클라우드 + 테이블

LDA 분석은 Jupyter에서 끝났으니, 이제 결과를 보여주는 대시보드를 만들 차례입니다.
Streamlit을 쓰면 Python 코드만으로 인터랙티브 웹앱을 만들 수 있습니다.

대시보드 구성 요소:

  • 사이드바 — 토픽 선택, 감성 필터, 키워드 검색, 날짜 범위
  • KPI 메트릭 — 총 댓글 수, 긍정/부정 비율, 평균 신뢰도
  • 감성 분포 — Plotly 도넛 차트
  • 토픽별 감성 — Plotly 수평 스택 바차트
  • 시간대별 추이 — Plotly 라인 차트
  • 워드클라우드 — matplotlib + WordCloud (한글 폰트 적용)
  • 댓글 테이블 — st.dataframe으로 전체 데이터 탐색

대시보드 실행 화면

아래는 실제로 동작하는 대시보드 캡처입니다.
다크 테마 + 브랜드 컬러(민트/골드/레드) 3색을 적용했습니다.

대시보드 상단 — KPI 메트릭(523건, 69.6% 긍정) + 감성 도넛 차트 + 토픽별 감성 바차트

상단에는 핵심 지표 4개가 한눈에 보이고,
감성 분포 도넛 차트와 토픽별 감성 비율 바차트가 나란히 배치됩니다.
이거 하나만 열어도 "이 키워드 반응이 어떤가요?" 질문에 바로 답할 수 있습니다.

시간대별 감성 추이 라인 차트 — 2019~2026년 월별 긍정/부정 댓글 수

시간대별 감성 추이는 월 단위로 집계됩니다.
특정 시점에 긍정이 급증하거나 부정이 늘어나는 패턴을 확인할 수 있죠.
실제로 보면 "아, 이 시기에 뭔가 있었구나" 하는 게 바로 보입니다.

토픽별 워드클라우드 — 한글 폰트 적용, Topic 0~4 각각의 핵심 키워드 시각화

워드클라우드는 LDA에서 뽑은 토픽별 키워드를 시각화한 겁니다.
한글 폰트가 깨지지 않도록 macOS는 AppleGothic, Linux는 NanumGothic을 자동 탐지하게 했습니다.

댓글 테이블 — 523건 전체 데이터 검색/정렬/다운로드 가능

하단 테이블에서는 전체 댓글을 직접 탐색할 수 있습니다.
Streamlit의 st.dataframe은 정렬, 검색, CSV 다운로드를 기본 제공합니다.


Step 7. 필터 기능 — 인터랙티브하게 탐색

대시보드의 진짜 장점은 필터로 데이터를 자유롭게 잘라볼 수 있다는 겁니다.

긍정 댓글만 보기

긍정 필터 적용 — 364건, 100% 긍정, 75.4% 신뢰도

감성 필터를 "긍정"으로 바꾸면 364건만 남습니다. 평균 신뢰도가 75.4%로 올라가네요.
모델이 긍정 댓글을 좀 더 자신 있게 판단한다는 뜻이기도 합니다.

부정 댓글만 보기

부정 필터 적용 — 159건, 100% 부정, 63.9% 신뢰도

부정 댓글 159건만 보면 평균 신뢰도가 63.9%입니다.
긍정보다 모델이 덜 확신한다는 건데, 부정 표현이 더 다양하고 미묘하기 때문입니다.

키워드 검색 — "감사"

키워드 '감사' 검색 — 120건, 90.8% 긍정, 79.5% 신뢰도

"감사" 키워드로 검색하면 120건이 나옵니다.
긍정 비율이 90.8%로 뛰어오르고, 신뢰도도 79.5%로 높습니다.
"감사"가 포함된 댓글은 거의 확실히 긍정이라는 뜻이죠.


Step 8. Streamlit Cloud 배포

Streamlit Cloud 무료 배포 가이드 — GitHub 업로드 → 연결 → Deploy

만든 대시보드를 인터넷에 공개하려면 Streamlit Cloud를 쓰면 됩니다.
공개 GitHub 저장소 기준 무료이고, 별도 서버 관리가 필요 없습니다.

배포에 필요한 파일 구조:

  • app.py — 대시보드 메인 코드
  • requirements.txt — streamlit, pandas, plotly, wordcloud, matplotlib
  • .streamlit/config.toml — 다크 테마 설정
  • data/youtube_comments_final.csv — 전처리 완료 데이터
  • data/topic_keywords.json — LDA 토픽 키워드

여기서 중요한 설계 포인트가 하나 있습니다.
LDA 학습(gensim, konlpy)은 Jupyter에서 미리 끝내고,
Streamlit 앱은 결과만 시각화합니다.
그래서 requirements.txt에 gensim이 없습니다 — 배포가 가볍고 빠릅니다.


정리 — 시리즈 전체 아키텍처

시리즈 완결 — 1편 감성분석 → 2편 EDA → 3편 수집 → 4편 대시보드 전체 흐름
  1. 1편 — 감성 분석 모델: NSMC 200K건으로 TF-IDF + Logistic Regression 학습 (82.8%)
  2. 2편 — 텍스트 EDA: 문장 길이, 워드클라우드, 단어 빈도로 데이터 특성 파악
  3. 3편 — YouTube API: 실제 댓글 523건 수집 + 감성 라벨링
  4. 4편 — 대시보드: LDA 토픽 모델링 + Streamlit 인터랙티브 시각화

처음에 NSMC로 모델을 만들고, 그 모델로 실제 YouTube 댓글을 분석하고,
LDA로 주제까지 분류해서, 대시보드로 한눈에 보여주는 구조입니다.
"데이터 수집 → 분석 → 시각화"라는 데이터 사이언스의 기본 흐름을 그대로 따라왔습니다.

시리즈를 끝까지 따라오셨다면, 이 흐름을 다른 데이터에도 적용해볼 수 있습니다.
트위터 댓글이든, 네이버 리뷰든, 앱스토어 리뷰든 — 구조는 같습니다.

#LDA#토픽모델링#Streamlit#gensim#대시보드#python