「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 は 無料・無申請 で誰でも使えます。必要なのはメール認証のユーザー登録だけ。手順は以下の通りです。
- e-Stat API 機能 利用ガイド にアクセス
- 右上「ログイン」→「新規ユーザ登録」
- メールアドレス・パスワード・利用目的(「個人での学習」等)を入力
- 確認メールのリンクをクリックして本登録完了
- マイページの「アプリケーション 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" }
]
}
@area が 01000〜47000 の 5 桁地域コード、$ フィールドが実測値です。@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 > [配列]
しかも VALUE は 1 件しかないとオブジェクト、複数あると配列 という、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 の都道府県コードは 01000〜47000 の 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 スキルを使うと、たとえば「賃金構造基本統計調査の最新年・職種別年収を取って」と頼むだけで、
- e-Stat の
getStatsListを叩いて統計表 ID を検索 getMetaInfoでメタ情報を取得- 適切な
cdCat01を推論 getStatsDataで値を取得- CSV / JSON / Markdown 表に整形
を 1 コマンド でやってくれるようになります。Claude Code × e-Stat が真価を発揮するのはここから。お楽しみに。
関連ランキング・記事
本連載に関連する stats47 内のランキング・記事もぜひ参考にしてください。
- 人口ランキング — e-Stat の「人口推計」を使った最も基本的なランキング。Part 1 で取得したデータと同じ統計表が元です
- 県民所得ランキング — 経済系で最頻出の指標。Part 3 以降で「県民所得を 47 都道府県分取って棒グラフ化」を扱う予定
- Claude Code で47都道府県分析を自動化|公務員のための AI × 統計 7 ステップ — 公務員視点での Claude Code 活用記事。本記事は「エンジニア向け環境構築の徹底解説」で住み分け
- 情報通信業ランキング — ICT カテゴリのランキング一覧。Claude Code で取得した結果をどう見せるかの参考に
- 大学進学率ランキング — 教育系の代表指標。e-Stat の「学校基本調査」を使う例として Part 6 で扱う予定
次回 Part 2 でお会いしましょう。claude と打って、e-Stat の世界を一緒に開拓していきます。