춘천시의 읍면동별 인구현황과 함께 어떤 변화가 있었는지 알아보겠습니다.
데이터 얻기
주민등록 인구
위의 링크 중 행정안전부 주민등록인구통계를 통해 춘천의 읍면동별 년간 인구와 읍면동별 년간 5세단위 자료를 다운로드 받아 몇가지 인사이트를 얻고자 합니다. 다음은 행정안전부에서 제공하는 자료에 대한 간략한 설명입니다.
- 주민등록 인구와 세대수와 연령별 인구현황을 별도의 메뉴로 제공하고 있으며, 행정구역, 조회기간 등을 사용자로 부터 입력받아 해당 자료의 크기에 따라 검색 기간의 제한이 있습니다.
- 제공하는 파일의 유형은 csv와 Excel의 두가지입니다.
데이터 읽기
dat1 <- read_excel("./data/pops/cc/200812_201012_연령별인구현황_연간.xlsx")
Excel은 기본적으로 데이터와 다른 객체(설명, 그래프, 요약 값등)가 분리되지 않아 데이터를 살펴볼 필요가 있습니다. 다음은 위의 데이터를 다운로드 받은후 파악한 제공데이터의 특성입니다.
- 첫줄에 있는 자료는 데이터가 아닌 설명을 담고 있습니다.
- 각 열의 제목이 여러 행에 걸쳐 있습니다.
- 또한, 각 열의 제목이 여러 열을 병합한 후 지정되어 있습니다.
- 3열부터는 각 년도별, 분류별(계, 남, 여)로 5세 단위 인구를 기록했습니다.
- 각 년도별 구분별 인구에는 앞 부분에 합에 해당하는 두 개의 인구수가 있습니다.
- 실제 데이터는 5행 부터 시작됩니다. (변수명 포함시 4행부터)
dat1
## # A tibble: 6 × 209
## ※ 매년 말일자 통계 현…¹ ...2 ...3 ...4 ...5 ...6 ...7 ...8 ...9 ...10
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 <NA> <NA> 2008년 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 2 <NA> <NA> 계 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 3 행정기관코드 행정… 총 인… 연령… 0~4세 5~9세 10~1… 15~1… 20~2… 25~2…
## 4 4211000000 강원… 261975 2619… 11381 15326 18927 18260 17214 19038
## 5 4211025000 강원… 7531 7531 264 289 353 433 459 481
## 6 4211031000 강원… 6025 6025 284 331 333 375 376 381
## # ℹ abbreviated name: ¹`※ 매년 말일자 통계 현황`
## # ℹ 199 more variables: ...11 <chr>, ...12 <chr>, ...13 <chr>, ...14 <chr>,
## # ...15 <chr>, ...16 <chr>, ...17 <chr>, ...18 <chr>, ...19 <chr>,
## # ...20 <chr>, ...21 <chr>, ...22 <chr>, ...23 <chr>, ...24 <chr>,
## # ...25 <chr>, ...26 <chr>, ...27 <chr>, ...28 <chr>, ...29 <chr>,
## # ...30 <chr>, ...31 <chr>, ...32 <chr>, ...33 <chr>, ...34 <chr>,
## # ...35 <chr>, ...36 <chr>, ...37 <chr>, ...38 <chr>, ...39 <chr>, …
열 이름 재지정하기
위에서 읽어온 자료의 경우 Excel 파일의 첫번째 행의 값을 변수명으로 판단하고 있으며, 두번째 행부터 자료로 읽어왔다. 이렇게 읽어온 자료는 변수 dat1
에 tibble 형태로 저장되어 있으며, 이 자료 중 첫번째 행은 년도 정보를 갖고 있습니다.
paste()
함수를 이용하여 첫번째 행의 각 데이터를 문자열 데이터로 만들어 확인하면 다음과 같습니다.
paste( dat1[1, ] )
## [1] "NA" "NA" "2008년" "NA" "NA" "NA" "NA" "NA"
## [9] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [17] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [25] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [33] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [41] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [49] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [57] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [65] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "2009년"
## [73] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [81] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [89] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [97] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [105] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [113] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [121] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [129] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [137] "NA" "NA" "NA" "NA" "2010년" "NA" "NA" "NA"
## [145] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [153] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [161] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [169] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [177] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [185] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [193] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [201] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [209] "NA"
- 갖고 있는 값들만으로 만들기 위해
ifelse()
를 이용하여 “NA” 를NA
로 만들고 그렇지 않을 경우, 즉 값을 갖고 있으면 기존 값을 그대로 사용 - 이렇게 만들어지 벡터를 테이블 함수를 이용하여 값 확인
- 테이블의 열이름이 우리 데이터의 년도 정보
ifelse( paste(dat1[1, ]) == "NA", NA, paste(dat1[1, ]) )
## [1] NA NA "2008년" NA NA NA NA NA
## [9] NA NA NA NA NA NA NA NA
## [17] NA NA NA NA NA NA NA NA
## [25] NA NA NA NA NA NA NA NA
## [33] NA NA NA NA NA NA NA NA
## [41] NA NA NA NA NA NA NA NA
## [49] NA NA NA NA NA NA NA NA
## [57] NA NA NA NA NA NA NA NA
## [65] NA NA NA NA NA NA NA "2009년"
## [73] NA NA NA NA NA NA NA NA
## [81] NA NA NA NA NA NA NA NA
## [89] NA NA NA NA NA NA NA NA
## [97] NA NA NA NA NA NA NA NA
## [105] NA NA NA NA NA NA NA NA
## [113] NA NA NA NA NA NA NA NA
## [121] NA NA NA NA NA NA NA NA
## [129] NA NA NA NA NA NA NA NA
## [137] NA NA NA NA "2010년" NA NA NA
## [145] NA NA NA NA NA NA NA NA
## [153] NA NA NA NA NA NA NA NA
## [161] NA NA NA NA NA NA NA NA
## [169] NA NA NA NA NA NA NA NA
## [177] NA NA NA NA NA NA NA NA
## [185] NA NA NA NA NA NA NA NA
## [193] NA NA NA NA NA NA NA NA
## [201] NA NA NA NA NA NA NA NA
## [209] NA
table( ifelse( paste( dat1[1, ] ) == "NA", NA, paste(dat1[1, ]) ) )
##
## 2008년 2009년 2010년
## 1 1 1
names( table( ifelse( paste( dat1[1, ] ) == "NA", NA, paste(dat1[1, ]) ) ) )
## [1] "2008년" "2009년" "2010년"
이제 본 자료는 2008년, 2009년, 2010년와 같은 년도 자료를 갖고 있음을 확인할 수 있습니다.
다음으로 위의 자료에서 두번째 행이 갖고 있는 정보는 어떤 분류를 갖고 있는지에 대한 것으로 위와 마찬가지로 그 값을 확인해 봅시다.
paste(dat1[2, ])
## [1] "NA" "NA" "계" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [16] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "남" "NA" "NA" "NA" "NA"
## [31] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [46] "NA" "NA" "NA" "여" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [61] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "계" "NA" "NA" "NA"
## [76] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [91] "NA" "NA" "NA" "NA" "남" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [106] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "여" "NA" "NA"
## [121] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [136] "NA" "NA" "NA" "NA" "NA" "계" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [151] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "남" "NA"
## [166] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [181] "NA" "NA" "NA" "NA" "NA" "NA" "여" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
## [196] "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA" "NA"
ifelse( paste(dat1[2, ]) == "NA", NA, paste(dat1[2, ]) )
## [1] NA NA "계" NA NA NA NA NA NA NA NA NA NA NA NA
## [16] NA NA NA NA NA NA NA NA NA NA "남" NA NA NA NA
## [31] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [46] NA NA NA "여" NA NA NA NA NA NA NA NA NA NA NA
## [61] NA NA NA NA NA NA NA NA NA NA NA "계" NA NA NA
## [76] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [91] NA NA NA NA "남" NA NA NA NA NA NA NA NA NA NA
## [106] NA NA NA NA NA NA NA NA NA NA NA NA "여" NA NA
## [121] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [136] NA NA NA NA NA "계" NA NA NA NA NA NA NA NA NA
## [151] NA NA NA NA NA NA NA NA NA NA NA NA NA "남" NA
## [166] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [181] NA NA NA NA NA NA "여" NA NA NA NA NA NA NA NA
## [196] NA NA NA NA NA NA NA NA NA NA NA NA NA NA
table( ifelse( paste( dat1[2, ] ) == "NA", NA, paste(dat1[2, ]) ) )
##
## 계 남 여
## 3 3 3
names( table( ifelse( paste( dat1[2, ] ) == "NA", NA, paste(dat1[2, ]) ) ) )
## [1] "계" "남" "여"
마지막으로 각 열이 갖고 있는 열 이름(5세 단위 구분)은 다음과 같이 확인할 수 있습니다.
paste(dat1[3, -(1:2)])
## [1] "총 인구수" "연령구간인구수" "0~4세" "5~9세"
## [5] "10~14세" "15~19세" "20~24세" "25~29세"
## [9] "30~34세" "35~39세" "40~44세" "45~49세"
## [13] "50~54세" "55~59세" "60~64세" "65~69세"
## [17] "70~74세" "75~79세" "80~84세" "85~89세"
## [21] "90~94세" "95~99세" "100세 이상" "남 인구수"
## [25] "연령구간인구수" "0~4세" "5~9세" "10~14세"
## [29] "15~19세" "20~24세" "25~29세" "30~34세"
## [33] "35~39세" "40~44세" "45~49세" "50~54세"
## [37] "55~59세" "60~64세" "65~69세" "70~74세"
## [41] "75~79세" "80~84세" "85~89세" "90~94세"
## [45] "95~99세" "100세 이상" "여 인구수" "연령구간인구수"
## [49] "0~4세" "5~9세" "10~14세" "15~19세"
## [53] "20~24세" "25~29세" "30~34세" "35~39세"
## [57] "40~44세" "45~49세" "50~54세" "55~59세"
## [61] "60~64세" "65~69세" "70~74세" "75~79세"
## [65] "80~84세" "85~89세" "90~94세" "95~99세"
## [69] "100세 이상" "총 인구수" "연령구간인구수" "0~4세"
## [73] "5~9세" "10~14세" "15~19세" "20~24세"
## [77] "25~29세" "30~34세" "35~39세" "40~44세"
## [81] "45~49세" "50~54세" "55~59세" "60~64세"
## [85] "65~69세" "70~74세" "75~79세" "80~84세"
## [89] "85~89세" "90~94세" "95~99세" "100세 이상"
## [93] "총 인구수" "연령구간인구수" "0~4세" "5~9세"
## [97] "10~14세" "15~19세" "20~24세" "25~29세"
## [101] "30~34세" "35~39세" "40~44세" "45~49세"
## [105] "50~54세" "55~59세" "60~64세" "65~69세"
## [109] "70~74세" "75~79세" "80~84세" "85~89세"
## [113] "90~94세" "95~99세" "100세 이상" "총 인구수"
## [117] "연령구간인구수" "0~4세" "5~9세" "10~14세"
## [121] "15~19세" "20~24세" "25~29세" "30~34세"
## [125] "35~39세" "40~44세" "45~49세" "50~54세"
## [129] "55~59세" "60~64세" "65~69세" "70~74세"
## [133] "75~79세" "80~84세" "85~89세" "90~94세"
## [137] "95~99세" "100세 이상" "총 인구수" "연령구간인구수"
## [141] "0~4세" "5~9세" "10~14세" "15~19세"
## [145] "20~24세" "25~29세" "30~34세" "35~39세"
## [149] "40~44세" "45~49세" "50~54세" "55~59세"
## [153] "60~64세" "65~69세" "70~74세" "75~79세"
## [157] "80~84세" "85~89세" "90~94세" "95~99세"
## [161] "100세 이상" "총 인구수" "연령구간인구수" "0~4세"
## [165] "5~9세" "10~14세" "15~19세" "20~24세"
## [169] "25~29세" "30~34세" "35~39세" "40~44세"
## [173] "45~49세" "50~54세" "55~59세" "60~64세"
## [177] "65~69세" "70~74세" "75~79세" "80~84세"
## [181] "85~89세" "90~94세" "95~99세" "100세 이상"
## [185] "총 인구수" "연령구간인구수" "0~4세" "5~9세"
## [189] "10~14세" "15~19세" "20~24세" "25~29세"
## [193] "30~34세" "35~39세" "40~44세" "45~49세"
## [197] "50~54세" "55~59세" "60~64세" "65~69세"
## [201] "70~74세" "75~79세" "80~84세" "85~89세"
## [205] "90~94세" "95~99세" "100세 이상"
이제 최종적으로 열 이름을 세 개의 행에 걸쳐 새롭게 만들어 보면 다음과 같습니다.
- 세번째에 있는 연령 단위가 각 열의 이름이고, 그 윗 단계인 성별 구분(계, 남, 여)이 년도별로 들어가야 한다.
- 세번째 행의 연령 단위별 변수명은 그대로 사용한다. (변수
vars
에 저장)
- 세번째 행의 연령 단위별 변수명은 그대로 사용한다. (변수
- (성별)구분의 반복이 년도별 “계,….,계, 남, …, 남, 여, ….여”가 만들어지도록 하였다. (변수
grps
에 저장)- 우선 기존에 비어 있는 열의 값은 문자열
"NA"
이며 이를 결측을 나타내는NA
로 변경한다. read_excel()
함수의na
인수에 “NA”를 넣어 읽어올때 결측값을 지정할 수 있다.
- 우선 기존에 비어 있는 열의 값은 문자열
- 년도값 또한 성별 구분인 계, 남, 여 별로 연령 구간만큼 존재해야 한다.
- 필요한 년도의 갯수는 아래와 같이 구해 변수
years
에 저장
- 필요한 년도의 갯수는 아래와 같이 구해 변수
- 앞으로 이 세개의 값을 합쳐 변수명으로 사용하고자 한다.
"년도_구분_연령단위"
로 만들어 변수var_names
에 저장하였다.
years <- names( table( ifelse( paste( dat1[1, ] ) == "NA", NA, paste(dat1[1, ]) ) ) )
grps <- names( table( ifelse( paste( dat1[2, ] ) == "NA", NA, paste(dat1[2, ]) ) ) )
vars <- paste(dat1[3, -(1:2)])
length(years)
## [1] 3
length(grps)
## [1] 3
length(vars)
## [1] 207
grps <- rep( rep( grps, each=(length(vars)/length(grps))/length(years) ), length(years) )
years <- rep(years, each = length(vars) / length(years))
var_names <- paste(years, grps, vars, sep="_")
데이터 다시 읽기
read_excel()
함수는 원하는 행 만큼을 건너뛰고 데이터를 읽을 수 있어 다음과 같이 읽을 수 있습니다.
- 먼저 4행의 데이터를 변수명으로 할 경우
- 3행까지는 읽지 않고 건너뜀 :
skip=3
- 3행까지는 읽지 않고 건너뜀 :
dat <- read_excel("./data/pops/cc/200812_201012_연령별인구현황_연간.xlsx", skip=3)
## New names:
## • `총 인구수` -> `총 인구수...3`
## • `연령구간인구수` -> `연령구간인구수...4`
## • `0~4세` -> `0~4세...5`
## • `5~9세` -> `5~9세...6`
## • `10~14세` -> `10~14세...7`
## • `15~19세` -> `15~19세...8`
## • `20~24세` -> `20~24세...9`
## • `25~29세` -> `25~29세...10`
## • `30~34세` -> `30~34세...11`
## • `35~39세` -> `35~39세...12`
## • `40~44세` -> `40~44세...13`
## • `45~49세` -> `45~49세...14`
## • `50~54세` -> `50~54세...15`
## • `55~59세` -> `55~59세...16`
## • `60~64세` -> `60~64세...17`
## • `65~69세` -> `65~69세...18`
## • `70~74세` -> `70~74세...19`
## • `75~79세` -> `75~79세...20`
## • `80~84세` -> `80~84세...21`
## • `85~89세` -> `85~89세...22`
## • `90~94세` -> `90~94세...23`
## • `95~99세` -> `95~99세...24`
## • `100세 이상` -> `100세 이상...25`
## • `연령구간인구수` -> `연령구간인구수...27`
## • `0~4세` -> `0~4세...28`
## • `5~9세` -> `5~9세...29`
## • `10~14세` -> `10~14세...30`
## • `15~19세` -> `15~19세...31`
## • `20~24세` -> `20~24세...32`
## • `25~29세` -> `25~29세...33`
## • `30~34세` -> `30~34세...34`
## • `35~39세` -> `35~39세...35`
## • `40~44세` -> `40~44세...36`
## • `45~49세` -> `45~49세...37`
## • `50~54세` -> `50~54세...38`
## • `55~59세` -> `55~59세...39`
## • `60~64세` -> `60~64세...40`
## • `65~69세` -> `65~69세...41`
## • `70~74세` -> `70~74세...42`
## • `75~79세` -> `75~79세...43`
## • `80~84세` -> `80~84세...44`
## • `85~89세` -> `85~89세...45`
## • `90~94세` -> `90~94세...46`
## • `95~99세` -> `95~99세...47`
## • `100세 이상` -> `100세 이상...48`
## • `연령구간인구수` -> `연령구간인구수...50`
## • `0~4세` -> `0~4세...51`
## • `5~9세` -> `5~9세...52`
## • `10~14세` -> `10~14세...53`
## • `15~19세` -> `15~19세...54`
## • `20~24세` -> `20~24세...55`
## • `25~29세` -> `25~29세...56`
## • `30~34세` -> `30~34세...57`
## • `35~39세` -> `35~39세...58`
## • `40~44세` -> `40~44세...59`
## • `45~49세` -> `45~49세...60`
## • `50~54세` -> `50~54세...61`
## • `55~59세` -> `55~59세...62`
## • `60~64세` -> `60~64세...63`
## • `65~69세` -> `65~69세...64`
## • `70~74세` -> `70~74세...65`
## • `75~79세` -> `75~79세...66`
## • `80~84세` -> `80~84세...67`
## • `85~89세` -> `85~89세...68`
## • `90~94세` -> `90~94세...69`
## • `95~99세` -> `95~99세...70`
## • `100세 이상` -> `100세 이상...71`
## • `총 인구수` -> `총 인구수...72`
## • `연령구간인구수` -> `연령구간인구수...73`
## • `0~4세` -> `0~4세...74`
## • `5~9세` -> `5~9세...75`
## • `10~14세` -> `10~14세...76`
## • `15~19세` -> `15~19세...77`
## • `20~24세` -> `20~24세...78`
## • `25~29세` -> `25~29세...79`
## • `30~34세` -> `30~34세...80`
## • `35~39세` -> `35~39세...81`
## • `40~44세` -> `40~44세...82`
## • `45~49세` -> `45~49세...83`
## • `50~54세` -> `50~54세...84`
## • `55~59세` -> `55~59세...85`
## • `60~64세` -> `60~64세...86`
## • `65~69세` -> `65~69세...87`
## • `70~74세` -> `70~74세...88`
## • `75~79세` -> `75~79세...89`
## • `80~84세` -> `80~84세...90`
## • `85~89세` -> `85~89세...91`
## • `90~94세` -> `90~94세...92`
## • `95~99세` -> `95~99세...93`
## • `100세 이상` -> `100세 이상...94`
## • `총 인구수` -> `총 인구수...95`
## • `연령구간인구수` -> `연령구간인구수...96`
## • `0~4세` -> `0~4세...97`
## • `5~9세` -> `5~9세...98`
## • `10~14세` -> `10~14세...99`
## • `15~19세` -> `15~19세...100`
## • `20~24세` -> `20~24세...101`
## • `25~29세` -> `25~29세...102`
## • `30~34세` -> `30~34세...103`
## • `35~39세` -> `35~39세...104`
## • `40~44세` -> `40~44세...105`
## • `45~49세` -> `45~49세...106`
## • `50~54세` -> `50~54세...107`
## • `55~59세` -> `55~59세...108`
## • `60~64세` -> `60~64세...109`
## • `65~69세` -> `65~69세...110`
## • `70~74세` -> `70~74세...111`
## • `75~79세` -> `75~79세...112`
## • `80~84세` -> `80~84세...113`
## • `85~89세` -> `85~89세...114`
## • `90~94세` -> `90~94세...115`
## • `95~99세` -> `95~99세...116`
## • `100세 이상` -> `100세 이상...117`
## • `총 인구수` -> `총 인구수...118`
## • `연령구간인구수` -> `연령구간인구수...119`
## • `0~4세` -> `0~4세...120`
## • `5~9세` -> `5~9세...121`
## • `10~14세` -> `10~14세...122`
## • `15~19세` -> `15~19세...123`
## • `20~24세` -> `20~24세...124`
## • `25~29세` -> `25~29세...125`
## • `30~34세` -> `30~34세...126`
## • `35~39세` -> `35~39세...127`
## • `40~44세` -> `40~44세...128`
## • `45~49세` -> `45~49세...129`
## • `50~54세` -> `50~54세...130`
## • `55~59세` -> `55~59세...131`
## • `60~64세` -> `60~64세...132`
## • `65~69세` -> `65~69세...133`
## • `70~74세` -> `70~74세...134`
## • `75~79세` -> `75~79세...135`
## • `80~84세` -> `80~84세...136`
## • `85~89세` -> `85~89세...137`
## • `90~94세` -> `90~94세...138`
## • `95~99세` -> `95~99세...139`
## • `100세 이상` -> `100세 이상...140`
## • `총 인구수` -> `총 인구수...141`
## • `연령구간인구수` -> `연령구간인구수...142`
## • `0~4세` -> `0~4세...143`
## • `5~9세` -> `5~9세...144`
## • `10~14세` -> `10~14세...145`
## • `15~19세` -> `15~19세...146`
## • `20~24세` -> `20~24세...147`
## • `25~29세` -> `25~29세...148`
## • `30~34세` -> `30~34세...149`
## • `35~39세` -> `35~39세...150`
## • `40~44세` -> `40~44세...151`
## • `45~49세` -> `45~49세...152`
## • `50~54세` -> `50~54세...153`
## • `55~59세` -> `55~59세...154`
## • `60~64세` -> `60~64세...155`
## • `65~69세` -> `65~69세...156`
## • `70~74세` -> `70~74세...157`
## • `75~79세` -> `75~79세...158`
## • `80~84세` -> `80~84세...159`
## • `85~89세` -> `85~89세...160`
## • `90~94세` -> `90~94세...161`
## • `95~99세` -> `95~99세...162`
## • `100세 이상` -> `100세 이상...163`
## • `총 인구수` -> `총 인구수...164`
## • `연령구간인구수` -> `연령구간인구수...165`
## • `0~4세` -> `0~4세...166`
## • `5~9세` -> `5~9세...167`
## • `10~14세` -> `10~14세...168`
## • `15~19세` -> `15~19세...169`
## • `20~24세` -> `20~24세...170`
## • `25~29세` -> `25~29세...171`
## • `30~34세` -> `30~34세...172`
## • `35~39세` -> `35~39세...173`
## • `40~44세` -> `40~44세...174`
## • `45~49세` -> `45~49세...175`
## • `50~54세` -> `50~54세...176`
## • `55~59세` -> `55~59세...177`
## • `60~64세` -> `60~64세...178`
## • `65~69세` -> `65~69세...179`
## • `70~74세` -> `70~74세...180`
## • `75~79세` -> `75~79세...181`
## • `80~84세` -> `80~84세...182`
## • `85~89세` -> `85~89세...183`
## • `90~94세` -> `90~94세...184`
## • `95~99세` -> `95~99세...185`
## • `100세 이상` -> `100세 이상...186`
## • `총 인구수` -> `총 인구수...187`
## • `연령구간인구수` -> `연령구간인구수...188`
## • `0~4세` -> `0~4세...189`
## • `5~9세` -> `5~9세...190`
## • `10~14세` -> `10~14세...191`
## • `15~19세` -> `15~19세...192`
## • `20~24세` -> `20~24세...193`
## • `25~29세` -> `25~29세...194`
## • `30~34세` -> `30~34세...195`
## • `35~39세` -> `35~39세...196`
## • `40~44세` -> `40~44세...197`
## • `45~49세` -> `45~49세...198`
## • `50~54세` -> `50~54세...199`
## • `55~59세` -> `55~59세...200`
## • `60~64세` -> `60~64세...201`
## • `65~69세` -> `65~69세...202`
## • `70~74세` -> `70~74세...203`
## • `75~79세` -> `75~79세...204`
## • `80~84세` -> `80~84세...205`
## • `85~89세` -> `85~89세...206`
## • `90~94세` -> `90~94세...207`
## • `95~99세` -> `95~99세...208`
## • `100세 이상` -> `100세 이상...209`
dat
## # A tibble: 26 × 209
## 행정기관코드 행정기관 `총 인구수...3` 연령구간인구수...4 `0~4세...5`
## <chr> <chr> <dbl> <dbl> <dbl>
## 1 4211000000 강원도 춘천시 261975 261975 11381
## 2 4211025000 강원도 춘천시 신… 7531 7531 264
## 3 4211031000 강원도 춘천시 동… 6025 6025 284
## 4 4211032000 강원도 춘천시 동… 1613 1613 38
## 5 4211033000 강원도 춘천시 신… 2603 2603 58
## 6 4211034000 강원도 춘천시 남… 1130 1130 27
## 7 4211035000 강원도 춘천시 서… 4151 4151 109
## 8 4211036000 강원도 춘천시 사… 2600 2600 55
## 9 4211038000 강원도 춘천시 북… 886 886 10
## 10 4211039000 강원도 춘천시 동… 10585 10585 642
## # ℹ 16 more rows
## # ℹ 204 more variables: `5~9세...6` <dbl>, `10~14세...7` <dbl>,
## # `15~19세...8` <dbl>, `20~24세...9` <dbl>, `25~29세...10` <dbl>,
## # `30~34세...11` <dbl>, `35~39세...12` <dbl>, `40~44세...13` <dbl>,
## # `45~49세...14` <dbl>, `50~54세...15` <dbl>, `55~59세...16` <dbl>,
## # `60~64세...17` <dbl>, `65~69세...18` <dbl>, `70~74세...19` <dbl>,
## # `75~79세...20` <dbl>, `80~84세...21` <dbl>, `85~89세...22` <dbl>, …
- 만일 변수명을 데이터로부터 읽지 않으려면 다음처럼 지정합니다.
- 4행까지 건너뛰고 :
skip=4
- 변수명 읽는 행 없이 바로 데이터로 읽기 :
col_names=FALSE
- 4행까지 건너뛰고 :
dat <- read_excel("./data/pops/cc/200812_201012_연령별인구현황_연간.xlsx", skip=4, col_names=FALSE)
## New names:
## • `` -> `...1`
## • `` -> `...2`
## • `` -> `...3`
## • `` -> `...4`
## • `` -> `...5`
## • `` -> `...6`
## • `` -> `...7`
## • `` -> `...8`
## • `` -> `...9`
## • `` -> `...10`
## • `` -> `...11`
## • `` -> `...12`
## • `` -> `...13`
## • `` -> `...14`
## • `` -> `...15`
## • `` -> `...16`
## • `` -> `...17`
## • `` -> `...18`
## • `` -> `...19`
## • `` -> `...20`
## • `` -> `...21`
## • `` -> `...22`
## • `` -> `...23`
## • `` -> `...24`
## • `` -> `...25`
## • `` -> `...26`
## • `` -> `...27`
## • `` -> `...28`
## • `` -> `...29`
## • `` -> `...30`
## • `` -> `...31`
## • `` -> `...32`
## • `` -> `...33`
## • `` -> `...34`
## • `` -> `...35`
## • `` -> `...36`
## • `` -> `...37`
## • `` -> `...38`
## • `` -> `...39`
## • `` -> `...40`
## • `` -> `...41`
## • `` -> `...42`
## • `` -> `...43`
## • `` -> `...44`
## • `` -> `...45`
## • `` -> `...46`
## • `` -> `...47`
## • `` -> `...48`
## • `` -> `...49`
## • `` -> `...50`
## • `` -> `...51`
## • `` -> `...52`
## • `` -> `...53`
## • `` -> `...54`
## • `` -> `...55`
## • `` -> `...56`
## • `` -> `...57`
## • `` -> `...58`
## • `` -> `...59`
## • `` -> `...60`
## • `` -> `...61`
## • `` -> `...62`
## • `` -> `...63`
## • `` -> `...64`
## • `` -> `...65`
## • `` -> `...66`
## • `` -> `...67`
## • `` -> `...68`
## • `` -> `...69`
## • `` -> `...70`
## • `` -> `...71`
## • `` -> `...72`
## • `` -> `...73`
## • `` -> `...74`
## • `` -> `...75`
## • `` -> `...76`
## • `` -> `...77`
## • `` -> `...78`
## • `` -> `...79`
## • `` -> `...80`
## • `` -> `...81`
## • `` -> `...82`
## • `` -> `...83`
## • `` -> `...84`
## • `` -> `...85`
## • `` -> `...86`
## • `` -> `...87`
## • `` -> `...88`
## • `` -> `...89`
## • `` -> `...90`
## • `` -> `...91`
## • `` -> `...92`
## • `` -> `...93`
## • `` -> `...94`
## • `` -> `...95`
## • `` -> `...96`
## • `` -> `...97`
## • `` -> `...98`
## • `` -> `...99`
## • `` -> `...100`
## • `` -> `...101`
## • `` -> `...102`
## • `` -> `...103`
## • `` -> `...104`
## • `` -> `...105`
## • `` -> `...106`
## • `` -> `...107`
## • `` -> `...108`
## • `` -> `...109`
## • `` -> `...110`
## • `` -> `...111`
## • `` -> `...112`
## • `` -> `...113`
## • `` -> `...114`
## • `` -> `...115`
## • `` -> `...116`
## • `` -> `...117`
## • `` -> `...118`
## • `` -> `...119`
## • `` -> `...120`
## • `` -> `...121`
## • `` -> `...122`
## • `` -> `...123`
## • `` -> `...124`
## • `` -> `...125`
## • `` -> `...126`
## • `` -> `...127`
## • `` -> `...128`
## • `` -> `...129`
## • `` -> `...130`
## • `` -> `...131`
## • `` -> `...132`
## • `` -> `...133`
## • `` -> `...134`
## • `` -> `...135`
## • `` -> `...136`
## • `` -> `...137`
## • `` -> `...138`
## • `` -> `...139`
## • `` -> `...140`
## • `` -> `...141`
## • `` -> `...142`
## • `` -> `...143`
## • `` -> `...144`
## • `` -> `...145`
## • `` -> `...146`
## • `` -> `...147`
## • `` -> `...148`
## • `` -> `...149`
## • `` -> `...150`
## • `` -> `...151`
## • `` -> `...152`
## • `` -> `...153`
## • `` -> `...154`
## • `` -> `...155`
## • `` -> `...156`
## • `` -> `...157`
## • `` -> `...158`
## • `` -> `...159`
## • `` -> `...160`
## • `` -> `...161`
## • `` -> `...162`
## • `` -> `...163`
## • `` -> `...164`
## • `` -> `...165`
## • `` -> `...166`
## • `` -> `...167`
## • `` -> `...168`
## • `` -> `...169`
## • `` -> `...170`
## • `` -> `...171`
## • `` -> `...172`
## • `` -> `...173`
## • `` -> `...174`
## • `` -> `...175`
## • `` -> `...176`
## • `` -> `...177`
## • `` -> `...178`
## • `` -> `...179`
## • `` -> `...180`
## • `` -> `...181`
## • `` -> `...182`
## • `` -> `...183`
## • `` -> `...184`
## • `` -> `...185`
## • `` -> `...186`
## • `` -> `...187`
## • `` -> `...188`
## • `` -> `...189`
## • `` -> `...190`
## • `` -> `...191`
## • `` -> `...192`
## • `` -> `...193`
## • `` -> `...194`
## • `` -> `...195`
## • `` -> `...196`
## • `` -> `...197`
## • `` -> `...198`
## • `` -> `...199`
## • `` -> `...200`
## • `` -> `...201`
## • `` -> `...202`
## • `` -> `...203`
## • `` -> `...204`
## • `` -> `...205`
## • `` -> `...206`
## • `` -> `...207`
## • `` -> `...208`
## • `` -> `...209`
dat
## # A tibble: 26 × 209
## ...1 ...2 ...3 ...4 ...5 ...6 ...7 ...8 ...9 ...10 ...11 ...12
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 42110000… 강원… 261975 261975 11381 15326 18927 18260 17214 19038 17812 22623
## 2 42110250… 강원… 7531 7531 264 289 353 433 459 481 462 500
## 3 42110310… 강원… 6025 6025 284 331 333 375 376 381 372 483
## 4 42110320… 강원… 1613 1613 38 48 58 74 110 87 55 80
## 5 42110330… 강원… 2603 2603 58 76 135 163 193 158 112 156
## 6 42110340… 강원… 1130 1130 27 22 25 38 53 61 43 53
## 7 42110350… 강원… 4151 4151 109 127 155 229 219 216 173 193
## 8 42110360… 강원… 2600 2600 55 90 117 146 148 128 85 129
## 9 42110380… 강원… 886 886 10 14 26 50 35 27 25 38
## 10 42110390… 강원… 10585 10585 642 670 714 620 589 788 882 1018
## # ℹ 16 more rows
## # ℹ 197 more variables: ...13 <dbl>, ...14 <dbl>, ...15 <dbl>, ...16 <dbl>,
## # ...17 <dbl>, ...18 <dbl>, ...19 <dbl>, ...20 <dbl>, ...21 <dbl>,
## # ...22 <dbl>, ...23 <dbl>, ...24 <dbl>, ...25 <dbl>, ...26 <dbl>,
## # ...27 <dbl>, ...28 <dbl>, ...29 <dbl>, ...30 <dbl>, ...31 <dbl>,
## # ...32 <dbl>, ...33 <dbl>, ...34 <dbl>, ...35 <dbl>, ...36 <dbl>,
## # ...37 <dbl>, ...38 <dbl>, ...39 <dbl>, ...40 <dbl>, ...41 <dbl>, …
변수명 재정의하기
앞서 만든 변수명은 처음 두 열의 이름(행정기관 코드와 읍면동 이름)이 빠져 있어 다음과 같이 두 열의 이름을 추가하여 정의합시다.
names( dat ) <- c( "code", "region", var_names )
names( dat )
## [1] "code" "region"
## [3] "2008년_계_총 인구수" "2008년_계_연령구간인구수"
## [5] "2008년_계_0~4세" "2008년_계_5~9세"
## [7] "2008년_계_10~14세" "2008년_계_15~19세"
## [9] "2008년_계_20~24세" "2008년_계_25~29세"
## [11] "2008년_계_30~34세" "2008년_계_35~39세"
## [13] "2008년_계_40~44세" "2008년_계_45~49세"
## [15] "2008년_계_50~54세" "2008년_계_55~59세"
## [17] "2008년_계_60~64세" "2008년_계_65~69세"
## [19] "2008년_계_70~74세" "2008년_계_75~79세"
## [21] "2008년_계_80~84세" "2008년_계_85~89세"
## [23] "2008년_계_90~94세" "2008년_계_95~99세"
## [25] "2008년_계_100세 이상" "2008년_남_남 인구수"
## [27] "2008년_남_연령구간인구수" "2008년_남_0~4세"
## [29] "2008년_남_5~9세" "2008년_남_10~14세"
## [31] "2008년_남_15~19세" "2008년_남_20~24세"
## [33] "2008년_남_25~29세" "2008년_남_30~34세"
## [35] "2008년_남_35~39세" "2008년_남_40~44세"
## [37] "2008년_남_45~49세" "2008년_남_50~54세"
## [39] "2008년_남_55~59세" "2008년_남_60~64세"
## [41] "2008년_남_65~69세" "2008년_남_70~74세"
## [43] "2008년_남_75~79세" "2008년_남_80~84세"
## [45] "2008년_남_85~89세" "2008년_남_90~94세"
## [47] "2008년_남_95~99세" "2008년_남_100세 이상"
## [49] "2008년_여_여 인구수" "2008년_여_연령구간인구수"
## [51] "2008년_여_0~4세" "2008년_여_5~9세"
## [53] "2008년_여_10~14세" "2008년_여_15~19세"
## [55] "2008년_여_20~24세" "2008년_여_25~29세"
## [57] "2008년_여_30~34세" "2008년_여_35~39세"
## [59] "2008년_여_40~44세" "2008년_여_45~49세"
## [61] "2008년_여_50~54세" "2008년_여_55~59세"
## [63] "2008년_여_60~64세" "2008년_여_65~69세"
## [65] "2008년_여_70~74세" "2008년_여_75~79세"
## [67] "2008년_여_80~84세" "2008년_여_85~89세"
## [69] "2008년_여_90~94세" "2008년_여_95~99세"
## [71] "2008년_여_100세 이상" "2009년_계_총 인구수"
## [73] "2009년_계_연령구간인구수" "2009년_계_0~4세"
## [75] "2009년_계_5~9세" "2009년_계_10~14세"
## [77] "2009년_계_15~19세" "2009년_계_20~24세"
## [79] "2009년_계_25~29세" "2009년_계_30~34세"
## [81] "2009년_계_35~39세" "2009년_계_40~44세"
## [83] "2009년_계_45~49세" "2009년_계_50~54세"
## [85] "2009년_계_55~59세" "2009년_계_60~64세"
## [87] "2009년_계_65~69세" "2009년_계_70~74세"
## [89] "2009년_계_75~79세" "2009년_계_80~84세"
## [91] "2009년_계_85~89세" "2009년_계_90~94세"
## [93] "2009년_계_95~99세" "2009년_계_100세 이상"
## [95] "2009년_남_총 인구수" "2009년_남_연령구간인구수"
## [97] "2009년_남_0~4세" "2009년_남_5~9세"
## [99] "2009년_남_10~14세" "2009년_남_15~19세"
## [101] "2009년_남_20~24세" "2009년_남_25~29세"
## [103] "2009년_남_30~34세" "2009년_남_35~39세"
## [105] "2009년_남_40~44세" "2009년_남_45~49세"
## [107] "2009년_남_50~54세" "2009년_남_55~59세"
## [109] "2009년_남_60~64세" "2009년_남_65~69세"
## [111] "2009년_남_70~74세" "2009년_남_75~79세"
## [113] "2009년_남_80~84세" "2009년_남_85~89세"
## [115] "2009년_남_90~94세" "2009년_남_95~99세"
## [117] "2009년_남_100세 이상" "2009년_여_총 인구수"
## [119] "2009년_여_연령구간인구수" "2009년_여_0~4세"
## [121] "2009년_여_5~9세" "2009년_여_10~14세"
## [123] "2009년_여_15~19세" "2009년_여_20~24세"
## [125] "2009년_여_25~29세" "2009년_여_30~34세"
## [127] "2009년_여_35~39세" "2009년_여_40~44세"
## [129] "2009년_여_45~49세" "2009년_여_50~54세"
## [131] "2009년_여_55~59세" "2009년_여_60~64세"
## [133] "2009년_여_65~69세" "2009년_여_70~74세"
## [135] "2009년_여_75~79세" "2009년_여_80~84세"
## [137] "2009년_여_85~89세" "2009년_여_90~94세"
## [139] "2009년_여_95~99세" "2009년_여_100세 이상"
## [141] "2010년_계_총 인구수" "2010년_계_연령구간인구수"
## [143] "2010년_계_0~4세" "2010년_계_5~9세"
## [145] "2010년_계_10~14세" "2010년_계_15~19세"
## [147] "2010년_계_20~24세" "2010년_계_25~29세"
## [149] "2010년_계_30~34세" "2010년_계_35~39세"
## [151] "2010년_계_40~44세" "2010년_계_45~49세"
## [153] "2010년_계_50~54세" "2010년_계_55~59세"
## [155] "2010년_계_60~64세" "2010년_계_65~69세"
## [157] "2010년_계_70~74세" "2010년_계_75~79세"
## [159] "2010년_계_80~84세" "2010년_계_85~89세"
## [161] "2010년_계_90~94세" "2010년_계_95~99세"
## [163] "2010년_계_100세 이상" "2010년_남_총 인구수"
## [165] "2010년_남_연령구간인구수" "2010년_남_0~4세"
## [167] "2010년_남_5~9세" "2010년_남_10~14세"
## [169] "2010년_남_15~19세" "2010년_남_20~24세"
## [171] "2010년_남_25~29세" "2010년_남_30~34세"
## [173] "2010년_남_35~39세" "2010년_남_40~44세"
## [175] "2010년_남_45~49세" "2010년_남_50~54세"
## [177] "2010년_남_55~59세" "2010년_남_60~64세"
## [179] "2010년_남_65~69세" "2010년_남_70~74세"
## [181] "2010년_남_75~79세" "2010년_남_80~84세"
## [183] "2010년_남_85~89세" "2010년_남_90~94세"
## [185] "2010년_남_95~99세" "2010년_남_100세 이상"
## [187] "2010년_여_총 인구수" "2010년_여_연령구간인구수"
## [189] "2010년_여_0~4세" "2010년_여_5~9세"
## [191] "2010년_여_10~14세" "2010년_여_15~19세"
## [193] "2010년_여_20~24세" "2010년_여_25~29세"
## [195] "2010년_여_30~34세" "2010년_여_35~39세"
## [197] "2010년_여_40~44세" "2010년_여_45~49세"
## [199] "2010년_여_50~54세" "2010년_여_55~59세"
## [201] "2010년_여_60~64세" "2010년_여_65~69세"
## [203] "2010년_여_70~74세" "2010년_여_75~79세"
## [205] "2010년_여_80~84세" "2010년_여_85~89세"
## [207] "2010년_여_90~94세" "2010년_여_95~99세"
## [209] "2010년_여_100세 이상"
tidy 데이터로 변환하기기
wide2long
tidyverse
패키지 (내의 tidyr
패키지)에서 제공하는 함수 pivot_long()
는 wide format 데이터를 long format 데이터로 변환하는 기능을 한다. 이 함수를 이용하여 위의 데이터를 long format 데이터로 변환하겠습니다.1
pivot_longer()
함수의 주요 인수는 다음과 같습니다.
- 첫번째 인수 : 데이터 (여기서는 %>%으로 전달)
- 두번째 인수 : (해당 데이터에서 long format으로) 변환할 열
- names_to 인수 : 변환후 기존 열 이름을 값으로 하는 열 이름
- values_to 인수 : 변환후 기존 값이 저장될 열 이름
dat %>%
pivot_longer(-(1:2), names_to="age_grp", values_to="pops")
## # A tibble: 5,382 × 4
## code region age_grp pops
## <chr> <chr> <chr> <dbl>
## 1 4211000000 강원도 춘천시 2008년_계_총 인구수 261975
## 2 4211000000 강원도 춘천시 2008년_계_연령구간인구수 261975
## 3 4211000000 강원도 춘천시 2008년_계_0~4세 11381
## 4 4211000000 강원도 춘천시 2008년_계_5~9세 15326
## 5 4211000000 강원도 춘천시 2008년_계_10~14세 18927
## 6 4211000000 강원도 춘천시 2008년_계_15~19세 18260
## 7 4211000000 강원도 춘천시 2008년_계_20~24세 17214
## 8 4211000000 강원도 춘천시 2008년_계_25~29세 19038
## 9 4211000000 강원도 춘천시 2008년_계_30~34세 17812
## 10 4211000000 강원도 춘천시 2008년_계_35~39세 22623
## # ℹ 5,372 more rows
필요한 열 생성하기
마지막으로 위에서 생성한 age_grp
열의 값을 separate()
함수를 이용하여 밑줄문자(_, underscore)를 분리자로 기존 열의 값을 분리하고 into 인수로 지정한 각 열에 배치합니다.
dat %>%
pivot_longer(-(1:2), names_to="age_grp", values_to="pops") %>%
separate(age_grp, into=c("year", "grp", "age_grp"), sep="_")
## # A tibble: 5,382 × 6
## code region year grp age_grp pops
## <chr> <chr> <chr> <chr> <chr> <dbl>
## 1 4211000000 강원도 춘천시 2008년 계 총 인구수 261975
## 2 4211000000 강원도 춘천시 2008년 계 연령구간인구수 261975
## 3 4211000000 강원도 춘천시 2008년 계 0~4세 11381
## 4 4211000000 강원도 춘천시 2008년 계 5~9세 15326
## 5 4211000000 강원도 춘천시 2008년 계 10~14세 18927
## 6 4211000000 강원도 춘천시 2008년 계 15~19세 18260
## 7 4211000000 강원도 춘천시 2008년 계 20~24세 17214
## 8 4211000000 강원도 춘천시 2008년 계 25~29세 19038
## 9 4211000000 강원도 춘천시 2008년 계 30~34세 17812
## 10 4211000000 강원도 춘천시 2008년 계 35~39세 22623
## # ℹ 5,372 more rows
기존에
gather()
함수를 이용한 변환을 2021년 1월 31일에tidyr
패키지의pivot_longer()
함수를 이용하는 것으로 수정하였습니다. 이는tidyverse
패키지에서gather()
의 사용단계가 retired로 전환하였기 때문입니다.↩︎