TownViz まちの可視化屋さん

まちのデータを、切る。たどる。問う。

自治体のオープンデータを、BI ツールでは作れない形のダッシュボードにして並べています。数字はすべて SQL の集計から出し、実行時に生成 AI は使いません。

路線の上の駅の地図の形の見本です。数字もデータも入っていません。

ダッシュボード

松戸市のオープンデータから組み立てた 7 本です。どの図にも、出典、実行した SQL、注意書きを添えています。

交通の続き物 4 本

順に読めるように並べた続き物です。どのページからも、同じ続き物のほかの回へ行き来できます。

  1. 第 1 回

    駅の力

    物語 変化

    市内の駅の乗降客数を 14 年、路線の上で動かします。コロナの前後でどの駅がどれだけ落ちて、どこまで戻ったか。駅の周りに留まる人の数とも並べます。

  2. 第 2 回

    交通事故の地図

    物語 公平性

    市内の人身事故が、どこで、何曜日の何時に、どの年に多く記録されたかを並べます。切り口を 24 歳以下、65 歳以上、自転車が当事者の事故に変えると、地図と表と推移が一緒に組み変わります。件数は交通量や人の多さで割っていません。

  3. 第 3 回

    駅とバス停から遠いまち

    探索 公平性

    100 m 格子ごとに最寄りの駅とバス停までの直線距離を測り、どちらからも遠い格子に住む人を推計しました。閾値を動かすと、圏外の格子と人数をその場で数え直します。人口は 65 歳以上にも切り替えられます。距離は道のりではなく、歩いてかかる時間とバスの本数は示しません。

  4. 第 4 回

    バスの一日

    物語 備え

    市のコミュニティバスの平日の時刻表から、一日の便の動きを地図の上で再生します。停留所ごとに何時台に何回停まるかを並べ、民営の路線バスなどの停留所の位置とも重ねます。動きは時刻表の予定から作ったもので、バスが走った記録ではありません。

ひとつで読むダッシュボード

  • 年齢で切るまち

    2020 年 10 月 1 日の国勢調査の人口で、町ごとの年齢のかたちを 1 つの立体に積みました。高さは年齢で、時間ではありません。回して見比べ、年齢の高さで切ると、その年齢の人が住む町の地図になります。

    型
    探索
    レンズ
    公平性
    使う図
    年齢で切る立体の地図、棒グラフ
  • ハチの一年

    松戸市で処理されたスズメ蜂などの駆除を、処理された日でたどる。季節とともに町が色づき、夏に山が立ち上がる。

    型
    物語
    レンズ
    変化
    使う図
    「ない」を描き分ける町の塗り分け地図、カレンダーヒートマップ
  • 満ち引きのまち

    松戸市に住む人は、毎日どこへ出ていき、どこから入ってくるのか。深夜と昼で町の人が満ち引きし、人が江戸川を渡って都内へ流れる。

    型
    物語
    レンズ
    変化
    使う図
    1 km メッシュの地図、出ていく流れの地図、「ない」を描き分ける町の塗り分け地図、入ってくる流れの地図、折れ線グラフ
  • 問いかける

    ダッシュボードにない問いは、日本語で問いかけられます。打っている途中から、グラフと地図が組み上がります。

  • 地形のジオラマ準備中

    台地と低地の段差を、市の形にくり抜いた立体で回して見るダッシュボードを作っています。

生成しない。コンパイルする。

ダッシュボードの場面も、問いの画面の問いも、同じ道を通って画面になります。何を数えるか、どう見せるかの欄をカタログの語で埋め、あとは決まった規則が SQL と画面を組み立てます。

「要望がいちばん多い町はどこ?」を、数えるものは要望件数、切り口は町、時間の区切りは時間で区切らない、演算は上位、画面の置き方は順位のリスト、主役の部品は表として読み取ります。

ひな形の質問から、ビルドのときに組み立てた見本です。グラフの形は見本で、数字は入っていません。
  1. 欄を埋める

    何を数えるか(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"
    }
  2. 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
  3. ブラウザで集計する

    ブラウザの中の DuckDB が集計します。集計をサーバに投げません。

  4. 画面を描く

    ViewSpec から組み立てた画面の仕様で、地図とグラフを描きます。ダッシュボードの本文の数字も、集計の結果から差し込みます。

TownViz が守ること

  • 作り話の数字を出さない

    選べる語は、指標 54、切り口 32、演算 9 に限られます。図の数字も、ダッシュボードの本文の数字も、SQL の集計の結果から出します。

  • 出どころを隠さない

    どの図にも、出典、実行した SQL、注意書きを添えます。開けば、同じ結果を自分で確かめられます。

  • 「ない」を 0 と描かない

    記録がない、公表されていない、秘匿されている。数えて 0 だったこととは分けて、図の上で描き分けます。

  • 迷ったら、迷ったと言う

    問いの読み取りの確からしさは数値で返ります。低いときは、候補を並べるか、答えずに問いの立て方を示します。読み違えやすい結果には、82 種の注意書きから合うものを添えます。

自治体を選ぶ

  • 松戸市

    ダッシュボード 7 本 ダッシュボードだけが読むデータ 16 種 問いの入力例 44 問

    松戸市のダッシュボードを見る
    問いかけられるデータ
    市民要望、滞在人口
    データセット
    土木関係、清掃、スズメ蜂等駆除、その他動物処理、各種市民要望、他課通報処理、国内居住者、訪日外国人
    まだ入っていないデータ
    公共施設、防災、道路工事、子育てと教育、医療と福祉、統計書、人口統計、予算と決算

糾弾ではなく、問いを立てる道具です。数字は SQL の集計だけから出し、実行時に生成 AI は使いません。

この道具について