1 총선 데이터

위키백과사전 대한민국_제21대_국회의원_선거 웹사이트에서 제21대 총선 결과 데이터를 가져온다.

library(tidyverse)
library(rvest)
library(gt)

wiki_url <- "https://ko.wikipedia.org/wiki/대한민국_제21대_국회의원_선거"

wiki_dat <- wiki_url %>% 
  read_html() %>% 
  html_nodes(xpath = '//*[@id="mw-content-text"]/div/table[9]') %>% 
  html_table(fill = TRUE) %>% 
  .[[1]]

wiki_df <- wiki_dat %>% 
  set_names(wiki_dat[1,]) %>% 
  janitor::clean_names() %>% 
  slice(3:n()) %>% 
  select(정당_2, 지역구_3, 비례대표_3) %>% 
  filter(정당_2 != "") %>% 
  mutate(정당 = case_when(row_number() == 1 ~ "더불어민주당",
                          row_number() == 2 ~ "미래한국당",
                          TRUE ~ 정당_2)) %>% 
  mutate(지역구_3 = if_else(지역구_3 == "-", 0, as.numeric(지역구_3)),
         비례대표_3 = if_else(비례대표_3 == "-", 0, as.numeric(비례대표_3))) %>% 
   transmute(정당, 의원수 = 지역구_3 + 비례대표_3) %>% 
  filter(의원수 >0, 정당 != "총계") 

wiki_df %>% 
  mutate(비율 = 의원수/ sum(의원수)) %>% 
  gt() %>% 
    fmt_percent(columns = "비율", decimals = 1)
정당 의원수 비율
더불어민주당 180 60.0%
미래한국당 103 34.3%
정의당 6 2.0%
국민의당 3 1.0%
열린민주당 3 1.0%
무소속 5 1.7%

2 제20대 국회 시각화 1

ggparliament 팩키지를 파악해서 자료구조에 맞춰 채워넣고 시각화한다.

library(ggparliament)
library(extrafont)
loadfonts()

kor_house <- tribble(~"index", ~"key", ~"value",
                     1, "year", "2020",
                     2, "year", "2020",
                     3, "year", "2020",
                     4, "year", "2020",
                     5, "year", "2020",
                     6, "year", "2020",
                     1, "country", "Korea",
                     2, "country", "Korea",
                     3, "country", "Korea",
                     4, "country", "Korea",
                     5, "country", "Korea",
                     6, "country", "Korea",
                     1, "party_long", "더불어민주당",
                     2, "party_long", "미래통합당",
                     3, "party_long", "정의당",
                     4, "party_long", "국민의당",
                     5, "party_long", "연린민주",
                     6, "party_long", "무소속",
                     1, "party_short", "더민당",
                     2, "party_short", "미통당",
                     3, "party_short", "정의당",
                     4, "party_short", "국민의당",
                     5, "party_short", "열린민주",
                     6, "party_short", "무소속",
                     1, "seats", "180",
                     2, "seats", "103",
                     3, "seats", "6",
                     4, "seats", "3",
                     5, "seats", "3",
                     6, "seats", "5",
                     1, "government", "1",
                     2, "government", "0",
                     3, "government", "0",
                     4, "government", "0",
                     5, "government", "0",
                     6, "government", "0",
                     1, "colour", "#184EA1",
                     2, "colour", "#EF426F",
                     3, "colour", "#FBCA08",
                     4, "colour", "#EA5504",
                     5, "colour", "#143E9B",
                     6, "colour", "#828282"
                     ) %>% 
  spread(key, value, convert = TRUE)

kor_house <- kor_house %>% 
  mutate(index = case_when(index == 3 ~ 1,
                           index == 1 ~ 2,
                           index == 5 ~ 3,
                           index == 6 ~ 4,
                           index == 4 ~ 5,
                           index == 2 ~6)) %>% 
  arrange(index)


# 정당 진보-보수 스펙트럼에 따른 재배열
kor_house <- parliament_data(election_data = kor_house,
  type = "semicircle",
  parl_rows = 9,
  party_seats = kor_house$seats)

ggplot(kor_house, aes(x, y, colour = party_short)) +
  geom_parliament_seats() + 
  #highlight the party in control of the House with a black line
  # geom_highlight_government(government == 1) +
  #draw majority threshold
  draw_majoritythreshold(n = 150, label = FALSE, type = 'semicircle')+
  #set theme_ggparliament
  theme_void(base_family="AppleGothic") +
  #other aesthetics
  labs(colour = NULL, 
       title = "제21대 대한민국 국회",
       subtitle = "집권당은 굵은 윤곽선으로 표기") +
  scale_colour_manual(values = kor_house$colour, 
                      limits = kor_house$party_short)