본문 바로가기
데이터과학 기초/Python배우기

파이썬 인터렉티브 시각화 - Altair 중급 (지도 차트)

by eigenvector 2022. 7. 24.
반응형

지난시간에 이어 오늘은 Altair로 파이썬 인터렉티브 지도 시각화를 해 보겠습니다.

 

파이썬의 인터렉티브 지도 시각화 패키지는 1) Folium 2) Plotly 3) Altair 정도로 정리할 수 있습니다.

 

지도 시각화로만 봤을 때 Folium이 가장 편리하게 사용할 수 있지만 "지도"에만 한정되는 아쉬움이 있습니다.

 

반대로 Plotly나 Altair는 범용 인터렉티브 시각화 툴이기 때문에, "지도"를 포함한 다용도 시각화에 적합합니다.

 

지도 시각화만 필요하다면 Folium을, 지도를 포함한 대시보드를 구성한다면 Plotly나 Altair가 유리할 것입니다.


GeoPandas?

Altair로 지도 시각화를 수행하기 위해서는 "모양을 그려 줄" 데이터가 필요합니다.

 

간단히 말해 서울이나 부산은 대략 어떤 모양이고, 각 지점의 좌표가 어떻게 되는지 설명하는 자료입니다.

 

이를 위해 GeoJson이나 TopoJson, SHP와 같은 데이터를 사용합니다.

 

오늘은 지도 시각화가 주제가 아니기 때문에, 더 깊게 다루지는 않고 손쉽게 지리 데이터를 다루는 GeoPandas를 사용하여 Altair에 적용해 보도록 하겠습니다.

 

설치는 간단하게 다음과 같이 이뤄집니다.

 

conda install -c conda-forge geopandas

 

GeoPandas를 설치했다고 가정하고 샘플로 제공되는 세계 지도 데이터를 불러와 보겠습니다.

 

import altair as alt
import geopandas as gpd

world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
world

 

코드를 실행할 경우, 각 나라의 gdp, 국가명 등의 자료와 함께 geometry라는 컬럼이 확인됩니다.

 

방금 전에 말한 지도의 모양을 담고 있는 컬럼입니다.

 

Jupyter를 사용할 경우 다음과 같은 방식으로 간단히 확인 가능합니다.

 

world.geometry.tolist()[96]


Altair에 적용하기

Altair에 적용하는 방식은 간단합니다. 데이터셋을 그대로 넣는 과정은 동일하지만,

 

geometry 탭이 이미 할당되어 있기 때문에 따로 컬럼 지정을 하지 않고 마크를 지정하면 됩니다.

 

import altair as alt
import geopandas as gpd

world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))

map_chart = alt.Chart(world).mark_geoshape(
)

map_chart

간단히 시각화를 수행했습니다(!)

 

지역이 너무 많아 제대로 담기지 않은 느낌이기에 지역을 기준으로 필터링 하고 크기를 키워 보겠습니다.

 

import altair as alt
import geopandas as gpd

world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
map_ = world[world.continent=='South America'].reset_index(drop=True)

map_chart = alt.Chart(map_).mark_geoshape(
).properties( 
    width=700,
    height=500
)

map_chart


색상 입히기

이제 몇 가지 효과를 더해보도록 하겠습니다.

 

컬럼에 있던 다른 데이터 중, GDP 추정치를 기준으로 색상을 입혀 보겠습니다.

 

조금 전문적인 용어로 Choropleth Map이라고 부르는 방식입니다.

 

추가로 색을 "할당"해야 하기 때문에 encode가 사용됩니다.

 

컬럼중 GDP 추정치인 gdp_md_est 를 encode에서, color에 할당하겠습니다.

 

map_chart = alt.Chart(world).mark_geoshape(
).encode(color = 'gdp_md_est'
).properties( 
    width=500,
    height=300
)

map_chart

전체 크기 및 총량 격차가 커 시각화가 모호해졌기 때문에 몇 가지 보정을 해보겠습니다.

 

1. 남극 부분을 제외해서 가독성을 높이고 

2. 1인당 GDP로 환산하고 (정확하지는 않지만 GDP를 인구 항목으로 나눠서 사용합니다)

3. 인구수~GDP 사이 단위 차이가 존재하기 때문에 적절한 단위 내에서 보정해서 소수점 처리 하도록 하겠습니다.

 

world.loc[:,'gdp_per_ratio'] = round(world['gdp_md_est'] / world['pop_est']*1000000,2)
world = world[world.continent != "Antarctica"].reset_index(drop=True)

map_chart = alt.Chart(world).mark_geoshape(
).encode(color = 'gdp_per_ratio'
).properties( 
    width=500,
    height=300
)

map_chart


인터렉티브 효과 결합

마지막으로, 인터렉티브 효과를 넣어보도록 하겠습니다.

 

툴팁(Tooltip)을 통해 지도 위에 마우스를 올려놓으면 국가명과 GDP 수치가 나오도록 해보겠습니다.

 

사실, 우리는 툴팁을 처음 포스팅에서 배웠는데요.

 

간단히 tooltip 객체를 encode 과정에 넣어주면 깔끔하게 인터렉티브 효과가 추가됩니다.

 

world.loc[:,'gdp_per_ratio'] = round(world['gdp_md_est'] / world['pop_est']*1000000,2)
world = world[world.continent != "Antarctica"].reset_index(drop=True)

map_chart = alt.Chart(world).mark_geoshape(
).encode(color = 'gdp_per_ratio',
         tooltip=['name','gdp_per_ratio']
).properties( 
    width=1000,
    height=500
)

map_chart

 

인터렉티브 객체기 때문에, 직접 실행하여 확인해 보시길 바랍니다.


정리

- 파이썬에서 인터렉티브 지도 시각화는 folium, plotly, altair 등이 있다

- 지도 시각화 과정에서 GeoPandas는 지도 데이터 처리 과정을 쉽게 해 준다.

- Altair로 Choropleth Map를 만들고, 인터렉티브 툴팁을 활용할 수 있다.

반응형