#G空間情報センターの人流オープンデータ
G空間情報センターは、一般社団法人 社会基盤情報流通推進協議会が2016年から運営を開始しています。曰く、「産官学の様々な機関が保有する地理空間情報を円滑に流通し、社会的な価値を生み出すことを支援する機関」とのこと。ここから人流オープンデータがあったので、pythonで読み込み、滞在人口をfoliumのHeatMapで表示させるまでをやってみました。既に人流オープンデータで表示できるので、ほとんど意味はないんだけど。
#人流オープンデータ仕様
-提供エリア:全国
-集計期間 :2019年1月~2020年12月の各月
-集計単位 :(平休日)全日/平日/休日
(時間帯)終日/昼 /夜
(居住地)同市区町村/同都道府県/同地方/それ以外 ※市町村単位発地別データのみ。
-データ形式:CSV形式
#使ったデータ
-1kmメッシュ別の滞在人口データ(monthly_mdp_mesh1km)
1kmメッシュ別に、いつ、何人が滞在したのかを収録したデータ
-[補足データ]1kmメッシュ属性(attribute)
1kmメッシュデータにおけるメッシュIDの座標を示すデータ
#データの読み込み
データは基本的にCSV形式ですが、ダウンロードファイルはZIP形式で圧縮されているので解凍するか、zipfileで読み込みます。特に1kmメッシュ別の滞在人口データ(monthly_mdp_mesh1km)は、月毎に圧縮されているのでいちいち全部解凍するのは面倒だと思います。
##attributeデータの読み込み
1kmメッシュ属性データを読み込みます。
import pandas as pd
from zipfile import ZipFile
# read attribute
attribute_zipfile = './data/attribute.zip'
zf_attribute = ZipFile(attribute_zipfile)
attribute_files = zf_attribute.infolist()
attribute_files
# [<ZipInfo filename='attribute/attribute_mesh1km_2019.csv.zip' external_attr=0x20 file_size=3965732>,
# <ZipInfo filename='attribute/attribute_mesh1km_2020.csv.zip' external_attr=0x20 file_size=3965724>]
2019年と2020年の1kmメッシュの緯度・経度データが含まれます。中身はこんな感じ(2019年分)。
# 2019 attribute
df_attribute[0]
||mesh1kmid|lon_center|lat_center|lon_max|lat_max|lon_min|lat_min|prefcode|citycode|
|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|
|0|30365006|136.081253|20.420834|136.087494|20.424999|136.074997|20.416666|13|13421|
|1|30365015|136.068756|20.429167|136.074997|20.433332|136.062500|20.424999|13|13421|
|…
1kmのメッシュの4方と中央の緯度・経度座標があります。prefcodeは都道府県のコードで13は東京都です。citycodeは市区町町村のコードで、別のファイル(prefcodecitycodemaster)で対応づけられています。今回は使いません。
##monthly_mdp_mesh1kmデータの読み込み
これは、都道府県ごとに提供されているので、今回は東京のみを対象としてみました。東京のprefcodeは13なので、monthlymdpmesh1km13.zipだけを読み込みます。中にディレクトリ構造(年ディレクトリの下に月ディレクトリ)があるため、次のようにしてみました。
# 東京1㎞メッシュデータ
mesh13_data = './data/monthlymdpmesh1km13.zip'
zf = ZipFile(mesh13_data)
csv_files = zf.infolist()
df_mesh1km_tokyo=[]
for csv_file in csv_files:
if csv_file.filename.endswith('.zip') :
csv_file_name=csv_file.filename
d=zf.open(csv_file_name)
df = pd.read_csv(d,compression='zip')
df_mesh1km_tokyo.append(df)
例えば、2019年4月のデータはこんな感じ。
df_mesh1km_tokyo[3]
||mesh1kmid|prefcode|citycode|year|month|dayflag|timezone|population|
|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|
|0|53394519|13|13101|2019|4|0|0|14417|
|1|53394519|13|13101|2019|4|0|1|6053|
|2|53394519|13|13101|2019|4|0|2|9667|
|3|53394519|13|13101|2019|4|1|0|70932|
|4|53394519|13|13101|2019|4|1|1|9786|
|…
dayflagは、0:休日、1:平日、2:全日、timezoneは、0:昼、1:深夜、2:終日。populationが各メッシュでの対応する年・月・デイ・タイムゾーンでの平均滞在人数です。
#データを結合して、foliumでHeatMap表示
##attributeデータとmonthly_mdp_mesh1kmデータの結合
緯度、経度と平均滞在人数をmesh1kmidをキーにして結びつけます。後はデイフラグとタイムゾーンを適当に指定して描画へ。
#attributeとmonthly_mdp_mesh1kmデータを結合
df_tokyo_201904 = pd.merge(df_attribute[0],df_mesh1km_tokyo[3],on='mesh1kmid',how='inner')
#必要なカラム(中心緯度、中心経度、デイフラグ、タイムゾーン、平均滞在人数)を抽出
df_tokyo_201904_dt=df_tokyo_201904[['mesh1kmid','lon_center','lat_center','dayflag','timezone','population']]
#dayflagを1(平日)、timezoneを0(昼)に指定
df_tokyo_201904_plot=df_tokyo_201904_dt[(df_tokyo_201904_dt['dayflag']==1) & (df_tokyo_201904_dt['timezone']==0)]
##foliumでHeatMap表示
import folium
import matplotlib.pyplot as plt
from folium.plugins import HeatMap
#空白地図の作成
center = [35.67083, 139.74375]
m = folium.Map(center, zoom_start = 12)
#メッシュの緯度、経度、population列を抽出し、重みのリストを作成
weight_list = df_tokyo_201904_plot[['lat_center','lon_center','population']].values
# print(weight_list)
# ヒートマップの表示
HeatMap(weight_list, radius=10, blur=8).add_to(m)
m
”平均”滞在人数だからでしょうか?あまり地域差がないように見えます。別の月、時間帯で比較するといいかもしれません。後はHeatMapのパラメータを変えるとか?
とりあえず、ここまでで。お疲れさでした。