Tableauで週間ランキング推移のチャートを作ってみた

# はじめに
　この記事は [フリューAdvent Calendar 2024](https://qiita.com/advent-calendar/2024/furyu "フリューAdvent Calendar 2024") の6日目の記事となります。

　早いもので2024年も12月になり、もうじき年末を迎えようとしています。昨年のアドベントカレンダーに投稿したのがついこの間のように感じますｗ （昨年と同じことを言っているような気がしてならない…）

　一足早いですが「メリークリスマス♪」。折角なのでTableauを使ってクリスマス感を表現してみました。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/55a4e255-610c-a4b4-1154-465bda2f7fda.gif">

　さて、今回は「週間ランキングの推移」というチャート作成に取り組んだことを紹介したいと思います。

## 取り組みのきっかけ
　最近、とあるGA4のデータを新しくBigQueryに追加しました。ただ、あまり詳しくデータを見ることができておらず、データだけがたまっていってる状態でした。
　そのため、たまっているデータを何かに活用したいという思いから、まずはランキングでも作って周囲の興味が引けたらいいかなという安易な気持ちがきっかけとなります。

## 週間ランキング推移ってなんだ？
　名前の通り **【週間での】【数値の大小を順位にしたものの】【移り変わり】** を表現したチャートです（個人的見解）。
　Tableauに限らず、一般的にもよく使用されるチャートだと思うため、様々な場面で目にすることが多いかと思います。音楽・DVD・CD・コミックといったランキングは身近なもの等々。
　ただ、そういったランキングチャートは、週間・月間を単発で表現したものが多く、推移を表現しているケースはあまりないような気がします（単なる憶測ですｗ）。そのため、今回はシンプルなランキングではなくランキング＆推移が分かるものにしたいと考えました。

# Tableauで週間ランキングを作成
　作成するまでの手順を整理します。

**１．どんなランキングにするか構想する**
**２．データを抽出する**
**３．TableauDesktopでチャートを作る　～ランキングの基本部分～**
**４．TableauDesktopでチャートを作る　～見た目の装飾～**

 といった流れで作成していきたいと思います。どんな作業も手順を整理しておくことは大事です。

## step.1　どんなランキングにするか構想
　まずは作りたいランキングのイメージを練ります。一口にランキングと言っても様々な形のランキングがあるため、Tableauで何かを表現するにあたっては、このイメージが重要です。イメージ出来ていないものを作るのは中々困難だからです。
　今回は下記のようなものにしたいと思います。手書きなのでとても雑ですが・・。
 
 **【図１：週間ランキング完成イメージ】**
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/9376e81b-02e2-73a4-57ea-60c400ed9ba5.png">

- ポイント
    - 横軸は週を表すようにする
    - 縦軸はランキングで上から1・2・3・・・にする
    - ランキング対象には色をつけて週ごとの変化を見やすくする

さてこれを元にして完成を目指します。

## step.2　データ抽出
　Tableauにおいては必須であるデータ抽出の作業です。イメージが実現できるデータをサッと準備することもTableauでチャートを作る上では大事な作業です。
　今回は冒頭で話していたGA4のデータを抽出します。BigQueryを使ってデータを抽出してTableauに抽出を作成します（ライブ接続はしません）。

### step.2-1　BigQueryでSQL作成
　あまり面白くないSQLになったため、UDFを使った部分だけ紹介したいと思います。

- ポイント
    - データにURLエンコードされているところがあった部分の考慮
    - URLに付与されてた複数のパラメータ値の取得

**※(注)サンプル的な書き方にしています**
```SQL:URLエンコード箇所の考慮
CREATE TEMPORARY FUNCTION urldecode(s STRING)
RETURNS STRING
LANGUAGE js AS "return decodeURI(s);";
select
    urldecode("%E3%83%87%E3%82%B3%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B%E3%82%88")

－－－結果－－－
デコードするよ
```
　BigQueryの関数にはURLエンコードされたものをデコードする関数はなさそうだっため、こんな感じでFunctionを作って対応しました。
　ただ、Tableauの抽出では「CREATE TEMPORARY FUNCTION～」が使えなかった記憶があるため、FunctionはUDFにしました。
```SQL:URLデコードをUDFにした版
/* UDF作成 [project].[dataset]は任意で */
CREATE FUNCTION IF NOT EXISTS
[project].[dataset].urldecode(s STRING)
RETURNS STRING
LANGUAGE js AS "return decodeURI(s);";

/* SQL実行 */
select
  `[project].[dataset].urldecode`("%E3%83%87%E3%82%B3%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B%E3%82%88")

－－－結果－－－
デコードするよ
```
　UDFにしても同じ結果が得られました。UDFを作るにあたって制限などがなければ、UDFの方が便利ですね。

```SQL:複数のURLパラメータの取得
CREATE TEMPORARY FUNCTION getparams(s STRING)
RETURNS ARRAY<STRUCT<key STRING, value STRING>>
LANGUAGE js AS """
var s_array = s.split('&');
  return s_array.map(function(field) {
    var obj_field = {};
    obj_field.key = field.replace(/=.*$/, "");
    obj_field.value = field.replace(/^.*=/, "");
    return obj_field;
  });
""";
select
  parameters,
  (select max(case when key = "a" then value end) from unnest(parameters)) as parameters_a,
  (select max(case when key = "b" then value end) from unnest(parameters)) as parameters_b,
  (select max(case when key = "c" then value end) from unnest(parameters)) as parameters_c,
  (select max(case when key = "d" then value end) from unnest(parameters)) as parameters_d,
  (select max(case when key = "e" then value end) from unnest(parameters)) as parameters_e
from
  (
  select
    getparams("a=1&b=2&c=3&d=4&e=5") as parameters
  )
```
　こちらもFunctionで対応しました。実行結果は以下の通りです。
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/5649dbed-7b30-4fc0-70ad-2a7f367551b8.jpeg">
　FunctionでARRAY・STRUCTにしたパラメータたちをそれぞれselectして列持ちさせるようにしました。幸いにもパラメータの種類の5つでした（多かったら面倒だった…）。こちらも先述のURLデコードと同様にUDFにして利用します。

　といったことをしながらTableauで抽出するSQLを書き上げました。

### step2-2.　TableauDesktopでデータ抽出
　TableauDesktopでデータを抽出します。
- TableauDesktopを新規に開く
- 「データに接続」を選ぶ
- 「Google BigQuery」を選ぶ
- 任意の接続方法で接続する
- プロジェクト等を選択して「新しいカスタムSQL」を選び作成したSQLを貼り付け
- 接続は「抽出」を選んで抽出を実行

## step3.　チャート作成　～ランキングの基本部分～
　ここからが本番です。チャートを作っていきます。

### step3-1.　縦軸・横軸の設定
- 縦軸（行）
    - ランキング対象の集計値を入れる
    - マークの色に色付けするディメンションを入れる
- 横軸（列）
    - 日付を入れて週にする

**【図２：step3-1】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/3d086cb9-dab5-2449-8bd9-059e2d8a05d7.png)
　週ごとのランキング対象の推移が分かるようになりました。ただ、まだこれではランキングになっておらず、単なる数値の推移になっています。次はランキングになるようにしていきます。

### step3-2.　ランキング化
　以下のように操作します。
 
**【図３：メジャーの簡易表計算→ランクを選択】**
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/daf8fb2f-c32b-efe1-c471-2f8ae2250f1d.png">

**【図４：ランクを選択後】**
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/88f789cd-0ff2-5e86-26b2-76986cb9e2b3.png">

**【図５：メジャーの計算方法→色付け項目を選択】**
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/b5e86292-385d-0962-f0f9-0c1d76ed83b7.png">
　「色付け項目」は最初に色付けをしたディメンションです。

**【図６：色付け項目選択後】**
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/39602b5f-907a-7b44-2295-a40da734b818.png">
　やっとランキングっぽさが出てきたような気がします。けれど、縦軸の下が0になっており、ランキングが逆になっています。「ランキングが高い＝1」であるため軸を反転させます。

**【図７：縦軸の軸を反転】**
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/ead8f092-1186-3fb2-b89a-09a1a492333c.png">
　縦軸を右クリックして、スケールにある「反転」を選択します。

**【図８：反転選択後】**
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/3a2a923d-12d7-f864-1b4a-68d6e40e808d.png">
　これで色付けしたディメンションの数値の大きいものから順番に1・2・3・・・と並んでおり、基本部分はこれで完了です。
　ただ、これではやはり見た目が貧相なので、次は見た目をランキングっぽく整えていきます。

## step4.　チャート作成　～見た目の装飾～
　今回の見た目は最初の構想と近いものに仕上げたいと思います。

**【図９：Before】**
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/0e7ec197-ea91-5258-ee2c-c7d987257091.png">

**【図１０：After】**
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/08a8e3af-b58a-9fb5-a3c3-6f7509de9c3e.png">
　はい、できました。ちょっと見た目が変わりましたね。やったことは以下です。

 - ランキング順位を四角の中に表示して分かり易くした
     - 行に入れていた「メジャーを複製」
     - 複製したメジャーを「2重軸」に変更
     - 元のメジャーと同様に「軸を反転」
     - （念のため）「軸の同期」を選択
     - マーク欄から複製したメジャーの「グラフ種類を形状」に選択
     - 形状の中から「四角の形状」を選択
     - ラベルを表示するように変更（チェックボックスをオン）
     - ラベルの「フォントを白・太字」に変更
     - ラベルの配置を「上下中央」に変更
     - 形状の「サイズをちょっと大きく」変更（スライダーで適当に）
 - ランキング対象の数値を表示するようにして順位＆実数が分かるようにした
     - メジャーのラベルを表示するように変更（チェックボックスをオン）
     - ラベルのフォントを「8pt・太字」に変更
     - ラベルの配置を「上・中央」に変更
 - 罫線を表示するようにした
     - 縦軸のグリッド線をオン
     - 横軸のグリッド線をオン

　以上のことをするとこのようなチャートになります。
<img width="450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/c3ac7f00-6fa0-5d56-f838-e3f6c82b325a.png">

　これで思い描いた週間ランキング推移を作ることができました。

# 感想
　見た目を整えるところまで意外と簡単にできたなという印象です。もっと改良の余地がありそうなので、使いやすさの面も向上させていきたいと思います。
 　また、今回作ったチャートを定期的にウォッチして何か新しい発見が生まれることを期待したいです。こういったチャートは、対象の問題発見や課題解決に役立てていくものだと思うため「作って1回見て終わり」にならないよう、しっかりと運用していきたいと思います。
　最後まで記事をみて頂きありがとうございました。それではよいクリスマスをｗｗ

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/55a4e255-610c-a4b4-1154-465bda2f7fda.gif">

# 実行環境
- BigQuery
- TableauDesktop2022.1.5