1 데이터

위키백과 대한민국 정당 지지율 웹사이트에서 대선 직전 정당 지지율 데이터를 가져온다.

1.1 제19대

19대 대통령 대선일은 2017-05-09 일 이전 조사한 정당지지율 데이터를 가져온다.

library(tidyverse)
library(rvest)

# Sys.setlocale("LC_ALL", "C")
# 
# party_html <- read_html("https://ko.wikipedia.org/wiki/대한민국의_정당_지지율")
# 
# party_data <- party_html %>% 
#   html_node(xpath = '//*[@id="mw-content-text"]/div[1]/div[9]/div[2]/table') %>% 
#   html_table(fill = TRUE)
# 
# Sys.setlocale("LC_ALL", "Korean")
# 
# party_data %>%
#   write_rds("data/party_data.rds")

party_data <- read_rds("data/party_data.rds")

party_19_tbl <- party_data %>% 
  janitor::clean_names(ascii = FALSE) %>% 
  filter(str_detect(조사_기간, "2017년 5월 2주")) %>% 
  select(조사_기간, 민주당=더불어민주당, 새누리당, 국민의당, 바른정당=정의당, 정의당=na)
  
party_19_tbl
       조사_기간 민주당 새누리당 국민의당 바른정당 정의당
1 2017년 5월 2주  35.0%    15.0%    14.0%     8.0%   8.0%

1.2 제18대

제 18대 대통령 선거는 2012-12-19 로 이전 가장 가까운 갤럽 조사결과를 가져온다. Gallup에서 조사결과를 PDF 파일로 다운로드 받아 이를 직접 입력한다. 조사 날짜는 “2012년 12월 3일” 이다.

party_18_tbl <- tribble(~"조사_기간", ~"새누리당", ~"민주통합당", ~"진보정의당", ~"통합진보당", ~"모름/없음",
        "2012년 12월 3일", "39%",  "30%", "1%", "2%", "27%")

party_18_tbl
# A tibble: 1 x 6
  조사_기간       새누리당 민주통합당 진보정의당 통합진보당 `모름/없음`
  <chr>           <chr>    <chr>      <chr>      <chr>      <chr>      
1 2012년 12월 3일 39%      30%        1%         2%         27%        

1.3 제17대

제 17대 대통령 선거는 2007-12-19 로 이전 가장 가까운 갤럽 조사결과를 가져온다. Gallup에서 조사결과를 PDF 파일로 다운로드 받아 이를 직접 입력한다. 구글 검색을 통해 정당 지지율에 대한 2007년 데이터를 구할 수 없어 한겨레 신문사에서 민주, 4년8개월만에 한나라에 지지율 앞서으로 갈음한다.

2 제20대 정당지지율

위키백과사전 대한민국의 정당 지지율 웹사이트에서 정당지지율 데이터를 가져온다.

library(tidyverse)
library(rvest)

Sys.setlocale("LC_ALL", "C")

wiki_party_html <- read_html("https://ko.wikipedia.org/wiki/대한민국의_정당_지지율")

party_dat <- wiki_party_html %>% 
  html_node(xpath =  '//*[@id="mw-content-text"]/div[1]/table') %>% 
  html_table(header = TRUE, fill = TRUE)

Sys.setlocale("LC_ALL", "Korean")

party_tbl <- party_dat %>% 
  janitor::clean_names(ascii = FALSE) %>% 
  slice(2:n()) %>% 
  as_tibble()

realm_tbl <- party_tbl %>% 
  select(`조사_기간`, ends_with("2")) %>% 
  mutate(조사기관 = "리얼미터") %>% 
  pivot_longer(더불어민주당_2:시대전환_2, names_to = "정당", values_to = "지지율")

gallup_tbl <- party_tbl %>% 
  select(`조사_기간`, !ends_with("2")) %>% 
  mutate(조사기관 = "갤럽") %>% 
  pivot_longer(더불어민주당:시대전환, names_to = "정당", values_to = "지지율")

party_survey_tbl <- bind_rows(realm_tbl, gallup_tbl) %>% 
  mutate(정당 = str_remove(정당, "_[0-9]")) %>% 
  mutate(지지율 = str_remove(지지율, pattern = "미조사\\[[0-9]{1,2}\\]")) %>% 
  mutate(지지율 = parse_number(지지율)) %>% 
  mutate(조사년 = str_extract(조사_기간, "[0-9]{4}") %>% parse_number,
         조사월 = str_extract(조사_기간, "(?<=년\\s).*?(?=월)") %>% parse_number,
         조사주 = str_extract(조사_기간, "(?<=월\\s).*?(?=주)") %>% parse_number) %>% 
  mutate(조사일 = 조사주 * 7 - 6) %>% 
  mutate(조사기간 = lubridate::make_date(year = 조사년, month = 조사월, day = 조사일)) %>% 
  filter(! 정당 %in% c("시대전환", "기본소득당")) %>% 
  group_by(조사기관, 정당) %>%
  arrange(조사기간) %>%
  mutate(지지율 = imputeTS::na_interpolation(지지율)) %>% 
  select(조사기간, 조사기관, 정당, 지지율) %>% 
  ungroup() %>% 
  mutate(정당 = factor(정당, levels = c("더불어민주당", "국민의힘", "국민의당", "열린민주당", "정의당")))

party_survey_tbl %>% 
  write_rds("data/party_survey_tbl_20210921.rds")

2.1 갤럽

party_survey_tbl  <- read_rds("data/party_survey_tbl_20210921.rds")

party_survey_tbl %>% 
  pivot_wider(names_from = 정당, values_from = 지지율) %>% 
  filter(조사기관 == "갤럽") %>% 
  arrange(desc(조사기간)) %>% 
  reactable::reactable()

2.2 리얼미터

party_survey_tbl %>% 
  pivot_wider(names_from = 정당, values_from = 지지율) %>% 
  filter(조사기관 == "리얼미터") %>% 
  arrange(desc(조사기간)) %>% 
  reactable::reactable()

2.3 시각화

깔끔한 형태 데이터로 정리한 후에 이를 ggplot으로 시각화해보자.

party_survey_tbl %>% 
  mutate(지지율 = 지지율 / 100) %>% 
  ggplot(aes(x=조사기간, y= 지지율, color = 정당)) +
    geom_line() +
    geom_point() +
    facet_wrap(~조사기관) +
    scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
    scale_x_date(date_labels = "%y년%m월") +
    theme_bw(base_family = "NanumGothic") +
    scale_colour_manual(name="",
                      values=c(더불어민주당="#065ce8", 
                               국민의힘="#ff0000",
                               국민의당="#EA5508",
                               열린민주당="#FCC800",
                               정의당="#f2ee09")) +
   labs(x = "", 
        y = "정당지지율(%)",
        title = "제20대 대통령선거 전 정당지지율",
        subtitle = "2021년 9월 21일 기준",
        caption = "자료: 위키백과, https://ko.wikipedia.org/wiki/대한민국의_정당_지지율") +
    theme(legend.position = "top",
          strip.text.x = element_text(size = 13, colour = "black", family = "NanumMyeongjo", face="bold"),
          strip.background=element_rect(fill="gray95"),
          plot.title=element_text(size=18, face="bold", family = "NanumBarunpen"),
          plot.subtitle=element_text(face="bold", size=13, colour="grey10", family = "NanumBarunpen"))

 

데이터 과학자 이광춘 저작

kwangchun.lee.7@gmail.com