株式投資をやっていると金融、商社、IT、建設、製造、飲食等、様々な事業を行っている会社の株式を目の当たりにします。そんな中でファンダメンタル分析やテクニカル分析でスクリーニングした結果出てきた銘柄が自分に全く馴染みの無い業界の銘柄であることは多々あります。
そんな馴染みの無い業界の決算短信を読んで、「今後も○○の需要が堅調に推移していくので、売上も堅調に伸びていくと思われる」と書かれていても、ほんまかいなと思ってしまうわけです。
なので、なにかその分野が伸びていくというような定量的な情報を得られないかということで、統計局が出しているデータを取得して自分で分析したいと思った次第です。例えば、建築や不動産関連株の業績が新規住宅着工件数とかなり連動するので、そのデータを基に業績の推移を予想するみたいな感じです。(そんな簡単ではないと思いますが。。。)
e-Stat(政府統計の総合窓口)のユーザー登録
そんなわけで「統計局 データ取得 python」というような感じで検索するとe-Statと呼ばれる統計局が運営していると思われる政府統計を収録したポータルサイトがあることがわかりました。
まずは、以下のe-Statのトップページに移動します。
e-Stat(政府統計の総合窓口):https://www.e-stat.go.jp/

ページ右上の新規登録ボタンを押します。すると以下のユーザー登録のページに移行します。
ユーザー登録:https://www.e-stat.go.jp/mypage/user/preregister

仮登録画面が現れるので、e-mailを入力して仮登録ボタンを押すと、入力したe-mailにメールが届きます。
メールに従って、本登録画面に行くと以下のような画面が現れます。
利用する機能はすべてチェックを飛ばしておいてOKです。

本登録ボタンを押すと無事登録が完了したことを示す画面が現れるので、以下のログイン画面に移動します。
ログイン画面:https://www.e-stat.go.jp/mypage/login
e-StatのアプリケーションIDの取得
ログインするとまたe-statのトップページに戻りますが、自分のe-mailアドレスが記載されていることがわかります(下の画像では黒四角で塗りつぶしています。)

右上のマイページボタンを押します。すると以下のような画面が現れます。

赤丸で囲ったAPI機能(アプリケーションID発行)というリンクを押すと以下のような画面が現れます。

名称、URLは必須なので以下のように入力します。概要は合ってもなくても良いです。

発行ボタンを押すと、appIdの欄にアプリケーションIDが発行されるのでそれをコピーして利用します。
japandasを用いてe-Statデータ取得
いよいよe-Statのデータを取得します。
japandasのインストール
appIdを取得したのe-StatのAPI仕様を読み込んでプログラムを書いても良いのですが、すでにe-Statのデータを簡単に読み込んでくれるjapandasというモジュールを作成してくれている神様のような方がいるのでこちらを利用するのが良いと思います。
上記サイトに記載の通り以下のコマンドをターミナルで実行すればモジュールをインストールできます。
$ pip install japandas
政府統計コード一覧の取得
基本的には上記のサイトの手順どおりに進めればよいのですが、以下のページにある政府統計コード一覧が最初に必要となります。
e-Stat提供データ一覧(政府統計コード一覧):https://www.e-stat.go.jp/api/api-info/api-data
毎回このページを参照しながら政府統計コードを入力しても良いのですが、よく使用するので一覧表を作成してしまいたいと思います。ホームページからエクセルにコピペすれば良いだけと思いきやエクセルに貼り付けると先頭の「0」が消えてしまって「00020111」=>「20111」となってしまいます。エクセルで悪戦苦闘したので、以下のコードでスクレイピングで取得してしまいました。
#モジュールのインストール
import pandas as pd
from bs4 import BeautifulSoup
import requests
import pickle
#データ提供ページのURL
url = 'https://www.e-stat.go.jp/api/api-info/api-data'
#BeautifulSoupでスクレイピング
soup = BeautifulSoup(requests.get(url).content,'lxml')
td = soup.find_all('td')
gov_stat_code = [v.text for i, v in enumerate(td) if i%3 == 0]
stat_name = [v.text for i, v in enumerate(td) if i%3 == 1]
gov_org = [v.text for i, v in enumerate(td) if i%3 == 2]
#データフレーム化
df = pd.DataFrame(columns = ['政府統計コード', '統計調査名', '作成機関名'])
df['政府統計コード'] = gov_stat_code
df['統計調査名'] = stat_name
df['作成機関名'] = gov_org
#'gov_stat_code.pklというファイル名でpickle保存
df.to_pickle('gov_stat_code.pkl')
#データフレームの表示
df.head()
以下のような結果が得られていると思います。

統計データの取得
StatsFragmentsのサイトに記載の通りに従えば、
政府統計コード:00020111
統計調査名:民間企業の勤務条件制度等調査
作成期間:人事院
のデータを取得しようと思うと以下のコードで取得することができます。
key = 'アプリケーションID'
df = jpd.DataReader('00020111', 'estat', appid = key)
ただ、政府統計コード一覧もあるので、以下のコードで全てのデータを一気に取得してしまいたいと思います。
import pandas as pd
import japandas as jpd
import pickle
from tqdm import tqdm
#アプリケーションIDの設定
key = 'アプリケーションID'
#pickle保存したファイルをロード
code_list = pd.read_pickle('gov_stat_code.pkl')
#dlistというリストに各統計コードのデータフレームを保管
dlists = []
for code in tqdm(code_list['政府統計コード']):
try:
dlists.append(jpd.DataReader(code, 'estat', appid = key))
except:
dlists.append(None)
途中にtry文を入れているのは、なぜか1つだけデータが欠損している統計データがあるためです。
passしても良いのですが、以下のように政府統計コード一覧のindexとdlistsのインデックスが揃うように欠損しているデータにはNoneを入れておきます。
以下のコードで中身を確認することができます。
code_index = 3
print(code_list.iloc[code_index,:])
dlist = dlists[code_index]
dlist.head()
以下のような結果が得られているはずです。

青少年のインターネット利用環境実態調査とか、なかなかおもしろい統計データですね。
インターネット関連の会社の株を買う前に調べてみてみたりすと良い気がします。
以上、pythonで政府統計庁データ(e-stat)を取得するまでの流れでした。
参考になった場合はポチっとしておいてもらえると嬉しいです。

