대통령 지지율 여론조사데이터는 위키백과: 대한민국의 대통령 지지율과 나무위키, 문재인/지지율에 데이터가 잘 정리되어 있다. 처음 위키백과: 대한민국의 대통령 지지율를 통해 대통령 지지율을 작업했지만, 나무위키 문재인/지지율 데이터가 더 좋은 자료구조로 충실히 정리되어 있다.
위키백과: 대한민국의 대통령 지지율 데이터 자료형태가 바뀌어서 데이터 크롤링 로직은 동일하고 데이터 전처리 과정만 코드를 수정(2019-05-06).
library(tidyverse)
library(rvest)
library(lubridate)
"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"
wiki_url <-
Sys.setlocale("LC_ALL", "C")
wiki_url %>%
moon_dat <- 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_dat %>%
moon_part_one_df <- 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_dat %>%
moon_part_two_df <- 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_dat %>%
moon_part_three_df <- 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_dat %>%
moon_part_four_df <- 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_dat %>%
moon_part_five_df <- 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"))
bind_rows(moon_part_one_df, moon_part_two_df) %>%
moon_tbl <- 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)
tibble(
korean_week_df <-`조사날짜` = seq(ymd("2017-01-01"), Sys.Date(), 1)
%>%
) mutate(`주차` = week(`조사날짜`),
`연도` = year(`조사날짜`),
`월` = month(`조사날짜`)) %>%
group_by(`연도`, `월`) %>%
mutate(`한국주` = `주차` - min(`주차`) +1 ) %>%
group_by(`연도`, `월`, `한국주`) %>%
summarise(`조사날짜` = min(`조사날짜`))
left_join(moon_tbl, korean_week_df, by=c("연도" = "연도", "월"="월", "주"="한국주")) %>%
moon_tbl <- select(`날짜`, `조사날짜`, `갤럽`, `리얼미터`)
%>% write_csv("data/moon_20210921.csv") moon_tbl
대통령 지지율을 취임초부터 현재 2021-09-22 까지 주별로 시각화한다.
library(tidyverse)
library(extrafont)
loadfonts()
read_csv("data/moon_20210921.csv")
moon_tbl <-
%>%
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)
대통령 지지율 주별 데이터를 표형태로 정리한다.
%>%
moon_tbl arrange(desc(`조사날짜`)) %>%
reactable::reactable()
대통령 취임 전체 시점과 더불어 2019년부터 가장 최근 시점 조사 일자까지 두 조사기관 지지율 추이를 시각화한다.
moon_tbl %>%
moon_g <- 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()))
::ggplotly(moon_g) plotly
데이터 과학자 이광춘 저작
kwangchun.lee.7@gmail.com