e-StatAPI ハンズオン講習会

posted in: 日常 | 0

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

Image from Gyazo

e-Statとは

そもそもe-Statというのは、政府が公開している統計情報のポータルサイトのことです。
参照:利用ガイド | 政府統計の総合窓口

実際にデータを探そうとする場合、e-Statでは取得したいデータを一つずつ入手することができます。
ただ、取得したいデータが多い場合だと少々不便…

Image from Gyazo

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

Image from Gyazo

e-Stat APIとは

e-StatAPIとは、政府統計の総合窓口が提供するAPIのことです!

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

Image from Gyazo

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

Image from Gyazo

利用方法

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

Image from Gyazo

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

Image from Gyazo

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())
Image from Gyazo

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

df = estat_api_client.getStatsResearch(lang="J", searchWord = "スポーツ", limit=100, format="json")
df
Image from Gyazo

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

_ = estat_api_client.getStatsIDDataFrame(id="0003448743")
_

これを実行すると…

Image from Gyazo

データが取得できました!
e-Statホームページから直接入手できるデータでは、データ分析等で扱えるようにするために、データの加工が必要なことが多いです。しかし、e-StatAPIを用いてデータを取得することによって、比較的整理された状態でデータを取得することが可能なので非常に便利です!

おまけ

実はe-StatAPIで取得できるデータでは、メッシュ統計データも取得可能です!
地理空間情報分析をしている方にとっては、非常に嬉しいのではないでしょうか。
取得方法は下記の通りになります。ソースコードは下記の通りになります。

df = estat_api_client.getStatsResearch(lang="J", searchWord = "国勢調査 令和 メッシュ", limit=100, searchKind=2, format="json")
df
Image from Gyazo

今回使用した上記の関数は、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を用いて取得してきたデータにはクレジット表記が必要となります。

Image from Gyazo

資料集

最後に「e-Stat API ハンズオン講習会」で使用した資料を公開いたします。
今回ブログで紹介しきれない部分もありますので、よろしければご覧ください!
以上、最後までお読みいただきありがとうございました!

出典

著者プロフィール

田邉渉

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