まちのデータを、切る。たどる。問う。
自治体のオープンデータを、BI ツールでは作れない形のダッシュボードにして並べています。数字はすべて SQL の集計から出し、実行時に生成 AI は使いません。
路線の上の駅の地図の形の見本です。数字もデータも入っていません。
ダッシュボード
松戸市のオープンデータから組み立てた 7 本です。どの図にも、出典、実行した SQL、注意書きを添えています。
交通の続き物 4 本
順に読めるように並べた続き物です。どのページからも、同じ続き物のほかの回へ行き来できます。
第 1 回
駅の力
市内の駅の乗降客数を 14 年、路線の上で動かします。コロナの前後でどの駅がどれだけ落ちて、どこまで戻ったか。駅の周りに留まる人の数とも並べます。
第 2 回
交通事故の地図
市内の人身事故が、どこで、何曜日の何時に、どの年に多く記録されたかを並べます。切り口を 24 歳以下、65 歳以上、自転車が当事者の事故に変えると、地図と表と推移が一緒に組み変わります。件数は交通量や人の多さで割っていません。
第 3 回
駅とバス停から遠いまち
100 m 格子ごとに最寄りの駅とバス停までの直線距離を測り、どちらからも遠い格子に住む人を推計しました。閾値を動かすと、圏外の格子と人数をその場で数え直します。人口は 65 歳以上にも切り替えられます。距離は道のりではなく、歩いてかかる時間とバスの本数は示しません。
第 4 回
バスの一日
市のコミュニティバスの平日の時刻表から、一日の便の動きを地図の上で再生します。停留所ごとに何時台に何回停まるかを並べ、民営の路線バスなどの停留所の位置とも重ねます。動きは時刻表の予定から作ったもので、バスが走った記録ではありません。
ひとつで読むダッシュボード
年齢で切るまち
2020 年 10 月 1 日の国勢調査の人口で、町ごとの年齢のかたちを 1 つの立体に積みました。高さは年齢で、時間ではありません。回して見比べ、年齢の高さで切ると、その年齢の人が住む町の地図になります。
- 型
- 探索
- レンズ
- 公平性
- 使う図
- 年齢で切る立体の地図、棒グラフ
ハチの一年
松戸市で処理されたスズメ蜂などの駆除を、処理された日でたどる。季節とともに町が色づき、夏に山が立ち上がる。
- 型
- 物語
- レンズ
- 変化
- 使う図
- 「ない」を描き分ける町の塗り分け地図、カレンダーヒートマップ
満ち引きのまち
松戸市に住む人は、毎日どこへ出ていき、どこから入ってくるのか。深夜と昼で町の人が満ち引きし、人が江戸川を渡って都内へ流れる。
- 型
- 物語
- レンズ
- 変化
- 使う図
- 1 km メッシュの地図、出ていく流れの地図、「ない」を描き分ける町の塗り分け地図、入ってくる流れの地図、折れ線グラフ
問いかける
ダッシュボードにない問いは、日本語で問いかけられます。打っている途中から、グラフと地図が組み上がります。
地形のジオラマ準備中
台地と低地の段差を、市の形にくり抜いた立体で回して見るダッシュボードを作っています。
生成しない。コンパイルする。
ダッシュボードの場面も、問いの画面の問いも、同じ道を通って画面になります。何を数えるか、どう見せるかの欄をカタログの語で埋め、あとは決まった規則が SQL と画面を組み立てます。
「要望がいちばん多い町はどこ?」を、数えるものは要望件数、切り口は町、時間の区切りは時間で区切らない、演算は上位、画面の置き方は順位のリスト、主役の部品は表として読み取ります。
欄を埋める
何を数えるか(QuerySpec)と、どう見せるか(ViewSpec)の欄を、カタログの語から選びます。ダッシュボードの場面では人が書き、問いの画面では分類 API の Jev が選びます。Jev は文章を書きません。候補から選ぶ、採点する、はい/いいえに答える、の三つだけを行います。
QuerySpec(何を数えるか)
{ "data_kind": "citizen_requests", "measure": "request_count", "dimension": "town", "time_grain": "none", "period": "all_time", "scope": "whole_city", "ops": [ "top_n" ] }ViewSpec(どう見せるか)
{ "layout": "ranked_list", "hero": "table", "emphasis": "max", "sort": "value_desc" }SQL に組み立てる
コンパイラが、選ばれた語から決まった規則で SQL を組み立てます。下の SQL は、「要望がいちばん多い町はどこ?」から実際に組み立てたものです。
この問いから組み立てた SQL
WITH "base" AS (SELECT ("citizen_requests"."town_code")::VARCHAR AS "dim_key", ("citizen_requests"."town_name")::VARCHAR AS "dim_label" FROM "citizen_requests" WHERE ("citizen_requests"."town_code" IS NOT NULL)), "agg" AS (SELECT "dim_key", "dim_label", (count(*))::INTEGER AS "value" FROM "base" GROUP BY "dim_key", "dim_label"), "ranked" AS (SELECT "dim_key", "dim_label", "value", (row_number() OVER (ORDER BY "value" DESC NULLS LAST, "dim_key" ASC NULLS LAST))::INTEGER AS "rank" FROM "agg") SELECT "dim_key", "dim_label", "value", "rank" FROM "ranked" WHERE ("rank" <= 10) ORDER BY "rank" ASC NULLS LAST, "dim_key" ASC NULLS LASTブラウザで集計する
ブラウザの中の DuckDB が集計します。集計をサーバに投げません。
画面を描く
ViewSpec から組み立てた画面の仕様で、地図とグラフを描きます。ダッシュボードの本文の数字も、集計の結果から差し込みます。
TownViz が守ること
作り話の数字を出さない
選べる語は、指標 54、切り口 32、演算 9 に限られます。図の数字も、ダッシュボードの本文の数字も、SQL の集計の結果から出します。
出どころを隠さない
どの図にも、出典、実行した SQL、注意書きを添えます。開けば、同じ結果を自分で確かめられます。
「ない」を 0 と描かない
記録がない、公表されていない、秘匿されている。数えて 0 だったこととは分けて、図の上で描き分けます。
迷ったら、迷ったと言う
問いの読み取りの確からしさは数値で返ります。低いときは、候補を並べるか、答えずに問いの立て方を示します。読み違えやすい結果には、82 種の注意書きから合うものを添えます。
自治体を選ぶ
-
- 問いかけられるデータ
- 市民要望、滞在人口
- データセット
- 土木関係、清掃、スズメ蜂等駆除、その他動物処理、各種市民要望、他課通報処理、国内居住者、訪日外国人
- まだ入っていないデータ
- 公共施設、防災、道路工事、子育てと教育、医療と福祉、統計書、人口統計、予算と決算
- 開示しているもの