中国統計局データを用いた消費支出トレンドの可視化とARIMA予測

データ取得:統計局APIへのアクセス

国家統計局の「EasyQuery」インターフェースは JSON 形式で構造化データを返却するため、requests を使って簡単に取得できる。アクセス制限を避けるため、1 回取得したらローカルにキャッシュし、連続アクセスは避ける。

import requests, re, json, time

BASE = "https://data.stats.gov.cn/easyquery.htm"
QUERY = {
    "m": "QueryData",
    "dbcode": "hgnd",
    "rowcode": "zb",
    "colcode": "sj",
    "wds": "[]",
    "dfwds": '[{"wdcode":"zb","valuecode":"A0A04"}]',
    "k1": str(int(time.time()*1000)),
    "h": "1"
}

HEADERS = {
    "User-Agent": "Mozilla/5.0 (compatible; DataBot/1.0)",
    "Accept": "application/json, text/plain, */*",
    "Referer": BASE + "?cn=C01"
}

def fetch_stats():
    resp = requests.get(BASE, params=QUERY, headers=HEADERS, verify=False, timeout=10)
    resp.raise_for_status()
    payload = resp.json()

    # データノードから数値を抽出
    series = {}
    for node in payload["returndata"]["datanodes"]:
        m = re.search(r"\.(\w+)_sj\.(\d{4})", node["code"])
        if not m: 
            continue
        code, year = m.groups()
        series.setdefault(code, {})[int(year)] = float(node["data"]["strdata"])

    # 項目名を取得
    names = {
        n["code"]: n["name"]
        for n in payload["returndata"]["wdnodes"][0]["nodes"]
    }
    return series, names

データクレンジングと可視化

取得したデータを Pandas DataFrame に格納し、欠損値を補完した後、Matplotlib で折れ線グラフを描画する。

import pandas as pd
import matplotlib.pyplot as plt

series, names = fetch_stats()
df = pd.DataFrame(series).sort_index()  # 行:年度、列:指標

# 単位を元に戻す(統計局は「元」で表示)
df = df / 1

# 主要項目を抽出
targets = ["A0A0401", "A0A0403", "A0A0405", "A0A0409", "A0A040F", "A0A040H"]
subset = df[targets].rename(columns=names)

ax = subset.plot(figsize=(10, 5), marker="o")
ax.set_title("全国居民消費支出の推移(2014–2023)")
ax.set_ylabel("支出額(元)")
ax.grid(alpha=0.3)
plt.tight_layout()
plt.show()

ARIMA による 2 年間予測

statsmodels の ARIMA を利用し、各支出項目に対して (p=1, d=1, q=1) のモデルを構築し 2024–2025 年を予測する。予測区間も併せてプロットすることで、信頼性を可視化する。

from statsmodels.tsa.arima.model import ARIMA

def forecast(series, steps=2):
    model = ARIMA(series.dropna(), order=(1, 1, 1))
    res = model.fit()
    pred = res.forecast(steps=steps)
    ci = res.get_forecast(steps=steps).conf_int()
    return pred, ci

future = {}
for col in targets:
    f, ci = forecast(df[col])
    future[col] = f

future_df = pd.DataFrame(future, index=[2024, 2025]).rename(columns=names)

# 可視化
plt.figure(figsize=(12, 6))
for col in targets:
    name = names[col]
    plt.plot(df.index, df[col], label=f"{name}(実績)")
    plt.plot(future_df.index, future_df[name], "--", label=f"{name}(予測)")

plt.title("消費支出の2年先予測(ARIMA)")
plt.ylabel("支出額(元)")
plt.legend(ncol=2)
plt.grid(alpha=0.3)
plt.show()

まとめ

統計局 API から取得した最新 10 年分の消費支出データを基に、ARIMA モデルで 2024–2025 年の支出を予測した。結果は教育・文化・娯楽や医療保健の伸びが大きく、居住費も緩やかに増加する傾向が示された。これらの知見は政策立案やビジネス戦略の参考になる。

なお、本記事は学習目的であり、大量アクセスや商用利用は禁止されている。常に robots.txt や利用規約を確認し、適切な範囲でデータを利用すること。

タグ: Python requests Pandas matplotlib ARIMA

7月5日 23:50 投稿