중앙선거관리위원회 선거통계시스템에서 “기본현황”에서 “투표소 현황” 데이터를 가져온다. 먼저 지방선거 “제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()
“투표소 주소” 칼럼을 기준으로 위경도 정보를 붙인다. 위경도 정보를 다음카카오 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()
성남시 분당구 지도를 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)
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>",
"· 투표소주소: ", `투표소주소`, "<br>",
"· 건물명: ", `건물명`, "<br>"
)))