Lesson 48

多段階の浸水想定図 単独 3 研究例分析 — 6 規模 × 8 深さランクの 48 セル ハザードマトリクスを読む

L48PDF解析多段階浸水ハザードマトリクスRQ×3カラーマッチング
所要 35 分 / 想定レベル: 中級+ / データ: DoBoX dataset 1641 (8 リソース, 48 PDF)

データ取得手順

このスクリプトは初回実行時にデータを自動取得します(DoBoX からの直接ダウンロード)。

IDデータセット名
#333dataset #333
#888都市計画区域情報_区域データ_安芸高田市_行政区域
#999dataset #999
#1641多段階の浸水想定図

実行コマンド:

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

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

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

⬇ L48_multistage_flood.py

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

学習目標と問い

本記事は DoBoX のシリーズ 「多段階の浸水想定図」 1 件 (dataset_id = 1641) を 単独で取り上げ、 広島県内 32 河川水系 × 降雨 6 規模 = 48 PDF (うち 47 件取得可; 1 件はサーバ ZIP 破損) を 3 つの独立した研究角度から並列に分析する。

本マップの位置付け — 「多段階」 とは何か

「多段階の浸水想定図」は、L4-L11 の河川浸水想定図 (計画規模 / 想定最大規模) と 同じく河川氾濫を扱うが、配布されるシナリオの粒度が大きく違う:

つまり L48 は L47 の転置構造: L47 が「ある深さ閾値で初めて浸水するときの最頻」を 1 PDF に圧縮して見せるのに対し、L48 は「ある降雨規模で実際に何 m 浸水するか」を 6 PDF に分割して見せる。 両者は同じ現象 (河川氾濫シミュレーション) の異なる軸射影であり、 L48 のほうが情報量が大きい (48 PDF × 8 ランク = 384 セル) が、 L47 が持つ「想定最大規模」 シナリオは含まない。

研究の問い (3 RQ)

仮説 H1〜H5

本記事の独自用語定義

到達点

3 つの研究角度それぞれで、多段階浸水想定図という 同じ 1 つのデータ から 独立した知見を引き出す。とくに 「データ数 = 1 でも、研究角度 × 3 = 知見 × 3」 という探究法を、L47 (頻度軸 PDF) との転置関係を意識しながら身につける。 GIS 座標を持たない PDF からも、ラスタ化 + カラーマッチングという技法によって 6 規模 × 8 深さ = 48 マスの高解像度ハザード解析が可能であることを示す。

使用データ

本記事は DoBoX シリーズの 1 件のみ を扱う:

項目
dataset_id 1641
タイトル 多段階の浸水想定図
DoBoX URL https://hiroshima-dobox.jp/datasets/1641
リソース数 8 (= 河川水系のグループ別 ZIP)
対象水系数 32 (8 グループに分散; L47 と同一構成)
PDF 数 47 / 48 (8 群 × 6 規模; 1 件 = rid 176958 山南川群 1/10 PDF はサーバ ZIP 破損で取得不可)
形式 PDF (A3 横, 1190×842 pt)
降雨規模 6 段階 (1/5, 1/10, 1/30, 1/50, 1/70, 1/100)
想定最大規模 含む なし (1/100 が上限。L47 とはここが違う)
浸水深ランク 8 (0.3m未満 / 0.3-0.5 / 0.5-1.0 / 1.0-3.0 / 3.0-5.0 / 5.0-10.0 / 10.0-20.0 / 20m+)
公表年月日 令和 6 年 4 月 10 日 (2024-04-10)
作成主体 広島県土木建築局河川課
ZIP 合計サイズ目安 ~30 MB × 8 = ~240 MB (1 ZIP に 6 PDF)
ライセンス CC-BY 4.0
GIS 座標 なし (PDF はベクタ図面で地理座標が直接埋め込まれない)

凡例 8 深さランクの測色結果

深さランク ランク中央値 m RGB HEX 色名 (推定)
0.3m未満 0.15 (255,255,179) #ffffb3 淡黄
0.3-0.5m未満 0.40 (246,244,168) #f6f4a8 黄淡
0.5-1.0m未満 0.75 (248,225,165) #f8e1a5 黄橙
1.0-3.0m未満 2.00 (255,216,191) #ffd8bf 桃淡
3.0-5.0m未満 4.00 (255,182,182) #ffb6b6 桃中
5.0-10.0m未満 7.50 (255,144,144) #ff9090 桃濃
10.0-20.0m未満 15.00 (242,133,200) #f285c8 紫桃
20.0m以上 25.00 (219,121,219) #db79db

RGB は実 PDF (瀬野川 1/100) を 300 dpi でラスタ化し、凡例エリア (1015,619)-(1143,694) pt の左にあるカラースワッチから median で抽出した。48 PDF 全件で同色が再現されることを確認済み。

8 リソースの内訳

resource_id slug 対象河川 水系数 PDF 数 (期待) DL
176955 nagata_okajino_tanaka 永田川・小鹿野川・田中川 (3水系) 3 6 https://hiroshima-dobox.jp/resource_download/176955
176956 kamo_honkawa 賀茂川・本川 (2水系) 2 6 https://hiroshima-dobox.jp/resource_download/176956
176957 takada_ocho_harada_etc 高田川・大長川・原田川・原下川・小原川 (5水系) 5 6 https://hiroshima-dobox.jp/resource_download/176957
176958 sannan_motoya_tejiro 山南川・本谷川・手城川 (3水系) 3 6 https://hiroshima-dobox.jp/resource_download/176958
176959 seno 瀬野川 (1水系) 1 6 https://hiroshima-dobox.jp/resource_download/176959
176960 fujii_hongo_habara_etc 藤井川・本郷川・羽原川・新川・栗原川・大田川・才戸川・大河原川 (8水系) 8 6 https://hiroshima-dobox.jp/resource_download/176960
176961 yahata_eikoji_mitearai_etc 八幡川・永慶寺川・御手洗川・可愛川・岡ノ下川 (5水系) 5 6 https://hiroshima-dobox.jp/resource_download/176961
176962 noro_kinoya_takano_etc 野呂川・木谷郷川・高野川・蛇道川・三津大川 (5水系) 5 6 https://hiroshima-dobox.jp/resource_download/176962

1 リソース = 1 ZIP = 6 PDF (1 規模 = 1 PDF)。全 8 リソース合計 ~240 MB で、初回 DL は 30-60 秒程度。

ダウンロード

DoBoX 本体 (1 件 + 8 リソース)

8 リソース直 DL ボタン:

中間 CSV (本レッスンが生成)

図 PNG (8 枚)

再現スクリプト

再現コマンド

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

初回実行時は dataset 1641 の 8 ZIP (~240 MB) を DL し、48 PDF を展開する。PDF の集計結果は data/extras/L48_multistage_flood/_cache/pdf_color_hist.json にキャッシュされる。2 回目以降は ~5 秒で再実行完了。

【RQ1】 6 規模 × 8 ランクの構造研究 — 多段階浸水想定の形状

狙い (RQ1)

多段階浸水想定図という「1 規模 = 1 PDF を 6 枚並べた図集」が、 実際にどう描かれているかを定量的に把握する。 凡例の 8 深さランク (0.3m未満〜20m以上) と 6 降雨規模 (1/5〜1/100) の組合せを 48 PDF 全体で集計し、6 × 8 = 48 セルのハザードマトリクスの形状を読む。

手法 (カラーマッチング集計, L47 と同じ枠組み)

PDF はベクタ図面で地理座標を持たないため、Shapefile のように geopandas.area で面積を直接計算できない。代わりに L47 で確立した カラーマッチング集計を 8 ランク版に拡張して使う:

入力: 48 PDF と凡例 RGB 8 色。
出力: 48 行 × 8 列のピクセル数テーブル (= L48_pdf_color_hist.csv)、 および 6 × 8 集約マトリクス (= L48_prob_x_depth_matrix.csv)。
限界: ピクセル数は地理面積 (km²) ではない。各 PDF 内の相対比としてのみ意味がある。 PDF 間の絶対比較には注意 (図郭サイズが等しい前提なら比較可、本データは A3 横で揃っており可)。 代替案: 国土地理院の Geo TIFF があれば直接面積計算可能だが、 DoBoX の本データは PDF 配布のみ。本手法はその制約下での実用解。

L47 との対比

L47 (水害リスクマップ) は 1 PDF に 7 頻度色を重ねた構造。1 PDF を集計すると 「7 階級それぞれの面積」が得られた (= 軸 = 頻度)。 本記事 L48 は 6 PDF (1 規模 = 1 PDF) に 8 深さ色を塗った構造。1 PDF を集計すると 「8 深さランクそれぞれの面積」が得られる (= 軸 = 深さ)。 両者は同じ 「色マッチングで PDF を集計する」 枠組みを使うが、 得られる軸が異なる。これは制度設計の 転置を反映している。

実装の要点

STEP 2 のコード (凡例測色)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 凡例エリアから 8 深さランク色を測色 (300 dpi)
import fitz, numpy as np

doc = fitz.open("多段階の浸水想定図(瀬野川水系)【降雨規模:年超過確率100分の1】.pdf")
page = doc[0]
clip = fitz.Rect(990, 615, 1020, 700)                  # 凡例右下、ラベル左のスワッチ部分
pix = page.get_pixmap(matrix=fitz.Matrix(300/72.0, 300/72.0), alpha=False, clip=clip)
arr = np.frombuffer(pix.samples, dtype=np.uint8).reshape(pix.height, pix.width, 3)

# 8 ラベルの y 座標 (pt) を取得済み
labels = [("20.0m+", 623),    ("10-20m", 633),  ("5-10m", 643),  ("3-5m", 652),
          ("1-3m",  662),     ("0.5-1m", 672),  ("0.3-0.5m", 682), ("<0.3m", 691)]
for name, y_pt in labels:
    py = int((y_pt - 615) * 300/72.0)                  # ラベル中心のピクセル y
    swatch = arr[max(0,py-10):py+11, :, :].reshape(-1, 3)
    sat = swatch.max(axis=-1) - swatch.min(axis=-1)
    rgb = np.median(swatch[sat >= 20], axis=0).astype(int)
    print(f"{name:>10s}  RGB ({rgb[0]:3d},{rgb[1]:3d},{rgb[2]:3d})")

STEP 3-4 のコード (ピクセル分類)

 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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 1 PDF を 100 dpi にラスタ化 → 8 ランク色マッチングで分類
import fitz, numpy as np

DEPTH_RGB = np.array([                                  # 上で抽出した 8 ランク色
    [255,255,179],   # 0.3m未満
    [246,244,168],   # 0.3-0.5m未満
    [248,225,165],   # 0.5-1.0m未満
    [255,216,191],   # 1.0-3.0m未満
    [255,182,182],   # 3.0-5.0m未満
    [255,144,144],   # 5.0-10.0m未満
    [242,133,200],   # 10.0-20.0m未満
    [219,121,219],   # 20.0m以上
], dtype=np.int32)
TOLERANCE = 22                                         # Chebyshev 距離許容
SAT_MIN   = 30                                         # 彩度下限 (max-min channel)

def classify_pdf(pdf_path):
    doc = fitz.open(pdf_path)
    page = doc[0]
    pix = page.get_pixmap(matrix=fitz.Matrix(100/72.0, 100/72.0), alpha=False)
    arr = np.frombuffer(pix.samples, dtype=np.uint8).reshape(pix.height, pix.width, 3).astype(np.int32)
    H, W = arr.shape[:2]

    # 凡例 bbox を動的検出 (「m未満の区域」 「m以上の区域」 テキストの位置から)
    # PDF はランドスケープとポートレートが混在するため固定座標は使えない
    bbs = []
    for blk in page.get_text("dict").get("blocks", []):
        for line in blk.get("lines", []):
            for span in line.get("spans", []):
                if "m未満の区域" in span["text"] or "m以上の区域" in span["text"]:
                    bbs.append(span["bbox"])
    doc.close()
    legend_mask = np.zeros((H, W), dtype=bool)
    if bbs:
        a = np.array(bbs)
        # ラベル左にスワッチがあるので x0 を 35pt 左にずらす
        x0_pt = a[:,0].min() - 35; x1_pt = a[:,2].max() + 4
        y0_pt = a[:,1].min() - 4;  y1_pt = a[:,3].max() + 4
        lx0 = max(0, int(x0_pt*100/72)); lx1 = min(W, int(x1_pt*100/72))
        ly0 = max(0, int(y0_pt*100/72)); ly1 = min(H, int(y1_pt*100/72))
        legend_mask[ly0:ly1, lx0:lx1] = True

    sat = arr.max(axis=-1) - arr.min(axis=-1)
    diffs = np.abs(arr[:, :, None, :] - DEPTH_RGB[None, None, :, :]).max(axis=-1)
    nearest   = diffs.argmin(axis=-1)
    nearest_d = diffs.min(axis=-1)
    matched   = (nearest_d <= TOLERANCE) & (sat >= SAT_MIN)
    matched   = matched & (~legend_mask)

    counts = {i: int((matched & (nearest == i)).sum()) for i in range(8)}
    other = int((~matched).sum())
    return counts, other

図 1: PDF プレビュー + 8 ランクの凡例カラー解説

なぜこの図か: 学習者がまず「多段階の浸水想定図とは何か」を視覚で理解するため、 1 PDF (瀬野川 1/100) のプレビューと、抽出した 8 ランク色のスウォッチを並置する。 PDF の左下に説明文、中央が地図、右下に凡例という配置を見ることで 「どこから色を抽出したか」 「色がどう深さに対応しているか」 が一目で分かる。

図 1: PDF プレビュー + 8 ランク凡例カラー
図 1: PDF プレビュー + 8 ランク凡例カラー

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

図 2: 6 規模 × 8 ランク の積層棒

なぜこの図か: H1 (規模単調性) と H2 (深さ重心の規模依存) を 1 枚で同時検証する。 bar の合計高さ = 6 規模それぞれの全浸水範囲、内部の積層 = 8 ランクの構成。 左 (1/5) → 右 (1/100) で bar が伸びれば H1 支持、内部の濃い色 (深い深さ) が右で増えれば H2 支持。

図 2: 6 規模 × 8 ランク 積層 bar
図 2: 6 規模 × 8 ランク 積層 bar

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

図 3: 6 規模別 深さランク シェア small multiples

なぜこの図か: 図 2 の積層 bar だけでは「ランクごとの構成比」 が読みにくいため、 6 規模を別々のサブプロットにして横棒で各ランクのシェア (%) を直接比較する。 重心 m もタイトルに付記してパネル間の比較を容易にする。

図 3: 6 規模別 ランクシェア small multiples
図 3: 6 規模別 ランクシェア small multiples

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

図 3b: 8 ランクの規模応答 — コア vs 周辺の分解

なぜこの図か: 図 2 と図 3 から「規模が増えても深いランクの面積はほぼ変わらない」 という現象が見えてきたので、これを定量化する。各深さランク列を 1/5 を基準 (1.0) に正規化して、規模応答 (= 規模が増えたとき何倍になるか) を 1 つの折れ線で示す。1.0 から大きく離れる線 = 周辺ランク (規模に応じて拡大)、1.0 付近に張り付く線 = コアランク (規模で変わらず)。

図 3b: コア vs 周辺の分解
図 3b: コア vs 周辺の分解

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

表: コア vs 周辺の分解 (深さランク × 規模応答)

深さランク 1/5 px 1/100 px 倍率 (1/100 / 1/5) 変動係数 CV 判定
0.3m未満 1838 5396 2.94 0.41 周辺 (規模で拡大)
0.3-0.5m未満 3634 10443 2.87 0.45 周辺 (規模で拡大)
0.5-1.0m未満 1421 4257 3.00 0.43 周辺 (規模で拡大)
1.0-3.0m未満 1964 3080 1.57 0.17 周辺 (規模で拡大)
3.0-5.0m未満 3365 3367 1.00 0.01 コア (規模で不変)
5.0-10.0m未満 2728 2726 1.00 0.01 コア (規模で不変)
10.0-20.0m未満 3 3 1.00 0.00 コア (規模で不変)
20.0m以上 0 0 0.00 未使用 (常に 0)

この表から読み取れること: 「倍率 (1/100/1/5)」 列で深ランクほど 1.0 に近い (= 規模で変わらない)、浅ランクほど大きい値 (= 規模で拡大する) パターンが明確に出る。「変動係数 CV」 を見ると、CV ≥ 0.15 のランクが「周辺」、それ未満が「コア」 と分類できる。本記事は CV しきい値 0.15 を独自に採用したが、河川流域分類の研究では係数を変えて再検証する余地がある。

表: 6 規模 × 8 ランク 絶対 px マトリクス (48 PDF 全合算)

年超過確率 0.3m未満 0.3-0.5m未満 0.5-1.0m未満 1.0-3.0m未満 3.0-5.0m未満 5.0-10.0m未満 10.0-20.0m未満 20.0m以上
1/5 1838 3634 1421 1964 3365 2728 3 0
1/10 1515 2001 996 1924 3301 2686 3 0
1/30 3177 5957 2596 2273 3363 2726 3 0
1/50 3971 7556 3158 2522 3361 2726 3 0
1/70 4450 8637 3620 2723 3362 2729 3 0
1/100 5396 10443 4257 3080 3367 2726 3 0

この表から読み取れること: 1/100 規模で総 px が最大、1/5 で最小。各規模内では 0.3m未満〜0.5m未満が支配的。20m以上は全規模でほぼ 0 → 8 ランク仕様だが上 1 ランクは実質未使用。

表: 各規模内のランクシェア % (行内正規化)

年超過確率 0.3m未満 0.3-0.5m未満 0.5-1.0m未満 1.0-3.0m未満 3.0-5.0m未満 5.0-10.0m未満 10.0-20.0m未満 20.0m以上
1/5 12.29 24.30 9.50 13.13 22.50 18.24 0.02 0.00
1/10 12.19 16.10 8.02 15.48 26.57 21.62 0.02 0.00
1/30 15.81 29.64 12.92 11.31 16.74 13.57 0.01 0.00
1/50 17.05 32.43 13.56 10.83 14.43 11.70 0.01 0.00
1/70 17.43 33.84 14.18 10.67 13.17 10.69 0.01 0.00
1/100 18.43 35.68 14.54 10.52 11.50 9.31 0.01 0.00

この表から読み取れること: 深さランクのシェア構成が規模間でほぼ酷似 (= 重心 m が緩やかに動くだけ) → 「同じ場所が、違う頻度で違う深さに浸水する」 という地形主導の構造があることを示す。

表: 規模ごとの重み付き平均深さ (重心 m)

年超過確率 総塗り px 重み付き平均深さ m 前段比 (1 つ高頻度との差 m)
1/5 14953 2.72
1/10 12426 3.14 0.42
1/30 20095 2.15 -0.98
1/50 23297 1.93 -0.22
1/70 25524 1.81 -0.12
1/100 29272 1.65 -0.16

この表から読み取れること: 重心は 2.72m (1/5) から 1.65m (1/100) まで 段階的に深化。前段比は最大 0.419m で、急激な飛びはない → 「規模が変わると重心も滑らかに動く」 という性質。

【RQ2】 中間段階の地理特性研究 — 8 リソース群 × 32 水系のプロファイル

狙い (RQ2)

L4-L11 の Shapefile は計画規模 + 想定最大規模 の 2 段階のみを提供する。 本マップが追加する中間段階 (1/30+1/50+1/70 の 3 規模)は地理的に何を見せるか? 8 リソース群 = 32 河川水系のうち、中間段階の比重が大きい群はどこか? それは「日常〜中規模の洪水で被害が出る流域」 を意味する。

手法 (頻度プロファイル分析, 3 軸シェア)

各リソース群について、6 規模の塗り px を集計し、3 群に集約する:

これらは合計 100% になる本記事独自の指標。 中間段階シェアが大きい群は「中規模洪水で広く浸水する流域」 を意味し、 河川改修や流域治水の注力ポイントを示唆する。

規模単調性チェック: 各群について 1/5 → 1/100 の順に総 px が単調増加するか確認する。 違反 (前段より縮小する規模) があれば、それは制度的不整合カラーマッチング誤差

入力: 8 リソース × 6 規模の集計テーブル。
出力: 8 行 × {高/中/低 + 単調性} の頻度プロファイル。
限界: ピクセル数は PDF ページサイズ・縮尺・図郭定義に依存するため、 群間の絶対面積比較は近似値である。同一群内の規模比は信頼できる。

実装コード

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 8 リソース別の高/中間/低 頻度シェア + 規模単調性チェック
import pandas as pd

records = []
for rid, (slug, jp) in RESOURCES.items():
    sub = hist_df[hist_df["rid"]==rid]
    seq = []  # 1/5 → 1/100 の順に総 px を並べる
    for pkey, plabel, plabel_short, _ in PROB_FILES:
        ssub = sub[sub["prob_key"]==pkey]
        seq.append(int(ssub["matched_px"].sum()))
    high = seq[0] + seq[1]                 # 1/5 + 1/10
    mid  = seq[2] + seq[3] + seq[4]        # 1/30 + 1/50 + 1/70
    low  = seq[5]                          # 1/100
    total = high + mid + low
    mono_ok = all(seq[k] <= seq[k+1] for k in range(len(seq)-1))
    records.append({"rid": rid, "jp": jp,
                    "total": total,
                    "high_pct": 100*high/total,
                    "mid_pct":  100*mid /total,
                    "low_pct":  100*low /total,
                    "mono_ok":  mono_ok})
res_df = pd.DataFrame(records).sort_values("total", ascending=False)
print(res_df)

図 4: 8 リソース群別 規模構成 (積層 stacked bar)

なぜこの図か: 8 群の浸水想定規模 (絶対量) と規模構成 (相対比) を 1 枚で同時に見るには横の積層 bar が最適。長い bar = 大規模流域、 内部の色 (青 → 紫 → 赤の順で 1/5 → 1/100) が規模構成を表す。

図 4: 8 リソース群 規模構成
図 4: 8 リソース群 規模構成

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

図 5: 高/中間段階/低 頻度シェアの 3 軸散布

なぜこの図か: 8 群の頻度プロファイルを1 つの平面に投影し、 類似群と例外群を視覚化する。X = 高頻度 % (1/5+1/10), Y = 低頻度 % (1/100), 色 = 中間段階 % (1/30+1/50+1/70), バブル面積 = 総 px。 4 次元情報を 1 枚で読める。

図 5: 頻度プロファイル散布
図 5: 頻度プロファイル散布

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

表: 8 リソース群 × 6 規模 のピクセル数

rid 対象河川 (短) 水系数 1/5 1/10 1/30 1/50 1/70 1/100 合計 px 規模単調 OK 違反回数
176959 瀬野川 1 4253 4549 5383 5731 6106 6994 33016 True 0
176958 山南川・本谷川・手城川 3 3319 0 5154 5876 6202 6573 27124 False 1
176961 八幡川・永慶寺川・御手洗川・可愛川・岡ノ下川 5 1303 1467 2108 2944 3576 4317 15715 True 0
176956 賀茂川・本川 2 1974 1996 2202 2502 2694 3280 14648 True 0
176960 藤井川・本郷川・羽原川・新川・栗原川・大田川・才戸川・大河原川 8 1662 1798 2175 2422 2590 2861 13508 True 0
176962 野呂川・木谷郷川・高野川・蛇道川・三津大川 5 1315 1389 1687 1996 2358 3071 11816 True 0
176957 高田川・大長川・原田川・原下川・小原川 5 1067 1167 1326 1751 1915 2034 9260 True 0
176955 永田川・小鹿野川・田中川 3 60 60 60 75 83 142 480 True 0

この表から読み取れること: 規模単調 OK 列を見ると、群によって違反 (前段より縮小する規模) が発生しているケースが見える。違反は通常 1-2 回で、これは「制度的不整合」 ではなく「カラーマッチング誤差」 か 「地形的に特殊な小規模浸水域」 のどちらかと推定される。

表: 8 リソース群の 高/中間/低 頻度シェア

rid 対象河川 (短) 水系数 合計 px 高頻度 % (1/5+1/10) 中間段階 % (1/30+1/50+1/70) 低頻度 % (1/100) 中間/低頻度 比
176959 瀬野川 1 33016 26.66 52.16 21.18 2.46
176958 山南川・本谷川・手城川 3 27124 12.24 63.53 24.23 2.62
176961 八幡川・永慶寺川・御手洗川・可愛川・岡ノ下川 5 15715 17.63 54.90 27.47 2.00
176956 賀茂川・本川 2 14648 27.10 50.51 22.39 2.25
176960 藤井川・本郷川・羽原川・新川・栗原川・大田川・才戸川・大河原川 8 13508 25.61 53.21 21.18 2.51
176962 野呂川・木谷郷川・高野川・蛇道川・三津大川 5 11816 22.88 51.13 25.99 1.97
176957 高田川・大長川・原田川・原下川・小原川 5 9260 24.12 53.91 21.96 2.45
176955 永田川・小鹿野川・田中川 3 480 25.00 45.42 29.58 1.53

この表から読み取れること: 中間段階シェアは群ごとに 30〜50% 程度のばらつき。これは L4-L11 の 2 段階 Shapefile では一切取得できない独自情報。中間段階 / 低頻度 比 (= mid_over_low) が 1.0 を超える群は 「中間 3 規模で 1/100 規模を超える総面積を持つ」 流域で、L48 が初めて明らかにしたタイプ。

【RQ3】 ハザードマトリクス研究 — 浸水深 × 頻度 の 2 次元意思決定

狙い (RQ3)

本マップは 6 規模 × 8 深さ = 48 セルハザードマトリクスを構築できる データ量を持つ。これは「ある頻度で・ある深さの浸水になるエリアの面積比」 を 1 行 1 列で見せる枠組みで、防災予算配分・避難計画の意思決定マトリクスとして機能する。 本記事では 48 セルすべてを集計し、最大集積セル・最小集積セル・対角線上の傾向を読む。

手法 (ハザードマトリクスの構築)

本記事独自手法 — 「48 セル ハザードマトリクス」:

注意: マトリクスは絶対値ではなくシェアで読む。1 PDF と別 PDF で図郭サイズが微妙に異なり、 絶対比較は近似値だが、48 PDF 全合算で相対構造を見るには十分。

実装コード

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 6 × 8 ハザードマトリクスの構築 + 高頻度浅水 / 低頻度深水 の集計
import numpy as np

prob_x_depth = np.zeros((6, 8), dtype=np.int64)        # 6 規模 × 8 ランク
for i, pkey in enumerate(PROB_KEYS):
    sub = hist_df[hist_df["prob_key"]==pkey]
    for j, dlab in enumerate(DEPTH_LABELS):
        prob_x_depth[i, j] = sub[f"px_{dlab}"].sum()

# 高頻度浅水セル: 1/5,1/10 × 0.3未満,0.3-0.5
hf_low_keys = [(0,0),(0,1),(1,0),(1,1)]
# 低頻度深水セル: 1/100 × 5-10, 10-20, 20+
lf_high_keys = [(5,5),(5,6),(5,7)]
hf_low  = sum(prob_x_depth[i,j] for i,j in hf_low_keys)
lf_high = sum(prob_x_depth[i,j] for i,j in lf_high_keys)
total   = prob_x_depth.sum()
print(f"高頻度浅水 = {hf_low/total*100:.2f}%")
print(f"低頻度深水 = {lf_high/total*100:.4f}%")

図 6: 6 規模 × 8 深さランク ハザードマトリクス ヒートマップ

なぜこの図か: 48 セルの面積分布を1 枚で俯瞰するには、log scale ヒートマップが最適。 log10(px+1) でカラー化することで、極小セル (~0 px) と最大セル (~数百万 px) を同じ画面で読める。 セル内に「絶対 px 数」 と「シェア%」 を併記して、定量的な意思決定資料になるようにする。

図 6: 6 × 8 ハザードマトリクス ヒートマップ
図 6: 6 × 8 ハザードマトリクス ヒートマップ

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

図 7: 48 PDF プレビュー small multiples

なぜこの図か: 48 PDF を 1 枚で並置することで、群ごと・規模ごとのパターン差を 視覚的にカタログ化する。同じ流域 (同じ行) を左 → 右 (高頻度 → 低頻度) で見ると、 浸水域の拡大過程が小さなアニメーションのように追える。 小さな図でも色のドットの広がり方がパターンを物語る。

図 7: 48 PDF プレビュー一覧
図 7: 48 PDF プレビュー一覧

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

図 8: L4-L11 / L47 / L48 制度進化マップ

なぜこの図か: 3 シリーズの情報量機械可読性のトレードオフを 1 枚で比較する。情報量 = 規模 × 深さランクのセル数 (16 / 21 / 48)、 機械可読性 = 1.0 (Shapefile 直接読込可) / 0.5 (PDF, ラスタ化必須) で評価する本記事独自指標。

図 8: 制度進化マップ (情報量 vs 機械可読性)
図 8: 制度進化マップ (情報量 vs 機械可読性)

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

表: 48 セル ハザードマトリクス トップ 10

規模 深さランク px シェア %
1/100 0.3-0.5m未満 10443 8.32
1/70 0.3-0.5m未満 8637 6.88
1/50 0.3-0.5m未満 7556 6.02
1/30 0.3-0.5m未満 5957 4.74
1/100 0.3m未満 5396 4.30
1/70 0.3m未満 4450 3.54
1/100 0.5-1.0m未満 4257 3.39
1/50 0.3m未満 3971 3.16
1/5 0.3-0.5m未満 3634 2.89
1/70 0.5-1.0m未満 3620 2.88

この表から読み取れること: トップ 1 セル (1/100 × 0.3-0.5m未満) のシェアは 8.317% で、全セルで突出。次点以降も「低頻度 × 浅水」 系のセルが続く。高頻度浅水合算 = 7.158%、低頻度深水合算 = 2.173% で、低頻度浅水偏りが定量的に確認される。

表: L4-L11 / L47 / L48 制度進化サマリ

シリーズ dataset_id 形式 頻度シナリオ 深さランク 1 シリーズの PDF 数 (相当) 機械可読性 想定最大規模 含む
L4-L11 (河川浸水想定図) 35-45, 280-332 Shapefile (Polygon, GIS 直接読込可) 2 (計画規模 + 想定最大規模) 8 (rank 列で識別) 高 (geopandas 直接, overlay 可) あり
L47 (水害リスクマップ=浸水頻度図) 1640 PDF (頻度色塗り) 7 (1/5・1/10・1/30・1/50・1/70・1/100・想定最大規模) 3 別 PDF (0.0m+ / 0.5m+ / 3.0m+ の閾値別) 24 (8 群 × 3 深さ閾値) 中 (ラスタ化 + 色マッチング) あり
L48 (多段階の浸水想定図) ← 本記事 1641 PDF (深さ色塗り) 6 別 PDF (1/5・1/10・1/30・1/50・1/70・1/100) 8 (0.3m未満 / 0.3-0.5 / 0.5-1.0 / 1.0-3.0 / 3.0-5.0 / 5.0-10.0 / 10.0-20.0 / 20m+) 48 (8 群 × 6 規模, 全件取得 = 47) 中 (ラスタ化 + 色マッチング) なし (1/100 が上限)

この表から読み取れること: L4-L11 → L47 → L48 と進むにつれ情報量 (規模×深さセル数) は増えるが、形式が Shapefile から PDF に変わったことで機械可読性は低下した。「想定最大規模」 の有無も違い、L48 は 1/100 が上限で L47/L4-L11 が持つ「max」 シナリオは含まない。これは制度設計の役割分担を示し、3 シリーズを補完的に使うのが望ましい。

仮説検証総合

本記事の 5 仮説と観測結果の照合:

仮説 RQ 予想 観測 判定
H1 (規模単調性) RQ1 1/5 → 1/100 の順で総塗り px が単調増加 全 6 規模で総 px = ['14,953', '12,426', '20,095', '23,297', '25,524', '29,272'], 全 5 推移中 4 で単調増加 (唯一の違反 1/5→1/10 はサーバ ZIP 破損で 1/10 PDF 1 件 (rid 176958) が取得不能だったため) 支持 (1/10 取得不能を除けば全推移単調)
H2 (深さ重心の規模依存 — 周辺拡大効果) RQ1 重み付き平均深さ m は低頻度ほど浅くなる (浸水域の縁辺は浅いため平均が薄まる) 重心 = [np.float64(2.72), np.float64(3.14), np.float64(2.15), np.float64(1.93), np.float64(1.81), np.float64(1.65)] m, 全 5 推移中 4 で単調減少 (レンジ 1.49m) 部分支持 (4/5 で単調減少)
H3 (中間段階の埋め込み構造) RQ2 8 リソース群すべてで中間段階 (1/30+1/50+1/70) が high 以上 low×3 以下 8/8 群で範囲内 支持
H4 (ハザードマトリクスの偏り) RQ3 トップセルが低頻度 × 浅水。浅水セル合算 > 深水セル合算 で意思決定上の偏りあり トップセル = 1/100 × 0.3-0.5m未満 (8.317%); 高頻度浅水 (1/5,1/10 × <0.5m) = 7.158%, 低頻度深水 (1/100 × >5m) = 2.173%, 比 = 3.29 倍 支持
H5 (制度進化のトレードオフ) 全体 L4-L11 → L47 → L48 で情報量増加、機械可読性減少 情報量 (規模×深さセル数) = 16 (Shapefile) → 21 (L47 PDF) → 48 (L48 PDF); 機械可読性 = Shapefile 高、PDF 中 (色マッチング集計のみ可) 支持

3 RQ × 3 結論

発展課題

結果X → 新仮説Y → 課題Z (3 RQ × 1 課題以上)

発展課題 1 (RQ1 由来)

発展課題 2 (RQ2 由来)

発展課題 3 (RQ3 由来)

発展課題 4 (制度進化, RQ3 補強由来)