격자통계 데이터를 활용한 지도그래프 만들기

국토정보플랫폼은 국토지리정보원에서 제공하는 서비스로 인구, 건물, 토지, 국토지표 통계를 정사각형 면적단위로 제공하고 있다. 시군구 경계단위 데이터만으로는 지역내 세밀한 통계를 표현하기가 어려운데, 격자통계는 이런 경우 유용하다. 그 격자통계를 활용한 그래프를 그려볼까 한다. 국토정보플랫폼에서는 아래와 같이 소개하고 있다.

국토정보플랫폼은 수치지도, 항공사진, 기준점 등 국토지리정보원에서 생산하는 다양한 공간정보의 제공 및 서비스를 담당하는 국가공간정보 허브로써, 민간, 공공 등 다양한 분양에서 공간정보의 융.복합, 개방, 활용을 담당하는 대표 서비스 창구 입니다.

  • 출처 : 국토지리정보원 홈페이지

격자통계

단위면적당(100m, 500m, 1km, 10km..) 격자통계를 이용하면 아래 그림의 그래프를 만들 수 있다. 내가 직접 만든 그래프는 아니고, 국토정보플랫폼 서비스에서 조건만 입력하면 아래와 같은 그래프를 얻을 수 있다. 내가 하려는 건, 격자통계 데이터를 받아 R프로그래밍으로 그래프를 직접 만들어 볼 예정이다.

격자통계를 받는 방법을 알아보자. 국토정보플랫폼 사이트에서 “국토통계지도” 메뉴를 선택한다. 원하는 통계주제를 고르고 격자의 크기를 정해서 검색하여 다운받으면 된다. 그리고 서버에 500m 이하 격자는 시도별로 한번에 받을 수 없어, 시군구단위로 조회하면서 개별로 다운로드 해야한다.

파일 받아보면 알겠지만, shp 파일로 이뤄져있다. 격자통계는 정사각형 경계모양들이 모여있는 지도데이터 일뿐, 전혀 다른 데이터가 아니다.

실제로 데이터를 읽어 확인해보자. NA 값이 있어서 0 으로 변경만 해줬다.

popul1km_seoul = read_sf('~/mypath/총인구수1KM_서울특별시/nlsp_020001001.shp') |> 
  mutate(val = ifelse(is.na(val), 0, val))

Simple feature collection with 710 features and 3 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: 935000 ymin: 1936000 xmax: 973000 ymax: 1967000
Projected CRS: Korea 2000 / Unified CS
# A tibble: 710 × 4
   gid      lbl        val                                                                           geometry
   <chr>    <chr>    <dbl>                                                                      <POLYGON [m]>
 1 다사6453 9097.00   9097 ((964000 1953000, 964000 1954000, 965000 1954000, 965000 1953000, 964000 1953000))
 2 다사5651 12132.00 12132 ((956000 1951000, 956000 1952000, 957000 1952000, 957000 1951000, 956000 1951000))
 3 다사6157 28564.00 28564 ((961000 1957000, 961000 1958000, 962000 1958000, 962000 1957000, 961000 1957000))
 4 다사5858 22981.00 22981 ((958000 1958000, 958000 1959000, 959000 1959000, 959000 1958000, 958000 1958000))
 5 다사5347 11550.00 11550 ((953000 1947000, 953000 1948000, 954000 1948000, 954000 1947000, 953000 1947000))
 6 다사5955 19484.00 19484 ((959000 1955000, 959000 1956000, 960000 1956000, 960000 1955000, 959000 1955000))
 7 다사5748 898.00     898 ((957000 1948000, 957000 1949000, 958000 1949000, 958000 1948000, 957000 1948000))
 8 다사7152 13083.00 13083 ((971000 1952000, 971000 1953000, 972000 1953000, 972000 1952000, 971000 1952000))
 9 다사5961 28528.00 28528 ((959000 1961000, 959000 1962000, 960000 1962000, 960000 1961000, 959000 1961000))
10 다사6549 6909.00   6909 ((965000 1949000, 965000 1950000, 966000 1950000, 966000 1949000, 965000 1949000))
# ℹ 700 more rows
# ℹ Use `print(n = ...)` to see more rows

그래프를 그리면, 정사각형 모양의 격자로 만들어지는 것을 볼 수 있다.

ggplot(popul1km_seoul) +
  geom_sf() +
  theme_bw()

인구수 필드인 val를 가지고 색상을 채워보자.

ggplot(popul1km_seoul) +
  geom_sf(aes(fill = val)) +
  theme_bw()

scale_fill_viridis_c 함수를 이용해서 색을 셋팅해봤다. 진할수록 인구수가 많은 지역이다.

ggplot(popul1km_seoul) +
  geom_sf(aes(fill = val)) +
  scale_fill_viridis_c(option = "A", direction = -1, begin = 0.5, na.value = "gray100") +
  theme_bw()

격자만 있으면 어디지역인지 알기가 어려우니, 시군구 경계지도를 더해준다.

ggplot() +
  geom_sf(data = popul1km_seoul, aes(fill = val), colour = "gray90") +
  geom_sf(data = map_sig_f, fill = NA) +
  geom_sf(data = han_river_f, fill = "skyblue2", colour = "skyblue3", alpha = 0.5) +
  scale_fill_viridis_c(option = "A", direction = -1, begin = 0.5, na.value = "gray100") +
  theme_bw()

타이틀만 추가하고 범레위치만 조정하면 아래와 같이 완성할 수 있다.


더 보면 좋을 글들