ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 기법을 활용하여 공공 데이터 분석을 고도화할 수 있을 것입니다.

Designed by Tistory.