21 minute read

Pandas로 국민청원 데이터 분석하기

import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns 
df = pd.read_csv('https://s3.ap-northeast-2.amazonaws.com/data10902/petition/petition.csv', parse_dates=['start', 'end'])
df.shape #395547열, 9행
(395547, 8)
df.head(5) #앞 5행 미리보기
article_id start end answered votes category title content
0 21 2017-08-19 2017-11-17 0 9 안전/환경 스텔라 데이지호에 대한 제안입니다. 스텔라 데이지호에 대한 제안입니다.\n3월31일 스텔라 데이지호가 침몰하고 5달째가...
1 22 2017-08-19 2017-11-17 0 17 기타 비리제보처를 만들어주세요. 현 정부에 국민들이 가장 원하는 것은 부패척결입니다. 우리 사회에 각종 비리들이 ...
2 23 2017-08-19 2017-09-03 0 0 미래 제2의 개성공단 만일 하시는 대통령님 및 각 부처 장관님,주무관님들 안녕하세요!!\n전남 목포에서 ...
3 24 2017-08-19 2017-08-26 0 53 일자리 공공기관 무조건적인 정규직전환을 반대합니다. 현정부에서 정규직 일자리를 늘리는 것에 찬성합니다. 그런데 공공기관 비정규직들은 인...
4 25 2017-08-19 2017-09-03 0 0 미래 제2의 개성공단 만일 하시는 대통령님 및 각 부처 장관님,주무관님들 안녕하세요!!\n전남 목포에서 ...
df.isnull().sum() #content 열에 결측치 1 있음, 나머지 결측치 0
article_id    0
start         0
end           0
answered      0
votes         0
category      0
title         0
content       1
dtype: int64
df.info() #칼럼명과 타입 확인
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 395547 entries, 0 to 395546
Data columns (total 8 columns):
 #   Column      Non-Null Count   Dtype         
---  ------      --------------   -----         
 0   article_id  395547 non-null  int64         
 1   start       395547 non-null  datetime64[ns]
 2   end         395547 non-null  datetime64[ns]
 3   answered    395547 non-null  int64         
 4   votes       395547 non-null  int64         
 5   category    395547 non-null  object        
 6   title       395547 non-null  object        
 7   content     395546 non-null  object        
dtypes: datetime64[ns](2), int64(3), object(3)
memory usage: 24.1+ MB
df.describe() #수치형 데이터 요약
article_id answered votes
count 395547.000000 395547.000000 3.955470e+05
mean 251608.934635 0.000073 1.501188e+02
std 153219.216242 0.008562 4.802583e+03
min 21.000000 0.000000 0.000000e+00
25% 115236.500000 0.000000 2.000000e+00
50% 253682.000000 0.000000 5.000000e+00
75% 386137.500000 0.000000 1.500000e+01
max 517122.000000 1.000000 1.192049e+06
df.describe(include=np.object) #카테고리 형태의 데이터 요약
category title content
count 395547 395547 395546
unique 17 346524 375224
top 정치개혁 이명박 출국금지 이명박 출국금지
freq 62750 3018 597

1. 20만 이상 투표를 받은 ‘답변대상 청원’ 분야별 순위

df_20 = df.loc[df['votes'] > 200000] #20만건 이상 투표를 받은 '답변대상 청원' 보기
df_20.category.value_counts() #카테고리별 '답변대상 청원' 개수
인권/성평등         24
안전/환경          10
정치개혁            8
기타              8
문화/예술/체육/언론     7
외교/통일/국방        4
반려동물            4
보건복지            3
육아/교육           3
교통/건축/국토        3
경제민주화           2
성장동력            2
미래              1
행정              1
Name: category, dtype: int64
df_20_cat = df_20.category.value_counts()
df_20_category = df_20_cat.to_frame().reset_index()
df_20_category.columns = ['category','count']
df_20_category
category count
0 인권/성평등 24
1 안전/환경 10
2 정치개혁 8
3 기타 8
4 문화/예술/체육/언론 7
5 외교/통일/국방 4
6 반려동물 4
7 보건복지 3
8 육아/교육 3
9 교통/건축/국토 3
10 경제민주화 2
11 성장동력 2
12 미래 1
13 행정 1
# matplotlib 한글 폰트 설정
plt.rc('font', family='NanumGothic') # For Windows
print(plt.rcParams['font.family'])
%matplotlib inline
['NanumGothic']
ax = plt.subplots(figsize=(15, 9)) 
ax = sns.barplot(x='category', y='count', data=df_20_category)
ax.set_title('20만 이상 청원(답변대상 청원) 분야별 순위')
Text(0.5, 1.0, '20만 이상 청원(답변대상 청원) 분야별 순위')

20만 이상 청원(답변대상 청원) 분야별 순위

1) 20만건 이상 투표를 받은 ‘답변대상 청원’ 분야는 <인권/성평등>이 월등히 많았고, <안전/환경>이 2순위, <정치개혁>이 3순위로 그 뒤를 따른다.

2) 반면 <행정>과 <미래> 분야의 청원은 가장 적은 수의 '답변대상 청원'을 보인다.

2. ‘답변대상 청원’ 중 실제로 답변이 된 수 & 비율

df['answer'] = (df['votes'] > 200000) == 1 #20만건 이상 투표를 받은 'answer' column
df['no_answer'] = (df['votes'] < 200000) == 1 #20만건 이상 투표를 받지 못한 'no_answer' column
df.dtypes
article_id             int64
start         datetime64[ns]
end           datetime64[ns]
answered               int64
votes                  int64
category              object
title                 object
content               object
answer                  bool
no_answer               bool
dtype: object
df['answer'] = df['answer'].astype('int') #새로 생성해 준 answer의 타입은 boolean 타입이므로 -> int로 변경
df['no_answer'] = df['no_answer'].astype('int') #새로 생성해 준 no_answer의 타입은 boolean 타입이므로 -> int로 변경
df['answer_diff'] = df['answer'] - df['answered']
df['answer_diff'].sum() #'답변대상 청원' 중 아직 답변되지 않은 청원의 수
51
is_answered = df['answered'] == 1
subset_df = df[is_answered]
subset_df
article_id start end answered votes category title content answer no_answer answer_diff
1752 1785 2017-09-03 2017-11-02 1 296330 인권/성평등 청소년이란 이유로 보호법을 악용하는 잔인무도한 청소년들이 늘어나고있습니다. 반드시 ... 안녕하십니까. 청소년보호법이란 명목하에 나쁜짓을 일삼는 청소년들이 너무나 많아지고 ... 1 0 0
10894 10949 2017-09-06 2017-12-05 1 615354 미래 조두순 출소반대 제발 조두순 재심다시해서 무기징역으로 해야됩니다!!! 1 0 0
18111 18278 2017-09-30 2017-10-30 1 235372 인권/성평등 낙태죄 폐지와 자연유산 유도약(미프진) 합법화 및 도입을 부탁드립니다. 안녕하세요. 존경하는 대통령님 의원님\n낙태죄 폐지를 청원합니다.\n현재 대한민국은... 1 0 0
25032 26024 2017-11-04 2017-12-04 1 216774 안전/환경 '주취감형(술을 먹으면 형벌 감형)' 폐지를 건의(청원)합니다. '주취감형'이란, 술을 먹고 범행을 저지를 때, 심신미약 (이성이 없고 우발적)이라... 1 0 0
43992 45581 2017-11-17 2017-12-17 1 281985 보건복지 권역외상센터 (이국종 교수님) 추가적, 제도적, 환경적, 인력 지원 청원사항)\n중증외상분야의 추가적, 제도적, 환경적, 인력 지원 방안마련\n현 의료... 1 0 0
47285 49083 2017-11-24 2017-12-24 1 211064 기타 전안법. 18살, 미성년자에게 정부가 직접 찍어주는 범죄자 낙인! 3년 이하의 징역, 또는3천만원 이하의 벌금. 혹은 500만원 이하의 과태료.\n설... 1 0 0
54896 57132 2017-12-03 2018-01-02 1 255554 성장동력 전안법 합리적으로 개정 또는 폐지해주세요.(소상공인 소비자 모두 죽는법안입니다.) 2017년 1월 28일부터 시행되는 법령으로 국가기술표준원에서 관리하는 전기제품에만... 1 0 0
70744 76020 2017-12-28 2018-01-27 1 228295 성장동력 <가상화폐규제반대> 정부는 국민들에게 단 한번이라도 행복한 꿈을 꾸게 해본적 있습니까? 저는 정부에게 묻고 싶습니다.\n정부는 단 한번이라도 우리 국민들에게 행복한 꿈을 ... 1 0 0
73197 79162 2018-01-03 2018-02-02 1 233842 인권/성평등 미성년자 성폭행 형량 올려주세요 종신형원합니다 또 창원에서 조두순사건과 같은 사건이 발생했네요\n술먹어 심신이 미약하신 50대 대... 1 0 0
74640 81026 2018-01-06 2018-02-05 1 213219 인권/성평등 초.중.고 학교 페미니즘교육 의무화 아직 판단이 무분별한 어린학생들이 학교에서 여성비하적요소가 들어있는 단어들을 아무렇... 1 0 0
84324 95138 2018-01-14 2018-02-13 1 219395 교통/건축/국토 대전 아파트 단지내 횡단보도 교통사고..가해자의 만행과 도로교통법의 허점 1. 2017년 10월 16일 19시10분경 대전 맑은 아침 아파트 단지 내 횡단보... 1 0 0
85497 96427 2018-01-15 2018-02-14 1 277674 정치개혁 국회의원 급여를 최저시급으로 책정해 주세요 최저시급 인상 반대하던 의원들부터 최저시급으로 책정해주시고 최저시급으로 일하는 노동... 1 0 0
89188 101349 2018-01-18 2018-02-17 1 212992 문화/예술/체육/언론 포털사이트 ‘네이버’에 대한 철저한 수사가 필요합니다. 현재 대한민국에서 언론에 대한 불신이 너무 팽배합니다.\n국민들은 속칭 기레기라고 ... 1 0 0
91882 105105 2018-01-20 2018-02-19 1 360905 외교/통일/국방 나경원 의원 평창올림픽 위원직을 파면시켜주세요 안녕하세요. 청와대에 청원은 처음해 보는 경험인지라 조금은 어색하고 뭐라 말을 시작... 1 0 0
98134 113699 2018-01-25 2018-02-24 1 235167 안전/환경 일간베스트 저장소(일베) 사이트 폐쇄를 요청합니다 거론된 사이트는 정치적이거나 사회적으로 이슈된 모든 현안들에 대해 허위날조된 정보를... 1 0 0
106657 127921 2018-02-05 2018-03-07 1 252969 보건복지 정형식 판사에 대해서 이 판결과 그 동안 판결에 대한 특별 감사를 청원합니다!!! 국민의 돈인 국민 연금에 손실을 입힌 범죄자의 구속을 임의로 풀어준\n정형식 판사에... 1 0 0
112158 134590 2018-02-08 2018-03-10 1 207772 경제민주화 경제민주화 김상조 공정거래위원장이 경제정의 구현을 위한 정책들에 대해서 적극적인 지지를 보냅... 1 0 0
117927 141333 2018-02-17 2018-03-19 1 208522 문화/예술/체육/언론 연극인 이윤택씨의 상습 성폭행, 성폭력 피의사실에 대한 철저한 진상규명과 조사를 촉... < 연극인 이윤택씨의 상습 성폭행 및 성폭력 피의사실 의혹에 대해 다음과 같은 청원... 1 0 0
118970 142600 2018-02-19 2018-03-21 1 614127 문화/예술/체육/언론 김보름, 박지우 선수의 자격박탈과 적폐 빙상연맹의 엄중 처벌을 청원합니다 오늘 여자 단체전 팀추월에서 김보름, 박지우 선수는 팀전인데도 불구하고 개인의 영달... 1 0 0
124216 148613 2018-02-23 2018-03-25 1 217054 육아/교육 미혼모를 위한 히트 앤드 런 방지법을 만들어주세요. #GIRLS_CAN_DO_ANY... #GIRLS_CAN_DO_ANYTHING\n1. 현황 및 문제점\n2005년부터 생... 1 0 0
124397 148806 2018-02-23 2018-03-25 1 242687 인권/성평등 조두순 사건의 피해자 가족을 우롱하는 윤서인을 처벌해주십시오 '윤서인'이라는 만화가가 조두순 사건을 인용하여 정치상황을 풍자하는 만화를 그렸는데... 1 0 0
126532 151430 2018-02-26 2018-03-28 1 235796 인권/성평등 고 장자연의 한맺힌 죽음의 진실을 밝혀주세요. 힘없고 빽없는 사람이\n사회적 영향력 금권 기득권으로\n꽃다운 나이에\n한 많은 ... 1 0 0
131327 157046 2018-03-03 2018-04-02 1 222770 인권/성평등 단역배우 자매 자살 사건 제발 재조사를 해주세여. http://news.naver.com/main/read.nhn?mode=LSD&m... 1 0 0
164274 203181 2018-04-17 2018-05-17 1 302082 행정 다산신도시 실버택배 비용은 입주민들의 관리비로 충당해야합니다. 다산신도시 입주민들이 택배원 대상으로 갑질을 저질러 사회적으로 큰 물의를 빚은 바 ... 1 0 0
183791 230552 2018-05-11 2018-06-10 1 419006 인권/성평등 여성도 대한민국 국민입니다. 성별 관계없는 국가의 보호를 요청합니다. 최근 홍대 누드크로키 모델의 불법촬영 사건이 있었습니다.\n사건은 굉장히 빠르게 처... 1 0 0
186976 235102 2018-05-17 2018-06-16 1 201590 인권/성평등 합정 **** 불법 누드촬영 한 유명 유튜버의 사례\n저는 성범죄 피해자입니다. 꼭 한번만 제 이야기를 들어주세... 1 0 0
209715 270921 2018-06-14 2018-07-14 1 219987 문화/예술/체육/언론 대구 동성로/서울 시청광장 퀴어행사(동성애축제)개최를 반대합니다. 서울 시청/대구 동성로 퀴어행사(동성애축제)개최를 반대합니다.\n대구 6월 23일... 1 0 0
303793 395955 2018-10-02 2018-11-01 1 406655 교통/건축/국토 음주운전 교통사고로 친구 인생이 박살났습니다. 제발 도와주세요 9월 25일 새벽 2시 25분 경, 부산 해운대구 미포 오거리에서 술에 만취한 운전... 1 0 0
305013 397558 2018-10-04 2018-11-03 1 275806 정치개혁 최**과 이하 비슷한 리벤지포르노 범들 강력징역해주세요. 리벤지포르노 징역이라고 네이버에 치면\n제일 먼저 뜨는 기사가 뭔줄 아십니까?\n“... 1 0 0
subset_df_category = subset_df.category.value_counts()
subset_df_count = subset_df_category.to_frame().reset_index()
subset_df_count.columns = ['category','yes']
subset_df_count
category yes
0 인권/성평등 9
1 문화/예술/체육/언론 4
2 보건복지 2
3 정치개혁 2
4 안전/환경 2
5 성장동력 2
6 교통/건축/국토 2
7 미래 1
8 외교/통일/국방 1
9 기타 1
10 육아/교육 1
11 경제민주화 1
12 행정 1
result = pd.merge(subset_df_count, df_20_category,on='category')
result['no'] = result['count'] - result['yes']
result1 = result[['category', 'yes', 'no']]
result1
category yes no
0 인권/성평등 9 15
1 문화/예술/체육/언론 4 3
2 보건복지 2 1
3 정치개혁 2 6
4 안전/환경 2 8
5 성장동력 2 0
6 교통/건축/국토 2 1
7 미래 1 0
8 외교/통일/국방 1 3
9 기타 1 7
10 육아/교육 1 2
11 경제민주화 1 1
12 행정 1 0
ax = result1.plot.bar(x='category',stacked=True)
ax.set_ylabel('answered yes or no')
ax.set_title('답변대상 청원 중 실제로 답변 받은 수 순위')
Text(0.5, 1.0, '답변대상 청원 중 실제로 답변 받은 수 순위')

png

1) 20만건 이상 투표를 받은 ‘답변대상 청원’ 중 실제로 답변을 받은 수는 <인권/성평등>이 가장 많다. <인권/성평등> 분야의 청원이 월등히 많았던 만큼, 답변 받은 수도 많다.

2) <행정>과 <미래> 분야의 청원은 가장 적은 수의 '답변대상 청원'이었지만, 모두 답변되었다.

result['ratio'] = result['yes'] / (result['count'])
result2 = result[['category', 'ratio']]
result2
category ratio
0 인권/성평등 0.375000
1 문화/예술/체육/언론 0.571429
2 보건복지 0.666667
3 정치개혁 0.250000
4 안전/환경 0.200000
5 성장동력 1.000000
6 교통/건축/국토 0.666667
7 미래 1.000000
8 외교/통일/국방 0.250000
9 기타 0.125000
10 육아/교육 0.333333
11 경제민주화 0.500000
12 행정 1.000000
ax = plt.subplots(figsize=(15, 9)) 
ax = sns.barplot(x='category',y='ratio', data=result2)
ax.set_ylabel('answered ratio')
ax.set_title('답변대상 청원 중 실제로 답변 받은 수 비율')
Text(0.5, 1.0, '답변대상 청원 중 실제로 답변 받은 수 비율')

png

1) 20만건 이상 투표를 받은 ‘답변대상 청원’ 중 실제로 답변을 받은 ‘비율’을 살펴보면 <성장동력>과 <미래>, <행정> 분야에서는 모두 답변되었기에 가장 높은 답변 비율을 보인다.

2) 오히려 <인권/성평등>의 답변 비율은 0.5를 넘지 않는 것을 알 수 있다.

<인권/성평등> 분야의 답변대상 청원 요구는 가장 많았지만 답변 비율은 하위에 속하는 만큼, 이에 대한 대응이 필요하다 볼 수 있겠다.

3. ‘답변대상 청원’ 중 투표는 어느 분야가 가장 많이 받았는가?

answered_df = df.loc[df['answer'] == 1]
answered_df.sort_values('votes', ascending=False).head(5) #답변 대상 청원 중 투표를 가장 많이 받은 것; 강서구 피시방 살인사건
article_id start end answered votes category title content answer no_answer answer_diff
313314 408609 2018-10-17 2018-11-16 0 1192049 안전/환경 강서구 피시방 살인 사건. 또 심신미약 피의자입니다. 2018년 10월 14일 엊그제 일어난 강서구 피시방 살인사건에 대한 청원입니다.\... 1 0 1
208597 269548 2018-06-13 2018-07-13 0 714875 외교/통일/국방 제주도 불법 난민 신청 문제에 따른 난민법, 무사증 입국, 난민신청허가 폐지/개헌 ... 2012년 난민법 제정으로 인해 외국인은 한달 무비자로 입국할 수 있으나 난민신청자... 1 0 1
10894 10949 2017-09-06 2017-12-05 1 615354 미래 조두순 출소반대 제발 조두순 재심다시해서 무기징역으로 해야됩니다!!! 1 0 0
118970 142600 2018-02-19 2018-03-21 1 614127 문화/예술/체육/언론 김보름, 박지우 선수의 자격박탈과 적폐 빙상연맹의 엄중 처벌을 청원합니다 오늘 여자 단체전 팀추월에서 김보름, 박지우 선수는 팀전인데도 불구하고 개인의 영달... 1 0 0
183791 230552 2018-05-11 2018-06-10 1 419006 인권/성평등 여성도 대한민국 국민입니다. 성별 관계없는 국가의 보호를 요청합니다. 최근 홍대 누드크로키 모델의 불법촬영 사건이 있었습니다.\n사건은 굉장히 빠르게 처... 1 0 0
k = answered_df.groupby(answered_df['category']).sum('votes')
kk = k.sort_values('votes', ascending=False).reset_index()
kkk = kk[['category','votes']]
kkk
category votes
0 인권/성평등 6345077
1 안전/환경 3206169
2 정치개혁 2147763
3 기타 2104193
4 문화/예술/체육/언론 1937133
5 외교/통일/국방 1585690
6 반려동물 867561
7 육아/교육 852295
8 교통/건축/국토 842498
9 보건복지 749906
10 미래 615354
11 성장동력 483849
12 경제민주화 450058
13 행정 302082
ax = plt.subplots(figsize=(15, 9)) 
ax = sns.barplot(x='category',y='votes', data=kkk)
ax.set_ylabel('total votes of answer')
ax.set_title('답변대상 청원 중 가장 많은 투표를 받은 분야는?')
Text(0.5, 1.0, '답변대상 청원 중 가장 많은 투표를 받은 분야는?')

png

1) ‘답변대상 청원’ 중 <인권/성평등> 분야의 투표 총합이 가장 높다. 이어서 답변 대상 청원 중 투표를 가장 많이 받은; 강서구 피시방 살인사건이 속한 <안전/환경> 분야가 ‘답변대상 청원’ 중 두 번째로 투표 수가 많다.

2) ‘답변대상 청원’ 수가 가장 적었던 <행정> 분야에서, '답변대상 청원' 투표 총합도 가장 낮다.

4. 어느 분야에서 청원이 가장 많이 들어왔는가?

category = pd.DataFrame(df['category'].value_counts()).reset_index()
category.columns = ['category', 'counts']
category #어느 분야의 청원이 가장 많이 들어왔는지; 정치개혁
category counts
0 정치개혁 62750
1 기타 48682
2 인권/성평등 34993
3 안전/환경 30638
4 교통/건축/국토 28184
5 외교/통일/국방 26626
6 육아/교육 25537
7 보건복지 24848
8 일자리 23225
9 행정 20268
10 문화/예술/체육/언론 18207
11 미래 18000
12 경제민주화 16793
13 성장동력 7253
14 반려동물 4057
15 저출산/고령화대책 3584
16 농산어촌 1902
ax = plt.subplots(figsize=(15, 9)) 
ax = sns.barplot(x='category',y='counts', data=category)
ax.set_ylabel('total petitions')
ax.set_title('가장 많은 청원을 받은 분야는?')
Text(0.5, 1.0, '가장 많은 청원을 받은 분야는?')

png

1) 가장 많은 청원을 받은 분야는 <정치개혁> 분야이다. 이를 통해 <정치개혁>은 청원을 가장 많이 받았지만, 20만 건 이상 받은 청원은 가장 많지 않은 것으로 보아 투표가 분산되어 있음을 알 수 있다.

2) 가장 적은 청원을 받은 분야는 <농산어촌> 분야였다.

5. 날짜별 청원 수 시계열 그래프

start_df = pd.DataFrame(df['start'].value_counts()).reset_index()
start_df.columns = ['start', 'counts']
start_df = start_df.sort_values('counts', ascending=False)
print('청원 집계: {}일'.format(start_df.shape[0]))
start_df.head() #청원이 가장 많이 들어 온 날; 2017-11-11
청원 집계: 535일
start counts
0 2017-11-11 9623
1 2017-09-05 5952
2 2018-01-11 3368
3 2018-02-06 2631
4 2017-11-09 2487
time = start_df.sort_values('start')
time1 = time.set_index('start')
time1
counts
start
2017-08-19 39
2017-08-20 88
2017-08-21 89
2017-08-22 69
2017-08-23 80
... ...
2019-01-31 994
2019-02-01 879
2019-02-02 522
2019-02-03 472
2019-02-04 387

535 rows × 1 columns

time1['counts'].plot(title = '날짜별 청원 수')
<AxesSubplot:title={'center':'날짜별 청원 수'}, xlabel='start'>

png

2017-08-19부터 2019-02-04까지 날짜별 청원 수를 나타낸 시계열 그래프이다. 위 그래프에서 청원 수가 거의 10000에 가까운, 가장 큰 지점이 청원이 가장 많이 들어 온 날; 2017-11-11임을 알 수 있다.

m = df.set_index('start')
m.loc['2017-11-11']
article_id end answered votes category title content answer no_answer answer_diff
start
2017-11-11 31383 2017-12-11 0 1 정치개혁 이명박 출국금지 이명박 출국금지\n조속한 구속수사 0 1 0
2017-11-11 31384 2017-12-11 0 3 인권/성평등 조두순 출소 금지 조두순의 출소금지 특별법 제정을 촉구 합니다. 0 1 0
2017-11-11 31386 2017-12-11 0 39 정치개혁 이명박 출국금지 정의가 바로 선 나라를 만들기 위해 꼭...! 0 1 0
2017-11-11 31387 2017-12-11 0 2 정치개혁 이명박출국금지시켜라 명박이을출국금지시키고 수사하라 0 1 0
2017-11-11 31388 2017-12-11 0 1 정치개혁 이명박출국금지시켜라 명박이을출국금지시키고 수사하라 0 1 0
... ... ... ... ... ... ... ... ... ... ...
2017-11-11 41068 2017-12-11 0 0 정치개혁 이명박 출금 MB 출금 0 1 0
2017-11-11 41069 2017-12-11 0 2 정치개혁 이명박 전대통령 출국금지 청원 수사대상이 될 인물이 출국하면 안 되겠지요. 0 1 0
2017-11-11 41070 2017-12-11 0 2 기타 이명박 출국금지 죄갑을 치루고 출국 0 1 0
2017-11-11 41072 2017-12-11 0 0 정치개혁 이명박을 구속 수사 해주세요 이명박을 출국 금지 시켜주세요\n정말 나라가 나라가 아니었던 것에 대한 큰 역할을 ... 0 1 0
2017-11-11 41073 2017-12-11 0 0 정치개혁 이명박 출국금지 그리고 구속수사를 요청 이명박 출국금지 그리고 구속수사를 요청함. 0 1 0

9623 rows × 10 columns

mm = m.loc['2017-11-11']
mm.category.value_counts()
정치개혁           7961
기타              865
미래              170
인권/성평등          154
안전/환경           128
외교/통일/국방         61
행정               59
경제민주화            47
육아/교육            46
일자리              25
반려동물             24
보건복지             20
문화/예술/체육/언론      19
교통/건축/국토         16
성장동력             15
저출산/고령화대책         7
농산어촌              6
Name: category, dtype: int64

2017-11-11 당시 <정치개혁> 분야에서 무려 7961건에 해당하는 청원이 제기되었으며, 청원 내용은 '이명박 전 대통령 출국 금지'에 대한 내용이 대부분임을 짐작할 수 있다.

6. ‘전체 청원’ 중 투표는 어느 분야가 가장 많이 받았는가?

petitions_unique = pd.pivot_table(df, index=['category'], aggfunc=np.sum)
petitions_best = petitions_unique.sort_values(by='votes', \
                                              ascending=False).reset_index()
petitions_best #투표를 가장 많이 받은 분야; 인권/성평등
category answer answer_diff answered article_id no_answer votes
0 인권/성평등 24 15 9 7963154504 34969 12559348
1 안전/환경 10 8 2 7529327085 30628 6605175
2 정치개혁 8 6 2 14675522264 62742 6205013
3 기타 8 7 1 12225143856 48674 5190468
4 육아/교육 3 2 1 5822857976 25534 4475297
5 보건복지 3 1 2 6589637853 24845 4341211
6 문화/예술/체육/언론 7 3 4 4427495546 18200 4149796
7 외교/통일/국방 4 3 1 6869752323 26622 3696112
8 교통/건축/국토 3 1 2 8551310963 28181 2902330
9 반려동물 4 4 0 1033826398 4053 2066624
10 행정 1 0 1 5124064571 20267 1957460
11 경제민주화 2 1 1 4529147196 16791 1739580
12 일자리 0 0 0 6505177516 23225 1180778
13 미래 1 0 1 4449417157 17999 1140693
14 성장동력 2 0 2 1795132547 7251 871837
15 저출산/고령화대책 0 0 0 913203527 3584 178455
16 농산어촌 0 0 0 518987986 1902 118871
i = petitions_best[['category', 'votes']]
i
category votes
0 인권/성평등 12559348
1 안전/환경 6605175
2 정치개혁 6205013
3 기타 5190468
4 육아/교육 4475297
5 보건복지 4341211
6 문화/예술/체육/언론 4149796
7 외교/통일/국방 3696112
8 교통/건축/국토 2902330
9 반려동물 2066624
10 행정 1957460
11 경제민주화 1739580
12 일자리 1180778
13 미래 1140693
14 성장동력 871837
15 저출산/고령화대책 178455
16 농산어촌 118871
ax = plt.subplots(figsize=(15, 9)) 
ax = sns.barplot(x='category',y='votes', data=i)
ax.set_ylabel('total votes')
ax.set_title('투표를 가장 많이 받은 분야는?')
Text(0.5, 1.0, '투표를 가장 많이 받은 분야는?')

png

1) ‘전체 청원’ 중에서도 <인권/성평등> 분야의 투표 총합이 가장 높다. 이어서 답변 대상 청원 중 투표를 가장 많이 받은; 강서구 피시방 살인사건이 속한 <안전/환경> 분야도 ‘전체 청원’ 중 두 번째로 투표 수가 많다.

2) 가장 적은 청원을 받은 분야였던 <농산어촌> 분야에서, '전체 청원' 투표 총합도 가장 낮다.

7. 날짜별 투표 수 시계열 그래프

petitions_start = pd.pivot_table(df, index=['start'], aggfunc=np.sum)
votes_df = petitions_start.sort_values(by='votes', ascending=False)
votes_df.loc[petitions_start['votes'] > 350000] #투표를 가장 많이 받은 날; 2018-10-17
answer answer_diff answered article_id no_answer votes
start
2018-10-17 1 1 0 378900198 925 1300523
2018-10-31 2 2 0 430964099 1008 827096
2018-06-13 1 1 0 146187973 541 786157
2018-10-18 2 2 0 423557789 1030 721524
2018-02-19 1 0 1 99332898 697 701520
2018-11-09 2 2 0 349439392 797 672819
2018-07-22 1 1 0 282639463 897 672491
2017-09-06 1 0 1 22268570 2120 648209
2018-06-24 2 2 0 359345089 1270 628925
2018-10-04 2 1 1 290746555 729 626761
2018-02-23 2 0 2 168561151 1133 608530
2018-05-18 1 1 0 190599564 805 574483
2018-05-11 1 0 1 119082098 516 556549
2019-01-29 2 2 0 409753872 800 550474
2018-05-25 2 2 0 217699031 892 514253
2018-11-14 1 1 0 341163199 771 469027
2018-06-17 2 2 0 158887091 580 468341
2018-07-03 1 1 0 247788786 841 467132
2018-04-17 1 0 1 232499699 1144 446950
2018-05-02 1 1 0 204023320 929 445493
2018-10-02 1 0 1 326518258 824 437841
2017-09-03 1 0 1 404415 229 433356
2018-06-14 1 0 1 204240095 754 403351
2018-01-20 1 0 1 99071361 939 399683
2017-11-17 1 0 1 23752225 520 393348
2017-11-24 1 0 1 80814983 1624 392782
2018-12-07 1 1 0 394821243 852 387305
2018-03-24 1 1 0 96422371 553 385480
2018-09-06 1 1 0 381171515 1032 383145
2018-03-03 1 0 1 94454042 601 380016
2018-01-15 1 0 1 106053634 1105 376187
2018-04-16 1 1 0 168625159 835 369318
2018-01-25 1 0 1 129153668 1139 364926
2019-01-07 1 1 0 312286224 637 352139
time2 = votes_df.sort_values('start')
time3 = time2[['votes']]
time3
votes
start
2017-08-19 20703
2017-08-20 31710
2017-08-21 1884
2017-08-22 2607
2017-08-23 13446
... ...
2019-01-31 52267
2019-02-01 44175
2019-02-02 23983
2019-02-03 41556
2019-02-04 14234

535 rows × 1 columns

time3['votes'].plot(title = '날짜별 투표 수')
<AxesSubplot:title={'center':'날짜별 투표 수'}, xlabel='start'>

png

2017-08-19부터 2019-02-04까지 날짜별 청원 수를 나타낸 시계열 그래프이다. 위 그래프에서 투표 수가 가장 높은 지점이 바로 2018-10-17임을 알 수 있다.

n = df.set_index('start')
n.loc['2018-10-17']
article_id end answered votes category title content answer no_answer answer_diff
start
2018-10-17 408596 2018-11-16 0 52 일자리 공무원 비정규직의 정규직 전환 방침, 전면 재검토해주세요. 지금 진행되고 있는 공공분야(공무원, 공사, 공공기관,...)에서의 계약직 직원을 ... 0 1 0
2018-10-17 408597 2018-11-16 0 238 인권/성평등 아동권리와 교사 권리를 동등하게 해주세요 현재 김포 어린이집 교사 자살사건과 관련해 청원글을 올립니다.\n만약 지금 죽음의 ... 0 1 0
2018-10-17 408598 2018-11-16 0 14 육아/교육 특수학교 및 일반학교 특수학급 cctv 설치 의무화 특수학교 및 일반학교 특수학급 cctv 설치 의무화해야합니다. 이번 폭행사건 뿐만 ... 0 1 0
2018-10-17 408599 2018-11-16 0 6 육아/교육 원주 oo 어린이집 3살혀 다짤릴뻔 보험사언과연계 10년이 다돼서 보상받음 아들둘 키우고 있습니다.10년이 넘은 예기를 하고자합니다.어려운 가정 형편에 국공립... 0 1 0
2018-10-17 408601 2018-11-16 0 49 교통/건축/국토 주택소유이력이 있는 신혼부부만 특별 공급 제외는 부당합니다. 저는 부산에서 두자녀를 키우며 외벌이를 하고 있는 소득기준 100% 이내의 흙수저 ... 0 1 0
... ... ... ... ... ... ... ... ... ... ...
2018-10-17 409778 2018-11-16 0 1 기타 삼청교육대학 설립추진 삼청교육대학 개강중에는 그많던 깡패들이 없어졌어요.재판시 사회봉사 명령보다는 삼청교... 0 1 0
2018-10-17 409779 2018-11-16 0 2 정치개혁 김지수 음주운전에 관련한 법을 만들어 주세요. 배우 김지수가 얼마나 유명한지 모르겠지만...\n음주사고로 고통 주는 가해자와 음주... 0 1 0
2018-10-17 409781 2018-11-16 0 37 정치개혁 꼭들어주세요 부탁드립니다 지금이라도 늦지않았습니다\n제발 난민 취소해주세요\n안전한 나라에서 살고싶습니다 0 1 0
2018-10-17 409782 2018-11-16 0 10 문화/예술/체육/언론 온라인 암표상도 오프라인 암표상 같이 처벌 원합니다! 언제부터 온라인으로 표사서\n실 구매자에게 비싸게 파는 행위가\n재테크가 된건가요?... 0 1 0
2018-10-17 409784 2018-11-16 0 47 저출산/고령화대책 대한민국에서의 동성애를 법적으로 금지해주세요 현재 저출산 고령화사화인데, 동성애를 합법으로 받아들이고, 퀴어축제 같은 축제들을 ... 0 1 0

926 rows × 10 columns

nn = n.loc['2018-10-17']
nn.sort_values('votes', ascending=False).head()
article_id end answered votes category title content answer no_answer answer_diff
start
2018-10-17 408609 2018-11-16 0 1192049 안전/환경 강서구 피시방 살인 사건. 또 심신미약 피의자입니다. 2018년 10월 14일 엊그제 일어난 강서구 피시방 살인사건에 대한 청원입니다.\... 1 0 1
2018-10-17 408989 2018-11-16 0 53615 인권/성평등 유흥탐정. 데이터베이스 성매매남성 조사합시다. 성매매는 불법입니다.\n이번에 유흥탐정 운영자 구속되었다고 하던데\n업주들만 쓴다는... 0 1 0
2018-10-17 409477 2018-11-16 0 5831 육아/교육 영양교사 제도를 폐지하고 본래의 식품위생직 공무원 선발로 환원해 주시기 바랍니다. 청원에 앞서 학교에서 따뜻하게 밥 한 끼를 만들어주시는 급식종사자 여러분들 그리고 ... 0 1 0
2018-10-17 408759 2018-11-16 0 4611 외교/통일/국방 [긴급]피지에 있는 400여명을 살려 주세요 제발 도와주십시오.\n피지에서 현대판 노예생활을 하고 있는 400여명을 제발 구해주... 0 1 0
2018-10-17 408885 2018-11-16 0 3484 외교/통일/국방 *(긴급)제주 예맨 난민 339명 인도적체류 허가, 이게 정부냐 결국엔 모두 인도체류로 출도해제로 전국 어디로 갈수 있게 만들었다\n정부는... 0 1 0

2018-10-17 당시 <안전/환경> 분야에서 무려 1192049건의 투표를 받았으며, 이는 역대 가장 많은 투표를 받았던 ‘강서구 피시방 살인 사건’에 대한 청원이다.

8. 청원을 많이 받은 날 VS 투표를 많이 받은 날

votes_df = votes_df.reset_index()
hottest_day_df = start_df.merge(votes_df, on='start', how='left')
hottest_day_df.sort_values('counts', ascending=False)[:5] #청원을 많이 받은 날 상위 5개 목록
start counts answer answer_diff answered article_id no_answer votes
0 2017-11-11 9623 0 0 0 348559310 9623 85074
1 2017-09-05 5952 0 0 0 38414241 5952 48808
2 2018-01-11 3368 0 0 0 291069195 3368 44570
3 2018-02-06 2631 0 0 0 342371897 2631 83038
4 2017-11-09 2487 0 0 0 73459579 2487 34774
hottest_day_df.sort_values('votes', ascending=False)[:5] #투표를 많이 받은 날 상위 5개 목록
start counts answer answer_diff answered article_id no_answer votes
116 2018-10-17 926 1 1 0 378900198 925 1300523
81 2018-10-31 1010 2 2 0 430964099 1008 827096
384 2018-06-13 542 1 1 0 146187973 541 786157
72 2018-10-18 1032 2 2 0 423557789 1030 721524
270 2018-02-19 698 1 0 1 99332898 697 701520

9. 청원이 가장 많이 들어온 달 / 일 / 요일 ?

import datetime
df['start_month'] = df['start'].dt.month
df['start_day'] = df['start'].dt.day
df['start_hour'] = df['start'].dt.hour
df['start_dow'] = df['start'].dt.dayofweek
df
article_id start end answered votes category title content answer no_answer answer_diff start_month start_day start_hour start_dow
0 21 2017-08-19 2017-11-17 0 9 안전/환경 스텔라 데이지호에 대한 제안입니다. 스텔라 데이지호에 대한 제안입니다.\n3월31일 스텔라 데이지호가 침몰하고 5달째가... 0 1 0 8 19 0 5
1 22 2017-08-19 2017-11-17 0 17 기타 비리제보처를 만들어주세요. 현 정부에 국민들이 가장 원하는 것은 부패척결입니다. 우리 사회에 각종 비리들이 ... 0 1 0 8 19 0 5
2 23 2017-08-19 2017-09-03 0 0 미래 제2의 개성공단 만일 하시는 대통령님 및 각 부처 장관님,주무관님들 안녕하세요!!\n전남 목포에서 ... 0 1 0 8 19 0 5
3 24 2017-08-19 2017-08-26 0 53 일자리 공공기관 무조건적인 정규직전환을 반대합니다. 현정부에서 정규직 일자리를 늘리는 것에 찬성합니다. 그런데 공공기관 비정규직들은 인... 0 1 0 8 19 0 5
4 25 2017-08-19 2017-09-03 0 0 미래 제2의 개성공단 만일 하시는 대통령님 및 각 부처 장관님,주무관님들 안녕하세요!!\n전남 목포에서 ... 0 1 0 8 19 0 5
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
395542 517117 2019-02-04 2019-03-06 0 3 보건복지 명절연휴 고속도로 무료반대 명절고속도로 무료보단 대다수의 서민들이 이용하는 대중교통 무료와 명절기간 증차로 했... 0 1 0 2 4 0 0
395543 517119 2019-02-04 2019-03-06 0 23 보건복지 광주사태 가짜 유공자들 정수기로 걸려내야함 광주사태 유공자들 차고 넘치는데 이래 많은 유공자들 그냥놓아두면 재앙이다.\n김대중... 0 1 0 2 4 0 0
395544 517120 2019-02-04 2019-03-06 0 0 안전/환경 환경문제 명절이면 후로 제일문제는 쓰레기 문제 입니다.\n제일문제는 선물세트와 농산물세트 입... 0 1 0 2 4 0 0
395545 517121 2019-02-04 2019-03-06 0 20 정치개혁 청화대,더불어민주당, 당장 답하라,,,,,, 좌파 더불어민주당, 좌파 정권 청화대는 선한 국민들을 더는 기망하지 말고 담장 답하... 0 1 0 2 4 0 0
395546 517122 2019-02-04 2019-03-06 0 16 인권/성평등 여성부 폐지 국민들이 원합니다\n폐지 좀 시키세요; 0 1 0 2 4 0 0

395547 rows × 15 columns

month_df = pd.DataFrame(df['start_month'].value_counts()).reset_index()
month_df.columns = ['start_month', 'counts']
month_df = month_df.sort_values('start_month', ascending=True)
month_df
start_month counts
0 1 52941
6 2 28117
11 3 21795
10 4 23227
8 5 25499
9 6 25483
7 7 25714
5 8 28851
2 9 40888
4 10 31687
1 11 52847
3 12 38498
ax = plt.subplots(figsize=(15, 9)) 
ax = sns.barplot(x='start_month',y='counts', data=month_df)
ax.set_ylabel('total petitions')
ax.set_title('청원이 가장 많이 들어온 달은?')
Text(0.5, 1.0, '청원이 가장 많이 들어온 달은?')

png

1) 청원이 가장 많이 들어온 달은 1월이다. 몇 십개 차이로 11월은 청원이 두 번째로 많이 들어온 달이다.

2) 반면 청원이 가장 적게 들어온 달은 3월이다.

day_df = pd.DataFrame(df['start_day'].value_counts()).reset_index()
day_df.columns = ['start_day', 'counts']
day_df = day_df.sort_values('start_day', ascending=True)
day_df
start_day counts
24 1 11766
25 2 11730
18 3 12270
9 4 12717
1 5 17307
2 6 14766
15 7 12489
16 8 12297
5 9 13107
28 10 11412
0 11 22689
3 12 13983
22 13 11938
29 14 11071
26 15 11524
27 16 11473
19 17 12185
10 18 12679
17 19 12278
11 20 12638
12 21 12530
7 22 12868
6 23 13039
4 24 13461
20 25 11972
14 26 12507
21 27 11947
8 28 12745
23 29 11799
13 30 12524
30 31 7836
ax = plt.subplots(figsize=(15, 9)) 
ax = sns.barplot(x='start_day',y='counts', data=day_df)
ax.set_ylabel('total petitions')
ax.set_title('청원이 가장 많이 들어온 일은?')
Text(0.5, 1.0, '청원이 가장 많이 들어온 일은?')

png

1) 청원이 가장 많이 들어온 일은 11일이 독보적으로 많다.

2) 반면 청원이 가장 적게 들어온 일은 31일이다. 아무래도 31일은 1월, 3월, 5월, 7월, 8월, 10월, 12월에만 있으므로 이러한 결과가 나온 것이라고 유추할 수 있다.

dow_df = pd.DataFrame(df['start_dow'].value_counts()).reset_index()
dow_df.columns = ['start_dow', 'counts']
dow_df = dow_df.sort_values('start_dow', ascending=True)
dow_df #일(0), 월(1), 화(2), 수(3), 목(4), 금(5), 토(6)
start_dow counts
4 0 54234
0 1 65229
2 2 61966
1 3 63072
3 4 56646
5 5 50984
6 6 43416
ax = plt.subplots(figsize=(15, 9)) 
ax = sns.barplot(x='start_dow',y='counts', data=dow_df)
ax.set_ylabel('total petitions')
ax.set_title('청원이 가장 많이 들어온 요일은?')
Text(0.5, 1.0, '청원이 가장 많이 들어온 요일은?')

png

1) 청원이 가장 많이 들어온 요일은 월요일이다. 주말이 지나고 월요일에 본격적으로 한 주가 시작되어 새로운 뉴스와 기사가 보도되곤 하므로, 이를 짐작해볼 수 있다.

2) 반면 청원이 가장 적게 들어온 일은 토요일이다. 월요일에서부터 토요일까지 청원 수가 점진적으로 감소하는 추세를 볼 수 있다.