Skip to content

Latest commit

 

History

History
321 lines (246 loc) · 11.4 KB

File metadata and controls

321 lines (246 loc) · 11.4 KB

山口市橋梁重要度スコアリングMVP - 実装と実行の教訓

プロジェクト: Bridge Importance Scoring MVP
対象: 山口市791橋の重要度定量評価
実行日: 2026年3月28日
実行時間: 36分28秒


📋 プロジェクト概要

NetworkXの媒介中心性(Betweenness Centrality)を活用し、山口市の橋梁791橋を対象に、都市交通ネットワークにおける重要度を定量的に評価するMVPを実装・実行した。

目的

  • 「失われれば甚大な影響が出るボトルネック橋梁」を特定
  • 異種グラフ(橋梁・道路・建物・河川)を統合した定量評価
  • 説明可能なスコアリング結果の生成

⚠️ 遭遇した問題と解決策

問題1: 処理範囲が広すぎてOSMデータ取得がタイムアウト

症状:

  • 初回実行時、OSM street network取得中に処理が停止
  • 処理対象: 4,293橋(山口県全体)
  • 処理範囲: 18,720.5 km²(山口県全体の約3倍)
  • バッファ: 5km(広すぎる)

原因:

  1. データセットに山口県全体の橋梁が含まれていた(山口市のみと誤認)
  2. 5kmバッファが全橋梁の凸包に適用され、範囲が極大化
  3. OSMnxのデフォルトタイムアウト設定なし

解決策:

# config.yaml に追加
data:
  filter:
    city: "山口市"
    city_column: "所在地"  # ← カラム名を正確に特定
  boundary:
    buffer_km: 1.0  # 5km → 1km に縮小
# graph_builder.py に追加
ox.settings.timeout = 300  # 5分タイムアウト設定
ox.settings.use_cache = True  # キャッシュ有効化

効果:

  • 処理対象: 4,293橋 → 791橋(81.6%削減)
  • 処理範囲: 18,720 km² → 1,948 km²(89.6%削減)
  • OSMデータ取得成功(36秒で完了)

問題2: 文字コードの文字化けによるフィルタリング失敗

症状:

WARNING: City column '蟶ら伴譚・ not found.

原因:

  • Excelファイルを読み込んだ際、ログ出力時の文字エンコーディングが不適切
  • 設定ファイルで指定した列名「市町村」が実際には存在しない

解決策:

# 実際のカラム名を確認
df = pd.read_excel('data/Bridge_xy_location/YamaguchiPrefBridgeListOpen251122_154891.xlsx')
print(df.columns.tolist())
# → '所在地'カラムに住所が格納されていることを確認
# config.yamlを修正
filter:
  city_column: "所在地"  # "市町村" → "所在地"

教訓:

  • データファイルの実際の構造を事前に確認する
  • カラム名の想定と実態を必ず検証する

問題3: OSMnx APIの変更によるエラー

症状:

ERROR: module 'osmnx' has no attribute 'geometries_from_polygon'

原因:

  • OSMnxのバージョン更新により、APIが変更された可能性
  • 建物・バス停データの取得で失敗

影響:

  • 建物・バス停データは取得できなかったが、プログラムはエラーハンドリングにより続行
  • 橋梁と道路ネットワークのみでグラフを構築
  • 媒介中心性の計算には影響なし(道路ネットワークが主体)

暫定対応:

  • エラーを無視して続行(try-exceptで処理済み)
  • 道路ネットワークのみでも十分な分析が可能

今後の対応:

  • OSMnxの最新ドキュメントを確認し、正しいAPIに更新
  • ox.features_from_polygon() など代替APIを調査

⏱️ 実行時間の内訳

ステップ 処理内容 実行時間 割合
STEP 1 データ読み込み 4秒 0.2%
STEP 2 グラフ構築 56秒 2.6%
 └ OSM取得 道路ネットワーク 36秒 1.7%
 └ スナッピング 橋梁→道路 18秒 0.8%
STEP 3 媒介中心性計算 35分22秒 97.0%
STEP 4 説明文生成 0.02秒 0.0%
STEP 5 結果保存 6秒 0.3%
合計 - 36分28秒 100%

重要な知見:

  • 媒介中心性の計算が処理時間の97%を占める
  • グラフサイズ: 18,998ノード、25,666エッジ
  • NetworkXのbetweenness_centrality()はO(n³)の計算量
  • 今後の高速化には、サンプリング手法や近似アルゴリズムの検討が必要

📊 実行結果サマリー

処理データ

  • 対象橋梁数: 791橋(山口市)
  • グラフ規模: 18,998ノード、25,666エッジ
  • スナップ成功率: 767/791橋(97.0%)
  • 処理範囲: 1,948.1 km²

重要度スコア統計

  • スコア範囲: 0.00 - 80.00
  • 平均スコア: 25.30
  • 中央値: 21.48
  • 標準偏差: 11.77

カテゴリ分布

カテゴリ 橋梁数 割合
高重要度(high) 6橋 0.8%
中重要度(medium) 41橋 5.2%
低重要度(low) 85橋 10.7%
極低重要度(very_low) 659橋 83.3%

トップ10最重要橋梁

順位 橋梁名 所在地 スコア 媒介中心性 特徴
1 流通ICオンランプB橋 山口市小郡上郷 80.00 0.3083 2005年架設、7.2m
2 矢形堤橋 山口市小郡上郷 79.99 0.3082 2007年架設、71.0m、河川近接
3 第一御堀橋 山口市大内御堀 71.69 0.2656 1963年架設、8.0m
4 千坊北B橋 山口市大内御堀 71.46 0.2644 2.4m、河川至近
5 郷之尾堤大橋 山口市朝田 70.66 0.2603 2008年架設、17.9m
6 下榎B橋 山口市周布町 70.44 0.2591 1965年架設、2.9m
7 葵橋 山口市葵 69.39 0.2538 1931年架設(築93年)
8 鳴滝橋 山口市下小鯖 69.37 0.2536 1987年架設、15.6m、河川至近
9 平川大橋 山口市宮島町 69.02 0.2519 1974年架設、110.3m(最長)
10 上平井B橋 山口市平井 69.02 0.2518 3.6m、河川至近

リスク要因

  • 河川近接橋梁(50m以内): 413橋(52.2%)- 洪水リスク高
  • 塩害リスク橋梁(海岸3km以内): 91橋(11.5%)
  • トップ10のうち6橋が河川近接、洪水時の影響大

💡 主要な知見

1. 地理的集中

  • 小郡地区が最重要エリア: トップ2橋梁が小郡上郷に集中
  • 流通ICへのアクセス路として機能、ボトルネック性が高い

2. 古い橋梁も高重要度

  • 葵橋(1931年架設、築93年)が7位にランクイン
  • 老朽化と重要度の両面から優先的な維持管理が必要

3. 河川リスクの重複

  • トップ10のうち6橋が河川近接(50m以内)
  • 洪水時に複数の重要橋梁が同時に通行不能になるリスク

4. 長大橋も重要

  • 平川大橋(110.3m)が9位、規模と重要度の相関

🎯 実装上の教訓

1. データ前処理の重要性

  • 必ず対象データの実態を確認する
    • カラム名、データ範囲、座標系、文字コード
  • フィルタリングロジックは柔軟に設定可能にする
  • ログで処理対象数・範囲を明示的に出力

2. 段階的なスケーラビリティ対応

  • 初期段階で処理範囲を絞り込む(市町村フィルタ、バッファ縮小)
  • タイムアウト設定、キャッシュ活用
  • 大規模データには近似アルゴリズムを検討

3. エラーハンドリングの設計

  • 外部API(OSM)のエラーに対する fallback 処理
  • 部分的な失敗でも処理を継続できる設計
  • エラー時も最小限の出力を生成

4. 実行時間の見積もり

  • 媒介中心性計算は**O(n³)**で極めて重い
  • 18,998ノードで35分 → より大規模(10万ノード超)では実用不可
  • サンプリング手法の導入が必須

🔧 今後の改善点

短期(MVPの完成度向上)

  1. OSMnx APIの修正

    • 建物・バス停データの取得を正常化
    • 最新APIドキュメントに準拠
  2. 可視化の追加

    • Foliumによる対話的地図の生成
    • スコア分布のヒートマップ
  3. 説明文の充実

    • 橋梁名を含めた日本語説明
    • 具体的な迂回路分析

中期(スケーラビリティ向上)

  1. 媒介中心性の高速化

    • サンプリング手法の導入(k-sample approximation)
    • 並列計算の実装(multiprocessing)
  2. グラフの効率化

    • 不要エッジの削除
    • クラスタリングによる階層化
  3. リアルタイム更新対応

    • 増分計算アルゴリズムの検討
    • OSMキャッシュの定期更新

長期(機能拡張)

  1. PyTorch Geometricへの拡張

    • GNN(Graph Neural Network)による予測モデル
    • 時系列データ(交通量・健全度)の統合
  2. シナリオ分析

    • 特定橋梁の通行止めシミュレーション
    • 災害時の迂回路分析
  3. 他都市への展開

    • 設定ファイルのみで他都市に対応
    • 自動化パイプラインの構築

📁 成果物

生成ファイル

ファイル サイズ 内容
bridge_importance_scores.csv 577 KB 全791橋の詳細データ
bridge_importance_scores.geojson 1,596 KB 地図可視化用
bridge_importance_report.md 3.7 KB 詳細レポート
top10_critical_bridges.csv 4 KB 最重要10橋
heterogeneous_graph.pkl 2,512 KB グラフデータ(再利用可)
metadata.yaml 44 KB 実行メタデータ

ソースコードの構成

bridge_importance_score/
├── main.py                    # メインパイプライン
├── config.yaml                # 設定ファイル(重要!)
├── data_loader.py             # データ読み込み(フィルタリング含む)
├── graph_builder.py           # グラフ構築(OSMnx利用)
├── centrality_scorer.py       # 媒介中心性計算・スコアリング
├── narrative_generator.py     # 説明文生成
├── visualization.py           # 可視化(未実装)
├── utils.py                   # ユーティリティ
├── requirements.txt           # 依存パッケージ
└── setup_and_run.py           # セットアップスクリプト

🏁 結論

山口市791橋を対象とした橋梁重要度スコアリングMVPの実装・実行に成功した。

成功要因:

  1. 処理範囲の適切な絞り込み(市町村フィルタ、バッファ縮小)
  2. タイムアウト設定とエラーハンドリングの実装
  3. データ構造の事前検証とログによる可視性確保

主要な課題:

  • 媒介中心性計算の計算量が大きく、スケーラビリティに限界
  • より大規模データへの対応には近似アルゴリズムが必須

実用性:

  • 791橋規模では実用的な実行時間(36分)
  • 生成されたスコアリング結果は解釈可能で、優先順位付けに活用可能
  • トップ10橋梁は定量的根拠を持つ重要インフラとして特定

本MVPは、都市インフラの定量的評価手法として有効性を実証した。今後、可視化の充実と計算効率化により、実運用レベルのツールへと発展させる基盤が整った。


文責: Bridge Importance Scoring MVP 実行チーム
最終更新: 2026年3月28日