1 매니페스토(Manfesto)

위키백과사전 매니페스토(Manifesto)는 개인이나 단체가 대중에 대하여 확고한 정치적 의도와 견해를 밝히는 것으로 연설이나 문서의 형태로 어원은 라틴어에서 파생된 이탈리아어이며 “분명한 의미”, “매우 뚜렷함”이라는 의미를 갖는다. 중요한 매니페스토들로 미국 독립선언서에 영향을 준 벨기에 독립선언서 “the Manifesto of the Province of Flanders (1790년)”, 핵과 핵전쟁에 대한 반대를 표명한 “Russell-Einstein Manifesto(러셀-아인슈타인 선언, 1955년)”을 꼽을 수 있다.

한국매니페스토 실천본부는 공약정보센터를 통해서 국회의원, 대통령, 지방자치단체장에 대한 매니페스토 실천이행여부를 점검하고 있다.

2 대상목록 데이터

한국매니페스토 실천본부 제20대 국회의원 공약이행자체평가표(2020년) 웹사이트에서 제20대 국회의원 평가데이터를 다운로드 받는다.

manifesto_url <- "http://www.manifesto.or.kr/manifesto_data/20200210/2020/2020_251.zip"

제20대 국회의원 공약이행자체평가표(2020년) 웹사이트가 깔끔하게 정리되어 있는데 시도별로 나눠줘있다.

webshot2::webshot("http://manifesto.or.kr/manifesto_data/20200210/2020na_map.htm", "fig/manifesto_2020.png")

2.1 특정 시도

먼저 특정시도를 하나 잡아서 이를 데이터프레임으로 만든다.

library(tidyverse)
library(rvest)

manifest_html <- read_html("http://www.manifesto.or.kr/manifesto_data/20200210/20na/01.html")

manifest_tbl <- manifest_html %>% 
  html_nodes("table") %>% 
  html_table(fill=TRUE) %>% 
  .[[1]]

manifest_df <- manifest_tbl %>% 
  janitor::clean_names() %>% 
  tbl_df %>% 
  set_names(manifest_tbl[1,]) %>% 
  slice(2:n())

manifest_df %>% 
  DT::datatable()

2.2 함수

특정시도를 하나 잡아서 이를 데이터프레임을 제작한 다음 이를 함수로 만든다.

get_manifesto_list <- function(sido) {

  manifesto_sido_url <- glue::glue("http://www.manifesto.or.kr/manifesto_data/20200210/20na/{sido}.html")
  manifest_html <- read_html(manifesto_sido_url)

  manifest_tbl <- manifest_html %>% 
    html_nodes("table") %>% 
    html_table(fill=TRUE) %>% 
    .[[1]]
  
  manifest_df <- manifest_tbl %>% 
    janitor::clean_names() %>% 
    tbl_df %>% 
    set_names(manifest_tbl[1,]) %>% 
    slice(2:n())
  
  return(manifest_df)
} 

get_manifesto_list("01") %>% 
  DT::datatable()

2.3 반복

특정시도를 하나 잡아서 이를 데이터프레임을 제작한 다음 이를 함수로 만들게 되면 다음 단계로 for 루프나 purrr 팩키지를 사용해서 전체 시도에 대해 동일한 작업을 반복하여 결과를 얻을 수 있다.

sido_number <- str_pad(1:17, width=2, pad='0')

manifesto_list_df <- map_df(sido_number, get_manifesto_list)

manifesto_list_df %>% 
  DT::datatable()
# manifesto_list_df %>%
  # write_rds("data/manifesto_list_df.rds")

2.4 EDA 분석

-는 국회의원이 없거나 무슨 이유인지 평가정보가 없는 경우다.

manifesto_list_df %>% 
  count(`2020년평가정보`, sort=TRUE, name="건수") %>% 
  mutate(비율 = 건수 / sum(건수)*100) %>% 
  knitr::kable()
2020년평가정보 건수 비율
다운받기 217 85.770751
- 32 12.648221
대상아님 4 1.581028

3 공약이행평가 데이터

앞서 제20대 국회의원 매니페스토 대상 목록을 파악했기 때문에 이를 바탕으로 공약이행자체평가표(2020년)를 다운로드 받는다.

매니페스토 데이터 추출 자동화

3.1 데이터 가져오기

download.file() 함수로 데이터를 가져올 경우 오류가 발생하여 전체 253개 지역구 국회의원에 대한 공약이행자체평가표를 다운로드 받을 수 없어 tryCatch()를 사용해서 오류나는 경우는 화면에 출력하여 넘어가고 정상적인 공약이행자체평가표를 다운로드 받을 수 있도록 작업한다.

# 전체 URL
# for(index in 1:253) {
#   three_digits <- str_pad(index, width=3, pad='0')
#   cat(glue::glue("http://www.manifesto.or.kr/manifesto_data/20200210/2020/2020_{three_digits}.zip"), "\n")  
# }

dir.create("data/manifesto")

for(index in 1:253) {
  three_digits <- str_pad(index, width=3, pad='0')
  tryCatch(
    download.file(url = glue::glue("http://www.manifesto.or.kr/manifesto_data/20200210/2020/2020_{three_digits}.zip"), destfile=glue::glue("data/manifesto/manifesto_{three_digits}.zip")),
    error = function(e) print(glue::glue("다운로드 {three_digits} 파일 없음"))
  )
}

매니페스토 자료구조

3.2 데이터 압축풀기 1

압축파일 압출을 푸는 방법 unzip, 7za 등 쉘에서 압축을 푸는 방법으로 문제를 풀어본다. 이를 위해서 쉘 명령어를 사용한다.

for filename in data/manifesto/*.zip
do
  echo "*** processing $filename ***"
  7za x -y $filename -odata/manifesto
done
ls data/manifesto/ | grep "^2020.*\.hwp$" | tail
2020공약자체평가표_242.정점식.hwp
2020공약자체평가표_244.민홍철.hwp
2020공약자체평가표_245.김정호.hwp
2020공약자체평가표_250.강석진.hwp
2020공약자체평가표_251.강창일.hwp
2020공약자체평가표_252.오영훈.hwp
2020공약자체평가표_253.위성곤.hwp
2020공약자체평가표_별첨자료.hwp
2020공약자체평가표_공약이행근거자료(최종).hwp
2020의정활동결과표(유성엽).hwp