⚠️ このスクリプトは自動取得に対応していません。以下のデータセットを DoBoX から手動でダウンロードし、data/extras/ 以下に保存してください。
| ID | データセット名 |
|---|---|
| #666 | dataset #666 |
| #888 | 都市計画区域情報_区域データ_安芸高田市_行政区域 |
| #999 | dataset #999 |
| #1462 | dataset #1462 |
| #1463 | dataset #1463 |
実行コマンド:
cd "2026 DoBoX 教材"
python -X utf8 lessons/L06_flood_depth_geography.py
DoBoX のオープンデータは申請不要・商用/非商用とも利用可。
data/extras/ は .gitignore 対象(約 57 GB のキャッシュ)。
スクリプト実行で自動再生成されます。
rank 列(10〜80 の 8 段階)は、
0.5m から 20m 超まで 命の危険度がまるで違う 浸水深を 1 列で表現している。
この列を 水系・河川・市町 の 3 つの地理単位で集計し、
「どの地域が、どのくらい深く沈むのか」を可視化する。
このレッスンを終えると、(1) 水系・河川・市町の 3 単位での 浸水深差異 を 9 枚の図と 9 個の表で読み解けるようになり、
(2) geopandas の 軽量な集計テクニック(dissolve しないで groupby、representative_point + sjoin)を身につける。
学習者の自治体で 致命的浸水域 がどこにあるか、自分で計算できる。
rank (浸水深ランク 8 段階), suikei (水系), kasen (河川名), kasen_no (河川番号)suikei列でフィルタすれば個別水系の中身を完全再現できます (例: flood_max[flood_max['suikei']=='太田川水系'] で #36 と等価)。
したがって本記事は 河川浸水想定区域 39 件全部を論理カバー しています。
個別水系特化の深掘り研究 (M1 太田川 / M2 江の川 / M3 芦田川 / M4 沼田川 / M5 黒瀬川) は今後の発展課題です。
dataset_id 番号は仮のものです。実際の DoBoX カタログでは
「河川浸水想定区域」で検索してください。
| 指標 | 結果 |
|---|---|
| 想定最大規模 全 rank 合計面積 | 82973 ha (613 polygons) |
| 致命的浸水(3m+)の面積 | 34405 ha (251 polygons) |
| 致命的浸水 最大水系 | 太田川水系 (11738 ha, 全体の 34.1%) |
| 致命的浸水 最大市町 | 福山市 (6825 ha) |
| 面積加重 深さインデックス 最大水系 | 太田川水系 (rank=48.2) |
| 計画→想定最大 全体面積 増加倍率 | ×4.25 |
| ファイル | 内容 |
|---|---|
| L06_suikei_rank_area.csv | 水系×rank 面積ピボット (25 水系) |
| L06_kasen_rank_area.csv | 河川×rank 面積ピボット (83 河川) |
| L06_city_rank_area.csv | 市町×rank 面積ピボット |
| L06_scale_compare.csv | 計画 vs 想定最大 規模比較 |
| L06_deadly_by_suikei.csv | 致命的浸水(3m+)水系別 |
| L06_deadly_by_city.csv | 致命的浸水(3m+)市町別 |
| L06_rank_total.csv | rank 別 全体集計 |
| L06_kasen_max_rank.csv | 河川別 最深 rank |
| L06_suikei_avg_rank.csv | 水系別 面積加重平均 rank |
| L06_hypothesis_check.csv | 仮説 H1-H5 判定結果 |
| L06_fig1_suikei_rank_stack.png | 図1 水系別 積み上げ棒 |
| L06_fig2_kasen_rank_stack.png | 図2 河川別 積み上げ棒 |
| L06_fig3_scale_compare.png | 図3 規模比較 |
| L06_fig4_deadly_ranking.png | 図4 致命的浸水ランキング |
| L06_fig5_thematic_map.png | 図5 県全域 主題図 |
| L06_fig6_suikei_small_multiples.png | 図6 水系 small multiples (8 panels) |
| L06_fig7_hiroshima_wards.png | 図7 広島市8区 small multiples |
| L06_fig8_depth_index.png | 図8 全体分布 + 深さインデックス |
| L06_fig9_city_rank_heatmap.png | 図9 市町×rank ヒートマップ |
| L06_flood_depth_geography.py | 再現スクリプト |
すべての分析の基盤として、浸水ポリゴンを 面積が m² で計算できる座標系 に揃え、 3D ポリゴンを 2D に落として処理を軽くする。
shapely.force_2d で 2D 化すると
内部処理(特に sjoin と plot)が速くなる。to_crs() は最初に 1 度だけ呼ぶ。各セクションで再呼出ししない(要件 S)geometry.area で 一括取得 (m²) → /10000 で ha 換算| 段階 | 例: 1 ポリゴン目 | サイズ |
|---|---|---|
| ① 読込直後 | rank=10, suikei='本郷川水系', geometry=MULTIPOLYGON Z (EPSG:3857) | 613 行 / 5 列 |
| ② to_crs(6671) | geometry が平面直角 III 系の座標へ変換 | 613 行 / 5 列 |
| ③ force_2d | Z 座標が削除され MULTIPOLYGON (X, Y) に | 同上 |
| ④ area / 10000 | area_ha 列追加(例: 12.34 ha) | 613 行 / 7 列 |
なぜこの表か: まず 「rank が 10〜80 でどう散らばっているか」を 母集団全体 で確認しないと、 水系別・市町別の偏りが正常範囲か判断できない。
| rank | depth_label | polygon_count | area_ha | 全体に占める割合_pct |
|---|---|---|---|---|
| 10 | 0.0〜0.5m | 85 | 7772.63 | 9.37 |
| 20 | 0.5〜1.0m | 96 | 4154.87 | 5.01 |
| 30 | 1.0〜2.0m | 85 | 7687.54 | 9.27 |
| 40 | 2.0〜3.0m | 96 | 28952.31 | 34.89 |
| 50 | 3.0〜5.0m | 96 | 18450.82 | 22.24 |
| 60 | 5.0〜10.0m | 89 | 14128.56 | 17.03 |
| 70 | 10.0〜20.0m | 51 | 1677.57 | 2.02 |
| 80 | 20m以上 | 15 | 148.28 | 0.18 |
読み取り:
仮説 H1 検証。25 水系のうち、深い浸水(5m+)はどこに集中するか。
groupby(["suikei", "rank"]).area_ha.sum() でクロス集計 → unstack でピボット1 2 3 4 5 |
なぜこの表か: 集計結果の "生" を見せることで、後続の図がどこから来ているかを追える。
| suikei | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 合計 |
|---|---|---|---|---|---|---|---|---|---|
| 中小河川 | 5805.2 | 1902.2 | 3603.0 | 7656.7 | 3446.8 | 2391.7 | 316.6 | 46.5 | 25168.7 |
| 太田川水系 | 300.9 | 605.1 | 827.8 | 7228.0 | 4948.6 | 5559.8 | 1130.3 | 99.0 | 20699.4 |
| 芦田川水系 | 617.2 | 679.3 | 1229.5 | 4960.7 | 4339.5 | 2788.7 | 2.9 | 0.0 | 14617.9 |
| 江の川水系 | 248.9 | 188.7 | 505.1 | 2529.6 | 2028.5 | 1895.5 | 149.0 | 1.2 | 7546.4 |
| 沼田川水系 | 117.9 | 82.5 | 228.0 | 1082.9 | 1084.6 | 1205.0 | 78.2 | 1.6 | 3880.8 |
| 高梁川水系 | 2.5 | 87.4 | 5.9 | 1061.4 | 857.7 | 82.0 | 0.0 | 0.0 | 2096.8 |
| 黒瀬川水系 | 156.9 | 110.9 | 299.6 | 993.0 | 287.2 | 11.5 | 0.0 | 0.0 | 1859.1 |
| 八幡川水系 | 64.5 | 38.3 | 74.5 | 288.7 | 388.5 | 48.0 | 0.4 | 0.0 | 902.9 |
| 手城川水系 | 43.6 | 31.6 | 128.8 | 560.0 | 0.7 | 0.0 | 0.0 | 0.0 | 764.7 |
| 藤井川水系 | 17.9 | 12.9 | 55.6 | 277.3 | 331.9 | 61.0 | 0.0 | 0.0 | 756.6 |
| 瀬野川水系 | 37.0 | 30.9 | 86.5 | 457.2 | 120.1 | 3.4 | 0.0 | 0.0 | 735.0 |
| 賀茂川水系 | 34.9 | 24.2 | 49.7 | 184.7 | 300.5 | 43.2 | 0.0 | 0.0 | 637.2 |
| 本郷川水系 | 19.8 | 19.9 | 73.4 | 336.7 | 84.2 | 1.8 | 0.0 | 0.0 | 535.9 |
| 小瀬川水系 | 0.0 | 108.5 | 0.0 | 304.8 | 38.0 | 13.3 | 0.0 | 0.0 | 464.6 |
| 二河川水系 | 29.1 | 24.1 | 53.8 | 174.7 | 75.8 | 14.7 | 0.2 | 0.0 | 372.3 |
読み取り:
なぜこの図か: ヒートマップでは「色の濃淡」で量を見るが、棒グラフは 絶対量と内訳の両方 を 1 度に伝える。 水系内で「浅瀬中心か、深い帯まで広がるか」が積み上げの色配分で直感的にわかる。

読み取り:
仮説 H4 検証。83 河川を「最深ポイントの rank」で評価し、河川ごとの個性を見る。
groupby("kasen")["rank"].max() で河川ごとの最大 rank を取得groupby(["kasen", "rank"]).area_ha.sum() で構成内訳も計算なぜこの表か: 河川ごとの「最悪シナリオ深さ」を 1 列で示すと、地形リスクが直感的に比較できる。
| kasen | 最深rank | 最深ラベル |
|---|---|---|
| 三篠川 | 80 | 20m以上 |
| 二級水系 黒瀬川流域 | 80 | 20m以上 |
| 太田川水系 | 80 | 20m以上 |
| 江の川水系 馬洗川ブロック | 80 | 20m以上 |
| 江の川 | 80 | 20m以上 |
| 神野瀬川 | 80 | 20m以上 |
| 沼田川 | 80 | 20m以上 |
| 鈴張川 | 80 | 20m以上 |
| 高梁川水系 | 80 | 20m以上 |
| 芦田川水系 | 80 | 20m以上 |
| 西城川 | 80 | 20m以上 |
| 布野川 | 80 | 20m以上 |
| 太田川 | 80 | 20m以上 |
| 安川 | 80 | 20m以上 |
| 根谷川 | 80 | 20m以上 |
読み取り:
なぜこの図か: 上位 15 河川に絞った積み上げ棒で、「主要河川の中でどれが深い帯を持つか」を視覚化する。河川名と深さ構成を 1 枚で見せられる。

読み取り:
仮説 H3 検証。同じ rank の面積を「計画規模」と「想定最大規模」で比較し、規模拡大時の 深さ分布のシフト を見る。
なぜこの表か: 「規模を上げた時にどの rank がどれだけ膨らむか」を 倍率 として 1 列に集約。
| rank | depth_label | 計画規模_ha | 想定最大規模_ha | 増加倍率 |
|---|---|---|---|---|
| 10 | 0.0〜0.5m | 2491.7 | 7772.6 | 3.1 |
| 20 | 0.5〜1.0m | 2611.3 | 4154.9 | 1.6 |
| 30 | 1.0〜2.0m | 2925.7 | 7687.5 | 2.6 |
| 40 | 2.0〜3.0m | 9107.0 | 28952.3 | 3.2 |
| 50 | 3.0〜5.0m | 1964.9 | 18450.8 | 9.4 |
| 60 | 5.0〜10.0m | 397.9 | 14128.6 | 35.5 |
| 70 | 10.0〜20.0m | 10.7 | 1677.6 | 156.2 |
| 80 | 20m以上 | 0.3 | 148.3 | 530.7 |
読み取り:
なぜこの図か: rank の幅は 0〜20m と 5 桁レンジに渡る。線形軸では一部の値が潰れるため 対数軸 を採用。各 rank の上に増加倍率を直接書き込むと 「規模の拡大が深さにどう波及したか」が一目で読める。

読み取り:
仮説 H5 検証。命の危険を伴う 3m 以上の浸水(rank ≥ 50) がどこに集中するか。 水系別と市町別の 2 軸で見る。
flood_max[flood_max['rank'] >= 50] で抽出なぜこの表か: 致命的浸水の 地理的集中度を上位順に並べ、防災の優先順位を可視化する。
| 水系 | 致命的浸水面積_ha | 致命的浸水割合_pct |
|---|---|---|
| 太田川水系 | 11737.6 | 34.1 |
| 芦田川水系 | 7131.1 | 20.7 |
| 中小河川 | 6201.7 | 18.0 |
| 江の川水系 | 4074.1 | 11.8 |
| 沼田川水系 | 2369.4 | 6.9 |
| 高梁川水系 | 939.6 | 2.7 |
| 八幡川水系 | 436.9 | 1.3 |
| 藤井川水系 | 392.9 | 1.1 |
| 賀茂川水系 | 343.7 | 1.0 |
| 黒瀬川水系 | 298.8 | 0.9 |
| 瀬野川水系 | 123.4 | 0.4 |
| 山南川水系 | 96.7 | 0.3 |
| 二河川水系 | 90.6 | 0.3 |
| 本郷川水系 | 86.0 | 0.3 |
| 小瀬川水系 | 51.3 | 0.1 |
読み取り:
| 市町 | 致命的浸水面積_ha | 致命的浸水割合_pct |
|---|---|---|
| 福山市 | 6825.0 | 30.3 |
| 広島市安佐南区 | 4445.4 | 19.7 |
| 広島市中区 | 3735.6 | 16.6 |
| 三次市 | 2227.2 | 9.9 |
| 三原市 | 1401.0 | 6.2 |
| 広島市西区 | 1215.3 | 5.4 |
| 広島市安佐北区 | 670.5 | 3.0 |
| 広島市佐伯区 | 446.8 | 2.0 |
| 竹原市 | 343.7 | 1.5 |
| 尾道市 | 331.9 | 1.5 |
| 呉市 | 239.8 | 1.1 |
| 東広島市 | 237.8 | 1.1 |
| 広島市南区 | 151.9 | 0.7 |
| 広島市安芸区 | 123.4 | 0.5 |
| 庄原市 | 64.2 | 0.3 |
読み取り:
なぜこの図か: 水系と市町は 異なる地理スケール。両方を並列で示すことで、「水系単位で見ると太田川中心、市町単位で見ると広島市中心」というスケール依存の見え方を学習者に体感させる。

読み取り:
要件 T。これまでの集計を 地図で「どこ」 として表現する。 表と棒グラフだけでは「数字は見えても場所が見えない」状態。主題図で空間的偏在を直感的に把握する。
↑ L06_flood_depth_geography.py 行 520–536
520 521 522 523 524 525 |
なぜこの図か: 数字や棒グラフでは 「地理的な集中パターン」 が伝わらない。 主題図は「広島市デルタ」「福山平野」「三次盆地」など、名前のある場所 をそのまま見せられる唯一の表現。

読み取り:
主題図 1 枚に全水系を載せると重なって読みにくい。 水系を 1 つずつ取り出し、同じ枠で並べる ことで形の違いを比較する(small multiples)。
↑ L06_flood_depth_geography.py 行 529–553
なぜこの図か: 主題図 1 枚では 「水系ごとの形状の違い」 がわからない。 small multiples は「条件だけ変えた小図を並べて見比べる」古典的だが極めて効果的な手法。

読み取り:
市町スケールで more zoomed-in。広島市の 8 区 ごとに浸水深分布を比較し、 区ごとのリスクパターンを可視化する。
representative_point)を市町ポリゴン(用途地域 dissolve)に sjoin(predicate='within')representative_point は centroid と違って 必ずポリゴン内。L字型ポリゴンの centroid が外に出るバグを回避↑ L06_flood_depth_geography.py 行 511–527
なぜこの図か: 区ごとに重ねると 「自分の区がどう見えるか」 を 1 枚で確認できる。 学習者の住所スケールでリスクを認知させる教育的効果。

読み取り:
これまでの「個別水系/市町」の話を 1 つの指標 に圧縮する。 水系全体の「平均的な深さ傾向」を 面積加重平均 rank(深さインデックス)として算出。
なぜこの表か: 25 水系を 1 つの数字 で順位付けすると、棒グラフでは見えない「平均的な性格」が浮き彫りに。
| 水系 | 面積加重平均rank | 致命的浸水比率_pct |
|---|---|---|
| 太田川水系 | 48.17 | 56.70 |
| 沼田川水系 | 47.70 | 61.10 |
| 江の川水系 | 46.15 | 54.00 |
| 山南川水系 | 44.29 | 53.50 |
| 藤井川水系 | 44.21 | 51.90 |
| 高梁川水系 | 43.97 | 44.80 |
| 芦田川水系 | 43.75 | 48.80 |
| 賀茂川水系 | 42.89 | 53.90 |
| 八幡川水系 | 41.56 | 48.40 |
| 本郷川水系 | 38.42 | 16.10 |
| 瀬野川水系 | 38.20 | 16.80 |
| 二河川水系 | 37.76 | 24.30 |
| 小瀬川水系 | 36.72 | 11.00 |
| 黒瀬川水系 | 36.33 | 16.10 |
| 手城川水系 | 35.79 | 0.10 |
読み取り:
なぜこの図か: 全体分布(左)と水系別の深さインデックス(右)を並べることで、 「全体平均」と「水系別の偏り」を 同じスケールで対比 できる。

読み取り:
市町 × rank の 2 軸クロス集計を 1 枚のヒートマップで俯瞰する。 市町ごとに「どの深さ帯がどれくらいあるか」のパターンを比較。
imshow で色分け、セルに数値を直接書き込む(読み取りやすさ)なぜこの表か: ヒートマップの数値根拠を表で並列して示すと、厳密な値で確認できる。
| city_name | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 合計 |
|---|---|---|---|---|---|---|---|---|---|
| 福山市 | 1406.5 | 276.9 | 836.1 | 5622.8 | 4254.6 | 2570.4 | 0.0 | 0.0 | 14967.4 |
| 広島市中区 | 0.0 | 14.7 | 0.0 | 1995.0 | 3718.3 | 17.1 | 0.2 | 0.0 | 5745.2 |
| 広島市南区 | 106.1 | 299.6 | 309.4 | 4416.9 | 151.9 | 0.0 | 0.0 | 0.0 | 5283.8 |
| 広島市安佐南区 | 8.0 | 11.7 | 22.5 | 183.6 | 277.6 | 3929.0 | 238.2 | 0.5 | 4671.2 |
| 三原市 | 146.8 | 118.9 | 292.1 | 813.1 | 400.4 | 1000.6 | 0.0 | 0.0 | 2771.9 |
| 広島市東区 | 63.8 | 356.1 | 865.9 | 1172.2 | 3.9 | 0.7 | 0.0 | 0.0 | 2462.4 |
| 三次市 | 32.3 | 17.4 | 29.1 | 64.0 | 939.4 | 1282.2 | 5.5 | 0.1 | 2370.1 |
| 呉市 | 336.8 | 138.6 | 151.3 | 732.2 | 229.3 | 10.6 | 0.0 | 0.0 | 1598.8 |
| 東広島市 | 134.7 | 136.4 | 406.3 | 654.4 | 179.5 | 1.0 | 57.3 | 0.0 | 1569.6 |
| 広島市西区 | 0.0 | 178.0 | 0.0 | 0.0 | 360.4 | 854.9 | 0.0 | 0.0 | 1393.2 |
| 広島市安佐北区 | 98.0 | 76.8 | 109.8 | 237.3 | 136.9 | 430.7 | 102.9 | 0.0 | 1192.3 |
| 尾道市 | 195.0 | 86.2 | 55.6 | 325.8 | 331.9 | 0.0 | 0.0 | 0.0 | 994.4 |
| 広島市佐伯区 | 122.9 | 89.3 | 104.2 | 189.6 | 398.7 | 48.0 | 0.0 | 0.0 | 952.7 |
| 広島市安芸区 | 37.0 | 30.9 | 281.3 | 457.2 | 120.1 | 3.4 | 0.0 | 0.0 | 929.8 |
| 府中市 | 145.2 | 110.2 | 419.3 | 119.0 | 0.1 | 0.0 | 0.0 | 0.0 | 793.9 |
読み取り:
なぜこの図か: 表は厳密だが、20 市町 × 8 rank = 160 セルを パターンとして読み取るのは難しい。 ヒートマップは色の濃淡で「どこに偏在するか」を即座に把握させる。

読み取り:
| 仮説 | 内容 | 証拠 | 判定 |
|---|---|---|---|
| H1 | 太田川水系で深い浸水深(5m+)が集中 | 太田川水系の 5m+ 面積は全県の 42.6% | 支持 |
| H2 | 「中小河川」分類は浅瀬中心 | 中小河川の 0〜2m が全体の 44.9% | 部分支持 |
| H3 | 計画規模と想定最大規模で深さ分布が大きく異なる | 面積加重平均 rank の差: 8.15 | 支持 |
| H4 | 河川別で「最深ポイント」の rank が異なる | 河川別 最深 rank の種類数: 4 / 8 | 支持 |
| H5 | 致命的深さ(3m+)は上位水系に集中 | 致命的浸水 上位3水系で全体の 72.8% | 支持 |
gpd.overlay で重ね、
IoU(Intersection over Union)で「想定の妥当性」を定量評価| 関数 | 入力 | 出力 | 本記事での役割 |
|---|---|---|---|
gpd.read_file() | shp/geojson パス | GeoDataFrame | Shapefile を読込 |
gdf.to_crs("EPSG:6671") | GeoDataFrame | CRS変換後 GeoDataFrame | 面積を m² で正確に |
shapely.force_2d() | geometry 配列 | 2D geometry 配列 | 3D ポリゴン → 2D(高速化) |
gdf.geometry.area | GeoDataFrame | 面積 Series (m²) | 各ポリゴンの面積 |
gdf.geometry.representative_point() | GeoDataFrame | 代表点 GeoSeries | 市町割当のための「中の点」 |
gpd.sjoin(predicate='within') | 点 + ポリゴン | 点 + ポリゴン属性 | 市町割当 |
gdf.dissolve(by='CITY_CD') | GeoDataFrame + キー | キー単位 union | 市町境界生成 |
gdf.plot(ax=ax, color=...) | GeoDataFrame + 軸 | matplotlib 描画 | 主題図 |
flood_max を rank で dissolve すると数十秒〜分単位で遅くなるrepresentative_point + sjoin で軽量化(overlay は不要)to_crs() は最初に 1 回だけ呼ぶ(再呼出し禁止)shapely.force_2d で 3D → 2D 化 → 描画速度が ~1.5 倍に| 表示 | 本来の規模 | 注記 |
|---|---|---|
| 水系上位 12 / 河川上位 15 / 市町上位 20 | 水系 25 / 河川 83 / 市町 27 | 表示の都合で上位のみ。CSV には全件を保存 |
| 図5-7 の主題図 polygon 数 | 613 polygons | dissolve せず raw のまま重ね描き |
| 市町境界の精度 | 用途地域 dissolve(厳密ではない) | 正確な行政境界ではないが、市町割当の近似として十分 |
| 用語 | 本記事での平易な言い換え |
|---|---|
| EPSG:6671 | 「広島県を平面で扱う座標系」(1m が 1m として測れる) |
| sjoin | 「点が polygon の中にあるか調べて属性を貼る」 |
| dissolve | 「同じキーのポリゴンを 1 つに union する」 |
| 面積加重平均 | 「面積で重みづけした平均値」 |
| choropleth(コロプレス) | 「領域を属性で色分けした地図」 |