e-Statは政府が提供している統計データですが、ものによってはAPIを提供しているため、Pythonで気軽に取得することが可能です。
www.e-stat.go.jp
例えば、国勢調査の男女別人口及び人口性比に関しては、以下のページからWebで確認することができます。
www.e-stat.go.jp
このページの左端にある表示項目選択を開くと、表示する項目を選択することができます。
選択後、ページ右にあるAPIボタンを押すことでXML/JSON/CSVのそれぞれの形式でファイルが取得できるAPIを取得することが可能。
今回は以下のような条件で取得
・表彰項目:人口、人口性比
・男女_時系列:男、女
・地域_時系列:都道府県全て(全国、人口集中地区、人口集中地区以外の地区は除外)
・時間軸(調査年):全て
Pythonのプログラムで取得する場合は、以降に記載するプログラムのように組めば行けます。
requestsモジュールを使うため、入れてない場合はpipで導入することをお勧めします。
python -m pip install requests
ちなみに、APIを利用する場合は、appIdを利用する必要があります。appIdはe-statでユーザ登録しないと入手できないため、あらかじめ登録作業が必要になります。
詳しくはこちら。
www.e-stat.go.jp
APIの仕様は以下に記載されています(現在は3.0)。
www.e-stat.go.jp
テストフォームを利用して、あらかじめAPIの確認も可能です。
https://www.e-stat.go.jp/api/sample/testform3-0/
というわけでプログラム。
import requests
import sys
# --CSVファイルパス
CSV_PATH = r"C:\Users\hoge\Desktop" + "\\"
url = "http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsData"
cdArea="01000,02000,03000,04000,05000,06000,07000,08000,09000,10000,11000,12000,13000,14000,15000,16000,17000,18000,19000,20000,21000,22000,23000,24000,25000,26000,27000,28000,29000,30000,31000,32000,33000,34000,35000,36000,37000,38000,39000,40000,41000,42000,43000,44000,45000,46000,47000"
cdCat01="110,120"
cdTab="020"
appId="testtesttesttesttesttesttesttesttesttesttesttesttesttesttest"
lang="J"
statsDataId="0003410379"
metaGetFlg="N"
cntGetFlg="N"
explanationGetFlg="N"
annotationGetFlg="N"
sectionHeaderFlg="2"
replaceSpChars="0"
# --HTTPリクエスト実行
def request() :
params = {
'cdArea':cdArea
, 'cdCat01':cdCat01
, 'cdTab':cdTab
, 'appId':appId
, 'lang':lang
, 'statsDataId':statsDataId
, 'metaGetFlg':metaGetFlg
, 'cntGetFlg':cntGetFlg
, 'explanationGetFlg':explanationGetFlg
, 'annotationGetFlg':annotationGetFlg
, 'sectionHeaderFlg':sectionHeaderFlg
, 'replaceSpChars':replaceSpChars
}
filename = 'kokusei.csv'
response = requests.get(url, params=params) #GETメソッドで情報を取得
response.encoding = response.apparent_encoding
res_list = []
res_list = response.text.split()
#print(response.text)
if "STATUS" in res_list[1]: # 2行目にSTATUS文字列が入っていた場合(返却がエラーの場合)
# print(f'{res_list[1]}:{res_list[2]}')
return
#print('API実行、データ取得完了')
f = open(CSV_PATH + filename, 'w', newline='', encoding='utf8')
f.write(response.text)
f.close()
# table_insert(filename, date)
return
try:
request()
except Exception as e:
# logger.error(f'エラー要因:{str(e)}')
sys.exit()
問題なくCSVに吐き出されると以下のような内容で取得できます。
"tab_code","表章項目","cat01_code","男女_時系列","area_code","地域_時系列","time_code","時間軸(調査年)","unit","value" "020","人口","110","男","01000","北海道","1920000000","1920年","人","1244322" "020","人口","110","男","01000","北海道","1925000000","1925年","人","1305473" "020","人口","110","男","01000","北海道","1930000000","1930年","人","1468540" "020","人口","110","男","01000","北海道","1935000000","1935年","人","1593845" <||