나무위키 제19대 대통령 선거/후보 경선에서 민주당 경선결과를 얻어온다.
library(tidyverse)
library(rvest)
read_html("https://namu.wiki/w/제19대 대통령 선거/후보 경선", encoding = "utf-8")
candidate_html <-
Sys.setlocale("LC_ALL", "C")
[1] "C"
candidate_html %>%
candidate_raw <- html_node(xpath = '//*[@id="app"]/div/div[2]/article/div[3]/div[2]/div/div/div[9]/div[3]/table') %>%
html_table()
Sys.setlocale("LC_ALL", "Korean")
[1] "LC_COLLATE=Korean_Korea.949;LC_CTYPE=Korean_Korea.949;LC_MONETARY=Korean_Korea.949;LC_NUMERIC=C;LC_TIME=Korean_Korea.949"
candidate_raw %>%
candidate_minju <- slice(3:n()) %>%
janitor::clean_names(ascii = TRUE) %>%
set_names(c("경선일", "지역방식", "이재명", "최성", "문재인", "안희정", "선거인단")) %>%
filter(!str_detect(지역방식, "총합") ) %>%
mutate(이재명 = str_extract(이재명, "[0-9]{0,3},?[0-9]{1,3}") %>% parse_number,
str_extract(최성, "[0-9]{0,3},?[0-9]{1,3}") %>% parse_number,
최성 = str_extract(문재인, "[0-9]{0,3},?[0-9]{1,3}") %>% parse_number,
문재인 = str_extract(안희정, "[0-9]{0,3},?[0-9]{1,3}") %>% parse_number) %>%
안희정 = select(-선거인단, -경선일)
## 현장 ---------------------------
candidate_minju %>%
candidate_minju_spot <- filter(str_detect(지역방식, "현장")) %>%
mutate(지역 = case_when(str_detect(지역방식, "호남") ~ "호남",
str_detect(지역방식, "영남") ~ "영남",
str_detect(지역방식, "충청") ~ "충청",
str_detect(지역방식, "수도") ~ "수도/강원/제주")) %>%
pivot_longer(이재명:안희정, names_to = "후보", values_to = "득표") %>%
mutate(방식 = "현장") %>%
select(방식, 지역, 후보, 득표)
## ARS ---------------------------
candidate_minju %>%
candidate_minju_ARS <- filter(str_detect(지역방식, "ARS")) %>%
mutate(지역 = case_when(str_detect(지역방식, "호남") ~ "호남",
str_detect(지역방식, "영남") ~ "영남",
str_detect(지역방식, "충청") ~ "충청",
str_detect(지역방식, "수도") ~ "수도/강원/제주",
str_detect(지역방식, "2차") ~ "전국 ARS")) %>%
pivot_longer(이재명:안희정, names_to = "후보", values_to = "득표") %>%
mutate(방식 = "ARS") %>%
select(방식, 지역, 후보, 득표)
## 대의원 ---------------------------
candidate_minju %>%
candidate_minju_member <- filter(str_detect(지역방식, "[호남권|충청권|영남권|강원]\\s대의원")) %>%
mutate(지역 = case_when(str_detect(지역방식, "호남") ~ "호남",
str_detect(지역방식, "영남") ~ "영남",
str_detect(지역방식, "충청") ~ "충청",
str_detect(지역방식, "수도") ~ "수도/강원/제주",
str_detect(지역방식, "2차") ~ "2차 ARS")) %>%
pivot_longer(이재명:안희정, names_to = "후보", values_to = "득표") %>%
mutate(방식 = "대의원") %>%
select(방식, 지역, 후보, 득표)
## 국외 ---------------------------
candidate_minju %>%
candidate_minju_abroad <- filter(str_detect(지역방식, "재외국민")) %>%
mutate(지역 = case_when(str_detect(지역방식, "호남") ~ "호남",
str_detect(지역방식, "영남") ~ "영남",
str_detect(지역방식, "충청") ~ "충청",
str_detect(지역방식, "수도") ~ "수도/강원/제주",
str_detect(지역방식, "재외국민") ~ "재외국민")) %>%
pivot_longer(이재명:안희정, names_to = "후보", values_to = "득표") %>%
mutate(방식 = "인터넷") %>%
select(방식, 지역, 후보, 득표)
bind_rows(candidate_minju_spot, candidate_minju_ARS) %>%
candidate_minju_tbl <- bind_rows(candidate_minju_member) %>%
bind_rows(candidate_minju_abroad) %>%
mutate(방식 = factor(방식, levels = c("ARS", "현장", "대의원", "인터넷")),
factor(후보, levels = c("문재인", "안희정", "이재명", "최성")),
후보 = factor(지역, levels = c("수도/강원/제주", "호남", "영남", "충청", "전국 ARS", "재외국민")))
지역 =
## 총합 확인 ---------------------
%>%
candidate_minju_tbl # group_by(후보) %>%
summarise(sum(득표))
# A tibble: 1 x 1
`sum(득표)`
<dbl>
1 1642548
# 1,642,677 명
# candidate_minju_tbl %>%
# write_rds("data/candidate_minju_tbl.rds")
민주당 경선결과 분석은 다음과 같다.
library(extrafont)
loadfonts()
%>%
candidate_minju_tbl group_by(방식, 후보) %>%
summarise(득표 = sum(득표)) %>%
ungroup() %>%
ggplot(aes(x= 후보, y=득표, fill = 방식)) +
geom_col(position = "dodge") +
theme_bw(base_family = "NanumGothic") +
scale_y_continuous(labels = scales::comma) +
theme(legend.position = "top") +
labs(x="", y="득표수",
title = "제19대 대통령선거 민주당 경선",
subtitle = "방식별 각 후보 득표수",
caption = "데이터 출처: 나무위키 제19대 대통령 선거/후보 경선")
%>%
candidate_minju_tbl group_by(지역, 후보) %>%
summarise(득표 = sum(득표)) %>%
ungroup() %>%
ggplot(aes(x= fct_reorder(후보, -득표), y=득표, fill = 지역)) +
geom_col(position = "dodge") +
theme_bw(base_family = "NanumGothic") +
scale_y_continuous(labels = scales::comma) +
facet_wrap(~지역) +
theme(legend.position = "none") +
labs(x="", y="득표수",
title = "제19대 대통령선거 민주당 경선",
subtitle = "지역별 각 후보 득표수",
caption = "데이터 출처: 나무위키 제19대 대통령 선거/후보 경선")
%>%
candidate_minju_tbl ggplot(aes(x= fct_reorder(후보, -득표), y=득표, fill = 방식)) +
geom_col(position = "dodge") +
theme_bw(base_family = "NanumGothic") +
scale_y_continuous(labels = scales::comma) +
facet_wrap(~지역, scale = "free_y") +
theme(legend.position = "top") +
labs(x="", y="득표수",
title = "제19대 대통령선거 민주당 경선",
subtitle = "지역별 각 후보 득표수",
caption = "데이터 출처: 나무위키 제19대 대통령 선거/후보 경선")
나무위키 제18대 대통령 선거/후보 경선에서 민주당 경선결과를 얻어온다.
18_html <- read_html("https://namu.wiki/w/제18대 대통령 선거/후보 경선", encoding = "utf-8")
candidate_
Sys.setlocale("LC_ALL", "C")
[1] "C"
18_raw <- candidate_18_html %>%
candidate_ html_node(xpath = '//*[@id="app"]/div/div[2]/article/div[3]/div[2]/div/div/div[8]/div[3]/table') %>%
html_table()
Sys.setlocale("LC_ALL", "Korean")
[1] "LC_COLLATE=Korean_Korea.949;LC_CTYPE=Korean_Korea.949;LC_MONETARY=Korean_Korea.949;LC_NUMERIC=C;LC_TIME=Korean_Korea.949"
18_tbl <- candidate_18_raw %>%
candidate_ slice(3:n()) %>%
janitor::clean_names(ascii = TRUE) %>%
set_names(c("지역", "정세균", "김두관", "손학규", "문재인", "선거인단")) %>%
filter(!str_detect(지역, "총합") ) %>%
mutate(지역 = str_extract_all(지역, "[가-힣]+")) %>%
mutate(지역 = map_chr(지역, paste0, collapse = "")) %>%
mutate(정세균 = str_extract(정세균, "^.*?(?=\\()") %>% parse_number,
str_extract(김두관, "^.*?(?=\\()") %>% parse_number,
김두관 = str_extract(손학규, "^.*?(?=\\()") %>% parse_number,
손학규 = str_extract(문재인, "^.*?(?=\\()") %>% parse_number) %>%
문재인 = select(-선거인단) %>%
pivot_longer(-지역, names_to = "후보", values_to = "득표") %>%
mutate(지역 = factor(지역, levels = c("서울", "경기", "광주전남", "전북", "부산",
"대전세종충남", "충북", "대구경북", "울산", "인천", "경남", "강원", "제주")))
18_tbl %>%
candidate_ summarise(sum(득표))
# A tibble: 1 x 1
`sum(득표)`
<dbl>
1 614257
# 43027 + 87842 + 136205 + 347183
# candidate_18_tbl %>%
# write_rds("data/candidate_18_tbl.rds")
민주당 경선결과 분석은 다음과 같다.
18_tbl %>%
candidate_ ggplot(aes(x= fct_reorder(후보, -득표), y=득표, fill = 지역)) +
geom_col(position = "dodge") +
theme_bw(base_family = "NanumGothic") +
scale_y_continuous(labels = scales::comma) +
facet_wrap(~지역) +
theme(legend.position = "none") +
labs(x="", y="득표수",
title = "제18대 대통령선거 민주당 경선",
subtitle = "지역별 각 후보 득표수",
caption = "데이터 출처: 나무위키 제18대 대통령 선거/후보 경선")
18_tbl %>%
candidate_ ggplot(aes(x= fct_reorder(후보, -득표), y=득표, fill = 지역)) +
geom_col(position = "dodge") +
theme_bw(base_family = "NanumGothic") +
scale_y_continuous(labels = scales::comma) +
facet_wrap(~지역, scales = "free_y") +
theme(legend.position = "none") +
labs(x="", y="득표수",
title = "제18대 대통령선거 민주당 경선",
subtitle = "지역별 각 후보 득표수",
caption = "데이터 출처: 나무위키 제18대 대통령 선거/후보 경선")
데이터 과학자 이광춘 저작
kwangchun.lee.7@gmail.com