교육 격차 토픽 모델링 (Python LDA) (고급)
고급
정성 분석
social
python
난이도: 고급 — 심화 내용을 포함합니다. 사전 지식이 필요할 수 있습니다.
개요
교육 격차 관련 뉴스 기사를 LDA(Latent Dirichlet Allocation) 토픽 모델링으로 분석하여 주요 담론 주제를 식별한다. Python의 scikit-learn을 사용한다.
분석 절차
1단계: 텍스트 벡터화
CountVectorizer로 문서를 단어 빈도 행렬로 변환한다. 불용어 제거와 상위 1,000개 단어만 사용한다.
2단계: 토픽 수 결정
5~10개 범위에서 여러 토픽 수로 모델을 학습하고, coherence score 또는 해석 가능성을 기준으로 최적값을 선택한다.
3단계: LDA 모델 학습
LatentDirichletAllocation으로 모델을 학습한다. 각 토픽은 단어 분포로 표현된다.
4단계: 토픽 해석
각 토픽의 상위 10개 단어를 확인하여 토픽의 주제를 해석한다. 예: “학교, 교사, 예산, 지원” → 교육 재정 토픽.
5단계: 문서 분류
각 문서의 지배적 토픽(dominant topic)을 할당하여 담론 흐름을 추적한다.
코드 예제
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
# 데이터 로드
df = pd.read_csv('education_articles.csv')
# 벡터화
vectorizer = CountVectorizer(max_features=1000, stop_words='english')
X = vectorizer.fit_transform(df['content'])
# LDA 토픽 모델링
n_topics = 5
lda = LatentDirichletAllocation(n_components=n_topics, random_state=42, max_iter=20)
lda.fit(X)
# 토픽별 상위 단어
feature_names = vectorizer.get_feature_names_out()
for topic_idx, topic in enumerate(lda.components_):
top_words = [feature_names[i] for i in topic.argsort()[-10:]]
print(f"Topic {topic_idx + 1}: {', '.join(top_words)}")
# 문서-토픽 분포
doc_topics = lda.transform(X)
df['dominant_topic'] = doc_topics.argmax(axis=1)
참고문헌
Blei, D. M., Ng, A. Y., & Jordan, M. I. (2003). Latent Dirichlet Allocation. Journal of Machine Learning Research, 3, 993-1022.
심화 내용
고급 분석에서는 다음을 추가로 고려해야 합니다:
- 부트스트래핑(Bootstrapping)을 통한 강건성 검증
- 교차 검증(Cross-validation)으로 모형 일반화 성능 평가
- 민감도 분석(Sensitivity Analysis)으로 가정 위반 시 영향 평가
코드 예제
PYTHON
import pandas as pd from sklearn.feature_extraction.text import CountVectorizer from sklearn.decomposition import LatentDirichletAllocation # 데이터 로드 df = pd.read_csv('education_articles.csv') # 벡터화 vectorizer = CountVectorizer(max_features=1000, stop_words='english') X = vectorizer.fit_transform(df['content']) # LDA 토픽 모델링 n_topics = 5 lda = LatentDirichletAllocation(n_components=n_topics, random_state=42, max_iter=20) lda.fit(X) # 토픽별 상위 단어 feature_names = vectorizer.get_feature_names_out() for topic_idx, topic in enumerate(lda.components_): top_words = [feature_names[i] for i in topic.argsort()[-10:]] print(f"Topic {topic_idx + 1}: {', '.join(top_words)}") # 문서-토픽 분포 doc_topics = lda.transform(X) df['dominant_topic'] = doc_topics.argmax(axis=1)
참고문헌
Blei, D. M., Ng, A. Y., & Jordan, M. I. (2003). Latent Dirichlet Allocation. Journal of Machine Learning Research, 3, 993-1022.