LoginSignup
1
2

More than 1 year has passed since last update.

G空間情報センター 人流オープンデータを使ってみた

Last updated at Posted at 2021-11-30

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

スクリーンショット 2021-11-30 18.14.15.png

”平均”滞在人数だからでしょうか?あまり地域差がないように見えます。別の月、時間帯で比較するといいかもしれません。後はHeatMapのパラメータを変えるとか?
とりあえず、ここまでで。お疲れさでした。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2