-
[3월 3주차-3/18]국민청원 데이터 분석 및 120다산콜재단 데이터 RNN 모델링Why Not SW CAMP 5기/수업 기록 2025. 3. 19. 16:41
1. 국민청원 데이터 분석
데이터 소개
국민청원 데이터는 청와대 국민청원 웹사이트에서 수집된 데이터로, 각 청원의 제목, 내용, 시작일, 종료일, 투표 수 등의 정보를 포함하고 있습니다. 본 분석에서는 데이터의 기본적인 탐색 및 시각화를 수행하고, 20만 건 이상의 동의를 받은 청원이 답변 대상이 되는 기준을 적용하여 답변 대상 청원을 분석합니다.
데이터 불러오기 및 기본 정보 확인
import pandas as pd import numpy as np petitions = pd.read_csv("data/petition.csv", index_col="article_id", parse_dates=['start', 'end']) print(petitions.shape) print(petitions.info()) print(petitions.head())
데이터 전처리 및 추가 컬럼 생성
- 답변 대상 청원 추가: 20만 건 이상의 투표를 받은 경우 answer 컬럼에 True를 설정합니다.
- 청원 기간 계산: duration 컬럼을 생성하여 청원의 지속 기간을 계산합니다.
petitions['answer'] = petitions['votes'] > 200000 petitions['duration'] = petitions['end'] - petitions['start'] print(petitions.head())
데이터 시각화
카테고리별 청원 건수를 막대그래프로 표현합니다.
from plotnine import * import koreanize_matplotlib (ggplot(petitions) + aes('category') + geom_bar(fill='green') + theme(text=element_text(family='NanumGothic'), axis_text_x=element_text(rotation=60)))
또한, 카테고리별 총 투표 수를 비교합니다.
(ggplot(petitions) + aes(x='category', y='votes') + geom_col(fill='skyblue') + ggtitle('카테고리별 투표수') + coord_flip() + theme(text=element_text(family='NanumGothic')))
2. 120다산콜재단 데이터 분석 및 RNN 모델링
데이터 소개
120다산콜재단은 서울시의 24시간 상담 서비스입니다. 본 데이터에는 시민들의 문의 내용과 답변이 포함되어 있으며, 이를 분석하여 주요 토픽을 분류하고, 딥러닝 모델을 활용한 텍스트 분류 작업을 수행합니다.
LDA(Latent Dirichlet Allocation)를 활용한 토픽 모델링
토픽 모델링을 적용하여 주요 문의 주제를 분류합니다.
from sklearn.feature_extraction.text import CountVectorizer from sklearn.decomposition import LatentDirichletAllocation df = pd.read_csv('https://bit.ly/seoul-120-text-csv') df['문서'] = df['제목'] + ' ' + df['내용'] cv = CountVectorizer(stop_words=['돋움', '경우', '또는']) dtm_cv = cv.fit_transform(df['문서']) LDA_model = LatentDirichletAllocation(n_components=10, random_state=42) LDA_model.fit(dtm_cv)
RNN 기반 텍스트 분류 모델링
LSTM을 활용하여 문의 내용을 분류하는 RNN 모델을 구축합니다.
from tensorflow.keras.preprocessing.text import Tokenizer from tensorflow.keras.preprocessing.sequence import pad_sequences from tensorflow.keras import Sequential from tensorflow.keras.layers import Embedding, Bidirectional, LSTM, Dense, Dropout, BatchNormalization # 데이터 전처리 tokenizer = Tokenizer(num_words=1000, oov_token='<oov>') tokenizer.fit_on_texts(df['문서']) train_sequence = tokenizer.texts_to_sequences(df['문서']) X_train_sp = pad_sequences(train_sequence, maxlen=500, padding='post') # RNN 모델 생성 model = Sequential([ Embedding(input_dim=1000, output_dim=64, input_length=500), Bidirectional(LSTM(64, return_sequences=True)), BatchNormalization(), Bidirectional(LSTM(32)), Dropout(0.2), Dense(16, activation='relu'), Dense(10, activation='softmax') ]) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) model.summary()
모델 학습 및 성능 평가
from tensorflow.keras.callbacks import EarlyStopping early_stop = EarlyStopping(monitor='val_loss', patience=5) history = model.fit(X_train_sp, y_train, epochs=100, batch_size=64, callbacks=[early_stop], validation_split=0.2)
학습 결과 시각화
import matplotlib.pyplot as plt df_hist = pd.DataFrame(history.history) df_hist[['accuracy', 'val_accuracy']].plot() plt.show() df_hist[['loss', 'val_loss']].plot() plt.show()
결론
이번 분석에서는 국민청원 데이터를 활용하여 청원의 흐름과 주요 이슈를 분석하고, 120다산콜재단의 데이터로 토픽 모델링 및 RNN 기반 텍스트 분류 모델을 구축했습니다. 앞으로 더 다양한 NLP 기법을 활용하여 공공 데이터 분석을 고도화할 수 있을 것입니다.
'Why Not SW CAMP 5기 > 수업 기록' 카테고리의 다른 글
[3월 4주차-3/27(1)]Titanic 생존 예측 모델 분석 (의사결정나무 & 로지스틱 회귀) (0) 2025.03.27 [3월 4주차-3/27(2)]다양한 모델 정리 (0) 2025.03.27 [3월 3주차-3/19]비지도 학습으로 댓글을 분석해보자! (KMeans 군집화) (1) 2025.03.19 [3월 3주차-3/17(4)]Fashion MNIST 데이터셋을 학습하는 인공신경망(ANN) 모델 만들기 (1) 2025.03.17 [3월 3주차-3/17(3)]한국어 Word2Vec: 네이버 영화 리뷰 데이터로 학습하기 (1) 2025.03.17