大雑把にこの駅からN分以内に到着する駅一覧を取得するスクリプトを書いた

電車社会の地域だと、最寄駅から気楽に行ける駅の候補が多く、ぱっとは中々わからない。そこで、（１）出発駅（２）目標所要時間を入力すると、（１）到着駅（２）所要時間を出力するスクリプトを作った。

（個人の利用の感想）
普段使わない乗り換えから意外な駅が近かった発見があった。ふだんは「行き先→最寄駅→乗り換え確認」をしているが、「近場の駅→その駅周辺の観光地」といった調べ方がやりやすくなり、思わぬ発見があった。

Colaboratoryで実行可能にした。データのダウンロードは手動（後述）

Colab前半（データ前処理部分）
https://colab.research.google.com/drive/1PgnLZSIovriNaRYZNVjNdObU0deYDkMy?usp=sharing

Colab後半（関数実行部分）
https://colab.research.google.com/drive/12HnVlkL-1hlJqIraQ-L1IgCtSLDdhjds?usp=sharing

今回のこれは、大雑把に駅一覧をとるだけで、以下の要素は考慮できていない

- 快速や特急などの駅通過や、新幹線などの早い電車
- 駅での停車時間
- 駅毎の乗り換え時間の違い（特に路線をまたいだ直通電車）
- そもそも時刻表を全く意識できてない
- 料金も全く考慮していない

なので、正確な数字が知りたければ駅の乗り換えサービスをちゃんと利用した方が良い。

# 事前準備

[駅データ.jp](https://ekidata.jp/) 様より利用規約を確認し、会員登録（無料でも今回は問題なし）をし、以下のデータをダウンロード
 - 路線データ
 - 駅データ
 - 接続駅データ

csv 形式のデータが入手できる

今回作った[Colaboratory](https://colab.research.google.com/drive/1PgnLZSIovriNaRYZNVjNdObU0deYDkMy?usp=sharing) の前半を自分のドライブにコピーし、ダウンロードした３つのcsvファイル をアップロード。ドラッグアンドドロップでもアップロードできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108572/dc9460ff-d035-2684-28c3-bafd93697282.png)
ここにドラッグアンドドロップ

# データ前処理

前半部分では、その路線内でのすべての駅間の所要時間の推定を行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108572/b416c4f0-dc1f-9026-b1bd-d0de10cb5423.png)

line_cd が路線をユニークに特定するもので、station_g_cd_from が駅をユニークに特定するもの。traveltime が今回推定した所要時間。
2022/03/28 注記あり
station_g_cd_fromは駅をユニークに特定するものではなかったです。例えば、朝霞台（東武東上線）と北朝霞（武蔵野線）で同じコード値（1130508）が入っていました。徒歩圏内で乗り換え可能な駅に対して、完全に考慮漏れしてましたが、この仕様のおかげで結果オーライでした。後半のColabを若干変更しました。

元のデータでは接続駅データで「どの路線でどの駅とどの駅が隣接しているか」の情報がある。山手線のデータを見てみるとちゃんと巡回していたため、路線ではなく運転系統になっているっぽい。今回の用途には適しているため、ありがたい。

駅データに駅の緯度経度情報がのっているため、隣接駅に限り以下の方法で所要時間を推定。

参考：[国土地理協会](https://www.kokudo.or.jp/database/004.html)

1. 駅間の緯度経度情報から駅間の直線距離を計算（実距離）
1. 実距離を1.05倍（換算距離）
1. 換算距離を分速800mでかかる時間を計算（所要時間）

隣接駅間であれば直線で近似できそうという仮定の計算になっている。
ある路線が駅１、駅２、駅３の並びになっている場合、駅１駅２と駅２駅３の間の所要時間を上記の式で推定し、駅１駅３の所要時間は駅１駅２所要時間と駅２駅３所要時間の和で求める。

いい感じにデータを結合し、いい感じに上記の計算を繰り返せばお目当の「その路線内でのすべての駅間の所要時間の推定」の結果が手に入る。Colabを実行すると'line_station_traveltime.csv'というファイルにその計算結果が保存されるので、これをダウンロード。後半に進む

# 駅を指定したらN分以内駅一覧を取得する計算部分

[Colab後半（関数実行部分）](https://colab.research.google.com/drive/12HnVlkL-1hlJqIraQ-L1IgCtSLDdhjds?usp=sharing) を解説する。

駅データ.jpでダウンロードしたcsvと前半部分で計算した'line_station_traveltime.csv'をアップロード。

乗り換えに必要な時間を今回は一律10分だと近似。東京駅の乗り換え案内で使われてる時間を参考にした。（https://www.jr-odekake.net/eki/premises?id=0460101）

Colabのデータ読み込みや関数定義部分を実行し、ここから下が本体。
https://colab.research.google.com/drive/12HnVlkL-1hlJqIraQ-L1IgCtSLDdhjds#scrollTo=DRmG5G-IHOqj&line=1&uniqifier=1
駅のデータから駅名検索し、駅コード（駅コードは２つあり路線毎にユニークなものとそうでないものがある。今回は路線毎にユニークでないstation_g_cdを利用）を確認し、関数 'get_stations_within_n' に許容所要時間N分とともに指定する。するとN分以内に到達するであろう駅一覧が得られる。

ここの計算部分は、いい感じに再起処理したりすでに探索済みの路線を見ないようにしたりと自然言語による解説が困難なため割愛。どこかで無駄な処理がある気がするが見つけられてない。（少なくても都度DataFrame作って配列にして最後にconcatするあたりはだいぶ勿体無い書き方になっているが正直手抜きしてしまった。）

東京駅から60分以内、とすると計算に8分30秒かかり、候補駅を760個返してきた。ここの計算結果を乗り換えサービスと見比べてみた感じでは、結構それっぽい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108572/5e278dcd-3890-4a4e-0154-beedbbb54969.png)
東京から60分以内駅一覧の結果。同じ路線は辿らないようにしたが、違う路線を乗り継いで東京まで戻ってこれるため、東京駅も候補に出てきてしまっている。ちょっと面白かったのでそのままにしている。乗り換え時間を多めに見積もっている（10分）のもあり、実際はもっと早く行けることの方が多い。一方で、すぐ電車がこない地方部では実際はもっと時間がかかることのほうが多い。

このあと、十分大きなNですべての駅でこの計算を実施し、その結果をDBにいれるなどすればより便利な感じになりそう。

個人利用の範囲では、このColabで十分そう。
みなさまも電車で遊びに行き先選びのご参考までに。