【Tableau】正規化されたジッタープロットを作る方法│WOW2023 Week 6をやってみた

目次

基本情報

WOW2023 | Week 6 | Can you create a normalized jitterplot?

Requirements

・1000 x 800pxのダッシュボードを用意
・4つのメトリックについて、0から1の尺度ですべてのプレイヤーをジッタープロットで表示する
・プレイヤーを選択することができるようにする。選択されたプレイヤーは、色とサイズでハイライト表示し、メトリック値でラベル表示する
・破線で中央値ラインを作成する
・グレーの円をクリックすると、そのプレイヤーが選択される
・選択されたプレイヤーのランクとパーセンタイルをチャートの下に表示する
・ツールチップとフォーマットを合わせる(カラーを合わせたい場合は、#005C5Cと#C4CED4)

Attribute

タブローパブリックにあなたの解決策を公開する時は、ちゃんと時間をかけてオリジナルのインスピレーションへのリンクを含めるようにして。
あと、解説にハッシュタグ#WOW2023を入れることで検索できるようにして!

野球の指標

今回は野球の指標を使います。

① BA (Batting Average):打率
BA(打率)は、打席に立った時に打数に対する安打の割合を表す指標です。例えば、100回打席に立って20回ヒットを打った場合、打率は.200(=20÷100)となります。

② OBP (On-Base Percentage):出塁率
OBP(出塁率)は、打席に立った時にどのような方法で出塁したかに着目した指標です。安打だけでなく、四球や死球なども含まれます。例えば、100回打席に立って20回ヒットを打ち、10回四球を選んだ場合、出塁率は.300(=(20+10)÷100)となります。

③ SLG (Slugging Percentage):長打率
SLG(長打率)は、打席に立った時にどの程度の飛距離を打ったかを表す指標です。打数に対する塁打(単打、二塁打、三塁打、本塁打)の割合を使って計算されます。例えば、100回打席に立って20回ヒットを打ち、そのうち4本が二塁打で1本が三塁打だった場合、長打率は.250(=(8+3)÷100)となります。

④ OPS (On-Base Plus Slugging):出塁率+長打率
OPSは、OBPとSLGを足したもので、打者の全体的な打撃能力を表す指標です。例えば、OBPが.300、SLGが.400の場合、OPSは.700となります。OPSが1.000を超える選手は優れた打撃選手として知られています。

データを成形する

使いにくいのでピボットしましょう。
選手名-指標-値にします。

ダッシュボードを作っていく

ジッタープロットで表示する

・4つのメトリックについて、0から1の尺度ですべてのプレイヤーをジッタープロットで表示する

まずは第1条件を見ていきましょう。
とりあえずイメージがわかないので、それっぽく並べてみます。

0から1という条件がクリアできていませんね。

とりあえず横方向にも値を入れていきます。
x値としてRANDOM関数を追加しました。

RANDOM()

条件は満たせていませんが、大分近づきました。
少なくともジッタープロット的なものです。

X軸方向に乱数を追加することで重複をなくし、プロットの重なりを防いでいます。
プロットが重ならない=ばらつきが表現できる

縦軸を0-1にする

次に縦軸を0-1ラインに制限しましょう。
指定の指標を0-1に変換する方法をChatGPTに聞いてみたところ、次の返答がありました。

指定の指標を0から1の範囲の値に置き換えるには、以下の式を使用します。

新しい値 = (元の値 – 最小値) / (最大値 – 最小値)

ここで、最小値は指標の最小値、最大値は指標の最大値を表します。元の値が最小値の場合、新しい値は0になり、元の値が最大値の場合、新しい値は1になります。元の値が最小値と最大値の間の場合、新しい値は0から1の間の値になります。

例えば、以下のような数値のリストがあるとします。

[10, 20, 30, 40, 50]

このリストの最小値は10、最大値は50です。最小値を0に、最大値を1に置き換えると、新しい値のリストは次のようになります。

[0.0, 0.25, 0.5, 0.75, 1.0]

下記計算方法でできそうですね。
新しい値 = (元の値 – 最小値) / (最大値 – 最小値)

計算フィールドの作り方もChatGPTに聞いてみましたが

(ATTR([元の値]) - ATTR(MIN([元の値]))) / (ATTR(MAX([元の値])) - ATTR(MIN([元の値])))

これではだめですね、、、、、
自分で考えます。

 ([値]
    -{ FIXED [指標]:MIN([値])}
 )
/
 ({ FIXED [指標]:MAX([値])}
    -{ FIXED [指標]:MIN([値])}
 )

元の値はそのまま[値]です。
最小値は{ FIXED [指標]:MIN([値])}です。
FIXED関数で指標基準で、最小値を取ってきています。
FIXEDを使っていないと、詳細に入っているNameに引っ張られて個人の最小値、つまり[値]と全く同じ値を取ってきてしまうからです。

最大値も同様の理由から{ FIXED [指標]:MAX([値])}です。

大分近づいてきましたね。

プレイヤーを選択できるようにする

・プレイヤーを選択することができるようにする。選択されたプレイヤーは、色とサイズでハイライト表示し、メトリック値でラベル表示する

次の条件を見ていきましょう。
プレイヤーの選択したいと言うことなので、これはパラメータでしょう。

文字列ーリストー値の追加でOKです。

選択選手判定

[選択選手]=[Name]

色設定とサイズ設定に追加します。

・ツールチップとフォーマットを合わせる(カラーを合わせたい場合は、#005C5Cと#C4CED4)

色はダブルクリックすればパレット外の色を選択できます。

大分近づきましたね。

指定選手だけラベルを表示する

とりあえず普通にラベル設定してみました。

当然ダメですよね、、、、

あんまり作りたくないですが専用の計算フィールドを作ります。

IIF([選択選手判定],値,NULL)

ついでに色とサイズを並び替えて選択選手が前に来るようにしました。
サイズが反転してしまった場合は、サイズ編集から変更できます。

いい感じです。

破線で中央値ラインを作成する

・破線で中央値ラインを作成する

これは普通にリファレンスラインでできそうですね。

細かい設定をしていく

・グレーの円をクリックすると、そのプレイヤーが選択される

ワークシートアクションのパラメータの変更でいけますね。

・選択されたプレイヤーのランクとパーセンタイルをチャートの下に表示する

別途作ってダッシュボードでって感じですね。

x値に選択選手判定の補正を入れる

条件にはなかったのですが、サンプルを見る限り選択選手を真ん中に来るよう設定しているようです。
なのでxの計算式を変えました。

IIF([選択選手判定],0.5,RANDOM())

あとはサンプルを参考に整えて完成

感想

めっちゃ時間がかかりました、、、

https://public.tableau.com/app/profile/kamide3356/viz/Week6Canyoucreateanormalizedjitterplot/WOW2023Week6Canyoucreateanormalizedjitterplot?publish=yes

Comment

コメントする

目次