1 대통령 지지율

대통령 지지율 여론조사데이터는 위키백과: 대한민국의 대통령 지지율나무위키, 문재인/지지율에 데이터가 잘 정리되어 있다. 처음 위키백과: 대한민국의 대통령 지지율를 통해 대통령 지지율을 작업했지만, 나무위키 문재인/지지율 데이터가 더 좋은 자료구조로 충실히 정리되어 있다.

2 여론조사 데이터1

위키백과: 대한민국의 대통령 지지율 데이터 자료형태가 바뀌어서 데이터 크롤링 로직은 동일하고 데이터 전처리 과정만 코드를 수정(2019-05-06).

library(tidyverse)
library(rvest)
library(lubridate)

wiki_url <- "https://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EC%9D%98_%EB%8C%80%ED%86%B5%EB%A0%B9_%EC%A7%80%EC%A7%80%EC%9C%A8"

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

moon_dat <- wiki_url %>% 
  read_html() %>% 
  html_nodes(xpath='//*[@id="mw-content-text"]/div[1]/table[1]') %>%
  html_table(fill=TRUE) %>% 
  .[[1]]

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

moon_dat %>%
  janitor::clean_names(ascii = FALSE) %>% 
  set_names(c("날짜1", "갤럽1", "리얼미터1", "날짜2", "갤럽2", "리얼미터2", "날짜3", "갤럽3", "리얼미터3", "날짜4", "갤럽4", "리얼미터4", "날짜5", "갤럽5", "리얼미터5", "날짜6", "갤럽6", "리얼미터6", "날짜7", "갤럽7", "리얼미터7")) %>% 
  filter(row_number() >=4)


moon_part_one_df <- moon_dat %>%
  set_names(c("날짜1", "갤럽1", "리얼미터1", "날짜2", "갤럽2", "리얼미터2", "날짜3", "갤럽3", "리얼미터3", "날짜4", "갤럽4", "리얼미터4", "날짜5", "갤럽5", "리얼미터5", "날짜6", "갤럽6", "리얼미터6", "날짜7", "갤럽7", "리얼미터7")) %>% 
  filter(row_number() >=3) %>% 
  select(`날짜1`, `갤럽1`, `리얼미터1`) %>% 
  filter(! row_number() %in% c(1,2,3)) %>% 
  rename(`날짜` = `날짜1`,
         `갤럽` = `갤럽1`,
         `리얼미터` = `리얼미터1`) %>% 
  mutate(`갤럽` = str_extract(`갤럽`, "^\\d.+\\.\\d") %>% as.numeric) %>% 
  mutate(`리얼미터` = str_extract(`리얼미터`, "^\\d.+\\.\\d") %>% as.numeric)

moon_part_two_df <- moon_dat %>%
  set_names(c("날짜1", "갤럽1", "리얼미터1", "날짜2", "갤럽2", "리얼미터2", "날짜3", "갤럽3", "리얼미터3", "날짜4", "갤럽4", "리얼미터4", "날짜5", "갤럽5", "리얼미터5", "날짜6", "갤럽6", "리얼미터6", "날짜7", "갤럽7", "리얼미터7")) %>% 
  select(`날짜2`, `갤럽2`, `리얼미터2`) %>% 
  filter(row_number() >=3) %>% 
    rename(`날짜` = `날짜2`,
           `갤럽` = `갤럽2`,
           `리얼미터` = `리얼미터2`) %>% 
  filter(! row_number() %in% c(1,2,3)) %>% 
  mutate(`갤럽` = str_extract(`갤럽`, "^\\d.+\\.\\d") %>% as.numeric) %>% 
  mutate(`리얼미터` = str_extract(`리얼미터`, "^\\d.+\\.\\d") %>% as.numeric) %>% 
  filter(!str_detect(`날짜`, "NA"))

moon_part_three_df <- moon_dat %>%
  set_names(c("날짜1", "갤럽1", "리얼미터1", "날짜2", "갤럽2", "리얼미터2", "날짜3", "갤럽3", "리얼미터3", "날짜4", "갤럽4", "리얼미터4", "날짜5", "갤럽5", "리얼미터5", "날짜6", "갤럽6", "리얼미터6", "날짜7", "갤럽7", "리얼미터7")) %>% 
  select(`날짜3`, `갤럽3`, `리얼미터3`) %>% 
  filter(row_number() >=3) %>% 
    rename(`날짜` = `날짜3`,
           `갤럽` = `갤럽3`,
           `리얼미터` = `리얼미터3`) %>% 
  filter(! row_number() %in% c(1,2,3)) %>% 
  mutate(`갤럽` = str_extract(`갤럽`, "^\\d.+\\.\\d") %>% as.numeric) %>% 
  mutate(`리얼미터` = str_extract(`리얼미터`, "^\\d.+\\.\\d") %>% as.numeric) %>% 
  filter(!str_detect(`날짜`, "NA"))

moon_part_four_df <- moon_dat %>%
  set_names(c("날짜1", "갤럽1", "리얼미터1", "날짜2", "갤럽2", "리얼미터2", "날짜3", "갤럽3", "리얼미터3", "날짜4", "갤럽4", "리얼미터4", "날짜5", "갤럽5", "리얼미터5", "날짜6", "갤럽6", "리얼미터6", "날짜7", "갤럽7", "리얼미터7")) %>% 
  select(`날짜4`, `갤럽4`, `리얼미터4`) %>% 
  filter(row_number() >=3) %>% 
    rename(`날짜` = `날짜4`,
           `갤럽` = `갤럽4`,
           `리얼미터` = `리얼미터4`) %>% 
  filter(! row_number() %in% c(1,2,3)) %>% 
  mutate(`갤럽` = str_extract(`갤럽`, "^\\d.+\\.\\d") %>% as.numeric) %>% 
  mutate(`리얼미터` = str_extract(`리얼미터`, "^\\d.+\\.\\d") %>% as.numeric) %>% 
  filter(!str_detect(`날짜`, "NA"))

moon_part_five_df <- moon_dat %>%
  set_names(c("날짜1", "갤럽1", "리얼미터1", "날짜2", "갤럽2", "리얼미터2", "날짜3", "갤럽3", "리얼미터3", "날짜4", "갤럽4", "리얼미터4", "날짜5", "갤럽5", "리얼미터5", "날짜6", "갤럽6", "리얼미터6", "날짜7", "갤럽7", "리얼미터7")) %>% 
  select(`날짜5`, `갤럽5`, `리얼미터5`) %>% 
  filter(row_number() >=3) %>% 
    rename(`날짜` = `날짜5`,
           `갤럽` = `갤럽5`,
           `리얼미터` = `리얼미터5`) %>% 
  filter(! row_number() %in% c(1,2,3)) %>% 
  mutate(`갤럽` = str_extract(`갤럽`, "^\\d.+\\.\\d") %>% as.numeric) %>% 
  mutate(`리얼미터` = str_extract(`리얼미터`, "^\\d.+\\.\\d") %>% as.numeric) %>% 
  filter(!str_detect(`날짜`, "NA"))

moon_tbl <- bind_rows(moon_part_one_df, moon_part_two_df) %>%
  bind_rows(moon_part_three_df) %>%
  bind_rows(moon_part_four_df) %>% 
  bind_rows(moon_part_five_df) %>% 
  tbl_df

moon_tbl <- moon_tbl %>% 
  mutate(`연도` = str_extract(`날짜`, "^\\d{4}") %>% as.integer) %>% 
  mutate(``   = str_extract(`날짜`, "\\b\\d{1,2}월\\b") %>% str_remove(., "월") %>% as.integer) %>% 
  mutate(``   = str_extract(`날짜`, "\\b((?!주)\\d{1}주$)\\b") %>% str_remove(., "주") %>% as.integer) 
  

korean_week_df <- tibble(
  `조사날짜` = seq(ymd("2017-01-01"), Sys.Date(), 1)
) %>% 
  mutate(`주차` = week(`조사날짜`),
         `연도` = year(`조사날짜`),
         ``   = month(`조사날짜`)) %>% 
  group_by(`연도`, ``) %>% 
  mutate(`한국주` = `주차` - min(`주차`) +1 ) %>% 
  group_by(`연도`, ``, `한국주`) %>% 
  summarise(`조사날짜` = min(`조사날짜`))

moon_tbl <- left_join(moon_tbl, korean_week_df, by=c("연도" = "연도", "월"="월", "주"="한국주")) %>% 
  select(`날짜`, `조사날짜`, `갤럽`, `리얼미터`)


moon_tbl %>% write_csv("data/moon_20210921.csv")

3 대통령 지지율 시각화

대통령 지지율을 취임초부터 현재 2021-09-22 까지 주별로 시각화한다.

library(tidyverse)
library(extrafont)
loadfonts()

moon_tbl  <- read_csv("data/moon_20210921.csv")

moon_tbl %>% 
  select(-`날짜`) %>% 
  pivot_longer(갤럽:리얼미터, names_to = "조사기관", values_to = "지지율") %>% 
  mutate(지지율 = 지지율 / 100) %>% 
  ggplot(aes(x=`조사날짜`, y=`지지율`, color=`조사기관`)) +
    geom_line() +
    geom_point() +
    scale_x_date(date_labels = "%Y년%m월") +
    scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
    theme_minimal(base_family = "NanumGothic") +
    scale_color_manual(values = c("gray30", "skyblue")) +
    labs(x="", 
         y="지지율(%)", 
         title="문재인 대통령 지지율",
         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")) +
    geom_hline(yintercept = 0.411, linetype = 2, color = "blue") +
    annotate("text", x = lubridate::ymd("2018-01-01"), y = 0.45, label = "2017년 대선 득표율 (41.1%)", 
             family = "NanumBarunpen", color = "blue", size = 5)

4 대통령 지지율 주별 데이터

대통령 지지율 주별 데이터를 표형태로 정리한다.

moon_tbl %>% 
  arrange(desc(`조사날짜`)) %>% 
  reactable::reactable()

5 2019년부터 최근 시점

대통령 취임 전체 시점과 더불어 2019년부터 가장 최근 시점 조사 일자까지 두 조사기관 지지율 추이를 시각화한다.

moon_g <- moon_tbl %>% 
  select(-`날짜`) %>% 
  pivot_longer(갤럽:리얼미터, names_to = "조사기관", values_to = "지지율") %>% 
  mutate(지지율 = 지지율 / 100) %>% 
  ggplot(aes(x=`조사날짜`, y=`지지율`, color=`조사기관`)) +
    geom_line() +
    geom_point() +
    scale_x_date(date_labels = "%Y년%m월") +
    scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
    theme_minimal(base_family = "NanumGothic") +
    scale_color_manual(values = c("gray30", "skyblue")) +
    labs(x="", 
         y="지지율(%)", 
         title="문재인 대통령 지지율",
         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")) +
    geom_hline(yintercept = 0.411, linetype = 2, color = "blue") +
    annotate("text", x = lubridate::ymd("2018-01-01"), y = 0.45, label = "2017년 대선 득표율 (41.1%)", 
             family = "NanumBarunpen", color = "blue", size = 5) +
    coord_cartesian(xlim = c(lubridate::ymd("2019-01-01"), Sys.Date()))

plotly::ggplotly(moon_g)
 

데이터 과학자 이광춘 저작

kwangchun.lee.7@gmail.com