1 선거구 지도

2020년 21대 국회의원 총선거 지도는 VW Lab 김승범 소장님 대한민국 행정동 경계 파일을 기반으로 하여 오마이뉴스에서 제작한 지도입니다.

library(tidyverse)
library(sf)

precinct <- st_read("data/shapefile/2020_21_elec_253_simple.json")
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
precinct %>% 
  filter(str_detect(SGG_1, "경기")) %>% 
  select(geometry) %>% 
  plot()

2 제21대 총선 선거구

위키백과 대한민국의 국회의원 선거구 목록에 따르면 국회의원 선거구 목록을 가져올 수 있다. 시도명을 추출하여 별도 벡터로 준비하고 추출한 선거구표 데이터프레임을 하나로 합쳐서 시도명과 결합된 최종 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 <- read_rds("data/precinct_253_df.rds")

precinct_253_df %>% 
  DT::datatable()

2.1 시도별 선거구

시도별 선거구가 가장 많은 살펴보자

시도명 표

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

시도명 시각화

precinct_253_df %>% 
  count(시도명, sort=TRUE, name="선거구수") %>% 
  ggplot(aes(x=fct_reorder(시도명, 선거구수), y=선거구수, fill=시도명)) +
    geom_col(show.legend = FALSE) +
    coord_flip() +
    labs(x="", title="제21대 총선 시도별 선거구수")

3 육각형 선거구

앞서 준비한 제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