e-Stat APIを利用して政府統計データを取得する


## 1. アプリケーションID（APIキー）の取得
まず、e-Stat APIを利用するためには、アプリケーションID（APIキー）を取得する必要があります。これは、e-Statの公式サイトでユーザー登録を行い、API利用の申請を行うことで入手できます。
https://www.e-stat.go.jp/

## 2.統計コードを確認する

統計コードは、e-Statのページで各統計に割り当てられた8桁のコードです。下記のページから確認できます。これをリクエストのパラメータとして使用します。
https://www.e-stat.go.jp/stat-search/database?page=1
## 3. 統計表IDを取得
次に、統計表IDを取得するためには、統計表情報取得APIを使用します。このAPIは、特定の統計調査に関する統計表のリストを取得するために使用されます。

```
http://api.e-stat.go.jp/rest/3.0/app/json/getStatsList?appId=あなたのアプリケーションID&statsCode=統計コード
```
統計表IDを取得するPythonコード
```
import requests

# あなたのAPIキー
api_key = ""

# 統計コードを設定します
stats_code = "0003348423"# 例: 景気ウォッチャー調査の統計表ID 

# 統計表情報取得APIのURLを構築します
url = f"http://api.e-stat.go.jp/rest/3.0/app/json/getStatsList?appId={api_key}&statsCode={stats_code}"

# APIリクエストを送信して統計表情報を取得します
response = requests.get(url)

# レスポンスをJSON形式で解析します
data = response.json()

# 統計表IDを表示します
for table_info in data["GET_STATS_LIST"]["DATALIST_INF"]["TABLE_INF"]:
    print(f"統計表ID: {table_info['@id']}")
    print(f"統計名: {table_info['STATISTICS_NAME']}")
    
    # タイトルの型をチェックして適切に表示
    title_info = table_info['TITLE']
    if isinstance(title_info, dict):
        title = title_info.get('$', 'タイトル情報なし')
    else:
        title = title_info
    
    print(f"統計表タイトル: {title}")
    print()

```

## 4. 地域やカテゴリの情報を取得
メタ情報取得APIは、統計データセットのメタ情報を取得するために使用されます。例えば、地域コード（areacode）やカテゴリコード（categorycode）を取得するには、以下のようにAPIリクエストを送信します。

```
import requests

# あなたのAPIキー
api_key = ""

# 統計表IDを設定します（先ほど取得したIDを使用）
stats_data_id = "0003348423"  # 例: 景気ウォッチャー調査の統計表ID

# メタ情報取得APIのURLを構築
url = f"http://api.e-stat.go.jp/rest/3.0/app/json/getMetaInfo?appId={api_key}&statsDataId={stats_data_id}"

# APIリクエストを送信してメタ情報を取得
response = requests.get(url)

# レスポンスをJSON形式で解析
data = response.json()

# レスポンス全体を表示（どのようなデータが取得できるか確認）
print(data)

# エリアコードを取得して表示
if "AREA" in data["GET_META_INFO"]["METADATA_INF"]:
    area_info = data["GET_META_INFO"]["METADATA_INF"]["AREA"]
    for area in area_info:
        print(f"エリアコード: {area['@code']}, エリア名: {area['$']}")

# カテゴリコードを取得して表示
if "CLASS_INF" in data["GET_META_INFO"]["METADATA_INF"]:
    class_info = data["GET_META_INFO"]["METADATA_INF"]["CLASS_INF"]
    for class_obj in class_info.get("CLASS_OBJ", []):
        if class_obj["@id"] == "cat01":  # カテゴリコードに相当する部分
            for cat in class_obj["CLASS"]:
                print(f"カテゴリコード: {cat['@code']}, カテゴリ名: {cat['@name']}")
```

## 5.データフレーム df のカラム名を確認

```
import numpy as np
import pandas as pd
from jpy_datareader import estat

# APIキーを設定
api_key = ""

# データセットIDと必要なフィルタ条件を設定
stats_data_id = "0003348423"  # 景気ウォッチャー調査のデータセットID
area_code = "00000"  # エリアコード（例: 全国）
category_code = "100"  # カテゴリコード（例: 合計）

# データを取得
statsdata = estat.StatsDataReader(api_key, statsDataId=stats_data_id, name_or_id="name", cdArea=area_code, cdCat01=category_code)
df = statsdata.read(normal=True)

# データフレームのカラム名を表示
print(df.columns)
```

## 6.グラフ化

```
import numpy as np
import pandas as pd
from jpy_datareader import estat
from bokeh.plotting import figure, show, output_file
from bokeh.models import ColumnDataSource

# APIキーを設定
api_key = ""

# データセットIDと必要なフィルタ条件を設定
stats_data_id = "0003348423"  # 景気ウォッチャー調査のデータセットID
area_code = "00000"  # エリアコード（例: 全国）
category_code = "100"  # カテゴリコード（例: 合計）

# グラフのカスタマイズ設定
graph_title = "景気ウォッチャー調査 (DIの推移)"
x_axis_label = '年月'
y_axis_label = 'DI'
filter_level = "1"  # 時間軸の階層レベル（例: 月次）
value_column_name = "値"  # 表示する値の列
filter_item_name = "ＤＩ"  # フィルタする項目名（例: "DI"）
specific_field = "合計"  # 特定の分野名を選択
specific_sentiment = "景気の現状判断（方向性）"  # 特定の景気の方向性及び水準名

# データを取得
statsdata = estat.StatsDataReader(api_key, statsDataId=stats_data_id, name_or_id="name", cdArea=area_code, cdCat01=category_code)
df = statsdata.read(normal=True)

# 必要な列に絞る
di_data = df[["時間軸_コード", "時間軸(月次)階層レベル", "表章項目名", "分野名", "景気の方向性及び水準名", value_column_name]].copy()
di_data.loc[:, "年"] = di_data["時間軸_コード"].str[:4].astype(int)
di_data.loc[:, "月"] = di_data["時間軸_コード"].str[6:8].astype(int)

# データをフィルタリング
cond = di_data["時間軸(月次)階層レベル"] == filter_level
cond &= di_data["表章項目名"] == filter_item_name
cond &= di_data["分野名"] == specific_field
cond &= di_data["景気の方向性及び水準名"] == specific_sentiment
filtered_data = di_data[cond].copy()
filtered_data["年月"] = pd.to_datetime(filtered_data["年"].astype(str) + "-" + filtered_data["月"].astype(str) + "-1")

# Bokehで折れ線グラフを作成
output_file("line_chart.html")

data_source = ColumnDataSource(filtered_data)

p = figure(title=graph_title, x_axis_label=x_axis_label, y_axis_label=y_axis_label,
           x_axis_type='datetime', width=800, height=400)

p.line(x='年月', y=value_column_name, source=data_source, legend_label=f"{specific_field} - {specific_sentiment}", line_width=2)

p.legend.location = "top_left"
p.grid.grid_line_alpha = 0.3

# グラフを表示
show(p)
```
![スクリーンショット 2024-08-17 2.02.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398994/e8033de7-8d4d-0d65-3f0c-ee57cd9bb0af.png)