선거구와 정수

역대 선거구와 국회의원 정수.

저자
소속

1 선거구 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)

2 선거구

2.1 선거구수 및 정수 현황

코드
library(tidyverse)

election_cd <- tribble(~"선거코드", ~"선거명",
         "20200415", "제21대",
         "20160413", "제20대",
         "20120411", "제19대",
         "20080409", "제18대",
         "20040415", "제17대")

election_cd |> 
  gt::gt()
선거코드 선거명
20200415 제21대
20160413 제20대
20120411 제19대
20080409 제18대
20040415 제17대

2.2 제21대 총선

코드
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

2.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

2.4 제17~21대 총선

코드
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]>

3 분석

3.1 지역구 vs 비례대표

코드
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()
#> png 
#>   2

3.2 지역구 시도

코드
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")