鉄道網に対する決定図の適用と考察.駅データ.jpのデータ加工部分

この記事は以下の記事の ZDD を用いたパスカウントについての記事のデータ整理部分の手順を解説した記事である．
https://qiita.com/sunagimo3/items/4f761f293c535fcb85a0　

##### 目的
1．駅データ.jpから得られた鉄道網のデータを加工しプログラムで動かせるようにし, 2．またstパスの個数に関係ない駅を削除していくことでデータを縮約する．という2つの目標を目指す．

##### 1．駅データ.jpから得られたデータの加工
駅データ.jpで活用していくデータは以下2つのデータである．

**表1：駅データjpから得られるデータ1つ目**
![スクリーンショット 2024-10-05 221805.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776885/0d99c562-aa6e-3e6c-5572-eb54eb4c67c4.png)

**表2：駅データjpから得られるデータ2つ目**
![スクリーンショット 2024-09-30 031643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776885/fec9e0a6-1712-9dbd-c50a-d0b9470ca49f.png)

上のデータは駅データ, 下のデータは接続駅データであり，上の画像はそれぞれデータの上部を切り取った画像である．
このデータの内上のデータで用いる項目はstation_cd,station_g_cdであり，下のデータで用いる項目はstation_cd1,station_cd2である．
station_cdはある路線に存在するある駅の番号であり，station_g_cdある駅の番号である．
例えば，湘南新宿ラインの新宿駅をA，山手線の新宿駅をBとする．
この時，cdにおいてAとBを表す番号は異なるが，g_cdにおいてAとBを表す番号は等しい．この2つのデータから実際にプログラムを動かせるように以下の3ステップで必要なデータを抽出し，加工していく．
<font color="#ff0000">1．各データから必要な項目を抽出する</font>
実際に上のデータにおいて必要なデータを抽出するのは～のプログラム,下のデータにおいて必要なデータを抽出するのは～のプログラムで行った． その結果, output4,output1のようにデータを変化させれる．
**左，表3：1つ目のデータの加工後　　　　右，表4：2つ目のデータの加工後**
<table>
  <tr>
    <td>
      <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776885/cd89a148-773b-0918-0c78-0e6c57f914af.png
" alt="グラフ1" width="300">
    </td>
    <td>
      <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776885/04a6c65c-40eb-cf29-078d-a29bc2713f27.png" alt="グラフ2" width="300">
    </td>
  </tr>
</table>

<font color="#ff0000">2．路線データをcdからg_cdに変換する</font>
今, 下の駅と駅の接続状態を表現しているデータはstation_cdで表されており, 同じ駅でも路線が異なると異なる駅として値を取ってしまう． よって上のstation_cdとstation_g_cdの対応を示したデータを用いることで，station_cdで表された駅間の接続状態をstation_g_cdで表そうとしたプログラムが～である． その結果, output6のようなデータが得られた．
**表5:g_cdで表された接続データ**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776885/04a6c65c-40eb-cf29-078d-a29bc2713f27.png" alt="グラフ2" width="300">

<font color="#ff0000">3．路線データの7桁の番号を0から順に振りなお</font>
さらに, station_g_cdの値はデータをみればわかるように7桁の数字であり, この値をそのままプログラムの入力データで動かすのは問題がある．(例えば, 配列を使いずらくなる) よって, プログラム～により再度0から順番に値を振りなおす． そのデータが以下のoutput7である．
**表6：表5の接続データを0から番号を振りなおしたデータ**
![スクリーンショット 2024-09-30 091330.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776885/1283a664-2b53-4063-6492-7550ad041e2c.png)

これで日本全国の駅間の接続状況を表現したデータを扱いやすいデータとして得ることができた． (1の操作の達成)
##### 2．またstパスの個数に関係ない駅を削除していくことでデータを縮約する
次に2．stパスの個数に関係ない駅を削除していくことでデータを縮約する操作を行いたい．
今回output7に対して以下の4つの操作により縮約を試みた．
<font color="#ff0000">1．連結成分の調査</font>
このグラフの連結状態を調査したところ沖縄エリアに存在する連結成分とそれ以外全ての駅間でなす非常に大きい連結成分が得られた． つまり, 沖縄以外のエリアのグラフにおけるstパスの個数を考えるとき沖縄エリアの鉄道網はstパスに関与しないが沖縄エリアの鉄道データを持つとそれだけ計算量が大きくなるので今回は沖縄エリア以外のグラフを考えることにする．
<font color="#ff0000">2．両端が同じエッジの重複の削除</font>
新宿駅と代々木駅をつなぐ鉄道はJR山手線, JR中央総武線, 都営大江戸線が存在するがこれを今回は1つのエッジとしてみなすことにする．(つまり, 今回のstパスは使用した路線が異なっていても通ったノードが同じであるならばそれは同じ経路と判定する．)
<font color="#ff0000">3．次数2のノードの削除</font>
次数2のノードは本質的にstパスの個数に変化をもたらさない． これはstパスが次数2のノードを経由する際, 分岐が起き得ないからである． 次数2の削除されたノードの情報はその両端のノードが持つのでグラフの情報に変化はもたらさない．
(次数2ノード削除例)
<table>
  <tr>
    <td>
      <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776885/f92750cc-9c34-7362-0a65-3f5f3f0cd470.png
" alt="グラフ1" width="300"><p>図1：次数2のノード削除がされてない状態のグラフ</p>
    </td>
    <td>
      ノード4とノード7をつなぐエッジにはノード5,6の情報が内在している<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776885/850e5166-6b11-f07c-5e14-f32dce08bb59.png" alt="グラフ2" width="300"><p>図2：図1のグラフの次数2のノード削除がなされた状態のグラフ</p>
    </td>
  </tr>
</table>

<font color="#ff0000">4． 次数1のノードの削除</font>
次数1のノードは削除対象である． というのも次数1のノードを削除してもそのノードの情報は接続ノードが保持し, かつstパスの個数に変化を及ぼさないからである． 
(ノード1の削除例)
<table>
  <tr>
    <td>
      <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776885/a5bf6251-9b5a-d115-822e-38f4d3d595a2.png
" alt="グラフ1" width="300"><p>図3：次数1のノードが削除されていないあるグラフ</p>
    </td>
    <td>
      ノード4にノード1,2,3の情報が内在しており，ノード7にノード8,9の情報が内在している<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776885/01337278-3e04-8cc9-34f0-d9c7384a5f25.png" alt="グラフ2" width="300"><p>図4：図3のグラフの次数1のノード削除がなされた状態のグラフ</p>
    </td>
  </tr>
</table>
以上述べてきた1~4の手法がstパス数え上げ問題における有効なグラフの縮約方法である．そして，上の図を見てもらえばわかるように上の図は二重線も次数1ノードも存在している．よって，1~4の手法を順に図の変化がなくなるまで(収束するまで)行うことで最も縮約された図が得られる．上の図をさらに縮約すると，最終的にいかのような遷移が行われる．
<table>
  <tr>
    <td>
      <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776885/01337278-3e04-8cc9-34f0-d9c7384a5f25.png
" alt="グラフ1" width="300"><p>図5：次数が2のノードがまだ存在している状態のグラフ</p>
    </td>
    <td>
    　ノード4に1,2,3,5,6,7,8,9の情報が内在している
      <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776885/fb950b5e-2e61-a4ee-6bdc-430c325c5d82.png" alt="グラフ2" width="300"><p>図6：図5のグラフの次数2のノードを削除した後のグラフ</p>
    </td>
  </tr>
</table>

この後，実際にこのグラフ縮約方法を全国の路線図に適用すると以下のようなグラフが得られた．

![スクリーンショット 2024-10-06 111734.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776885/24326486-efbd-02e9-687e-6289e2acb307.png)
<p>図7：縮約しきった後の全国の路線を表現したグラフ.赤が東京駅，青が京都駅，緑が名古屋駅を示している</p>
グラフの縮約操作により，もともと存在した10177個のエッジを持つグラフを1139個のエッジに減少させることができており大幅な縮約ができていることが確認できる．また，縮約をする前のグラフと比較して縮約を完了した次数分布は以下のようになった．

<table>
  <tr>
    <td>
      <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776885/efee1139-10d8-23e2-2a3c-4f81cb016f11.png" alt="グラフ2" width="300"><p>図8：縮約する前のグラフの各次数のノードの数の分布(横軸：次数，縦軸：各次数のノード数)</p>
    </td>
    <td>
      <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776885/3f60049c-1a20-dc36-82e8-fe82e5dabd7f.png" alt="グラフ1" width="300"><p>図9：縮約する後のグラフの各次数のノードの数の分布(横軸：次数，縦軸：各次数のノード数)</p>
    </td>
  </tr>
</table>
これでグラフ集約操作である操作1,2が終了した．