Lesson 46

L46 砂防関係指定地 3 件統合分析 — 砂防三法 (砂防法・地すべり等防止法・急傾斜地法) 指定地構造を読み解く

砂防三法砂防指定地急傾斜地崩壊危険区域地すべり防止区域行為制限warning vs designatedgeopandasShapefileCSV
所要 60〜90 分 / 想定レベル: リテラシ〜中級 (geopandas/Shapefile-CSV 並列分析/制度比較) / データ: DoBoX dataset 55, 56, 57 (砂防指定地 + 急傾斜地崩壊危険区域 + 地すべり防止区域) — Shapefile 5.2 MB + CSV 0.45 MB + Shapefile 0.02 MB

データ取得手順

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

IDデータセット名
#55砂防関係指定地情報_砂防指定地
#56砂防関係指定地情報_急傾斜地崩壊危険区域
#57砂防関係指定地情報_地すべり防止区域
#333dataset #333
#666dataset #666

実行コマンド:

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

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

学習目標と問い

本レッスンでは、広島県オープンデータ DoBoX が公開する 砂防関係指定地情報シリーズ 3 dataset (id = 55, 56, 57) を統合し、 砂防三法 (砂防法・地すべり等防止法・急傾斜地法) に基づく 3 種の指定地の 制度的・地理的構造を分析する。

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

主 RQ (研究の問い)

広島県の砂防三法 (砂防法・地すべり等防止法・急傾斜地法) に基づく 3 種の指定地は、 件数規模・地理範囲・対象市町・指定の時代でどう異なり、 なぜそのような「制度の三国志」の構造が生まれたのか? さらに「警戒区域」(L11 既扱) との制度的差をデータでどう読めるか?

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

到達点

3 dataset を市町・水系・指定種別・時代でクロスし、6 仮説を量的に検証する。 学習者は (a) 異種形式 (Shapefile + CSV) の並列読込、 (b) 「同じシリーズ」を名乗りながら制度的に独立な 3 dataset を扱う際の 分析設計、(c) 砂防三法という歴史と地理が交錯する制度群を データで読み解く視座、を体得する。

厳密性の宣言: 本記事は L10 (土砂災害警戒区域 cross), L11 (トリプルハザード) と厳密に独立。両者は警戒区域 (情報公示制) を扱うが、本記事は指定地 (行為制限制) を扱う。同じ土砂災害というドメインだが、法的位置づけが質的に違う。 L39 (傾斜) や L40 (標高) で扱う地形ラスタとも別物。 比較対照として L11 の警戒区域件数を一部参照するが、ジオメトリ処理は行わず件数比較のみ。

使用データ

本記事は DoBoX の「砂防関係指定地情報」関連 3 dataset を統合する:

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

dataset_id シリーズ 形式 サイズ 件数 根拠法律 対象現象 管理者 本記事での役割
55 砂防関係指定地情報_砂防指定地 Shapefile (Polygon + Line) 5.2 MB (ZIP) polygon 3,207 + line 93 砂防法 (1897, 明治 30 年) 渓流の土石流 国交省 + 県 (1 級水系直轄区間は国) 面・線で表現された行為制限区域 (戦前指定は line として残存)
56 砂防関係指定地情報_急傾斜地崩壊危険区域 CSV (緯度経度 1 点) 0.45 MB 2,933 行 急傾斜地法 (1969, 昭和 44 年) 30°以上急斜面崩壊から人家を守る 県 + 市町村 ポリゴン未整備のため点データのみ。代表点で位置を特定
57 砂防関係指定地情報_地すべり防止区域 Shapefile (Polygon) 0.02 MB (ZIP) 39 件 地すべり等防止法 (1958, 昭和 33 年) 地すべり地形の進行抑止 国交省 (建設) + 林野庁 (山林) + 農水省 (農地) — 三省共管 極少数だが高品質な polygon。三省共管制の特殊性を映す

この表から読み取れること: (1) 形式が 3 種それぞれ違う (Shapefile poly+line / CSV / Shapefile poly のみ) — 同じ 「砂防関係指定地情報」シリーズを名乗りながらデータ整備の優先度が異なる。 (2) サイズが 250 倍差 (55: 5.2 MB ≫ 57: 0.02 MB) — これは件数差を反映するが、 57 は polygon 1 件あたりの geometry 詳細度は 55 と同等であり、件数自体が圧倒的に少ない。 (3) 根拠法律は 112 年差 (1897 vs 2009 のような新法ではない、1897 vs 1969 = 72 年差) で、 日本の砂防行政の歴史的層がデータに刻まれている。 (4) 地すべり防止区域の三省共管 (国交+林野+農水) は他 2 法にない特殊性で、 これが指定数を抑える制度的要因の 1 つと推測される。

表 (2) — 処理 STEP 段階表 (要件 K Before/After)

段階 内容 サイズ/件数
STEP 0 3 dataset を独立に読込 55=3,207+93, 56=2,933, 57=39
STEP 1 EPSG:6668/EPSG:4326 → EPSG:6671 (m 単位) 投影変換 砂防/地すべり/急傾斜 すべて
STEP 2 55: polygon area, line length 計算 area sum 17,551 ha, line sum 141.1 km
STEP 3 57: polygon area 計算 + 列名 col01-col10 を意味的列名にリネーム area sum 526.1 ha
STEP 4 56: 1 件不正レコード除外 + 緯度経度→Point geometry 化 2,935 → 2,933 行
STEP 5 市町別 / 水系別 / 種別 / 時代別の集計表を作成 市町別 30 / 水系別 84 / 時代別 13
STEP 6 L11 警戒区域の件数を読み込み、3 種比較表を作成 (面積処理は行わない) 急傾斜 29,756, 地すべり 127, 土石流 13,337 (件数のみ)

この表から読み取れること: 3 dataset は結合 (merge) 不要な独立した行政台帳である。 そこが本記事と L45 (ため池) との大きな違い: L45 は CSV と SHP が「同じ池の異なる断面」 として merge できたが、L46 の 3 dataset は「別の現象を別の法律で別に管理」 した別物。よって本記事は merge ではなく「並列分析と比較」が中心となる。

形式の詳細

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

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

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

datasetカタログresource_download (直 DL)形式サイズ
55 砂防関係指定地情報_砂防指定地 dataset 55 直 DL (rid 76) Shapefile (ZIP)5.2 MB
56 砂防関係指定地情報_急傾斜地崩壊危険区域 dataset 56 直 DL (rid 22822) CSV (UTF-8 BOM)0.45 MB
57 砂防関係指定地情報_地すべり防止区域 dataset 57 直 DL (rid 22823) Shapefile (ZIP)0.02 MB

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

cd "2026 DoBoX 教材"
mkdir -Force data\extras\L46_sabo_designation
iwr "https://hiroshima-dobox.jp/resource_download/76"    -OutFile "data\extras\L46_sabo_designation\sabo_designation_55_sabo_shitei.zip"
iwr "https://hiroshima-dobox.jp/resource_download/22822" -OutFile "data\extras\L46_sabo_designation\sabo_designation_56_kyukeisha_kuiki.csv"
iwr "https://hiroshima-dobox.jp/resource_download/22823" -OutFile "data\extras\L46_sabo_designation\sabo_designation_57_jisuberi_boushi.zip"
# ZIP 展開 (55 と 57 のみ)
Expand-Archive -Force "data\extras\L46_sabo_designation\sabo_designation_55_sabo_shitei.zip"   "data\extras\L46_sabo_designation\sabo_designation_55_sabo_shitei"
Expand-Archive -Force "data\extras\L46_sabo_designation\sabo_designation_57_jisuberi_boushi.zip" "data\extras\L46_sabo_designation\sabo_designation_57_jisuberi_boushi"
# 本記事スクリプト (~30 秒)
py -X utf8 lessons\L46_sabo_designation.py

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

分析 1: 規模 100 倍非対称 — 3 dataset の件数構造

狙い (RQ ↔ 仮説 H1)

3 dataset の件数を比較し、「同じ砂防関係指定地」シリーズを名乗りながら 規模が桁レベルで違う構造を量化する。これは砂防三法の制度的非対称の最も基礎的な指標であり、 後続分析の出発点となる。

手法 — 単純カウントと比率

各 dataset を独立に読み込み、行数 / polygon 数 / point 数を取得する。 最少件数 (地すべり 39) を分母として、他 2 種の倍率を計算する。 件数を log 軸の横棒グラフで表示することで、3 桁の差を視覚化する。

log 軸の選択理由 (要件 H, J): 線形軸でグラフを描くと、最大件数 (3,207) が最少件数 (39) を圧倒し、 地すべりの棒が事実上見えなくなる。log 軸では「桁」がそのまま視覚化されるので、 3 dataset の規模オーダーを一目で比較できる。

実装コード

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

# 砂防指定地 (55) - Shapefile
g55_poly = gpd.read_file('data/extras/L46_sabo_designation/.../砂防指定地-ポリゴン.shp')
g55_line = gpd.read_file('data/extras/L46_sabo_designation/.../砂防指定地-ライン.shp')

# 急傾斜地 (56) - CSV
df56 = pd.read_csv('data/extras/L46_sabo_designation/sabo_designation_56_kyukeisha_kuiki.csv')
# 1 件不正レコードを除外 (履歴ID 列に区域名が入っている)
df56 = df56[df56["砂防関係指定地の種類"] == "急傾斜地崩壊危険区域"]

# 地すべり (57) - Shapefile
g57 = gpd.read_file('data/extras/L46_sabo_designation/.../地すべり防止区域.shp')

# 件数比較
n_55, n_55l, n_56, n_57 = len(g55_poly), len(g55_line), len(df56), len(g57)
ratio_55_57 = n_55 / n_57
ratio_56_57 = n_56 / n_57
print(f"砂防 {{n_55:,}} : 急傾斜 {{n_56:,}} : 地すべり {{n_57}} = "
      f"{{ratio_55_57:.0f}} : {{ratio_56_57:.0f}} : 1")

結果の図

図 1 を選んだ理由: 4 つの数値 (55-poly, 55-line, 56, 57) を比較するなら、 小数の棒グラフで十分。log 軸にすることで桁差を視覚化し、 件数を棒の右に明示することで「視覚的な差」と「実数」の両方が読める。

図1: 砂防三法 3 dataset の件数比較 (log 軸)
図1: 砂防三法 3 dataset の件数比較 (log 軸)

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

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

指標
砂防指定地 (55) — ポリゴン件数 3,207 件
砂防指定地 (55) — ライン件数 93 件
砂防指定地 (55) — ポリゴン総面積 17,550.8 ha (175.51 km²)
砂防指定地 (55) — ライン総延長 141.1 km
急傾斜地崩壊危険区域 (56) — 件数 (点) 2,933 件 (緯度経度 1 点のみ, ポリゴン未整備)
地すべり防止区域 (57) — 件数 39 件
地すべり防止区域 (57) — 総面積 526.1 ha (5.26 km²)
対象市町数 (砂防 55) 29 市町
対象市町数 (急傾斜 56) 30 市町
対象市町数 (地すべり 57) 10 市町

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

結果の図 (2) — 3 種指定地 全県重ね合わせマップ

図 2 を選んだ理由: 件数比較 (図 1) で3 種の規模差を見たあと、 地理空間でどう分布しているかを 1 枚で見ておくと、後続の分析 2-6 への伏線になる。 3 種を別の色 (緑面 / 濃緑線 / 赤点 / 黄面) で重ねることで、 「同じ県の同じ砂防三法でも分布パターンが異なる」ことが直感的に分かる。

図2: 砂防三法指定地 3 種 全県分布マップ
図2: 砂防三法指定地 3 種 全県分布マップ

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

分析 2: 法律 → 地理パターン分離 — 3 種の市町集中構造

狙い (RQ ↔ 仮説 H2)

3 種の指定地がどの市町に集中しているかを比較する。 法律ごとに対象現象が異なる (土石流 / がけ崩れ / 地すべり) ので、 地形的・地質的に発生しやすい市町歴史的に人口が集中した市町の 2 つの軸で分布が分かれるはずである。

手法 — 市町別 stacked bar + 占有率計算

3 dataset を市町列で value_counts() し、 外側結合 (outer join)「ある dataset には現れるが他には現れない」市町も保持する。 スタックバーで 3 種の積み上げを表示し、上位市町の3 種混在比率を比較する。

外側結合 (outer join) の選択理由 (要件 K): 内側結合 (inner) を使うと、3 dataset すべてに該当する市町だけが残り、 たとえば地すべり防止区域がない 19 市町が消えるので公平な比較ができない。 outer join で全市町 (32 程度) を保持し、欠損は 0 で埋めるのが正しい。

実装コード

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

# 各 dataset から市町列の value_counts
city_55 = g55_poly["city"].value_counts().rename("砂防_件").to_frame()
city_55["砂防_面積ha"] = g55_poly.groupby("city")["area_ha"].sum()
city_56 = g56["市区郡町"].value_counts().rename("急傾斜_件").to_frame()
city_57 = g57["city"].value_counts().rename("地すべり_件").to_frame()

# outer join で全市町を保持
city_summary = (
    city_55.join(city_56, how="outer")
           .join(city_57, how="outer")
           .fillna(0)
)
city_summary["三法合計件"] = (city_summary["砂防_件"]
                              + city_summary["急傾斜_件"]
                              + city_summary["地すべり_件"])
city_summary = city_summary.sort_values("三法合計件", ascending=False)
print(city_summary.head(10))

結果の図 (1) — 市町別 stacked bar

図 3 を選んだ理由: stacked bar は「合計と内訳の比率」を 1 図で示す定番手法。 市町の長い名前 (広島市安佐南区等) は横棒の方が読みやすい。

図3: 市町別 砂防三法指定地件数 stacked bar
図3: 市町別 砂防三法指定地件数 stacked bar

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

結果の図 (2) — 急傾斜地点マップ (呉市集中強調)

図 4 を選んだ理由: 呉市集中の地理を見るには地図がベスト。 呉市点を赤、それ以外を灰色にすることで、地理的偏りが一目で分かる。

図4: 急傾斜地崩壊危険区域 点マップ — 呉市集中の地理
図4: 急傾斜地崩壊危険区域 点マップ — 呉市集中の地理

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

結果の表 — 上位 15 市町

市町 砂防_件 砂防_面積ha 砂防_線件 砂防_線延長km 急傾斜_件 地すべり_件 地すべり_面積ha 三法合計件
呉市 516 1207.4 1 0.30 1184 0 0.0 1701
尾道市 139 1316.6 12 14.69 155 3 18.5 309
福山市 121 3314.1 0 0.00 147 11 127.4 279
廿日市市 137 546.0 11 23.78 110 1 56.0 259
広島市安佐南区 183 330.6 1 0.79 69 0 0.0 253
広島市安佐北区 201 744.3 0 0.00 43 0 0.0 244
江田島市 103 240.8 0 0.00 141 0 0.0 244
三原市 144 985.9 13 25.13 70 0 0.0 227
三次市 184 755.5 0 0.00 41 1 2.8 226
広島市佐伯区 149 540.9 3 4.02 59 2 16.6 213
庄原市 147 892.3 2 5.12 38 14 262.3 201
竹原市 116 563.2 0 0.00 85 0 0.0 201
東広島市 131 1287.6 0 0.00 65 1 9.6 197
山県郡安芸太田町 112 993.8 21 36.00 60 3 17.4 196
広島市安芸区 103 183.2 2 6.07 91 0 0.0 196

表から読み取れること:

結果の図 (3) — 地すべり防止区域 詳細マップ

図 6 を選んだ理由: 39 件しかないので全件を地図に表示できる。 各区域に id 番号を振ると、データ集計表と地図の対応が直接取れる。

図6: 地すべり防止区域 全 39 件マップ
図6: 地すべり防止区域 全 39 件マップ

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

分析 3: 時代の制度展開 — 砂防三法の歴史的層

狙い (RQ ↔ 仮説 H3)

3 dataset の指定年月日から、「いつ・どの法律で・何件指定されたか」の 時代別構造を読み解く。砂防法 (1897) → 地すべり等防止法 (1958) → 急傾斜地法 (1969) の 立法順序が、データに刻まれているはずである。

手法 — 10 年区切り decade 集計 + 法律施行年マーカー

3 dataset の指定年月日を pd.to_datetime で日付化し、 decade = year // 10 * 10 で 10 年区切りに丸める。 スタックバーに 3 法の施行年 (1897/1958/1969) を縦線で重ね、 「立法 → 指定の波 → 制度的成熟・停滞」の流れを可視化する。

実装コード

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

def to_decade(s):
    d = pd.to_datetime(s, errors="coerce")
    return d.dt.year // 10 * 10

g55_poly["decade"] = to_decade(g55_poly["sitei_ymd"])
g56["decade"] = to_decade(g56["指定年月日"])
g57["decade"] = to_decade(g57["sitei_ymd"])

decade_55 = g55_poly["decade"].value_counts().sort_index()
decade_56 = g56["decade"].value_counts().sort_index()
decade_57 = g57["decade"].value_counts().sort_index()

# 中央指定年
median_55 = pd.to_datetime(g55_poly["sitei_ymd"], errors="coerce").dt.year.median()
median_56 = pd.to_datetime(g56["指定年月日"], errors="coerce").dt.year.median()
median_57 = pd.to_datetime(g57["sitei_ymd"], errors="coerce").dt.year.median()
print(f"中央年: 砂防 {{median_55:.0f}}, 急傾斜 {{median_56:.0f}}, 地すべり {{median_57:.0f}}")

結果の図

図 7 を選んだ理由: 横軸=年代 + 縦軸=件数 + 色=3 法 + 縦線=立法年、の 4 情報を 1 図で示すには stacked bar with vertical lines がベスト。

図7: 砂防三法 指定の時代別累積 stacked bar
図7: 砂防三法 指定の時代別累積 stacked bar

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

結果の表 — 時代別件数

年代 砂防指定地 (55) 急傾斜地 (56) 地すべり (57)
1900年代 25 0 0
1910年代 8 0 0
1920年代 12 0 0
1930年代 214 0 0
1940年代 142 0 0
1950年代 345 0 1
1960年代 434 12 8
1970年代 271 545 8
1980年代 317 805 8
1990年代 182 635 10
2000年代 291 562 4
2010年代 378 237 0
2020年代 584 135 0

表から読み取れること:

分析 4: 指定地 vs 警戒区域 — 制度的厳しさ 10 倍差

狙い (RQ ↔ 仮説 H4)

本記事 (砂防三法指定地) と L11 (土砂災害警戒区域) は 同じ土砂災害を扱うが法的位置づけが質的に違う件数比で「制度的厳しさ」を量化する。

手法 — 件数比較バー (3 種類対 × log 軸)

L11 で読み込んだ警戒区域 Shapefile の行数だけを取得し、 本記事の指定地件数と3 種類対で比較する。比率は警戒区域 ÷ 指定地。

制度的差の意味 (要件 J ツール化視点):
  • 指定地 (本記事): 砂防三法 (砂防法/急傾斜地法/地すべり等防止法) が根拠。 切土・盛土・立木伐採等が許可制 (= 違反すれば罰則)。 指定権限は国・県知事。審査が厳しいので件数が少ない。
  • 警戒区域 (L11): 土砂災害防止法 (2000) が根拠。 危険情報の周知のみ、行為制限なし。 宅建業者は取引時に説明義務、住民は危険情報を知る権利を持つ。 指定権限は県知事だが審査基準が緩いので件数が多い。

実装コード

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

# L11 で扱った警戒区域 Shapefile (面積処理は不要、件数のみ)
warn_kyukei   = gpd.read_file("data/extras/sediment_shp/kyukeisha/.../73_031krp_34_20260427.shp")
warn_jisuberi = gpd.read_file("data/extras/sediment_shp/jisuberi/.../73_031jy_34_20260427.shp")
warn_doseki   = gpd.read_file("data/extras/sediment_shp/doseki/.../73_031drp_34_20260427.shp")

# 件数比較 (gdf を保持せず長さだけ)
warn_counts = {{"急傾斜": len(warn_kyukei),
                "地すべり": len(warn_jisuberi),
                "土石流": len(warn_doseki)}}

# 指定地件数 (本記事)
designated = {{"土石流": len(g55_poly),  # 砂防指定地
               "がけ崩れ": len(g56),     # 急傾斜地崩壊危険区域
               "地すべり": len(g57)}}    # 地すべり防止区域

# 3 種類対の倍率
print(f"土石流 警戒/指定 = {{warn_counts['土石流']/designated['土石流']:.1f}} 倍")
print(f"がけ崩れ 警戒/指定 = {{warn_counts['急傾斜']/designated['がけ崩れ']:.1f}} 倍")
print(f"地すべり 警戒/指定 = {{warn_counts['地すべり']/designated['地すべり']:.1f}} 倍")

結果の図

図 8 を選んだ理由: 3 現象 × 2 制度 = 6 セルの比較を、 同じ x 位置にペアで並べた縦棒で表示。倍率を bar の上に annotate することで、 「警戒区域は指定地の何倍か」が即読み取れる。log 軸で件数差をさらに強調。

図8: 指定地 vs 警戒区域 件数比較
図8: 指定地 vs 警戒区域 件数比較

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

結果の表 — 指定地 vs 警戒区域

対象現象 指定地 (本記事 行為制限あり) 警戒区域 (L11 情報のみ) 倍率 (警戒/指定地) 根拠法律 対応する警戒区域の根拠
土石流 砂防指定地 3,207 件 土石流 警戒区域 13,337 件 4.2 倍 砂防法 (1897) 土砂災害防止法 (2000) — 県知事が指定
がけ崩れ (急斜面崩壊) 急傾斜地崩壊危険区域 2,933 件 (点データ) 急傾斜 警戒区域 29,756 件 10.1 倍 急傾斜地法 (1969) 土砂災害防止法 (2000)
地すべり 地すべり防止区域 39 件 地すべり 警戒区域 127 件 3.3 倍 地すべり等防止法 (1958) 土砂災害防止法 (2000)

表から読み取れること:

分析 5: 砂防指定地の水系構造 — 1 級・2 級・その他

狙い (RQ ↔ 仮説 H1 補強)

砂防指定地 (55) は唯一水系メタ情報 (suikei_gr, suikei_nm, kansen_nm) を持つ。 これを使い、「どの水系に砂防指定地が集中しているか」を読み解く。 河川行政の1 級水系 = 国直轄、2 級 = 県、その他 = 市町村関与という階層と、 指定地の地理分布の関係を見る。

手法 — groupby 水系 + 水系別 polygon マップ

砂防指定地を suikei_gr (水系区分) と suikei_nm (水系名) で groupby し、件数・総面積・平均面積を集計する。 さらに 1 級/2 級/その他 で色分けした polygon マップを描き、 水系階層と地理分布の関係を可視化する。

実装コード

L46_sabo_designation.py 行 1457–1484

 1
 2
 3
 4
 5
 6
 7
 8
 9
1466
1467
# 水系別 集計
suikei = g55_poly.groupby(["suikei_gr", "suikei_nm"]).agg(
    件数=("id", "count"),
    総面積ha=("area_ha", "sum"),
    平均面積ha=("area_ha", "mean"),
).reset_index().sort_values("件数", ascending=False)

# 1 級水系トップ
top_lev1 = suikei[suikei["suikei_gr"] == "1級"].head(5)
print("1 級水系 トップ 5:")
print(top_lev1[["suikei_nm", "件数", "総面積ha"]].to_string())

結果の図

図 5 を選んだ理由: 水系区分 (1 級/2 級/その他) を色で分け、 全 polygon を県全域に重ねることで「県の主要水系の砂防地理」が見える。 line データも黒で重ね、戦前指定の場所も同時に表示。

図5: 砂防指定地 水系別 polygon マップ
図5: 砂防指定地 水系別 polygon マップ

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

結果の表 — 水系別 上位 15

suikei_gr suikei_nm 件数 総面積ha 平均面積ha
その他 その他 743 2702.0 3.64
1級 太田川 638 2929.3 4.59
1級 江の川 444 2346.5 5.28
1級 芦田川 238 4629.6 19.45
2級 瀬野川 144 404.0 2.81
2級 沼田川 112 1262.6 11.27
2級 黒瀬川 111 331.3 2.98
2級 八幡川 95 400.3 4.21
1級 小瀬川 64 147.2 2.30
2級 賀茂川 55 292.2 5.31
その他 大屋大川 45 97.1 2.16
2級 二河川 44 290.9 6.61
1級 高梁川 41 162.7 3.97
2級 総頭川 33 45.5 1.38
2級 堺川 31 20.6 0.66

表から読み取れること:

分析 6: 上位 4 市町ズーム — 三法重ねの空間構造

狙い (RQ 統合)

三法合計件数の上位 4 市町に絞り、3 種指定地 (+ line) を同じズーム範囲で small multiples 並置することで、「市町ごとに異なる三法の混在比率」を可視化する。 これは分析 1-3 の結果を空間的に統合する仕上げの図。

手法 — small multiples (2x2 grid)

4 市町の bbox (外接矩形) を共通計算し、各 panel で同じ凡例で 4 種要素 (砂防 poly, 砂防 line, 急傾斜点, 地すべり poly) を描く。背景は admin_diss で県全体の市町境界。

実装コード

L46_sabo_designation.py 行 683–735

 1
 2
 3
 4
 5
 6
 7
 8
 9
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
top4 = city_summary.head(4)["市町"].tolist()
fig, axes = plt.subplots(2, 2, figsize=(13, 10))

for ax, city in zip(axes.flat, top4):
    sub_55  = g55_poly[g55_poly["city"] == city]
    sub_55l = g55_line[g55_line["city"] == city]
    sub_56  = g56[g56["市区郡町"] == city]
    sub_57  = g57[g57["city"] == city]

    # bbox: 全要素の外接矩形 + 1.5 km マージン
    candidates = [g.total_bounds for g in [sub_55, sub_55l, sub_57] if len(g)]
    if len(sub_56):
        candidates.append([sub_56.geometry.x.min(), sub_56.geometry.y.min(),
                           sub_56.geometry.x.max(), sub_56.geometry.y.max()])
    candidates = np.array(candidates)
    xmin, ymin = candidates[:, 0].min() - 1500, candidates[:, 1].min() - 1500
    xmax, ymax = candidates[:, 2].max() + 1500, candidates[:, 3].max() + 1500

    admin_diss.plot(ax=ax, color="#f8f8f8", edgecolor="#aaa", linewidth=0.4)
    sub_55.plot(ax=ax, color="#388e3c", alpha=0.55)
    sub_55l.plot(ax=ax, color="#1b5e20", linewidth=1.5)
    ax.scatter(sub_56.geometry.x, sub_56.geometry.y, s=10, c="#cf222e", alpha=0.65)
    sub_57.plot(ax=ax, color="#f9a825", alpha=0.85)
    ax.set_xlim(xmin, xmax); ax.set_ylim(ymin, ymax)

結果の図

図 9 を選んだ理由: small multiples は「複数の地域を同じレンズで比較する」 ための定番構図。各市町の三法混在パターンが並置で読める。

図9: 三法合計件数 上位 4 市町 ズームマップ
図9: 三法合計件数 上位 4 市町 ズームマップ

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

結果の表 — Top 砂防指定地 面積ランキング

順位 市町 水系名 幹川名 渓流名 大字 指定年月日 種別 面積 ha
1 福山市 芦田川 箱田川 箱田川 大字西中条 1901-07-05 新規 491.2
2 東広島市 沼田川 沼田川 押谷川 久芳 1968-05-23 追加 308.6
3 福山市 芦田川 竹田川 竹田川 大字上竹田 1919-02-05 新規 276.4
4 福山市 芦田川 加屋川 本谷川 津之郷町 津之郷 1919-02-05 新規 268.1
5 福山市 芦田川 今信川 今信川 大字東中条 1901-07-05 新規 260.0
6 福山市 芦田川 堂々川 堂々川 大字下御領 1901-07-05 新規 233.0
7 福山市 芦田川 有地川 有地川 芦田町 下有地 1901-07-05 新規 218.2
8 安芸郡府中町 太田川 榎川 御衣尾川 None 1919-02-05 追加 186.7
9 福山市 芦田川 小田川 小田川 山手町 1919-02-05 新規 172.2
10 福山市 芦田川 加茂川 加茂川 加茂町 粟根 1919-02-05 新規 157.7
11 竹原市 賀茂川 賀茂川 栃谷川 仁賀町 2002-02-13 追加 156.3
12 福山市 芦田川 清水川 清水川 大字上御領 1901-07-05 新規 155.4
13 尾道市 栗原川 栗原川 栗原川 栗原町 1909-11-04 新規 150.7
14 山県郡安芸太田町 太田川 太田川 田吹川 None 2000-08-09 追加 150.6
15 尾道市 その他 その他 坊地川 尾崎町 1909-11-04 新規 142.5

表から読み取れること:

仮説検証と考察

6 仮説の検証結果

仮説 想定 実測 判定
H1 規模 100 倍非対称 件数で 砂防 >> 急傾斜 >> 地すべり、地すべりは他の 1/75 以下 砂防 3,207 : 急傾斜 2,933 : 地すべり 39 = 82 : 75 : 1 強支持
H2 法律 → 地理パターン分離 砂防 (中山間+沿岸広く), 急傾斜 (呉市集中 40%+), 地すべり (庄原+福山集中) 砂防 top市町=呉市 (516.0件), 急傾斜 呉市占有率=40.4%, 地すべり top市町=庄原市 (36%) 支持
H3 時代の制度展開 中央指定年: 砂防 (1984) < 地すべり (1986) < 急傾斜 (1991), 地すべりは 2006 で停滞 砂防 1984, 地すべり 1986, 急傾斜 1991; 最終指定年: 砂防 2028, 急傾斜 2025, 地すべり 2006 強支持
H4 指定地 vs 警戒区域 10 倍差 警戒区域は指定地の約 10 倍件数 (情報公示制 vs 行為制限制 の差) 土石流 4.2 倍, がけ崩れ 10.1 倍, 地すべり 3.3 倍 (平均 5.9 倍) 支持
H5 データ形式の不均一 55 = Shapefile + line, 56 = CSV 点のみ, 57 = Shapefile (整備度 3 種異なる) 55 = Shapefile (poly+line) (line 93 件 = 戦前データ残存), 56 = CSV (point only) (ポリゴン未整備), 57 = Shapefile (poly) 強支持
H6 呉市の急傾斜集中 呉市単独で急傾斜全体の 40% 以上を占める (軍港都市の急斜面住宅地史) 呉市 1,184 件 = 全体の 40.4% 強支持

主要発見の整理

3 dataset 相互関係の構造発見

本記事の最重要発見は、3 dataset が「同じ砂防関係指定地」シリーズを名乗りながら 制度的にも形式的にも独立した別物である点である。

3 dataset は結合不能 (= merge する共通キーが無い)。 代わりに「市町別カウント + 時代別カウント + 形式比較」の並列分析で構造を読む。 これは L45 (ため池, 2 dataset を merge) との分析設計の根本的な違いである。

「指定地」と「警戒区域」の制度的補完

本記事の指定地 (砂防三法, 戦前〜1970s 法律) と L11 の警戒区域 (土砂災害防止法 2000) は、 同じ土砂災害ドメインの異なる時代の制度として相補的:

本研究の限界

発展課題

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

課題 1: 指定地 × 警戒区域 空間結合 — 二重保護エリアの定量化

課題 2: 急傾斜地崩壊危険区域 ポリゴン整備 — 県への提言

課題 3: 砂防指定地 line (93 件) の歴史調査

課題 4: 地すべり防止区域 × 地質図 重ね合わせ

課題 5: 呉市急傾斜地 × 西日本豪雨被害 マッチング

課題 6: 三省共管制 (地すべり防止区域) の停滞要因