0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

優先度 A の 78% が雨水管だった — 劣化リスク評価を読者レビューで作り直す(系統別ランク+幹線度の導入、Python/geopandas)

0
Posted at

はじめに

上下水道業界で管路台帳システム(GIS)の運用に携わっている実務者です。

前回は台帳データの検収を見ましたが、今回は分析モデルの側に戻ります。

このシリーズの第 1 回で、下水道管きょの劣化リスク評価(点検優先度のスクリーニング)を作りました。ありがたいことに、公開後に実務者の方からレビューをいただき、その中に耳の痛い宿題が 2 つありました。

  1. 汚水と雨水を混ぜたままランク付けしている — 別物なのだから、パイプラインを分けるべき
  2. 影響度が管径頼み — 壊れたときの影響は管径だけでは測れない。ネットワーク上の位置(幹線か枝線か)を見るべき

今回はこの宿題を消化して、モデルを v2 に改修します。先に結論を言うと、優先度 A ランクの 7 割が入れ替わりました。改修前の A は 78% が雨水管 — 第 1 回のリスク評価の章で自分でも認めていた偏りです — で、モデルの設計がランク表の中身をそれだけ歪めていた、という話です。

お断り: 本記事は手法デモです。優先度ランクは相対評価(スコア上位 2% 相当を A と定義)による点検順序の試算で、半田市の実際の管路状態の評価・更新計画を示すものではありません。モデル中の係数・重みはいずれも筆者の仮定値です。

v1 の設計と、その欠陥

第 1 回のモデル(v1)はシンプルな「劣化確率 × 影響度」でした。

  • P(劣化確率): 経過年数 ÷ 有効耐用年数(標準耐用年数 50 年 × 管種係数)をロジスティック曲線に通す
  • C(影響度): 管径(1000mm で頭打ち)+ 土被り 1m 未満なら加点
  • risk = P × C を全 21,223 本で並べ、上位 2% 相当を A

一見もっともらしいのですが、A ランク 410 本の中身を排水系統で割ると、こうなっていました。

rankA_shift.png

雨水 320 本(本数で 78%。第 1 回の更新版で「延長で 82%」と書いた、あの数字です)・汚水 90 本。 理由は単純で、半田市の管径の中央値は汚水 200mm に対して雨水 700mm、φ500 以上の管は汚水 149 本に対して雨水 2,231 本あります(第 7 回で見た「大口径はコンクリート幹線」の世界は、大部分が雨水の世界でもありました)。管径で影響度を測る v1 の C は、実質的に雨水検出器として働いていたわけです。

これが問題なのは、汚水と雨水では「壊れたときの困り方」がまったく違うからです。汚水管の破損は生活排水が流せなくなり衛生問題に直結する。雨水管は晴天時には水が流れていないことも多い。管理の考え方も予算も別です。誤解のないように言うと、雨水管が軽いという話ではありません。豪雨時の雨水幹線は市街地の浸水を左右しますし、大口径渠の破損は道路陥没に直結します。問題は軽重ではなく、困り方の軸が違う 2 つを同じ相対評価の土俵に載せたことです。同じ土俵に載せれば、径の大きい側が影響度項を独占します。レビューの指摘どおりでした。

改修①: 系統別にランク付けする

直し方は簡単で、ランク付け(上位 2% 相当 = A)を汚水・雨水それぞれの中で行うだけです。スコアの計算式は v1 のまま。それだけで A の顔ぶれは 汚水 393 本・雨水 17 本に反転し、A の管径中央値は 900mm から 250mm に、A の延長は 20.2km から 11.8km になりました(雨水の大口径渠は 1 本が長いので、本数が同じでも延長は大きく減ります)。

「どちらが正しい顔ぶれか」はモデルだけでは決められませんが、少なくとも汚水の劣化リスクを議論する席に、汚水の管が並ぶようになりました。

改修②: 影響度に「幹線度」を入れる

2 つ目の宿題です。同じ 250mm の汚水管でも、家 3 軒の排水を受ける末端の枝線と、上流に何 km もの管網を背負って処理場へ向かう管とでは、壊れたときの影響がまるで違います。管径は「設計時に想定した流量」の代理値ですが、もっと直接的な量が台帳から計算できます — その管の上流にぶら下がっている管路の累積延長です。本記事ではこれを幹線度と呼ぶことにします(一般的な用語ではありません)。

ネットワークは成立するのか — 3 つの検証

幹線度の計算には「管網が正しくつながっていて、流れの向きが分かる」ことが必要です。台帳データで本当に成立するのか、3 段階で検証しました。

検証 1: 端点はつながっているか。 管渠 21,223 本の端点座標を 1mm の許容差で突き合わせると、99.3% がマンホールの点と一致しました。元の GIS 上で既にスナップ(結節)されて管理されている、ということです。ネットワークとして扱えます(なお一致の検証は 1mm、後段のグラフ構築では節点の丸めにより緩い 1cm を使っています)。

検証 2: 線の向きは流下方向か。 shapefile の線には描画上の向き(始点→終点)があります。これが流下方向と一致しているなら話が早い — そこで管底高の近似値(マンホールの地盤高 − 管の土被り − 管径)を両端で比べました。下水は重力で流れるので、向きが正しければ終点側が低くなるはずです。結果、検証可能な 18,134 本のうち 98.5% で終点側が低い。上下の土被りを逆に割り当てた対立仮説では 69.0% まで落ちます(地表そのものが下流へ向かって下がる分、取り違えても 5 割よりは高く出ます)。マンホールの底(地盤高 − 人孔深)を使った、土被りに依らない別経路の検証でも 97.3% が同じ向きでした。描画方向 = 流下方向と判断します。管渠を上流から下流へ向けて登録する運用は台帳システムでは一般的なので、業務感覚とも整合します。

検証 3: 例外の処理。 近似管底高が「上り」になる管が 245 本ありました。近似値の誤差や、実在する逆勾配(施工不良や地盤沈下 — それ自体が要注意管です)と区別はできないため、ここでは一律に「向きの誤り」とみなして反転する割り切りです。それでも、向きの矛盾や実在のループ(閉路)が絡んで上流延長を計算できない管が 481 本(2.3%)残ります。上流がすべて確定した管から順に計算する方式のため、輪になった区間はどこからも計算を始められず、その下流の管も巻き添えになるからです。これらは幹線度不明としてフラグを付け、幹線度の項を 0 に置きました — 幹線度で昇格させない、過小評価側に倒しています。

計算は一瞬

向きが決まれば、最上流から順に延長を合算していきます(グラフ理論でいうトポロジカル順の処理)。グラフは汚水・雨水で別々に構築しています — 物理的に別の管網なので混ぜる理由がなく、万一同じ位置を通る箇所があっても系統間で誤接続しないためです。

ここで実装上の落とし穴を 1 つ。下水道網は木構造ではなく、分岐した流れが再合流する箇所があります(分岐する節点が 846 個)。「上流の合計値を下流へ足し込む」だけの素朴な方法だと、再合流点で共有上流が経路の数だけ二重計上されます。実際、素朴版で出した最大幹線度は 218km — 正しい値の約 4 倍に膨らんでいました。そこで各節点に「上流にある管の集合」を持たせて受け渡し、重複を取り除いてから延長を合算します(集合はビット集合 — 整数の各ビットを管 1 本に対応させた表現で、和集合が OR 演算 1 回で済みます)。

from collections import defaultdict, deque

# out_edges[節点] = [(下流の節点, 管の添字)] / indeg[節点] = 流入本数
up_set = defaultdict(int)              # 節点 -> 上流にある管の集合(ビット集合)
q = deque(n for n in nodes if indeg[n] == 0)   # 最上流から
while q:
    n = q.popleft()
    mask = up_set.pop(n, 0)
    w_n = weight(mask)                 # 集合に含まれる管の延長合計(重複なし)
    for b, i in out_edges[n]:
        trunk[i] = w_n + length[i]     # この管の幹線度
        up_set[b] |= mask | (1 << pos[i])   # 集合ごと下流へ受け渡す
        indeg[b] -= 1
        if indeg[b] == 0:
            q.append(b)

(抜粋・簡略。weight() は集合内の管の延長合計で、実装では numpy でまとめて計算しています。)純 Python + numpy で、21,223 本の全網が数秒で終わります。

結果の健全性も確認できます。汚水の幹線度の最大値は 56.5km — 汚水の総延長 515.4km の約 1 割が、最下流の 1 本にぶら下がっている計算です。幹線度 10km 超の管(103 本)の管径中央値は 350mm で、全体の 200mm より太い。幹線度の高い管ほど太いという当たり前が、独立に入力されたはずの管径と整合しました。

trunk_map.png

地図にすると、枝線の毛細血管から幹線が集まって太くなっていく構造がそのまま見えます。この赤い管は、壊れると上流何 km 分の排水が行き場を失う管です。

v2 の影響度

影響度 C に幹線度の項を足しました: C = 管径項 + 浅埋加点 + 0.3 × 幹線度項(幹線度項は系統内の最大値で正規化した対数スケール、上限 1.0 は据え置き)。重み 0.3 は「管径と同格までは持ち上げない」という筆者の仮定値です。対数にしているのは、幹線度が数 m から 56.5km まで 5 桁にわたるためで、線形の正規化ではほとんどの管が 0 に張り付いてしまいます。また上限 1.0 を据え置いたので、管径項だけで 1.0 に達する大口径管では幹線度は効きません(そこは既に最大の影響度、という扱いです)。ランク付けは改修①のとおり系統別に行います。

ビフォーアフター — A ランクの 7 割が入れ替わった

rank_migration.png

v1 と v2 のランクをクロス集計すると、v1 の A 410 本のうち、v2 でも A に残ったのは 111 本。299 本が B へ降り、代わりに 275 本が B から昇りました(v2 の A は計 386 本 — 汚水 365・雨水 21)。入れ替わったのは主に「雨水の大口径(降格)」と「汚水の幹線・古い陶管(昇格)」です。陶管の A は 7 本から 96 本に増え、A の平均経過年数は 35.9 年から 38.0 年に上がりました。古くて・幹線で・劣化の早い管種、という直感に近い顔ぶれです。

第 2 回で作った「ダブルリスク」(優先度 A × 軟弱地盤系の微地形)も引き直しました。v1 の 134 本から v2 では 55 本になり、両方に共通するのは 16 本だけです。つまり「地盤も悪い最優先区間」として調査計画のたたき台に載せる管のリストが、モデルの改修でほぼ入れ替わりました。

これが今回いちばん伝えたいことです。優先度ランクはデータから一意に決まる「事実」ではなく、モデルの設計を映す「意見」です。 同じ台帳・同じ属性から、設計次第でこれだけ違う紙が出てきます。v2 が正解という話でもありません — 重み 0.3 を変えれば顔ぶれはまた動きます(感度は未計測です)。だからこそ、順位付けのロジックは発注仕様や協議の場で明文化して合意しておく価値があります。

なお、A の本数が版によって 410 本・386 本と揺れるのは、同点のスコアが多く「上位 2%」の線上で丸ごと動くためです(2% ちょうどなら約 424 本)。系統別にすると特に雨水で同点が多く、雨水の A は 2% 相当(約 60 本)を大きく割った 17〜21 本になっています。

今回できなかったこと

正直に書いておきます。

  • 系統別の管種係数: 第 1 回で「管種係数を系統別に分けるのが筋」と書きました。今回は見送っています。雨水管きょの劣化機構(硫化水素腐食が支配的でない環境)に合わせた係数を立てるには文献・実績の裏取りが必要で、根拠なく数字を置くわけにはいかないためです。したがって v2 でも、雨水側の劣化確率 P には汚水前提の管種係数を使い続けているという限界が残ります。
  • 勾配: 劣化条件として使いたかったのですが、実測の管底高(インバート高)が公開データに無く、近似値(地盤高 − 土被り − 管径)は「どちらが低いか」の 2 値判定には耐えても、勾配の値として使うには粗すぎます。見送りました。
  • 緊急輸送道路との重ね合わせ: 影響度に「その管が壊れると緊急輸送道路が陥没しうるか」を入れる案です。データ自体は国土数値情報「緊急輸送道路(N10)」として存在するのですが、利用条件が「非商用」区分のため、公開リポジトリと記事という本シリーズの形では使えません(愛知県の公表資料も PDF 図のみでした)。国土数値情報には商用可のデータと非商用限定のデータが混在しているので、公開物で使う際は利用条件欄の確認をおすすめします。考え方だけ述べると、道路管理者名や道路種別(台帳側の属性)で代用する道もありますが、今回は見送りました。

実務でどう使えるか

  • 幹線度は追加調査ゼロで手に入る: 台帳のジオメトリだけで計算でき、影響度の議論を「管径だけ」から一歩進められます。ただし前提はデータの品質です。今回成立したのは端点一致 99.3% という半田市データの結節品質があってこそで、検収(第 8 回)で土台を確かめた話とつながっています。
  • 汚水と雨水は分けて評価する: 実務では当たり前のことですが、ツールを一気に作ると混ぜてしまいがちです。相対評価(上位◯%)を使うなら、母集団の設計がランクの中身を決めます。
  • モデル改修の前後比較を残す: ランク移動のクロス集計 1 枚で「何がどれだけ変わるか」を示せます。モデルの採否を協議する材料としても、変更履歴の説明責任としても有効です。
  • 順位付けロジックの明文化: 発注側なら、優先度の算定方法(母集団・重み・係数の根拠)を仕様書・報告書に書かせる。受注側なら、仮定値を仮定値と明示する。本記事の係数はすべて仮定値です — そしてランク表は、その仮定の写像です。

まとめ

  • 読者レビューの宿題 2 つ(系統分割・影響度の見直し)を消化し、劣化リスク評価を v2 に改修しました。コードは リポジトリの work3-deterioration/score_priority_v2.py にあります(v1 も残してあり、両方再現できます)。
  • v1 の優先度 A は 78% が雨水管でした。管径ベースの影響度は事実上の雨水検出器で、系統別ランクに直すだけで A の顔ぶれが反転します。
  • 影響度に**幹線度(上流の累積延長)**を導入しました。端点一致 99.3%・流下方向の検証 98.5%(対立仮説 69.0%)を確かめ、再合流による二重計上を集合で取り除いたうえで、全網が数秒で計算できます。最大 56.5km・幹線ほど太い(10km 超の管径中央値 350mm)という整合も確認しました。
  • 結果、A ランクの 7 割が入れ替わり、ダブルリスクのリストは 134 本 → 55 本(共通 16 本) になりました。優先度ランクはモデル設計の写像であり、だからこそロジックの明文化と前後比較に価値があります。

関連記事: 上下水道×データの記事は一覧からどうぞ。コードは GitHub で公開しています。

免責・出典

  • 本記事は手法デモであり、半田市の実際の管路状態の評価・点検計画を示すものではありません。標準耐用年数 50 年 × 管種係数・影響度の重み・幹線度の正規化はいずれも筆者の仮定値です。幹線度は描画方向と近似管底高から向きを推定した近似値で、上流延長を計算できない管(2.3%)は幹線度 0 として扱っています。
  • データ出典: 半田市「水道管路等データ」(CC BY 4.0)を加工して作成 https://www.city.handa.lg.jp/opendata/1005557/1005561/1010384.html
  • 微地形区分(ダブルリスクの軟弱地盤判定): 防災科研 J-SHIS「地形・地盤分類 250m メッシュマップ(2020 年更新版)」(出典明示で利用可)。判定クラスの選定は第 2 回参照
  • 国土数値情報「緊急輸送道路(N10)」の利用条件(非商用): https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N10-v2_0.html
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?