융무의 기술블로그
article thumbnail

https://mjs1995.tistory.com/169?category=802136

 

[python][folium] geojson을 이용한 지도그리기 (1)

원하는 형태의 시군을 이용하여 229개의 시군 지도를 만들어 보려고한다. python을 이용해서 folium 작업을 하기 이전에 geojson 파일을 다운받는 방법부터 설명하려고 한다. www.gisdeveloper.co.kr/?p=2332 대

mjs1995.tistory.com

앞에서 만든 geojson 파일을 가지고 Python Plotly을 이용한 지도 시각화를 하려고 합니다.

 

데이터는 Kosis에 있는 2018년도 시군구별 인구수 데이터를 이용하려고 합니다.

http://kosis.kr/statHtml/statHtml.do?orgId=101&tblId=DT_1B040A3&vw_cd=MT_ZTITLE&list_id=A_7&seqNo=&lang_mode=ko&language=kor&obj_var_id=&itm_id=&conn_path=MT_ZTITLE

 

KOSIS

 

kosis.kr

여기서 소멸 위험지수란 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는 사용자 정의 구성 및 스타일을 포함하여 사용 가능한 다양한 시각화 구현을 가능하게 합니다.

지도 시각화를 하는데 있어서 다양한 방법들이 있는데 데이터에 알맞은 시각화 방법으로 데이터 분석 시 좋은 인사이트를 창출할것같습니다.

profile

융무의 기술블로그

@융무

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!