e-Stat API × Google Apps Script × Looker Studioで家計支出の可視化ダッシュボードを自作する手順
- 本間 充/マーケティングサイエンスラボ所長
- 5 日前
- 読了時間: 5分
はじめに
政府が公開する統計データは、社会の動向を理解するための貴重な情報源です。特に「e-Stat」は、日本の統計データを網羅した巨大なデータベースであり、その多くがAPI経由でアクセス可能です。
本記事では、このe-Stat APIを活用し、Googleの無料ツール群(Google Apps Script, スプレッドシート, Looker Studio)と連携させることで、「家計調査」の品目別支出データをインタラクティブに分析できるWebダッシュボードを開発するまでの全手順を、技術的な観点から解説します。
完成したダッシュボードはこちらです。 https://www.mslabo.org/ref/house-outgoing
アーキテクチャ概要
今回のシステムは、以下の非常にシンプルなサーバーレスアーキテクチャで構成されています。
データソース: e-Stat API (家計調査 家計収支編)
ETL/データストア: Google Apps Script (GAS) / Google スプレッドシート
可視化/フロントエンド: Looker Studio (旧データポータル)
定期実行トリガーを設定すれば、月次のデータ更新にも自動で追従可能な、低コストでメンテナンス性の高いシステムです。
Step 1: e-Stat APIキーの取得
何よりもまず、e-Stat APIを利用するための認証キーを取得します。これは無料で、e-Statのサイトから数分で完了します。
ユーザー登録
e-Statのユーザ登録ページからアカウントを作成します。
アプリケーションIDの発行
ログイン後、マイページのAPI機能ページにて、利用するアプリケーションを登録し、「アプリケーションID (appId)」を取得します。これがAPIリクエスト時の認証キーとなります。
Step 2: Google Apps Scriptによるデータ取得
次に、取得したappIdを使い、スプレッドシートからAPIを呼び出すプログラムを作成します。今回は、スプレッドシートに直接紐づいたサーバーサイドJavaScript環境であるGoogle Apps Script (GAS) を利用します。
e-Stat APIにはいくつかのクセがありましたが、最終的に以下の仕様で安定したデータ取得が可能であることが判明しました。
エンドポイント
getSimpleStatsData を利用。CSV形式でデータを返す。
品目コード
複数品目を一度にリクエストする場合、cdCat01パラメータにカンマ区切りで指定可能。
必須パラメータ
appId, statsDataId, cdCat01 の3つが基本。他のパラメータ(cdCat02やcdTabなど)は、この統計表(0004023601)では不要。
以下に、この仕様に基づいて、「指定した品目リストの全期間データを取得し、スプレッドシートに書き出す」ための、最もシンプルなGASコードを公開します。
// ===================================================================================
// ★★★ e-Stat APIから家計調査データを取得し、スプレッドシートに書き出す基本コード ★★★
// ===================================================================================
/**
* メイン関数:この関数を実行します。
*/
function fetchDataFromEstat() {
// --- ユーザー設定 ---
const CONFIG = {
// 1. e-Statで取得したご自身のアプリケーションID
APP_ID: 'ここにあなたのappIdを入力してください',
// 2. 取得したい統計表ID (家計調査 家計収支編 二人以上の世帯)
STATS_DATA_ID: '0004023601',
// 3. 結果を書き出すシート名
OUTPUT_SHEET_NAME: 'e-Stat生データ',
// 4. 取得したい品目の「正式なコード」。e-Statサイトで調べて追加してください。
ITEM_CODES: [
'010130010', // 生うどん・そば
'010130020', // 乾うどん・そば
'010130030', // パスタ
'010130040', // 中華麺
'010130050', // カップ麺
'010130060', // 即席麺
'010130070', // 他の麺類
'010120010' // 食パン
]
};
// --------------------
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const CHUNK_SIZE = 50; // APIのURL文字数制限を避けるため、50件ずつに分割してリクエスト
const allApiDataRows = [];
// 取得したCSVのヘッダーを定義
const header = ["tab_code","表章項目","cat01_code","品目分類","cat02_code","世帯区分","area_code","地域区分","time_code","時間軸(月次)","unit","value","annotation"];
allApiDataRows.push(header);
// 品目リストをチャンクに分割してループ処理
for (let i = 0; i < CONFIG.ITEM_CODES.length; i += CHUNK_SIZE) {
const chunk = CONFIG.ITEM_CODES.slice(i, i + CHUNK_SIZE);
Logger.log(`${i / CHUNK_SIZE + 1}回目のAPIリクエストを実行中...`);
const csvText = fetchCsv_(CONFIG.APP_ID, CONFIG.STATS_DATA_ID, chunk.join(','));
if (csvText) {
const parsedCsv = Utilities.parseCsv(csvText);
// 応答からデータ行だけをフィルタリングして追加
const dataRows = parsedCsv.filter(row => row[0] === '01' && row[1] === '金額' && row[7] === '全国');
allApiDataRows.push(...dataRows);
}
Utilities.sleep(500); // サーバー負荷軽減のため0.5秒待機
}
Logger.log(`全${allApiDataRows.length - 1}行の生データを取得しました。シートに書き込みます...`);
// シートに書き出し
let outputSheet = spreadsheet.getSheetByName(CONFIG.OUTPUT_SHEET_NAME);
if (!outputSheet) {
outputSheet = spreadsheet.insertSheet(CONFIG.OUTPUT_SHEET_NAME);
}
outputSheet.clear();
outputSheet.getRange(1, 1, allApiDataRows.length, allApiDataRows[0].length).setValues(allApiDataRows);
Logger.log(`「${CONFIG.OUTPUT_SHEET_NAME}」シートへの書き込みが完了しました。`);
}
/**
* 【補助関数】APIを呼び出してCSVテキストを取得する
*/
function fetchCsv_(appId, statsDataId, itemCodesCsv) {
const baseUrl = 'http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsData';
const params = [
`appId=${appId}`, `statsDataId=${statsDataId}`, `cdCat01=${itemCodesCsv}`,
'lang=J', 'metaGetFlg=Y', 'cntGetFlg=N', 'explanationGetFlg=Y',
'annotationGetFlg=Y', 'sectionHeaderFlg=1', 'replaceSpChars=0'
].join('&');
const url = `${baseUrl}?${params}`;
try {
const response = UrlFetchApp.fetch(url, {'muteHttpExceptions': true});
const responseText = response.getContentText();
if (response.getResponseCode() !== 200) {
Logger.log(`APIリクエストが失敗しました。 Status: ${response.getResponseCode()}`);
return null;
}
return responseText;
} catch (e) {
Logger.log(`APIリクエストでエラーが発生しました: ${e.toString()}`);
return null;
}
}
Step 3: Looker Studioでの可視化
GASで取得したデータは、各品目が縦に並ぶ「ロング形式」になっています。これはLooker StudioのようなBIツールで最も扱いやすい形式です。

データソース接続
Looker Studioで新規レポートを作成し、データソースとして先ほどGASでデータを出力したスプレッドシートのシートを選択します。

データ型の確認
時間軸(月次)フィールドの型を「日付 > 年月」に、value(支出金額)を「数値」に設定します。
インタラクティブ機能の実装:
品目セレクター
「コントロールを追加」→「プルダウンリスト」を配置し、「コントロールフィールド」に品目分類を指定するだけで、ユーザーが品目を選択できる機能が完成します。
時系列グラフ
「グラフを追加」→「時系列グラフ」を配置。「期間ディメンション」にtime_code、「指標」にvalue、そして「内訳ディメンション」に品目分類を指定します。この「内訳ディメンション」が、選択された品目ごとに線を自動で描き分けるための鍵となります。

Step 4: Webサイトへの埋め込み
レポートが完成したら、右上の「共有」から一般公開設定(リンクを知っている全員が閲覧可)を行い、「ファイル」→「レポートを埋め込む」から<iframe>コードを取得します。 このコードを任意のHTMLに貼り付けるだけで、Webサイトへの埋め込みは完了です。
まとめ
e-Stat APIとGoogleの無料ツール群を組み合わせることで、専門的なインフラや高度なプログラミングスキルがなくても、アイデア次第で価値のあるデータ可視化サービスを迅速に構築できます。今回のプロジェクトが、政府のオープンデータを活用した新たな開発のきっかけとなれば幸いです。