🖥️ IT, 컴퓨터/📏 R

[R] 동적 단계구분도 만들기 (서울시 지하층 거주 인구)

김 홍시 2022. 10. 3.
반응형

오늘은 R을 이용하여 동적 지도를 만들어볼 건데요, 데이터는 단계구분도 형식으로 표현하려고 합니다.

 

목표

목표는 이와 같이 지도의 확대 및 축소가 가능하고,

해당 지역을 누르면 그 지역의 정보를 알 수 있는 동적지도를 만드는 것입니다.

데이터의 표현은 노란색에서 붉은색으로 점점 짙어지는 단계구분도로 합니다.

 

주제 선정

본 분석을 하기로 마음 먹은 것은 바로 2022년 8월에 발생한 서울시 집중호우 때문이었는데요,

특히 제가 현재 거주하고 있는 관악구에서 사망사건이 발생하는 등 피해가 컸어요.

관악구에는 지하층에 거주하는 사람들이 많다고 하는데요, 정말로 그런지 데이터를 통해 알아보고 싶었어요.

 

데이터 구득

본 분석에 활용한 데이터는

(1) 서울시 시군구 shp파일, (2) 서울시 시군구별 지하층 거주 인구 수

입니다.

 

(1) 서울시 시군구 shp파일은 SGIS 통계지리정보서비스에서 구득하였습니다.

서울_경계_시군구_census_data_2021_bnd_sigungu_bnd_sigungu_11_2021_2021.zip
0.56MB

 

이 파일을 내려받으시면 됩니다.

 

(2) 서울시 시군구별 지하층 거주 인구 수는 한국도시연구소의 보고서 PDF 파일을 이용하였습니다.

https://kocer.re.kr/26/?idx=12873102&bmode=view 

 

[이슈페이퍼] 지옥고 거주 실태 심층 분석 보고서 : 한국도시연구소

한국도시연구소는 KBS와 공동으로 작업한 이슈페이퍼 <지옥고 거주 실태 심층 분석 보고서-2020년 인구주택총조사 마이크로데이터 분석 결과를 중심으로>를 공개합니다.자세한 내용은 첨부한 파

kocer.re.kr

본 보고서에서는 지옥고 (지하, 옥상, 고시원)에서 거주하는 사람들이 얼마나 되는지 정리해두었는데요,

저희는 이 중 지하 데이터를 사용합니다.

지옥고_거주_실태_심층_분석_보고서_220922.pdf
1.39MB

PDF에 있는 표를 활용해야 하는데요,

PDF 표를 가져오는 방법으로는 여러 가지가 있겠지만 저는 주로 엑셀의 데이터 가져오기 기능을 사용합니다.

먼저 해당 PDF 자료에서 몇 페이지에 내가 관심 있는 표가 위치해있는지 확인합니다.

저는 24쪽의 데이터를 가져와야 합니다.

 

엑셀을 열어 [데이터] > [데이터 가져오기] > [파일에서] > [PDF에서]를 누릅니다.

그런 후 PDF를 선택해 가져오기를 누릅니다.

 

조금 기다리면 이렇게 원하는 페이지를 고를 수 있게 나옵니다.

Page 24에 있는 Table012를 눌러 데이터를 확인한 후 로드를 누릅니다.

 

그럼 이렇게 초록색 표가 나와요.

저는 서식을 완전히 없애주기 위해서 다른 칸에 새로 붙여주었어요.

먼저 초록 칸을 복사하고, 우측의 빈 셀을 선택해 우클릭한 후 메뉴 중에서 값으로 붙여넣기를 선택합니다.

그러면 이와 같이 서식이 제거된 새로운 표가 두둥 등장합니다.

 

저는 이 중 일반가구의 가구, 인구, 가구 비율 셀을 사용할게요.

 

해당 부분만 정리하여 가공한 표는 이와 같습니다.

지하 거주_서울.csv
0.00MB

 

그럼 데이터 구득은 완료되었습니다.

 

 

R을 이용하여 데이터 불러오기

이제 Rstudio를 켜서 데이터를 불러오겠습니다.

불러와야 하는 데이터는 (1) shp파일과 (2) 서울의 지하에 거주하는 사람 데이터 두 가지입니다. 

 

사용한 코드 먼저 올려보면 다음과 같습니다.

sgg <- sf::st_read("C:\\*여러분의 경로*\\bnd_sigungu_11_2021_2021_2Q.shp", options = "ENCODING=euc-kr")

# 서울 불러오기
under_seoul <- read.csv("C:\\*여러분의 경로*\\지하 거주_서울.csv")
under_seoul[-26,] # 26번째 행을 삭제
names(under_seoul)[4] <- c("전체 가구 중 비율")
class(under_seoul$가구)
for(i in 2:4) {
  under_seoul[, i] <- as.numeric(gsub(",", "", under_seoul[, i]))
}

 

코드 설명

(1) sf 패키지의 st_read라는 함수를 이용하여 shp 파일을 sgg라는 이름으로 불러왔어요.

 

(2) 26번째 행은 아래와 같이 서울특별시 데이터입니다. 우리는 구별 데이터만 필요하므로 삭제하였습니다.

 

(3) names 함수를 이용하여 열의 이름을 바꾸어주었습니다.

원래 열의 이름은 R 상에서 '가구. 비율'이었는데요, 새로운 이름인 '전체 가구 중 비율'로 바꾸었어요.

 

(4) 다음으로 가구 데이터의 class를 확인하였습니다.

가구수에 대한 데이터임에도 character로 구분되는데요,

그것은 바로 숫자에 천 단위를 표시해주는 콤마 (,)가 들어가있기 때문입니다.

 

이 상황에서는 as.numeric과 같이 숫자로 변환해주는 함수를 쓰면 NA로 데이터가 전부 바뀌어 버려서 우리가 쓸 수 없게 됩니다.

 

그래서 아래의 코드를 사용했습니다.

먼저 gsub 함수를 이용하여 "," 콤마를 ""로 바꾸어 없애주었어요.

이 때, under_seoul이라는 데이터 프레임 중 두 번째, 세 번째 열에 적용해야 하는 상황이었어요. ('가구' 열, '인구' 열) 그래서 for ( i in 2번 열 : 4번 열)로 적어주어 2번째에서 시작하여 4번째 앞 열까지 적용시켜준다고 써 주었습니다.

 

gsub를 이용해 콤마를 없애준 데이터는 다시 as.numeric 함수를 이용하여 숫자의 형태로 바꾸어주었고,

이렇게 가공한 내용을 원본 데이터에 적용시키기 위해 <-로 원본 데이터프레임에 assign해주었습니다.

이제는 이렇게 numeric으로 나오는 걸 확인할 수 있어요!

 

 

 

R을 이용하여 지도 만들기

#시군구와 서울 조인
seouljoin <- merge(sgg, under_seoul, by.x ="SIGUNGU_NM", by.y = "구분")


library(tmap)
tmap_mode('view')
tm_shape(seouljoin) + 
  tm_polygons(c("가구","인구","전체 가구 중 비율"))+
  tm_facets(sync = TRUE, ncol = 3) # 이동 동기화 여부, 지도 배치 열의 수

R코딩 후반부는 아까 불러온 공간 데이터를 이용해 지도를 만드는 것입니다.

 

코드 설명

(1) 먼저 merge 함수를 이용하여 위에서 불러온 shp파일인 sgg 데이터와 under_seoul (지하층 거주 인구) 데이터를 join합니다.

join을 할 때에는 두 데이터가 가지고 있는 공통 열을 이용합니다. 여기에서는 둘 다 시군구 이름을 포함하고 있기 때문에, 시군구 이름을 key 열로 잡아주려고 해요.

이 때 by. x에는 sgg 데이터의 시군구 이름 열인 "SIGUNGU_NM", by.y에는 under_seoul 데이터의 시군구 이름 열인 "구분"을 넣어주었어요.

 

(2) 그런 후 지도를 만들어볼게요.

여기에서는 tmap을 사용하기 때문에 library를 불러와줍니다.

tmap_mode에는 view 모드가 있고 plot 모드가 있는데요,

우리는 동적 지도를 원하기 때문에 view 모드로 바꾸어줍니다.

 

(3) 이제 지도를 구성해볼게요.

첫 번째 tm_shape에는 내가 사용하고자 하는 데이터 프레임을 적어줍니다.

그런 후 뒤에 오는 tm_polygons와 tm_facets는 + 기호로 연결해줍니다.

 

tm_polygons에는 어떤 데이터를 지도로 만들어 줄 건지 써줍니다. 이때, 데이터가 문자열로 되어있으면 무작위의 색상이 칠해지고, 숫자로 되어있으면 단계구분도가 됩니다.

여기에서는 가구, 인구, 전체 가구 중 비율 이렇게 세 가지 열을 사용할 것이므로 c를 이용해 연결합니다.

 

tm_facets에는 두 가지 옵션을 써 주었습니다. sync는 하나의 지도를 이동시켰을 때 다른 지도도 옮겨지게 할 것인지에 대한 옵션입니다. ncol = 3은 지도가 배치되는 열의 개수를 말합니다. 저는 3개의 지도이므로 이렇게 3을 써주었어요.

 

분석 결과

관악구에서 높게 나타나는 것을 알 수 있습니다.

 

 

아래의 html 파일을 열면 지도를 확인할 수 있습니다.

지하거주.html
6.57MB

 

 

반응형

댓글