この記事はGeminiが下書きをして、Claude Codeが修正して、人間がレビューして作成しました。

日本のオープンデータ(e-Stat や気象庁データ)を実際に取得して分析し、モダンな Web インフォグラフィックスとして提示するデモシステムを構築しました。

実際に構築したインフォグラフィックスのデモは、以下から確認できます。

本記事では、「異常気象 × フードインフレ(食料品物価)」 をテーマに、dbt + DuckDB を用いたメダリオンアーキテクチャ(Bronze / Silver / Gold)のデータ設計、産地の気温偏差と価格上昇率のラグを探索する相関分析、そして静的マート配信によるフロントエンド連携までを解説します。


1. 2026年におけるテーマ選定:異常気象とフードインフレ

2026年現在、気候変動に伴う夏季の記録的猛暑や局地的大雨は、農業生産および食料品価格に大きな影響を与えています。

本デモでは、気象庁の観測データ(月次平均気温、日別気温、1991〜2020年平年値)と、総務省統計局(e-Stat)の「小売物価統計調査」「作物統計調査」を実際に取得し、クロス分析の対象としました。単なる物価指数の時系列グラフにとどまらず、「主要産地の気温偏差(平年差)が、何ヶ月後にどの品目の価格上昇と相関するか」をラグ探索によって特定することを目的としています。

作物統計調査を実際に取得したところ、トマトの主要産地は当初の想定(群馬)ではなく熊本であることが判明しました。レタスは長野、コメ(水稲)は新潟が実際の最大産地です。この産地マッピングを誤ったまま分析を進めていたら、気温偏差と価格の対応関係そのものが成立しません。実データで裏を取ることの意味が、この一点だけでも表れています。

対象品目も一度見直しています。当初はキャベツを含めていましたが、群馬の気温偏差を確認すると2024年9月に+3.4℃という突出した高温偏差があり、そこから4ヶ月後の2025年1〜3月にキャベツ価格が前年同月比で最大+139%高騰していました。気候起因という筋書き自体はもっともらしいものの、こうした単発の大事件が65ヶ月という短いサンプルの中で相関係数を歪め、しかも翌年の前年同月比計算のベースまで狂わせていました。品目選びをやり直し、長野が突出した最大産地であるレタス(2位の茨城の2倍以上の収穫量)に差し替えています。夏場の高原レタスが猛暑で打撃を受けることは頻繁に報道されており、キャベツより気候感度の筋が通った品目だと見込んでいました。ただし、この見込みが統計的に裏付けられたわけではないことは3節で述べます 。コメは逆に、天候より備蓄や政策の影響が大きい品目をあえて残し、相関分析が誤検出しないかを確かめる対照として位置づけました。


2. dbt + DuckDB によるメダリオンアーキテクチャ設計

データパイプラインの構築には、分析用データベースとして強力な DuckDB と、データ変換のデファクトスタンダードである dbt (dbt-duckdb アダプター) を採用しました。全体の構造は メダリオンアーキテクチャ に沿って3層に分離しています。以降の節ではモデル名(stg_cpiのようなsnake_caseの名前)が個別に出てきますが、全体の依存関係は次の通りです。

[Bronze] seeds/raw_cpi_monthly, raw_weather_daily, raw_crop_production


[Silver] stg_cpi, stg_weather(クレンジングと指標算出)

    ├─ int_weather_cpi_joined(同月結合、記述用のグラフに使用)

    └─ int_weather_price_lagged(1〜6ヶ月ラグ結合、相関分析に使用)


[Gold]  mart_weather_price_correlation(品目×ラグの相関分析)
        mart_food_inflation_hero(ヒーローKPI用、相関分析の結果を参照)
        mart_item_price_history / mart_regional_weather_history(生データ推移)
        mart_category_timeline(カテゴリ別時系列)

stg_が付くモデルはSilver層(型統一と指標算出)、int_が付くモデルはSilver層とGold層をつなぐ中間テーブル、mart_が付くモデルがGold層(フロントエンドが直接読むデータマート)です。

Bronze層:実データ取得の壁

Bronze層は、e-Stat APIと気象庁のデータをそのまま取り込む層です。ここが最も手間のかかった部分でした。

e-Stat APIの時間範囲パラメータ(cdTimeFrom/cdTimeTo)は、YYYYMM形式では正しく機能せず、YYYY00MMMMという独自の時間コード形式(例: 2021年1月なら2021000101)を渡す必要があります。短縮形式で指定すると、エラーにはならずに黙って別の範囲のデータが返ってくる ため、取得したデータの月数を検証して初めて気づきました。

気象庁は、e-Statの小売物価統計調査のようなREST APIを過去の観測データについては公開していません。今回は気象庁のサイトに掲載されている月別・日別の観測ページの値を用い、月次の平均気温と降水量、猛暑日(日最高気温35℃以上)の日数を取得しました。

気温偏差(平年差)は、気象庁が公式に配布している1991〜2020年平年値の一括ZIPファイル(地点ごとの固定長CSV)をパースし、実測値との差分として算出しています。取得スクリプトの開発中には、未来月や欠測月の値がfloat('nan')に変換されて例外処理をすり抜け、存在しない月のデータを取得しようとしてクラッシュする不具合も踏みました。NaNは!=比較が常にFalseになる性質を利用して明示的に除外する必要があります。

Bronze層で実際にハマったこと
  • e-Stat APIの時間範囲はYYYYMMでは通らず、YYYY00MMMM形式が必要(しかもエラーにならず黙って別範囲を返す)
  • 気象庁は過去の観測データ向けREST APIを公開していないため、サイト掲載の観測値を直接参照する必要がある
  • float('nan')!=比較が常にFalseになるため、欠測値を弾く例外処理をすり抜けてクラッシュの原因になる

Silver層:クレンジングと指標の算出

dbtモデルでクレンジングと指標算出を行います。

  • 気象データstg_weather): 型キャストのみ。気温偏差自体はBronze層の取得スクリプトで平年値と突き合わせ済みです。
  • 物価データstg_cpi): e-Statから取得するのは生の小売価格(円)のみです。ここでdbtのウィンドウ関数を使い、品目ごとに最初の観測月を100とした指数化と、lag(price_yen, 12)による前年同月比を実際に計算しています。
  • ラグ結合int_weather_price_lagged): 品目ごとの産地気温偏差を、DuckDBのrange(1,7)で生成した1〜6ヶ月のラグそれぞれで価格上昇率と突き合わせた縦持ちテーブルです。

Gold層:ラグ探索による相関分析

mart_weather_price_correlationが本デモの分析上の核です。品目×ラグの組み合わせごとにDuckDBのcorr()集約関数でピアソン相関係数を算出し、絶対値が最大のラグを「最適ラグ」として特定します。相関係数の強さから品目を「感度:高/中/低」に分類し、mart_food_inflation_heroはこの分類を参照する形に改めました(従来は気温偏差の生値にマジックナンバーの閾値を当てただけの分類でした)。


3. 統計的検証:相関は本当に意味があるのか

相関係数を出すだけでは、それがたまたまの偏りなのか、意味のある関係なのか判断できません。実データでの最適ラグの結果は次の通りです。

品目最適ラグ相関係数 r観測数
トマト4ヶ月0.41853
レタス4ヶ月0.26553
コメ1ヶ月0.09152

検定に使う用語を先に整理しておきます。

相関係数 (r)

-1〜+1の値を取り、2つの変数がどれだけ直線的に関連して動くかを表す指標です。0に近いほど無関係、絶対値が1に近いほど強い相関を意味します。

p値

観測された相関が「本当は無関係なのに偶然生じただけ」である確率です。一般に0.05未満であれば統計的に有意とみなします。

Bonferroni補正

同じデータに対して何度も検定を繰り返すと、偶然「有意」に見える結果が出やすくなります。比較した回数分だけp値を厳しく(大きく)補正する手法で、本記事では品目ごとに6通りのラグを比較したためp値を6倍しています。

決定係数 (R²)

相関係数を2乗した値で、価格変動のうち気温偏差だけで説明できる割合を表します。R²=0.175なら、説明できているのは約17.5%です。

トマトのr=0.418についてt検定を行うとp=0.0019で有意でした。ただし品目ごとに1〜6ヶ月の6通りのラグを試して最良のものを選んでいるため、多重比較の影響を疑う必要があります。Bonferroni補正(p値を6倍)をかけてもp=0.011で有意性は残りました。月次の時系列データは前月との連続性を持つため、標準的なt検定が前提とする独立性も怪しんでよいところです。1ヶ月前の値との自己相関(ラグ1自己相関)から実効サンプルサイズを概算して再計算しても、p=0.0045で結論は変わりませんでした。外れ値への頑健性を見るためにピアソン相関をスピアマン順位相関に置き換えても、トマトはρ=0.344(p=0.012)で有意なままです。

レタスのr=0.265は、素のt検定でp=0.055と有意水準のすぐ外側でした。長野の高原レタスが猛暑で打撃を受けるという実例は報道でよく見かけますが、この65ヶ月のデータだけからは統計的に裏付けられませんでした 。多重比較補正後はp=0.332、自己相関補正後もp=0.075で、いずれも有意ではありません。キャベツで見られたような単年の異常値による歪みはレタスにはなく、これは外れ値に振り回された結果ではなく、素直に「弱い相関」と読むべき数字です。もっともらしい実例が必ずしも統計的に検出できるとは限らないという、そのままの結果です。

コメの相関はどの検定でも有意水準に届きません 。対照として含めた狙い通り、天候より制度要因が支配的な品目まで相関ありと誤判定することはありませんでした。

トマトの相関はこれらの検証を通じて崩れませんでしたが、決定係数はR²=0.175です。気温偏差だけでトマト価格の変動の2割弱しか説明できておらず、残りは流通コストや他産地の作柄など気候以外の要因によるものです。相関があることと、それが価格変動の主要因であることは別の主張であり、本デモが示せているのは前者までです。

3節のまとめ

トマト(r=0.418、4ヶ月ラグ)は多重比較補正・自己相関補正・順位相関のいずれを通しても有意でした。レタス(r=0.265)とコメ(r=0.091)は、いずれの検定でも有意水準に届いていません。「もっともらしい仮説」と「統計的に裏付けられた結果」は別物として扱っています。

読者

キャベツからレタスに差し替えたのに、結局統計的には有意じゃなかったんですね……。

AI

そうなんです。高原レタスが猛暑に弱いという話自体はもっともらしいのですが、今回の65ヶ月のデータではそこまで裏付けが取れませんでした。仮説が外れたことも含めてそのまま報告するようにしています。


4. 静的マート配信によるフロントエンド連携

Webフロントエンドとの連携には、「dbtビルド時にGold層から静的JSONファイルを出力し、CDN経由で配信する構成(静的マート配信)」 を採用しました。

  • Webサーバー/DBサーバーが不要: バックエンドを常時稼働させる必要がなく、静的ホスティングで完結します。
  • 高速なページロード: クライアントは軽量なJSONをfetchするだけです。
  • 運用コストの最小化: データ更新時にdbtビルドと成果物のデプロイだけで完了します。

5つのGoldマート(ヒーローKPI、カテゴリ別時系列、相関分析、品目別価格推移、産地別気象推移)をJSONとしてエクスポートし、フロントエンドはこれらをfetchして描画します。マートのitem_nameprefecture_nameなどのフィールドは内部的に英語のまま保持し、表示側のJavaScriptで日本語に変換する構成にしています。データ層のポータビリティと、表示の自然な日本語を両立させるためです。


5. モダン・インフォグラフィックスUIデザイン

デモサイト向けに、ビジュアルの美しさと視認性を両立させたデザインを構築しました。

  • Glassmorphism UI: 深みのあるダークブルーグレー(#0a0d14)の背景に、半透明のガラス風カード(backdrop-filter: blur)を配置しています。
  • ヒーローKPIスナップショット: 気候感度が統計的に確認できた品目に絞り込んだ最大値上がり率、その産地の最大気温偏差、最良ラグでの相関係数を、実データから動的に算出して提示します。コメのように制度要因で価格が動く品目が、気候起因の値上がりとして前面に出ないようにしています。
  • 気候感度分析: 品目ごとの最適ラグと相関係数を表とグラフで示し、ラグの意味や相関と因果の違いについての説明も添えています。
  • 生データ推移: 相関分析のもとになった品目別価格指数と産地別気温偏差を、加工せずそのまま時系列グラフで公開しています。分析結果だけでなく元データも見せることで、検証可能性を確保する狙いです。

今後の展望と拡張計画

本データパイプラインおよびUIは、複数テーマに柔軟に拡張できるようコンポーネント化されています。今後は以下のテーマの追加を予定しています。

  1. 2026年 労働力シフト&地方自治体インフラ・空き家リスク分析: 国勢調査および地方財政統計を結合し、GeoJSONを用いた3D Hexbin地図で可視化。
  2. インバウンド消費・オーバーツーリズム × 地域経済波及効果: 宿泊旅行統計と人流データを掛け合わせた地域波及効果の分析。

これらのテーマ追加に伴い、ダッシュボード上で動的にテーマとカラーパレットを切り替えられるマルチビューアー機能も実装していく予定です。あわせて、対象期間が65ヶ月と短いために単年の異常値が相関係数を歪めやすい問題(キャベツで実際に遭遇しました)への対処や、レタスのように相関が弱く出た品目について観測期間を延ばした場合に結果がどう変わるかの追跡も、今後の課題として残っています。


本記事で紹介したインフォグラフィックスのデモは、以下から確認できます。