U.S. Park Amenities — 「使った金額」と「届く豊かさ」は別の話

今週のお題
今週のデータは、アメリカ33州・98都市の公営公園に設置されたアメニティ(設備)の一覧でした。
データの粒度は「都市 × アメニティ種別」で、全2,221行。総設備数は 139,269件、これに紐づく総投資額は 約5,021億ドル という規模です。各行には設備の種別・グループのほか、都市の人口規模区分(Population Grouping)、気候ゾーン(Climate Zone)、人口、投資額が付いています。
設備は7つのグループに分かれており、内訳は以下の通りです。
| Amenity Group | 件数 | 構成比 |
|---|---|---|
| Sport_Activities | 47,242 | 33.9% |
| Fields_Courts | 34,232 | 24.6% |
| Play_Fitness_Areas | 26,077 | 18.7% |
| Trails_Walking_Loops | 14,553 | 10.4% |
| Usage_Infrastructure | 11,027 | 7.9% |
| Acquatics_Cooling | 3,409 | 2.4% |
| Gathering_Areas | 2,730 | 2.0% |
スポーツ関連(Sport_Activities + Fields_Courts)だけで約6割。一方、水辺・涼をとる設備(Acquatics_Cooling)や人が集まる場(Gathering_Areas)は合わせても4.4%しかありません。
このデータを眺めていて最初に引っかかったのが、「設備数の多い州」と「住民にとって身近な州」は同じなのか? という点でした。今回のダッシュボードは、この問いを軸に組み立てています。
作成したダッシュボード
U.S. Park Amenities Dashboard(Tableau Public)
コロプレスマップ(州別)、ドーナツチャート(設備グループ構成)、散布図2枚(投資額 × 設備数/投資額 × 設備密度)の4パーツ構成です。
工夫した点・こだわり
1. 「散布図をクリックすると地図の指標が切り替わる」導線
このダッシュボードで一番やりたかったのがこれです。
下段に並べた2枚の散布図は、それぞれ違う問いに対応しています。
- 左:Total Investment vs. Amenity Count → 「どれだけ作ったか」
- 右:Investment vs. Amenity Density → 「住民1万人あたりでどれだけ届いているか」
読者が左の散布図をクリックすると地図が「設備の総数」で塗り替わり、右をクリックすると「1万人あたりの設備数」で塗り替わります。パラメータのドロップダウンを別置きするのではなく、問いが書かれているチャートそのものをスイッチにしたわけです。
地図のタイトルもパラメータ参照にしてあるので、切り替えに追従して「Park Amenities by State」「Park Amenities per 10,000 Residents by State」と変わります。今どちらのモードを見ているかが、ユーザーの視線が既に向いている場所で明示されます。
2. 総数と密度で顔ぶれが入れ替わる
左の散布図では、テキサス(22,910件)・カリフォルニア(20,185件)・ニューヨーク(14,332件)が右上に大きく飛び出します。投資額もカリフォルニアが約1,013億ドルで最大です。人口が多いのだから当然、とも言えます。
ところが右の密度の散布図に切り替えると、上位に来るのはアイダホ・ミネソタ・バージニア・ウィスコンシン・ネブラスカといった、左の図では原点付近に固まっていた州です。逆にニューヨーク・カリフォルニアは下位グループに沈みます。
投資額を横軸に固定したまま縦軸だけを入れ替える構成にしたのは、この「同じ投資額でも住民に届く量が違う」という対比を、目線を動かさずに見比べられるようにするためです。
3. 平均線で四象限に切ると「右上」が空になる
密度の散布図には、投資額(横)と密度(縦)それぞれの平均線を引いて四象限に区切っています。この2本を入れて初めて、今回のデータの一番おもしろい構造が見えました。
| 象限 | 意味 | 州数 | 顔ぶれ(一部) |
|---|---|---|---|
| 右上 | 投資↑ × 密度↑ | 0 | — |
| 左上 | 投資↓ × 密度↑(効率型) | 12 | アイダホ・ミネソタ・バージニア・オハイオ・ウィスコンシン・ネブラスカ |
| 右下 | 投資↑ × 密度↓(規模先行) | 7 | テキサス・カリフォルニア・ニューヨーク・フロリダ・イリノイ |
| 左下 | 投資↓ × 密度↓ | 14 | — |
平均以上の投資をしている7州は、1つの例外もなく密度が平均以下でした。「たくさん投資している州ほど住民1人あたりでは手薄」という関係が、四象限のどこにマークが落ちるかだけで一目で伝わります。
平均線を入れる前は「なんとなく右肩下がり」でしかありませんでしたが、線を2本足しただけで「右上が空」という言い切れる事実に変わりました。基準線は説明の解像度を一段上げてくれる、と改めて感じた場面です。
4. 州選択は「未選択なら全件」にする
地図や散布図で州をクリックするとセットに登録され、他のシートが連動して絞り込まれます。ただし何も選んでいない状態で全シートが空になっては困るので、後述の「選択ゼロなら全件表示」の計算を挟んでいます。加えて Reset ボタンを1枚のシートとして置き、セットアクションで選択を解除できるようにしました。
使ったTableauの技術・Tips
パラメータ + パラメータアクション(2つの散布図から同じパラメータを書き換える)
パラメータ p.select meather(整数・リスト型)を用意し、2つの値を持たせています。
| 値 | 表示名 |
|---|---|
| 1 | Park Amenities |
| 0 | Park Amenities per 10,000 Residents |
そのうえで、それぞれの散布図シートに定数の計算フィールドを置き、パラメータアクションのソースフィールドに指定しています。
// 計算フィールド名(キャプション): 1 ← scatter (2) 用
1
// 計算フィールド名(キャプション): 0 ← Scatter 用
0
「クリックされたマークの値をパラメータに渡す」というパラメータアクションの仕様を利用し、常に固定値を返す計算フィールドをソースにすることで「そのシートをクリックしたら必ずこの値になる」スイッチを作る、という使い方です。シートごとに定数を変えて同じパラメータに向けておけば、複数のシートが1つのパラメータの別々のボタンとして機能します。
地図の色をパラメータで差し替える
地図の色は、パラメータで分岐する計算フィールドで制御しています。
// c.color_of_cirle
CASE [p.select meather]
WHEN 1 THEN SUM([Count])
WHEN 0 THEN [Count per Capita(10K)]
END
参照している密度側の計算はこちらです。
// Count per Capita(10K)
(SUM([Count]) / SUM({FIXED [City],[State] : MIN([Population])})) * 10000
// Investment per Capita(10K)
(SUM([Total Investment]) / SUM({FIXED [City],[State] : MIN([Population])})) * 10000
CASE の分岐先の集計レベルを揃えておかないとエラーになるので、SUM([Count]) と集計済みの計算フィールドを並べる形にしています。
分母を FIXED で固定している理由は「学び・振り返り」で詳しく書きます。ここが今回の山場でした。
タイトルへのパラメータ埋め込み
シートタイトルは、テキスト編集画面の「挿入」からパラメータを差し込みます。
<パラメーター p.select meather> by State
見た目の情報量はほとんど増えないのに、状態表示としては効きます。パラメータアクションのように「気づかないうちに状態が変わる」インタラクションを入れるときは、今の状態を画面のどこかに必ず文字で出しておく方が親切だと考えています。
セット + セットアクション、そして「選択ゼロなら全件」
州の選択は State1 セット で受け、ダッシュボードのセットアクション(値の割り当て)でクリック対象をセットに入れます。そのうえで、絞り込みには次の計算フィールドを使っています。
// f.selected state
IF {SUM(IIF([State1 セット],1,0))} = 0
THEN TRUE
ELSE [State1 セット]
END
{ } は集計の粒度を無視して全体で評価する記法(表スコープの FIXED LOD)です。「セットに入っているレコードが1件もない = 何も選ばれていない」ときだけ TRUE を返して全件を通し、1件でも選択があればセットの内外判定をそのまま使います。
セットアクションを使うと必ずぶつかる「初期表示で何も出ない」問題への定番の対処で、セットアクションを入れるときはほぼ毎回セットで書くことになる計算です。
Reset ボタン
"Reset" という文字列を返すだけの計算フィールドを1枚のシートに置き、ダッシュボードのセットアクションで「セットからマークを削除」に設定すると、押すだけで選択解除されるボタンになります。フィルターアクションと違い、セット自体を空にできるのが利点です。
ドーナツチャートは MIN(1) の二重軸 + 3層
中央のドーナツは、行に MIN(1) を2つ並べた二重軸で、マークタイプを円グラフにしています。今回はサイズ違いの3層構成にしました。
| 層 | サイズ | 色 |
|---|---|---|
| 外側の細いリング | 1.75 | Amenity Group で配色 |
| 内側の太いリング | 1.20 | 同上 |
| 中心 | 0.85 | 白(#ffffff) |
一番内側を背景と同じ白で塗ることで「穴」を作ります。中央に総数(139,269)を置けるので、構成比と全体量を1つのパーツで同時に伝えられます。
『Visual Analysis Best Practices』でも円グラフは「カテゴリが少なく、部分と全体の関係を示すとき」に限定すべきとされています。今回は7カテゴリとやや多めですが、上位2つで約6割という偏りを一目で見せる目的に絞り、正確な比較は散布図と地図に任せる分担にしました。
ツールヒントにドーナツを埋め込む(Viz in Tooltip)
散布図のマークにカーソルを合わせると、ツールヒントの中にその州の設備構成ドーナツが表示されます。ツールヒントの編集画面で「シートの挿入」から仕込む機能です。
State: <State>
Population: <SUM(Population)>
Total Investment: <SUM(Total Investment)>
Count per Capita(10K): <Count per Capita(10K)>
<Sheet name="donuts Chart (2)" maxwidth="200" maxheight="150" filter="<All Fields>">
filter="<All Fields>" を指定しておくと、ホバーしたマークの条件(ここでは州)が埋め込みシートに自動で渡ります。ダッシュボードに「州別 × 設備グループ」のクロス表を別途置かなくても、知りたくなった瞬間にその場で内訳が出せます。画面の面積を使わずに階層を1つ増やせるのが利点です。
平均線で四象限に区切る
密度の散布図に引いた縦横2本は、アナリティクスペインから「平均」のリファレンスラインをドラッグするだけで作れます。今回は投資額(横軸)と密度(縦軸)それぞれに、対象を「表全体(per table)」・計算を「平均」で設定しました。
このとき平均はマーク単位、つまり州ごとの値の単純平均になります。レコード単位の平均ではないので、「州を1点として見たときの真ん中」で区切られます。四象限で語りたいときはこの集計単位の意味を押さえておかないと、線の位置が直感とずれます。
基準線は、散布図を「相関の眺め」から「4つのグループ分け」に変える最小の一手です。凡例や注釈を足すより先に、まず平均線1本で語れることがないかを試すようにしています。
学び・振り返り
割り算の分母は「行が増える形」に注意する
今回の一番の学びは、密度指標の分母でつまずいたことでした。
最初に書いた式はこれです。
(SUM([Count]) / SUM([Population])) * 10000
一見すると何の問題もありません。人口という列があるので SUM() で包んだだけです。
ところがこのデータの粒度は「都市 × アメニティ種別」で、1つの都市の人口が、その都市の行数(今回は17〜24行)だけ繰り返し足し込まれます。分母が実際の人口の20倍前後に膨らみ、州別の密度は 0.58〜2.04 という、単位の意味を失った数値になっていました。
「1万人あたりの公園設備が2件未満」——おかしいと気づけたのは、CSVを別途集計して数値を突き合わせたからです。正しい値は 13.9〜46.8 でした。
修正後の式がこちらです。
SUM([Count]) / SUM({FIXED [City],[State] : MIN([Population])}) * 10000
{FIXED [City],[State] : MIN([Population])} で「都市ごとに人口を1つだけ取る」よう固定し、それを州で合計します。MIN() を使っているのは、同じ都市の行はすべて同じ人口値を持っているので、そのうち1つを取れば十分だからです(MAX() でも AVG() でも同じ結果になります)。
厄介なのは、この誤りが見た目に現れにくいことです。各都市の行数が17〜24とおおむね揃っているため、州の順位はほとんど変わりません。散布図の形も、軸の数字を隠せば修正前後でほぼ同じに見えます。「グラフが変に見えないから正しい」は成り立たない、という実例でした。
教訓は単純で、ヘッダーに Population と書いてあっても、それが「行ごとの実測値」なのか「行が共有している属性」なのかを先に確かめる。後者なら SUM() してはいけません。比率を作ったら軸の数値を1つ拾って、電卓で桁が合うか確かめる。これを毎回やることにしました。
パラメータアクションは「状態の見える化」とセット
散布図をクリックして地図が切り替わる仕掛けは、作っている本人は当然わかっていますが、初見の人には「なぜか地図の色が変わった」としか映りません。今回はタイトルにパラメータを埋め込んで対処しましたが、クリックできることを示すヒント文を1行添えるところまでやるべきでした。
インタラクションを足すほど「今どうなっているか」を説明する責任も増える。これも今週持ち帰った点です。
Tableau Public プロフィール: https://public.tableau.com/app/profile/tamaball38175/vizzes
⚠️ 注記: この記事はAIを活用して生成されています。内容に誤りが含まれる可能性があります。技術的な詳細については公式ドキュメントも合わせてご確認ください。
