Lesson 63

津波災害警戒区域 単独 3 研究例分析 — 178,004 セルから「想定 vs 指定」の制度差を読む

L63津波災害警戒区域津波防災地域づくり法RQ×3Format BgeopandasShapefilechoroplethL49連携 (想定)L22連携 (人口)想定vs指定包含関係1.28M polygon
所要 50 分 / 想定レベル: 中級 / データ: DoBoX dataset 47 (Shapefile, 27.8 MB) + L49 想定キャッシュ + L22 人口連携

学習目標と問い

本記事は DoBoX のシリーズ「津波災害警戒区域情報」 1 件 (dataset_id = 47) を 単独で取り上げ、 広島県沿岸で法的に指定された津波災害警戒区域の地理構造を 3 つの独立した研究角度 (RQ1 / RQ2 / RQ3) で並列に分析する。 本データは 1,285,428 polygon (10m メッシュ単位)、Shapefile 形式 (27.8 MB)。

L49 (津波浸水想定) との位置付け: L49 は「想定」 (= 技術的シミュレーション結果) で法的拘束力なし。 本記事 L63 は「指定」 (= 都道府県知事が告示する法的指定区域) で法的拘束力あり。 両者は範囲が一致するわけではなく、L63 は制度的に切り取られた一部分。 この「想定 vs 指定」の制度差を本研究 RQ2 で空間統計化する。

制度的背景: 津波災害警戒区域は津波防災地域づくり法 (2011 年 12 月 14 日法律第 123 号) 第 53 条に基づく 都道府県知事の告示指定。2011 年東日本大震災を契機に制度化され、住民への津波情報伝達体制の整備、 避難場所・避難経路の確保、要配慮者利用施設の避難確保計画策定義務等が伴う。 広島県は 2019-03-02 に告示を行い、本データはその告示内容を Shapefile 化したもの。

独自用語の定義

研究の問い (3 RQ)

仮説 H1〜H5

  1. H1 (浅水支配, RQ1): 警戒区域の基準水位は0.5〜2.0m が支配的で、 3m 超は < 20%。瀬戸内海津波の地形的特性を反映。
  2. H2 (湾奥 + 干拓地集中, RQ1): 上位 3 市町で全体の 40% 超。 湾奥 + 干拓地 + 多島海の 3 地形類型が指定面積を支配。
  3. H3 (想定 ⊃ 指定, RQ2): L49 想定 ⊃ L63 指定 の包含関係。 包含率 ≥ 95% を予想。
  4. H4 (制度差の地理パターン, RQ2): 「想定のみ」 と「指定のみ」 のバランスが 市町ごとに異なる。市町別審議の結果。
  5. H5 (人口密度勾配, RQ3): 区域内人口密度は 都市部 >> 中山間沿岸、上位/下位比 ≥ 5 倍。 都市部の防災投資優先度の高さを数量化。

到達点

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

  1. 1 つの大規模 Shapefile (1.28M polygon, 27.8 MB) を効率的に処理する空間データ分析の 標準ワークフロー (= 30m 集約 + dissolve + sjoin + キャッシュ化) を体感する。
  2. 「想定 (技術的)」 と「指定 (法的)」という防災制度の 2 段階を空間統計で対比し、 包含率 70% という数字で制度的フィルタの実態を読む。 法的指定が技術的想定をどう翻訳するか、その結果がどんな空間パターンを生むかを理解する。
  3. L22 既扱の人口データを使った「ハザード人口密度指標」都市沿岸 vs 中山間沿岸の 構造対比を抽出。都市部の 14 倍差という数字で防災投資優先度の地理パターンを定量化する。

使用データ

DoBoX のシリーズ「津波災害警戒区域情報」 1 件のみを単独で扱う。 リソースは Shapefile 1 セット (27.8 MB ZIP, 解凍後 約 210 MB)。

項目
dataset_id 47
公式名 津波災害警戒区域情報
resource_id 42
ファイル 340006_tsunami_caution_area_20190302.zip
形式 Shapefile (Polygon, EPSG:2445)
ZIP サイズ 27,813,176 byte (= 27.8 MB)
レコード数 1,285,428 polygon
属性列 kijyun_sin (int, cm 単位の基準水位 = 浸水深×100)
最大基準水位 8.68 m (= max kijyun_sin 868 cm)
座標系 EPSG:2445 (平面直角第 3 系) → EPSG:6671 で処理
作成日 2022-04-08
最終更新 2022-05-20
告示日 2019-03-02
ライセンス クリエイティブ・コモンズ表示 (CC-BY)
法的根拠 津波防災地域づくり法 第 53 条 (2011 年法律第 123 号)
作成主体 広島県土木建築局
URL https://hiroshima-dobox.jp/datasets/47
DL URL https://hiroshima-dobox.jp/resource_download/42

この表から読み取れること: dataset 47 は1,285,428 polygonの大規模 Shapefile。 kijyun_sin 1 列のみのシンプルなスキーマで、整数 cm 単位の基準水位 (= 浸水深×100) を保持。 最大 868 = 8.68 m は L49 の最大 8.34 m とほぼ整合 (= データ整合性の確認)。 告示日 2019-03-02 = 広島県知事による津波防災地域づくり法第 53 条に基づく告示時点。

L49 (津波浸水想定) との制度比較

項目 L49 津波浸水想定 (想定図) L63 津波災害警戒区域 (指定区域)
根拠法 水防法・津波防災地域づくり法 津波防災地域づくり法 第 53 条
制度区分 想定 (技術的シミュレーション) 指定 (法的拘束力のある区域指定)
作成主体 広島県土木建築局 広島県知事 (告示)
法的拘束力 なし (情報提供のみ) あり (避難確保計画策定義務等)
対象 想定し得る最大規模の浸水 想定区域のうち住民保護に必要な範囲
更新 随時 (技術改善で更新) 告示時点で固定 (改正告示で更新)
総面積 124.32 km² (L49) 160.20 km² (L63)
公表 2025-12-03 (最新版) 2019-03-02 (告示)
dataset_id 46 47

この表から読み取れること: L49 = 想定 (技術的) と L63 = 指定 (法的) の役割分担が明確。 L49 は2025-12-03 に最新版が更新され続ける技術的想定図。L63 は2019-03-02 に告示された 法的拘束力のある区域指定で、改正告示まで固定される。両者は同じ「津波」 を扱うが、 制度上の位置付けが根本的に異なる。本研究 RQ2 で両者の空間関係を実データで検証する。

データ取得手順

ステップ 操作 値 / URL
ステップ 1 DoBoX dataset 47 ページ https://hiroshima-dobox.jp/datasets/47
ステップ 2 ZIP DL (resource 42) https://hiroshima-dobox.jp/resource_download/42
ステップ 3 保存先 data/extras/L63_tsunami_warning_zone/340006_tsunami_caution_area_20190302.zip
ステップ 4 ZIP 展開 extracted/tsunami_keikai.shp + .dbf + .shx + .prj
ステップ 5 Shapefile 読込 (geopandas/pyogrio) 1,285,428 polygon
ステップ 6 30m 集約 (build_cache) 178,004 セル (= 160 km²)
ステップ 7 市町 sjoin 19 市町に分配 + 海上 11,615 セル
ステップ 8 L49 想定との重なり判定 両方 124,767 / 指定のみ 53,237

この表から読み取れること: DoBoX dataset 47 → resource 42 → 27.8 MB ZIP DL → 解凍 → Shapefile 読込 → 30m 集約 → 市町 sjoin → L49 想定との重なり判定、の 8 ステップで再現可能。 全工程は _l63_build_cache.py + L63_tsunami_warning_zone.py で自動実行。

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

ダウンロード

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

生データ (DoBoX 直リンク)

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

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

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

cd "2026 DoBoX 教材"
iwr "https://hiroshima-dobox.jp/resource_download/42" -OutFile "data/extras/L63_tsunami_warning_zone/340006_tsunami_caution_area_20190302.zip"
Expand-Archive -Path "data/extras/L63_tsunami_warning_zone/340006_tsunami_caution_area_20190302.zip" -DestinationPath "data/extras/L63_tsunami_warning_zone/extracted"
py -X utf8 lessons/_l63_build_cache.py
py -X utf8 lessons/L63_tsunami_warning_zone.py

Shapefile (174 MB shp + 14 MB dbf) の処理は重い (= 1.28M polygon)。 そのため _l63_build_cache.py30m 集約 + dissolve + sjoin + L49 重なり判定を 事前計算 (~15 秒)、本体スクリプトはキャッシュ読込で 10 秒以内に完走。 L44 admin 既キャッシュと L49 cells 既キャッシュも内部で再利用。

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

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

【RQ1】 警戒区域の地理範囲・市町指定状況 — 160 km² / Top 3 で 64%

RQ1 の狙い

1,285,428 polygon の元 Shapefile を 30m に集約し、178,004 セル (160 km²) を得る。 これを市町 / 基準水位ランク / 沿岸 vs 内陸の 3 軸で多角度に集計し、 広島県の津波警戒区域指定の地理構造を立体的に描く。 特に「警戒区域」 という法的指定の物理的形状を初めて定量化する。

手法 (前置き解説)

入出力の Before/After 例

段階1 polygon の中身件数
(0) Shapefile 1 件polygon (10m メッシュ), kijyun_sin = 168 (= 1.68m)1,285,428
(1) 重心抽出(x=80123, y=-178435), kijyun_sin=1681,285,428
(2) 浸水深 m 化+ depth_m = 168 / 100 = 1.681,285,428
(3) 30m 集約(gx=80100, gy=-178410) で同セル group → max(depth_m)178,004
(4) ランク化+ rank = 30 (1.0〜2.0m に該当)178,004
(5) 市町 sjoin+ CITY_CD = 207 (= 福山市)178,004 (うち海上 11,615)
(6) groupby 集計市町 × ランク 面積 km² の表 (19 市町 × 6 ランク)(別)
(7) dissolve各ランクの全セルを 1 polygon に結合6 polygons

(0)-(7) を全 1.28M polygon に適用 → groupby/dissolve で集計 → 図化。 重い処理 (= (3)〜(7)) は _l63_build_cache.py で事前計算しキャッシュ。

実装コード (Shapefile 読込 + 30m 集約 + 市町 sjoin + dissolve)

L63_tsunami_warning_zone.py 行 1304–1406

 1
 2
 3
 4
 5
 6
 7
 8
 9
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
# 1. 大規模 Shapefile 読込 (1.28M polygon, 174 MB)
import pyogrio, pandas as pd, geopandas as gpd, shapely
SHP = "data/extras/L63_tsunami_warning_zone/extracted/tsunami_keikai.shp"
gdf = pyogrio.read_dataframe(SHP)  # ~5 秒
print(f"polygons: {len(gdf):,}, CRS: {gdf.crs}")
# kijyun_sin は cm 単位の基準水位 (= 浸水深 × 100)
print(gdf["kijyun_sin"].describe())

# 2. 重心抽出 + 30m 集約
df = pd.DataFrame({
    "x": gdf.geometry.centroid.x.astype(int),
    "y": gdf.geometry.centroid.y.astype(int),
    "depth_m": gdf["kijyun_sin"].astype(int) * 0.01,  # cm → m
})
df["gx"] = (df["x"] // 30) * 30
df["gy"] = (df["y"] // 30) * 30
agg = df.groupby(["gx","gy"], as_index=False)["depth_m"].max()
agg.columns = ["x","y","depth_m"]

# 3. 6 ランクに分類
import numpy as np
RANK_BINS = [0, 0.5, 1.0, 2.0, 3.0, 5.0, 10.0, 20.0, 999]
RANK_CODES = [10, 20, 30, 40, 50, 60, 70, 80]
agg["rank"] = pd.cut(agg["depth_m"], bins=RANK_BINS,
                      labels=RANK_CODES, right=False).astype(int)
print(f"30m 集約後: {len(agg):,} cells")

# 4. 市町 sjoin (admin_diss.gpkg は L44 既キャッシュ)
admin = gpd.read_file("data/extras/L44_storm_surge/_cache/admin_diss.gpkg").to_crs("EPSG:6671")
pts = gpd.GeoDataFrame(agg, geometry=gpd.points_from_xy(agg["x"], agg["y"]),
                        crs="EPSG:2445").to_crs("EPSG:6671")
pts_admin = gpd.sjoin(pts, admin[["CITY_CD", "geometry"]],
                       how="left", predicate="within")
pts_admin["CITY_CD"] = pts_admin["CITY_CD"].fillna(-1).astype(int)

# 5. 市町 × ランク 面積 (km²)
df = pts_admin.copy()
df["area_m2"] = 30 * 30  # 30m × 30m
city_rank = df.groupby(["CITY_CD","rank"])["area_m2"].sum().unstack(fill_value=0)
city_rank = city_rank / 1e6  # km²
print(city_rank.head())

# 6. 6 ランク dissolve (各ランクの全セルを 1 polygon に結合)
out_geoms = []
for rk in RANK_CODES:
    sub = agg[agg["rank"] == rk]
    if len(sub) > 0:
        polys = shapely.box(sub["x"]-15, sub["y"]-15, sub["x"]+15, sub["y"]+15)
        out_geoms.append(shapely.unary_union(polys))

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

「広島県のどの沿岸エリアに警戒区域があり、どの基準水位ランクで指定されているか」 を 1 枚で読みたい。県全域に 6 ランク色 (薄水色 = 0.5m 未満 → 紺色 = 5-10m) でセルを描き、 沿岸市町を薄オレンジで強調することで、警戒区域が沿岸エリアに集中する地理構造を可視化。

図 1 (RQ1): 広島県 津波災害警戒区域 全域主題図 (n=178,004 セル, 全 160 km²)
図 1 (RQ1): 広島県 津波災害警戒区域 全域主題図 (n=178,004 セル, 全 160 km²)

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

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

「6 ランクの面積構成は浅水帯 (<2m) が支配的なのか、深水帯 (>3m) が一定割合あるのか」 を 2 ペインで読みたい。左 stacked bar (1 本) は全体構成を 1 行で見せ、 右 横棒は各ランクの絶対値で深さ分布を比較する。

図 2 (RQ1): 6 ランク 面積構成 (浅水 73% / 深水 9%)
図 2 (RQ1): 6 ランク 面積構成 (浅水 73% / 深水 9%)

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

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

「どの市町が警戒区域指定面積で大きいか」 を地理的パターンとして読みたい。 市町境界 polygon に指定面積を Reds で塗り分け、上位 8 市町には市町名 + 面積をラベル表示。 これで「沿岸の中でもどの市町に集中しているか」 を一望できる。

図 3 (RQ1): 市町別 警戒区域指定面積 choropleth (Top 3 シェア 64%)
図 3 (RQ1): 市町別 警戒区域指定面積 choropleth (Top 3 シェア 64%)

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

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

「市町別に深さランクの構成がどう違うか」 を見たい。横棒 stacked barで各市町の 6 ランク内訳を並置し、市町名の右に重み付き平均深さを併記。これで 「広く浅い指定 (= 福山市干拓地)」 と「狭く深い指定 (= 呉市湾奥)」 の地形特性差を読む。

図 4 (RQ1): 市町別 深さランク構成 (Top 12)
図 4 (RQ1): 市町別 深さランク構成 (Top 12)

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

表: 全体サマリ (3 RQ 統合, 17 指標)

指標
元 polygon 数 1,285,428
30m 集約後 セル数 178,004
全指定面積 (RQ1) 160.20 km²
対象市町数 13 (海上 -1 を除く)
Top 3 市町シェア (RQ1) 64.5%
Top 1 市町 広島市 (42.33 km²)
浅水 <2m シェア (RQ1) 72.8%
深水 >3m シェア (RQ1) 8.8%
重み付き平均深さ (RQ1) 1.47 m
L49 想定面積 (参考) 124.32 km²
L63 ∩ L49 (両方, RQ2) 112.29 km² (70.1%)
L63 \ L49 (指定のみ, RQ2) 47.91 km² (29.9%)
L49 \ L63 (想定のみ, RQ2) 12.03 km²
推定区域内人口 合計 (RQ3) 125,464 人
人口密度 上位3 平均 (RQ3) 2,797 人/km²
人口密度 下位3 平均 (RQ3) 204 人/km²
人口密度 上位/下位比 (RQ3) 13.7 倍

この表から読み取れること: 全 178,004 セルの核心指標を 17 行に集約。指定面積 160 km²、Top 3 シェア 64%、L49 包含率 70%、人口密度上位/下位比 14 倍 — 3 RQ の主結論を要約。

表: 6 ランクサマリ

rank_code 深さラベル rank中央値_m 面積_km2 シェア_%
10 0.0〜0.5m 0.25 32.863 20.51
20 0.5〜1.0m 0.75 38.386 23.96
30 1.0〜2.0m 1.50 45.439 28.36
40 2.0〜3.0m 2.50 29.392 18.35
50 3.0〜5.0m 4.00 14.056 8.77
60 5.0〜10.0m 7.50 0.068 0.04

この表から読み取れること: 1.0〜2.0mが最大ランク。瀬戸内海津波の特性 (浅水帯) を反映し、深水帯 (5m+) は極めて限定的。

表: 市町別 ランキング (Top 15)

順位 市町名 指定面積_km2 平均深さ_m
1 広島市 42.33 1.67
2 福山市 37.34 1.99
3 呉市 16.89 0.87
4 尾道市 15.62 1.33
5 三原市 8.66 1.27
6 江田島市 7.73 1.21
7 竹原市 5.05 1.50
8 廿日市市 4.80 0.86
9 大竹市 4.48 1.04
10 海田町 2.68 1.66
11 坂町 1.88 0.79
12 東広島市 1.46 1.14
13 府中町 0.81 0.94

この表から読み取れること: 広島市が首位 (42.3 km²)、次に 福山市 (37.3 km²)。沿岸 19 市町すべてが指定対象だが、Top 3 で 64% を占める偏在型。

【RQ2】 L49 想定 vs L63 指定 の制度差 — 包含率 70%

RQ2 の狙い

L49 (津波浸水想定 = 技術的) と L63 (警戒区域指定 = 法的) の空間関係を実データで検証する。 両者は同じ「津波」 を扱うが、L49 は最新版が 2025-12-03 まで更新され続け、L63 は 2019-03-02 告示で固定されている。本研究では:

  1. 30m グリッド単位で両者のセルを空間結合 (= 共通グリッド比較)
  2. 「両方」 「指定のみ」 「想定のみ」の 3 区分の面積を集計
  3. 市町別に「制度差」 のパターンを抽出
  4. ランク別に「想定 vs 指定」 の重複率を比較

手法 (前置き解説)

入出力の Before/After 例 (1 セル分)

段階セル例 (gx=80100, gy=-178410)
(0) L63 cellx=80100, y=-178410, depth_m=1.68, rank=30
(1) L49 cell 検索L49 keys (gx=80100, gy=-178410) ∈ L49 か判定
(2) in_l49 フラグ+ in_l49 = True (= L49 にも該当)
(3) 区分「両方 (想定 ∩ 指定)」 に分類
(4) 集計セル数 1 → 面積 900 m²

(0)-(4) を全 178K セルに適用 → 集合演算で「両方」 「指定のみ」 を集計 → L49 cells から「想定のみ」 を引き算で計算。

実装コード (グリッドキー集合演算 + ランク別重複)

L63_tsunami_warning_zone.py 行 1517–1603

 1
 2
 3
 4
 5
 6
 7
 8
 9
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
# 1. L49 cells (既キャッシュ) と L63 cells (本研究) を共通 30m グリッドへ
import geopandas as gpd, pandas as pd
l49_cells = gpd.read_parquet("data/extras/L49_tsunami_inundation/_cache/tsunami_cells_30m.parquet")
keikai_cells = gpd.read_parquet("data/extras/L63_tsunami_warning_zone/_cache/keikai_cells_30m.parquet")

l49_cells["gx"] = (l49_cells["x"] // 30) * 30
l49_cells["gy"] = (l49_cells["y"] // 30) * 30
keikai_cells["gx"] = (keikai_cells["x"] // 30) * 30
keikai_cells["gy"] = (keikai_cells["y"] // 30) * 30

# 2. グリッドキーの集合演算
l49_keys = set(zip(l49_cells["gx"].astype(int), l49_cells["gy"].astype(int)))
k_keys   = set(zip(keikai_cells["gx"].astype(int), keikai_cells["gy"].astype(int)))

both_keys      = l49_keys & k_keys     # 両方
only_keikai    = k_keys - l49_keys     # 指定のみ
only_souti     = l49_keys - k_keys     # 想定のみ

print(f"L49 想定: {len(l49_keys):,} セル")
print(f"L63 指定: {len(k_keys):,} セル")
print(f"両方:    {len(both_keys):,} ({100*len(both_keys)/len(k_keys):.1f}% of L63)")
print(f"指定のみ: {len(only_keikai):,}")
print(f"想定のみ: {len(only_souti):,}")

# 3. 面積換算
area_both       = len(both_keys) * 900 / 1e6        # km²
area_only_keik  = len(only_keikai) * 900 / 1e6
area_only_souti = len(only_souti) * 900 / 1e6
print(f"両方面積:    {area_both:.1f} km²")
print(f"指定のみ:    {area_only_keik:.1f} km²")
print(f"想定のみ:    {area_only_souti:.1f} km²")

# 4. 市町別の制度差比率
city_l49 = keikai_cells.groupby(["CITY_CD", "in_l49"])["x"].count().unstack(fill_value=0)
city_l49.columns = ["only_keikai", "both"] if False in city_l49.columns else ["both"]
city_l49["両方比率_%"] = city_l49["both"] / (city_l49["both"] + city_l49["only_keikai"]) * 100

# 5. ランク別重複
rank_l49 = keikai_cells.groupby(["rank", "in_l49"])["x"].count().unstack(fill_value=0)
print(rank_l49)

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

「想定 (青) と 指定 (赤) が県全域でどう重なるか」 を 2 ペインで読みたい。 は県全域でL49 想定 = 薄青L63 指定 = 半透明赤を重ね描き、 重なり部 = 茶色 を視覚的に確認。福山市の干拓平野ズームで 同じ重ね合わせを詳細表示。「想定はあるが指定されていない」 範囲が 青のみで残っているかを確認できる。

図 5 (RQ2): 想定 (青) と 指定 (赤) の県全域重ね合わせ + 福山ズーム (包含率 70%)
図 5 (RQ2): 想定 (青) と 指定 (赤) の県全域重ね合わせ + 福山ズーム (包含率 70%)

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

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

「想定 ∩ 指定」 「指定のみ」 「想定のみ」 の 3 区分の面積比較 (左) と、 深さランク別の重複率 (右) を 2 ペインで読みたい。は集合関係を 1 図で要約、 は深さランクで重複率がどう変化するかを stacked bar で見せる。 深いランクほど両方率 (= 想定にも指定にも入る) が高いことが期待される。

図 6 (RQ2): 想定 vs 指定 集合関係 + ランク別重複率
図 6 (RQ2): 想定 vs 指定 集合関係 + ランク別重複率

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

表: 想定 vs 指定 重なりサマリ

区分 セル数 面積_km2 シェア_%
L63 警戒区域 全体 178004 160.20 100.0
L63 ∩ L49 (両方) 124767 112.29 70.1
L63 \ L49 (警戒のみ) 53237 47.91 29.9
L49 \ L63 (想定のみ) 13367 12.03 7.5

この表から読み取れること: L63 ∩ L49 (両方) が 70% = 指定の大部分は想定内に位置する。指定のみ (30%)想定のみ (12 km²)は 双方向の制度差 = 完全包含ではないが概ね包含。

表: ランク × L49 重複

rank 深さラベル 両方_km2 指定のみ_km2 合計_km2 両方率_%
10 0.0〜0.5m 21.4425 11.4201 32.8626 65.2
20 0.5〜1.0m 30.7440 7.6419 38.3859 80.1
30 1.0〜2.0m 33.8949 11.5443 45.4392 74.6
40 2.0〜3.0m 19.6605 9.7317 29.3922 66.9
50 3.0〜5.0m 6.4953 7.5609 14.0562 46.2
60 5.0〜10.0m 0.0531 0.0144 0.0675 78.7

この表から読み取れること: 深さランクごとに「両方率」 が異なる。深いランクほど両方率が高い傾向は「想定と指定の制度的整合」 の証拠。

表: 市町別 想定 vs 指定 (Top 15)

市町名 both_km2 only_keikai_km2 total_km2 両方比率_% 指定のみ比率_%
広島市 41.11 1.22 42.33 97.1 2.9
福山市 2.83 34.52 37.34 7.6 92.4
呉市 13.65 3.25 16.89 80.8 19.2
尾道市 12.77 2.85 15.62 81.7 18.3
三原市 8.04 0.62 8.66 92.9 7.1
江田島市 6.81 0.92 7.73 88.2 11.8
竹原市 4.57 0.47 5.05 90.6 9.4
廿日市市 3.47 1.33 4.80 72.2 27.8
大竹市 4.30 0.18 4.48 96.1 3.9
海田町 2.60 0.08 2.68 96.9 3.1
坂町 1.77 0.11 1.88 94.1 5.9
東広島市 1.39 0.07 1.46 95.1 4.9
府中町 0.78 0.04 0.81 95.2 4.8

この表から読み取れること: 市町ごとに「両方比率」 が異なる (平均 84%, 標準偏差 24% if applicable)。H4 (制度差の市町別ばらつき): 市町別審議の結果として制度差が生まれる。

【RQ3】 沿岸人口・建物との空間関係 — 密度比 13.7 倍

RQ3 の狙い

警戒区域指定面積を母数とした「守るべき人口」を市町別に算出し、 都市沿岸 vs 中山間沿岸の構造的対比を抽出する。これにより:

  1. L22 既扱の市町別人口を母数として、区域内人口の代理指標を計算
  2. 区域内 km² 当たりの人口密度で都市部 vs 中山間沿岸の差を測定
  3. 地理区分別 (都市部 / 中間 / 中山間) に集計
  4. 市町別指定面積比 (= 警戒区域 / 市町総面積)でハザード露出度を計算

これは単なる「市町別 km² の集計」 ではなく、人口に対するハザード露出を 全沿岸 19 市町について比較し、防災投資優先度の地理パターンを抽出する研究。

手法 (前置き解説)

入出力の Before/After 例 (1 市町分)

段階例: 福山市
(0) 市町集計警戒指定面積 = 31.2 km², 市町総面積 = 518 km²
(1) L22 結合+ pop_total = 461,357, density_per_km2 = 891
(2) 指定面積比+ 指定面積比_% = 31.2 / 518 × 100 = 6.0%
(3) 推定区域内人口+ 推定区域内人口 = 461,357 × 6.0% = 27,683 人
(4) 人口密度+ 人口密度_区域内 = 27,683 / 31.2 = 891 人/km²
(5) 地理区分+ 地理区分 = 「中間地域」 (density 200-1000)

実装コード (市町ロールアップ + L22 結合 + 推定人口 + 地理区分)

 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
# 1. 市町ロールアップ + 警戒区域集計 (RQ1 で計算済の city_rolled を使う)
city_rolled  # [市町名, total_km2, 平均深さ_m, ...]

# 2. L22 既扱の人口データと結合
import pandas as pd
pop_df = pd.read_csv("lessons/assets/L22_city_summary.csv", encoding="utf-8-sig")
pop_df = pop_df.dropna(subset=["city"])

merged = city_rolled.merge(
    pop_df.rename(columns={"city":"市町名", "area_km2":"市町面積_km2"}),
    on="市町名", how="left",
)

# 3. 指定面積比 (警戒区域 / 市町総面積)
merged["指定面積比_%"] = (merged["total_km2"] / merged["市町面積_km2"] * 100).round(2)

# 4. 推定区域内人口 (一様分布の仮定)
merged["推定区域内人口"] = (merged["pop_total"] *
                          merged["total_km2"] / merged["市町面積_km2"]).round(0)
merged["人口密度_区域内"] = (merged["推定区域内人口"] / merged["total_km2"]).round(0)

# 5. 地理区分 (人口密度ベース)
def classify_geo(row):
    if row["density_per_km2"] >= 1000: return "都市部"
    if row["density_per_km2"] >= 200:  return "中間地域"
    return "中山間部"
merged["地理区分"] = merged.apply(classify_geo, axis=1)

# 6. 地理区分別集計
geo_summary = merged.groupby("地理区分").agg(
    市町数=("市町名", "count"),
    指定面積_合計km2=("total_km2", "sum"),
    人口_合計万人=("pop_total", lambda s: s.sum() / 10000),
    平均人口密度区域内=("人口密度_区域内", "mean"),
).round(2).reset_index()
print(geo_summary)

# 7. 上位 vs 下位の人口密度比較
top3 = merged.head(3)
bot3 = merged.tail(3)
ratio = top3["人口密度_区域内"].mean() / bot3["人口密度_区域内"].mean()
print(f"密度比 上位/下位 = {ratio:.1f} 倍")

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

「警戒区域内の推定人口がどう地理分布しているか」 (左 choropleth) と 「警戒区域指定面積 vs 区域内人口密度の散布」 (右散布) を 1 ペアで読みたい。 は人口を OrRd で色分け、は地理区分別に散布 (バブル径 = 市町総人口) で都市部 vs 中山間沿岸の構造対比を見せる。

図 7 (RQ3): 推定区域内人口 choropleth + 指定面積 × 人口密度 散布 (密度比 14 倍)
図 7 (RQ3): 推定区域内人口 choropleth + 指定面積 × 人口密度 散布 (密度比 14 倍)

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

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

「地理区分別 (都市部 / 中間 / 中山間) に指定面積と人口がどう異なるか」 (左) と 「市町別 指定面積比 (警戒/総) で誰がハザード露出度が高いか」 (右) を 2 ペインで読みたい。 左二軸棒は地理区分別に指定面積 (赤) と人口 (青) を比較、 右横棒は指定面積比のランキングで地形特性を反映する市町を抽出。

図 8 (RQ3): 地理区分別 集計 + 市町別 指定面積比
図 8 (RQ3): 地理区分別 集計 + 市町別 指定面積比

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

表: 市町別 人口関係 (Top 15)

市町名 市町区分 市町総人口 市町面積_km2 指定面積_km2 指定面積比_% 推定区域内人口 人口密度_区域内 地理区分
広島市 政令市 1200754 906.7 42.33 4.67 56060 1324 都市部
福山市 中核市 460930 518.1 37.34 7.21 33222 890 中間地域
呉市 中核市 214592 352.8 16.89 4.79 10275 608 中間地域
尾道市 131170 285.1 15.62 5.48 7187 460 中間地域
三原市 90573 471.6 8.66 1.84 1664 192 中山間部
江田島市 21930 100.7 7.73 7.67 1683 218 中間地域
竹原市 23993 118.2 5.05 4.27 1024 203 中間地域
廿日市市 114173 489.5 4.80 0.98 1120 233 中間地域
大竹市 26319 78.7 4.48 5.69 1499 335 中間地域
海田町 29636 13.8 2.68 19.45 5764 2148 都市部
坂町 12582 15.7 1.88 11.98 1507 802 中間地域
東広島市 施行時特例市 196608 635.3 1.46 0.23 453 309 中間地域
府中町 51155 10.4 0.81 7.83 4006 4918 都市部

この表から読み取れること: 推定区域内人口の上位は人口大都市。指定面積比 (= 市町総面積に対する警戒区域比率) は湾奥小規模町で高く、大規模内陸付き市町で低い。地形特性が直接反映される。

表: 地理区分別 比較

地理区分 市町数 指定面積_合計km2 人口_合計万人 平均人口密度区域内
中山間部 1 8.66 9.06 192.00
中間地域 9 95.26 120.23 450.89
都市部 3 45.83 128.15 2796.67

この表から読み取れること: 都市部 vs 中間 vs 中山間の構造対比。指定面積は地理区分間で比較的均等だが、人口は都市部が圧倒的。これが「狭い指定 + 大人口」 vs 「広い指定 + 少人口」 の構造を生む。

仮説検証総合

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

仮説 観測値 判定 解釈
H1 浅水 (<2m) 支配 観測 浅水 = 72.8%, 深水 = 8.8% 強支持 H1 強支持: 警戒区域の 73% が 2m 未満の浅水帯。3m 超は 9%。瀬戸内海の地形特性 = 太平洋側より浅い津波想定が指定にも反映。重み付き平均は 1.47m
H2 上位 3 市町シェア ≥ 40% 観測 = 64.5% (Top 1: 広島市, Top 2: 福山市, Top 3: 呉市) 強支持 H2 強支持: 上位 3 市町で 64% を占める偏在型。湾奥 + 干拓地 + 多島海の 3 地形類型が指定面積を支配。広島市のみで 42.3 km² =全体の 26%
H3 想定 ⊃ 指定 (包含関係) 観測 包含率 (L63 ⊂ L49) = 70.1% 部分支持 H3 部分支持: 包含率 70% = 指定の大部分は想定内に位置する。残り 30% は「指定のみ (想定外)」で、これは想定図の更新前に指定されていた範囲または地形補正の影響
H4 「制度差」 の市町別ばらつき 観測: 各市町で 両方率 平均 = 84% ± 24% 支持 H4: 市町ごとに想定 ∩ 指定 の比率が異なる。沿岸地形 (湾奥 vs 平野 vs 多島海) や指定告示当時の想定図の世代差を反映。市町別審議の結果として制度差が生まれる
H5 都市部 vs 中山間沿岸 人口密度比 観測 上位 3 平均 2,797 vs 下位 3 平均 204 = 13.7 倍 強支持 H5 強支持: 区域内人口密度の 上位/下位比 13.7 倍 = 都市部沿岸の防災投資優先度が 中山間沿岸の 14 倍。狭い指定 + 大人口 = 都市部 vs 広い指定 + 少人口 = 中山間沿岸 の構造対比

3 RQ × 3 結論

制度史的位置付け

本データ (#47) は「想定 → 指定 → 行為制限」制度3層構造のうち「指定」を扱う。L49 (#46) が「想定」側、本研究の RQ2 で両者の関係を実データ化。L62 (#41) が「災害発令」側、L61 (#1278) が「過去災害事実」側を扱ったのに対し、L63 は「制度的指定の地理範囲」を扱う。これにより場所 (L03) + 想定 (L49) + 指定 (L63) + 発令 (L62) + 事実 (L61) という 防災制度の5 系統サイクルが完結する。

本研究の重要発見は「L49 ⊃ L63 包含率 70%」「上位/下位人口密度比 13.7 倍」。前者は技術的想定と法的指定の制度的整合を、後者は都市沿岸 vs 中山間沿岸の構造対比を 初めて定量化した。これらは防災行政の「制度差の地理学」「ハザード人口密度に基づく投資戦略」という新たな研究テーマを開く。

津波防災地域づくり法の制度進化

津波防災地域づくり法は2011 年 12 月 14 日に制定された。これは2011 年 3 月 11 日東日本大震災から 9 ヶ月後の制定で、制度的応答の最速例の 1 つ。広島県は 2019-03-02 に告示を行い、現在のデータはその時点の指定範囲。太平洋沿岸の県 (静岡・高知等) では特別警戒区域 (オレンジゾーン) も指定されているが、瀬戸内海沿岸の広島県では特別警戒区域は未指定。これは津波の最大水位が太平洋側より浅いという地形的事実を反映している。

発展課題

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

発展課題 1 (RQ1 由来): 警戒区域の形状特性 (周囲長 / 面積比) の分析

発展課題 2 (RQ1 由来): 標高 (L40) との照合 → 遡上高の妥当性検証

発展課題 3 (RQ2 由来): 市町別「指定の遅延 / 先行」 の地理パターン

発展課題 4 (RQ3 由来): L20 新築建物との行為制限の効果検証

発展課題 5 (RQ3 拡張): L32-L34 港湾施設との復旧優先度分析

発展課題 6 (展望): 全国津波警戒区域との瀬戸内海特性の比較