Lesson 60

ため池監視カメラ及び水位計設置箇所一覧 単独 3 研究例分析 — 70 装置から 2018 豪雨後の防災投資 × 運用フェーズを読む

L60ため池監視カメラ水位計ikelog.cloudRQ×3Format BBallTreehaversineMann-WhitneyL45/L59連携L03連携2018西日本豪雨ため池管理保全法広島市
所要 35 分 / 想定レベル: 中級 / データ: DoBoX dataset 1675 (CSV 70 行 × 5 列, 8 KB) + L45/L59/L03 連携

データ取得手順

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

IDデータセット名
#62ため池基本情報
#63ため池浸水想定区域情報_Shapefile
#123dataset #123
#125dataset #125
#222dataset #222
#333dataset #333
#777dataset #777
#888都市計画区域情報_区域データ_安芸高田市_行政区域
#922都市計画区域情報_区域データ_広島県_行政区域
#1279県内のカメラ情報
#1675ため池監視カメラ及び水位計設置箇所一覧

実行コマンド:

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

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

学習目標と問い

本記事は DoBoX のシリーズ「ため池監視カメラ及び水位計設置箇所一覧」 1 件 (dataset_id = 1675) を 単独で取り上げ、 広島県内のため池監視装置 (= カメラ + 水位計の遠隔観測点) 70 箇所 (CSV, 5 列, UTF-8 BOM, 約 8 KB) を 3 つの独立した研究角度 (RQ1 / RQ2 / RQ3) で並列に分析する。 本データは2018 年西日本豪雨を契機とした防災投資の象徴で、 広島市が運用するikelog.cloud (リアルタイム観測 Web) と直結している。 Phase 4 農業遺構系の運用フェーズ側で、L59 (属性側) と L45 (幾何側) と並ぶ ため池系 3 番目の研究角度。

L59 (基本情報) / L45 (浸水想定) との関係: L59 は属性台帳 (CSV 6,754 件)を、 L45 は浸水想定 polygon (Shapefile 6,730 件) を扱った。本記事 L60 は監視装置 (CSV 70 箇所)を扱い、 「指定された 6,754 池のうち実際に監視されているのはどれか」という運用合理性の問いを初めて立てる。 3 記事は同じため池群の属性 ⇄ 幾何 ⇄ 運用の三角構造を完成させる。 ただし本データは広島市内 70 件のみ (= 県内全域ではない) という限界は本研究の前提として明示する。

独自用語の定義

研究の問い (3 RQ)

仮説 H1〜H5

  1. H1 (中山間偏在 ≥ 60%, RQ1): 監視装置は中山間 4 区 (安佐北 + 安佐南 + 安芸 + 佐伯)に 合計 60% 以上が集中。これは中山間ため池の2018 豪雨型崩落リスクを反映した制度運用。
  2. H2 (装置 ID 連番性, RQ1): 装置 ID (3072-3174) は設置順を反映する管理 IDであり、 前期コホート (= 早期設置) は重要度の高い大規模池に多いはず。
  3. H3 (監視カバー率 < 50%, RQ2): 広島市の防災重点ため池 161 件中、 監視済は半数以下。これは 2020 年代開始の新規事業のため整備途上にあることを反映。
  4. H4 (規模 ↔ 監視, RQ2): 監視済ため池は未監視より大規模。 Mann-Whitney U 片側検定で p < 0.05 の有意差を予想。 決壊時被害が大きい池を優先監視するのは制度的合理性。
  5. H5 (避難所 1km 圏 ≥ 5 が装置の半数以上, RQ3): 監視装置の1km 圏に 5 以上の避難所が 存在するのは装置の半数以上。これは「下流人家集中域に監視装置を置く」 の合理性。 ただし監視装置の中山間集中と避難所の都市部集中という制度的緊張関係も予想される。

到達点

本記事を読み終えた学習者は次の 3 点を体感できる:

  1. 1 つの「シンプルな点台帳 CSV (70 行 × 5 列)」 から、 地理 (緯度経度) + 設置順 (device_id) + 行政 (広島市 8 区) + 運用 (URL)という 4 軸を多角度に読む方法を体感する。 5 列しかないデータでも、適切な独自解析と既存データ (L45/L59/L03) との結合で 豊かな研究が可能であることを実証。
  2. L59 (属性側) と L45 (幾何側) と本記事 (運用側) の三角構造を体感する。 同じため池群を 3 つの異なる断面から見ることで、 「制度→投資→運用」 の三段ロケットがデータに刻まれた痕跡を読む研究の作法を学ぶ。
  3. BallTree (haversine) を使った最近隣空間検索と Mann-Whitney U の 分布差検定を組み合わせ、空間 + 統計の両面から仮説検証する研究プロセスを体感する。 「どこに監視を置くか」という防災行政の意思決定に研究的視点で迫る教材として機能する。

使用データ

DoBoX のシリーズ「ため池監視カメラ及び水位計設置箇所一覧」 1 件のみを単独で扱う。 リソースは CSV 1 ファイルのシンプル構造 (UTF-8 BOM、約 8 KB)。

項目
dataset_id 1675
公式名 ため池監視カメラ及び水位計設置箇所一覧
形式 CSV (UTF-8 BOM)
件数 70 行 × 5 列
サイズ 8,457 byte
CRS WGS84 (緯度経度) → 解析時 EPSG:6671 m 単位
座標カバレッジ 緯度 34.368-34.596 / 経度 132.327-132.667
カバー範囲 広島市 5 区 (中区・南区・西区はゼロ)
装置 ID 範囲 3072 - 3174 (= ID 幅 103)
ライセンス CC-BY 4.0
作成主体 広島市
L59 連携 (広島市分) 防災重点ため池 161 件中 70 件 (43.5%) を監視
L03 連携 (広島市分) 避難所 1218 件 / 装置 1km 圏内 平均 2.9 避難所

この表から読み取れること: dataset 1675 はシンプルな CSV 単一ファイルで 8 KB と小さい。 70 行 × 5 列だが、緯度経度・装置 ID (URL 末尾) を全件保有。 解析時は EPSG:6671 (平面直角座標系第 III 系) に変換して距離を m 単位で扱う。 公式名には「広島県」 が含まれないが、住所はすべて広島市内なので実質広島市データ。 L59 防災重点ため池との結合可能率 100% (全 70 装置が広島市内ため池の 100m 以内)、 L03 避難所との 1km 圏結合で監視優先度の妥当性検証が可能。

データの構造 (5 列の意味)

関連データセットとの対応

ダウンロード

本レッスンの再現に必要な全データ・中間 CSV・図 PNG・スクリプトを以下から直接 DL できる:

生データ (DoBoX 直リンク)

本記事の中間 CSV (再現用)

図 PNG (8 枚) と Python スクリプト

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

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

CSV は本スクリプトが DoBoX dataset 1675 から自動 DL する (キャッシュ済なら再利用)。 L45 cache (広島市分 161 ため池の事前処理結果) と L03 shelters.json も内部で読込。

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

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

【RQ1】 監視装置の地理分布と区別構造 — 70 箇所 / 中山間 4 区に 96% 偏在

RQ1 の狙い

70 件の監視装置を区別 / 立地 / 装置 ID / 最近隣距離で多角度に集計し、 「広島市の監視装置はどこに、どう散らばっているか」 を立体的に描く。 特に安佐北区 30 (43%) の偏在と 都市核心 3 区ゼロという極端な分布の意味を、立地区分と装置 ID から読み解く。

手法 (前置き解説)

入出力の Before/After 例

段階1 件のデータの中身サイズ
(0) CSV 1 行 (raw)"流谷","広島市東区戸坂新町一丁目",34.423818,132.495138,"https://...device-chart/3094"5 列
(1) 数値型 cast (空白 strip)緯度=34.4238, 経度=132.49515 列 + 2 派生
(2) URL から device_id 抽出+ device_id=3094+ 1 派生
(3) 区抽出 (正規表現)+ 区="東区"+ 1 派生
(4) 立地区分付与+ 立地区分="都市部"+ 1 派生
(5) GeoDataFrame 化 → EPSG:6671+ x_m=29986, y_m=-174468+ 2 派生
(6) BallTree NN 計算+ NN距離_m=87 (= 最近隣装置まで 87m)+ 1 派生
(7) コホート付与+ 設置コホート="中期"+ 1 派生

(0)-(7) を全 70 行に適用 → groupby で集計 → 図化。BallTree は 70 行なら 1 ms で完了。

実装コード (CSV 読込 + 区抽出 + GeoDataFrame + BallTree NN)

L60_pond_monitoring.py 行 1502–1601

 1
 2
 3
 4
 5
 6
 7
 8
 9
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
# 1. CSV 読込 (UTF-8 BOM + 末尾空白 strip)
df = pd.read_csv(CSV_PATH, encoding="utf-8-sig", dtype=str)
df.columns = [c.replace("", "").strip().strip('"') for c in df.columns]
df["緯度"] = pd.to_numeric(df["緯度"].astype(str).str.strip(), errors="coerce")
df["経度"] = pd.to_numeric(df["経度"].astype(str).str.strip(), errors="coerce")

# 2. URL → device_id (正規表現抽出)
df["device_id"] = df["観測情報URL"].str.extract(r"/device-chart/(\d+)").astype(int)

# 3. 住所 → 区 (正規表現)
def get_ku(s):
    m = re.search(r"広島市([^区市町]+区)", str(s))
    return m.group(1) if m else "その他"

df["区"] = df["住所"].apply(get_ku)

# 4. 立地区分 (中山間 vs 都市部)
INLAND_KU = {"安佐北区", "安佐南区", "安芸区", "佐伯区"}
URBAN_KU  = {"中区", "東区", "南区", "西区"}
df["立地区分"] = df["区"].apply(
    lambda k: "中山間" if k in INLAND_KU else
              ("都市部" if k in URBAN_KU else "その他")
)

# 5. GeoDataFrame 化 (WGS84 → EPSG:6671)
gdf = gpd.GeoDataFrame(
    df,
    geometry=gpd.points_from_xy(df["経度"], df["緯度"]),
    crs="EPSG:4326",
).to_crs("EPSG:6671")

# 6. BallTree (haversine) で最近隣装置距離 (NN)
from sklearn.neighbors import BallTree
EARTH_R_M = 6_371_000.0
mon_rad = np.deg2rad(df[["緯度", "経度"]].values)
tree = BallTree(mon_rad, metric="haversine")
nn_d, _ = tree.query(mon_rad, k=2)              # k=2 → 自身 + 最近隣
df["NN距離_m"] = nn_d[:, 1] * EARTH_R_M          # rad → m
print(f"NN 中央値: {np.median(df['NN距離_m']):.0f} m")

# 7. 区別ランキング
ku_rank = (
    df.groupby("区").size().reset_index(name="件数")
      .sort_values("件数", ascending=False).reset_index(drop=True)
)
ku_rank["シェア_%"] = (ku_rank["件数"] / len(df) * 100).round(2)
print(ku_rank)

図 1: なぜこの図か (RQ1)

「監視装置がどこに、どんな順序で散らばっているか」 を 1 枚で読みたい。 左の点マップで全 70 点の地理分布と装置 ID (色) を直感的に把握し、 右の区ランキング棒で件数の偏りと立地区分 (中山間=赤 / 都市部=青) の対比を読む。 点マップは「面で見る」、棒グラフは「順序で見る」 の2 つの認知モードを 1 枚に束ねるのが狙い。

図 1 (RQ1): 広島市内 70 装置マップ (色=device_id) + 8 区別ランキング棒
図 1 (RQ1): 広島市内 70 装置マップ (色=device_id) + 8 区別ランキング棒

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

図 2: なぜこの図か (RQ1)

監視ネットワークの密度を見たいので、最近隣装置距離 (NN) のヒストdevice_id × 緯度の散布を並べた。 NN 分布は「監視点同士がどれくらい近くにあるか」 を読む基本指標。 device_id × 緯度散布は「設置順と地理が連動するか」 を視覚的に検証する。 点を区で色分けすれば「どの区がどの ID 帯に対応するか」 も同時に読める。

図 2 (RQ1): 装置同士の最近隣距離ヒスト + device_id × 緯度散布
図 2 (RQ1): 装置同士の最近隣距離ヒスト + device_id × 緯度散布

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

図 3: なぜこの図か (RQ1)

区ごとの装置配置パターンを見たいので、装置のある 5 区の small multiples マップを選んだ。 全市マップでは点が密集すぎて区別の特徴が見えないが、区単位で同じ縮尺で並置すれば 「安佐北は北部山地に分散」「安芸は南部にクラスタ」 など、地域固有の点分布パターンを比較できる。

図 3 (RQ1): 装置のある 5 区別 small multiples マップ
図 3 (RQ1): 装置のある 5 区別 small multiples マップ

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

表: 全体サマリ (3 RQ 統合)

指標
監視装置総数 70 箇所
カバー区数 1 区 / 8 区中 5 区
Top 区 安佐北区 30 箇所 (42.9%)
中山間 4 区 計 67 箇所 (96%)
都市核心 3 区計 3 箇所 (= 0 ため池無し)
最近隣装置距離 (装置同士) 中央 887 m / 平均 1325 / 最大 5929
広島市内 防災重点ため池 (L59) 161 件
監視カバー率 43.5% (70 / 161)
未監視ため池 91 件 (中央距離 1309m, 最大 8.3km)
規模 (中央 千m³): 監視済 vs 未監視 2.06 vs 0.21 (= 9.69倍)
Mann-Whitney U 規模差 p (片側) 0.0000 (監視済が大規模)
装置 1km 圏 避難所数 (中央) 2 (平均 2.9)
区別 装置数 × 避難所数 r 0.413

この表から読み取れること: 全 70 装置の基本統計、中山間 67 装置 (96%)、防災重点ため池 161 件への監視カバー率 43.5%、装置 1km 圏避難所数 中央 2 等、3 RQ の核心指標が 13 行に集約された統合サマリ。

表: 区別装置数ランキング (8 区全部)

件数 立地区分 シェア_%
安佐北区 30 中山間 42.86
安芸区 19 中山間 27.14
安佐南区 13 中山間 18.57
佐伯区 5 中山間 7.14
東区 3 都市部 4.29
中区 0 都市部 0.00
南区 0 都市部 0.00
西区 0 都市部 0.00

この表から読み取れること: 安佐北区 30 (42.9%) 単独で Top 1、中山間 4 区 (赤帯立地) がすべて上位 4 位を独占。中区・南区・西区は 0 装置 = 都市核心部にため池そのものが存在しない地理を反映。立地 = 中山間 / 都市部の単純な分類で監視装置の地理パターンが説明される。

表: 設置コホート × 区

設置コホート 佐伯区 安佐北区 安佐南区 安芸区 東区
前期 3 7 4 7 2
中期 1 10 3 9 0
後期 1 13 6 3 1

この表から読み取れること: 装置 ID を 3 等分した前期/中期/後期コホートと区のクロス。コホートと区の対応関係は弱く、各区で全コホートに分散して設置されている。ただし対応ため池の中央貯水量で見ると 4.10 → 2.06 → 1.80 千m³ と単調減少 = 大規模池が早く監視された制度設計が読み取れる (H2 強支持)。

【RQ2】 監視ネットワークの空白 — 161 池中 91 池が監視ネット外

RQ2 の狙い

L59 (基本情報, 6,754 件) と L45 (浸水想定, 6,730 polygon) の連携で 広島市内の防災重点ため池 161 件を取り出し、本データの 70 装置との結合カバレッジを測る。 具体的に:

  1. 各ため池の最近隣監視装置距離を haversine で計算し、100m 以内なら「監視済」 と判定
  2. 未監視ため池の最近隣監視点距離分布から監視ネットワーク到達半径を可視化
  3. 監視済 vs 未監視の規模 (堤高・貯水量) を Mann-Whitney U で検定し監視優先度の制度合理性を検証

これは単なる「カバー率の集計」 ではなく、「下流被害ポテンシャルの大きい池が監視されている」という 制度設計仮説を統計的に検証する研究。

手法 (前置き解説)

入出力の Before/After 例

段階1 件のデータの中身件数
(0) L45 cache から広島市抽出"341000001","長尾池","広島市",緯度,経度,堤高,貯水量,...161
(1) ため池 BallTree query (k=1)+ 最近隣監視点_m=2.6, 最近隣装置="長尾池"161
(2) 100m 閾値で監視済判定+ 監視済=True (この池は監視済)監視済 70 / 未監視 91
(3) sjoin で区付与+ 区="東区"161
(4) Mann-Whitney U監視済中央 2.06 vs 未監視 0.21 → p=0.0002 群

実装コード (L45 cache 読込 + BallTree 双方向 NN + Mann-Whitney U)

L60_pond_monitoring.py 行 1663–1767

 1
 2
 3
 4
 5
 6
 7
 8
 9
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
# 1. L45 既処理 cache から広島市分のため池を抽出
l45 = pd.read_csv(L45_CACHE, dtype={"ため池番号": str})
hiro_ponds = l45[l45["所管市町"] == "広島市"].copy()
hiro_ponds["緯度"] = pd.to_numeric(hiro_ponds["緯度"], errors="coerce")
hiro_ponds["経度"] = pd.to_numeric(hiro_ponds["経度"], errors="coerce")
hiro_ponds = hiro_ponds.dropna(subset=["緯度", "経度"])

# 2. BallTree (haversine) でため池 → 最近隣装置距離
from sklearn.neighbors import BallTree
EARTH_R_M = 6_371_000.0
mon_rad   = np.deg2rad(df[["緯度", "経度"]].values)
ponds_rad = np.deg2rad(hiro_ponds[["緯度", "経度"]].values)
tree_mon  = BallTree(mon_rad, metric="haversine")
nearest_d, nearest_i = tree_mon.query(ponds_rad, k=1)
hiro_ponds["最近隣監視点_m"] = nearest_d[:, 0] * EARTH_R_M

# 3. 100m 閾値で「監視済」 判定 (= 同一池)
SAME_POND_THRESHOLD_M = 100.0
hiro_ponds["監視済"] = hiro_ponds["最近隣監視点_m"] < SAME_POND_THRESHOLD_M

n_monitored = hiro_ponds["監視済"].sum()
cover_rate  = n_monitored / len(hiro_ponds) * 100
print(f"監視カバー率: {cover_rate:.1f}% ({n_monitored}/{len(hiro_ponds)})")

# 4. 区別カバー率 (sjoin で区付与)
ponds_gdf = gpd.GeoDataFrame(
    hiro_ponds,
    geometry=gpd.points_from_xy(hiro_ponds["経度"], hiro_ponds["緯度"]),
    crs="EPSG:4326",
).to_crs("EPSG:6671")
ponds_with_ku = gpd.sjoin(ponds_gdf, ku_diss[["区名", "geometry"]],
                           how="left", predicate="within")
hiro_ponds["区"] = ponds_with_ku["区名"].fillna("その他").values

ku_cover = (
    hiro_ponds.groupby("区")
              .agg(全件数=("ため池番号", "count"),
                   監視済=("監視済", "sum"))
              .reset_index()
)
ku_cover["カバー率_%"] = (ku_cover["監視済"] / ku_cover["全件数"] * 100).round(1)
print(ku_cover)

# 5. Mann-Whitney U で監視済 vs 未監視 の規模差検定 (片側)
from scipy.stats import mannwhitneyu
mon_cap   = hiro_ponds[hiro_ponds["監視済"]]["貯水量_千m3"].dropna()
unmon_cap = hiro_ponds[~hiro_ponds["監視済"]]["貯水量_千m3"].dropna()
u, p = mannwhitneyu(mon_cap, unmon_cap, alternative="greater")
print(f"H4: 監視済が大規模 → U={u:.0f}, p={p:.4f}")

図 4: なぜこの図か (RQ2)

「監視ネットワークの空白がどこにあるか」 を地図と分布で同時に読みたい。 左マップは防災重点ため池 161 件を監視済 (青) と未監視 (赤) で塗り分け、 監視装置 (黒★) を重ねて「装置がない場所のため池」を浮かび上がらせる。 右ヒストは未監視 91 池の最近隣監視点距離分布で、 1km 圏オレンジ点線・中央値黒破線・P75 紫破線の 3 マーカーで「どこまで監視ネットが届くか」 を読む。

図 4 (RQ2): 監視済 vs 未監視 ため池マップ + 未監視 91 池の最近隣監視点距離分布
図 4 (RQ2): 監視済 vs 未監視 ため池マップ + 未監視 91 池の最近隣監視点距離分布

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

図 5: なぜこの図か (RQ2)

「監視カバー率を区別に可視化」 と「監視済 vs 未監視の規模差」 を 1 枚で見たい。 左の区別カバー率棒は色 (赤=未監視あり / 青=完全監視) で 100% 達成区を識別。 右の規模箱ひげは log10 貯水量で監視済 vs 未監視を比較し、 Mann-Whitney U の p 値も併記して仮説 H4 (大規模が優先監視) の統計的妥当性を読む。

図 5 (RQ2): 区別 監視カバー率 + 監視済 vs 未監視 規模箱ひげ (Mann-Whitney U)
図 5 (RQ2): 区別 監視カバー率 + 監視済 vs 未監視 規模箱ひげ (Mann-Whitney U)

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

図 6: なぜこの図か (RQ2)

装置設置順 (= device_id) と対応ため池の規模に何らかの関係があるか? 左のdevice_id × log10 貯水量散布と右のコホート別箱ひげで H2 (前期コホートに大規模池が集まる) を視覚的に検証する。 散布図のコホート境界 (灰点線) が「前期/中期/後期」 を区切り、 箱ひげの中央値で順序関係を読む。

図 6 (RQ2): device_id × 対応ため池 log10 貯水量 散布 + コホート別箱ひげ
図 6 (RQ2): device_id × 対応ため池 log10 貯水量 散布 + コホート別箱ひげ

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

表: 区別 監視カバー率

全件数 監視済 未監視 カバー率_%
安芸区 65 19 46 29.23
安佐北区 47 30 17 63.83
安佐南区 22 13 9 59.09
東区 14 3 11 21.43
佐伯区 11 5 6 45.45
その他 2 0 2 0.00

この表から読み取れること: 各区の防災重点ため池数・監視済・未監視・カバー率。全区が 100% 未満 = 整備途上の事業。全市カバー率 43.5% は実質「全区問題」 で、特定区だけの未整備ではない。未監視 93 件は下流人家リスクが相対的に低い谷頭部の池として後回しの可能性。

表: 監視済 vs 未監視 規模比較

指標 監視済 未監視
件数 70 91
中央堤高 (m) 5.78 3.25
中央貯水量 (千m³) 2.06 0.21
Mann-Whitney U 統計量 5951.0 (片側 H1: 監視済 > 未監視)
p 値 (貯水量, 片側) 0.0000 監視済が大規模
p 値 (堤高, 片側) 0.0000 監視済が大規模

この表から読み取れること: 監視済 70 池 vs 未監視 91 池の中央規模比較。Mann-Whitney U 片側検定で 貯水量 p < 0.05 で有意 = 監視済が大規模。制度設計が決壊時被害の大きい大規模池を優先監視している証拠 (H4 強支持)。

表: 装置 → 対応ため池 (device_id 上位 5 件抜粋)

device_id 観測所名 対応ため池名 対応ため池_m 対応貯水量_千m3 対応堤高_m 設置コホート
3072 荒谷池 安佐南区 荒谷池 41 30.00 17.05 前期
3073 穴の口池 安芸区 穴の口池 21 0.93 4.90 前期
3074 水越下池 安芸区 水越下池 17 10.30 6.20 前期
3075 海の平池 安芸区 海の平池 19 6.00 5.85 前期
3076 入の谷 佐伯区 入の谷 32 1.36 4.00 前期

この表から読み取れること: 早期 device_id (前期コホート) の装置がどんなため池を監視しているか。対応貯水量・堤高は装置ごとに大きく異なり、device_id と規模に明確な順序関係なし

表: 未監視ため池 距離降順 Top 15 (= 監視ネット外延)

ため池番号 ため池名称 堤高_m 貯水量_千m3 緯度 経度 最近隣監視点_m
343240027 柏原1号 佐伯区 3.5 0.080 34.53122 132.31936 8295
343240012 柏原1号 佐伯区 2.0 0.469 34.43780 132.27445 4905
341070429 門前 安芸区 2.8 0.200 34.34272 132.54375 4820
341070431 安芸区 2.8 0.167 34.34645 132.53218 4097
341070379 薬師 安芸区 4.2 0.267 34.35183 132.54450 3945
341070376 花上新 安芸区 3.5 0.430 34.35120 132.54302 3941
341070380 箱師池 安芸区 2.3 0.200 34.35313 132.54354 3777
343240002 十文字1号 佐伯区 4.0 0.030 34.42723 132.29324 3626
341070435 北尾 安芸区 4.0 0.280 34.35480 132.54244 3566
341060168 佐川池 安佐北区 1.9 0.120 34.54192 132.46689 3100
343240014 東大畑1号 佐伯区 4.2 0.588 34.44744 132.29536 2978
341050125 小松池 安佐南区 2.4 0.150 34.48339 132.36111 2957
341070355 干野池 安芸区 2.1 0.180 34.41881 132.59988 2895
341070356 小野村池 安芸区 2.3 0.080 34.41856 132.59970 2883
341060191 後迫1号池 安佐北区 1.9 0.080 34.48244 132.58278 2852

この表から読み取れること: 監視ネットから最も離れたため池の Top 15。これらは「次に監視装置を増設すべき候補池」として防災行政の優先度評価に直結。距離順だが、規模 (貯水量) も大きい池が混在 = 「孤立 + 大規模」の二重リスク池が浮かぶ。

【RQ3】 下流リスクとの一致 — 装置 1km 圏避難所中央 2 / 区別 r = 0.41

RQ3 の狙い

監視装置と下流人家・避難所の空間関係を測り、「監視優先度の妥当性」を検証する。 仮説: 監視装置は下流人家集中域 (= 避難所多い区)にあるべきだが、 実際は中山間集中。両者の制度的緊張関係を空間統計で読む。

  1. L03 既扱の避難所 JSON から広島市分 1218 件を抽出 (1051 件が洪水対応)
  2. 各監視装置の 1km 圏避難所数を BallTree で計算 (= 下流人家リスクの代理指標)
  3. 監視済 vs 未監視のため池でも同様に避難所数を計算し、選定の妥当性を比較
  4. 区別 装置数 × 避難所数の Pearson r で「制度的緊張関係」 を定量化

手法 (前置き解説)

入出力の Before/After 例

段階1 件のデータの中身件数
(0) shelters.json (raw){"name":"袋町小学校", "lat":34.39, "lon":132.46, ...}4,065 全件
(1) 広島市フィルタ"municipalityName":"広島市中区" 系のみ抽出1218
(2) 1km 圏 BallTree query+ 装置 "流谷" の 1km 圏 = N 避難所装置 70 行 × 1 列
(3) 区別装置 vs 避難所集計{"安佐北区": (装置 30, 避難所 153), ...}5 区
(4) Pearson r 計算r = 0.413scalar

実装コード (shelters.json 読込 + BallTree query_radius + Pearson r)

L60_pond_monitoring.py 行 1827–1914

 1
 2
 3
 4
 5
 6
 7
 8
 9
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
# 1. shelters.json を読込, 広島市分のみ抽出
import json
with open(SHELTERS_JSON, encoding="utf-8") as f:
    sd = json.load(f)
shel = pd.DataFrame([
    {"name": it["name"],
     "ku": it["municipalityName"].replace("広島市", "").strip(),
     "lat": float(it["latitude"] or "nan"),
     "lon": float(it["longitude"] or "nan"),
     "floodFlg": it.get("floodShFlg") or "0"}
    for it in sd["items"]
    if "広島市" in (it.get("municipalityName") or "")
       and it.get("latitude") and it.get("longitude")
])

# 2. BallTree で 1km 圏避難所数 / 最近隣避難所距離
from sklearn.neighbors import BallTree
EARTH_R_M = 6_371_000.0
RADIUS_M  = 1000.0
shel_rad  = np.deg2rad(shel[["lat", "lon"]].values)
cam_rad   = np.deg2rad(df[["緯度", "経度"]].values)
tree_shel = BallTree(shel_rad, metric="haversine")
df["避難所1km圏数"] = tree_shel.query_radius(
    cam_rad, r=RADIUS_M / EARTH_R_M, count_only=True
)
nearest_d, _ = tree_shel.query(cam_rad, k=1)
df["最近隣避難所_m"] = nearest_d[:, 0] * EARTH_R_M

# 3. 区別 装置数 vs 避難所数
ku_dev = df.groupby("区").size().reset_index(name="装置数")
ku_shel = shel.groupby("ku").size().reset_index(name="避難所数").rename(
    columns={"ku": "区"})
ku_combined = ku_dev.merge(ku_shel, on="区", how="left").fillna(0)

# 4. Pearson r で「装置多 ⇄ 避難所多」 を測定
r_dev_shel = ku_combined[["装置数", "避難所数"]].corr().iloc[0, 1]
print(f"装置数 × 避難所数 Pearson r = {r_dev_shel:.3f}")

# 5. H5: 1km 圏 5+ 避難所をもつ装置の割合
n_5plus = (df["避難所1km圏数"] >= 5).sum()
print(f"1km 圏 5+ 避難所: {n_5plus}/{len(df)} ({n_5plus/len(df)*100:.0f}%)")

図 7: なぜこの図か (RQ3)

監視装置 (赤★) と避難所 (灰小点) を1 枚の重ね合わせマップに投入し、 「装置の周りにどれくらい避難所があるか」を視覚的に読む (左)。 さらに装置 1km 圏避難所数のヒスト (右) で個別装置の下流リスク代理指標を分布として読む。 1km 圏 5 避難所以上を持つ装置は H5 の重要閾値。

図 7 (RQ3): 監視装置 70 + 避難所 1218 重ね合わせマップ + 装置 1km 圏避難所数ヒスト
図 7 (RQ3): 監視装置 70 + 避難所 1218 重ね合わせマップ + 装置 1km 圏避難所数ヒスト

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

図 8: なぜこの図か (RQ3)

「装置多 ⇄ 避難所多」 の関係を区単位で見たい (左) と、 監視済 vs 未監視ため池の1km 圏避難所数の差を見たい (右)。 左のグループ棒は装置数 (赤) と避難所数 (青) を共通軸 (区) で並べ、 Pearson r で全体の傾向を読む。 右の箱ひげは「監視済が下流リスク高い池に置かれているか」 を直接検証する。

図 8 (RQ3): 区別 装置 vs 避難所 グループ棒 + 監視済/未監視ため池 1km 圏避難所数比較
図 8 (RQ3): 区別 装置 vs 避難所 グループ棒 + 監視済/未監視ため池 1km 圏避難所数比較

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

表: 区別 装置 vs 避難所

件数 シェア_% 避難所数 避難所_装置比
安佐北区 30 42.86 153 5.1
安芸区 19 27.14 78 4.1
安佐南区 13 18.57 156 12.0
佐伯区 5 7.14 117 23.4
東区 3 4.29 89 29.7

この表から読み取れること: 各区の装置数 vs 避難所数の対比。避難所数は装置数の数倍〜数十倍 (= 避難所は都市部に多い)。避難所/装置比 = 12.0 倍 (中央値)で、区によって大きく異なる。区別 装置数 × 避難所数 Pearson r = 0.41

表: 1km 圏避難所数 上位 5 装置 (= 都市部隣接装置)

観測所名 避難所1km圏数 最近隣避難所_m 対応ため池名
倉掛3号 安佐北区 18 404 倉掛3号
流谷 東区 15 88 流谷
前原 安佐南区 8 208 前原
洗川池 安芸区 8 128 洗川池
迫堤 安佐南区 7 362 迫堤

この表から読み取れること: 装置の 1km 圏内に最も多く避難所がある装置 Top 5。これらは都市部に近いため池の監視装置で、決壊時の下流被害が即座に住宅地に及ぶリスクが高い。下流人家リスク優先という制度合理性の証拠候補。

表: 1km 圏避難所数 下位 5 装置 (= 山間部装置)

観測所名 避難所1km圏数 最近隣避難所_m 対応ため池名
穴の口池 安芸区 0 1053 穴の口池
上岡1号(旧岡上) 安佐北区 0 1271 上岡1号(旧岡上)
牛ヶ谷池① 安芸区 0 1693 牛ヶ谷大池
牛ヶ谷池② 安芸区 0 1645 牛ヶ谷大池
畠池 安芸区 0 1444 畠池

この表から読み取れること: 装置の 1km 圏内に避難所が最も少ない装置 Bottom 5。これらは谷頭部・山間部のため池の監視装置で、近隣に住民集中がない。それでも監視されているのは「中山間ため池の崩落リスク優先」という別の制度ロジック (= 2018 豪雨型崩落)。

仮説検証総合

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

仮説 観測値 判定 解釈
H1 中山間偏在 (中山間 ≥ 60%) 観測 中山間 67/70 (96%) 強支持 H1 強支持: 中山間 4 区 (67 = 96%) に偏在、都市核心 3 区はゼロ。2018 豪雨型崩落リスクの地理が制度に反映
H2 装置 ID コホート性 (前期=大規模) 前期中央 4.10 vs 後期中央 1.80 千m³ 強支持 H2 強支持: 前期 → 中期 → 後期の中央貯水量が 4.10 → 2.06 → 1.80 千m³ と単調減少。device_id は設置順の代理として機能し、大規模池が早く監視された制度設計が確認された (前期/後期で規模 2.3 倍差)
H3 監視カバー率 (< 50%) 観測 43.5% (70/161) 強支持 H3 強支持: 監視カバー率 43.5% で 半数以下。広島市内ですら未整備が過半数 = 整備途上の事業
H4 規模 ↔ 監視 (監視済 > 未監視, p<0.05) 監視済中央 2.06 vs 未監視 0.21 千m³, p=0.000 強支持 H4 強支持: Mann-Whitney 片側 p = 0.000. 監視済が 有意に大規模な傾向 (9.69 倍)
H5 避難所 1km 圏 ≥ 5 (装置の半数以上) 観測 16/70 (23%) の装置が 1km 圏 5+ 避難所 部分支持 H5 部分支持: 装置 1km 圏 5+ 避難所 = 16/70 (23%). 区別装置数 × 避難所数 r=0.41 = 正相関。監視装置は中山間集中 = 避難所多寡とは別の論理 (= 池の所在による配置)

3 RQ × 3 結論

制度史的位置付け

本データ (#1675) は「2018 西日本豪雨 → ため池管理保全法 (2019) → 監視装置整備 (2020s)」三段ロケットの最終段として 2024 年時点でスナップショットされた運用台帳である。L59 (属性側) で見た「ため池管理保全法経過措置期限 R3.5.31 一斉指定」 が制度設計の第一段、L45 (幾何側) で見た「浸水想定 SHP 整備 99.6%」 が第二段、そして本記事 L60 で見た「監視装置設置 70 箇所 (広島市内カバー率 43.5%)」 が第三段制度的整備の先進度は L59 > L45 > L60 の順で、監視装置はまだ最も初期段階にある。本データの研究的価値は「2018 豪雨後の防災投資が運用フェーズでどこまで進んだか」をベースライン記録する素材としての位置にある。

発展課題

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

発展課題 1 (RQ1 由来): 監視装置の Voronoi 担当面積で「監視ネット密度」 を可視化

発展課題 2 (RQ1 由来): リアルタイム観測値 (ikelog.cloud) のスクレイピングで時系列分析

発展課題 3 (RQ2 由来): 未監視 91 件の優先度スコアリング

発展課題 4 (RQ3 由来): 装置 1km 圏人口の精緻化 (250m メッシュ人口)

発展課題 5 (展望): 県内全域への展開 — 他市町のため池監視装置データ調査

発展課題 6 (歴史): ため池系 3 記事 (L45 / L59 / L60) の統合エッセイ