1 총선 → 대선 → 지선

krvotes 팩키지에서 준비된 총선, 대선, 지선 데이터를 바탕으로 분당구 득표 데이터를 비교가능하도록 정당별로 준비시킨다.

  • 2016년 총선 분당을의 경우 무소속 임태희 후보는 자한당으로 넣어 데이터를 준비한다.
    • 민주당: 더불어민주당 김병관 + 더불어민주당 김병욱
    • 자한당: 새누리당 권혁세 + 새누리당 전하진 + 무소속 임태희
    • 바른미래당: 국민의당 염오봉 + 국민의당 윤은숙
  • 2017년 대선 유승민과 안철수는 합쳐서 바른미래당으로 준비한다.
    • 바른미래당: 안철수 + 유승민
  • 2018년 시도지사선거, 경기도지사 득표수로 갈음
    • 이재명, 남경필, 김영환, 이홍우
library(tidyverse)
library(krvotes)

# 총선 2016 -----
`총선_df` <- congress_2018 %>% 
  filter(str_detect(`precinct`, "분당")) %>% 
  unnest(data_clean) %>% 
  group_by(`읍면동명`) %>% 
  summarise(`민주당` = sum(`더불어민주당 김병관`, `더불어민주당 김병욱`, na.rm=TRUE),
            `자한당` = sum(`새누리당 권혁세`, `새누리당 전하진`, `무소속 임태희`, na.rm=TRUE),
            `바미당` = sum(`국민의당 염오봉`, `국민의당 윤은숙`, na.rm=TRUE)) %>% 
  mutate(`선거` = "2016총선")

# 대선 2017 -----
`대선_df` <- president %>% 
  tbl_df %>% 
  filter(str_detect(`구시군명`, "분당")) %>% 
  group_by(`읍면동명`) %>% 
  summarise(`민주당` = sum(`문재인`),
            `자한당` = sum(`홍준표`),
            `바미당` = sum(`안철수`, `유승민`),
            `정의당` = sum(`심상정`)) %>% 
  mutate(`선거` = "2017대선")


# 지선 2018 -----
`지선_df` <- local_2018 %>% 
  filter(str_detect(`시도명`, "경기")) %>% 
  select(-`시도명`) %>% 
  unnest(data_clean) %>% 
  filter(str_detect(`구시군명`, "분당")) %>% 
  group_by(`읍면동명`) %>% 
  summarise(`민주당` = sum(`더불어민주당 이재명`),
            `자한당` = sum(`자유한국당 남경필`),
            `바미당` = sum(`바른미래당 김영환`),
            `정의당` = sum(`정의당 이홍우`)) %>% 
  mutate(`선거` = "2018지선")

`분당_df` <- bind_rows(`총선_df`, `대선_df`) %>% 
  bind_rows(`지선_df`) %>% 
  filter(!str_detect(`읍면동명`, "잘못")) %>% 
  mutate(`정의당` = ifelse(is.na(`정의당`), 0, `정의당`)) %>% 
  select(`선거`, everything())

1.1 분당구 정당별 득표 테이블

2016년 총선부터 2018년 지선까지 연도별 분당구 민주당, 자한당, 바른미래당, 정의당 정당별 득표율을 다음과 같은 표로 정리한다.

`분당_df` %>% 
  gather(`정당`, `득표수`, -`선거`, -`읍면동명`) %>% 
  mutate(`정당` = factor(`정당`, levels = c("민주당", "자한당", "바미당", "정의당"))) %>% 
  group_by(`선거`, `정당`) %>% 
  summarise(`득표수` = sum(`득표수`)) %>% 
  spread(`정당`, `득표수`) %>% 
  DT::datatable() %>% 
    DT::formatRound(2:5, digits = 0)

앞서 정리한 표를 시각화하여 추세를 파악한다.

library(extrafont)
loadfonts()

`분당득표` <- `분당_df` %>% 
  gather(`정당`, `득표수`, -`선거`, -`읍면동명`) %>% 
  mutate(`정당` = factor(`정당`, levels = c("민주당", "자한당", "바미당", "정의당"))) %>% 
  group_by(`선거`, `정당`) %>% 
  summarise(`득표수` = sum(`득표수`)) %>% 
  filter(`선거` == "2018지선") %>% 
  pull(`득표수`)

`분당_df` %>% 
  gather(`정당`, `득표수`, -`선거`, -`읍면동명`) %>% 
  mutate(`정당` = factor(`정당`, levels = c("민주당", "자한당", "바미당", "정의당"))) %>% 
  group_by(`선거`, `정당`) %>% 
  summarise(`득표수` = sum(`득표수`)) %>% 
  ggplot(aes(x=`선거`, y=`득표수`, group=`정당`, color=`정당`)) +
    geom_line(size=1) +
    geom_point(size=3) +
    scale_color_manual(values = c("blue", "red", "cyan", "yellow")) +
    scale_y_continuous(expand = c(0, 0), labels = scales::comma, sec.axis = sec_axis(~ ., breaks = `분당득표`), limits=c(0, 150000)) +
    theme_minimal(base_family = "NanumGothic") +
    labs(x="", y="득표수", title="성남시 분당구 주요선거 정당별 득표수",
         subtitle="총선, 대선, 지선")

2 동별

2.1 동별 득표 테이블

library(highcharter)

`분당_df` %>% 
  gather(`정당`, `득표수`, -`선거`, -`읍면동명`) %>% 
  mutate(`정당` = factor(`정당`, levels = c("민주당", "자한당", "바미당", "정의당"))) %>% 
  group_by(`선거`, `정당`, `읍면동명`) %>% 
  summarise(`득표수` = sum(`득표수`)) %>% 
  spread(`정당`, `득표수`) %>% 
  DT::datatable() %>% 
    DT::formatRound(3:6, digits=0)

2.2 동별 득표 시각화 - 정적비교

`분당_df` %>% 
  gather(`정당`, `득표수`, -`선거`, -`읍면동명`) %>% 
  filter(!str_detect(`읍면동명`, "거소|국외|재외")) %>% 
  mutate(`정당` = factor(`정당`, levels = c("민주당", "자한당", "바미당", "정의당"))) %>% 
  group_by(`선거`, `정당`, `읍면동명`) %>% 
  summarise(`득표수` = sum(`득표수`)) %>% 
  ggplot(aes(x=`선거`, y=`득표수`, group=`정당`, color=`정당`)) +
    geom_line(size=1.3) +
    geom_point(size=2.5) +
    scale_y_continuous(labels = scales::comma) +
    facet_wrap(~ `읍면동명`) +
    scale_color_manual(values = c("blue", "red", "cyan", "yellow")) +
    theme_bw(base_family = "NanumGothic") +
    theme(legend.position = "none") +
    labs(x="", y="득표수")

2.3 동별 득표 시각화 - 인터랙티브

library(highcharter)

3 공간정보

3.1 동별 지리정보

# 2. 지리정보 시각화 -----