G空間統計の人流データを可視化していく01(データ仕様確認)

G空間統計の人流データのデータ仕様を確認します.

# ファイル構成

project_dir
├── ./data/jinryu
│   ├── /attribute <- 1kmメッシュ定義書
│   ├── /prefcode_citycode_master <- 市町村コード定義書
│   ├── /regioncode_master <- 都道府県コード定義書
│   ├── /SDDSWS5740 <- 1kmメッシュの境界データ
│   ├── /monthly_mdp_mesh1km_04 <- 滞在人口データ
│   ├── /monthly_fromto_city_04 <- 簡易ODデータ
│   ├── merge_monthly_mdp_mesh1km_04.csv <- 統合滞在人口データ
│   └── merge_monthly_fromto_city_04.csv <- 統合簡易ODデータ
└── jinryu.ipynb <- 実行用ノートブック

# 市町村コード

# データ数の確認

下記のコードで2019年と2020年で市町村コードそれぞれ用意されているので、差分をとります。

データ数は一致していました。

import pandas as pd

# 2019年を読み込み
citycode_path = './data/jinryu/prefcode_citycode_master/prefcode_citycode_master_utf8_2019.csv'
df_citycode1 = pd.read_csv(citycode_path)

# 2020年を読み込み
citycode_path = './data/jinryu/prefcode_citycode_master/prefcode_citycode_master_utf8_2020.csv'
df_citycode2 = pd.read_csv(citycode_path)

len(df_citycode1), len(df_citycode2)
# (1896, 1896)

# データ内容の確認

そして、下記のコードで内容に差分がないか、確認します。

# df_citycode1の差分箇所を表示
print("="*20, '2019年', "="*20)
diff_df1 = df_citycode1[(df_citycode1 == df_citycode2).all(axis=1) == False]
display(diff_df1)

# df_citycode2の差分箇所を表示
print("="*20, '2020年', "="*20)
diff_df2 = df_citycode2[(df_citycode2 == df_citycode1).all(axis=1) == False]
display(diff_df2)

==================== 2019年 ====================

prefcode prefname citycode cityname address
13 東京都 13101 東京23区千代田区 東京都千代田区
13 東京都 13102 東京23区中央区 東京都中央区
13 東京都 13103 東京23区港区 東京都港区
13 東京都 13104 東京23区新宿区 東京都新宿区
・・・ ・・・ ・・・ ・・・ ・・・
28 兵庫県 28221 篠山市 兵庫県篠山市
40 福岡県 40305 筑紫郡那珂川町 福岡県筑紫郡那珂川町

==================== 2020年 ====================

prefcode prefname citycode cityname address
13 東京都 13101 千代田区 東京都千代田区
13 東京都 13102 中央区 東京都中央区
13 東京都 13103 港区 東京都港区
13 東京都 13104 新宿区 東京都新宿区
・・・ ・・・ ・・・ ・・・ ・・・
28 兵庫県 28221 丹波篠山市 兵庫県丹波篠山市
40 福岡県 40231 那珂川市 福岡県那珂川市

なぜか、東京23区のcitynameが変更されたこと以外では、「町→市」に名前が変わっている箇所が2つありました。

# df_citycode1の差分箇所を表示
diff_address1 = df_citycode1[(df_citycode1['address'] == df_citycode2['address']) == False]
display(diff_address1)

# df_citycode2の差分箇所を表示
diff_address2 = df_citycode2[(df_citycode2['address'] == df_citycode1['address']) == False]
display(diff_address2)

==================== 2019年 ====================

prefcode prefname citycode cityname address
28 兵庫県 28221 篠山市 兵庫県篠山市
40 福岡県 40305 筑紫郡那珂川町 福岡県筑紫郡那珂川町

==================== 2020年 ====================

prefcode prefname citycode cityname address
28 兵庫県 28221 丹波篠山市 兵庫県丹波篠山市
40 福岡県 40231 那珂川市 福岡県那珂川市

citycodeの重複も確認しましたが、問題ありません。

# citycodeの重複確認
display(df_citycode1[df_citycode1['citycode']=='40231'])

display(df_citycode2[df_citycode2['citycode']=='40305'])

# 市町村コードのルール

下記のコードの確認で、市町村コードは国勢調査と一致するようです。

import folium

# 2019年を読み込み
mesh_path = './data/jinryu/attribute/attribute_mesh1km_2019.csv'
df_mesh = pd.read_csv(mesh_path)

# 国勢調査の市民コード:34101,広島市中区
df_34101 = df_mesh[df_mesh['citycode']==34101].reset_index(drop=True)
lon_center = df_34101['lon_center'][4]
lat_center = df_34101['lat_center'][4]

# 地図オブジェクト作成
map = folium.Map(location=[lat_center, lon_center], zoom_start=18)
# 地図表示
map

# メッシュコード

市町村コードや座標も付属されているので、他分析でも使えそうです。

# データ数

下記のコードで2019年と2020年のデータ数を確認します。

# 2019年を読み込み
mesh_path = './data/jinryu/attribute/attribute_mesh1km_2019.csv'
df_mesh1 = pd.read_csv(mesh_path)

# 2020年を読み込み
mesh_path = './data/jinryu/attribute/attribute_mesh1km_2020.csv'
df_mesh2 = pd.read_csv(mesh_path)

len(df_mesh1), len(df_mesh2)
# (387500, 387500) 
# 一致!!!!!!!

# 市町村コード

メッシュデータ内での市町村コードを確認します。

# df_mesh_citycode1の差分箇所を表示
diff_mesh_citycode1 = df_mesh1[(df_mesh1['citycode'] == df_mesh2['citycode']) == False]
# display(diff_mesh_citycode1)

# df_mesh_citycode2の差分箇所を表示
diff_mesh_citycode2 = df_mesh2[(df_mesh2['citycode'] == df_mesh1['citycode']) == False]
# display(diff_mesh_citycode2)

print(set(diff_mesh_citycode1['citycode'].tolist()))
print(set(diff_mesh_citycode2['citycode'].tolist()))

# {40305, 15307}
# {15206, 40231}

2019年と2020年で市町村コードが異なる箇所があります。

(那珂川町→那珂川市、40305→40231) (北蒲原郡聖籠町→新発田市、15307→15206)

(那珂川町→那珂川市、40305→40231)は市町村コードでも確認したが、(北蒲原郡聖籠町→新発田市、15307→15206)については把握できていない。

下記のコードで(北蒲原郡聖籠町→新発田市、15307→15206)について確認します。

# 2019年を読み込み
citycode_path = './data/jinryu/prefcode_citycode_master/prefcode_citycode_master_utf8_2019.csv'
df_citycode1 = pd.read_csv(citycode_path)
display(df_citycode1[(df_citycode1['citycode']==15307)|(df_citycode1['citycode']==15206)])
# 15	新潟県	15307	北蒲原郡聖籠町	新潟県北蒲原郡聖籠町
# 15	新潟県	15206	新発田市	新潟県新発田市

# 2020年を読み込み
citycode_path = './data/jinryu/prefcode_citycode_master/prefcode_citycode_master_utf8_2020.csv'
df_citycode2 = pd.read_csv(citycode_path)
display(df_citycode2[(df_citycode2['citycode']==15307)|(df_citycode2['citycode']==15206)])
# 15	新潟県	15307	北蒲原郡聖籠町	新潟県北蒲原郡聖籠町
# 15	新潟県	15206	新発田市	新潟県新発田市

# メッシュデータの確認

上記より、2020年で北蒲原郡聖籠町→新発田市に変更されていないことが確認できます。

では、(北蒲原郡聖籠町→新発田市、15307→15206)で差分が出たデータを下記のコードで確認します。

下記より、メッシュコード:56397264で差分が出ていることがわかります。

# df_mesh_citycode1の差分箇所を表示
diff_mesh_citycode1 = df_mesh1[(df_mesh1['citycode'] == df_mesh2['citycode']) == False]
diff_mesh_citycode1 = diff_mesh_citycode1[diff_mesh_citycode1['citycode'] == 15307]
display(diff_mesh_citycode1)
# mesh1kmid	lon_center	lat_center	lon_max	lat_max	lon_min	lat_min	prefcode	citycode
# 56397264	139.306244	37.970833	139.3125	37.974998	139.300003	37.966667	15	15307

# df_mesh_citycode2の差分箇所を表示
diff_mesh_citycode2 = df_mesh2[(df_mesh2['citycode'] == df_mesh1['citycode']) == False]
diff_mesh_citycode2 = diff_mesh_citycode2[diff_mesh_citycode2['citycode'] == 15206]
display(diff_mesh_citycode2)
# mesh1kmid	lon_center	lat_center	lon_max	lat_max	lon_min	lat_min	prefcode	citycode
# 56397264	139.306244	37.970833	139.3125	37.974998	139.300003	37.966667	15	15206

よくわからないので、下記のコードで地図を出力して確認します。

import folium

# 56397264,新潟県
df1 = diff_mesh_citycode1[diff_mesh_citycode1['mesh1kmid']==56397264].reset_index(drop=True)
lon_center = df1['lon_center'][0]
lat_center = df1['lat_center'][0]

# 地図オブジェクト作成
map = folium.Map(location=[lat_center, lon_center], zoom_start=18)
# 地図表示
map

# データの統合

# monthly_mdp_mesh1km_04

宮城県の1meshの滞在データを市町村別なのを統合する。

monthly_mdp_mesh1km_**:1kmメッシュ別に、いつ、何人が滞在したのかを収録したデータ

import os
import glob
import zipfile
import pandas as pd

paths = glob.glob("./data/jinryu/monthly_mdp_mesh1km_04/*/*/*zip")

flag = 0
for path in paths:
    # zipの読み込み
    df = pd.read_csv(path, compression='zip')
    # 出力
    if not flag:
        df_out = df
        flag = 1
        continue
    # 統合
    df_out = pd.concat([df_out, df])

# 出力
# os.makedirs('../kure_city_data/Visit_opendata/process_data/', exist_ok=True)
df_out.to_csv('./data/jinryu/merge_monthly_mdp_mesh1km_04.csv', index=False)

# monthly_fromto_city_04

宮城県の簡易的なODデータを市町村別なのを統合する。

monthly_fromto_city_*:市区町村別に、いつ、どこ(同市区町村/同都道府県/同地方/それ以外)から何人来たのかを収録したデータ

import os
import glob
import zipfile
import pandas as pd

paths = glob.glob("./data/jinryu/monthly_fromto_city_04/*/*/*zip")

flag = 0
for path in paths:
    # zipの読み込み
    df = pd.read_csv(path, compression='zip')
    # 出力
    if not flag:
        df_out = df
        flag = 1
        continue
    # 統合
    df_out = pd.concat([df_out, df])

# 出力
# os.makedirs('../kure_city_data/Visit_opendata/process_data/', exist_ok=True)
df_out.to_csv('./data/jinryu/merge_monthly_fromto_city_04.csv', index=False)

# まとめ

G空間統計の人流データのデータ仕様を確認しました.

# 参考サイト

全国の人流オープンデータ(1kmメッシュ、市町村単位発地別) (opens new window)

monthly_mdp_mesh1km_04(宮城県)_1kmメッシュ別に、いつ、何人が滞在したのかを収録したデータ (opens new window)

monthly_fromto_city_04(宮城県)_市区町村別に、いつ、どこ(同市区町村/同都道府県/同地方/それ以外)から何人来たのかを収録したデータ

prefcode_citycode_master(都道府県コード、市区町村コードのマスタファイル) (opens new window)

regioncode_master(地方区分コードのマスタファイル) (opens new window)

attribute(1kmメッシュの座標データ) (opens new window)

G空間統計の人流データを可視化していく02(滞在人口データ)

G空間統計の人流データを可視化していく02(滞在人口データ)

G空間統計の人流データで仙台市青葉区の滞在人口データについて加工します。

HTML/CSSでFlaskに使うフロントエンドのデザインを作成する03

HTML/CSSでFlaskに使うフロントエンドのデザインを作成する03

簡単なボタンの作成を実施します.