ものづくりのブログ

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

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

e-Statは各府省が公表する統計データをまとめた政府統計のポータルサイトです。
今回もe-Statの政府統計情報を使ってチャートにする練習をしてみました。

関連

これまでやったこと

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

a1026302.hatenablog.com

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

a1026302.hatenablog.com

プログラム

pythonスクリプトを使って宮城県の人の移動をチャートにしてみます。

import json,  requests
 
#E-stat のAPIの使い方参照
appid = '{{app_id}}'
statsdataid = '0003097041'
paramid = '&metaGetFlg=Y&cntGetFlg=N&explanationGetFlg=Y&annotationGetFlg=Y&sectionHeaderFlg=1'
url_estat = 'http://api.e-stat.go.jp/rest/3.0/app/json/getStatsData?appId={}&statsDataId={}{}'.format(appid, statsdataid, paramid)
 
res = requests.get(url_estat)
json_res = json.loads(res.text)

tabは内訳らしい

code name
01 都道府県(自都市)内移動者数
02 他都道府県(他市町村)からの転入者数
03 他都道府県(他市町村)への転出者数
04 転入超過数
{'@id': 'tab',
      '@name': '表章項目',
      'CLASS': [{'@code': '01',
        '@name': '都道府県(自都市)内移動者数',
        '@level': '',
        '@unit': '人'},
       {'@code': '02',
        '@name': '他都道府県(他市町村)からの転入者数',
        '@level': '',
        '@unit': '人'},
       {'@code': '03',
        '@name': '他都道府県(他市町村)への転出者数',
        '@level': '',
        '@unit': '人'},
       {'@code': '04', 
        '@name': '転入超過数', 
        '@level': '', 
        '@unit': '人'},


cat01は性別らしい

code name
1
2
     {'@id': 'cat01',
      '@name': '性別',
      'CLASS': [{'@code': '0', '@name': '総数', '@level': '1'},
       {'@code': '1', '@name': '男', '@level': '1'},
       {'@code': '2', '@name': '女', '@level': '1'}]},

cat02は国籍らしい

code name
60000 移住者
61000 日本人移住者
62000 外国人移住者
     {'@id': 'cat02',
      '@name': '国籍',
      '@description': '・2013年(平成25年)7月結果の移動者(外国人含む)には,7月1日から7日までの外国人移動者は含んでいない。・移動者(外国人含む)について,2013年6月結果以前は該当数値がない。',
      'CLASS': [{'@code': '60000', '@name': '移動者', '@level': '1'},
       {'@code': '61000', '@name': '日本人移動者', '@level': '1'},
       {'@code': '62000', '@name': '外国人移動者', '@level': '1'}]},

都道府県ごとに。。。

json_stat = json_res['GET_STATS_DATA']['STATISTICAL_DATA']['DATA_INF']['VALUE']
 
area = []
increace = []
time = []
tab=[]
cat01 = []
cat02 = []
 
for stat in json_stat:
    area.append(stat['@area'])
    increace.append(stat['$'])
    time.append(stat['@time'])
    tab.append(stat['@tab'])
    cat01.append(stat['@cat01'])
    cat02.append(stat['@cat02'])
 
from pandas import DataFrame
import pandas as pd
 
df = pd.DataFrame(
    {
        "area" : area, 
        "increace" : increace, 
        "time" : time, 
        "tab" : tab,
        "cat01" : cat01,  
        "cat02": cat02
    }
)
 
#面倒なのでJupyter Notebookで出力してコピった
todohuken = [{'@code': '00000', '@name': '全国', '@level': '1'},
       {'@code': '01000', '@name': '北海道', '@level': '1'},
       {'@code': '02000', '@name': '青森県', '@level': '1'},
       {'@code': '03000', '@name': '岩手県', '@level': '1'},
       {'@code': '04000', '@name': '宮城県', '@level': '1'},
       {'@code': '05000', '@name': '秋田県', '@level': '1'},
       {'@code': '06000', '@name': '山形県', '@level': '1'},
       {'@code': '07000', '@name': '福島県', '@level': '1'},
       {'@code': '08000', '@name': '茨城県', '@level': '1'},
       {'@code': '09000', '@name': '栃木県', '@level': '1'},
       {'@code': '10000', '@name': '群馬県', '@level': '1'},
       {'@code': '11000', '@name': '埼玉県', '@level': '1'},
       {'@code': '12000', '@name': '千葉県', '@level': '1'},
       {'@code': '13000', '@name': '東京都', '@level': '1'},
       {'@code': '14000', '@name': '神奈川県', '@level': '1'},
       {'@code': '15000', '@name': '新潟県', '@level': '1'},
       {'@code': '16000', '@name': '富山県', '@level': '1'},
       {'@code': '17000', '@name': '石川県', '@level': '1'},
       {'@code': '18000', '@name': '福井県', '@level': '1'},
       {'@code': '19000', '@name': '山梨県', '@level': '1'},
       {'@code': '20000', '@name': '長野県', '@level': '1'},
       {'@code': '21000', '@name': '岐阜県', '@level': '1'},
       {'@code': '22000', '@name': '静岡県', '@level': '1'},
       {'@code': '23000', '@name': '愛知県', '@level': '1'},
       {'@code': '24000', '@name': '三重県', '@level': '1'},
       {'@code': '25000', '@name': '滋賀県', '@level': '1'},
       {'@code': '26000', '@name': '京都府', '@level': '1'},
       {'@code': '27000', '@name': '大阪府', '@level': '1'},
       {'@code': '28000', '@name': '兵庫県', '@level': '1'},
       {'@code': '29000', '@name': '奈良県', '@level': '1'},
       {'@code': '30000', '@name': '和歌山県', '@level': '1'},
       {'@code': '31000', '@name': '鳥取県', '@level': '1'},
       {'@code': '32000', '@name': '島根県', '@level': '1'},
       {'@code': '33000', '@name': '岡山県', '@level': '1'},
       {'@code': '34000', '@name': '広島県', '@level': '1'},
       {'@code': '35000', '@name': '山口県', '@level': '1'},
       {'@code': '36000', '@name': '徳島県', '@level': '1'},
       {'@code': '37000', '@name': '香川県', '@level': '1'},
       {'@code': '38000', '@name': '愛媛県', '@level': '1'},
       {'@code': '39000', '@name': '高知県', '@level': '1'},
       {'@code': '40000', '@name': '福岡県', '@level': '1'},
       {'@code': '41000', '@name': '佐賀県', '@level': '1'},
       {'@code': '42000', '@name': '長崎県', '@level': '1'},
       {'@code': '43000', '@name': '熊本県', '@level': '1'},
       {'@code': '44000', '@name': '大分県', '@level': '1'},
       {'@code': '45000', '@name': '宮崎県', '@level': '1'},
       {'@code': '46000', '@name': '鹿児島県', '@level': '1'},
       {'@code': '47000', '@name': '沖縄県', '@level': '1'},
       {'@code': '48000', '@name': '東京圏', '@level': '1'},
       {'@code': '49000', '@name': '名古屋圏', '@level': '1'},
       {'@code': '50000', '@name': '大阪圏', '@level': '1'},
       {'@code': '00416', '@name': '21大都市計', '@level': '1'},
       {'@code': '01100', '@name': '札幌市', '@level': '1'},
       {'@code': '04100', '@name': '仙台市', '@level': '1'},
       {'@code': '11100', '@name': 'さいたま市', '@level': '1'},
       {'@code': '12100', '@name': '千葉市', '@level': '1'},
       {'@code': '13100', '@name': '東京都特別区部', '@level': '1'},
       {'@code': '14100', '@name': '横浜市', '@level': '1'},
       {'@code': '14130', '@name': '川崎市', '@level': '1'},
       {'@code': '14150', '@name': '相模原市', '@level': '1'},
       {'@code': '15100', '@name': '新潟市', '@level': '1'},
       {'@code': '22100', '@name': '静岡市', '@level': '1'},
       {'@code': '22130', '@name': '浜松市', '@level': '1'},
       {'@code': '23100', '@name': '名古屋市', '@level': '1'},
       {'@code': '26100', '@name': '京都市', '@level': '1'},
       {'@code': '27100', '@name': '大阪市', '@level': '1'},
       {'@code': '27140', '@name': '堺市', '@level': '1'},
       {'@code': '28100', '@name': '神戸市', '@level': '1'},
       {'@code': '33100', '@name': '岡山市', '@level': '1'},
       {'@code': '34100', '@name': '広島市', '@level': '1'},
       {'@code': '40100', '@name': '北九州市', '@level': '1'},
       {'@code': '40130', '@name': '福岡市', '@level': '1'},
       {'@code': '43100', '@name': '熊本市', '@level': '1'}]
 
#都道府県のマッピング
convert_rules_dict = {}
 
for rule in todohuken:
    convert_rules_dict.update({rule['@code'] : rule['@name']})
    
df['area'] = df['area'].map(convert_rules_dict)
 
#市区町村等のいらないものを削除
df = df.dropna() 

データフレームの中確認

area	increace	time	tab	cat01	cat02
0	全国	208821	2020001010	01	0	60000
1	全国	200814	2020000909	01	0	60000
2	全国	202596	2020000808	01	0	60000
3	全国	210497	2020000707	01	0	60000
4	全国	194219	2020000606	01	0	60000
...	...	...	...	...	...	...
99995	相模原市	267	2020000303	03	0	62000
99996	相模原市	105	2020000202	03	0	62000
99997	相模原市	136	2020000101	03	0	62000
99998	新潟市	32	2020001010	03	0	62000
99999	新潟市	32	2020000909	03	0	62000

チャートができるかテスト(宮城県で絞り込み)

import cufflinks as cf
cf.go_offline()
df[df.area == '宮城県'].iplot(x='time', y='increace', kind='bar')

f:id:a1026302:20201208131428p:plain

以下のように絞り込み

df[
    df['tab'].isin(["01"]) & 
    df['cat01'].isin(["0"]) &
    df['cat02'].isin(["60000"]) &
    df['area'].isin(["宮城県"])
]
area	increace	time	tab	cat01	cat02
352	宮城県	4117	2020001010	01	0	60000
353	宮城県	4130	2020000909	01	0	60000
354	宮城県	3955	2020000808	01	0	60000
355	宮城県	4270	2020000707	01	0	60000
356	宮城県	3990	2020000606	01	0	60000
...	...	...	...	...	...	...
435	宮城県	4257	2013001111	01	0	60000
436	宮城県	4700	2013001010	01	0	60000
437	宮城県	4109	2013000909	01	0	60000
438	宮城県	4464	2013000808	01	0	60000
439	宮城県	5184	2013000707	01	0	60000
88 rows × 6 columns

なんかもうひといき。。。