Chapter 3 지도 시각화용 데이터 세트 생성

사용할 패키지 불러오기

library(ggmap)
library(ggplot2)
library(raster)
library(rgeos)
library(maptools)
library(rgdal)
library(tidyverse)

3.1 득표수 데이터 파일 불러오기

제19대 대통령선거 특표 데이터를 불러온다.

data <- read_csv("data/19-President_Total.csv", 
                 locale = locale("ko", encoding = "euc-kr"))
## 
## -- Column specification --------------------------------------------------------
## cols(
##   .default = col_double(),
##   CTPRVN_NM = col_character(),
##   SIG_NM = col_character(),
##   EMD_NM = col_character(),
##   VOTE_NM = col_character()
## )
## i Use `spec()` for the full column specifications.
str(data)
## tibble [22,214 x 22] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ CTPRVN_NM: chr [1:22214] "전국" "서울특별시" "서울특별시" "서울특별시" ...
##  $ SIG_NM   : chr [1:22214] NA "합계" "종로구" "종로구" ...
##  $ EMD_NM   : chr [1:22214] NA NA "합계" "거소·선상투표" ...
##  $ VOTE_NM  : chr [1:22214] NA NA NA NA ...
##  $ N_People : num [1:22214] 42479710 8382999 133769 218 12803 ...
##  $ N_Vote   : num [1:22214] 32807908 6590646 102566 206 12803 ...
##  $ Moon_J   : num [1:22214] 13423800 2781345 42512 64 5842 ...
##  $ Hong_J   : num [1:22214] 7852849 1365285 22325 42 2025 ...
##  $ Ahn_Ch   : num [1:22214] 6998342 1492767 22313 65 2509 ...
##  $ You_S    : num [1:22214] 2208771 476973 7412 8 1156 ...
##  $ Shim_S   : num [1:22214] 2017458 425459 7113 15 1145 ...
##  $ Cho_W    : num [1:22214] 42949 9987 228 0 17 ...
##  $ Oh       : num [1:22214] 6040 789 5 1 0 0 0 0 0 0 ...
##  $ Chang    : num [1:22214] 21709 3554 78 3 4 ...
##  $ Lee_J    : num [1:22214] 9140 1938 31 1 2 ...
##  $ Kim      : num [1:22214] 27229 3416 63 0 15 ...
##  $ Lee_K    : num [1:22214] 11355 1277 26 0 6 ...
##  $ Yoon_H   : num [1:22214] 18543 2177 47 0 9 ...
##  $ Kim_M    : num [1:22214] 33990 3950 49 2 6 ...
##  $ Sum      : num [1:22214] 32672175 6568917 102202 201 12736 ...
##  $ Invalid  : num [1:22214] 135733 21729 364 5 67 ...
##  $ blank    : num [1:22214] 9671802 1792353 31203 12 0 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   CTPRVN_NM = col_character(),
##   ..   SIG_NM = col_character(),
##   ..   EMD_NM = col_character(),
##   ..   VOTE_NM = col_character(),
##   ..   N_People = col_double(),
##   ..   N_Vote = col_double(),
##   ..   Moon_J = col_double(),
##   ..   Hong_J = col_double(),
##   ..   Ahn_Ch = col_double(),
##   ..   You_S = col_double(),
##   ..   Shim_S = col_double(),
##   ..   Cho_W = col_double(),
##   ..   Oh = col_double(),
##   ..   Chang = col_double(),
##   ..   Lee_J = col_double(),
##   ..   Kim = col_double(),
##   ..   Lee_K = col_double(),
##   ..   Yoon_H = col_double(),
##   ..   Kim_M = col_double(),
##   ..   Sum = col_double(),
##   ..   Invalid = col_double(),
##   ..   blank = col_double()
##   .. )

3.2 시도별 후보자 득표수 데이터 세트 만들기

  • 행의 선택 : 불러온 데이터의 SIG_NM 컬럼 값이 “합계” 행들이 시도별 후보자 득표수 합계를 보여주고 있다.
  • 컬럼 선택 : 시도명 컬럼(CTPRVN_NM), 후보자 득표수 컬럼
  • 컬럼 생성 : 기타 후보자(etc) 득표수 컬럼
vote_CTPRVN <- data %>% filter(SIG_NM == "합계") %>% 
        mutate(etc = Sum - (Moon_J + Hong_J + Ahn_Ch + You_S + Shim_S)) %>% 
        dplyr::select(CTPRVN_NM, Moon_J, Hong_J, Ahn_Ch, You_S, Shim_S, etc)
str(vote_CTPRVN)
## tibble [17 x 7] (S3: tbl_df/tbl/data.frame)
##  $ CTPRVN_NM: chr [1:17] "서울특별시" "부산광역시" "대구광역시" "인천광역시" ...
##  $ Moon_J   : num [1:17] 2781345 872127 342620 747090 583847 ...
##  $ Hong_J   : num [1:17] 1365285 720484 714205 379191 14882 ...
##  $ Ahn_Ch   : num [1:17] 1492767 378907 235757 428888 287222 ...
##  $ You_S    : num [1:17] 476973 162480 198459 118691 20862 ...
##  $ Shim_S   : num [1:17] 425459 109329 74440 129925 43719 ...
##  $ etc      : num [1:17] 27088 9382 8895 9178 4300 ...

3.3 득표수 데이터 세트의 모양 변환

득표수 데이터 세트를 보면, 후보자별 득표수 데이터가 후보자별 컬럼에 저장되어 있다. 즉, wide 형태로 되어 있다.

데이터 세트의 분석력을 높이기 위해 이를 long 형태로 변환하는 것이 좋다.

vote_CTPRVN 데이터 세트를 long 형태로 변환한다.

vote_CTPRVN_long <- vote_CTPRVN %>% pivot_longer(names_to = "name", values_to = "n_vote", -1)
str(vote_CTPRVN_long)
## tibble [102 x 3] (S3: tbl_df/tbl/data.frame)
##  $ CTPRVN_NM: chr [1:102] "서울특별시" "서울특별시" "서울특별시" "서울특별시" ...
##  $ name     : chr [1:102] "Moon_J" "Hong_J" "Ahn_Ch" "You_S" ...
##  $ n_vote   : num [1:102] 2781345 1365285 1492767 476973 425459 ...
  • 이제 17개 이던 행의 갯수가 102개로 늘어 났다. (6명 후보 * 17개 시도 = 102개 행)

3.4 득표수 데이터 세트와 지리정보 데이터 세트 결합

  • 왼쪽 테이블 : vote_CTPRVN, 주키 : CTPRVN_NM
  • 오른쪽 테이블 : result, 주키 : CTP_KOR_NM
  • join 에 사용될 주키의 이름이 다르다.

두 데이터 세트를 결합하여 vote에 대입한다.

vote <- vote_CTPRVN_long %>% 
  left_join(result, by = c("CTPRVN_NM" = "CTP_KOR_NM"))
str(vote)
## tibble [4,793,028 x 11] (S3: tbl_df/tbl/data.frame)
##  $ CTPRVN_NM : chr [1:4793028] "서울특별시" "서울특별시" "서울특별시" "서울특별시" ...
##  $ name      : chr [1:4793028] "Moon_J" "Moon_J" "Moon_J" "Moon_J" ...
##  $ n_vote    : num [1:4793028] 2781345 2781345 2781345 2781345 2781345 ...
##  $ long      : num [1:4793028] 127 127 127 127 127 ...
##  $ lat       : num [1:4793028] 37.6 37.6 37.6 37.6 37.6 ...
##  $ order     : int [1:4793028] 1 2 3 4 5 6 7 8 9 10 ...
##  $ hole      : logi [1:4793028] FALSE FALSE FALSE FALSE FALSE FALSE ...
##  $ piece     : Factor w/ 2228 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ id        : chr [1:4793028] "11" "11" "11" "11" ...
##  $ group     : Factor w/ 4558 levels "11.1","11.2",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ CTP_ENG_NM: chr [1:4793028] "Seoul" "Seoul" "Seoul" "Seoul" ...

3.5 후보자 이름 컬럼을 factor 형으로 변환

votename 컬럼을 factor 형으로 변환한다. 그 순서는 후보자 번호 순으로 한다.

vote$name <- factor(vote$name, levels = c("Moon_J", "Hong_J", "Ahn_Ch", "You_S", "Shim_S", "etc"))
str(vote)
## tibble [4,793,028 x 11] (S3: tbl_df/tbl/data.frame)
##  $ CTPRVN_NM : chr [1:4793028] "서울특별시" "서울특별시" "서울특별시" "서울특별시" ...
##  $ name      : Factor w/ 6 levels "Moon_J","Hong_J",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ n_vote    : num [1:4793028] 2781345 2781345 2781345 2781345 2781345 ...
##  $ long      : num [1:4793028] 127 127 127 127 127 ...
##  $ lat       : num [1:4793028] 37.6 37.6 37.6 37.6 37.6 ...
##  $ order     : int [1:4793028] 1 2 3 4 5 6 7 8 9 10 ...
##  $ hole      : logi [1:4793028] FALSE FALSE FALSE FALSE FALSE FALSE ...
##  $ piece     : Factor w/ 2228 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ id        : chr [1:4793028] "11" "11" "11" "11" ...
##  $ group     : Factor w/ 4558 levels "11.1","11.2",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ CTP_ENG_NM: chr [1:4793028] "Seoul" "Seoul" "Seoul" "Seoul" ...

3.6 데이터 세트 저장하기

이제 득표수 데이터에 지리정보가 결합된 데이터 세트 M을 02-vote_CTPRVN_last.rds 파일로 저장한다.

write_rds(vote, "data/03-vote_CTPRVN_last.rds")