2020년 21대 국회의원 총선거 지도는 VW Lab 김승범 소장님 대한민국 행정동 경계 파일을 기반으로 하여 오마이뉴스에서 제작한 지도입니다.
Reading layer `2020_21_elec_253_simple' from data source `/Users/statkclee/swc/election/data/shapefile/2020_21_elec_253_simple.json' using driver `GeoJSON'
Simple feature collection with 253 features and 4 fields
geometry type: MULTIPOLYGON
dimension: XY
bbox: xmin: 124.6098 ymin: 33.16123 xmax: 130.9175 ymax: 38.61369
epsg (SRID): 4326
proj4string: +proj=longlat +datum=WGS84 +no_defs
위키백과 대한민국의 국회의원 선거구 목록에 따르면 국회의원 선거구 목록을 가져올 수 있다. 시도명을 추출하여 별도 벡터로 준비하고 추출한 선거구표 데이터프레임을 하나로 합쳐서 시도명과 결합된 최종 21대 총선 선거구 데이터로 준비한다.
library(tidyverse)
library(rvest)
library(curl)
# Sys.setlocale("LC_ALL", "C")
precinct_html <- read_html(curl('https://ko.wikipedia.org/wiki/대한민국의_국회의원_선거구_목록', handle = curl::new_handle("useragent" = "Mozilla/5.0")))
## 시도명
province_name <- precinct_html %>%
html_nodes('span.mw-headline') %>%
html_text()
province_name <- province_name[2:(length(province_name)-1)]
## 선거구표
precinct_tbl <- precinct_html %>%
html_nodes('table') %>%
html_table(fill = TRUE)
# Sys.setlocale("LC_ALL", "Korean")
# 시도명 253개 맞춤
precinct_253_df <- data.frame()
for(i in 1:length(province_name)) {
tmp_province_df <- precinct_tbl[[i]] %>%
mutate(시도명 = province_name[i])
precinct_253_df <- bind_rows(precinct_253_df, tmp_province_df) %>%
select(시도명, 선거구명, 선거구역)
}
precinct_253_df %>%
write_rds("data/precinct_253_df.rds")
제대로 가져왔는지 확인보자.
시도별 선거구가 가장 많은 살펴보자
시도명 표
precinct_253_df %>%
count(시도명, sort=TRUE, name="선거구수") %>%
mutate(비율=round(선거구수/sum(선거구수) *100,1)) %>%
knitr::kable()
시도명 | 선거구수 | 비율 |
---|---|---|
경기도 | 59 | 23.3 |
서울특별시 | 49 | 19.4 |
부산광역시 | 18 | 7.1 |
경상남도 | 16 | 6.3 |
경상북도 | 13 | 5.1 |
인천광역시 | 13 | 5.1 |
대구광역시 | 12 | 4.7 |
충청남도 | 11 | 4.3 |
전라남도 | 10 | 4.0 |
전라북도 | 10 | 4.0 |
강원도 | 8 | 3.2 |
광주광역시 | 8 | 3.2 |
충청북도 | 8 | 3.2 |
대전광역시 | 7 | 2.8 |
울산광역시 | 6 | 2.4 |
제주특별자치도 | 3 | 1.2 |
세종특별자치시 | 2 | 0.8 |
앞서 준비한 제21대 국회의원 선거구 지도에서 서울만 추출하여 이를 원본 그대로 시각화해 본다. 그리고 나서 geogrid
기능을 사용해서 육각형 모양으로 변환을 시킨다.
원본 서울 선거구
library(tmap)
seoul_precinct <- precinct %>%
filter(SGG_1 == "서울") %>%
mutate(SGG_Name = str_extract(SGG_3, "\\s([가-힣].+)$"))
seoul_plot <- tm_shape(seoul_precinct) +
tm_polygons("SGG_Code", palette = "viridis") +
tm_text("SGG_Name", size=0.5) +
tm_layout(fontfamily="NanumGothic",
legend.position = c("left","top"),
legend.show=FALSE)
seoul_plot
육각형 서울 선거구
library(geogrid)
seoul_hex <- calculate_grid(shape = seoul_precinct, grid_type = "hexagonal", seed = 3)
seoul_hex_map <- assign_polygons(seoul_precinct, seoul_hex)
seoul_hex_plot <- tm_shape(seoul_hex_map) +
tm_polygons("SGG_Code", palette = "viridis") +
tm_text("SGG_Name", size=0.5) +
tm_layout(fontfamily="NanumGothic",
legend.position = c("left","top"),
legend.show=FALSE)
seoul_hex_plot