전국 시군구 행정경계지도를 기반으로 서울시 통계자료를 매핑하는 방법을 알아본다.
개요
행정경계지도만 시각화 해서는 별다른 효용이 없다. 각 행정구역에 해당하는 각종 숫자를 같이 엮어주어야 지역별 비교라던지 연도별 추이를 잘 볼 수 있을 것이다. 본 포스팅에서는 행정경계지도에 서울 열린데이터 광장의 통계자료를 매핑하는 과정을 소개하고자 한다.
데이터 준비
행정경계지도
여기에서 사용하는 데이터는 시군구 기준의 행정경계구역이 표기된 자료를 활용하며 한국 행정경계지도 시각화 포스팅에서 사용하는 것과 같으니 참고하도록 하자.
다음의 코드로 행정경계지도를 불러와서 확인한다.
1 | map = readOGR("TL_SCCO_SIG.shp") |
데이터를 불러와서 id를 지정해주고 법정동 코드 첫 두자리를 추출하여 “SIDO” 변수에 할당한다. 해당 변수를 기반으로 서울지역의 법정동 코드의 첫 두 자리인 “11”로 필터링하여 서울 지역 행정구역 데이터를 확보하도록 하자.
1 | df_map_info_seoul = df_map_info[df_map_info$SIDO == 11, ] |
통계 자료
서울 열린데이터 광장의 데이터 중 서울시 신고·등록 체육시설 통계를 사용한다.
2019년 통계를 내려받아 “stat_seoul_culture_sport_2019.txt”로 저장하였는데 해당 자료를 바로 사용하고자 한다면 아래 링크를 클릭하여 내려받아 실습을 해보도록 하자.
예제 파일: stat_seoul_culture_sport_2019.txt
“stat_seoul_culture_sport_2019.txt” 파일은 다음과 같다.
1 | df_stat = read.csv("stat_seoul_culture_sport_2019.txt", sep = "\t", |
엑셀의 셀 병합 문제 때문에 txt확장자로 다운로드 받아도 변수명에 문제가 많은 것을 알 수 있다. 본 데이터를 깔끔하게 처리하는 방법은 별도의 포스팅에서 다룰 예정이며 우선 전체 시설 면적을 기반으로 시각화를 할 예정이다. 그리고 첫 번째 변수는 “기간”으로 되어있는데 해당 변수를 살펴보는 코드는 다음과 같다.
1 | unique(df_stat$기간) |
“기간”과 “2019” 밖에 없기 때문에 불필요한 변수로 판단하고 다음과 같이 코드를 작성한다.
1 | df_stat_sub = df_stat[-(1:3), 2:4] |
행정구역명, 시설 수, 시설 면적만 남았다. 물론 시설 수 또한 없애도 되지만 유지하였다.
한글 변수명의 경우 인코딩 문제 중 좋지 않은 문제가 발생할 수 있기 때문에 이를 영어로 바꿔주었다.
1 | colnames(df_stat_sub) = c("region", "cnt", "area") |
숫자에 쉼표나 단위가 섞여있으면 이를 문자로 인식하기 때문에 텍스트 처리 함수 중 하나인 gsub()
함수와 정규표현식(regular expression)을 활용하여 숫자 및 쉼표를 제외한 나머지 텍스트를 다 제거하는 코드는 다음과 같다.
1 | df_stat_sub[, "cnt" ] = as.numeric(gsub("[^0-9.]", "", df_stat_sub$cnt)) |
데이터 병합
지도를 그리려면 id 기준으로 통계량을 붙여줘야되는데 아쉽게도 기존 통계 데이터에는 “id” 변수가 없어 바로 매핑이 불가하다. 다음의 객체간 관계도를 참고하도록 하자.
서울 지역의 행정구역 데이터와 서울 통계를 병합하는 코드는 다음과 같다.
1 | library("dplyr") |
지도 데이터와 엮기 이전에 “id” 변수의 속성을 확인하면 숫자가 아니라는 것을 알 수 있다. 다음 코드를 보기 전에 join 연산을 시도했다면 에러를 마주했을 것이다.
1 | head(df_map_seoul, 2) |
숫자로 변환 후 병합결과는 다음과 같다.
1 | df_map_seoul[, "id"] = as.numeric(df_map_seoul$id) |
시각화
기본
앞의 절차 진행 후 확보한 “df_map_seoul” 객체를 활용하여 그려본 ggplot 기반 시각화는 다음과 같다.
1 | ggplot(data = df_map_seoul, |
통계값 매핑
지역별 통계값을 기반으로 색을 채운 결과는 다음과 같다.
1 | ggplot(data = df_map_seoul_join, |
추가 조정
통계값에 따라 원하는 색상을 지정하기 원하는 경우 다음과 같이 scale_fill_gradient()
관련 함수를 사용하면 되고, 추가로 불필요한 위경도 정보를 theme_void()
함수로 테마설정을 하여 시각화한 코드와 결과는 다음과 같다.
1 | ggplot(data = df_map_seoul_join, |
기타
참고로 여기서 사용하는 지리 좌표계는 범용적으로 사용하는 WGS84 좌표계가 아니다. 좌표계 변환과 관련해서는 R) 전처리 - 지리 좌표계(CRS) 변환 포스팅을 참고하도록 하자.