오늘은 R을 이용하여 동적 지도를 만들어볼 건데요, 데이터는 단계구분도 형식으로 표현하려고 합니다.
목표
목표는 이와 같이 지도의 확대 및 축소가 가능하고,
해당 지역을 누르면 그 지역의 정보를 알 수 있는 동적지도를 만드는 것입니다.
데이터의 표현은 노란색에서 붉은색으로 점점 짙어지는 단계구분도로 합니다.
주제 선정
본 분석을 하기로 마음 먹은 것은 바로 2022년 8월에 발생한 서울시 집중호우 때문이었는데요,
특히 제가 현재 거주하고 있는 관악구에서 사망사건이 발생하는 등 피해가 컸어요.
관악구에는 지하층에 거주하는 사람들이 많다고 하는데요, 정말로 그런지 데이터를 통해 알아보고 싶었어요.
데이터 구득
본 분석에 활용한 데이터는
(1) 서울시 시군구 shp파일, (2) 서울시 시군구별 지하층 거주 인구 수
입니다.
(1) 서울시 시군구 shp파일은 SGIS 통계지리정보서비스에서 구득하였습니다.
이 파일을 내려받으시면 됩니다.
(2) 서울시 시군구별 지하층 거주 인구 수는 한국도시연구소의 보고서 PDF 파일을 이용하였습니다.
https://kocer.re.kr/26/?idx=12873102&bmode=view
본 보고서에서는 지옥고 (지하, 옥상, 고시원)에서 거주하는 사람들이 얼마나 되는지 정리해두었는데요,
저희는 이 중 지하 데이터를 사용합니다.
PDF에 있는 표를 활용해야 하는데요,
PDF 표를 가져오는 방법으로는 여러 가지가 있겠지만 저는 주로 엑셀의 데이터 가져오기 기능을 사용합니다.
먼저 해당 PDF 자료에서 몇 페이지에 내가 관심 있는 표가 위치해있는지 확인합니다.
저는 24쪽의 데이터를 가져와야 합니다.
엑셀을 열어 [데이터] > [데이터 가져오기] > [파일에서] > [PDF에서]를 누릅니다.
그런 후 PDF를 선택해 가져오기를 누릅니다.
조금 기다리면 이렇게 원하는 페이지를 고를 수 있게 나옵니다.
Page 24에 있는 Table012를 눌러 데이터를 확인한 후 로드를 누릅니다.
그럼 이렇게 초록색 표가 나와요.
저는 서식을 완전히 없애주기 위해서 다른 칸에 새로 붙여주었어요.
먼저 초록 칸을 복사하고, 우측의 빈 셀을 선택해 우클릭한 후 메뉴 중에서 값으로 붙여넣기를 선택합니다.
그러면 이와 같이 서식이 제거된 새로운 표가 두둥 등장합니다.
저는 이 중 일반가구의 가구, 인구, 가구 비율 셀을 사용할게요.
해당 부분만 정리하여 가공한 표는 이와 같습니다.
그럼 데이터 구득은 완료되었습니다.
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 파일을 열면 지도를 확인할 수 있습니다.
'🖥️ IT, 컴퓨터 > 📏 R' 카테고리의 다른 글
[R] dplyr 치트시트 :: Data Transformation with dplyr (0) | 2023.12.28 |
---|---|
[R] R로 PPT 파일 손쉽게 만들기 (with Qmd) (0) | 2022.10.12 |
[R] 카카오맵 API를 사용해 지오코딩하기 (주소를 경위도로 변환) (6) | 2022.08.29 |
[R] R Studio 꾸미기 (TmThemeEditor사용하여 내가 원하는 색으로 바꾸기) (0) | 2022.08.11 |
[R] R Studio에서 R 파일의 한글이 깨질 때 : 인코딩 reopen, 노트패드 (2) | 2022.08.11 |
댓글