GISデータを扱っていると地図上にマッピングして、どの地域がどんな感じになっているか視覚的にみたい事はよくあるかと思います。
そんなときに便利なのかコロプレス図(階級区分図)と呼ばれるものです。
名前こそ聞き馴染みはないかもしれませんが、テレビとかではよく見る図かと思います。
こちらはwikipediaより借りてきた画像ですが、以前のアメリカ大統領選のオバマ VS ロムニーの州ごとの獲得選挙人の分布になっています。
(https://ja.wikipedia.org/wiki/階級区分図)
これがコロプレス図、または階級区分図というものです。
こういう風に地図上に可視化するとわかりやすいケースはよくありますので、今回はそれを Pythonで作ってみようというのをやってみます。
今回使うライブラリは、"Plotly Express"というライブラリです。
さぁ、やってみましょう!
新型コロナウイルス感染者数の分布
今回はPythonで作るコロプレス図の例として、新型コロナウイルス(Covid19)の世界での感染者数についてやってみたいと思います。
データはこちらのサイトからダウンロードし、適当なディレクトリにおきます。
https://github.com/owid/covid-19-data/tree/master/public/data/
1 2 3 4 5 6 7 |
import pandas as pd import geopandas as gpd import folium import plotly.express as px import numpy as np df = pd.read_csv('data/owid-covid-data.csv') |
2021/11時点のデータですが12万行ほどありますね。
こちらに全世界の感染者数が国ごとに日ごとに入っているということです。
ではまずは試しに2021/10/1のデータを抽出して、コロプレス図を作ってみましょう!
1 2 3 4 5 6 7 |
# 2021/10/1の感染者数を可視化してみる df_test = df[df['date']=='2021-10-01'] avg_cases = df_test['new_cases'].median() px.choropleth(df_test, locations='iso_code', color='new_cases' ,range_color=[0,10000] ,color_continuous_midpoint=avg_cases).show() |
こちらのデータにはisoコードという国を表すコードが入っているので、この"iso_code"をpx.choloplethのlocationsに指定するだけで簡単にコロプレス図ができます。
ただ、これだどスケールがわかりづらいのでlogスケールに変更してみます。
1 2 3 4 5 |
df_test['log_cases'] = df_test['new_cases'].apply(np.log10) px.choropleth(df_test, locations='iso_code', color='log_cases' ,range_color=[0,6] ,color_continuous_midpoint=avg_cases ).show() |
結果がこちら。
さっきよりも感染者数の比較的少ない国々の情報がつぶれずに、ちゃんと色で表されていますね!
アニメーション機能付きのコロプレス図
Plotly Expressの良いところは簡単にアニメーションをコロプレス図にも付けられるところだと思います。
なので、そのアニメーション機能を使って、時系列的に動かして、感染者数が月ごとにどのように変化するかわかるようなコロプレス図を作ってみましょう!
※日ごとでもいいのですが、マシンスペック的に日ごとだと止まってしまうので、今回は月ごととします。
まずは日付をdate型に変換して、月ごとに集計していきます。
1 2 3 4 5 |
#dateをobjectからdate型に変換 df['date'] = pd.to_datetime(df['date']).dt.strftime("%Y-%m") #年月日を年月までに変換 #月単位に集計 df_month_mean = df.groupby(['date', 'iso_code', 'location']).mean().reset_index() |
これで準備ができたのでアニメーション付きコロプレス図を作ります。
アニメーションは、animation_frameの引数に"date"を指定するだけです。
1 2 3 4 |
#月単位でアニメーション機能をつけたコロプレス図 px.choropleth(df_month_mean, locations='iso_code', color='new_cases' ,range_color=[0,10000] ,animation_frame='date').show() |
画像になっているので止まっていますが、再生ボタンを押せば自動で時系列変化を表すアニメーションが動きますし、自分でスライダーでdateを選ぶこともできます。
こんな感じでPlotly Expressを使って簡単にアニメーション付きのコロプレス図を作る事ができました!
ネットとかで見るような図が簡単に作れたりするので、よろしければやってみてください。