본문 바로가기

데이터와 함께 탱고를/데이터 시각화

[지도 데이터 시각화] Part 4. Folium 살펴보기

첫 번째로 살펴볼 시각화 패키지는 Folium 입니다.
leaflet.js 기반으로 지도를 그려주고, 모바일에서도 쓸 수 있을만큼 가볍습니다.
나온지도 다른 라이브러리들에 비해 상대적으로 오래된 패키지입닌다만, 그만큼 안정적입니다.
한편, 분석 프레임워크로 가장 많이쓰는 pandas 와 쉽게 연동되어 간편하게 시각화가 가능합니다.
파이썬에서 지도 시각화 하면 가장 유명한 패키지일지도 모르겠습니다.

자 그럼 시작해보겠습니다.

1. 설치

먼저 pip install 로 folium 을 설치하고 임포트해줍니다.

pip install folium
import folium
folium.__version__
'0.9.0'

2. 샘플 하나 해보기

https://python-visualization.github.io/folium/quickstart.html#Getting-Started

위 링크로 가시면 어떻게 사용하는지 문서화가 아주 잘되있습니다.
이 글에서는 제가 미리 만둘어둔 데이터를 통해 어떤 식으로 데이터를 시각화하는지 살펴보겠습니다.

import pandas as pd

# 미리 만들어둔 데이터를 불러옵니다.
df = pd.read_csv('data/older_population.csv')
df.head()

인구 남자 여자
0 종로구 사직동 9700 4375 5325
1 종로구 삼청동 3013 1443 1570
2 종로구 부암동 10525 5002 5523
3 종로구 평창동 18830 8817 10013
4 종로구 무악동 8745 4078 4667

샘플로 쓸 데이터는 서울시 행정동 단위의 고령 인구 데이터입니다.
구, 동 별로 데이터가 있는 것을 확인하실 수 있습니다.

이번엔 행정동 단위의 지도 데이터 파일을 지정해보겠습니다.

geo_data = 'data/seoul-dong.geojson'

이 데이터를 열어보면 다음과 같이 생겼습니다.

{
  "type": "FeatureCollection",
  "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
  "features": [{ 
    "type": "Feature", 
    "properties": { 
      "시": "서울특별시", 
      "구": "종로구", 
      "동": "사직동", 
      "행정동코드": 11110530 
    }, 
    "geometry": { 
      "type": "MultiPolygon", 
      "coordinates": [ [ [ [ 126.976888842748167, 37.575650779448786 ], [ 126.977034498877501, 37.569194530054546 ], [ 126.975974728212492, 37.569336299425764 ], ...] ] ] } 
      }, { 
    "type": "Feature", 
    "properties": { 
      "시": "서울특별시", 
      "구": "종로구", 
      "동": "삼청동", 
      "행정동코드": 11110540
    }, 
    "geometry": { 
      "type": "MultiPolygon",
      "coordinates": [ [ [ [ 126.98268938649305, 37.595065519422398 ], [ 126.983372584569992, 37.594351925516882 ], [ 126.983868097928024, 37.593850468126433 ], ... ] ] ] 
    },
    ...
  ]
}

features 에 각 동별 MultiPolygon 정보를 담고있는 일반적인 GeoJson 파일입니다.

이제 이 두 데이터로 인구수에 따른 Choropleth Map 을 만들어보겠습니다.

# 서울시 중심부의 위도, 경도 입니다.
center = [37.541, 126.986]

# 맵이 center 에 위치하고, zoom 레벨은 11로 시작하는 맵 m을 만듭니다.
m = folium.Map(location=center, zoom_start=10)

# Choropleth 레이어를 만들고, 맵 m에 추가합니다.
folium.Choropleth(
    geo_data=geo_data,
    data=df,
    columns=('동', '인구'),
    key_on='feature.properties.동',
    fill_color='BuPu',
    legend_name='노령 인구수',
).add_to(m)

# 맵 m을 출력합니다.
m