「アイスは暑い日に売れる、傘は雨の日に売れる」というのは誰でも知っていますが、自社の POS データに気象データを重ねて『先週この気温なら売上が +18%』を実証している小売はそれほど多くありません。今回は、最小構成で需要予測を始める方法を。
気象庁オープンデータの取得方法
気象庁は防災情報ページの裏側で予報・警報を で配信しており、これを実用的に活用しているサービスは多数あります(公式の「正式API」ではなく、防災ページのバックエンドJSONを利用する形です)。過去観測データ(アメダス)は別途ダウンロードサイトから取得します。利用は無料、商用も可能(出典明記必要)。
| データ | 更新頻度 | 用途 |
|---|---|---|
| 過去観測(アメダス) | 毎時 | 売上相関分析 |
| 週間予報 | 1日2回 | 1週間先の在庫計画 |
| 時間別予報 | 3時間ごと | 本日のシフト調整 |
| 気象警報 | 随時 | 営業判断(休業・短縮) |
| 季節予報 | 月次 | 中長期商品計画 |
実装:POS × 気象データの最小構成
import requestsimport pandas as pd
# area_code: 東京=130000、府県予報の地域コード# 一覧は https://www.jma.go.jp/bosai/common/const/area.json で確認できるdef fetch_forecast(area_code: str = "130000"): """気象庁の地域予報JSONを取得(公式の防災情報ページ裏側のJSON)""" url = f"https://www.jma.go.jp/bosai/forecast/data/forecast/{area_code}.json" res = requests.get(url, timeout=15, headers={"User-Agent": "hukuhuku-fetcher"}) res.raise_for_status() return res.json()
def find_temps(forecast: list) -> list[dict]: """JMA の forecast JSON は2要素の配列で、index=0=直近3日、index=1=週間予報。 各要素は timeSeries 配列を持ち、その中の dict のうち温度を含むものを探す。 構造は地域・時期で揺れるので、kind を見て決め打ちせず探索する。""" out = [] for block in forecast: for ts in block.get("timeSeries", []): for area in ts.get("areas", []): if "temps" in area: # 直近3日 out.append({"timeDefines": ts["timeDefines"], "temps": area["temps"], "area": area["area"]["name"]}) if "tempsMin" in area or "tempsMax" in area: # 週間 out.append({ "timeDefines": ts["timeDefines"], "tempsMin": area.get("tempsMin"), "tempsMax": area.get("tempsMax"), "area": area["area"]["name"], }) return out
forecast = fetch_forecast("130000") # 東京都records = find_temps(forecast)for r in records[:5]: print(r["area"], "|", r.get("timeDefines")) if "temps" in r: print(" 3日先までの気温:", r["temps"]) if "tempsMax" in r: print(" 週間 最高/最低:", r["tempsMax"], "/", r.get("tempsMin"))需要予測モデルの設計
で予測モデル構築
自社のPOSデータと気象庁の過去観測データから、商品×店舗単位の需要予測モデルを構築してください。
## 入力
- BigQuery: `pos.daily_sales`(カラム: store_id, sku, sale_date, qty, revenue)
- 気象庁 {{api|*}}: 観測値(過去2年)+ 週間予報
## 必要な処理
1. POS と観測値の日次JOIN(店舗の地域コードでマッピング)
2. SKU × 気象(気温・降水量・湿度)の相関係数を算出
3. 強相関(|r| > 0.5)の SKU を抽出
4. 各SKUに対して線形回帰モデルを学習
5. 翌週の予報値を入れて、SKU×店舗 の推奨発注量を出力
6. 過去1年でバックテスト、MAPE 計測
## 出力
- 学習スクリプト
- 推奨発注量テーブル `mart_recommended_orders`
- バックテストレポート## 需要予測モデル 構築完了
### バックテスト結果
- 全SKU平均 MAPE: 22.4%
- 強相関SKU(|r| > 0.5)の MAPE: **8.7%**(実用レベル)
- 弱相関SKU(|r| < 0.3)の MAPE: 35%(モデル無効)
### 強相関SKU TOP 5(季節性が顕著)
1. ミネラルウォーター × 気温(r=0.78)
2. 傘 × 降水量(r=0.72)
3. アイスクリーム × 気温(r=0.68)
4. 鍋つゆ × 気温(r=-0.61)
5. ホットコーヒー × 気温(r=-0.55)
### 推奨発注量サンプル(来週東京・最高気温平均32℃想定)
- ミネラルウォーター: +35% (平年比)
- アイスクリーム: +42%
- 鍋つゆ: -28%
- ホットコーヒー: -18%
### 構築物
- `models/forecast_demand.py`
- `mart_recommended_orders` テーブル
- `reports/backtest_2026-q2.md`
PR #234 を生成しました。データ取得の留意点(2026年5月時点)
気象庁が直接「公式API」と銘打って公開しているサービスは限定的で、JSON ファイル配信(XML 電文を JSON 化したもの)が主流です。利用は 公共データ利用規約(第1.0版) に準拠。
- ライセンス: 公共データ利用規約(第1.0版) ─ 出典記載の上で再利用可。商用利用 OK。
- 出典記載: 「出典:気象庁ホームページ(URL)」を明記する。
- 更新頻度: 防災情報は「リアルタイム」配信、予報は数時間ごと。詳細は各データの仕様で確認。
- API レート制限: 公式に明示された数値制限はないが、気象庁は「商用サービスの基盤として依存しないこと」を従来から要請。本格運用には民間気象会社のAPI(ウェザーニューズ等)を推奨する流れ。
- サービス安定性: 気象庁サイトは公益インフラだが、サーバー負荷で一時的に応答しない可能性あり。本番運用ではキャッシュ・リトライ・フォールバック必須。
- 仕様変更: 配信形式・URL は予告なく変更される可能性。ニュース欄・運用情報を定期チェック。
- 民間ラッパー: 個人開発の 「気象庁 JSON 取得ライブラリ」 が に複数存在。MIT などのライセンスで利用可能だが、メンテ状況をチェック。
ホームページ利用規約: https://www.jma.go.jp/jma/kishou/info/coment.html / 防災情報XML電文形式: https://xml.kishou.go.jp/ ─ 商用利用で が必要なら、ウェザーニューズ・日本気象協会・WeatherNews API などの有償サービスへの切替を強く推奨。
次回予告
EP.04 では、国土数値情報を使った立地評価レポートの自動生成方法をお届けします。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。