https://mjs1995.tistory.com/169?category=802136
앞에서 만든 geojson 파일을 가지고 Python Plotly을 이용한 지도 시각화를 하려고 합니다.
데이터는 Kosis에 있는 2018년도 시군구별 인구수 데이터를 이용하려고 합니다.
여기서 소멸 위험지수란 20세~39세 이하의 여성인구수를 해당 지역의 65세 이상 고령자 인구수로 나눈 값을 의미합니다.
Plotly를 이용한 지도 시각화
Plotly를 이용한 지도시각화는 공식문서인 Mapbox Choropleth Maps in Python에서 확인할 수 있습니다.(https://plotly.com/python/mapbox-county-choropleth/)
필요한 라이브러리를 불러옵니다.
import pandas as pd
import json
import mapboxgl
import os
import plotly.express as px
데이터 불러오기
2018년 소멸위험지수 데이터를 가지고 시각화를 진행하려고 합니다.
df = pd.read_csv('2018년소멸위험지수.csv', encoding='cp949')
df['sigun_code']=df['sigun_code'].astype(str)
df.head()
geojson 파일
geojson파일을 json.load를 이용해서 불러온 다음에 데이터를 확인해봅니다.
state_geo ='map (7).zip.geojson'
state_geo1 = json.load(open(state_geo, encoding='utf-8'))
for idx, sigun_dict in enumerate(state_geo1['features']):
sigun_id = sigun_dict['properties']['merged']
sigun_nmm = df.loc[(df.sigun_code == sigun_id), 'sigun_nm'].iloc[0]
risk = df.loc[(df.sigun_code == sigun_id), '총인구_여자(명)'].iloc[0]
people = df.loc[(df.sigun_code == sigun_id), '총인구_65세이상(명)'].iloc[0]
people_w = df.loc[(df.sigun_code == sigun_id), '소멸위험지수'].iloc[0]
txt = f'<b><h4>{sigun_nmm}</h4></b>총인구_여자(명) :{risk:.2f}<br>총인구_65세이상(명) : {people}<br>소멸위험지수 : {people_w}'
state_geo1['features'][idx]['properties']['tooltip1'] = txt
state_geo1['features'][idx]['properties']['risk'] = people_w
state_geo1['features'][0]
Choropleth map using plotly.express
- location : 지도 및 지리에 대한 제한선
- geojson : 지리 정보
- color : 시각화할 데이터 값
- color_continuous_scale : 색상 결정 (https://plotly.com/python/builtin-colorscales/)
- range_color = 타겟값 범위 색
- mapbox_style : 지도 스타일
- featureidkey : df의 locations 와 geojson의 features의 연결하는 키값
- zoom : 지도보기 크기
- center : 기준
- labels : 우측 그래프바 라벨
불러온 GeoJSON파일에 id 필드 값이 없기 때문에 속성 필드 값중 하나인 merged를 이용하려고 하는데 이 값을 소멸지수데이터와 연결시켜주는 매개변수로 featureidkey 를 사용합니다.
fig = px.choropleth_mapbox(df, geojson=state_geo1,
locations='sigun_code',
color='소멸위험지수',
color_continuous_scale="matter",
range_color=(0, 2),
mapbox_style="carto-positron",
featureidkey="properties.merged",
zoom=6, center = {"lat": 37.565, "lon": 126.986},
opacity=0.5,
labels={'소멸위험지수':'지자체별 소멸위험지수'}
)
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.show()
Choropleth map using plotly.graph_objects and carto base map
carto base map을 이용해서 지도 시각화를 하려고 합니다.
import plotly.graph_objects as go
fig = go.Figure(go.Choroplethmapbox(
geojson=state_geo1,
locations=df.sigun_code,
z=df['소멸위험지수'],
featureidkey = 'properties.merged',
colorscale="Viridis",
zmin=0,
zmax=2,
marker_opacity=0.5, marker_line_width=0))
fig.update_layout(mapbox_style="carto-positron",
mapbox_zoom=6,
mapbox_center = {"lat": 35.565, "lon": 127.986})
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.show()
Choropleth map using plotly.graph_objects and open-street-map
open-street-map 을 사용하면 folium으로 지도시각화 한 것과 비슷한 형태의 지도가 나타납니다.
import plotly.graph_objects as go
fig = go.Figure(go.Choroplethmapbox(
geojson=state_geo1,
locations=df.sigun_code,
z=df['소멸위험지수'],
featureidkey = 'properties.merged',
colorscale="Viridis",
zmin=0,
zmax=2,
marker_opacity=0.5, marker_line_width=0))
fig.update_layout(mapbox_style="open-street-map",
mapbox_zoom=6,
mapbox_center = {"lat": 35.565, "lon": 127.986})
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.show()
Mapbox Light base map
Mapbox의 api 값을 이용하여 Light base map 지도 시각화를 하려고 합니다.
https://www.mapbox.com/ 사이트에 들어가서 계정을 생성하고 account에 들어가면 본인의 token값에 대해 확인할 수 있습니다.
token = '개인 Mapbox 토큰 키값 '
import plotly.graph_objects as go
fig = go.Figure(go.Choroplethmapbox(
geojson=state_geo1,
locations=df.sigun_code,
z=df['소멸위험지수'],
featureidkey = 'properties.merged',
colorscale="Viridis",
zmin=0,
zmax=2,
marker_opacity=0.5, marker_line_width=0))
fig.update_layout(mapbox_style="light",
mapbox_accesstoken=token,
mapbox_zoom=3,
mapbox_center = {"lat": 35.565, "lon": 127.986})
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.show()
Choropleth Map은 지리 영역별 데이터 수치 값을 색으로 표현한 지도 시각화 유형입니다
plotly는 사용자 정의 구성 및 스타일을 포함하여 사용 가능한 다양한 시각화 구현을 가능하게 합니다.
지도 시각화를 하는데 있어서 다양한 방법들이 있는데 데이터에 알맞은 시각화 방법으로 데이터 분석 시 좋은 인사이트를 창출할것같습니다.
'BI > Python' 카테고리의 다른 글
[python][plotly] dash와 heroku를 이용한 Dashboard 제작 (4) | 2021.02.01 |
---|---|
[python][plotly] 코로나 시각화 (0) | 2021.01.18 |
[python][Mapbox] geojson을 이용한 지도그리기 (3) (12) | 2021.01.12 |
[python][지도시각화] 일본 도도부현 시각화 (0) | 2021.01.11 |
[python] 레이더차트 시각화 (2) | 2020.09.23 |