みなさん、こんにちは
M1の田邉です!
多くの研究者や、学生の方々が使われているであろうe-Statについて、その豊富なデータ量に対して、ご自身が探したいデータがなかなか見つからない…なんて思いをされている方も多いのではないでしょうか。
今回のブログでは、研究室で開催した「e-Stat API ハンズオン講習会」で用いた資料とともに、データ探索において非常に便利なe-StatAPIについてご紹介したいと思います!

e-Statとは
そもそもe-Statというのは、政府が公開している統計情報のポータルサイトのことです。
参照:利用ガイド | 政府統計の総合窓口
実際にデータを探そうとする場合、e-Statでは取得したいデータを一つずつ入手することができます。
ただ、取得したいデータが多い場合だと少々不便…

そんな時に便利なのがe-StatAPI!
これを使うことによって、e-Statで管理されているデータが効率的に探すことができます

e-Stat APIとは
e-StatAPIとは、政府統計の総合窓口が提供するAPIのことです!
APIというのは「Application Programming Interface」の略です。
難しい単語が並んでいますが、単純にプログラムを用いてある機能を呼び出したり、使ったりしたい場合の窓口のことです。

ということで、早速e-StatAPIを使ってみましょう!

利用方法
まずは利用申請です!
APIを利用するためには、APIを使うための個人IDを取得する必要があります。
そこでe-Statにアクセスし、ログインします。アカウントを作成していない人はアカウントの作成を行いましょう。

以上の申請が終了すると、アプリケーションIDが発行されると思います。それがAPIの個人IDとなります。
なお、この個人IDは一人一人発行されているものなのと、APIを使用するための鍵でもあるので、うっかり公開しないようにしましょう。
それでは実際にAPIを使ってデータの取得をしていきましょう!
具体的なAPIを用いたデータ取得の流れは以下の通りになります。
なお、APIを用いたデータ取得は、yumaloop様が提供しているestat-apiライブラリを活用させていただきました。

jupyter notebookを用いてデータの取得のデモを行っていきます。
まずはライブラリのインポートとインスタンス化を行います。
ソースコードは下記の通りです。
from estat_api import EstatRestApiClient
import pandas as pd
fileEstatAPI = "eStat_api_key.txt" # ←ご自身のeStatAPI keyが記述されたテキストファイルのパスをご指定ください
estat_api_client = EstatRestApiClient(app_id=open(fileEstatAPI).read())

続いて、e-Statの統計表にどのようなデータがあるか確認していきます。今回検索キーワードは「スポーツ」で検索していきます。先程インスタンス化した変数に、どのような統計データがあるかを確認する関数を実装しました。実行結果を見ていきましょう。ソースコードは下記の通りです。
df = estat_api_client.getStatsResearch(lang="J", searchWord = "スポーツ", limit=100, format="json")
df

おぉ!たくさんでてきました!
続いて、得られた統計表データのid列より、実際にデータの中身を確認していきます。
今回対象となるのは「2019年経済構造実態調査(乙調査)調査対象及び調査事項、統計表」の第6表のデータを取得します。
そこで、指定したidの統計データを取得する関数を実装しました。ソースコードは下記の通りです。
_ = estat_api_client.getStatsIDDataFrame(id="0003448743")
_
これを実行すると…

データが取得できました!
e-Statホームページから直接入手できるデータでは、データ分析等で扱えるようにするために、データの加工が必要なことが多いです。しかし、e-StatAPIを用いてデータを取得することによって、比較的整理された状態でデータを取得することが可能なので非常に便利です!
おまけ
実はe-StatAPIで取得できるデータでは、メッシュ統計データも取得可能です!
地理空間情報分析をしている方にとっては、非常に嬉しいのではないでしょうか。
取得方法は下記の通りになります。ソースコードは下記の通りになります。
df = estat_api_client.getStatsResearch(lang="J", searchWord = "国勢調査 令和 メッシュ", limit=100, searchKind=2, format="json")
df

今回使用した上記の関数は、yumaloop様が提供しているestat-apiライブラリのestat_api.pyにラッパーとして機能追加したものになります。下記に実装した関数のソースコードを公開いたします。
def getStatsResearch(self, **kwargs):
"""
:param kwargs: search_word
:return: pandas.DataFrame
"""
search_result_json = self.getStatsList(**kwargs)
data_list = []
table_inf_list = search_result_json['GET_STATS_LIST']['DATALIST_INF']['TABLE_INF']
for table_inf in table_inf_list:
data_list.append({
'statistics_name': table_inf['STATISTICS_NAME'],
'table_name': table_inf['TITLE_SPEC']['TABLE_NAME'],
'survey_data': table_inf['SURVEY_DATE'],
'id': table_inf['@id']
})
df = pd.DataFrame(data_list)
for col in df.columns:
print(col, [str(i).replace("\u3000","") for i in df[col].unique().tolist()])
return df
def getStatsIDDataFrame(self, id):
"""
:param id: stats id
:return: pandas.DataFrame
"""
#query from id of database
df_list = {}
df_list.update({id: self.getStatsDataFrame(lang="J", statsDataId=id)})
print(df_list.get(id).info())
for col in df_list.get(id).columns:
print(col, df_list.get(id)[col].unique().tolist())
df = df_list.get(id)
return df
注意点
なお、e-StatAPIを用いて取得してきたデータにはクレジット表記が必要となります。

資料集
最後に「e-Stat API ハンズオン講習会」で使用した資料を公開いたします。
今回ブログで紹介しきれない部分もありますので、よろしければご覧ください!
以上、最後までお読みいただきありがとうございました!
出典
- 政府統計の総合窓口(e-Stat)
- 政府統計の総合窓口(e-Stat) 利用ガイド
- 政府統計の総合窓口(e-Stat)API機能 クレジット表示
- 政府統計の総合窓口(e-Stat)API機能 利用ガイド
- 政府統計の総合窓口(e-Stat)API機能 提供データ
- Pythonで公的統計APIのオープンデータ活用(PyConJP2022)|Speaker Deck
- 公的統計APIからデータ取得するPythonのライブラリを作りました|Zenn
- 政府統計の総合窓口「e-Stat」のAPIを使って市区町村の境界データと目的の統計データをマージするツールを公開!|Qiita
- Pythonでやってみた12:APIで統計情報取得(e-Stat)|note
- yumaloop/estat-api|GitHub
- 政府統計の総合窓口(e-Stat)API仕様【バージョン 3.0】
著者プロフィール

田邉渉
芝浦工業大学 理工学研究科
システム理工学専攻 修士1年