성남통계 - 통계자료실에서 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(연도, 연령, 선거구명, 동명, 인구수)
bundang_demo %>%
group_by(연도) %>%
summarise(인구수 = sum(인구수)) %>%
spread(연도, 인구수) %>%
mutate(인구변화 = `2019년` - `2016년` ) %>%
mutate(변화율 = 인구변화 / `2019년` * 100)
# A tibble: 1 x 4
`2016년` `2019년` 인구변화 변화율
<dbl> <dbl> <dbl> <dbl>
1 501889 495329 -6560 -1.32
bundang_demo %>%
group_by(연도, 선거구명) %>%
summarise(인구수 = sum(인구수)) %>%
spread(연도, 인구수) %>%
mutate(인구변화 = `2019년` - `2016년` ) %>%
mutate(변화율 = 인구변화 / `2019년` * 100)
# A tibble: 2 x 5
선거구명 `2016년` `2019년` 인구변화 변화율
<chr> <dbl> <dbl> <dbl> <dbl>
1 분당갑 261060 258996 -2064 -0.797
2 분당을 240829 236333 -4496 -1.90
bundang_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)
bundang_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 비유권자 104890 95035 -9855 -10.4
2 유권자 396999 400294 3295 0.823
bundang_demo %>%
mutate(유권여부 = ifelse(연령 >=19, "유권", "비권")) %>%
group_by(선거구명, 유권여부, 연도) %>%
summarise(유권자수 = sum(인구수)) %>%
spread(연도, 유권자수) %>%
mutate(인구변화 = `2019년` - `2016년` ) %>%
mutate(변화율 = 인구변화 / `2019년` * 100)
# A tibble: 4 x 6
# Groups: 선거구명, 유권여부 [4]
선거구명 유권여부 `2016년` `2019년` 인구변화 변화율
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 분당갑 비권 57495 52805 -4690 -8.88
2 분당갑 유권 203565 206191 2626 1.27
3 분당을 비권 47395 42230 -5165 -12.2
4 분당을 유권 193434 194103 669 0.345
bundang_demo %>%
mutate(유권여부 = ifelse(연령 >=19, "유권", "비권")) %>%
filter(선거구명 == "분당을") %>%
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)
bundang_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대 76058 74892 -1166 -0.0156
2 30대 80639 75717 -4922 -0.0650
3 40대 94958 91044 -3914 -0.0430
4 50대 74219 75586 1367 0.0181
5 60대 71125 83055 11930 0.144
분당갑
bundang_demo %>%
filter(연령 >=19) %>%
mutate(연령대 = case_when(연령 >= 19 & 연령 <= 29 ~ "20대",
연령 >= 30 & 연령 <= 39 ~ "30대",
연령 >= 40 & 연령 <= 49 ~ "40대",
연령 >= 50 & 연령 <= 59 ~ "50대",
연령 >= 60 ~ "60대")) %>%
filter(선거구명 =="분당갑") %>%
group_by(연령대, 선거구명, 연도) %>%
summarise(유권자수 = sum(인구수)) %>%
spread(연도, 유권자수) %>%
mutate(인구변화 = `2019년` - `2016년` ) %>%
mutate(변화율 = 인구변화 / `2019년`) %>%
ungroup() %>%
select(-선거구명)
# A tibble: 5 x 5
연령대 `2016년` `2019년` 인구변화 변화율
<chr> <dbl> <dbl> <dbl> <dbl>
1 20대 38868 38108 -760 -0.0199
2 30대 41405 38588 -2817 -0.0730
3 40대 48778 47313 -1465 -0.0310
4 50대 39357 40166 809 0.0201
5 60대 35157 42016 6859 0.163
분당을
bundang_demo %>%
filter(연령 >=19) %>%
mutate(연령대 = case_when(연령 >= 19 & 연령 <= 29 ~ "20대",
연령 >= 30 & 연령 <= 39 ~ "30대",
연령 >= 40 & 연령 <= 49 ~ "40대",
연령 >= 50 & 연령 <= 59 ~ "50대",
연령 >= 60 ~ "60대")) %>%
filter(선거구명 =="분당을") %>%
group_by(연령대, 선거구명, 연도) %>%
summarise(유권자수 = sum(인구수)) %>%
spread(연도, 유권자수) %>%
mutate(인구변화 = `2019년` - `2016년` ) %>%
mutate(변화율 = 인구변화 / `2019년`) %>%
ungroup() %>%
select(-선거구명)
# A tibble: 5 x 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
bundang_demo %>%
filter(연령 >=19) %>%
mutate(연령대 = case_when(연령 >= 19 & 연령 <= 29 ~ "20대",
연령 >= 30 & 연령 <= 39 ~ "30대",
연령 >= 40 & 연령 <= 49 ~ "40대",
연령 >= 50 & 연령 <= 59 ~ "50대",
연령 >= 60 ~ "60대")) %>%
filter(선거구명 =="분당을") %>%
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)