Lesson 45

L45 ため池浸水想定区域 2 件統合分析 — 広島県の防災重点ため池決壊リスクを「規模属性 × 浸水範囲」で読み解く

ため池決壊シナリオ防災重点ため池西日本豪雨農業用ため池法geopandasShapefile中山間
所要 60〜90 分 / 想定レベル: リテラシ〜中級 (geopandas/CSV-Shapefile 統合/log-log スケーリング) / データ: DoBoX dataset 62, 63 (ため池基本情報 + ため池浸水想定区域情報) — CSV 1.1 MB + Shapefile 81 MB

データ取得手順

⚠️ このスクリプトは自動取得に対応していません。以下のデータセットを DoBoX から手動でダウンロードし、data/extras/ 以下に保存してください。

IDデータセット名
#62ため池基本情報
#63ため池浸水想定区域情報_Shapefile
#333dataset #333

実行コマンド:

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

DoBoX のオープンデータは申請不要・商用/非商用とも利用可。 data/extras/.gitignore 対象(約 57 GB のキャッシュ)。 スクリプト実行で自動再生成されます。

学習目標と問い

本レッスンでは、広島県オープンデータ DoBoX が公開する ため池系 2 dataset (id = 62, 63) を統合し、 広島県内の「特定農業用ため池の決壊リスクと浸水想定の構造」を分析する。

独自用語の定義 (本記事内での使用)

主 RQ (研究の問い)

広島県の特定農業用ため池 6,754 件と、その決壊時浸水想定区域 6,730 件は、 ため池の規模属性 (堤高・貯水量) と浸水範囲・市町分布でどう関係し、 「県のため池決壊リスクの地理学」はどう描けるか?

仮説 H1〜H6 (本記事で検証する)

到達点

2 dataset を ため池番号 をキーに完全結合し、規模属性と浸水想定面積を クロスして 6 仮説を量的に検証する。学習者は (a) Shapefile + CSV の異種統合、 (b) dissolve(by=...) による属性集約と unary_union による 重複排除の使い分け、(c) ため池決壊という農業×防災の交差問題のデータ表現 を体得する。

厳密性の宣言: 本記事は L4-L11 (河川浸水) ・L44 (高潮浸水) と 厳密に独立。河川浸水 (流域降雨) ・高潮浸水 (海面異常上昇) ・ ため池決壊浸水 (人工堤体破壊) は水文機構が別の災害として扱う。 L07 (浸水×インフラ統合) で dataset 62 を「インフラ施設」の 1 として既参照しているが、 本記事はため池そのものを主役に据え、Shapefile 浸水想定区域を主幾何データに用いる 新しい視点である。

使用データ

本記事は DoBoX の「ため池」関連 2 dataset を統合する:

表 (1) — 2 dataset の仕様サマリ

dataset_id シリーズ 形式 ZIP/サイズ 件数 更新 本記事での役割
62 ため池基本情報 CSV (Shift_JIS, BOM なし) 1.1 MB 6,754 行 × 12 列 2024 年版 (随時更新) ため池属性 (堤高/貯水量/緯度経度/所管市町/特定指定日)
63 ため池浸水想定区域情報_Shapefile Shapefile (.shp/.shx/.dbf/.prj/.sbn/.sbx) 81.2 MB (ZIP) / 143 MB (展開後 .shp 単体) 7,223 polygon / 6,730 unique ため池 2025-01-22 ため池ごとの決壊時下流浸水想定エリア (主幾何データ)

この表から読み取れること: (1) 形式が完全に異なる (CSV vs Shapefile) ため、統合には結合キー設計が必須。 (2) サイズは Shapefile が 100 倍以上 (1 MB → 143 MB) で、 ポリゴン幾何が支配的。CSV は属性のみだが、地理空間処理を支える「場所情報」と 「規模指標」の両方を持つ。 (3) dataset 62 のキー = ため池番号 (9 桁数字) は dataset 63 の FIELD001 列と完全一致するため、属性結合 (merge) でデータ統合できる。 (4) dataset 63 の Shapefile は 1 池に複数 polygon (浸水範囲が分断された場合) を 持つことがあり、dissolve(by="FIELD001") で 7,223 → 6,730 に集約する。

表 (2) — 結合 STEP の段階表 (要件 K Before/After)

段階 内容 サイズ/件数
STEP 0 tameike_basic.csv を読込 6,754 行 × 12 列
STEP 1 ため池浸水想定区域.shp を読込 → EPSG:6671 投影変換 7,223 polygon (元の CRS = EPSG:2445)
STEP 2 30 件の不正幾何 (自己交差等) を buffer(0) で修復 30 polygon を修復 → 7,223 polygon (有効)
STEP 3 FIELD001 (= ため池番号) で dissolve 7,223 → 6,730 ため池ポリゴン (1 池 = 1 MultiPolygon)
STEP 4 merge: CSV.ため池番号 LEFT JOIN SHP.FIELD001 6,754 行 (うち 6,730 結合成功 + 24 結合無し)
STEP 5 全 7,223 ポリゴン unary_union で「県全体 真の浸水想定面積」 単一 MultiPolygon, 面積 = 293.31 km²

この表から読み取れること: 入力 6,754 行 (CSV) が STEP 5 まで 通って union 単一 polygon (面積 293.31 km²) に至るまでの 段階的サイズ変化を示す。STEP 3 で 7,223 → 6,730 に減るのは 「1 池の浸水範囲が分断された複数 polygon」が dissolve で結合されるため、 STEP 4 で 6,754 - 6,730 = 24 件が結合無しで残るのは 「CSV にあって SHP に対応 polygon 無いため池」=分析 1 で詳細特定する

形式の詳細

ダウンロード(再現用データ・中間データ・図)

HTML から直接以下を取得できる:

(A) DoBoX 直リンク (2 dataset)

datasetカタログresource_download (直 DL)形式サイズ
62 ため池基本情報 dataset 62 直 DL (rid 90) CSV1.1 MB
63 ため池浸水想定区域情報_Shapefile dataset 63 直 DL (rid 98562) Shapefile (ZIP)81.2 MB

(B) PowerShell 一括取得 (再現用)

cd "2026 DoBoX 教材"
mkdir -Force data\extras\L45_pond_inundation
iwr "https://hiroshima-dobox.jp/resource_download/90"    -OutFile "data\extras\tameike_basic.csv"
iwr "https://hiroshima-dobox.jp/resource_download/98562" -OutFile "data\extras\L45_pond_inundation\tameike_inundation_shp.zip"
# ZIP 展開
Expand-Archive -Force "data\extras\L45_pond_inundation\tameike_inundation_shp.zip" "data\extras\L45_pond_inundation\shp"
# キャッシュビルド (~2 分, 初回のみ)
py -X utf8 lessons\_l45_build_cache.py
# 本記事スクリプト (~1 分)
py -X utf8 lessons\L45_pond_inundation.py

(C) 中間データ・図 (本記事生成物の直リンク)

分析 1: カバレッジ完全性 — CSV と SHP の重ね合わせ

狙い (RQ ↔ 仮説 H1)

2 dataset のカバレッジ差を量的に評価する。 CSV (62) は 6,754 池、SHP (63) は 7,223 polygon (= 6,730 unique 池)。 カバレッジ差 24 件は「CSV にあって SHP 無し」のため池であり、 地理的偏りがあれば「データ整備の優先度」に関する制度的事実が データから直接読める。

手法 — pandas merge LEFT JOIN による属性結合

pandas の DataFrame.merge(how='left') で CSV を主表、SHP の polygon area を従属表として結合する。 結合キー は CSV.ため池番号 = SHP.FIELD001LEFT JOIN を選んだ理由は「CSV 側を主張として残し、 SHP に対応 polygon が無い池は area_km2 が NaN になる」ことで 非カバレッジ件数がそのまま得られるため。

結合キーの設計 (要件 O STEP 分け):
  • STEP A: SHP.FIELD001 を文字列として保つ (geopandas はデフォルトで int64 にしようとするが、頭 0 が落ちる池があるため文字列のまま結合)
  • STEP B: SHP を dissolve(by="FIELD001") で 1 池 1 polygon に集約 (1 池が複数 polygon に分かれている場合があるため)
  • STEP C: CSV.ため池番号 ↔ SHP.FIELD001 で merge LEFT JOIN
  • STEP D: area_km2 が NaN の行 = 浸水想定なし のため池 24 件

実装コード

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import pandas as pd, geopandas as gpd
from pathlib import Path

CACHE = Path("data/extras/L45_pond_inundation/_cache")

# (1) ため池基本情報 (CSV) を読込, 数値列は to_numeric
df = pd.read_csv("data/extras/tameike_basic.csv", dtype=str)
df.columns = [c.strip() for c in df.columns]
df["ため池番号"] = df["ため池番号"].str.strip()
df["堤高_m"]      = pd.to_numeric(df["堤高(m)"],   errors="coerce")
df["貯水量_千m3"] = pd.to_numeric(df["貯水量(千m3)"], errors="coerce")

# (2) 浸水想定 SHP は事前 dissolve 済 GPKG (= ため池ごと 1 polygon) を読込
diss = gpd.read_file(CACHE / "diss_per_pond.gpkg")
# diss["FIELD001"] が結合キー, diss["area_km2"] が浸水想定面積

# (3) LEFT JOIN: 結合無しは area_km2 = NaN として残る
merge = df.merge(
    diss[["FIELD001", "area_km2"]],
    left_on="ため池番号", right_on="FIELD001",
    how="left",
)
merge["has_inund"] = merge["area_km2"].notna()

# (4) 浸水想定なし のため池を抽出
no_shp = merge[~merge["has_inund"]]
print(f"非カバレッジ {{len(no_shp)}} 件 / 所管市町: {{no_shp['所管市町'].value_counts().to_dict()}}")

結果の図

図4 を選んだ理由: 6,754 池の地理分布を一目で把握するには 点マップが最適。色 = 浸水想定の有無、サイズ = log10 貯水量 の 2 軸を 1 図で示すことで、「どこに大きい池があるか」「どこの池が 非カバレッジか」を同時に確認できる。棒グラフでは地理が見えない。

図4: 広島県 特定農業用ため池 位置マップ
図4: 広島県 特定農業用ため池 位置マップ

図4 から読み取れること:

結果の表 (1) — 全体サマリ

指標
ため池総数 (CSV) 6,754 池
浸水想定 SHP あり 6,730 池 (99.6%)
浸水想定 SHP なし 24 池 (0.4%)
所管市町数 23 市町
個別浸水面積の合計 (重複あり) 488.07 km²
浸水想定区域の真の面積 (union) 293.31 km²
重複面積 194.76 km² (39.9%)
平均堤高 4.47 m (中央値 3.8 m, 最大 33.1 m)
平均貯水量 8.87 千 m³ (中央値 1.47, 最大 1,053)

表 (1) から読み取れること:

結果の表 (2) — 浸水想定なし 24 件の内訳

ため池番号 ため池名称 所管市町 堤高 m 貯水量 千m³ 特定指定日
342090001 神田 三次市 4.40 10.10 R2.12.28
342090134 古池 三次市 5.30 6.30 R2.12.28
342090181 甲住 三次市 4.50 20.80 R2.5.29
342090182 東迫2号 三次市 6.40 5.20 R2.12.28
342090245 大池(上池) 三次市 6.30 30.00 R2.3.31
342090246 下池 三次市 8.70 42.00 R2.3.31
342090247 新池 三次市 11.35 149.18 R2.3.31
342090468 久満2号 三次市 3.90 0.80 R2.12.28
342090708 ごっぱつ池(畦御堂) 三次市 8.30 28.10 R2.3.31
345820002 尻無池 三次市 13.10 53.00 R2.3.31
345840151 茗荷丸新池 三次市 8.80 30.80 R2.3.31
342100040 石仏池 庄原市 8.80 20.00 R2.12.28
342100150 狐塚池 庄原市 7.40 11.40 R2.12.28
342100277 狩山池 庄原市 8.10 50.40 R2.12.28
342100278 稗田池 庄原市 14.40 2.70 R2.12.28

(表は上位 15 件のみ表示, 全 24 件は L45_no_inund.csv 参照)

表 (2) から読み取れること:

分析 2: 規模属性 ↔ 浸水面積 のスケーリング

狙い (RQ ↔ 仮説 H2)

「ため池の規模 (堤高・貯水量) が大きいほど決壊時の下流浸水面積も大きい」 という直感的予測を、Pearson 相関と log-log 散布で検証する。 堤高と貯水量のどちらが浸水面積をより強く支配するかも比較する。

手法 — log-log 散布 + OLS 回帰

ため池の規模指標 (堤高 m, 貯水量 千 m³) は桁数のレンジが広い (堤高 0.2-33 m = 約 2 桁、貯水量 0.002-1,053 千 m³ = 約 6 桁)。 よって生値の散布図では大池の点だけが目立ち、小池の構造が潰れる。 log-log 軸 ((x, y) の両方を log10 化) で表示すると べき乗則 (power law) の傾きが直線として読める。

Pearson 相関 r とは (要件 B/J): 2 変数 (x, y) の線形関係の強さを -1〜+1 で示す。 +1 = 完全な正の直線、0 = 無相関、-1 = 完全な負の直線。 入力: 同じ長さの 2 列の数値、出力: 1 つの相関値。 限界: 非線形関係 (放物線等) は捉えられない。代替: Spearman 順位相関、 log-log 化での Pearson (本記事はこれを併用)。

実装コード

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np
import pandas as pd

# 結合済 merge 表から「浸水想定あり」だけ抽出 (NaN 除外)
m2 = merge[merge["has_inund"]].copy()
m2 = m2[(m2["堤高_m"] > 0) & (m2["貯水量_千m3"] > 0) & (m2["area_km2"] > 0)].copy()

# 生値 Pearson 相関
corr_dam_area = m2[["堤高_m", "area_km2"]].corr().iloc[0, 1]
corr_cap_area = m2[["貯水量_千m3", "area_km2"]].corr().iloc[0, 1]

# log10 で再相関 (べき乗則の検証)
m2["log_dam"]  = np.log10(m2["堤高_m"])
m2["log_cap"]  = np.log10(m2["貯水量_千m3"])
m2["log_area"] = np.log10(m2["area_km2"])
log_corr_cap_area = m2[["log_cap", "log_area"]].corr().iloc[0, 1]

# log-log OLS 回帰: log(area) = b0 + b1 * log(cap)
b0, b1 = np.polynomial.polynomial.polyfit(m2["log_cap"], m2["log_area"], 1)
print(f"log-log 回帰: log(area) = {{b0:.2f}} + {{b1:.2f}} * log(cap)")
# b1 ≈ 0.6 → power law: area ∝ cap^0.6 (亜線形スケーリング)

結果の図 (1) — 規模分布 (要件 L 次元・サイズの混同回避)

図2 を選んだ理由: 規模属性の分布形状を見るのが先。 分布が偏っていれば次の散布図の解釈も変わる (= 散布点が密集する場所が偏る)。 左パネル = 堤高 (生値ヒストグラム) は右に裾を引く正規様。 右パネル = 貯水量 (log10 軸ヒストグラム) は対数正規様で、log scale で見て 初めて分布の中身が読める。

図2: ため池規模分布 — 堤高は正規様, 貯水量は対数様
図2: ため池規模分布 — 堤高は正規様, 貯水量は対数様

図2 から読み取れること:

結果の図 (2) — 規模 vs 浸水面積 散布

図3 を選んだ理由: 2 変数の関係を見るには散布図が王道。 log-log 軸を採用するのは「規模も面積も対数で広く分布する」ため。 log-log 軸でべき乗則が直線になることを利用すれば、傾きから スケーリング指数 (= area ∝ cap^β) が読める。

図3: ため池規模 ↔ 決壊時下流浸水想定面積
図3: ため池規模 ↔ 決壊時下流浸水想定面積

図3 から読み取れること:

結果の表 — 4 種の Pearson r

相関の組 Pearson r
堤高 (生値) ↔ 浸水面積 0.609
貯水量 (生値) ↔ 浸水面積 0.750
log10 堤高 ↔ log10 面積 0.674
log10 貯水量 ↔ log10 面積 0.814

表から読み取れること: log-log 化すると貯水量との r が 0.750 → 0.814 に上昇するが、 堤高はあまり変わらない (0.609 → 0.674)。 これは「貯水量 vs 浸水面積はべき乗則的、堤高 vs 浸水面積は弱い線形」 という構造の違いを示す。水量が直接浸水範囲を決め、堤体の高さは間接的

分析 3: 中山間集中 vs 沿岸 — 市町別ランキング

狙い (RQ ↔ 仮説 H3)

ため池の地理分布を市町別に集計し、中山間 (内陸) 市町と 沿岸市町でどう違うかを定量化する。歴史的にため池は農業遺構なので 内陸の水田地帯に集中するはずである。

手法 — 市町別 集計 + 中山間/沿岸 分類

CSV.所管市町 列で groupby して ため池数・平均堤高・合計貯水量・合計浸水想定 km² を集計する。 さらに各市町を本記事独自定義の中山間 (内陸 9 市町) / 沿岸 (海岸線あり 14 市町) / その他 に分類して カテゴリ別の差を可視化する。

実装コード

L45_pond_inundation.py 行 1195–1236

 1
 2
 3
 4
 5
 6
 7
 8
 9
1204
1205
1206
1207
1208
1209
1210
1211
1212
# 中山間/沿岸の独自分類 (本記事内マッピング)
INLAND_CITIES = {"府中市", "三次市", "庄原市", "東広島市", "安芸高田市",
                 "山県郡安芸太田町", "山県郡北広島町",
                 "世羅郡世羅町", "神石郡神石高原町"}
COASTAL_CITIES = {"広島市", "呉市", "竹原市", "三原市", "尾道市", "福山市",
                  "大竹市", "廿日市市", "江田島市", "豊田郡大崎上島町",
                  "安芸郡府中町", "安芸郡海田町", "安芸郡熊野町"}

# 市町別 集計 (groupby + agg)
g = merge.groupby("所管市町").agg(
    ため池数         =("ため池番号", "count"),
    平均堤高_m       =("堤高_m",     "mean"),
    合計貯水量_千m3  =("貯水量_千m3", "sum"),
    合計浸水想定_km2 =("area_km2",   "sum"),
).reset_index().sort_values("ため池数", ascending=False)
g["地理分類"] = g["所管市町"].map(
    lambda x: "中山間" if x in INLAND_CITIES else
              ("沿岸"   if x in COASTAL_CITIES else "その他"))

結果の図 (1) — 市町別 ため池数 横棒

図1 を選んだ理由: 23 市町のラベルは長い文字列を含むので horizontal bar が読みやすい。色で中山間/沿岸を区別することで 「上位は中山間中心」が一目で分かる。pie chart や treemap だと比較的順位が分かりにくい。

図1: 所管市町別 特定農業用ため池数
図1: 所管市町別 特定農業用ため池数

図1 から読み取れること:

結果の図 (2) — ため池数 vs 浸水想定 散布

図9 を選んだ理由: 「池数」と「浸水想定面積」の関係を見る 2 次元散布。1 池あたりの平均浸水想定面積 (傾き) が中山間と沿岸で違うかを見る。

図9: 市町別 ため池数 vs 浸水想定面積
図9: 市町別 ため池数 vs 浸水想定面積

図9 から読み取れること:

結果の表 — 市町別 集計 (上位 10 + その他)

所管市町 ため池数 浸水想定あり 平均堤高_m 最大堤高_m 平均貯水量_千m3 合計貯水量_千m3 合計浸水想定_km2 平均浸水想定_km2 中央緯度 中央経度 地理分類 池あたり浸水_km2
東広島市 1768 1768 3.33 33.10 6.58 11633 93.117 0.053 34.434931 132.741847 中山間 0.0527
福山市 1077 1077 5.20 29.00 11.96 12878 83.961 0.078 34.504983 133.321722 沿岸 0.0780
庄原市 697 685 5.31 21.20 16.01 11157 73.383 0.107 34.880592 133.029518 中山間 0.1053
三次市 616 604 5.60 33.00 14.32 8822 69.540 0.115 34.756125 132.890074 中山間 0.1129
尾道市 443 443 5.62 24.90 5.29 2344 24.711 0.056 34.449611 133.178250 沿岸 0.0558
安芸高田市 396 396 3.84 15.20 6.39 2529 26.540 0.067 34.683483 132.706778 中山間 0.0670
呉市 310 310 3.81 14.00 3.47 1075 14.398 0.046 34.284333 132.712639 沿岸 0.0464
三原市 286 286 4.94 23.50 12.05 3447 25.279 0.088 34.475792 133.012347 沿岸 0.0884
世羅郡世羅町 258 258 4.42 18.60 9.31 2401 24.400 0.095 34.617444 132.968792 中山間 0.0946
山県郡北広島町 243 243 3.40 12.90 2.33 567 11.135 0.046 34.655634 132.473167 中山間 0.0458
広島市 161 161 4.70 18.25 2.60 418 9.576 0.059 34.434861 132.537667 沿岸 0.0595
府中市 141 141 5.41 14.80 8.37 1180 12.279 0.087 34.591373 133.185278 中山間 0.0871
安芸郡熊野町 120 120 3.31 15.00 2.56 307 5.920 0.049 34.349305 132.592833 沿岸 0.0493
神石郡神石高原町 71 71 4.52 10.50 7.84 557 5.484 0.077 34.712946 133.224896 中山間 0.0772
竹原市 46 46 5.14 13.50 4.10 189 2.867 0.062 34.369369 132.873153 沿岸 0.0623
廿日市市 39 39 4.02 11.65 2.98 116 1.888 0.048 34.358444 132.207917 沿岸 0.0484
江田島市 33 33 4.07 14.00 4.58 151 1.336 0.040 34.203528 132.454889 沿岸 0.0405
豊田郡大崎上島町 23 23 5.14 12.60 5.13 118 1.252 0.054 34.237194 132.887972 沿岸 0.0544
安芸郡海田町 12 12 3.18 4.70 0.42 5 0.475 0.040 34.366849 132.560250 沿岸 0.0396
山県郡安芸太田町 5 5 2.10 3.60 0.29 1 0.139 0.028 34.571028 132.262639 中山間 0.0278
大竹市 4 4 3.10 3.70 0.81 3 0.090 0.023 34.254083 132.185081 沿岸 0.0226
安芸郡府中町 4 4 8.31 16.25 3.84 15 0.237 0.059 34.407389 132.518486 沿岸 0.0593
熊野町 1 1 6.60 6.60 2.40 2 0.062 0.062 34.352222 132.584444 沿岸 0.0622

表から読み取れること:

分析 4: 連鎖重複の地理学 — unary_union vs 個別合計

狙い (RQ ↔ 仮説 H4)

本記事の核心的発見。各ため池の浸水想定面積を単純に足すと 488.1 km² だが、unary_union で重複を排除すると 293.3 km²。差分 194.8 km² (39.9%) は 「同じ地点が複数のため池決壊で繰り返し被災想定される」連鎖重複である。 これがどんな地形パターンで発生するかを地図で可視化する。

手法 — shapely.unary_union と差分計算

shapely.unary_union は複数の polygon を1 つの MultiPolygon にマージする (重なりは 1 度だけ計算)。これと個別 polygon の単純合計面積の差が 重複面積になる。

unary_union vs dissolve の違い (要件 J ツール化視点):
  • dissolve(by=keys): 列の値が同じ行を統合 (例: ため池 ID で集約)
  • unary_union: 全 polygon を 1 つに結合 (列を見ず幾何的に重ねる)
本分析は「県全体 1 つの MultiPolygon」が欲しいので unary_union。

実装コード

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import shapely
import geopandas as gpd

# 全 7,223 ポリゴン (ため池ごと dissolve 前) を読込
raw = gpd.read_file("data/extras/L45_pond_inundation/shp/ため池浸水想定区域.shp",
                    encoding="cp932").to_crs("EPSG:6671")

# 不正幾何を buffer(0) で修復 (30 件)
geoms = raw.geometry.values
inv = ~shapely.is_valid(geoms)
new = [g.buffer(0) if isi else g for g, isi in zip(geoms, inv)]
raw["geometry"] = new

# unary_union で全 polygon を結合 (~87 秒, 重い処理 → キャッシュ化)
union_geom = shapely.unary_union(raw.geometry.values)
union_km2 = union_geom.area / 1e6
print(f"県全体 真の浸水想定面積 = {{union_km2:.2f}} km²")

# 個別合計 vs union: 差が連鎖重複
individual_km2 = (raw.geometry.area / 1e6).sum()
overlap_km2 = individual_km2 - union_km2
print(f"個別合計 = {{individual_km2:.2f}} km², 重複 = {{overlap_km2:.2f}} km² "
      f"({{overlap_km2/individual_km2*100:.1f}}%)")

結果の図 (1) — 県全域 浸水想定マップ

図5 を選んだ理由: 全 6,730 池の浸水想定 polygon を 1 枚の地図に重ね、 「線状に集中している場所」を見つけるため。線状集中=複数ため池の 浸水想定が同じ谷に並んで連鎖している証拠。

図5: ため池決壊時 浸水想定区域マップ (全 6,730 池)
図5: ため池決壊時 浸水想定区域マップ (全 6,730 池)

図5 から読み取れること:

結果の図 (2) — 上位 4 市町ズーム small multiples

図6 を選んだ理由: ため池数上位 4 市町 (東広島・福山・庄原・三次) を 同じレイアウトで並べることで市町ごとの分布パターンの違いが直感的に分かる。 small multiples は「同じレンズで複数地域を比較する」ための定番構図。

図6: ため池数上位 4 市町 ズームマップ
図6: ため池数上位 4 市町 ズームマップ

図6 から読み取れること:

結果の図 (3) — 福山市 詳細マップ

図7 を選んだ理由: 福山平野は少数大池パターンの典型なので、 個別池の名前と浸水想定範囲を 1:1 で対応させて見るのに最適。 カラーマップは「浸水想定面積で濃淡」に塗ることで大池の規模感が掴める。

図7: 福山市 ため池決壊浸水想定 詳細マップ
図7: 福山市 ため池決壊浸水想定 詳細マップ

図7 から読み取れること:

分析 5: 指定の波 — 行政の制度的タイミング

狙い (RQ ↔ 仮説 H5)

「特定農業用ため池」の指定日 (CSV 列「特定農業用ため池の指定」) は令和年月日で記述されている。これを西暦に変換して時系列ヒストグラムを 作り、制度的なピークがいつ発生したかを可視化する。

手法 — 令和年号パーサ + 月単位集計

CSV の指定日は "R3.5.31" のような形式。令和元年 = 2019 として 正規表現で年月日を抽出し、pandas Timestamp に変換する。 月単位で集計してヒストグラムを描き、Top 月をラベル付けする。

実装コード

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import pandas as pd

def reiwa_to_date(s):
    """R3.5.31 → 2021-05-31"""
    if pd.isna(s) or not s.startswith("R"):
        return None
    parts = s[1:].split(".")
    if len(parts) != 3: return None
    r_year, mo, day = map(int, parts)
    return f"{{2018 + r_year:04d}}-{{mo:02d}}-{{day:02d}}"

merge["指定日_西暦"] = merge["特定農業用ため池の指定"].apply(reiwa_to_date)
desig = pd.to_datetime(merge["指定日_西暦"].dropna())

# 月単位集計
months = desig.dt.to_period("M").value_counts().sort_index()
top_month = months.idxmax()
print(f"最大月 = {{top_month}} ({{int(months.max())}} 池)")

結果の図

図8 を選んだ理由: 月単位棒グラフで時系列のピーク急増・収束のパターンを見るのに適する。Top 3 月にラベル付けすることで 重要な制度的時点を強調する。

図8: 特定農業用ため池 指定の波
図8: 特定農業用ため池 指定の波

図8 から読み取れること:

結果の表 — 指定日別 ため池数 (Top 10)

指定日 ため池数
2021-05-31 2848
2020-09-30 811
2020-05-29 736
2020-03-31 693
2021-03-31 553
2020-12-28 539
2023-01-31 113
2023-03-31 101
2021-09-30 49
2022-03-31 10

表から読み取れること: Top 6 はすべて令和 2-3 年で、それぞれが 法的に意味のある「区切り日」(月末・年度末・経過措置期限) に対応している。 これは指定が個別の池の決壊リスク評価ベースではなく、 行政手続きベースで進められたことを示す。

分析 6: Top 浸水想定ため池 — 規模の代表例

狙い (RQ ↔ 仮説 H2 補強)

浸水想定面積が大きい上位 15 池を抽出し、規模属性 (堤高・貯水量) との対応 を表で確認する。仮説 H2 (規模 ↔ 面積 正相関) の個別事例として、 最上位の池がどんな歴史的背景を持つかを定性的に補強する。

手法 — sort_values で Top N

結合済 merge 表で area_km2 列の降順ソートし上位 15 件を抽出。 特定指定日も合わせて表示することで、「最大級の池がいつ指定されたか」 の情報も得る。

実装コード

1
2
3
top_inund = merge.sort_values("area_km2", ascending=False).head(15)
print(top_inund[["ため池名称", "所管市町", "堤高_m",
                 "貯水量_千m3", "area_km2"]].to_string())

結果の表 — Top 15 浸水想定ため池

順位 ため池名称 所管市町 堤高 m 貯水量 千m³ 浸水想定面積 km² 特定指定日
1 服部大池 福山市 15.0 650.0 2.943 R3.3.31
2 春日池 福山市 8.4 396.0 2.125 R3.3.31
3 並滝寺池 東広島市 14.5 598.0 1.830 R2.3.31
4 小野池 東広島市 16.0 570.0 1.815 R2.3.31
5 大草田池(豊栄池) 東広島市 12.4 420.0 1.361 R2.3.31
6 昭和池 東広島市 26.5 196.0 1.342 R2.3.31
7 神田大池 三原市 22.3 550.0 1.282 R2.3.31
8 国兼池 庄原市 16.4 1053.5 1.242 R2.3.31
9 熊野貯水池 福山市 29.0 915.0 1.206 NaN
10 千足池 東広島市 16.0 480.0 1.177 R2.3.31
11 矢の風呂上池 庄原市 15.9 148.0 1.167 R2.12.28
12 味噌が峠池 三次市 9.5 22.1 1.143 R2.12.28
13 板木ため池 三次市 33.0 302.0 1.126 R2.3.31
14 松永溜池 福山市 23.0 382.0 1.085 R2.3.31
15 大谷池 福山市 15.0 338.0 1.061 R2.3.31

表から読み取れること:

仮説検証と考察

6 仮説の検証結果

仮説 想定 実測 判定
H1 カバレッジ完全性 浸水想定なしため池が < 1% で、地理的偏り (中山間市町集中) がある 24/6754 (0.36%) が浸水想定なし, 内訳: 三次市=12, 庄原市=12 (全件が中山間 2/2 市町) 強支持 (中山間市町に集中, 地理偏りあり)
H2 規模 ↔ 浸水面積 正相関 Pearson r > 0.6, 貯水量 > 堤高 r(堤高)=0.609, r(貯水量)=0.750, log-log: r(貯水量)=0.814 強支持
H3 中山間集中 ため池数 上位 5 市町のうち 3 件以上が中山間 (内陸) 上位 5 = ['東広島市', '福山市', '庄原市', '三次市', '尾道市'], うち中山間 = 3 件 強支持
H4 連鎖重複の地理学 個別合計 - union = 30% 以上の重複面積 個別合計=488.1 km², union=293.3 km², overlap=194.8 km² (39.9%) 強支持
H5 指定の波 R3.5.31 ピーク R3.5.31 (2021-05-31) が単一最大ピークで > 30% top_date=2021-05-31 (2848 池, 44.0% / 総指定数 6466) 強支持
H6 規模分布の対数性 貯水量レンジが log10 で 3 桁以上 min=0.0020, max=1,053.5 千 m³, log10 range=5.72 強支持

主要発見の整理

2 dataset 相互関係の構造発見

本記事の最重要発見は、CSV (62) と Shapefile (63) が「同じため池群の異なる断面」 として完全結合できる一方、カバレッジと表現の質が大きく異なる点である。

2 件は「ため池の identity (CSV) と impact (SHP)」として相補的であり、 結合することで初めて「規模 ↔ 浸水面積」のスケーリング「連鎖重複の地理学」という研究的問いに答えられる。 単独の dataset では得られない知見が、結合してはじめて見える典型例。

さらに 2018 年西日本豪雨後の制度進化が R3.5.31 のピークとして データに刻まれており、「災害 → 法律 → 指定 → データ整備」という 社会的時間軸が 2 dataset の更新タイミング差 (CSV は随時更新、SHP は 2025-01-22 と最近) としても観察できる。

本研究の限界

発展課題

本記事の結果から論理的に導かれる新仮説と、それを検証する具体的課題:

課題 1: 連鎖決壊シミュレーションの数値モデル化

課題 2: 浸水想定区域内の住民・建物の空間結合

課題 3: ため池決壊 × 河川浸水 × 高潮 「3 機構ハザード重ね」

課題 4: 三次市・庄原市 24 件 非カバレッジ池の現地調査

課題 5: ため池規模分布のべき乗則 vs 対数正規 統計検定