政府の統計データをe-Stat APIとPythonを使って取得する方法

# 初めに
e-Stat APIとPythonを使って、政府の統計データを取得する方法をまとめています。
データ分析のゼミで都道府県別の人口データが必要になり、データ取得をしたのですがAPIに不慣れで結構大変だった為、これからe-StatAPIを使う初めての方向けに可能な限り分かりやすくまとめようと思います。

この記事は「政府統計データの取得の仕方」と[「取得した統計データをpandasのデータフレームへ変換する方法」](https://qiita.com/Sei123/items/45074a64d893dfca4f05)の2つの記事に分けて書こうと思います。
pythonを使わずにデータを取得したい方は統計表IDをブラウザーで確認する方法の途中でDBからダウンロードしてください。
***
<font color="#FF0000">e-Stat APIの機能は以下のようになっています。上の3つの機能について解説しています。</font>

- **【統計表情報取得】　　　　⇒　ざっくり言うと統計表IDの取得をするよ**
- **【メタ情報取得】　　　　　⇒　集計事項、地域事項、分類事項等がわかるよ**
- **【統計データ取得】　　　　⇒　統計データを取得できるよ**
- 【データセット登録】　　　⇒　統計データ取得時の絞り込み条件を登録する機能
- 【データセット参照】　　　 ⇒　登録されたデータセットの情報を参照する機能
- 【データカタログ情報取得】  ⇒　調査名、表題、リンク情報等を提供する機能。
- 【統計データ一括取得】　　  ⇒　統計データ（数値データ）を一括で提供する機能

各統計データには、統計表IDが割り当てられており、そのIDを使用することで特定の統計データを取得することができます。
統計データの取得は欲しいデータの統計表IDさえ分かればすぐにできます。
なので、統計データの取得に最低限必要な機能は【統計表情報取得】と【統計データ取得】の2つの機能だけです。
***
**目次**
- APIキーの取得
- 統計表IDの取得
⇒ブラウザーで確認する方法
⇒APIで取得する方法
- メタ情報取得
- 統計データ取得


# APIキーの取得(アカウント作成）
e-stat公式ページに飛びアカウント作成をしてください。必要なものはE-mailアドレスだけです。
[e-stat公式サイト](https://www.e-stat.go.jp/developer)

![スクリーンショット 2023-07-06 135450.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/a2c2a4c6-e44a-69dc-428e-39204808a817.png)
**ログインが出来ましたらマイページに飛んでください**
***

![スクリーンショット 2023-07-06 135645.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/080ff88f-3fa8-d8ea-8a44-24ccc6857a12.png)
**マイページからAPIキー発行ページに飛びます**
***


![スクリーンショット 2023-07-06 135910.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/7baf3323-97e6-fee3-54ea-5d46dd416d31.png)
IDの取得に関しては下のアプリケーションIDの取得を参考にしてください。内容は、名称やURLは適当でいいよーって書いてます。これでAPIキーが発行できました。
![スクリーンショット 2023-07-06 141437.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/12481b0b-0d57-f961-98b5-eb9b78117a40.png)
# 統計表情報取得
統計データの取得には統計表IDが必要です。
統計表IDの取得の仕方は主に２つあります。
- <font color="#FF0000">ブラウザーで確認する方法</font>
- <font color="#FF0000">APIで取得する方法</font>

## ブラウザーで確認する方法
**例：「都道府県別人口の割合－総人口」の統計IDの確認の仕方。**
![スクリーンショット 2023-07-06 193612.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/600d34a4-6ef0-744c-4d11-a1b624c6243e.png)
1. 統計データを探す
1. 分野から探す
1. 人口推移
検索で人口推移でも大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/3db9fcbe-0299-87cb-0472-d7c15526da3f.png)
データベースに入ります。
***
![スクリーンショット 2023-07-06 194148.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/ec704f9e-0ace-37bf-bf63-7ef063f8182b.png)
年次に入ってください。
***
![スクリーンショット 2023-07-06 194501.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/7f00bc69-0c80-9f09-f6b2-f1ec76d8dc8e.png)
都道府県別人口の割合－総人口のAPIをクリックしてください。
<font color="#FF0000">補足</font>：左のDBをクリックするとCSVデータがダウンロードできます。
***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/0cf00a4a-4e5b-b5f9-ca05-0dc39fbb1e30.png)
するとURLが出てきて、statsDataId=0003448233で数字の部分が統計表IDです。
ブラウザーでの統計表IDの確認ができました。欲しいデータが決まっている場合はこの方法が一番早いと思います。


## APIで取得する方法
[e-Stat API仕様](https://www.e-stat.go.jp/api/api-info/e-stat-manual#api_2_3)書いてます。ここを見ながらの方が分かりやすいと思います。

まずは、基本的な統計表IDの取得の仕方です。
```python
http(s)://api.e-stat.go.jp/rest/<バージョン>/app/json/getStatsList?<パラメータ群>
```
こちらがJSON形式の統計表IDリクエストURLになります。<font color="#FF0000">getStatsList</font>が統計表IDリクエストを表しています。ここを変更すればメタ情報取得や統計データ取得のURLになります。
***
requestsモジュールを使って、統計表IDを取得するコードです。
```python
import requests
APP_ID = "APIキーを入れてね"
API_URL = "http://api.e-stat.go.jp/rest/3.0/app/json/getStatsList?"

params = {
    "appId": APP_ID,
    "limit": 2, # 取得数を2つに制限
    "lang": "J" # 日本語を指定
}

response = requests.get(API_URL, params=params)
data = response.json()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/1b70ea41-fb52-14f9-505a-4eddcd1e8537.png)
統計表IDは<font color="#FF0000">TABLE_INF</font>に入っています。

今回取得したのは「民間企業の勤務条件制度等調査」の統計表IDで欲しい「都道府県別人口の割合－総人口」の統計IDではないので、paramsに条件を追加して指定していきます。
***
まず、こちらが完成したコードです。
```python
APP_ID = "APIキーを入れてね"
API_URL = "http://api.e-stat.go.jp/rest/3.0/app/json/getStatsList?"

params = {
    "appId": APP_ID,
    "statsCode": "00200524",
    "searchWord": "都道府県別 AND 総人口",
    "openYears": 202304,
    "limit": 2,
    "lang": "J"  # 日本語を指定
}

response = requests.get(API_URL, params=params)
data = response.json()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/9284b21e-f7b9-d27f-840a-f70223c8e2a9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/0cf00a4a-4e5b-b5f9-ca05-0dc39fbb1e30.png)
これは先ほどブラウザーで確認した統計表IDと同じ0003448233であることが分かります。無事取得できました。
今回新たに追加した"statsCode","searchWord","openYears"の説明をします。
少し長いので大丈夫な方は飛ばしてください。
### 政府統計コード(statsCode)
「都道府県別人口の割合－総人口」は総務省の人口推計の中にあります。
<font color="#FF0000">**イメージ：各省庁データ>総務省>人口推計>都道府県別人口の割合－総人口**</font>
政府統計コード(statsCode)を指定することで人口推計を指定することができ、検索範囲をだいぶ絞り込めます。
[政府統計コード一覧（2023年7月版）](https://www.e-stat.go.jp/estat/html/tokei_itiran.pdf)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/3fe4576b-3f8a-3931-47ef-ef1add10b361.png)
00200524が人口推計を指定するための政府統計コードです。
***
ちなみにブラウザーでも確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/1d2def72-c794-0395-c429-6801b947ccea.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/a7b915c7-4303-e2de-d7a0-a622e113961e.png)

### 検索キーワード(searchWord)
検索キーワドを指定するとファイル名をキーワド検索してくれます。
今回欲しいデータは「都道府県別人口の割合－総人口」なのでキーワドに都道府県別と総人口を指定しました。
```python
params = {
    "appId": APP_ID,
    "statsCode": "00200524",
    "searchWord": "都道府県別 AND 総人口",
    "limit": 2,
    "lang": "J"  # 日本語を指定
}
```
***
しかし、このparamsの指定だけだと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/5d796cec-e24e-eb4e-50a2-45eafa21490a.png)
平成19年のデータを持ってきてしまい、欲しい統計IDではないです。
そこでopenYearsを指定しました。

### 公開年月(openYears)
データの公開年月を指定して最新のデータを取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/128af4a1-330c-1b4f-facb-9df5f4ef6c72.png)
公開日はここで確認できます。
<font color="#FF0000">yyyymm</font>の形で指定してください。y：year,m：monthです。
つまり年月で指定します。

# メタ情報取得
取得できた統計ID：0003448233でメタ情報を取得します。
メタ情報は統計データの構造や属性、定義などに関する情報のことです。
メタ情報を取得するためにURLの最後を<font color="#FF0000">getMetaInfo</font>に変更しています。
***
```python
import requests

APP_ID = "APIキーを入れてね"
API_URL = "http://api.e-stat.go.jp/rest/3.0/app/json/getMetaInfo?"

params = {
    "appId": APP_ID,
    "statsDataId": "0003448233",
    "limit": 2,
    "lang": "J"  # 日本語を指定
}

response = requests.get(API_URL, params=params)
data = response.json()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/38c1eb34-78df-d11e-251d-73360469d6e2.png)
「都道府県別人口の割合－総人口」には県別のデータが入っていることが分かります。
左の@codeが各県の単一コードです
このメタ情報をもと北海道のデータだけを取得していきます。

# 統計データ取得
まず、「都道府県別人口の割合－総人口」の全てのデータを取得するコードです。
URLの最後を<font color="#FF0000">getStatsData</font>に変更しています。
```python
import requests

APP_ID = "APIキーを入れてね"
API_URL = "http://api.e-stat.go.jp/rest/3.0/app/json/getStatsData"

params = {
    "appId": APP_ID,
    "statsDataId": "0003448233",
    "lang": "J"  # 日本語を指定
}

response = requests.get(API_URL, params=params)
# Process the response
data = response.json()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/bdaed69b-e7c0-c24f-fa79-de7f3f518314.png)
VALUEにほしいデータが入っています。

## 北海道のデータ取得(cdArea)
cdAreaに北海道の単一コード：01000を指定することで、北海道が指定できます。
北海道の単一コードはメタ情報取得で確認できます。
```python
import requests

APP_ID = "APIキーを入れてね"
API_URL = "http://api.e-stat.go.jp/rest/3.0/app/json/getStatsData"

params = {
    "appId": APP_ID,
    "statsDataId": "0003448233",
    "cdArea": "01000",
    "lang": "J"  # 日本語を指定
}

response = requests.get(API_URL, params=params)
# Process the response
data = response.json()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/dfcdd40e-79f6-eb18-90ee-385e1f719ee8.png)
北海道のデータだけを取得することができました。VALUEの中身が欲しいデータです。
***
しかし、データ分析をする為には、このデータの形式ではやりづらいので、json形式から必要なデータを抽出してpandasのデータフレームに変換します。完成したものがこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482837/23c48c99-0ab6-37e2-5cb5-6fddd98a72e2.png)
無事データを変換することができました。長くなりましたのでpandasのデータフレームに変換する方法の解説は[次回](https://qiita.com/Sei123/items/45074a64d893dfca4f05)にしようと思います。
最後までお付き合いくださりありがとうございました。

# 参考
[どこにでもいる30代SEの学習ブログ](https://predora005.hatenablog.com/entry/2021/02/22/190000#3-%E5%8F%96%E5%BE%97%E3%81%A7%E3%81%8D%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%81%A8%E7%B5%B1%E8%A8%88%E8%A1%A8ID%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B)
[Pythonでe-Stat APIを使う](https://qiita.com/yumaloop/items/efc4c8981510b78dd560)
[e-Stat APIをGoogle Colab (Python) からアクセスする](https://qiita.com/sakaia/items/abae664e59fda0b55e7f)
[e-Stat API仕様](https://www.e-stat.go.jp/api/api-info/e-stat-manual#api_2_3)
ChatGPTへの質問

# 終わりに
政府の統計データをpythonで取得するのはめっちゃ大変だったので、少しでもこの記事がお役に立てると嬉しいです。

今回は政府統計データの取得の仕方をご紹介しました。
次回は[「取得した統計データをpandasのデータフレームへ変換する方法」](https://qiita.com/Sei123/items/45074a64d893dfca4f05)をご紹介しようと思います。