본문 바로가기
Python

감성 분석 + 시계열 분석 결합: 날짜별 긍정/부정 변화 시각화

by ramzee 2025. 4. 6.

0. 이 글은 누구를 위한 글인가요?

  • 시간 흐름에 따라 감정의 변화를 보고 싶으신 분
  • 감성 분석 결과를 시계열 데이터로 다뤄보고 싶으신 분
  • 긍정/부정 변화 추세를 시각화하고 싶은 분

1. 프로젝트 개요

  • 입력 파일: 인공지능_블로그_감성분석결과.csv
  • 목표: 날짜별 감성 카운트 및 비율 시각화

2. 필요한 라이브러리 설치

pip install pandas matplotlib seaborn

3. 데이터 불러오기

import pandas as pd

df = pd.read_csv("인공지능_블로그_감성분석결과.csv")
print(df[['날짜', '감성']].head())
	날짜	감성
0	2025.01.01	긍정
1	2025.01.02	긍정
2	2025.01.04	중립
3	2025.01.21	부정

4. 날짜 형식 통일 및 정렬

df['날짜'] = pd.to_datetime(df['날짜'], format="%Y.%m.%d", errors='coerce')
df = df.sort_values(by='날짜')
df = df.dropna(subset=['날짜', '감성'])
	날짜	감성
0	2025-01-01	긍정
1	2025-01-02	긍정
2	2025-01-04	중립
3	2025-01-21	부정

5. 날짜별 감성 개수 집계

daily_sentiment = df.groupby(['날짜', '감성']).size().unstack(fill_value=0)
print(daily_sentiment.head())
날짜   	감성  긍정  부정  중립                 
2025-01-01   5   0   1
2025-01-02   6   2   3
2025-01-03   6   5   2
2025-01-04   1   2   4
2025-01-05   8   3   2

6. 감성 비율 계산

daily_sentiment['총합'] = daily_sentiment.sum(axis=1)
daily_sentiment['긍정비율'] = daily_sentiment['긍정'] / daily_sentiment['총합']
daily_sentiment['부정비율'] = daily_sentiment['부정'] / daily_sentiment['총합']
print(daily_sentiment[['긍정비율', '부정비율']].head())
날짜           감성              긍정비율      부정비율                 
2025-01-01  0.833333  0.000000
2025-01-02  0.545455  0.181818
2025-01-03  0.461538  0.384615
2025-01-04  0.142857  0.285714
2025-01-05  0.615385  0.230769

7. 시각화: 날짜별 긍정/부정 비율 추세

import matplotlib.pyplot as plt
import seaborn as sns

plt.rcParams['font.family'] = 'Malgun Gothic'

plt.figure(figsize=(12, 6))
sns.lineplot(data=daily_sentiment, x=daily_sentiment.index, y='긍정비율', label='긍정 비율', color='green')
sns.lineplot(data=daily_sentiment, x=daily_sentiment.index, y='부정비율', label='부정 비율', color='red')
plt.title("날짜별 긍정/부정 비율 추세")
plt.xlabel("날짜")
plt.ylabel("비율")
plt.ylim(0, 1)
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()


8. 시각화: 일일 감성 건수 비교

plt.figure(figsize=(12, 5))
daily_sentiment[['긍정', '부정', '중립']].plot(kind='bar', stacked=True, figsize=(12, 5), colormap='Pastel1')
plt.title("날짜별 감성 건수 (긍정/부정/중립)")
plt.xlabel("날짜")
plt.ylabel("게시물 수")
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()


9. 분석 인사이트 예시

  • 1월 1일 ~ 1월 10일
    • 긍정 감성 비율이 매우 높음 (전체 감성 중 65~70%)
    • 새해 시작과 함께 AI 기술 기대, 트렌드 전망 관련 긍정적 블로그 글이 다수 작성된 것으로 해석 가능
    1월 15일 전후
    • 부정 감성 비중이 잠시 상승
    • 일자리 위협, AI 오용 사례 등에 대한 우려가 블로그 제목에 반영된 것으로 보임
      → 예: "AI가 내 일자리를 대체할까", "인공지능의 윤리적 문제"
    1월 20일 ~ 1월 30일
    • 다시 긍정 비율이 60% 이상으로 회복
    • ChatGPT, Copilot 등 AI 활용 사례 소개가 늘어나면서 감성이 긍정적으로 이동
      → 예: "ChatGPT로 업무 효율 2배", "AI 자동화 도입 성공기"
    2월 초 (2월 1일 ~ 2월 7일)
    • 중립 감성 비중이 증가
    • 블로그 제목이 단순 뉴스 요약/정보 공유 형태일 경우 중립으로 분류되기 쉬움
      → 예: "AI 기술 동향 발표", "2025년 AI 전망 보고서 요약"

10. 마무리 요약

단계 설명
날짜 형식 정제 to_datetime으로 표준화
감성별 집계 groupby(['날짜','감성']).size().unstack()
비율 계산 긍정/부정 건수 ÷ 총합
선그래프 시각화 sns.lineplot() 활용
막대그래프 감성별 수량 비교 (stacked bar)