코드
library(magick)
precinct_svg <- magick::image_read("data/South_Korean_legislative_election_map_(2020).svg")
image_ggplot(precinct_svg)
File:South Korean legislative election map (2020).svg 파일을 가져와서 시각화한다.
library(magick)
precinct_svg <- magick::image_read("data/South_Korean_legislative_election_map_(2020).svg")
image_ggplot(precinct_svg)
library(httr)
library(rvest)
req_url <- glue::glue("http://info.nec.go.kr/electioninfo/electionInfo_report.xhtml?electionId=0000000000",
"&requestURI=%2Felectioninfo%2F0000000000%2Fbi%2Fbigi01.jsp",
"&topMenuId=BI",
"&secondMenuId=BIGI01",
"&menuId=BIGI01",
"&statementId=BIGI02",
"&oldElectionType=",
"&electionType=2",
"&electionName=20200415",
"&electionCode=-1",
"&x=73",
"&y=20")
resp <- httr::GET(req_url)
resp_lst <- content(resp) |>
html_table()
precinct <- resp_lst[[1]] |>
janitor::clean_names() |>
select(1:3) |>
set_names(c("시도명", "선거구수", "정수")) |>
slice(4:n())
precinct |>
gt::gt()
시도명 | 선거구수 | 정수 |
---|---|---|
전국(비례대표) | 1 | 47 |
서울특별시 | 49 | 49 |
부산광역시 | 18 | 18 |
대구광역시 | 12 | 12 |
인천광역시 | 13 | 13 |
광주광역시 | 8 | 8 |
대전광역시 | 7 | 7 |
울산광역시 | 6 | 6 |
세종특별자치시 | 2 | 2 |
경기도 | 59 | 59 |
강원도 | 8 | 8 |
충청북도 | 8 | 8 |
충청남도 | 11 | 11 |
전라북도 | 10 | 10 |
전라남도 | 10 | 10 |
경상북도 | 13 | 13 |
경상남도 | 16 | 16 |
제주특별자치도 | 3 | 3 |
get_precinct <- function(election='20200415') {
req_url <- glue::glue("http://info.nec.go.kr/electioninfo/electionInfo_report.xhtml?electionId=0000000000",
"&requestURI=%2Felectioninfo%2F0000000000%2Fbi%2Fbigi01.jsp",
"&topMenuId=BI",
"&secondMenuId=BIGI01",
"&menuId=BIGI01",
"&statementId=BIGI02",
"&oldElectionType=",
"&electionType=2",
"&electionName={election}",
"&electionCode=-1",
"&x=73",
"&y=20")
resp <- httr::GET(req_url)
resp_lst <- content(resp) |>
html_table()
precinct <- resp_lst[[1]] |>
janitor::clean_names() |>
select(1:3) |>
set_names(c("시도명", "선거구수", "정수")) |>
slice(4:n())
return(precinct)
}
get_precinct()
#> # A tibble: 18 × 3
#> 시도명 선거구수 정수
#> <chr> <chr> <chr>
#> 1 전국(비례대표) 1 47
#> 2 서울특별시 49 49
#> 3 부산광역시 18 18
#> 4 대구광역시 12 12
#> 5 인천광역시 13 13
#> 6 광주광역시 8 8
#> 7 대전광역시 7 7
#> 8 울산광역시 6 6
#> 9 세종특별자치시 2 2
#> 10 경기도 59 59
#> 11 강원도 8 8
#> 12 충청북도 8 8
#> 13 충청남도 11 11
#> 14 전라북도 10 10
#> 15 전라남도 10 10
#> 16 경상북도 13 13
#> 17 경상남도 16 16
#> 18 제주특별자치도 3 3
precinct_raw <- election_cd |>
mutate(data = map(선거코드, get_precinct))
# precinct_raw |>
# write_rds("data/precinct_raw.rds")
precinct_raw
#> # A tibble: 5 × 3
#> 선거코드 선거명 data
#> <chr> <chr> <list>
#> 1 20200415 제21대 <tibble [18 × 3]>
#> 2 20160413 제20대 <tibble [18 × 3]>
#> 3 20120411 제19대 <tibble [18 × 3]>
#> 4 20080409 제18대 <tibble [17 × 3]>
#> 5 20040415 제17대 <tibble [17 × 3]>
library(ggrepel)
extrafont::loadfonts()
precinct_raw <-
read_rds("data/precinct_raw.rds")
precinct_tbl <- precinct_raw |>
unnest() |>
mutate(선거구수 = parse_integer(선거구수),
정수 = parse_integer(정수)) |>
mutate(지역비례 = ifelse(str_detect(시도명, "전국"), "비례대표", "지역구")) |>
mutate(시도명 = ifelse(시도명 == "제주도", "제주특별자치도", 시도명))
local_prop_gg <- precinct_tbl |>
group_by(선거명, 지역비례) |>
summarise(정수 = sum(정수)) |>
ggplot(aes(x = 선거명, y = 정수, group=지역비례)) +
geom_line(aes(color = 지역비례)) +
geom_point(aes(color = 지역비례), size = 3) +
geom_text_repel(aes(label = 정수, color = 지역비례), size = 4) +
theme_light(base_family = "MaruBuri") +
labs(x = "",
title = "역대 국회의원선거 비례대표와 지역구 정수변화",
) +
theme(legend.position = "top") +
scale_color_manual(values = c("black", "blue")) +
expand_limits(y=0)
local_prop_gg
library(gt)
library(gtExtras)
precinct_sido <- precinct_tbl |>
mutate(선거코드 = as.integer(선거코드)) |>
filter(!str_detect(시도명, "전국")) |>
filter(선거코드 == max(선거코드) | 선거코드 == min(선거코드)) |>
select(시도명, 선거코드, 정수) |>
pivot_wider(names_from = 선거코드, values_from = 정수, values_fill = 0) |>
mutate(정수변화 = `20200415` - `20040415`) |>
arrange(-정수변화)
# janitor::adorn_totals(name = "총합")
precinct_chg_gt <- precinct_sido |>
gt() |>
gt_theme_538() |>
tab_options(
heading.title.font.size = px(16L),
column_labels.font.size = px(14L),
table.font.size = px(12L)
) |>
cols_align(align = "center") |>
tab_header(
title = md("국회의원 선거 지역구 시도별 정수 변화"),
subtitle = md("중앙선거관리위원회 선거통계")
) |>
## 표 전체 합계 -------------------------------------
grand_summary_rows(
columns = c(`20200415`, `20040415`, 정수변화),
fns = list(label = "", fn = "sum"),
fmt = ~ fmt_integer(.),
side = "top"
) |>
## 강조 -------------------------------------
tab_style(
style = cell_text(color = "blue", size = px(15L), weight = "bold"),
locations = cells_body(
rows = 시도명 == "경기도",
columns = 정수변화
)
) |>
tab_style(
style = cell_fill(color = "blue", alpha = 0.1),
locations = cells_body(
rows = 정수변화 > 0
)
) |>
tab_style(
style = cell_text(color = "red", size = px(15L), weight = "bold"),
locations = cells_body(
rows = 정수변화 < 0,
columns = 정수변화
)
) |>
tab_style(
style = cell_fill(color = "red", alpha = 0.1),
locations = cells_body(
rows = 정수변화 < 0
)
) |>
## 변수명 -------------------------------------
cols_label(
`20200415` = html("제21대 <br> 20200415"),
`20040415` = html("제17대 <br> 20040415")
)
precinct_chg_gt
국회의원 선거 지역구 시도별 정수 변화 | ||||
---|---|---|---|---|
중앙선거관리위원회 선거통계 | ||||
시도명 | 제21대 20200415 |
제17대 20040415 |
정수변화 | |
— | 253 | 243 | 10 | |
경기도 | 59 | 49 | 10 | |
세종특별자치시 | 2 | 0 | 2 | |
서울특별시 | 49 | 48 | 1 | |
인천광역시 | 13 | 12 | 1 | |
광주광역시 | 8 | 7 | 1 | |
대전광역시 | 7 | 6 | 1 | |
충청남도 | 11 | 10 | 1 | |
부산광역시 | 18 | 18 | 0 | |
대구광역시 | 12 | 12 | 0 | |
울산광역시 | 6 | 6 | 0 | |
강원도 | 8 | 8 | 0 | |
충청북도 | 8 | 8 | 0 | |
제주특별자치도 | 3 | 3 | 0 | |
전라북도 | 10 | 11 | -1 | |
경상남도 | 16 | 17 | -1 | |
경상북도 | 13 | 15 | -2 | |
전라남도 | 10 | 13 | -3 |
precinct_chg_gt |>
gtsave(filename = "images/precinct_chg_gt.png")
---
title: "지도제작 대회"
subtitle: "선거구와 정수"
description: |
역대 선거구와 국회의원 정수.
author:
- name: 이광춘
url: https://www.linkedin.com/in/kwangchunlee/
affiliation: 한국 R 사용자회
affiliation-url: https://github.com/bit2r
title-block-banner: true
format:
html:
theme: flatly
code-fold: true
code-overflow: wrap
toc: true
toc-depth: 3
toc-title: 목차
number-sections: true
highlight-style: github
self-contained: false
default-image-extension: jpg
filters:
- lightbox
lightbox: auto
link-citations: true
knitr:
opts_chunk:
message: false
warning: false
collapse: true
comment: "#>"
R.options:
knitr.graphics.auto_pdf: true
editor_options:
chunk_output_type: console
---
# 선거구 SVG 파일
[File:South Korean legislative election map (2020).svg](https://commons.wikimedia.org/wiki/File:South_Korean_legislative_election_map_(2020).svg) 파일을 가져와서 시각화한다.
```{r}
library(magick)
precinct_svg <- magick::image_read("data/South_Korean_legislative_election_map_(2020).svg")
image_ggplot(precinct_svg)
```
# 선거구
## 선거구수 및 정수 현황
```{r}
library(tidyverse)
election_cd <- tribble(~"선거코드", ~"선거명",
"20200415", "제21대",
"20160413", "제20대",
"20120411", "제19대",
"20080409", "제18대",
"20040415", "제17대")
election_cd |>
gt::gt()
```
## 제21대 총선
```{r}
library(httr)
library(rvest)
req_url <- glue::glue("http://info.nec.go.kr/electioninfo/electionInfo_report.xhtml?electionId=0000000000",
"&requestURI=%2Felectioninfo%2F0000000000%2Fbi%2Fbigi01.jsp",
"&topMenuId=BI",
"&secondMenuId=BIGI01",
"&menuId=BIGI01",
"&statementId=BIGI02",
"&oldElectionType=",
"&electionType=2",
"&electionName=20200415",
"&electionCode=-1",
"&x=73",
"&y=20")
resp <- httr::GET(req_url)
resp_lst <- content(resp) |>
html_table()
precinct <- resp_lst[[1]] |>
janitor::clean_names() |>
select(1:3) |>
set_names(c("시도명", "선거구수", "정수")) |>
slice(4:n())
precinct |>
gt::gt()
```
## 함수로 변환
```{r}
get_precinct <- function(election='20200415') {
req_url <- glue::glue("http://info.nec.go.kr/electioninfo/electionInfo_report.xhtml?electionId=0000000000",
"&requestURI=%2Felectioninfo%2F0000000000%2Fbi%2Fbigi01.jsp",
"&topMenuId=BI",
"&secondMenuId=BIGI01",
"&menuId=BIGI01",
"&statementId=BIGI02",
"&oldElectionType=",
"&electionType=2",
"&electionName={election}",
"&electionCode=-1",
"&x=73",
"&y=20")
resp <- httr::GET(req_url)
resp_lst <- content(resp) |>
html_table()
precinct <- resp_lst[[1]] |>
janitor::clean_names() |>
select(1:3) |>
set_names(c("시도명", "선거구수", "정수")) |>
slice(4:n())
return(precinct)
}
get_precinct()
```
## 제17~21대 총선
```{r}
precinct_raw <- election_cd |>
mutate(data = map(선거코드, get_precinct))
# precinct_raw |>
# write_rds("data/precinct_raw.rds")
precinct_raw
```
# 분석
## 지역구 vs 비례대표
```{r}
library(ggrepel)
extrafont::loadfonts()
precinct_raw <-
read_rds("data/precinct_raw.rds")
precinct_tbl <- precinct_raw |>
unnest() |>
mutate(선거구수 = parse_integer(선거구수),
정수 = parse_integer(정수)) |>
mutate(지역비례 = ifelse(str_detect(시도명, "전국"), "비례대표", "지역구")) |>
mutate(시도명 = ifelse(시도명 == "제주도", "제주특별자치도", 시도명))
local_prop_gg <- precinct_tbl |>
group_by(선거명, 지역비례) |>
summarise(정수 = sum(정수)) |>
ggplot(aes(x = 선거명, y = 정수, group=지역비례)) +
geom_line(aes(color = 지역비례)) +
geom_point(aes(color = 지역비례), size = 3) +
geom_text_repel(aes(label = 정수, color = 지역비례), size = 4) +
theme_light(base_family = "MaruBuri") +
labs(x = "",
title = "역대 국회의원선거 비례대표와 지역구 정수변화",
) +
theme(legend.position = "top") +
scale_color_manual(values = c("black", "blue")) +
expand_limits(y=0)
local_prop_gg
ragg::agg_jpeg("images/국회의원_지역_비례_정수.jpg",
width = 10, height = 7, units = "in", res = 600)
local_prop_gg
dev.off()
```
## 지역구 시도
```{r}
library(gt)
library(gtExtras)
precinct_sido <- precinct_tbl |>
mutate(선거코드 = as.integer(선거코드)) |>
filter(!str_detect(시도명, "전국")) |>
filter(선거코드 == max(선거코드) | 선거코드 == min(선거코드)) |>
select(시도명, 선거코드, 정수) |>
pivot_wider(names_from = 선거코드, values_from = 정수, values_fill = 0) |>
mutate(정수변화 = `20200415` - `20040415`) |>
arrange(-정수변화)
# janitor::adorn_totals(name = "총합")
precinct_chg_gt <- precinct_sido |>
gt() |>
gt_theme_538() |>
tab_options(
heading.title.font.size = px(16L),
column_labels.font.size = px(14L),
table.font.size = px(12L)
) |>
cols_align(align = "center") |>
tab_header(
title = md("국회의원 선거 지역구 시도별 정수 변화"),
subtitle = md("중앙선거관리위원회 선거통계")
) |>
## 표 전체 합계 -------------------------------------
grand_summary_rows(
columns = c(`20200415`, `20040415`, 정수변화),
fns = list(label = "", fn = "sum"),
fmt = ~ fmt_integer(.),
side = "top"
) |>
## 강조 -------------------------------------
tab_style(
style = cell_text(color = "blue", size = px(15L), weight = "bold"),
locations = cells_body(
rows = 시도명 == "경기도",
columns = 정수변화
)
) |>
tab_style(
style = cell_fill(color = "blue", alpha = 0.1),
locations = cells_body(
rows = 정수변화 > 0
)
) |>
tab_style(
style = cell_text(color = "red", size = px(15L), weight = "bold"),
locations = cells_body(
rows = 정수변화 < 0,
columns = 정수변화
)
) |>
tab_style(
style = cell_fill(color = "red", alpha = 0.1),
locations = cells_body(
rows = 정수변화 < 0
)
) |>
## 변수명 -------------------------------------
cols_label(
`20200415` = html("제21대 <br> 20200415"),
`20040415` = html("제17대 <br> 20040415")
)
precinct_chg_gt
precinct_chg_gt |>
gtsave(filename = "images/precinct_chg_gt.png")
```