第2回東京公共交通オープンデータチャレンジで優秀賞をいただきました。

3月31日まで行われていた「第二回東京公共交通オープンデータチャレンジ」にて、優秀賞をいただきましたので、表彰式の発表にて話しきれなかった応募した経緯などを記します。

#作成したWebアプリ
今回作成した「WorkerStep」は、主な機能として、リアルタイム情報を元にした

 - 経路検索
 - 遅延・混雑推定
 - 時刻表

を提供します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224979/f5657742-ebd8-17cf-40eb-2fdad61c0cf2.png)

WebAPP： [https://workerstep.work](https://workerstep.work)
使い方： [https://howto.workerstep.work](https://howto.workerstep.work)

紹介動画：[https://youtu.be/c23aNJTSwfU](https://youtu.be/c23aNJTSwfU)



#応募までの経緯
高校時代、担任だった先生にお声がけいただき、高校生向けのいくつかのコンテストにグループで応募してきました。具体的には、日本統計学会スポーツ分科会の「スポーツデータの解析コンペ」において野球盤のようにシミュレーションしたり、武蔵野大学の行う「数理工学コンテスト」において大型商業施設における客の流動性変化のシミュレーションなどです。
大学生になり、お互いに違う学校となりましたが、また皆でなにかやりたいということで、5月に今回の「第二回東京公共交通オープンデータチャレンジ」に応募しようと決めました。

#スケジュール
5月～8月　データを眺め、加工を試す。
8月　 　　大まかな作品の方針を決定。
8月～9月　経路検索プログラムの基礎部分を作成。
10月～　　UI部分の作成開始（応募期限日まで継続）
10月　　　遅延推定を作成
12月　　　リアルタイム性を持たせる。
1月 　　　混雑推定を作成
1月　　 　応募用動画などの作成

※提出期限5分前まで頑張ったのですが、バグは直しきれませんでした。。。

#使用したデータ
####動的データ（ODPT）
 - 列車位置情報
 - 列車運行情報

####静的データ（ODPT）
 - 列車時刻表
 - 駅情報

####大都市交通センサスデータ
 - 目的別利用時間帯
 - 目的別利用券種
 - 利用券別乗降者数

#アルゴリズム
##遅延推定
ODPTから提供されるリアルタイム列車位置情報には、5分以上の遅延のみ遅延扱いとなっていました。なので、列車時刻表に記載されている時刻とリアルタイム列車位置情報の最後に発車した駅の発車時刻を比較することにより1分以上の遅延を算出し、また、過去のデータから遅延回復を推定することで行っています。

##遅延考慮経路検索
遅延考慮検索は、下図のような駅と時刻のセットをノード、列車や徒歩移動・時間の経過により移動可能なノード間をエッジとするグラフを構築し、経路検索を行いました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/224979/8eccc504-3d07-8439-4183-8c8990c77435.png)

上記の列車遅延推定を読み込み、5分毎にグラフを再構築しています。

ある瞬間の例だと、ノード数34万8949くらいのグラフとなります。エッジに設定しているコストは、所要時間及び乗り換え回数（ノード到達ごとに算出）です。運賃に関しても導入したかったのですが、会社によってデータ提供がないため断念しました。

##混雑推定
混雑推定は、
1. 交通センサスデータより、各利用者がいつ、どこからどこまで乗車するというODデータを膨大に作成する。
2. すべてを経路検索にかける。
3. 集計する
という流れで行っております。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224979/8d8c2f8a-75f0-1b11-7be1-fd87771373b0.png)
※実際には高速化の工夫を多数行っており、毎回上記の演算をしているわけではありません。

その結果、下図のように大まかな列車混雑を推定することができます。

![2pc.JPG](https://qiita-image-store.s3.amazonaws.com/0/224979/d68d4b9d-2d64-b2f7-cff3-50d55fd5cb54.jpeg)

上の図は、丸の内線のとある3本の列車の混雑推定をした結果です。1本後の列車が新宿駅止まりなため、2本後の列車は、他の列車と比較して徐々に混雑していく様子がわかります。

ただ、問題点として、列車の運行情報にはリアルタイムのものを使用していても、乗客に関する情報がないため、イベントや時間ごとの乗客数変化、乗客ごとの経路選択状況などをあまり考慮することができず、精度がいいとは言えません。あくまでもおおまかな参考程度の推定です。

####加味できること
 - 列車の遅延による混雑の集中

####加味できていないこと
 - イベント開催による混雑
 - 列車順序が変わるような大幅なダイヤ乱れ
 - 時間帯ごとの乗客数の変動

#インフラ
基本的に、各社のVPSサービスを使用しました。学生であまりお金がかけられないため、学生無償枠を利用させていただいたり、ヨーロッパの安いVPSサービスを利用してみたりしたため、開発時にはさほどかかりませんでした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224979/a510fe1e-274c-4633-94a8-7139fb4ef36d.png)

各プログラムはWebAPIとして実装されており、Json形式またはCSV形式にて連携しています。上記以外にも、開発時にはリアルタイム列車位置情報取得プログラムを動かしていました。

応募から現時点までは、ConoHa VPS を使用しています。詳細は[ODPTの発表用スライド](https://tokyochallenge.odpt.org/2018/award/index.html)に掲載しています。

#大変だったこと
 - 技術力不足
 - サーバー不足
 - データの不足
 - 時間の不足
 - 開発メンバーの大学が皆違ったこと
 - 動画編集など、幅広い知識が必要となること

フレームワークなど、UI開発の知識が全くと言っていいほどなかったので、フロントエンド作成がとっても大変でした。まだまだ知識が足りないので頑張ります。

#使ってみていただけると励みになります
作品へのリンクを掲載させていただきます。技術不足により少し重いですが、賞金の一部をサーバー経費にあてることである程度サービスを延命させることができそうなので、普段使いに使用していただけると励みになります！！

WebAPP： [https://workerstep.work](workerstep.work)
使い方： [https://howto.workerstep.work](workerstep.work)

また、コメントや技術的アドバイスなどをいただけると幸いです。

需要がありそうでしたら、もう少し詳細に加筆しようと思います。