python foliumで時系列ヒートマップ(time series heatmap)描く
目次:
はじめに
foliumはpythonの地図描画ライブラリーとしてよく知られています。foliumを使用することよりヒートマップやコロプレス図など様々なグラフを地図上に描くことが可能です。以前はfoliumを使用したことがありますけれども、ほとんどは静的なグラフです。
今回は地図上に時系列ヒートマップで都道府県別の人口がどんなふうに変化するかをプロットしてみようと思います。
ちなみに、実行環境はPython3+JupyterNotebookです。
ライブラリー用意
今回はpandasとfoliumが必要です。
!pip install pandas !pip install folium
インストール完了したら、ライブラリを導入します:
import pandas as pd import folium from folium import plugins
データ準備
一方、データ準備としては、都道府県別の人口は国勢調査サイト(e-stat)から入手できます:
平成29年10月1日現在人口推計 都道府県,男女別人口-総人口
population_df = pd.read_csv("population.csv",encoding="shift-JIS") population_df.head()
そして、都道府県別のGeocodeいわゆる緯度と経度の情報も必要なので、以下のGithubからダウンロードします:
geo_df = pd.read_csv("prefecturalCapital.csv", encoding="utf-8") geo_df.head()
フォーマットを揃え
紐付けのために、データのフォーマットを揃えないといけない。
population_df["id"] = population_df.index+1 prefecture_df = pd.merge(population_df,geo_df,on=["id"]) prefecture_df = prefecture_df.drop(["nam_ja","id"],axis=1) prefecture_df.head()
そして、タイムインデックスを作ります。
time_series = ["17","22","27","28","29"]
それぞれに対して割合を計算します。
for year in time_series: prefecture_df["平成"+year+"年"] = prefecture_df["平成"+year+"年"]/max(prefecture_df["平成"+year+"年"]) prefecture_df.head()
foliumで時系列ヒートマップをプロット
プロット用の3Dデータリストを作成します。
heat_data = [[[row['lat'],row['lon'], row["平成"+year+"年"]] for index, row in prefecture_df.iterrows()] for year in time_series]
そのデータリストを地図の上に追加:
japan_map = folium.Map(location=[35, 135], zoom_start=6) hm = plugins.HeatMapWithTime(heat_data,index=["平成"+year+"年" for year in time_series],auto_play=False,radius=40,max_opacity=1,gradient={0.1: 'blue', 0.25: 'lime', 0.5:'yellow',0.75: 'red'}) hm.add_to(japan_map) japan_map
可視化の結果:
よく見ると二つの結論が得られます:
- 日本の人口は関西と関東に集中しています。
- 東京は一極集中しつつ、地方の人口が減少しています。