1 투표소 공간정보

1.1 투표소 위치

중앙선거관리위원회 선거통계시스템에서 “기본현황”에서 “투표소 현황” 데이터를 가져온다. 먼저 지방선거 “제7회” → “경기도” → “성남시 분당구”에서 투표소 주소를 가져온다.

library(tidyverse)
library(readxl)

vs_dat <- read_excel("data/투표소/경기_성남_분당_투표소_현황.xlsx", sheet="Sheet1", skip=3)

vs_df <- vs_dat %>% 
  select(`읍면동명`,`투표소명`,`건물명`,`투표소 주소`) %>% 
  rename(`투표소주소` = `투표소 주소`)

vs_df %>% 
  DT::datatable()

1.2 위도경도 데이터 매칭

“투표소 주소” 칼럼을 기준으로 위경도 정보를 붙인다. 위경도 정보를 다음카카오 API에서 받아 데이터프레임으로 반환하는 함수(get_lonlat())를 제작한 후에 이를 purrr 팩키지 map() 함수로 호출하여 리스트 칼럼으로 저장시킨다.

library(httr)
library(jsonlite)

get_lonlat <- function(addr) {
  # HTTP 요청을 실행합니다. 
  addr_res <- GET(url = 'https://dapi.kakao.com/v2/local/search/address.json',
             query = list(query = addr),
             add_headers(Authorization = paste0("KakaoAK ", DAUM_MAP_API_KEY)))
  
  # 지리정보 데이터프레임
  addr_list <- addr_res %>% 
    content(as = 'text') %>% 
    fromJSON()
  
  ## 도로명주소
  addr_df <- addr_list$documents$road_address %>% 
    select(x,y)
  return(addr_df)
}

vs_df <- vs_df %>% 
  mutate(lonlat = map(`투표소주소`, get_lonlat))

geo_vs_df <- vs_df %>% 
  mutate(lon = map_chr(lonlat, ~.$x),
         lat = map_chr(lonlat, ~.$y)) %>% 
  mutate(lon = as.numeric(lon),
         lat = as.numeric(lat)) %>% 
  select(-lonlat)

geo_vs_df %>% 
  DT::datatable()

2 투표소 시각화

2.1 정적 시각화

성남시 분당구 지도를 ggmap 팩키지로 가져온다. 그리고 ggplot 문법에 맞춰서 투표소 위치를 점을 찍어 시각화한다.

library(ggmap)

## 지도중심

geo_vs_center_df <- geo_vs_df %>% 
  summarise(median_x = median(lon),
            median_y = median(lat))

bundang_map <- get_map(c(geo_vs_center_df$median_x,
                         geo_vs_center_df$median_y), zoom = 13, scale = 1)

ggmap(bundang_map) +
  geom_point(aes(lon, lat), color="blue", data = geo_vs_df) +
  guides(color=NULL)

2.2 인터랙티브 시각화

library(leaflet)

leaflet(data = geo_vs_df) %>% 
  addProviderTiles(providers$OpenStreetMap) %>% 
  addMarkers(lng=~lon, lat=~lat, clusterOptions = markerClusterOptions(),
                   popup = ~ as.character(paste0("<strong>", paste0(`읍면동명`,":",`투표소명`), "</strong><br>",
                                                 "-----------------------------------------------------------<br>",
                                                 "&middot; 투표소주소: ", `투표소주소`, "<br>",
                                                 "&middot; 건물명: ", `건물명`, "<br>"
                   )))