1 데이터

library(tidyverse)
library(shiny)
library(gt)
library(gtExtras)

# 1. 데이터 ================================================================
## 1.1. 데이터 만들기
presid_17 <- krvotes::president_2017 %>%
  mutate(선거 = "2017년")

## 1.2. EDA 데이터 : 2017년 ================================================================

presid_17_tbl <- presid_17 %>%
  pivot_longer(문재인:김민찬, names_to = "후보", values_to = "득표") %>%
  select(-무표투표수, -기권수, -계)

gt_hubo_tlt <- presid_17_tbl %>%
  group_by(후보) %>%
  summarise(득표 = sum(득표)) %>%
  arrange(desc(득표)) %>%
  mutate(득표율 = 득표/sum(득표))

212

2.1 요약

## 2.1. 대선 후보 득표 (총계) ---------------------

presid_hubo_2017_gt <- gt_hubo_tlt %>%
  janitor::adorn_totals(name = "합계") %>%
  gt() %>%
  gt_theme_538() %>%
  tab_header(
    title = md("**&#x2600; 제19대 대통령 선거 &#x2600;**"),
    subtitle = md("*후보별 득표율 (2017년 5월 9일)*")
  ) %>%
  opt_align_table_header(align = "center") %>%
  tab_options(
    table.width = "300px",
    heading.background.color = "#1E61B0", # R logo 파란색
    heading.title.font.size = "20px",
    column_labels.background.color = "#F7F7F7", # R logo 회색
    column_labels.font.weight = "bold",
    stub.background.color = "#ffffff",
    stub.font.weight = "bold"
  ) %>%
  cols_align(
    align = "center",
    columns = `후보`
  ) %>%
  fmt_percent(
    columns = 득표율,
    decimals = 1,
    use_seps = FALSE
  ) %>%
  fmt_number(
    columns = 득표,
    decimals = 0,
    suffixing = FALSE
  ) %>%
  tab_style(style = list(cell_text(weight = 'bold',
                                   size  = "large",
                                   color = "blue")),
            locations = cells_body(columns = 후보,
                                   rows = 후보 == "문재인")) %>%
  tab_style(style = list(cell_text(weight = 'bold',
                                   size  = "large",
                                   color = "red")),
            locations = cells_body(columns = 후보,
                                   rows = 후보 == "홍준표")) %>%
  gt_highlight_rows(rows = 후보 == "문재인", font_weight = "bold", fill  = "#0388fc") %>%
  gt_highlight_rows(rows = 후보 == "홍준표", font_weight = "bold", fill  = "#ff6161") %>%
  gt_highlight_rows(rows = 후보 == "합계", font_weight = "bold", fill  = "gray90")

presid_hubo_2017_gt
☀ 제19대 대통령 선거 ☀
후보별 득표율 (2017년 5월 9일)
후보 득표 득표율
문재인 13,423,800 41.1%
홍준표 7,852,849 24.0%
안철수 6,998,342 21.4%
유승민 2,208,771 6.8%
심상정 2,017,458 6.2%
조원진 42,949 0.1%
김민찬 33,990 0.1%
김선동 27,229 0.1%
장성민 21,709 0.1%
윤홍식 18,543 0.1%
이경희 11,355 0.0%
이재오 9,140 0.0%
오영국 6,040 0.0%
합계 32,672,175 100.0%

2.2 시도

## 2.2. 대선 후보 득표 (시도) ---------------------

gt_sido_hubo_ttl <- presid_17_tbl %>%
  filter(str_detect(후보, pattern="문재인|안철수|홍준표|심상정|유승민")) %>%
  # mutate(후보 = factor(후보, levels = c("문재인", "홍준표", "안철수", "유승민", "심상정"))) %>%
  group_by(후보, 시도명) %>%
  summarise(득표 = sum(득표)) %>%
  arrange(desc(득표)) %>%
  group_by(시도명) %>%
  mutate(득표율 = 득표/sum(득표)) %>%
  mutate(득표 = scales::comma(득표),
           득표율 = scales::percent(득표율, accuracy = 1)) %>%
  mutate(득표종합 = glue::glue("{득표}<br>( {득표율} )")) %>%
  select(-득표, -득표율) %>%
  pivot_wider(names_from = "후보", values_from = "득표종합") %>%
  ungroup() %>%
  select(시도명, 문재인, 홍준표, 안철수, 유승민, 심상정)

## 합계 행 추가
gt_sido_ttl <- gt_hubo_tlt %>%
  filter(후보 %in% c("문재인", "홍준표", "안철수", "유승민", "심상정")) %>%
  mutate(득표율 = scales::percent(득표율, accuracy = 1)) %>%
  mutate(득표 = scales::comma(득표),
           득표종합 = glue::glue("{득표}<br>( {득표율} )")) %>%
  select(-득표, -득표율) %>%
  mutate(시도명 = "합계") %>%
  pivot_wider(names_from = "후보", values_from = "득표종합")


## GT 표작성
presid_hubo_sido_2017_gt <- gt_sido_hubo_ttl %>%
  bind_rows(gt_sido_ttl) %>%
  gt() %>%
  gt_theme_538() %>%
  tab_header(
    title = md("**&#x2600; 제19대 대통령 선거 &#x2600;**"),
    subtitle = md("*후보별 시도 득표율 (2017년 5월 9일)*")
  ) %>%
  opt_align_table_header(align = "center") %>%
  tab_options(
    table.width = "600px",
    heading.background.color = "#1E61B0", # R logo 파란색
    heading.title.font.size = "20px",
    column_labels.background.color = "#F7F7F7", # R logo 회색
    column_labels.font.weight = "bold",
    stub.background.color = "#ffffff",
    stub.font.weight = "bold"
  ) %>%
  fmt_markdown(columns = 문재인:심상정)  %>%
  cols_align(
    align = "center",
    columns = `시도명`
  ) %>%
  gt_highlight_cols(columns = 문재인, font_weight = "bold", fill  = "#0388fc") %>%
  gt_highlight_cols(columns = 홍준표, font_weight = "bold", fill  = "#ff6161") %>%
  cols_width(
    시도명 ~ px(100)
  )  %>%
  gt_highlight_rows(rows = 시도명 == "합계", font_weight = "bold", fill  = "gray90")


presid_hubo_sido_2017_gt
☀ 제19대 대통령 선거 ☀
후보별 시도 득표율 (2017년 5월 9일)
시도명 문재인 홍준표 안철수 유승민 심상정
경기도

3,319,812
( 42% )

1,637,345
( 21% )

1,807,308
( 23% )

540,023
( 7% )

546,373
( 7% )

서울특별시

2,781,345
( 43% )

1,365,285
( 21% )

1,492,767
( 23% )

476,973
( 7% )

425,459
( 7% )

부산광역시

872,127
( 39% )

720,484
( 32% )

378,907
( 17% )

162,480
( 7% )

109,329
( 5% )

경상북도

369,726
( 22% )

827,237
( 49% )

253,905
( 15% )

149,017
( 9% )

88,080
( 5% )

경상남도

779,731
( 37% )

790,491
( 37% )

284,272
( 13% )

142,479
( 7% )

113,051
( 5% )

전라북도

778,747
( 65% )

40,231
( 3% )

285,467
( 24% )

30,802
( 3% )

59,296
( 5% )

인천광역시

747,090
( 41% )

379,191
( 21% )

428,888
( 24% )

118,691
( 7% )

129,925
( 7% )

전라남도

737,921
( 60% )

30,221
( 2% )

378,179
( 31% )

25,819
( 2% )

49,509
( 4% )

대구광역시

342,620
( 22% )

714,205
( 46% )

235,757
( 15% )

198,459
( 13% )

74,440
( 5% )

광주광역시

583,847
( 61% )

14,882
( 2% )

287,222
( 30% )

20,862
( 2% )

43,719
( 5% )

충청남도

476,661
( 39% )

306,614
( 25% )

290,216
( 24% )

68,521
( 6% )

83,868
( 7% )

대전광역시

404,545
( 43% )

191,376
( 20% )

218,769
( 23% )

59,820
( 6% )

63,669
( 7% )

충청북도

374,806
( 39% )

255,502
( 27% )

211,454
( 22% )

57,282
( 6% )

65,095
( 7% )

강원도

324,768
( 34% )

284,909
( 30% )

206,840
( 22% )

65,278
( 7% )

62,389
( 7% )

울산광역시

282,794
( 38% )

203,602
( 28% )

128,520
( 17% )

60,289
( 8% )

62,187
( 8% )

제주특별자치도

169,493
( 46% )

68,063
( 18% )

77,861
( 21% )

22,784
( 6% )

31,716
( 9% )

세종특별자치시

77,767
( 51% )

23,211
( 15% )

32,010
( 21% )

9,192
( 6% )

9,353
( 6% )

합계

13,423,800
( 41% )

7,852,849
( 24% )

6,998,342
( 21% )

2,208,771
( 7% )

2,017,458
( 6% )

2.3 시군구

presid_17_sigungu_tbl <- presid_17_tbl %>% 
  filter(후보 %in% c("문재인", "홍준표", "안철수", "유승민", "심상정")) %>% 
  group_by(시도명, 구시군명, 후보) %>% 
  summarise(득표 = sum(득표)) %>% 
  unite("key", 시도명:구시군명, sep="_", remove = FALSE) %>% 
  ungroup()
library(crosstalk)
library(leaflet)
library(DT)

# Wrap data frame in SharedData
sigungu_sd <- SharedData$new(presid_17_sigungu_tbl, key = ~key)

# Use SharedData like a dataframe with Crosstalk-enabled widgets
bscols(
  widths = c(6, 6, 12),
  # Create a filter input
  crosstalk::filter_select(id = "sido", label = "시도", sharedData = sigungu_sd, multiple = FALSE,  group = ~시도명),
  crosstalk::filter_select("sigungu", "시군구명", sigungu_sd, multiple = FALSE, group = ~구시군명),

  datatable(sigungu_sd, extensions="Scroller", style="bootstrap", class="compact", width="100%",
    options=list(deferRender=TRUE, scrollY=300, scroller=TRUE))
)

2.4 시군구 - gt

presid_17_sigungu_display_tbl <- presid_17_sigungu_tbl %>% 
  filter(str_detect(시도명, "경기"),
         str_detect(구시군명, "성남")) %>% 
  separate(구시군명, into = c("시명", "구명"), sep = "시") %>% 
  group_by(시도명, 시명, 후보) %>% 
  summarise(득표 = sum(득표)) %>% 
  mutate(득표율 = 득표 / sum(득표)) %>% 
  ungroup() %>% 
  mutate(득표 = scales::comma(득표),
         득표율 = scales::percent(득표율, accuracy = 1)) %>%
  mutate(득표종합 = glue::glue("{득표}<br>( {득표율} )")) %>%
  select(-득표, -득표율) %>%
  pivot_wider(names_from = "후보", values_from = "득표종합") %>%
  ungroup() %>%
  select(시도명, 시명, 문재인, 홍준표, 안철수, 유승민, 심상정)

presid_17_sigungu_display_tbl %>% 
    gt() %>%
  gt_theme_538() %>%
  tab_header(
    title = md("**&#x2600; 제19대 대통령 선거 &#x2600;**"),
    subtitle = md("*구시군별 득표율 (2017년 5월 9일)*")
  ) %>%
  opt_align_table_header(align = "center") %>%
  tab_options(
    table.width = "600px",
    heading.background.color = "#1E61B0", # R logo 파란색
    heading.title.font.size = "20px",
    column_labels.background.color = "#F7F7F7", # R logo 회색
    column_labels.font.weight = "bold",
    stub.background.color = "#ffffff",
    stub.font.weight = "bold"
  ) %>%
  fmt_markdown(columns = 문재인:심상정)  %>%
  cols_align(
    align = "center",
    columns = `시도명`
  ) %>%
  gt_highlight_cols(columns = 문재인, font_weight = "bold", fill  = "#0388fc") %>%
  gt_highlight_cols(columns = 홍준표, font_weight = "bold", fill  = "#ff6161") %>%
  cols_width(
    시도명 ~ px(100)
  ) 
☀ 제19대 대통령 선거 ☀
구시군별 득표율 (2017년 5월 9일)
시도명 시명 문재인 홍준표 안철수 유승민 심상정
경기도 성남

266,449
( 42% )

127,623
( 20% )

147,304
( 23% )

48,168
( 8% )

39,663
( 6% )

 

데이터 과학자 이광춘 저작

kwangchun.lee.7@gmail.com