성남통계 - 통계자료실에서 2018년 12월 31일 기준 2018년 기준 주민등록인구통계 원시자료와 2015년 기준 주민등록인구통계 원시자료 기준데이터로 성남시 인구통계 데이터 기준을 삼는다. 즉,
library(tidyverse)
library(readxl)
성남시_동명 <- c("연령", "성남시", "수정구", "신흥1동", "신흥2동", "신흥3동", "태평1동", "태평2동", "태평3동", "태평4동", "수진1동", "수진2동", "단대동", "산성동", "양지동", "복정동", "위례동", "신촌동", "고등동", "시흥동", "중원구", "성남동", "중앙동", "금광1동", "금광2동", "은행1동", "은행2동", "상대원1동", "상대원2동", "상대원3동", "하대원동", "도촌동", "분당구", "분당동", "수내1동", "수내2동", "수내3동", "정자동", "정자1동", "정자2동", "정자3동", "서현1동", "서현2동", "이매1동", "이매2동", "야탑1동", "야탑2동", "야탑3동", "판교동", "삼평동", "백현동", "금곡동", "구미1동", "구미동", "운중동")
수정구 <- c("신흥1동", "신흥2동", "신흥3동", "태평1동", "태평2동", "태평3동", "태평4동", "수진1동", "수진2동", "단대동", "산성동", "양지동", "복정동", "위례동", "신촌동", "고등동", "시흥동")
중원구 <- c("성남동", "중앙동", "금광1동", "금광2동", "은행1동", "은행2동", "상대원1동", "상대원2동", "상대원3동", "하대원동", "도촌동")
분당구 <- c("분당동", "수내1동", "수내2동", "수내3동", "정자동", "정자1동", "정자2동", "정자3동", "서현1동", "서현2동", "이매1동", "이매2동", "야탑1동", "야탑2동", "야탑3동", "판교동", "삼평동", "백현동", "금곡동", "구미1동", "구미동", "운중동")
## 2015년 12월 31일 기준
sn_2016 <- read_xlsx("data/post_mortem/2015년 기준 주민등록인구통계(성남시).xlsx", sheet="표4", skip=3)
sn_2016_dat <- sn_2016 %>%
select("...2", matches("계.*")) %>%
set_names(성남시_동명) %>%
slice(2:n()) %>%
filter(str_detect(연령, "[0-9]{1,3}\\s+?세|[0-9]{3}\\s?세이상")) %>%
mutate(연령 = parse_number(연령)) %>%
select(-성남시, -수정구, -중원구, -분당구)
sn_2016_df <- sn_2016_dat %>%
pivot_longer(cols = 신흥1동:운중동, names_to = "동명", values_to="인구수") %>%
mutate(연도="2016년") %>%
select(연도, everything())
sn_2016_df %>%
summarise(총인구수 = sum(인구수)) %>%
pull() == 971424 # 971,424
[1] TRUE
## 2018년 12월 31일 기준
sn_2019 <- read_xlsx("data/post_mortem/2018년 기준 주민등록인구통계(성남시).xlsx", sheet="표4. 읍면동 연령별", skip=3)
sn_2019_dat <- sn_2019 %>%
select("...1", matches("계.*")) %>%
set_names(성남시_동명) %>%
slice(2:n()) %>%
filter(str_detect(연령, "[0-9]{1,3}\\s+?세|[0-9]{3}\\s?세 이상")) %>%
mutate(연령 = parse_number(연령)) %>%
select(-성남시, -수정구, -중원구, -분당구)
sn_2019_df <- sn_2019_dat %>%
pivot_longer(cols = 신흥1동:운중동, names_to = "동명", values_to="인구수") %>%
mutate(연도="2019년") %>%
select(연도, everything())
sn_2019_df %>%
summarise(총인구수 = sum(인구수)) %>%
pull() == 954347 # 954,347
[1] TRUE
2016년과 2019년 데이터를 결합한다.
sn_demo <- sn_2016_df %>%
bind_rows(sn_2019_df) %>%
mutate(구명 = case_when(동명 %in% 수정구 ~ "수정구",
동명 %in% 중원구 ~ "중원구",
동명 %in% 분당구 ~ "분당구")) %>%
select(연도, 연령, 구명, 동명, 인구수)
## 분당구
분당을 <- c("구미1동", "구미동", "금곡동", "분당동", "수내1동",
"수내2동", "수내3동", "정자1동", "정자2동", "정자3동", "정자동")
분당갑 <- sn_demo %>%
filter(구명 == "분당구") %>%
count(동명) %>% pull(동명) %>%
setdiff(., 분당을)
bundang_demo <- sn_demo %>%
filter(구명 == "분당구") %>%
mutate(선거구명 = case_when(동명 %in% 분당갑 ~ "분당갑",
동명 %in% 분당을 ~ "분당을")) %>%
select(연도, 연령, 선거구명, 동명, 인구수)
eul_demo <- bundang_demo %>%
filter(선거구명 == "분당을") %>%
select(-선거구명)
eul_demo %>%
group_by(연도) %>%
summarise(인구수 = sum(인구수)) %>%
spread(연도, 인구수) %>%
mutate(인구변화 = `2019년` - `2016년` ) %>%
mutate(변화율 = 인구변화 / `2019년` * 100)
# A tibble: 1 x 4
`2016년` `2019년` 인구변화 변화율
<dbl> <dbl> <dbl> <dbl>
1 240829 236333 -4496 -1.90
eul_demo %>%
group_by(연도, 동명) %>%
summarise(인구수 = sum(인구수)) %>%
spread(연도, 인구수) %>%
mutate(인구변화 = `2019년` - `2016년` ) %>%
mutate(변화율 = 인구변화 / `2019년`) %>%
arrange(desc(변화율)) %>%
DT::datatable(rownames = FALSE, filter="top", options = list(pageLength = 5, scrollX=T) ) %>%
DT::formatRound(c("2016년", "2019년", "인구변화"), digits =0) %>%
DT::formatPercentage( "변화율", digits =1)
eul_demo %>%
mutate(유권여부 = ifelse(연령 >=19, "유권자", "비유권자")) %>%
group_by(유권여부, 연도) %>%
summarise(유권자수 = sum(인구수)) %>%
spread(연도, 유권자수) %>%
mutate(인구변화 = `2019년` - `2016년` ) %>%
mutate(변화율 = 인구변화 / `2019년` * 100)
# A tibble: 2 x 5
# Groups: 유권여부 [2]
유권여부 `2016년` `2019년` 인구변화 변화율
<chr> <dbl> <dbl> <dbl> <dbl>
1 비유권자 47395 42230 -5165 -12.2
2 유권자 193434 194103 669 0.345
eul_demo %>%
mutate(유권여부 = ifelse(연령 >=19, "유권", "비권")) %>%
group_by(유권여부, 연도, 동명) %>%
summarise(유권자수 = sum(인구수)) %>%
spread(연도, 유권자수) %>%
mutate(인구변화 = `2019년` - `2016년` ) %>%
mutate(변화율 = 인구변화 / `2019년`) %>%
arrange(desc(변화율)) %>%
DT::datatable(rownames = FALSE, filter="top", options = list(pageLength = 11, scrollX=T) ) %>%
DT::formatRound(c("2016년", "2019년", "인구변화"), digits =0) %>%
DT::formatPercentage( "변화율", digits =1)
eul_demo %>%
filter(연령 >=19) %>%
mutate(연령대 = case_when(연령 >= 19 & 연령 <= 29 ~ "20대",
연령 >= 30 & 연령 <= 39 ~ "30대",
연령 >= 40 & 연령 <= 49 ~ "40대",
연령 >= 50 & 연령 <= 59 ~ "50대",
연령 >= 60 ~ "60대")) %>%
group_by(연령대, 연도) %>%
summarise(유권자수 = sum(인구수)) %>%
spread(연도, 유권자수) %>%
mutate(인구변화 = `2019년` - `2016년` ) %>%
mutate(변화율 = 인구변화 / `2019년`)
# A tibble: 5 x 5
# Groups: 연령대 [5]
연령대 `2016년` `2019년` 인구변화 변화율
<chr> <dbl> <dbl> <dbl> <dbl>
1 20대 37190 36784 -406 -0.0110
2 30대 39234 37129 -2105 -0.0567
3 40대 46180 43731 -2449 -0.0560
4 50대 34862 35420 558 0.0158
5 60대 35968 41039 5071 0.124
eul_demo %>%
filter(연령 >=19) %>%
mutate(연령대 = case_when(연령 >= 19 & 연령 <= 29 ~ "20대",
연령 >= 30 & 연령 <= 39 ~ "30대",
연령 >= 40 & 연령 <= 49 ~ "40대",
연령 >= 50 & 연령 <= 59 ~ "50대",
연령 >= 60 ~ "60대")) %>%
group_by(연령대, 동명, 연도) %>%
summarise(유권자수 = sum(인구수)) %>%
spread(연도, 유권자수) %>%
mutate(인구변화 = `2019년` - `2016년` ) %>%
mutate(변화율 = 인구변화 / `2019년`) %>%
arrange(desc(변화율)) %>%
DT::datatable(rownames = FALSE, filter="top", options = list(pageLength = 11, scrollX=T) ) %>%
DT::formatRound(c("2016년", "2019년", "인구변화"), digits =0) %>%
DT::formatPercentage( "변화율", digits =1)
library(ggalt)
library(extrafont)
loadfonts()
eul_demo %>%
filter(연령 >=19) %>%
mutate(연령대 = case_when(연령 >= 19 & 연령 <= 29 ~ "20대",
연령 >= 30 & 연령 <= 39 ~ "30대",
연령 >= 40 & 연령 <= 49 ~ "40대",
연령 >= 50 & 연령 <= 59 ~ "50대",
연령 >= 60 ~ "60대")) %>%
group_by(연령대, 동명, 연도) %>%
summarise(인구수 = sum(인구수)) %>%
ungroup() %>%
mutate(동명 = fct_reorder(동명, -인구수)) %>%
spread(연도, 인구수) %>%
ggplot(aes(y=동명, x=`2016년`, xend=`2019년`)) +
geom_dumbbell(color="#e3e2e1", colour_x = "gray", colour_xend = "red",
dot_guide=FALSE, size=2.5, show.legend = TRUE) +
facet_wrap(~연령대) +
theme_bw(base_family = "NanumGothic") +
labs(x="", y="") +
scale_x_continuous(labels = scales::comma)
eul_demo %>%
filter(연령 >=19) %>%
mutate(연령대 = case_when(연령 >= 19 & 연령 <= 29 ~ "20대",
연령 >= 30 & 연령 <= 39 ~ "30대",
연령 >= 40 & 연령 <= 49 ~ "40대",
연령 >= 50 & 연령 <= 59 ~ "50대",
연령 >= 60 ~ "60대")) %>%
group_by(연령대, 동명, 연도) %>%
summarise(인구수 = sum(인구수)) %>%
ungroup() %>%
mutate(동명 = fct_reorder(동명, -인구수)) %>%
spread(연도, 인구수) %>%
ggplot(aes(y=연령대, x=`2016년`, xend=`2019년`)) +
geom_dumbbell(color="#e3e2e1", colour_x = "gray", colour_xend = "red",
dot_guide=FALSE, size=2.5, show.legend = TRUE) +
facet_wrap(~동명) +
theme_bw(base_family = "NanumGothic") +
labs(x="", y="") +
scale_x_continuous(labels = scales::comma)