315 Views
October 24, 26
スライド概要
MIERUNE JCT in TOKYO 発表資料
https://mierune.connpass.com/event/405920/
イベント発表資料の公開
塩飽 洋平 / MIERUNE 218万件の交通事故データの 集計も可視化も AIに任せる GeoParquet × MCP で作る、話しかける交通事故統計 MIERUNE JCT in TOKYO 2026.10.22
自己紹介 塩飽 洋平(しわく ようへい) 株式会社MIERUNE エンジニアリングマネージャー 個人では、オープンデータを地図で見られる形に変換・可視化 するツールを開発 最近は、生成AI×地理空間データに取り組んでいる 2 @shi__works shiwaku/ npa-traffic-accident-an alytics
自宅近くの交差点で、年に1回ほど事故が起きる 駆けつけた警察官に、逆に聞かれた 「ここは事故が 多いんですか?」 3
きっかけ なぜ作ったか 1 2 3 有償データでやっていた事故分析が、オープンデータでできるか 以前は事故対策の検討で、イタルダ(交通事故総合分析センター)のデータを購入して分析していた 事故データを使いたい人は、多岐にわたる 全国の交通安全点検、専門家の道路安全診断、建設コンサルタント、学校・PTA、個人 変換の仕組みはできた。次は、すべての人に使ってもらうには npa-traffic-accident-converter:コード値をラベルに変換し、CSV・GeoParquet・PMTiles・地図ビューアで公開 4 生活道路の法定速度が、 30km/h になった 2026年9月1日から(中央線のない道路)。本当に生活道路の事故が減るのか、これから分析が必要になる 4
データの壁 交通事故のオープンデータは、集計までが遠い 7本 46列 354119.5 年ごとに分かれた CSV 2022年から列が増えた(58→68列) 「01」のような番号で入っている 番号の意味は年ごとに違う 緯度経度は度分秒の数字 地図に載せるには直す 「生活道路の事故は減っているのか?」 コンバーターで越えた:ダウンロード → 番号を言葉に直す → 緯度経度を直す → 7年分をつなぐ ここを AI に任せたい:集計する → グラフ・地図にする → どの数え方かを書き添える 出典:警察庁「交通事故統計情報のオープンデータ」(本資料の集計はこれを加工して作成) https://www.npa.go.jp/publications/statistics/koutsuu/opendata/index_opendata.html 5
今日話すこと 話しかけて、事故を集計・地図化する仕組み 1 デモ 話しかけると、推移のグラフと事故地点の地図が返ってくる 2 仕組み MCP サーバーの5つの機能、集計と地図の裏側、111.6 MB から必要な列だけ読む 3 数え方の違い 生活道路の数え方で件数が1.8倍変わる。警察庁の公表値とも合わない 4 答え合わせと使いどころ イタルダの公表値と1件単位で一致。学校・自治体・道路安全診断・住民の聞き方 5 今後の課題と、触ってみてください 答えの確かめ方と駅名の座標。claude.ai の無料プランで今日 23:59 まで使える 6
まず、 聞いてみる 7
デモ 1 推移を聞くと、グラフが返ってくる こう聞く 生活道路の事故件数の推移を、全事故 と比べてダッシュボードで見せて。 2019 年を100とした指数で。 67 75 生活道路の指数 2025年(2019年=100) 全事故の指数 8
デモ 2 場所を聞くと、地図が返ってくる こう聞く JR御茶ノ水駅から半径 1kmで、歩 行者・自転車が関わった 7年分の 事故を地図に出して 967件 歩行者・自転車の事故・半径1km・2019〜2025年 9
デモ 3 場所を聞くと、地図が返ってくる こう聞く(スマホのみ) 現在地から半径 1kmで、歩行者・ 自転車が関わった 7年分の事故を 地図に出して 885件 歩行者・自転車の事故・半径1km・2019〜2025年 10
どう 動いているか 11
仕組み DB サーバーも、専用の画面も作らない 質問 AI MCP サーバー GeoParquet 日本語で 話しかける claude.ai など MCP に対応した AI Cloudflare Containers DuckDB で集計する 生活道路の定義も持つ Cloudflare R2 に 1ファイル(111.6 MB) 数字と画面が返る 行き → AI が「推移をグラフに」「地図に出す」などの機能と、年・場所などの条件を選ぶ 帰り ← 集計結果を AI が文章で説明し、グラフや地図は会話の中に出る(MCP Apps) 定義 「生活道路」の数え方や年齢の区切りを、MCPサーバーが機能の説明に書いてAI に渡す AI の利用料は使う人の負担。こちらは月 $5 の固定費と、MCP サーバーが起動していた時間の従量(1時間 数円) MCP サーバー :AI に外部の機能を使わせるための共通の仕組み( Model Context Protocol) MCP Apps:MCP の拡張。機能が、結果と一緒に画面(表・グラフ・地図)も返せる 12
仕組み| MCP サーバー MCP サーバーは、 5つの機能と注意書きを AI に渡す 1 機能を5つ持つ 推移のグラフ seikatsu_dashboard 事故地点の地図 accident_map 条件を決めた集計 aggregate 選べる値の一覧 2 注意書きを渡す ・生活道路の数え方は2通りあり、件 数が1.8倍違う ・年齢は0〜24歳が最小の区分。10 代だけは数えられない ・当事者Aは過失が重い側。被害者 とは限らない list_values 自由な SQL run_sql AI は機能と条件を選ぶだけ。番号からラベルへの変換と集計はサーバーが行う 13 3 番号で受け取る ・条件は番号で受け取る(歩行者 =61、自転車=51)。ラベルへの 変換はサーバーが行う ・存在しない条件を指定するとエラー を返す ・結果に、どの数え方で数えたかを毎 回付ける
仕組み|デモ 1の裏側
集計:AI は条件を選ぶだけ。数えるのはサーバー
1
AI が機能と条件を選ぶ
知らない引数はエラーで返す
2
番号を言葉に直し、 SQL を組む
番号→ラベル。全事故と生活道路を 1本の
SQL で数える
3
count(*) AS 全事故件数,
count(*) FILTER (WHERE "車道幅員" IN ('単路-3.5m未満',
'単路-3.5m以上', '交差点-小(5.5m未満)-小')) AS 件数
DuckDB が数える
GeoParquet のうち、使う列だけ読む
4
seikatsu_dashboard({
seikatsu: "strict", year_from: 2019, year_to: 2025 })
… GROUP BY "資料年次"
→ 7行(2019〜2025年)
2025年: 全事故 287,023 件 / 生活道路 43,673 件
4つを返す
注意書きを読み、数え方を言い添える
years
sql
件数・指数・構成比
実行した SQL
デモ2の地図も同じ流れ。違うのは使う機能と、返す画面だけ
14
notes
画面
読むときの注意
ダッシュボード
仕組み|デモ 2の裏側
地図:緯度・経度と距離の式で、半径 1kmを切る
1
AI が機能と条件を選ぶ
「御茶ノ水駅」の座標は AI の推測
推測次第で 956〜970件
2
A・B のどちらも見る
過失の重い側でも相手側でも数え、 1件は1
回だけ
3
("当事者種別(当事者 A)" IN
('歩行者', '軽車両-自転車 ', '軽車両-駆動補助機付自転車 '))
OR (当事者B も同じ条件)
四角で絞り、円で切る
GIS の関数は使わない。経度 1度の長さを
緯度で補正して距離を出す
4
accident_map({ party_type: ["61","51","52"],
center_lat: 35.6995, center_lon: 139.7653,
radius_m: 1000 })
# 61 歩行者 / 51・52 自転車
緯度・経度の範囲(四角)で粗く絞る
→ (Δ経度 × 111,320 × cos35.70°)² + (Δ緯度 × 110,540)² ≤ 1000²
点は配列で軽く返す
10,000点を超えたら間引く。件数は間引く前
の数
[139.75785, 35.69591, 2019, 0, 0, …] ← 経度・緯度・年・死亡 …
+ 凡例(番号 → ラベル)
該当 967件 / 描画 967件
15
仕組み|画面の出し方
画面:機能が、地図アプリごと返す( MCP Apps)
1
機能に画面を結び付ける
MapLibre GL ごと1ファイルの HTML
2
iframe で開き、結果を渡す
描くのは claude.ai などのホスト
3
claude.ai → sandbox iframe に HTML を読み込む
→ postMessage でツールの結果を渡す( app.ontoolresult)
外へは、宣言した先だけ
背景は地理院のベクトルタイル(淡色)
4
@apps.tool(
resource_uri="ui://npa-traffic-accident/accident-map.html",
visibility=["model", "app"])
# AI からも画面からも呼べる
CSP connectDomains / resourceDomains
cyberjapandata.gsi.go.jp
gsi-cyberjapan.github.io
画面のボタンは AI を通さない
切り替えはサーバーを直接呼び直す
app.callServerTool({ name: "accident_map",
arguments: { ...前回の条件, fatal_only: true } })
16
仕組み 111.6 MB のうち、集計で読むのは約 5 MB 約5 MB 約1 秒 111.6 MB のうち、集計で読む列 クラウドのサーバーで、全7年を集計 (起動時にファイル全体を取り込む) 列指向の GeoParquet なので、集計では必要な列だけ 読める クラウドのサーバーは CPU が小さく、必要な列を数十〜数百回に分けて取りに行くと53秒かかった → 起動時にファイル全体を1回取り込む(約7.5秒)と、集計は約1秒 17
数え方の違い 「生活道路」の数え方ひとつで、 1.8倍変わる 全国・2019〜2025年 どちらも正当。 生活道路から幹線に出る出会い頭の事故 は後者にだけ入る。後者は地図化マニュ アル(国交省・警察庁)の抽出条件と同じ どちらも公表値とは合わない 警察庁 2024年の公表値 67,522件 このデータでは 4.5万件 / 8.3万件 18
作り方 前提も、 AIが数えて確かめながら書いた 数える ずれを見つける 定義に書く サーバーに入れる また数える ここまで全部 AI。こうして書き足された前提の例: 年齢は「年齢層」 当事者Aは「過失が重い側」 最小の区分は 0〜24歳。「10代」は数えられないと答えさせ る 被害者かどうかの区分ではない 「年」は 2通りある 都道府県は 51種類 統計に計上された年なら公表値と一致。事故が起きた年だ と最新年が約3%少なく出る 北海道は方面本部別に5つ。「東京」「大阪」に都・府が付か ない 19
答え合わせ イタルダの集計と、 1件単位で一致した イタルダ・インフォメーション No.150 「身近な道路」の事故 2024年 ほかの数字も( #はWEB版) イタルダ この仕組み No.150 身近な道路・自転車(2024) 13,150 13,150 #04 市町村道(2025) 128,591 128,591 #04 市町村道・市街地・単路(2025) 34,815 34,815 650 650 イタルダの公表値 30,870 #03 高齢歩行者の死者(2024) この仕組みで数えた値 30,870 オープンデータに項目がなく、できないこと 事故の型(出会い頭・追突など) / 重傷と軽傷 / 人的要因 出典:交通事故総合分析センター「イタルダ・インフォメーション」 No.150、WEB版 #03・#04 20
使いどころ 誰が、どう聞くか 学校・PTA(通学路の合同点検) 自治体の担当者 「この小学校の半径 500mで、 若い歩行者・自転車の事故を地図で」 「うちの県の生活道路の事故の推移を、 全国と比べて」 出せない:小学生だけ、通学中かどうか 出せない:重傷と軽傷の区別、交通量あたりの率 道路安全診断・建設コンサルタント 住民 「この交差点の半径 50mで、7年分の事故を 類型と当事者の組み合わせで」 「現在地から半径 300m以内の 事故を地図にプロットして」 出せない:出会い頭・追突などの事故の型、違反 出せない:ヒヤリハット、物損事故 現在地は Android の claude.ai アプリなら自動で取れる。駅名の座標は AI の推測 21
今後の課題と展望 確かめるのも、 AIに いまの課題 次にやること 答えが正しいかは、まだ人が確かめている 回答結果と公式データを自動で照合する → 準備中も、AI がダッシュボードを使わず SQL を自作した 回答ごとに自己点検する 駅名などの座標は、 AI の推測に頼っている → 地名から座標を引く仕組み 掛け合わせられるのは事故データだけ → 人口などのデータをサーバーに入れる 確かめたのは Claude だけ → ほかの MCP 対応の AI でも確かめる 22
触ってみてください 1 claude.ai の 設定 → コネクタ → カスタムコネクタを追加 2 QR の URL を貼って追加(ブラウザでは開かない) 3 チャットの + → コネクタ でオンにして、聞いてみる 最初に聞いてみる claude.ai の無料プランで使えます 今日 23:59 まで [自分の県]の生活道路の事故の推移を、全国と比べて ダッシュボードで見せて [最寄り駅]から半径 1kmの生活道路の事故を地図に出して 23
まとめ X @shi__works GitHub リポジトリ 集計も可視化も前提づくりも AIに任せる 人は、問いを立て、確かめる 24