그룹별 상·하위 데이터 추출

데이터 준비

이번에는 2023년 시군구별 주민등록인구 데이터를 활용하여 시도별로 주민등록인구 수가 많은 상위 3개 시군구와 하위 3개 시군구를 추출하는 방법을 소개합니다. 데이터를 추출하는 것뿐만 아니라, 결과를 요약해 하나의 표로 작성하는 방법도 다룹니다.

먼저, 데이터를 준비합니다. 이번 시간에는 통계청의 시군구별 주민등록인구 데이터를 활용하겠습니다. 데이터는 시도, 시군구, 주민등록인구수로 구성되어 있습니다. read_xlsx 함수를 사용해 데이터를 가져온 후, head 함수로 데이터의 첫 몇 행을 미리 살펴봅니다.

# 패키지 로드
library(tidyverse)
library(readxl)

# 데이터 로드
data <- read_xlsx("데이터/주민등록인구_시도_시군구_2023.xlsx", skip=1)

# 데이터 확인
head(data)
## # A tibble: 6 × 3
##   `행정구역별(1)` `행정구역별(2)` `계 (명)`
##   <chr>           <chr>               <dbl>
## 1 전국            소계             51325329
## 2 서울특별시      소계              9386034
## 3 서울특별시      종로구             139417
## 4 서울특별시      중구               121312
## 5 서울특별시      용산구             213151
## 6 서울특별시      성동구             277361

이후 데이터를 분석하기 쉽게 칼럼명을 변경하고, 불필요한 값을 제거하며 데이터를 정리합니다.

data2 <- data %>% 
  rename(시도 = `행정구역별(1)`,
         시군구 = `행정구역별(2)`,
         주민등록인구수 = `계 (명)`) %>% 
  filter(시도 != "전국",
         (시도 == "세종특별자치시")|(시군구 != "소계")) %>% 
  mutate(시군구 = case_when(시도 == "세종특별자치시" ~ "세종특별자치시",
                         T ~ 시군구))

head(data2)
## # A tibble: 6 × 3
##   시도       시군구   주민등록인구수
##   <chr>      <chr>             <dbl>
## 1 서울특별시 종로구           139417
## 2 서울특별시 중구             121312
## 3 서울특별시 용산구           213151
## 4 서울특별시 성동구           277361
## 5 서울특별시 광진구           335554
## 6 서울특별시 동대문구         341149

시도별 주민등록인구 수 상위 3개 시군구 추출하기

slice_max를 사용하여 시도별로 주민등록인구 수 기준 상위 3개 시군구를 추출합니다. 이 함수는 지정된 열의 값에 따라 데이터의 상위 행을 반환해 줍니다.

pop_high <- data2 %>% 
  group_by(시도) %>% 
  slice_max(order_by = 주민등록인구수, n = 3)

pop_high
## # A tibble: 48 × 3
## # Groups:   시도 [17]
##    시도           시군구     주민등록인구수
##    <chr>          <chr>               <dbl>
##  1 강원특별자치도 원주시             361503
##  2 강원특별자치도 춘천시             286426
##  3 강원특별자치도 강릉시             209439
##  4 경기도         수원시            1197257
##  5 경기도         용인시            1075566
##  6 경기도         고양시            1074907
##  7 경상남도       통합창원시        1009038
##  8 경상남도       김해시             533659
##  9 경상남도       양산시             355122
## 10 경상북도       포항시             493033
## # ℹ 38 more rows

시도별 주민등록인구 수 하위 3개 시군구 추출하기

slice_min을 사용하여 시도별 주민등록인구 수 기준 하위 3개 시군구를 추출합니다.

pop_low <- data2 %>% 
  group_by(시도) %>% 
  slice_min(order_by = 주민등록인구수, n = 3)

pop_low
## # A tibble: 48 × 3
## # Groups:   시도 [17]
##    시도           시군구 주민등록인구수
##    <chr>          <chr>           <dbl>
##  1 강원특별자치도 양구군          21056
##  2 강원특별자치도 화천군          23007
##  3 강원특별자치도 고성군          27305
##  4 경기도         연천군          41584
##  5 경기도         가평군          62302
##  6 경기도         과천시          81000
##  7 경상남도       의령군          25475
##  8 경상남도       산청군          33752
##  9 경상남도       함양군          36945
## 10 경상북도       울릉군           9077
## # ℹ 38 more rows

상·하위 3개 시군구에 대한 요약표 만들기

상위와 하위 3개 데이터를 요약해 하나의 표로 정리하겠습니다. paste0scales::comma를 사용해 상위 3개 시군구명과 2023년 주민등록인구 수를 하나의 문자열로 만들어줍니다. 다음으로, summarisepaste0 함수를 사용하여 시도별 상위 3개 시군구 정보를 하나의 행으로 합칩니다.

library(scales)

pop_high_sum <- pop_high %>% 
  mutate(`상위 3개 시군구`=paste0(시군구,
                           "(",
                           comma(주민등록인구수, suffix="명"),
                           ")")
         ) %>% 
  group_by(시도) %>% 
  summarise(`상위 3개 시군구` = paste0(`상위 3개 시군구`, collapse=", "))

pop_high_sum
## # A tibble: 17 × 2
##    시도           `상위 3개 시군구`                                            
##    <chr>          <chr>                                                        
##  1 강원특별자치도 원주시(361,503명), 춘천시(286,426명), 강릉시(209,439명)      
##  2 경기도         수원시(1,197,257명), 용인시(1,075,566명), 고양시(1,074,907명)
##  3 경상남도       통합창원시(1,009,038명), 김해시(533,659명), 양산시(355,122명)
##  4 경상북도       포항시(493,033명), 구미시(405,506명), 경산시(266,205명)      
##  5 광주광역시     북구(421,683명), 광산구(396,741명), 서구(283,991명)          
##  6 대구광역시     달서구(527,781명), 북구(419,624명), 수성구(407,331명)        
##  7 대전광역시     서구(464,634명), 유성구(366,845명), 중구(223,256명)          
##  8 부산광역시     해운대구(380,448명), 부산진구(359,508명), 사하구(297,831명)  
##  9 서울특별시     송파구(654,166명), 강서구(563,058명), 강남구(544,873명)      
## 10 세종특별자치시 세종특별자치시(386,525명)                                    
## 11 울산광역시     남구(307,232명), 울주군(218,997명), 북구(216,477명)          
## 12 인천광역시     서구(624,358명), 부평구(494,138명), 남동구(492,415명)        
## 13 전라남도       순천시(278,137명), 여수시(271,696명), 목포시(214,156명)      
## 14 전북특별자치도 전주시(642,727명), 익산시(270,036명), 군산시(259,980명)      
## 15 제주특별자치도 제주시(491,654명), 서귀포시(183,598명)                       
## 16 충청남도       천안시(655,959명), 아산시(345,796명), 서산시(176,011명)      
## 17 충청북도       통합청주시(852,189명), 충주시(207,778명), 제천시(130,194명)

하위 3개 시군구에 대해서도 동일한 방식으로 데이터를 요약해 줍니다.

pop_low_sum <- pop_low %>% 
  mutate(`하위 3개 시군구`=paste0(시군구,
                           "(",
                           comma(주민등록인구수, suffix="명"),
                           ")")
         ) %>% 
  group_by(시도) %>% 
  summarise(`하위 3개 시군구` = paste0(`하위 3개 시군구`, collapse=", "))

pop_low_sum
## # A tibble: 17 × 2
##    시도           `하위 3개 시군구`                                    
##    <chr>          <chr>                                                
##  1 강원특별자치도 양구군(21,056명), 화천군(23,007명), 고성군(27,305명) 
##  2 경기도         연천군(41,584명), 가평군(62,302명), 과천시(81,000명) 
##  3 경상남도       의령군(25,475명), 산청군(33,752명), 함양군(36,945명) 
##  4 경상북도       울릉군(9,077명), 영양군(15,661명), 청송군(24,019명)  
##  5 광주광역시     동구(107,176명), 남구(209,646명), 서구(283,991명)    
##  6 대구광역시     군위군(22,988명), 중구(89,064명), 남구(139,187명)    
##  7 대전광역시     대덕구(169,853명), 동구(217,628명), 중구(223,256명)  
##  8 부산광역시     중구(38,619명), 동구(87,792명), 서구(104,089명)      
##  9 서울특별시     중구(121,312명), 종로구(139,417명), 용산구(213,151명)
## 10 세종특별자치시 세종특별자치시(386,525명)                            
## 11 울산광역시     동구(152,287명), 중구(208,668명), 북구(216,477명)    
## 12 인천광역시     옹진군(20,377명), 동구(59,482명), 강화군(69,005명)   
## 13 전라남도       구례군(24,314명), 곡성군(26,905명), 진도군(28,979명) 
## 14 전북특별자치도 장수군(20,983명), 무주군(23,251명), 진안군(24,465명) 
## 15 제주특별자치도 서귀포시(183,598명), 제주시(491,654명)               
## 16 충청남도       청양군(30,168명), 계룡시(46,667명), 서천군(49,116명) 
## 17 충청북도       단양군(27,701명), 보은군(31,010명), 괴산군(36,590명)

left_join을 사용해 상위 및 하위 3개 시군구 데이터를 하나의 테이블로 결합합니다.

pop_sum <- pop_high_sum %>% 
  left_join(pop_low_sum, by="시도")

pop_sum
## # A tibble: 17 × 3
##    시도           `상위 3개 시군구`                            `하위 3개 시군구`
##    <chr>          <chr>                                        <chr>            
##  1 강원특별자치도 원주시(361,503명), 춘천시(286,426명), 강릉…  양구군(21,056명)…
##  2 경기도         수원시(1,197,257명), 용인시(1,075,566명), …  연천군(41,584명)…
##  3 경상남도       통합창원시(1,009,038명), 김해시(533,659명),… 의령군(25,475명)…
##  4 경상북도       포항시(493,033명), 구미시(405,506명), 경산…  울릉군(9,077명),…
##  5 광주광역시     북구(421,683명), 광산구(396,741명), 서구(28… 동구(107,176명),…
##  6 대구광역시     달서구(527,781명), 북구(419,624명), 수성구(… 군위군(22,988명)…
##  7 대전광역시     서구(464,634명), 유성구(366,845명), 중구(22… 대덕구(169,853명…
##  8 부산광역시     해운대구(380,448명), 부산진구(359,508명), …  중구(38,619명), …
##  9 서울특별시     송파구(654,166명), 강서구(563,058명), 강남…  중구(121,312명),…
## 10 세종특별자치시 세종특별자치시(386,525명)                    세종특별자치시(3…
## 11 울산광역시     남구(307,232명), 울주군(218,997명), 북구(21… 동구(152,287명),…
## 12 인천광역시     서구(624,358명), 부평구(494,138명), 남동구(… 옹진군(20,377명)…
## 13 전라남도       순천시(278,137명), 여수시(271,696명), 목포…  구례군(24,314명)…
## 14 전북특별자치도 전주시(642,727명), 익산시(270,036명), 군산…  장수군(20,983명)…
## 15 제주특별자치도 제주시(491,654명), 서귀포시(183,598명)       서귀포시(183,598…
## 16 충청남도       천안시(655,959명), 아산시(345,796명), 서산…  청양군(30,168명)…
## 17 충청북도       통합청주시(852,189명), 충주시(207,778명), …  단양군(27,701명)…

이번 글에서는 시도별로 주민등록인구 수 기준 상위 3개와 하위 3개 시군구를 추출하고, 이를 하나의 표로 요약하는 방법을 알려드렸습니다. 이 방법은 데이터를 정리하고 결과를 외부에 보고할 때 유용하게 사용될 수 있으니, 한 번 활용해 보시길 바랍니다!