1 제19대 대통령선거

1.1 민주당

나무위키 제19대 대통령 선거/후보 경선에서 민주당 경선결과를 얻어온다.

library(tidyverse)
library(rvest)

candidate_html <- read_html("https://namu.wiki/w/제19대 대통령 선거/후보 경선", encoding = "utf-8")

Sys.setlocale("LC_ALL", "C")
[1] "C"
candidate_raw <- candidate_html %>% 
  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_minju <- candidate_raw %>% 
  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_spot <- candidate_minju %>% 
  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_ARS <- candidate_minju %>% 
  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_member <- candidate_minju %>% 
  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_abroad <- candidate_minju %>% 
  filter(str_detect(지역방식, "재외국민")) %>% 
  mutate(지역 = case_when(str_detect(지역방식, "호남") ~ "호남",
                          str_detect(지역방식, "영남") ~ "영남",
                          str_detect(지역방식, "충청") ~ "충청",
                          str_detect(지역방식, "수도") ~ "수도/강원/제주",
                          str_detect(지역방식, "재외국민") ~ "재외국민")) %>% 
  pivot_longer(이재명:안희정, names_to = "후보", values_to = "득표") %>% 
  mutate(방식 = "인터넷") %>% 
  select(방식, 지역, 후보, 득표)

candidate_minju_tbl <- bind_rows(candidate_minju_spot, candidate_minju_ARS) %>% 
  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")

1.2 민주당 경선분석

민주당 경선결과 분석은 다음과 같다.

1.2.1 방식

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대 대통령 선거/후보 경선")

1.2.2 지역

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대 대통령 선거/후보 경선")

1.2.3 방식 X 지역

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대 대통령 선거/후보 경선")

2 제18대 대통령선거

2.1 민주당

나무위키 제18대 대통령 선거/후보 경선에서 민주당 경선결과를 얻어온다.

candidate_18_html <- read_html("https://namu.wiki/w/제18대 대통령 선거/후보 경선", encoding = "utf-8")

Sys.setlocale("LC_ALL", "C")
[1] "C"
candidate_18_raw <- candidate_18_html %>% 
  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"
candidate_18_tbl <- candidate_18_raw %>% 
  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("서울", "경기", "광주전남", "전북", "부산",
                                    "대전세종충남", "충북", "대구경북", "울산", "인천", "경남", "강원", "제주")))
  

candidate_18_tbl %>% 
  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")

2.2 민주당 경선분석

민주당 경선결과 분석은 다음과 같다.

2.2.1 지역 (절대척도)

candidate_18_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(~지역) +
    theme(legend.position = "none") +
    labs(x="", y="득표수",
         title = "제18대 대통령선거 민주당 경선",
         subtitle = "지역별 각 후보 득표수",
         caption = "데이터 출처: 나무위키 제18대 대통령 선거/후보 경선")

2.2.2 지역 (상대척도)

candidate_18_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(~지역, scales = "free_y") +
    theme(legend.position = "none") +
    labs(x="", y="득표수",
         title = "제18대 대통령선거 민주당 경선",
         subtitle = "지역별 각 후보 득표수",
         caption = "데이터 출처: 나무위키 제18대 대통령 선거/후보 경선")

 

데이터 과학자 이광춘 저작

kwangchun.lee.7@gmail.com