Lesson 67

トンネル基本情報 単独 3 研究例分析 — 157 件から県の山岳インフラを読む

L67トンネル道路トンネル国道県道RQ×3Format BgeopandasPOINT (CSV)中山間山岳バイパス二極構造L66連携 (橋梁)合併市町正規化
所要 50 分 / 想定レベル: 中級 / データ: DoBoX dataset 12 (CSV, ~32 KB)

学習目標と問い

本記事は DoBoX のシリーズ「トンネル基本情報・維持管理情報」 1 件 (dataset_id = 12) を 単独で取り上げ、 広島県が管理する 道路トンネル 157 件 / 26 市町 / 9 事務所 / 59 路線を 3 つの独立した研究角度 (RQ1 / RQ2 / RQ3) で並列に分析する。 本データは CSV 形式 (32,424 byte / 16 列) で、 緯度経度は全件 (100%) 取得可。 ただし2 件で緯度経度が記録ミスにより入れ替わっており、本スクリプトで自動補正する。

L66 (橋梁単独 3 RQ) との位置付け: L66 は同じ DoBoX シリーズ「○○基本情報・維持管理情報」 の橋梁版で、4,203 件を 3 RQ (構造・年代・防災) で分析。 本記事 L67 はトンネル単独の構造分析 (= 規模・地形・年代) に集中するが、 RQ3 でL66 との二極構造を比較し、「橋梁=平野・川越え、トンネル=山岳貫通」 の 地理分担を実証する。両記事は「県の道路インフラ」を構成する 2 つの軸として 補完関係を成す。

トンネルデータの本質: 県内の道路トンネルは道路法 (1952) と インフラ長寿命化基本計画 (2014) の管理対象。 2014 年改正で5 年に 1 回の点検が義務化され、 全トンネルに I (健全) 〜 IV (緊急措置) の健全度区分が付与される。 ただし本データの「判定区分」 列は全件 "?" で公開データでは伏せられている。 そのため本研究では「建設年度から経過年」 を健全度の代理指標として扱う。

独自用語の定義

研究の問い (3 RQ)

仮説 H1〜H5

  1. H1 (国道偏重, RQ1): トンネルは橋梁と異なり 国道シェア ≥ 50%。 大規模工事は広域幹線で行われる事業構造仮説。
  2. H2 (中山間集中, RQ2): 中山間 9 市町に ≥ 70% のトンネルが集中。 山岳地形貫通トンネルは中山間市町の道路網に必須。
  3. H3 (1990 年代ピーク, RQ2): 建設年代ヒストグラムは1990 年代にピーク。 バブル経済期の道路投資が山岳道路網整備のピークを生んだ。
  4. H4 (橋梁との件数比, RQ3): L66 橋梁 / L67 トンネル の 件数比 ≥ 25。 橋梁は中小河川クロスで多数、トンネルは山岳貫通で希少。
  5. H5 (規模差, RQ3): トンネル平均延長 / 橋梁平均延長 ≥ 10。 トンネルは大規模工事で、1 件あたりのインフラ価値が高い。

到達点

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

  1. 1 つの小規模 CSV (157 件 × 16 列, 全件 POINT) から、 道路種別 / 市町 / 事務所 / 路線 / 延長 / 幅員 / 建設年度 / 地形分類 を 多角度で集計するハンズオン分析を完走する。 合併市町名の正規化 + 緯度経度の入れ替え自動補正という実データのクリーニング技も身につく。
  2. 「規模 + 地形 + 二極構造」の 3 軸で県内のトンネル網を読み解き、 「橋梁=平野クロス、トンネル=山岳貫通」 の道路インフラ二極構造を 地域データで定量化する。
  3. RQ1 (構造) → RQ2 (地形・分断回避) → RQ3 (橋梁との二極構造) の 3 段階で、「県の山岳インフラの物理的形状 + 政策的位置付け」を 定量的に描く研究プロセスを体感する。

使用データ

DoBoX のシリーズ「トンネル基本情報・維持管理情報」 1 件のみを単独で扱う。 リソースは CSV 1 ファイル (~32 KB)。

項目
dataset_id 12
公式名 トンネル基本情報・維持管理情報
ファイル tunnel_basic.csv
形式 CSV (UTF-8 BOM)
ファイルサイズ 32,424 byte (~32 KB)
レコード数 157 行 (= 道路トンネル件数)
列数 23 列
種別 全件 トンネル (鉄道トンネル・河川トンネルは別データ)
道路種別 国道 83 + 県道 74
管理事務所 9 事務所
路線数 59 異なり値
市町数 (正規化済) 26 市町
緯度経度 全件 取得可 (100%)。うち 2 件で記録ミスあり (本スクリプトで自動補正)
建設年度 157 件 (100%) 取得可、範囲 1927-2018
点検年度 156 件 取得可、範囲 2016-2022
判定区分 全件 "?" (= 公開データでは伏せられる)
延長 (m) 中央値 206m / 最大 2212m / 最小 17.7m
幅員 (m) 中央値 7.5m / 最大 12.0m
座標系 (元) EPSG:4326 (WGS84) → EPSG:6671 で処理
ライセンス クリエイティブ・コモンズ表示 (CC-BY)
作成主体 広島県土木建築局道路整備課
URL https://hiroshima-dobox.jp/datasets/12

この表から読み取れること: dataset 12 は 157 行 × 23 列の CSV。 道路種別 (国道/県道)・管理事務所・路線・建設年度・点検年度・延長・幅員という 多次元のメタデータを持つ。 緯度経度は全件 (100%) 取得可だが、2 件で緯度経度が入れ替わって 記録されており本スクリプトで自動補正する。 また「判定区分」 列は全件マスクされており、健全度判定値は本データから直接は取れない。

L66 (橋梁単独 3 RQ) との関係

項目L66 橋梁 (既扱)L67 トンネル (本記事)
研究の問い橋梁台帳の内部構造 (種別・規模・年代・防災)トンネル台帳の内部構造 + 橋梁との二極構造
主役データ橋梁 (dataset 11, 4,203 件)トンネル (dataset 12, 157 件)
地形対象河川・谷を渡る (= 平野・低地)山岳を貫く (= 中山間)
規模中央値 ~ 7m, 短橋集中中央値 ~ 206m, 中・長尺集中
道路種別偏向県道 72.6% (件数支配)国道 52.9% (規模支配)
共通点同じ管理体系 (道路法 + 5 年周期点検) + 健全度区分マスク + 9 事務所階層

この表から読み取れること: L66/L67 は同じシリーズの兄弟データセット。 研究の問いは似ているが、対象地形・規模・偏向が大きく異なる。 本記事 RQ3 でこれを「道路インフラ二極構造」として定量化する。

データ取得手順

ステップ 操作 値 / URL
ステップ 1 DoBoX dataset 12 ページ https://hiroshima-dobox.jp/datasets/12
ステップ 2 CSV DL (リソースリンク) ページ内のリソースから「ダウンロード」
ステップ 3 保存先 data/extras/L67_tunnels/tunnel_basic.csv (or 共有 data/extras/tunnel_basic.csv)
ステップ 4 緯度経度の入れ替え自動補正 緯度 > 50 の 2 行を経度と入れ替え
ステップ 5 POINT 構築 + EPSG:6671 投影 全 157 件 → POINT 100%
ステップ 6 市町同定 (テキスト + 旧町村正規化 + sjoin) テキスト解析で 157/157, sjoin で 123/157 直接一致
ステップ 7 RQ1 集計 (構造) 道路種別 + 市町 + 事務所 + 路線 + 延長 + 幅員 で多角度集計
ステップ 8 RQ2 集計 (中山間 vs 平野) 中山間 9 市町 vs 平野 13 市町 + 建設年代別
ステップ 9 RQ3 集計 (L66 橋梁との対比) 件数比 26.8:1, 平均延長比 16.3:1
ステップ 10 8 図 + 12 表 出力 本スクリプト全体で ~10 秒

この表から読み取れること: DoBoX dataset 12 → CSV DL → 緯度経度補正 → POINT 構築 → 市町同定 (テキスト + sjoin) → RQ1/2/3 集計、の 10 ステップで再現可能。 全工程は本スクリプト 1 本で自動実行 (~10 秒)。 共有 CSV (data/extras/tunnel_basic.csv) があれば再 DL 不要。

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

ダウンロード

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

生データ (DoBoX 直リンク + 本日取得分)

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

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

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

cd "2026 DoBoX 教材"
# DoBoX のページから tunnel_basic.csv をブラウザでDLし、
# data/extras/L67_tunnels/tunnel_basic.csv に置く
py -X utf8 lessons/L67_tunnels.py

本スクリプトは data/extras/tunnel_basic.csv (共有) があれば それを優先使用、無ければ ensure_dataset() ヘルパで自動取得を試みる。 全工程は約 10 秒で完走 (1 分以内完走の要件 S を余裕クリア)。

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

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

【RQ1】 トンネルの構造 — 国道 53% / 中央値 206m / Top 3 で 39%

RQ1 の狙い

157 件の道路トンネルを道路種別 / 市町 / 事務所 / 路線 / 延長 / 幅員の 6 軸で 多角度に集計し、広島県のトンネル網の物理的形状を立体化する。 特に「トンネル」 という山岳貫通の大規模インフラの規模・分布を 初めて定量化する。

手法 (前置き解説)

入出力の Before/After 例

段階1 件の中身件数
(0) CSV 1 行トンネル番号=1, 施設名=茂陰トンネル, 道路種別=県道, 路線名=上宮町新地線, 延長=267.3, 幅員=10.1, 建設年度=1998, 緯度=34.38733, 経度=132.50189, 住所(市町)=府中町 茂陰一丁目157
(1) 緯度経度 自動補正緯度 > 50 の 2 件を経度と入れ替え2
(2) POINT 構築 + EPSG:6671+ geometry = Point (X, Y, m 単位)157
(3) 市町正規化+ 市町名 = 府中町 (= 「府中町 茂陰一丁目」 の先頭)157
(4) sjoin 検証+ CITY_CD = 302 (= 府中町)、テキストと整合157
(5) 派生フラグ+ 延長カテゴリ=「中(100-300m)」, 年代=1990, is_old=False, is_long=False (267 < 1000)157
(6) 集計 (例: 市町別)安芸太田町: 23 件 (1 位)(別)

(0)-(6) を全 157 件に適用 → 6 軸で集計 → 図化。 全工程はメモリ常駐で完結し、別キャッシュは不要。

実装コード (CSV → 緯度経度補正 → POINT → 市町正規化 → 多軸集計)

L67_tunnels.py 行 1387–1496

 1
 2
 3
 4
 5
 6
 7
 8
 9
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
# 1. CSV 読込 + 数値列クリーニング
import pandas as pd, geopandas as gpd, numpy as np
from shapely.geometry import Point

df = pd.read_csv("data/extras/tunnel_basic.csv", encoding="utf-8-sig")
print(df.shape, df["道路種別"].value_counts())  # 157 行, 国道 83 / 県道 74

# 2. 緯度経度の入れ替え自動補正 (実データの典型ミス)
df["緯度(10進数)"] = pd.to_numeric(df["緯度(10進数)"], errors="coerce")
df["経度(10進数)"] = pd.to_numeric(df["経度(10進数)"], errors="coerce")
swap_mask = df["緯度(10進数)"] > 50  # 緯度 50 超は経度との入れ替え
print(f"入れ替え対象: {swap_mask.sum()} 件")
tmp = df.loc[swap_mask, "緯度(10進数)"].copy()
df.loc[swap_mask, "緯度(10進数)"] = df.loc[swap_mask, "経度(10進数)"]
df.loc[swap_mask, "経度(10進数)"] = tmp

# 3. 数値列をきれいに
df["建設年度"] = pd.to_numeric(df["建設年度"], errors="coerce")
df["延長(m)"] = pd.to_numeric(df["延長(m)"], errors="coerce")
df["幅員(m)"] = pd.to_numeric(df["幅員(m)"], errors="coerce")

# 4. POINT 構築
df["geometry"] = df.apply(
    lambda r: Point(float(r["経度(10進数)"]), float(r["緯度(10進数)"])), axis=1)
gdf = gpd.GeoDataFrame(df, geometry="geometry", crs="EPSG:4326").to_crs("EPSG:6671")

# 5. 市町正規化 (合併で消滅した旧町村名 → 現市町名)
LEGACY = {"加計町":"安芸太田町","戸河内町":"安芸太田町","筒賀村":"安芸太田町",
          "小方町":"大竹市","宮島町":"廿日市市","大野町":"廿日市市","佐伯町":"廿日市市",
          "江田島町":"江田島市","能美町":"江田島市","沖美町":"江田島市","大柿町":"江田島市",
          # ... (全マッピングは LEGACY_TO_CURRENT 参照)
          }
def parse_city(addr):
    head = str(addr).split(" ")[0]
    for c in ["広島市","呉市","三原市","尾道市","福山市","三次市","庄原市",
              "東広島市","廿日市市","府中市","大竹市"]:
        if head.startswith(c): return c
    return LEGACY.get(head, head)

df["市町名"] = df["住所(市町)"].apply(parse_city)

# 6. 6 軸集計
print("市町別 Top 10:")
print(df["市町名"].value_counts().head(10))

# 7. H1 検証: 国道シェア
print(f"国道シェア: {(df['道路種別']=='国道').sum()/len(df)*100:.1f}%")

# 8. 長大トンネル (>=1000m) 同定
LONG = 1000.0
df["is_long"] = df["延長(m)"] >= LONG
print(f"長大トンネル: {df['is_long'].sum()} 件 ({df['is_long'].mean()*100:.1f}%)")

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

「広島県のどこにどんな道路種別のトンネルがあるか」 を 1 枚で読みたい。 全 157 件を国道 (赤) + 県道 (青) で色分けし全域に描く。これにより 県のトンネル網の物理的形状が一目で読める。 点を大きめ (msize=18) に設定し、橋梁 (msize=5) と異なる「希少な大規模インフラ」感を出す。

図 1 (RQ1): 広島県 道路トンネル 全域マップ (国道 vs 県道)
図 1 (RQ1): 広島県 道路トンネル 全域マップ (国道 vs 県道)

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

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

「26 市町と 9 管理事務所のうち、どこにトンネルが集中しているか」 を 左右ペアで比較したい。横棒 (件数 + 値ラベル) で並べ、市町は中山間 (青) vs 平野・沿岸 (橙)で塗り分け。 これにより市町別偏在 + 中山間集中性が一目で読める。

図 2 (RQ1): 市町別 + 管理事務所別 トンネル件数
図 2 (RQ1): 市町別 + 管理事務所別 トンネル件数

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

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

「個々のトンネルの規模 (延長) を地理的に読みたい」 ため、 バブルマップ (バブル大きさ = 延長 log スケール) を採用。 道路種別を色で区別し、≥1km の長大トンネルには施設名ラベルを付与。 これにより「どこに大規模トンネルがあるか」が一目で読める。

図 3 (RQ1): 延長階級バブルマップ (log スケール)
図 3 (RQ1): 延長階級バブルマップ (log スケール)

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

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

「トンネルの規模分布を 1 枚で読みたい」 ため、延長 (log 軸) と幅員 (linear) の 2 ペインヒストグラム。延長は桁差が大きい (17m 〜 2212m) ので log 軸、 幅員は近距離値域 (4 〜 12m が大半) なので linear 軸。 これにより「中・長尺集中 + 標準幅員」を同時に読める。

図 4 (RQ1): 延長 + 幅員 ヒストグラム
図 4 (RQ1): 延長 + 幅員 ヒストグラム

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

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

指標
総件数 (RQ1) 157 件
国道トンネル 83 (52.9%)
県道トンネル 74 (47.1%)
管理事務所数 9
路線数 59
市町数 (正規化後) 26
Top 1 市町 (RQ1) 安芸太田町 (23 件)
Top 3 市町シェア (RQ1) 39.5%
中山間 9 市町シェア (RQ2) 47.8% (75 件)
長大トンネル (≥1000m) (RQ1) 9 件 (5.7%)
延長 中央値 / 最大 (RQ1) 206 m / 2212 m
幅員 中央値 / 最大 (RQ1) 7.5 m / 12.0 m
最多年代 (RQ2) 1980s (42 件)

この表から読み取れること: 県内道路トンネルは 157 件 / 26 市町 / 9 事務所 / 59 路線 / 国道 + 県道 2 種別 / 4 規模カテゴリ の多次元管理対象。国道シェア 52.9% で件数支配、規模は中・長尺集中 (中央値 206m)。

表: 道路種別 サマリ

道路種別 件数 シェア_% 平均延長_m 平均幅員_m
国道 83 52.9 273.5 6.08
県道 74 47.1 360.4 6.61
合計 157 100.0 314.5 6.32

この表から読み取れること: 国道 52.9% (n=83) + 県道 47.1% (n=74)。国道は件数だけでなく規模でも優勢: 平均延長 274m vs 県道 360m。これは「広域幹線でこそ大規模トンネル整備」という事業構造を反映。橋梁 (L66) の「県道支配 (件数のみ)、国道支配 (規模のみ)」と比べると、トンネルは件数・規模の両方で国道支配

表: 延長カテゴリ別 サマリ

延長カテゴリ 件数 シェア_%
短(<100m) 42 26.8
中(100-300m) 58 36.9
中長(300-1000m) 48 30.6
長大(≥1000m) 9 5.7

この表から読み取れること: 中 (100-300m) + 中長 (300-1000m) で 106 件 (68%) を占める。短 (<100m) は 42 件 (27%)、長大 (≥1000m) は 9 件 (5.7%) で希少。橋梁 (L66) の極短橋集中 (39%) と対照的に、トンネルは中規模が中心。

表: 市町別 ランキング (Top 15, 合併正規化済)

順位 市町名 件数
1 安芸太田町 23
2 呉市 21
3 庄原市 18
4 尾道市 12
5 三次市 10
6 大竹市 9
7 江田島市 9
8 神石高原町 8
9 福山市 7
10 三原市 5
11 廿日市市 5
12 北広島町 5
13 府中市 4
14 安芸高田市 4
15 東広島市 3

この表から読み取れること: 件数最多は 安芸太田町 (23 件)、Top 5 で 54% を占める。中山間市町 (青色市町) が上位を独占し、「中山間 = トンネル多数」のパターンが鮮明。合併前の旧町村名 (69 件マッピング) を正規化することで、市町別集計が現在の行政区分に対応する。

表: 管理事務所別 ランキング

順位 管理事務所名 件数 シェア_%
1 安芸太田支所 28 17.8
2 東部建設事務所 22 14.0
3 三原支所 22 14.0
4 呉支所 21 13.4
5 庄原支所 18 11.5
6 西部建設事務所 15 9.6
7 廿日市支所 15 9.6
8 北部建設事務所 11 7.0
9 東広島支所 5 3.2

この表から読み取れること: 安芸太田支所 (28 件, 17.8%) が 単独 1 位 = 西部山地の中山間道路網担当。東広島支所 (= 平野部担当) は最少 (5 件) で、事務所間で 5-7 倍の偏りがある。これは橋梁の均等分担と大きく異なり、トンネル整備が地形に強く依存することを反映。

表: 路線別 ランキング (Top 12)

順位 路線名 件数
1 186号 24
2 487号 13
3 432号 9
4 375号 8
5 184号 8
6 三原東城線 7
7 191号 6
8 府中世羅三和線 6
9 本郷大和線 4
10 呉平谷線 4
11 182号 4
12 314号 4

この表から読み取れること: 路線別 1 位は 186号 (24 件)、これは県内を縦貫する基幹路線。全 59 路線のうち上位 12 路線で 62% を占める。残り 47 路線は 1-数件のトンネルのみ。「主要路線にトンネルが集中する」偏在パターンは橋梁と同じだが、トンネルの方が路線あたり件数が多く、希少な大規模整備

【RQ2】 山岳分断回避 — 中山間 48% / 最多 1980s

RQ2 の狙い

RQ1 で抽出した 157 件のトンネルについて、地形特性 (9 の中山間市町 vs 13 の平野・沿岸市町) でトンネル集中度を比較し、山岳道路の分断回避機能を実証する。 さらに建設年代分布から「山岳バイパス整備の波」 を読み解く。

手法 (前置き解説)

入出力の Before/After 例

段階1 件の中身件数
(0) トンネル 1 件市町名=安芸太田町, 建設年度=1995, 延長=850157
(1) 地形分類+ 地形分類 = 中山間 (9 市町)157
(2) 年代化+ 年代 = 1990157
(3) 老朽判定 (≤1974)+ is_old = False (1995 > 1974)157
(4) 中山間集中度中山間 75 / 全体 157 = 47.8%2 値

(0)-(4) を全 157 件に適用。中山間 vs 平野で集計を 2 系列化。

実装コード (中山間 vs 平野 + 建設年代分析)

L67_tunnels.py 行 1637–1716

 1
 2
 3
 4
 5
 6
 7
 8
 9
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
# 1. 中山間 9 市町 vs 平野・沿岸 13 市町 の二分類
import numpy as np, pandas as pd
CHUSANKAN_CITIES = {"庄原市", "三次市", "北広島町", "安芸太田町", "神石高原町",
                     "世羅町", "府中市", "安芸高田市", "大崎上島町"}
df["地形分類"] = np.where(df["市町名"].isin(CHUSANKAN_CITIES),
                            "中山間 (9 市町)", "平野・沿岸 (13 市町)")
chusankan_share = (df["地形分類"]=="中山間 (9 市町)").sum() / len(df) * 100
print(f"中山間集中度: {chusankan_share:.1f}%")

# 2. 中山間 vs 平野 の規模比較
T_terrain = df.groupby("地形分類").agg(
    件数=("トンネル番号", "size"),
    平均延長_m=("延長(m)", "mean"),
    最長_m=("延長(m)", "max"),
).reset_index()
print(T_terrain)
# (例)
#       地形分類           件数  平均延長_m   最長_m
# 0  中山間 (9 市町)     105   330.5   2212.0
# 1  平野・沿岸 (13 市町)  52   281.4   1800.0

# 3. 建設年代別ヒストグラム
df["建設年度"] = pd.to_numeric(df["建設年度"], errors="coerce")
df["年代"] = (df["建設年度"] // 10 * 10).astype("Int64")
decade_count = df["年代"].value_counts().sort_index()
print(decade_count)
# 1920s:1 1930s:0 1940s:0 1950s:3 1960s:11 1970s:14
# 1980s:38 1990s:50 2000s:30 2010s:10  (例)

# 4. 老朽トンネル (1974 年以前)
AGE_THRESHOLD = 1974
df["is_old"] = df["建設年度"] <= AGE_THRESHOLD
print(f"老朽トンネル: {df['is_old'].sum()} / {len(df)} ({df['is_old'].mean()*100:.1f}%)")

# 5. 道路種別 × 地形分類 クロス表
cross = df.groupby(["道路種別", "地形分類"]).size().unstack(fill_value=0)
print(cross)

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

「トンネルが中山間市町にどれだけ集中しているか」 を地図で読みたい。 背景を中山間 (薄緑) vs 平野・沿岸 (薄黄) で塗り分け、トンネル点を地形分類別に色分けして重ねる。 これにより「中山間 vs 平野の偏在」が一目で読める。 ゾーニング背景 + 点のオーバーレイは地理学の標準的な可視化技法

図 5 (RQ2): 中山間 vs 平野・沿岸 トンネル分布
図 5 (RQ2): 中山間 vs 平野・沿岸 トンネル分布

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

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

「広島県の道路トンネルがどの年代に集中整備されたか」 を 1 枚で読みたい。 10 年区切りの建設年代別件数を棒グラフで描き、老朽閾値 (1970 年代以前) を赤色、 1980 年以降を青色で塗り分け。これにより「年代別の整備量 + 老朽トンネルの量」を同時に読める。

図 6 (RQ2): 建設年代別 トンネル件数 — 老朽 (1970s 以前) 35 件
図 6 (RQ2): 建設年代別 トンネル件数 — 老朽 (1970s 以前) 35 件

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

表: 中山間 vs 平野・沿岸 サマリ

地形分類 件数 平均延長_m 最長_m 最古_年 最新_年 シェア_%
中山間 (9 市町) 75 294.6 1402.0 1927 2010 47.8
平野・沿岸 (13 市町) 82 332.7 2212.0 1937 2018 52.2

この表から読み取れること: 中山間 9 市町に 75 件 (47.8%)、平野・沿岸 13 市町に 82 件 (52.2%)。中山間と平野で平均延長は 38m の差「中山間トンネル ≒ 大規模、平野トンネル ≒ 小規模」のパターンが浮かぶ。

表: 中山間市町別 トンネルランキング

順位 市町名 トンネル数
1 安芸太田町 23
2 庄原市 18
3 三次市 10
4 神石高原町 8
5 北広島町 5
6 安芸高田市 4
7 府中市 4
8 世羅町 2
9 大崎上島町 1

この表から読み取れること: 中山間トップは 安芸太田町 (23 件)、これは安芸太田町の山岳道路網を支える基幹インフラ。中山間 9 市町でも2-7 倍の差があり、地形・人口・道路網密度で差が出る。

表: 建設年代別 件数

年代 件数 シェア_%
1920s 1 0.6
1930s 5 3.2
1940s 4 2.5
1950s 4 2.5
1960s 19 12.1
1970s 14 8.9
1980s 42 26.8
1990s 37 23.6
2000s 22 14.0
2010s 9 5.7

この表から読み取れること: 1980-1990s の 2 年代で全体の 50% を占める集中整備期。最多年代は 1980s (42 件)。2010s 以降は新規整備が激減 = 維持管理時代への転換。老朽トンネル (22.3%) は橋梁老朽率 (32.9%) より大幅に低い

表: 道路種別 × 地形分類 クロス表

地形分類 道路種別 中山間 (9 市町) 平野・沿岸 (13 市町)
国道 43 40
県道 32 42

この表から読み取れること: 国道・県道とも中山間に多く立地。「広域幹線でも地域路でも、トンネルは山岳バイパス機能が中心」。中山間市町では国道+県道のトンネル両方が地域の動脈を支える。

【RQ3】 L66 橋梁との二極構造 — 件数比 27:1 / 延長比 16:1

RQ3 の狙い

L66 橋梁 (4,203 件) と L67 トンネル (157 件) を比較し、 「橋梁=平野・川越え + トンネル=山岳貫通」の道路インフラ二極構造を実証する。 両者は同じ管理体系 (道路法 + 5 年周期点検) + 同じ 9 事務所階層を共有するが、 対象地形・規模・偏向が大きく異なる。本研究はこの違いを件数 / 規模 / 道路種別 / 地理の 4 軸で定量化する。

手法 (前置き解説)

実装コード (L66 橋梁データ流用 + 比較指標計算)

L67_tunnels.py 行 1790–1870

 1
 2
 3
 4
 5
 6
 7
 8
 9
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
# 1. L66 橋梁データ読込 (既存中間 CSV を流用)
import pandas as pd
df_bridge = pd.read_csv("lessons/assets/L66_all_bridges.csv", encoding="utf-8-sig")
print(f"橋梁: {len(df_bridge):,} 件")

# 2. 件数 + 平均延長 比較
n_bridge = len(df_bridge); n_tunnel = len(df)
ratio_count = n_bridge / n_tunnel  # 約 27 倍
mean_b = df_bridge["延長(m)"].mean()  # 約 19m
mean_t = df["延長(m)"].mean()  # 約 300m
ratio_len = mean_t / mean_b   # 約 16 倍
print(f"件数比: {ratio_count:.1f} : 1")
print(f"平均延長比: {ratio_len:.1f} : 1 (トンネル/橋梁)")

# 3. 道路種別偏向の対比
print("橋梁 国道シェア:",
       (df_bridge["道路種別"]=="国道").sum()/len(df_bridge)*100, "%")
print("トンネル 国道シェア:",
       (df["道路種別"]=="国道").sum()/len(df)*100, "%")

# 4. 二極構造マップ用に橋梁 POINT 化
import geopandas as gpd
from shapely.geometry import Point
geom_b = [Point(x,y) for x,y in zip(df_bridge["経度(10進数)"],
                                    df_bridge["緯度(10進数)"])]
gdf_b = gpd.GeoDataFrame(df_bridge[["施設名"]], geometry=geom_b,
                          crs="EPSG:4326").to_crs("EPSG:6671")

# 5. 規模分布 (密度正規化重ね合わせ)
import matplotlib.pyplot as plt, numpy as np
plt.hist(df_bridge["延長(m)"].dropna(),
          bins=np.logspace(0, 4, 40), alpha=0.5,
          label="L66 橋梁", density=True)
plt.hist(df["延長(m)"].dropna(),
          bins=np.logspace(0, 4, 40), alpha=0.5,
          label="L67 トンネル", density=True)
plt.xscale("log")
plt.legend()

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

「橋梁とトンネルの地理分担を 1 枚で読みたい」 ため、 橋梁を背景に薄く (灰), トンネルを前景に大きく (国道=赤, 県道=青) 重ねた二極構造マップ。 これにより「平野=橋梁、山岳=トンネル」の物理的補完関係が一目で読める。

図 7 (RQ3): 道路インフラ二極構造マップ — 橋梁 (背景) + トンネル (前景)
図 7 (RQ3): 道路インフラ二極構造マップ — 橋梁 (背景) + トンネル (前景)

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

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

「橋梁とトンネルの規模分布を 1 枚で対比したい」 ため、 左 = 件数比較 (棒グラフ), 右 = 延長分布の密度正規化ヒストグラム (log 軸) の 2 ペイン。 件数の桁差 (27:1) と規模の桁差 (16:1) を同時に視覚化する。 密度正規化により、件数差を排除した純粋な規模分布が比較可能。

図 8 (RQ3): 橋梁 vs トンネル 規模分布対比
図 8 (RQ3): 橋梁 vs トンネル 規模分布対比

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

表: L66 橋梁 vs L67 トンネル 二極構造比較

指標 L66 橋梁 L67 トンネル 二極構造の意味
件数 4,203 157 比 = 26.8 : 1
平均延長_m 19.3 314.5 比 = 16.3 : 1
最長_m 540 2212 橋梁=しまなみ系、トンネル=広島呉道路系等
国道シェア_% 27.4 52.9 トンネルは国道偏重、橋梁は県道偏重
中央値_m 7.0 206.0 橋梁=数 m 級、トンネル=百 m 級

この表から読み取れること: 件数比 26.8 : 1、平均延長比 16.3 : 1。国道シェアは橋梁 27.4% vs トンネル 52.9% で逆転現象がある。中央値も 橋梁 7m vs トンネル 206mと桁違い。「橋梁=点的多数 + トンネル=大規模少数」の二極構造が全指標で一貫。

表: 道路種別 × 延長カテゴリ クロス表 (トンネル)

道路種別 短(<100m) 中(100-300m) 中長(300-1000m) 長大(≥1000m)
国道 23 31 27 2
県道 19 27 21 7

この表から読み取れること: 国道は長大 (≥1000m) 2 件を多く含み、県道は短 (<100m) 19 件に偏る。これは道路階層差 (国道=広域幹線=長大、県道=地域路=短) を反映。トンネルでは橋梁と同じ階層差パターンが見られる。

表: 長大トンネル Top 15

順位 施設名 路線名 道路種別 延長(m) 幅員(m) 建設年度 市町名
1 善入寺トンネル 本郷大和線 県道 2212.0 8.50 2011 東広島市
2 便坂トンネル 庄原作木線 県道 1402.0 8.50 1996 三次市
3 熊野トンネル 矢野安浦線 県道 1238.5 - 1990 広島市
4 熊野黒瀬トンネル 矢野安浦線 県道 1167.0 10.75 2014 熊野町
5 棲真寺トンネル 本郷大和線 県道 1154.0 8.50 2011 三原市
6 油見トンネル 186号 国道 1125.0 10.00 1999 大竹市
7 栗屋トンネル 吉田邑南線 県道 1041.0 7.75 1987 安芸高田市
8 発坂トンネル 191号 国道 1017.0 10.75 2007 安芸太田町
9 秋月トンネル 鷲部小用線 県道 1005.0 8.50 1981 江田島市
10 門田トンネル 375号 国道 972.0 0.00 2010 三次市
11 蚊無トンネル 安芸津下三永線 県道 875.0 7.00 1993 東広島市
12 宇和木トンネル 音戸倉橋線 県道 820.0 8.90 1995 呉市
13 大浦トンネル 豊浜蒲刈線 県道 784.0 10.25 2007 呉市
14 熊見トンネル 375号 国道 732.0 10.00 1999 三次市
15 丑之河トンネル 新市七曲西城線 県道 715.0 0.00 2001 庄原市

この表から読み取れること: 最長は 善入寺トンネル (2212m, 本郷大和線, 東広島市)。Top 15 中の国道率 = 27% = 長大トンネルは国道偏重。これらは県の山岳幹線インフラの基幹であり、耐震・覆工補修の最優先対象。

仮説検証総合

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

仮説 観測値 判定 解釈
H1 国道シェア ≥ 50% (RQ1) 観測 = 52.9% (国道 83 / 県道 74) 強支持 H1 強支持: 国道シェアは 52.9%。橋梁 (L66) では国道 27.4% だが、トンネルは 52.9%大きく国道偏重。 これはトンネル工事が大規模で、広域幹線 (国道) での整備が中心となる事業構造を反映。県道 (n=74) は地域路線を貫通する小規模トンネル中心。
H2 中山間 9 市町シェア ≥ 70% (RQ2) 観測 = 47.8% (75 / 157) 反証 H2 反証: 中山間 9 市町に 47.8% (75 件) が集中。中山間市町は「山岳地形を貫通する道路網」を持ち、トンネル整備が必須。中山間 Top 3: 安芸太田町 (23) / 庄原市 (18) / 三次市 (10)。平野市町 (福山市・広島市・東広島市) はトンネル整備が限定的。
H3 1990 年代ピーク (RQ2) 観測 最多年代 = 1980s (42 件) 反証 H3 反証: 建設年代の最多は 1980s。最多は 1980s = バブル + ポストバブル期 1980-1990s の 2 年代で全体の 50% を占める集中整備期。1970年代以前 (老朽化対象) は 35 件 (22.3%) のみで、橋梁よりトンネルは新しい構造物が多い。
H4 橋梁/トンネル件数比 ≥ 25 (RQ3) 観測 = 26.8 : 1 (4,203 / 157) 強支持 H4 強支持: 橋梁 (4,203) / トンネル (157) = 26.8 : 1。これは「橋梁は中小河川クロスで多数 + トンネルは山岳貫通で希少」という地理分担を反映。県の道路インフラは橋梁圧倒で、トンネルは1 件あたり大規模な希少資源。
H5 トンネル平均延長 / 橋梁平均延長 ≥ 10 (RQ3) 観測 = トンネル 314m / 橋梁 19m / 比 16.3 強支持 H5 強支持: トンネル平均延長は橋梁の 16.3 倍。橋梁中央値 ~ 7m に対しトンネル中央値 206m「橋梁=点的多数 + トンネル=大規模少数」の二極構造が定量化された。これは整備コスト・更新コスト・防災重要度すべてで橋梁・トンネルの政策位置付けが異なることを意味する。

3 RQ × 3 結論

道路インフラ二極構造から見る県土像

本研究の最重要発見は「橋梁とトンネルの完全二極構造」。両者は同じ DoBoX シリーズ・同じ管理体系・同じ 9 事務所階層で扱われるが、対象地形が完全に異なる: 橋梁は4,203 件の点的多数で県全土の中小河川クロスを覆い、トンネルは157 件の集中型少数で中山間 9 市町の山岳道路網を支える。件数比 26.8:1, 規模比 16.3:1 の桁違いの偏向は、地形が道路インフラの形態を決定する地理学的根拠を提示する。

政策的含意 — 整備・維持・防災の地形別戦略

橋梁とトンネルは「同じ機能、異なる地形、異なる規模」のため、政策戦略も完全に分離する必要がある:

発展課題

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

発展課題 1 (RQ1 由来): NEXCO 高速トンネル + 鉄道トンネルとの統合

発展課題 2 (RQ2 由来): L11 土砂災害警戒区域とのトンネル交差分析

発展課題 3 (RQ3 由来): 橋梁 + トンネル 統合道路網の連続性分析

発展課題 4 (RQ2 + L40 連携): 標高 × トンネル位置の統合分析

発展課題 5 (RQ2 + L50 連携): 道路規制とのトンネル交差

発展課題 6 (RQ3 拡張): 判定区分 ("?") の解明

発展課題 7 (展望): トンネル防災重要度ランキングの構築