国土交通省交通量APIとDuckDB-WASMで渋滞可視化ツール作ったのでテスト公開する
まえがき
今年(2025年)5月から国土交通省交通量APIというものが使用できるようになった。
全国約2,600カ所の交通量(車)を計測したデータをAPIで提供する、
ただしもろもろの要因により、正確ではないデータも含まれることがある...とのこと。(詳しくは以下)
しかし個人で渋滞のデータを可視化できそうで面白そうだとは思っており色々やっていたんですが一旦「渋滞可視化ツール」のようなものができたのでテスト公開してみようと思いました。📝
URL他
Github
アプリ公開用URL
使用技術
TypeScript(HTMLなども)
DuckDB-WASM:ブラウザ内でクエリ→ホットスポット(どの区画が渋滞が多いか)検索
Tensorflow.js:交通量と地理的近傍に基づいたクラスター分析に使用
Node.js:バックエンド Vercel Functionsでサーバレス駆動
JARTIC Open Data API:交通量データソース
Leaflet:地図表示(国土地理院タイル使用)
Vercel:デプロイ
Vercelについて
今回初めてVercelを使用してみました。手軽にだけど最低限のバックエンドがほしい(今回みたいにAPIを叩くだけとか)場合にとても便利だと思いました。サーバレスな実行が簡単に実装できデプロイもvercel --prod とかでできるのでテスト用には十分だと思いました。本番環境時にCloudfront + S3 + Lambdaに切り替えるとかにしてVercelでどんどん試して行っても良いのかもしれません。今度はCloudflareもどこかで試したい。
どんなことができるか
①地域と日付を指定してその時間の観測地点の交通量を取得する。
検索時刻で日付を指定できます。選択しない場合は現在から20分前の値を取得します。
地域に関してはデフォルトで東京が選択されますがパネルで各地域に飛ぶことができます。
あとはこれも初期読み込み時にデータを読み込みますが、データがないとテストデータが真ん中に表示されるだけになります。

日付を指定した後に交通量データを取得ボタンを押すと図のように各場所の交通量がでてきます。

各ポイントをクリックするとツールチップが出てきて交通量や大型車か小型車かなどが出てきます。

②混雑ポイントTop5を選択できる
空間分析を実行を押すと混雑ポイントTop5が選択できるようになります。

この各パネルをクリックするとそのポイントにジャンプしツールチップが表示されるようになります。
③クラスター分析
簡単なクラスター分析で近傍のポイントをグループ分けできます。(空間的クラスター分析実行)

図のように番号が振られ色分けされます。本当は交通量と近傍のポイントを組み合わせたクラスター分析を実装したいと思っていたのですがこの時はできずポイントの近さでグループ分けしています。
⑤で実装できたと思います。
④ホットスポット
混雑している地点が固まっているエリア(ホットスポット)を探し、四角で囲みます。(あと#でのナンバリング)
Duckdb-wasmのSpatial拡張を使ってみたかったんですが読み込むだけ読み込んでまだ実装していません。。普通のSQLで対応してます。

⑤Tensorflow.jsでの機械学習(試用段階)
③のクラスター分析では地理的な近さでしかクラスターを作れませんでした。
そこで位置情報と交通量の特徴量を作って位置情報と交通量両方を考慮したクラスター分析をして色分けをするようにしました。

とは言ってもボタンを押すごとに結構結果が変わってしまう(機械学習なので)...のでこの機能についてはアルゴリズムなどの理解からやり直して改善できればと思います。
まとめ
以前kaggleなどで地理的クラスターの分析などを行なった時に結構面白かったのをきっかけに自分でアプリケーションを作ってみました。ただ結構駆け足で作ってしまったので、理屈とかの部分をあまり考慮せずに簡易機能ばかりにしてしまったように思います。(理解も浅い)
この辺りについてはフロントエンドでのデータ可視化の技術の本を書き始めようかなと思っているので自分のためにもそこでまとめていきたいと思います。
技術以外の部分でいうと
欲しい機能(欲しいと思われる)を明確にできないと手段が目的になりがちだなと思いました。(当然ではあるんですが改めて)どちらかというと技術や方法を使いたい!という気持ちが先行しすぎて、問題解決したいとか使用者の立場になって考えるという部分が不足しているなという感じです。
データ可視化とかダッシュボード作成には「何を見せたいか」という問いを常にしていかないと使う人にわかりやすいものにはならないのでこのあたりもまだまだ改善点があるように感じました。
いろいろ勉強になりました。🙏
Discussion