전라남도를 인구수 기준으로 총 23개 시군을 기준으로 세대수, 면적, GRDP(지역내총생산, 단위:억원) 등을 비교해 본다.
# 0. 환경설정 -----
library(tidyverse)
library(extrafont)
loadfonts()
library(ggthemes)
library(DT)
library(readxl)
library(sf)
library(mapview)
library(gridExtra)
library(plotly)
library(leaflet)
# 데이터
presid_19_df <- readRDS("data/naju_presid_19.rds")
# 전남 지도 데이터
jn_grdp_map <- readRDS("data/jn_grdp_map.rds")
# 속초 지도 데이터
naju_map <- readRDS("data/naju_map.rds")
names(naju_map) <- enc2native(names(naju_map))
# 2. 표 ---------------------
jn_grdp_map_df <- jn_grdp_map
st_geometry(jn_grdp_map_df) <- NULL
jn_grdp_map_df %>%
arrange(desc(인구)) %>%
datatable() %>%
formatCurrency(c(3:8), currency="", digits=0)
# 3. 데이터 시각화 -----
## 2.1. 정적 그래프 --------
grdp_g <- ggplot(data=jn_grdp_map, aes(fill=GRDP_2015)) +
geom_sf() +
theme_bw(base_family="NanumGothic") +
labs(title="전라남도 시군 지역내총생산(GRDP) - 2015") +
theme(legend.position = "right") +
# scale_fill_gradient(low = "wheat1", high = "red", name = "GRDP(단위:억)", labels = scales::comma) +
viridis::scale_fill_viridis(name = "GRDP(단위:억)", labels = scales::comma)
pop_g <- ggplot(data=jn_grdp_map, aes(fill=인구)) +
geom_sf() +
theme_bw(base_family="NanumGothic") +
labs(title="전라남도 시군 인구 - 2016") +
theme(legend.position = "right") +
# scale_fill_gradient(low = "wheat1", high = "red", name = "인구(단위:명)", labels = scales::comma) +
viridis::scale_fill_viridis(name = "인구(단위:명)", labels = scales::comma)
grid.arrange(grdp_g, pop_g, nrow=1)
## 2.2. 동적 그래프 --------
mapview(jn_grdp_map, zcol="GRDP_2015") +
mapview(jn_grdp_map, zcol="인구")
유승민과 심상정을 지지했던 유권자의 경우 사전투표비율이 약 2배 이상 높기 때문에, 유승민, 심상정을 지지했던 유권자를 선별하여 사전투표에 역량을 집중하는 것이 유리한 것으로 데이터상 나타나고 있음.
## 2.1. 사전투표 캠페인 부석
vote_type_df <- presid_19_df %>%
filter(!str_detect(읍면동명, "동$|읍$|면$"))
vote_type_df %>%
select(득표유형="투표구명", "문재인", "홍준표", "안철수", "유승민", "심상정") %>%
gather(후보명, 득표수, -득표유형) %>%
mutate(후보명 = factor(후보명, levels = c("문재인", "홍준표", "안철수", "유승민", "심상정"))) %>%
mutate(득표유형 = factor(득표유형, levels = c("합계", "관외사전투표", "거소·선상투표", "재외투표"))) %>%
ggplot(aes(x=후보명, y=득표수, fill=득표유형)) +
geom_col(position="dodge") +
labs(x="", y="득표수") +
scale_y_continuous(labels = scales::comma) +
theme(legend.position = "top")
vote_type_tbl <- vote_type_df %>%
select(득표유형="읍면동명", "문재인", "홍준표", "안철수", "유승민", "심상정") %>%
gather(후보명, 득표수, -득표유형) %>%
mutate(후보명 = factor(후보명, levels = c("문재인", "홍준표", "안철수", "유승민", "심상정"))) %>%
group_by(후보명) %>%
mutate(득표율 = 득표수 / sum(득표수)) %>%
unite(득표변수, 득표수, 득표율, sep="_")
vote_type_tbl %>% spread("후보명", "득표변수") %>%
separate("문재인", into=c("문재인", "문재인비율"), sep="_", convert=TRUE) %>%
separate("홍준표", into=c("홍준표", "홍준표비율"), sep="_", convert=TRUE) %>%
separate("안철수", into=c("안철수", "안철수비율"), sep="_", convert=TRUE) %>%
separate("유승민", into=c("유승민", "유승민비율"), sep="_", convert=TRUE) %>%
separate("심상정", into=c("심상정", "심상정비율"), sep="_", convert=TRUE) %>%
arrange(desc(문재인)) %>%
DT::datatable() %>%
formatCurrency(c("문재인", "홍준표", "안철수", "유승민", "심상정"), currency="", digits=0) %>%
formatPercentage(c("문재인비율", "홍준표비율", "안철수비율", "유승민비율", "심상정비율"), digits=1)
# 2. 지리정보 시각화 -----
naju_g <- ggplot(data=naju_map, aes(fill=선거인수,
text = paste0('읍면동명 :', 읍면동명, "\n",
'--------------------------',"\n",
'선거인수 :', scales::comma(선거인수), "\n",
'투표수 :', scales::comma(투표수), "\n",
'투표율 :', scales::percent(투표율), "\n",
'--------------------------',"\n",
'문재인 :', scales::comma(문재인), "\n",
'홍준표 :', scales::comma(홍준표), "\n",
'안철수 :', scales::comma(안철수), "\n",
'유승민 :', scales::comma(유승민), "\n",
'심상정 :', scales::comma(심상정), "\n"))) +
geom_sf() +
theme_void(base_family="NanumGothic") +
labs(title="제19대 대통령선거", subtitle="2017년 5월, 속초시") +
theme(legend.position = "right") +
viridis::scale_fill_viridis(name = "유권자수(명)", labels = scales::comma)
ggplotly(naju_g, tooltip = "text")
# 2. 데이터 정제 -----
naju_map_precinct <- naju_map %>%
mutate(선거구 = case_when(읍면동명 %in% c("남평읍", "노안면", "금천면", "산포면", "다도면") ~ "나주시가선거구",
읍면동명 %in% c("다시면", "문평면", "송월동", "금남동", "성북동") ~ "나주시나선거구",
읍면동명 %in% c("세지면", "봉황면", "빛가람동") ~ "나주시다선거구",
읍면동명 %in% c("왕곡면", "반남면", "공산면", "동강면", "영강동", "영산동", "이창동") ~ "나주시라선거구")) %>%
group_by(선거구) %>%
summarise(선거인수 = sum(선거인수),
투표수 = sum(투표수),
문재인 = sum(문재인),
홍준표 = sum(홍준표),
안철수 = sum(안철수),
유승민 = sum(유승민),
심상정 = sum(심상정)) %>%
mutate(투표율 = 투표수 / 선거인수)
# 2. 지리정보 시각화 -----
naju_precinct_g <- ggplot(data=naju_map_precinct, aes(fill=선거인수,
text = paste0('선거구 :', 선거구, "\n",
'--------------------------',"\n",
'선거인수 :', scales::comma(선거인수), "\n",
'투표수 :', scales::comma(투표수), "\n",
'투표율 :', scales::percent(투표율), "\n",
'--------------------------',"\n",
'문재인 :', scales::comma(문재인), "\n",
'홍준표 :', scales::comma(홍준표), "\n",
'안철수 :', scales::comma(안철수), "\n",
'유승민 :', scales::comma(유승민), "\n",
'심상정 :', scales::comma(심상정), "\n"))) +
geom_sf() +
theme_void(base_family="NanumGothic") +
labs(title="제19대 대통령선거", subtitle="2017년 5월, 나주시") +
theme(legend.position = "right") +
viridis::scale_fill_viridis(name = "유권자수(명)", labels = scales::comma)
ggplotly(naju_precinct_g, tooltip = "text")
# 3. 표 -----
naju_map_precinct_df <- naju_map_precinct
st_geometry(naju_map_precinct_df) <- NULL
naju_map_precinct_df %>%
DT::datatable() %>%
formatCurrency(c(2:8), currency="", digits=0) %>%
formatPercentage(c(9), digits=1)
# 1. 데이터 -----
## 1.1. 투표소 위치 데이터
vstation_df <- read_excel("data/나주_투표소.xlsx", sheet="Sheet2_naju")
names(vstation_df) <- enc2native(names(vstation_df))
## 1.2. 대통령선거 데이터
p19_df <- readRDS("data/naju_presid_19.rds")
names(p19_df) <- enc2native(names(p19_df))
p19_df <- p19_df %>%
rename(투표소명 = "투표구명")
## 1.3. 데이터 병합
p19_vstation_df <- left_join(p19_df, vstation_df) %>%
mutate(투표율 = scales::percent(ifelse(선거인수 == 0, 0, 투표수/선거인수)),
문재인득표율 = scales::percent(문재인/투표수),
홍준표득표율 = scales::percent(홍준표/투표수),
안철수득표율 = scales::percent(안철수/투표수),
유승민득표율 = scales::percent(유승민/투표수),
심상정득표율 = scales::percent(심상정/투표수),
선거인수 = scales::comma(선거인수),
투표수 = scales::comma(투표수),
문재인 = scales::comma(문재인),
홍준표 = scales::comma(홍준표),
안철수 = scales::comma(안철수),
유승민 = scales::comma(유승민),
심상정 = scales::comma(심상정)) %>%
mutate(lon = as.numeric(Longitude),
lat = as.numeric(Latitude))
# 3. 시각화 -----
naju_map <- read_rds("data/naju_map.rds")
leaflet(data = p19_vstation_df) %>%
addPolygons(data=naju_map, weight=2, col = 'blue') %>%
addProviderTiles(providers$OpenStreetMap) %>%
addCircleMarkers(lng=~lon, lat=~lat, clusterOptions = markerClusterOptions(),
popup = ~ as.character(paste0("<strong>", paste0(`읍면동명`,":",`투표소명`), "</strong><br><br>",
"· 선거인수(투표율): ", `선거인수`," (",투표율, ")", "<br>",
"-----------------------------------------------------------<br>",
"· 1번 문재인: ", `문재인`," (",문재인득표율, ")", "<br>",
"· 2번 홍준표: ", `홍준표`," (",홍준표득표율, ")", "<br>",
"· 3번 안철수: ", `안철수`," (",안철수득표율, ")", "<br>",
"· 4번 유승민: ", `유승민`," (",유승민득표율, ")", "<br>",
"· 5번 심상정: ", `심상정`," (",심상정득표율, ")", "<br>"
)))
# 4. 표 ----
p19_vstation_df %>%
select(-Longitude, -Latitude, -`투표소 주소`, -`X__1`, -건물명) %>%
datatable()