e-Stat : https://www.e-stat.go.jp/SG1/estat/eStatTopPortal.do
e-Stat API : http://www.e-stat.go.jp/api/
e-Statは日本政府が調査した統計データを閲覧・ダウンロードできるよう管理されたポータルサイトです。
このサイトからよく人口データなどをダウンロードして利用しており、以前からお世話になっているのですが、実はAPI機能も提供しているようで、前々から少し気になっておりましたので、この度、PythonからAPI経由でデータ取得をして、可視化するところまでをやってみました。
e-Stat API 利用登録
まずはAPI利用登録が必要ですが、こちらは簡単で、メールアドレスや所属などを入力するだけです。
ユーザー登録をし、ログインをしますと、アプリケーションIDを取得するページに行くことができます。
APIを自分が公開しているWebサイトから利用したい場合は、そのWebサイトのURLを入力します。
今回のように試験的に利用したいだけであれば http://localhost/ を入力しておけば良いようです。
これで「発行」を押すと、「appId」にアプリケーションIDが発行されます。
これをリクエストパラメータで渡すことで、データを取得することが出来るようです。
e-Stat API 使い方
API仕様と公式ページの「提供データ」によれば、統計表情報取得「getStatsList」で統計表情報取得ができ、パラメータの政府統計コードは、例えば「国勢調査」は「00200521」とのこと。
これをリクエストパラメータに設定してあげてアクセスすると、これまでに調査された国勢調査のデータ一覧が確認できます。
取得したい国勢調査のデータのデータIDを確認して、統計データ取得「getStatsData」でアクセスすると、項目などの情報とデータが取得できます。
今回は、項目の絞り込みなどのパラメータも確認して、「getSimpleStatsData」でCSVで取得することにしました。
CSVでデータを落としてきてしまえば、あとはPythonでデータ加工をするのと同じですので、適当にデータフレーム化しておきます。
folium
Pythonで地図を可視化する方法の紹介です。
過去記事で地図クライアントツールのLeaflet.jsを使ったことがありましたが、実はこれをPython上で動作させるモジュール「folium」というものがありますので、これを使います。
folium : https://github.com/python-visualization/folium
使い方がLeaflet.jsと似ていますので、分かりやすいです。
さらにgeojsonやtopojsonを読み込むことができますので、日本の都道府県データのgeojsonと、e-Stat APIからダウンロードして加工したデータフレームを紐付けて、このfoliumでLeaflet上に可視化します。
実装が下記になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
import numpy as np import pandas as pd import urllib.request import folium from IPython.display import display appid = "###################################" api_version = "2.1" base_url = "http://api.e-stat.go.jp/rest/{api_version}/app/".format(api_version=api_version) """ get_type = "getStatsList" stats_code = "00200521" # 国勢調査 url = base_url + "{get_type}?appId={appid}&statsCode={stats_code}".format( api_version=api_version, get_type=get_type, appid=appid, stats_code=stats_code, ) print(url) # 確認して取得したいデータのIDを調べる """ """ get_type="getStatsData" stats_data_id="0003148596" # 最新の調査ID url = base_url + "{get_type}?appId={appid}&statsDataId={stats_data_id}".format( api_version=api_version, get_type=get_type, appid=appid, stats_data_id=stats_data_id ) print(url) # 確認して取得したい項目パラメータを調べる """ # load data from e-stat api get_type="getSimpleStatsData" stats_data_id="0003148596" cd_cat_01="0000" # 国籍->全て cd_cat_02="0000" # 性別->男女 cd_cat_03="00710" # 集計地域->全域 lv_area="2" # 集計レベル->都道府県レベル section_header_flg="2" # セクションヘッダー->無し url = base_url + "{get_type}?appId={appid}&statsDataId={stats_data_id}&cdCat01={cd_cat_01}&cdCat02={cd_cat_02}&cdCat03={cd_cat_03}&lvArea={lv_area}§ionHeaderFlg={section_header_flg}".format( api_version=api_version, get_type=get_type, appid=appid, stats_data_id=stats_data_id, cd_cat_01=cd_cat_01, cd_cat_02=cd_cat_02, cd_cat_03=cd_cat_03, lv_area=lv_area, section_header_flg=section_header_flg, ) d = urllib.request.urlopen(url).read().decode("utf8") dlines = d.splitlines()[2:] jcodes = [] names = [] populations = [] for line in dlines: line2 = line.replace('"', "").split(",") jcode = line2[8] name = line2[9] population = line2[13] jcode = jcode[0:2] population = int(population) jcodes.append(jcode) names.append(name) populations.append(population) df = pd.DataFrame({"jcode" : jcodes, "name" : names, "population" : populations}) display(df) # create leaflet map by folium location = [39.702053, 141.15448379999998] tiles="Stamen Toner" zoom_start = 5 map = folium.Map(location=location, tiles=tiles, zoom_start=zoom_start) map.choropleth( geo_path="japan.geojson", data=df, columns=["jcode", "population"], key_on="properties.JCODE", threshold_scale=[10000, 50000, 100000, 150000, 200000, 300000], fill_color="YlGnBu", fill_opacity=0.7, line_opacity=0.2) display(map) |
データをただ可視化するだけであれば他のツールでも構いませんが、データ分析のライブラリが豊富なPythonで可視化ができましたので、何かしら分析をした地域データを可視化する場合には、この環境は便利ではないかなと思います。
ちなみに、今回一番苦戦したのは、データ加工とかでもなく、foliumとかでもなく、e-StatのAPIの使い方を理解することでした笑
もともと細かく項目や集計単位を設定してダウンロードできるサイトでしたから、これをAPIにするとなると、かなりのパラメータを渡さないといけなくなるだろうなぁと思っていました。
ある程度機能を制限して、妥協したデータを落としてくる形になるのかなーと思っていたのですが、まさかほとんどできるとは…。
初めて使う人は、とりあえず最初は普通にポータルサイトからデータをダウンロードしてくるところから慣れておいた方が、API使う時も混乱せずに済むのかなーと思います。
“e-Stat APIをPythonから使って地理データを可視化してみた” への 0 件のフィードバック