ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

e-StatのAPIを使って政府統計情報を取得する方法 (その3)

コロナが人の移動に影響しているかみれたら面白いと思って、e-Statの住民基本台帳人口移動報告を使って今年(2020年)の国内外の人口の移動をグラフにしてみました。

Pythonスクリプト

APIで情報取得

STAT_NAME取得
import os
import io
import requests
import pandas as pd
%matplotlib inline
pd.plotting.register_matplotlib_converters()
app_id =  "{{APP_IDは個人ごとに取得}}"
def get_stats_name_list():
    url = "http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsList"
    params = {"appId": app_id, "statsNameList": "Y"}
    response = requests.get(url, params=params)
    csv_text = response.text[response.text.find('"TABLE_INF",') :]
    df = pd.read_csv(io.StringIO(csv_text), dtype="object")
    return df
df_stats_name = get_stats_name_list().pipe(
    lambda df: df[df.STAT_NAME.str.contains("人口移動")]
)

df_stats_name

TABLE_INF	STAT_CODE	STAT_NAME	GOV_ORG_CODE	GOV_ORG_NAME
30	00200523	00200523	住民基本台帳人口移動報告	00200	総務省

f:id:a1026302:20201208180632p:plain

TABLE_INF取得
stats_code = df_stats_name.TABLE_INF
def get_stats_list(stats_code):
    url = "http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsList"
    params = {"appId": app_id, "statsCode": stats_code}
    response = requests.get(url, params=params)
    csv_text = response.text[response.text.find('"TABLE_INF",') :]
    df = pd.read_csv(io.StringIO(csv_text), dtype="object")
    return df

表作成

CLASS一覧
df_stats_list = get_stats_list(stats_code).pipe(
    lambda df: df[
        (df.CYCLE == "月次")
        & (df.TITLE.str.contains("全国"))
        & (df.TITLE.str.contains("2020年1月"))
        & (df.TITLE.str.contains("転入者数"))
    ]
)
stats_data_id = df_stats_list.iloc[0].TABLE_INF
def get_meta_info(stats_data_id):
    url = "http://api.e-stat.go.jp/rest/3.0/app/getSimpleMetaInfo"
    params = {"appId": app_id, "statsDataId": stats_data_id}
    response = requests.get(url, params=params)
    csv_text = response.text[response.text.find('"CLASS_OBJ_ID",') :]
    df = pd.read_csv(io.StringIO(csv_text), dtype="object")
    return df
df_meta_info = get_meta_info(stats_data_id).dropna(axis=1).drop_duplicates('CLASS_OBJ_ID')

f:id:a1026302:20201208181015p:plain

def get_stats_data(stats_data_id, cat01, cat02, area):
    url = "http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsData"
    params = {
        "appId": app_id,
        "statsDataId": stats_data_id,
        "cdArea": area,
        "cdCat01": cat01,
        "cdCat02": cat02,
    }
    response = requests.get(url, params=params)
    csv_text = response.text[response.text.find('"tab_code",') :]
    df = pd.read_csv(io.StringIO(csv_text), dtype="object")
    return df
2020年の全国の移動者についての一覧
df_stas_data = get_stats_data(
    stats_data_id,
    **df_meta_info.groupby("CLASS_OBJ_ID")
    .first()
    .CLASS_CODE[["area", "cat01", "cat02"]]
    .to_dict()
)

df_stas_data

tab_code	表章項目	cat01_code	性別	cat02_code	国籍	area_code	全国・都道府県・大都市	time_code	時間軸(月次)	unit	value	annotation
0	15	国外からの転入者数	0	総数	60000	移動者	00000	全国	2020001010	2020年10月	NaN	20611	NaN
1	15	国外からの転入者数	0	総数	60000	移動者	00000	全国	2020000909	2020年9月	NaN	13347	NaN
2	15	国外からの転入者数	0	総数	60000	移動者	00000	全国	2020000808	2020年8月	NaN	14229	NaN
3	15	国外からの転入者数	0	総数	60000	移動者	00000	全国	2020000707	2020年7月	NaN	14028	NaN
4	15	国外からの転入者数	0	総数	60000	移動者	00000	全国	2020000606	2020年6月	NaN	11516	NaN
5	15	国外からの転入者数	0	総数	60000	移動者	00000	全国	2020000505	2020年5月	NaN	9021	NaN
6	15	国外からの転入者数	0	総数	60000	移動者	00000	全国	2020000404	2020年4月	NaN	42266	NaN
7	15	国外からの転入者数	0	総数	60000	移動者	00000	全国	2020000303	2020年3月	NaN	53419	NaN
8	15	国外からの転入者数	0	総数	60000	移動者	00000	全国	2020000202	2020年2月	NaN	38842	NaN
9	15	国外からの転入者数	0	総数	60000	移動者	00000	全国	2020000101	2020年1月	NaN	47273	NaN
10	16	国外への転出者数	0	総数	60000	移動者	00000	全国	2020001010	2020年10月	NaN	18758	NaN
11	16	国外への転出者数	0	総数	60000	移動者	00000	全国	2020000909	2020年9月	NaN	20472	NaN
12	16	国外への転出者数	0	総数	60000	移動者	00000	全国	2020000808	2020年8月	NaN	21720	NaN
13	16	国外への転出者数	0	総数	60000	移動者	00000	全国	2020000707	2020年7月	NaN	15566	NaN
14	16	国外への転出者数	0	総数	60000	移動者	00000	全国	2020000606	2020年6月	NaN	9818	NaN
15	16	国外への転出者数	0	総数	60000	移動者	00000	全国	2020000505	2020年5月	NaN	5727	NaN
16	16	国外への転出者数	0	総数	60000	移動者	00000	全国	2020000404	2020年4月	NaN	10211	NaN
17	16	国外への転出者数	0	総数	60000	移動者	00000	全国	2020000303	2020年3月	NaN	33492	NaN
18	16	国外への転出者数	0	総数	60000	移動者	00000	全国	2020000202	2020年2月	NaN	24043	NaN
19	16	国外への転出者数	0	総数	60000	移動者	00000	全国	2020000101	2020年1月	NaN	28161	NaN

チャート作成

cufflinksをcufflinksを使ってチャートを描画
import cufflinks as cf
cf.go_offline()
df_stas_data['value'] = pd.to_numeric(df_stas_data['value'])
df_stas_data.sort_values('time_code').iplot(
        x='時間軸(月次)',
        y='value', 
        title='国内外の移動者数',
        categories='表章項目'
    )
人の移動(チャート)

今年の4,5月から人の移動が少なくなっていることがみてとれました。。。
f:id:a1026302:20201208181342p:plain