library(tidyverse)
library(shiny)
library(gt)
library(gtExtras)
# 1. 데이터 ================================================================
## 1.1. 데이터 만들기
17 <- krvotes::president_2017 %>%
presid_ mutate(선거 = "2017년")
## 1.2. EDA 데이터 : 2017년 ================================================================
17_tbl <- presid_17 %>%
presid_ pivot_longer(문재인:김민찬, names_to = "후보", values_to = "득표") %>%
select(-무표투표수, -기권수, -계)
presid_17_tbl %>%
gt_hubo_tlt <- group_by(후보) %>%
summarise(득표 = sum(득표)) %>%
arrange(desc(득표)) %>%
mutate(득표율 = 득표/sum(득표))
## 2.1. 대선 후보 득표 (총계) ---------------------
2017_gt <- gt_hubo_tlt %>%
presid_hubo_ janitor::adorn_totals(name = "합계") %>%
gt() %>%
gt_theme_538() %>%
tab_header(
title = md("**☀ 제19대 대통령 선거 ☀**"),
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")
2017_gt presid_hubo_
☀ 제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. 대선 후보 득표 (시도) ---------------------
presid_17_tbl %>%
gt_sido_hubo_ttl <- 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_hubo_tlt %>%
gt_sido_ttl <- filter(후보 %in% c("문재인", "홍준표", "안철수", "유승민", "심상정")) %>%
mutate(득표율 = scales::percent(득표율, accuracy = 1)) %>%
mutate(득표 = scales::comma(득표),
glue::glue("{득표}<br>( {득표율} )")) %>%
득표종합 = select(-득표, -득표율) %>%
mutate(시도명 = "합계") %>%
pivot_wider(names_from = "후보", values_from = "득표종합")
## GT 표작성
2017_gt <- gt_sido_hubo_ttl %>%
presid_hubo_sido_ bind_rows(gt_sido_ttl) %>%
gt() %>%
gt_theme_538() %>%
tab_header(
title = md("**☀ 제19대 대통령 선거 ☀**"),
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")
2017_gt presid_hubo_sido_
☀ 제19대 대통령 선거 ☀ | |||||
---|---|---|---|---|---|
후보별 시도 득표율 (2017년 5월 9일) | |||||
시도명 | 문재인 | 홍준표 | 안철수 | 유승민 | 심상정 |
경기도 | 3,319,812 |
1,637,345 |
1,807,308 |
540,023 |
546,373 |
서울특별시 | 2,781,345 |
1,365,285 |
1,492,767 |
476,973 |
425,459 |
부산광역시 | 872,127 |
720,484 |
378,907 |
162,480 |
109,329 |
경상북도 | 369,726 |
827,237 |
253,905 |
149,017 |
88,080 |
경상남도 | 779,731 |
790,491 |
284,272 |
142,479 |
113,051 |
전라북도 | 778,747 |
40,231 |
285,467 |
30,802 |
59,296 |
인천광역시 | 747,090 |
379,191 |
428,888 |
118,691 |
129,925 |
전라남도 | 737,921 |
30,221 |
378,179 |
25,819 |
49,509 |
대구광역시 | 342,620 |
714,205 |
235,757 |
198,459 |
74,440 |
광주광역시 | 583,847 |
14,882 |
287,222 |
20,862 |
43,719 |
충청남도 | 476,661 |
306,614 |
290,216 |
68,521 |
83,868 |
대전광역시 | 404,545 |
191,376 |
218,769 |
59,820 |
63,669 |
충청북도 | 374,806 |
255,502 |
211,454 |
57,282 |
65,095 |
강원도 | 324,768 |
284,909 |
206,840 |
65,278 |
62,389 |
울산광역시 | 282,794 |
203,602 |
128,520 |
60,289 |
62,187 |
제주특별자치도 | 169,493 |
68,063 |
77,861 |
22,784 |
31,716 |
세종특별자치시 | 77,767 |
23,211 |
32,010 |
9,192 |
9,353 |
합계 | 13,423,800 |
7,852,849 |
6,998,342 |
2,208,771 |
2,017,458 |
17_sigungu_tbl <- presid_17_tbl %>%
presid_ filter(후보 %in% c("문재인", "홍준표", "안철수", "유승민", "심상정")) %>%
group_by(시도명, 구시군명, 후보) %>%
summarise(득표 = sum(득표)) %>%
unite("key", 시도명:구시군명, sep="_", remove = FALSE) %>%
ungroup()
library(crosstalk)
library(leaflet)
library(DT)
# Wrap data frame in SharedData
SharedData$new(presid_17_sigungu_tbl, key = ~key)
sigungu_sd <-
# Use SharedData like a dataframe with Crosstalk-enabled widgets
bscols(
widths = c(6, 6, 12),
# Create a filter input
::filter_select(id = "sido", label = "시도", sharedData = sigungu_sd, multiple = FALSE, group = ~시도명),
crosstalk::filter_select("sigungu", "시군구명", sigungu_sd, multiple = FALSE, group = ~구시군명),
crosstalk
datatable(sigungu_sd, extensions="Scroller", style="bootstrap", class="compact", width="100%",
options=list(deferRender=TRUE, scrollY=300, scroller=TRUE))
)
gt
17_sigungu_display_tbl <- presid_17_sigungu_tbl %>%
presid_ 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(시도명, 시명, 문재인, 홍준표, 안철수, 유승민, 심상정)
17_sigungu_display_tbl %>%
presid_ gt() %>%
gt_theme_538() %>%
tab_header(
title = md("**☀ 제19대 대통령 선거 ☀**"),
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 |
127,623 |
147,304 |
48,168 |
39,663 |
데이터 과학자 이광춘 저작
kwangchun.lee.7@gmail.com