top of page
MSL

e-Stat API × Google Apps Script × Looker Studioで家計支出の可視化ダッシュボードを自作する手順

はじめに


政府が公開する統計データは、社会の動向を理解するための貴重な情報源です。特に「e-Stat」は、日本の統計データを網羅した巨大なデータベースであり、その多くがAPI経由でアクセス可能です。

e-statのサイト
e-statのサイト

本記事では、このe-Stat APIを活用し、Googleの無料ツール群(Google Apps Script, スプレッドシート, Looker Studio)と連携させることで、「家計調査」の品目別支出データをインタラクティブに分析できるWebダッシュボードを開発するまでの全手順を、技術的な観点から解説します。


完成したダッシュボードはこちらです。 https://www.mslabo.org/ref/house-outgoing



アーキテクチャ概要


今回のシステムは、以下の非常にシンプルなサーバーレスアーキテクチャで構成されています。

  1. データソース: e-Stat API (家計調査 家計収支編)

  2. ETL/データストア: Google Apps Script (GAS) / Google スプレッドシート

  3. 可視化/フロントエンド: Looker Studio (旧データポータル)

定期実行トリガーを設定すれば、月次のデータ更新にも自動で追従可能な、低コストでメンテナンス性の高いシステムです。


Step 1: e-Stat APIキーの取得


何よりもまず、e-Stat APIを利用するための認証キーを取得します。これは無料で、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ツールで最も扱いやすい形式です。


GASで取得したGoogle スプレッドシート
GASで取得したGoogle スプレッドシート

  • データソース接続

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

Looker Studioとスプレッドシートの連携
Looker Studioとスプレッドシートの連携
  • データ型の確認

    • 時間軸(月次)フィールドの型を「日付 > 年月」に、value(支出金額)を「数値」に設定します。

  • インタラクティブ機能の実装:

    • 品目セレクター

      • 「コントロールを追加」→「プルダウンリスト」を配置し、「コントロールフィールド」に品目分類を指定するだけで、ユーザーが品目を選択できる機能が完成します。

    • 時系列グラフ

      • 「グラフを追加」→「時系列グラフ」を配置。「期間ディメンション」にtime_code、「指標」にvalue、そして「内訳ディメンション」に品目分類を指定します。この「内訳ディメンション」が、選択された品目ごとに線を自動で描き分けるための鍵となります。

編集途中のLooker Studio
編集途中の

Step 4: Webサイトへの埋め込み


レポートが完成したら、右上の「共有」から一般公開設定(リンクを知っている全員が閲覧可)を行い、「ファイル」→「レポートを埋め込む」から<iframe>コードを取得します。 このコードを任意のHTMLに貼り付けるだけで、Webサイトへの埋め込みは完了です。


まとめ


e-Stat APIとGoogleの無料ツール群を組み合わせることで、専門的なインフラや高度なプログラミングスキルがなくても、アイデア次第で価値のあるデータ可視化サービスを迅速に構築できます。今回のプロジェクトが、政府のオープンデータを活用した新たな開発のきっかけとなれば幸いです。

(C) 株式会社マーケティングサイエンスラボ

(C) MSL,2020-2025

bottom of page