はじめての Claude Code × e-Stat|環境構築と API キー取得

ClaudeCode
e-Stat
環境構築
AI
入門

「Claude Code が便利らしい」「e-Stat で日本の公的統計が取れるらしい」——この 2 つを掛け算すると、47 都道府県の経済・人口・社会データを 自然言語で叩いて即可視化 できるようになります。本記事はその第一歩、環境構築と API キー取得だけ に集中した連載 Part 1 です。

連載全体では、Claude Code を使った e-Stat データ分析の実例を 20 本に渡って紹介します。Part 1 のゴールは、お手元のターミナルから claude コマンドを叩き、Claude Code に「e-Stat の API キーは取った。動作確認のリクエストを投げて」と頼んで、JSON が返ってくるまで。所要時間 30 分。この記事を終えれば Part 2 以降の実装パートに地に足のついた状態で進めます。

なぜ Claude Code × e-Stat なのか

e-Stat(政府統計の総合窓口)は、総務省統計局が運営する日本の公的統計のハブです。国勢調査・人口推計・家計調査・経済センサス・賃金構造基本統計調査など、3 万を超える統計表が無料で API 経由で取得 できます。学術研究・行政資料・ジャーナリズム・SaaS のダッシュボード——使い道は無限です。

ところが、e-Stat API を直接叩こうとすると最初の壁が高い。統計表 ID(statsDataId)の探し方、カテゴリコード(cdCat01 等)のメタ情報照会、ページネーション、レスポンス JSON の入れ子構造——全部覚えないとデータに辿り着けません。ドキュメントを読み始めて 30 分後にはタブが 20 個開いている、そんな API です。

ここに Claude Code が刺さります。Claude Code は Anthropic 公式の CLI 型 AI コーディングエージェントで、「e-Stat の人口推計の最新年データを取って CSV にして」と日本語で頼めば、メタ情報の検索 → API 呼び出し → JSON パース → CSV 出力までを コードを書いて実行までしてくれる のが特徴です。

観点手書きスクリプトClaude Code
学習コストAPI ドキュメント 200 ページ自然言語で依頼するだけ
統計表 ID の特定ブラウザで検索 → メモ「2020 年の国勢調査の世帯数」で OK
メタ情報照会getMetaInfo を別途叩く自動でやる
試行錯誤の速度1 サイクル 5-10 分1 サイクル 30 秒
エラー時の対応スタックトレースを読むエラーを見せれば直す
データ整形(CSV/JSON 変換)pandas で書く「列名を日本語にして」で済む

もちろん Claude Code は万能ではありません。頻出する処理はスキル化(手順書化)してコードに落とす のがベストプラクティスです。連載後半でその話もします。Part 1 では「まず動かす」ところまで。

Step 1: Claude Code のインストール

Claude Code は Node.js 製の CLI です。Node.js 18 以上が入っていれば、npm 1 行でインストールできます。

macOS / Linux

# Node.js が入っていなければ Homebrew で
brew install node

# Claude Code 本体
npm install -g @anthropic-ai/claude-code

# バージョン確認
claude --version

brew install node で Node.js 20 系(LTS)が入ります。nvm 派の人は nvm install --lts && nvm use --lts でも同じです。

Windows

Windows は WSL2(Ubuntu)経由で入れるのが事故が少ないです。PowerShell 直に入れることもできますが、後で git や bash 連携で詰まる人が多いので WSL を推奨します。

# WSL Ubuntu の中で
sudo apt update && sudo apt install -y nodejs npm
npm install -g @anthropic-ai/claude-code
claude --version

初回ログイン

インストール後、ターミナルで claude と打つと初回はブラウザが開き、Anthropic アカウントでログインを求められます。

claude

ログインすると料金プランの選択画面に進みます。本連載では Pro プラン(月額 $20) を前提とします。Pro プランなら Claude Sonnet を一定量まで追加料金なしで使えるので、e-Stat の試行錯誤には十分です。本格的に長文コードベースを扱うなら Max プラン($100/月)も視野に。

Tips: Claude Code は対話モードと非対話モード(claude -p "プロンプト")があります。普段は対話モードで OK。CI/CD に組み込むときは非対話モードを使います。

ここまで終わったら、適当な作業ディレクトリ(例: ~/estat-playground)を作って cd で移動し、再び claude を起動しておいてください。

mkdir -p ~/estat-playground && cd ~/estat-playground
claude

Step 2: e-Stat API の appId を取得

e-Stat API は 無料・無申請 で誰でも使えます。必要なのはメール認証のユーザー登録だけ。手順は以下の通りです。

  1. e-Stat API 機能 利用ガイド にアクセス
  2. 右上「ログイン」→「新規ユーザ登録」
  3. メールアドレス・パスワード・利用目的(「個人での学習」等)を入力
  4. 確認メールのリンクをクリックして本登録完了
  5. マイページの「アプリケーション ID 発行」から appId を取得

appId は 40 文字程度の英数字文字列です。これが API リクエストの認証鍵になります。

利用範囲と制限

e-Stat API には以下の制限があります(2026 年 5 月時点)。

項目制限
料金無料
リクエスト数概ね 100,000 回 / 日(明文化はされていないが運用上の目安)
レート制限短時間に大量リクエストすると一時的に 503
データ利用範囲公的統計の二次利用ガイドラインに準拠(出典明示が必要)
商用利用可(出典明示前提)

普通の分析・サイト掲載・社内資料用途であれば、まず引っかかることはありません。stats47.jp も同じ API で 47 都道府県 × 300 ランキング超を毎日更新 しています。

注意: 公的統計の二次利用は「出典明示」が原則です。記事やダッシュボードに掲載する際は「出典: 政府統計の総合窓口(e-Stat)国勢調査」のように出典を明示しましょう。詳細は 政府統計の総合窓口(e-Stat)利用規約 を確認してください。

Step 3: .env ファイルに appId を保存

取得した appId を、コード内にベタ書きするのは NG です。Git にコミットしてしまうと公開リポジトリ経由で漏洩します。.env ファイルに格納し、.gitignore で Git 管理対象から外す のが鉄則です。

.env と .gitignore の作成

# 作業ディレクトリの直下で
echo 'ESTAT_APP_ID=ここに取得したappIdを貼り付け' > .env
echo '.env' >> .gitignore

.gitignore には .env を必ず先に追加しておくこと。順序を逆にすると 1 度ステージングされた .env が後から無視されないままになります。

dotenv の導入(Node.js の場合)

.env の値を読み込むには dotenv が定番です。

npm init -y
npm install dotenv axios

package.json"type": "module" を追加しておくと、後で ES modules が使えて便利です。

Python の場合

Python 派の人は python-dotenv を使います。

python -m venv .venv
source .venv/bin/activate   # Windows は .venv\Scripts\activate
pip install python-dotenv requests

.env 動作確認

簡単に読めるかだけ確認しておきます。

// check-env.mjs
import "dotenv/config";
console.log("appId 先頭 8 文字:", process.env.ESTAT_APP_ID?.slice(0, 8));
node check-env.mjs
# => appId 先頭 8 文字: abc12345

undefined と出たら .env のパスかキー名を見直してください。

Step 4: 動作確認 — 最初のリクエストを Claude Code に頼む

ここからが本番。Claude Code に 「e-Stat に最初のリクエストを投げて」 と日本語で頼んでみます。

自然言語プロンプト例

claude を起動した状態で、以下のように頼みます。

.env の ESTAT_APP_ID を使って、e-Stat API の動作確認をしたい。
統計表 ID は 0003448237(人口推計 2020 年・都道府県別)を使い、
レスポンスの先頭 5 件だけ整形して console.log で表示する
Node.js スクリプト test-estat.mjs を作って、最後に実行して。

Claude Code はこの依頼を受けて、概ね以下のようなコードを書いて実行します。

// test-estat.mjs(Claude Code が生成)
import "dotenv/config";
import axios from "axios";

const APP_ID = process.env.ESTAT_APP_ID;
const STATS_DATA_ID = "0003448237";
const ENDPOINT = "https://api.e-stat.go.jp/rest/3.0/app/json/getStatsData";

const { data } = await axios.get(ENDPOINT, {
  params: {
    appId: APP_ID,
    statsDataId: STATS_DATA_ID,
    limit: 5,
  },
});

const values = data.GET_STATS_DATA?.STATISTICAL_DATA?.DATA_INF?.VALUE ?? [];
console.log("取得件数:", values.length);
console.log(JSON.stringify(values, null, 2));

期待されるレスポンス JSON

うまく行くと、ターミナルにこんな出力が出ます(抜粋)。

{
  "取得件数": 5,
  "values": [
    { "@tab": "00", "@cat01": "0", "@area": "00000", "@time": "2020000000", "@unit": "人", "$": "126146000" },
    { "@tab": "00", "@cat01": "0", "@area": "01000", "@time": "2020000000", "@unit": "人", "$": "5224614" },
    { "@tab": "00", "@cat01": "0", "@area": "02000", "@time": "2020000000", "@unit": "人", "$": "1237984" },
    { "@tab": "00", "@cat01": "0", "@area": "03000", "@time": "2020000000", "@unit": "人", "$": "1210534" },
    { "@tab": "00", "@cat01": "0", "@area": "04000", "@time": "2020000000", "@unit": "人", "$": "2301996" }
  ]
}

@area01000470005 桁地域コード$ フィールドが実測値です。@time は年度コード(2020000000 は 2020 年)。先頭の 00000 は全国合計です。

ここまで動けば Part 1 のゴール達成 です。Claude Code 経由で e-Stat の生 JSON が手元に届いたことになります。

Python 派向けのスクリプト例

参考までに、同じことを Python でやるとこうなります。

# test_estat.py
import os
import json
import requests
from dotenv import load_dotenv

load_dotenv()
APP_ID = os.environ["ESTAT_APP_ID"]
ENDPOINT = "https://api.e-stat.go.jp/rest/3.0/app/json/getStatsData"

resp = requests.get(
    ENDPOINT,
    params={"appId": APP_ID, "statsDataId": "0003448237", "limit": 5},
    timeout=10,
)
data = resp.json()
values = data["GET_STATS_DATA"]["STATISTICAL_DATA"]["DATA_INF"]["VALUE"]
print(json.dumps(values, indent=2, ensure_ascii=False))

Claude Code に「Python 版にして」と頼めば、JS 版から自動で書き直してくれます。

つまずきポイント Top 5

ここまでスムーズに動いたあなたは幸運です。実際は以下 5 つのどこかで必ず引っかかります。先回りで覚えておくと事故が半分になります

1. 401 認証エラー — appId が空 / 改行混入

{"GET_STATS_DATA":{"RESULT":{"STATUS":"403","ERROR_MSG":"APIキーが不正です。"}}}

.env に貼り付けた appId の末尾に 改行や半角スペースが混入 しているケースが最多。echo 'ESTAT_APP_ID=...' で書くとシェルが余計な文字を入れることも。cat -A .env$ 以外の制御文字が見えないか確認してください。

2. JSON 構造の罠 — 入れ子が深すぎる

e-Stat の JSON は 5 段ネスト が当たり前です。

GET_STATS_DATA > STATISTICAL_DATA > DATA_INF > VALUE > [配列]

しかも VALUE1 件しかないとオブジェクト、複数あると配列 という、JSON あるあるの罠付き。Claude Code に「VALUE を必ず配列として扱って」と一言添えると安全です。

3. cdTimeFrom の地雷 — キャッシュ分断

e-Stat API には cdTimeFrom cdTimeTo(年度範囲指定)パラメータがありますが、これを使うと R2/CDN キャッシュが指定値ごとに分断 されます。stats47 のローカル規約では「全年度取得 → メモリで年度フィルタ」が原則です。

詳細は Part 5 のキャッシュ設計編 で解説します。Part 1 では「cdTimeFrom は安易に使うな」とだけ覚えておけば十分。

4. 地域コードは 5 桁 — 2 桁ではない

01(北海道)と書いたら 0 件返ってきた——あるあるです。e-Stat の都道府県コードは 0100047000 の 5 桁 が正です。2 桁 + 3 桁ゼロパディングと覚えてください。市区町村まで降りるときは下 3 桁が市区町村コードになります。

コード
全国00000
北海道01000
東京都13000
東京都新宿区13104
沖縄県47000

5. レート制限 — 同時並列は 5 本まで

公式アナウンスはないものの、同時 10+ リクエスト で 503 が返ってくることがあります。並列処理するときは p-limit などで concurrency=5 を上限にしておくと安全です。Claude Code に「同時 5 並列で 47 都道府県を回して」と頼めば対応してくれます。

次回予告

Part 2 では、Claude Code の 「スキル化」 を扱います。今回手書きした test-estat.mjs のような単発スクリプトは便利ですが、毎回 Claude Code に同じ依頼を繰り返すのは非効率です。

Part 2 で作る /search-estat スキルを使うと、たとえば「賃金構造基本統計調査の最新年・職種別年収を取って」と頼むだけで、

  1. e-Stat の getStatsList を叩いて統計表 ID を検索
  2. getMetaInfo でメタ情報を取得
  3. 適切な cdCat01 を推論
  4. getStatsData で値を取得
  5. CSV / JSON / Markdown 表に整形

1 コマンド でやってくれるようになります。Claude Code × e-Stat が真価を発揮するのはここから。お楽しみに。

関連ランキング・記事

本連載に関連する stats47 内のランキング・記事もぜひ参考にしてください。


次回 Part 2 でお会いしましょう。claude と打って、e-Stat の世界を一緒に開拓していきます。