Lesson 05

14日豪雨ヒートマップ — 2024 広島豪雨の空間×時間構造

v2-rewrite基礎選択時系列空間集約ヒートマップ
所要 100分 / 想定レベル: リテラシ基礎〜応用基礎 / データ: DoBoX #1275 雨量10分値 (14日 × 約280観測所) + #1276 (事務所メタのみ)

学習目標

使用データ

14日分の CSV は 各日が独立した 1 ファイル なので、リソース ID も日ごとに違う。 本スクリプトは下記の RAIN_RID 辞書 (14 リソース) を使って ensure_dataset() で並列に取得する。

データ取得手順

論題データセットDL保存先形式サイズ
雨量10分値 2024-06-29DoBoX #1275直DLdata/rain_2024/rain_2024-06-29.csvCSV (5段ヘッダ, 10分値)1.0〜1.4 MB
雨量10分値 2024-06-30DoBoX #1275直DLdata/rain_2024/rain_2024-06-30.csvCSV (5段ヘッダ, 10分値)1.0〜1.4 MB
雨量10分値 2024-07-01DoBoX #1275直DLdata/rain_2024/rain_2024-07-01.csvCSV (5段ヘッダ, 10分値)1.0〜1.4 MB
雨量10分値 2024-07-02DoBoX #1275直DLdata/rain_2024/rain_2024-07-02.csvCSV (5段ヘッダ, 10分値)1.0〜1.4 MB
雨量10分値 2024-07-03DoBoX #1275直DLdata/rain_2024/rain_2024-07-03.csvCSV (5段ヘッダ, 10分値)1.0〜1.4 MB
雨量10分値 2024-07-04DoBoX #1275直DLdata/rain_2024/rain_2024-07-04.csvCSV (5段ヘッダ, 10分値)1.0〜1.4 MB
雨量10分値 2024-07-05DoBoX #1275直DLdata/rain_2024/rain_2024-07-05.csvCSV (5段ヘッダ, 10分値)1.0〜1.4 MB
雨量10分値 2024-07-06DoBoX #1275直DLdata/rain_2024/rain_2024-07-06.csvCSV (5段ヘッダ, 10分値)1.0〜1.4 MB
雨量10分値 2024-07-07DoBoX #1275直DLdata/rain_2024/rain_2024-07-07.csvCSV (5段ヘッダ, 10分値)1.0〜1.4 MB
雨量10分値 2024-07-08DoBoX #1275直DLdata/rain_2024/rain_2024-07-08.csvCSV (5段ヘッダ, 10分値)1.0〜1.4 MB
雨量10分値 2024-07-09DoBoX #1275直DLdata/rain_2024/rain_2024-07-09.csvCSV (5段ヘッダ, 10分値)1.0〜1.4 MB
雨量10分値 2024-07-10DoBoX #1275直DLdata/rain_2024/rain_2024-07-10.csvCSV (5段ヘッダ, 10分値)1.0〜1.4 MB
雨量10分値 2024-07-11DoBoX #1275直DLdata/rain_2024/rain_2024-07-11.csvCSV (5段ヘッダ, 10分値)1.0〜1.4 MB
雨量10分値 2024-07-12DoBoX #1275直DLdata/rain_2024/rain_2024-07-12.csvCSV (5段ヘッダ, 10分値)1.0〜1.4 MB
雨量年集計 (事務所メタの参照)DoBoX #1276ページから DL ボタンdata/extras/rainfall_annual.csvCSV (多段ヘッダ)約 500 KB

個別取得(PowerShell, このレッスンだけ):

cd "2026 DoBoX 教材"
iwr "https://hiroshima-dobox.jp/resource_download/94490" -OutFile "data/rain_2024/rain_2024-06-29.csv"
iwr "https://hiroshima-dobox.jp/resource_download/94495" -OutFile "data/rain_2024/rain_2024-06-30.csv"
iwr "https://hiroshima-dobox.jp/resource_download/94500" -OutFile "data/rain_2024/rain_2024-07-01.csv"
iwr "https://hiroshima-dobox.jp/resource_download/94505" -OutFile "data/rain_2024/rain_2024-07-02.csv"
iwr "https://hiroshima-dobox.jp/resource_download/94510" -OutFile "data/rain_2024/rain_2024-07-03.csv"
iwr "https://hiroshima-dobox.jp/resource_download/94515" -OutFile "data/rain_2024/rain_2024-07-04.csv"
iwr "https://hiroshima-dobox.jp/resource_download/94520" -OutFile "data/rain_2024/rain_2024-07-05.csv"
iwr "https://hiroshima-dobox.jp/resource_download/94525" -OutFile "data/rain_2024/rain_2024-07-06.csv"
iwr "https://hiroshima-dobox.jp/resource_download/94530" -OutFile "data/rain_2024/rain_2024-07-07.csv"
iwr "https://hiroshima-dobox.jp/resource_download/94535" -OutFile "data/rain_2024/rain_2024-07-08.csv"
iwr "https://hiroshima-dobox.jp/resource_download/94540" -OutFile "data/rain_2024/rain_2024-07-09.csv"
iwr "https://hiroshima-dobox.jp/resource_download/94545" -OutFile "data/rain_2024/rain_2024-07-10.csv"
iwr "https://hiroshima-dobox.jp/resource_download/94551" -OutFile "data/rain_2024/rain_2024-07-11.csv"
iwr "https://hiroshima-dobox.jp/resource_download/94556" -OutFile "data/rain_2024/rain_2024-07-12.csv"

一括取得(全レッスン共通, 推奨):

cd "2026 DoBoX 教材"
py -X utf8 data\fetch_all.py

fetch_all.py はカタログ・追加データを data/data/extras/ に再現可能ダウンロード。DoBoX のオープンデータは申請不要、商用・非商用とも利用可。本レッスンの .py スクリプトは、データが無ければ自動取得してから処理を始めるよう実装されていますensure_dataset() ヘルパ)。

取得スクリプト内蔵: 本レッスンの L05_14days_heavy_rain.py は、 RAIN_RID 辞書 (14 日分) を使って ensure_dataset() ヘルパで 14ファイル+1メタを順次自動DLします。 HTML を読んで PowerShell で個別取得しても、fetch_all.py で一括取得しても、結果は同じです。

スクリプト(全体ソースコード)

⬇ L05_14days_heavy_rain.py

cd "2026 DoBoX 教材"
python -X utf8 lessons/L05_14days_heavy_rain.py

方法

  1. 14 リソース ID で 14 ファイル取得: RAIN_RID = {"2024-06-29": 94490, ..., "2024-07-12": 94556}ensure_dataset(resource_id=...) でループ DL
  2. 各日CSVを tidy 化: parse_rain_csv() (年度差分対応) で (時刻 × 観測所) の 10 分値 DataFrame に
  3. 日合計に集約: tidy.sum(axis=0, min_count=1) で観測所ごとの日合計 Series
  4. 14日分を横結合: pd.concat([...], axis=1)(観測所 × 日) マトリクス M
  5. 事務所メタの結合: rainfall_annual.csv の 0 行目(事務所名) と 4 行目(観測所名) から {station: office} 辞書を構築
  6. 5 種類の可視化: 全観測所ヒートマップ / 上位10 small multiples / 事務所×日 集約ヒートマップ / 日別代表値ピラミッド+雨域広がり / 14日合計 ECDF
  7. サマリ表: 期間/観測所数/ピーク日/最大観測所/分位点 を 1 表に集約

コード解説

L05_14days_heavy_rain.py 行 371–501

 1
 2
 3
 4
 5
 6
 7
 8
 9
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
from pathlib import Path
import pandas as pd, numpy as np
import matplotlib.pyplot as plt
from _common import parse_rain_csv, ensure_dataset

# === (0) 14リソース ID で 14日分を順次DL ===
RAIN_RID = {
    "2024-06-29": 94490, "2024-06-30": 94495, "2024-07-01": 94500,
    "2024-07-02": 94505, "2024-07-03": 94510, "2024-07-04": 94515,
    "2024-07-05": 94520, "2024-07-06": 94525, "2024-07-07": 94530,
    "2024-07-08": 94535, "2024-07-09": 94540, "2024-07-10": 94545,
    "2024-07-11": 94551, "2024-07-12": 94556,
}
for date, rid in RAIN_RID.items():
    ensure_dataset(f"data/rain_2024/rain_{date}.csv",
                   resource_id=rid, min_bytes=500_000)

# === (1) 14日分を 観測所×日 マトリクスに ===
files = sorted(Path("data/rain_2024").glob("rain_2024-*.csv"))
daily_series = []
for f in files:
    tidy  = parse_rain_csv(f)               # (時刻 × 観測所) 10分値
    daily = tidy.sum(axis=0, min_count=1)   # 観測所ごとの日合計
    daily.name = pd.Timestamp(f.stem.replace("rain_", ""))
    daily_series.append(daily)
M = pd.concat(daily_series, axis=1)         # (観測所 × 14日)
M_filled = M.fillna(0.0)

# === (2) 観測所→事務所 マップ (空間グルーピング用) ===
ra = pd.read_csv("data/extras/rainfall_annual.csv",
                 header=None, encoding="utf-8-sig")
office_map = dict(zip(ra.iloc[4, 1:].astype(str),   # 観測所名
                      ra.iloc[0, 1:].astype(str)))  # 事務所名

# === (3) 14日合計で観測所をランク付け → ヒートマップ ===
station_total = M_filled.sum(axis=1).sort_values(ascending=False)
disp = M.loc[station_total.index]   # 上=多雨, 下=少雨
plt.imshow(disp.values, aspect="auto", cmap="YlOrRd",
           vmin=0, vmax=np.nanpercentile(M.values, 99.5))

# === (4) 上位10観測所 small multiples (2x5) ===
top10 = station_total.head(10).index
fig, axes = plt.subplots(2, 5, figsize=(15, 6.2),
                         sharex=True, sharey=True)
for ax, name in zip(axes.ravel(), top10):
    ax.bar(range(14), M.loc[name].fillna(0).values, color="#0969da")

# === (5) 事務所×日 集約ヒートマップ (空間集約) ===
M_office = pd.Series({c: office_map.get(c, "(不明)") for c in M.index})
office_M = (M_filled.groupby(M_office.values).mean())  # 事務所平均/日

# === (6) 日別 県全体 ピラミッド (代表値の使い分け) ===
day_stats = pd.DataFrame({
    "max":    M_filled.max(axis=0),
    "top5":   M_filled.apply(lambda s: s.nlargest(5).mean(), axis=0),
    "p90":    M_filled.quantile(0.90, axis=0),
    "median": M_filled.median(axis=0),
})

# === (7) 観測所別14日合計 ECDF ===
totals = station_total.values
xs = np.sort(totals)
ys = np.arange(1, len(xs)+1) / len(xs)
plt.plot(xs, ys)             # 重い裾を見る
plt.axvline(np.quantile(totals, 0.99))   # 99%点

結果

全観測所(n=401) × 14日 ヒートマップ。縦軸は14日合計の多い順。縦に走る濃い帯=県全域に降った日、点状の濃さ=局所豪雨を示す
全観測所(n=401) × 14日 ヒートマップ。縦軸は14日合計の多い順。縦に走る濃い帯=県全域に降った日、点状の濃さ=局所豪雨を示す
14日合計上位10観測所の日次バー (赤=各観測所のピーク日)。ピーク日が06-30〜07-01に集中する観測所と07-08〜07-10にずれる観測所がある
14日合計上位10観測所の日次バー (赤=各観測所のピーク日)。ピーク日が06-30〜07-01に集中する観測所と07-08〜07-10にずれる観測所がある
事務所(=地域区分)×日 の平均日雨量ヒートマップ。観測所280点を10程度の事務所に集約することで、雨域の南北・東西の動きが読める
事務所(=地域区分)×日 の平均日雨量ヒートマップ。観測所280点を10程度の事務所に集約することで、雨域の南北・東西の動きが読める
上: 日別の代表値ピラミッド (赤バー=県内最大, 橙=上位5平均, 緑=90%点, 青=中央値)。下: 有雨観測所数 (>0mm)。同じ日でも代表値ごとに様相が違う
上: 日別の代表値ピラミッド (赤バー=県内最大, 橙=上位5平均, 緑=90%点, 青=中央値)。下: 有雨観測所数 (>0mm)。同じ日でも代表値ごとに様相が違う
14日合計の経験累積分布。緑=中央値・橙=90%点・赤=99%点。右へ伸びる重い裾=ごく一部の観測所が極端に多雨
14日合計の経験累積分布。緑=中央値・橙=90%点・赤=99%点。右へ伸びる重い裾=ごく一部の観測所が極端に多雨

期間サマリ

対象期間2024-06-29 〜 2024-07-12 (14日)
観測所数401 観測所
事務所数(地域区分)10
14日 県全体総雨量92,402 mm (観測所×日 の合計)
ピーク日(県内最大)07-01 (173 mm)
ピーク日 最大観測所矢草(砂防)
14日合計 最多観測所小瀬川ダム (406 mm)
14日合計 中央値225 mm
14日合計 90%点291 mm
14日合計 99%点366 mm

14日合計 上位10観測所

観測所 事務所 14日合計(mm) ピーク日 ピーク値(mm)
小瀬川ダム 廿日市支所 406.0 07-01 167.0
中道(国) 廿日市支所 397.0 07-01 135.0
矢草(砂防) 廿日市支所 378.0 07-01 173.0
頓原 治山雨量 375.0 07-10 99.0
馬の口 廿日市支所 366.0 07-01 168.0
津田(国) 廿日市支所 366.0 07-01 141.0
堂免橋 西部建設 356.0 07-01 100.0
野貝原(砂防) 廿日市支所 347.0 07-01 141.0
坊主山 治山雨量 337.0 07-10 103.0
栗栖 廿日市支所 335.0 07-01 117.0

考察

発展課題

  1. 10 分粒度のままヒートマップを描く: 日合計に潰さず、(観測所 × 144スロット × 14日) の 3 次元配列を時間軸に並べた長尺ヒートマップで 線状降水帯の通過を可視化する。matplotlib の imshow でも 280 × 2016 = 56 万セル程度なら十分扱える。
  2. 事務所地域 → 緯度経度マップ: 観測所の位置情報 (DoBoX #1275 の観測所諸元 or 国交省 XRAIN メタ) を結合し、folium で 14日合計の色付き円マーカー をプロットする。本レッスンは事務所単位の集約で代用したが、座標があれば真の空間ヒートマップに格上げできる。
  3. 豪雨日の「同時性」検定: 2024-07-01 と 2024-07-10 で多雨の観測所がどれだけ重なるか、Jaccard 係数Spearman 順位相関で評価。広域前線型と局所型で「上位観測所の入れ替わり」がどれだけ起きるかを定量化する。
  4. ECDF の片対数プロット → 裾指数推定: ECDF の生存関数 1-F(x) を log-log でプロットし、裾部分が直線にのるか検査。直線なら パレート分布、降雨の極値統計 (GEV, GPD) との接続。L210 の極値解析と接続する。
  5. 過去年度との比較: 同じ DoBoX #1275 で 2018年豪雨期間 (2018-07-04 〜 07-08) のリソースを取得し、2024年豪雨と比較する。観測所数・地点・代表値の違いを直接議論できる (時系列の長期トレンド観察)。