Tableau Zチャート（Zグラフ）の作り方

# はじめに
　TableauでZチャート（グラフの形で売上傾向を把握するグラフ）を作成する機会があったため、まとめておきたいと思います。
　ネットで検索するとTableauでの作成手順がいくつか出てきますので、色々参考にしてみてください。ここでは、**①期間を12か月固定でではなく、パラメータとフィルタを両方使用して期間を変更できるようにすること**、**②先月までの期間にすること**、を実現していきます。

# Zチャートとは
　そもそもZチャートとは、**①値の推移**、**②値の累計**、**③値の移動合計**、の３つの折れ線グラフを１つのエリアに重ねて表示することによりZ様の絵を描画したグラフです。
　このZの形をみて、データの傾向をみることができます。

<img width="400" alt="z-chart" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919346/f3fe67a1-0cf8-70e9-9d03-b5c64e506d2a.png">

　説明がややこしくなるため、一旦「**月次の売上データ**」「**12ヵ月期間（2022年9月～2023年8月）**」として説明をします。
　この場合、「**推移**」は単月の売上を12ヵ月分表示しています。そのため、ここには**季節的な要因**（例：夏によく売れる／冬には売れにくい、など）／**不規則的な要因**（例：SNSで取り上げられバズる／感染症の流行による環境変化、など）による売上の変動が折れ線に表れます。
　「**累計**」は、グラフの左から右に向かって各月の売上を積み上げた値を表しています。そのため、「**左端は単月の値 = 推移と一致**」し、「**右端は12か月分の売上合計 = 移動合計と一致**」します。ここには売上増加や売上減少が線の傾きとして表現されます。例えば、単月の売上が徐々に上がっていくような場合、下に凸の形（くぼんだ形）となります。一方で、売上が徐々に減少していくような場合、上に凸の形（出っ張った形）となります。また期間の真ん中（6ヵ月目）付近に急激な売上増加があるような場合は、Ｓ字カーブのような形となります。
　「**移動合計**」は、過去12か月分の合計を計算しながら左から右に移動します。例えば、左端が「2022年9月」の場合、「2021年10月～2022年9月」の売上合計となり、右に移動するごとに１か月ずれて売上合計が計算されます。そのため、右端（2023年8月）は「**2022年9月～2023年8月の合計 = 累計と一致**」します。12ヵ月移動合計の場合、「**1年間（12か月間）の季節変動や不規則変動が包括されて表現**」されます。つまり、右肩上がりの折れ線であれば、文字通り売上増加傾向にあり、下がっていれば減少傾向になります。

# 代表的なパターン

　グラフの形がただの「Z」であれば、期間内の売上に大きな変動がなく（**横ばい型**）、「Z」が上を向いていれば売上増加の傾向（**成長型**）、下を向いていれば売上減少の傾向（**衰退型**）となります。

|横ばい型|成長型|衰退型|
|---|---|---|
|<img width="200" alt="Zチャート_横ばい型" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919346/015d5c28-2041-beb4-dcba-f8597a30c8e5.jpeg">|<img width="200" alt="Zチャート_成長型" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919346/ac46cc0b-b604-28ed-f942-d28b18f59a25.jpeg">|<img width="200" alt="Zチャート_衰退型" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919346/0b3daf05-17f7-0fed-de38-b4505ef63a15.jpeg">|

# Tableauで作る
### 前提
Tableau Destop : 2021.3.18

### サンプルデータ
ChartGPTに作成してもらいました。
練習用にご自由にお使いください。
[Sample_sales_data_for_Zgraph.csv](https://github.com/lustig-schlagzu/Sample_sales_data_for_Z-graph.git)
- 商品A（sales_A） : 成長型
- 商品B（sales_B） : 横ばい型
- 商品C（sales_C） : 衰退型

|列名|説明|
|---|---|
|data|日付：2021年1月～2023年1月までのデータが存在|
|product|製品名：「sales_A」は成長型のサンプル、「sales_B」は横ばい型のサンプル、「sales_C」は衰退型のサンプ|
|sales|数値：売上データ|

### 作り方
サンプルデータを確認します。
今回は、月次集計で期間が12か月（パラメータで期間変更可）のZチャートを作成します。

#### 1. データの確認
3製品の売上データが「**2021年1月～2023年1月**」まで存在しています。
データの最新月（2023年1月）は月半ばのデータ（としている）のため、最新月を除いたZチャートを作成していきます。
![z-chart_pre.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919346/5bbbc6e8-47e3-4347-d9ae-327356915182.jpeg)


#### 2. データ内の最新月を除外
**リアルタイムデータ**であれば、**TODAY関数**を使用して下記のような計算フィールドを作成します。
``` sql:今月を除く計算フィールド
DATETRUNC('month', [Date]) < DATETRUNC('month', TODAY())
```

　ただ今回のように「**データ内の最新月を除く**」場合は以下のようにします。
``` sql:データ内の最新月を除く計算フィールド
DATETRUNC('month', [Date]) < DATETRUNC('month', {FIXED : MAX([Date])})
```

<font color="red">【補足】
下記のような書き方はできません。
Tableau の計算フィールドでよく見る「**この関数の集計および非集計の**…」となります。</font>
``` sql:NG
DATETRUNC('month', [Date]) < DATETRUNC('month', MAX([Date])
```
<img width="600" alt="ng_calculation" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919346/b24929fd-ec1d-4d31-eb5d-545ee29974aa.jpeg">



#### 3. 最新月を除外するディメンションをフィルターに追加
　2.で作成したディメンションをフィルターに追加し、**「真」のみを表示** します。
データ内の最新月が除外されます。

<img width="600" alt="filtering_last_month" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919346/c50dfd22-54a2-6738-6501-19011bd6ace8.jpeg">

#### 4. グラフの表示範囲を期間分に限定
　前年実績や前年比を当年実績と並べて表示したいときによく起こる話ですが、日付（**[Date]**）でそのままフィルターを掛けてしまうと、移動合計を求めるときにフィルターによって除外されたデータが集計に使用されません。
　そこで **LOOKUP関数** を使用します。
``` sql:データを除外せずに表示する日付の範囲を限定
DATE(LOOKUP(MIN([Date]), 0))
```
　※この計算フィールドの詳細は割愛しますが、以下に記事をご参考ください。
　[【参考】Tableauで前年比の年をフィルタで切り替える方法](http://blog.livedoor.jp/tab_hiro/archives/24206382.html)

　
　作成した日付（以下、**[Date_filter]** とする）をフィルターに設定します。
　 **[Date_filter]** は LOOKUP関数でオフセット値で値を取得するため、フィルター設定前に、**[Date]** を列フィールドに配置してください。
<img width="400" alt="set_date" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919346/d112d3dd-86ee-ea9c-57d9-c77cc2e179e9.png">


　
　**[Date_filter]** をフィルターに配置し、以下のように設定します。
　今回は期間を固定とし、開始日フィルタで **2022/01/01** をセットします。
<img width="400" alt="date_filter" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919346/a904c345-a536-0576-43f1-0ca6dfe8d521.png">

<font color="red">[注意]
　このフィルタの設定方法では、最新データが入ってきたときに表示期間がずれます。
　データソース自体が月次集計されていれば、相対日付フィルタで過去12ヵ月で設定でき、常に最新データでZチャートを表示することができます。</font>

#### 5. 期間パラメータの作成
　12ヵ月間などの集計期間を可変にするためのパラメータを作成します。
下図のような **データ型が整数** のパラメータを作成してください。
<img width="400" alt="agg_period" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919346/de8af8f7-5a0b-9825-df63-2e42a1d8dce7.png">

#### 6. メジャー（累計、移動合計）を作成
　期間が固定であれば、簡易計算で問題ありません。今回は期間を可変にしたいため、計算フィールドを使用して**累計**と**移動合計**を作成します。
##### ①累計の作成
　以下のように作成します。（フィールド名は **[Sales_cumulative_sum]** とする）
 ``` sql:累計: Sales_cumulative_sum
WINDOW_SUM(SUM([Sales]), LAST()-[Aggregation_period]+1, 0)
 ```
　累計は、グラフ表示範囲の開始日を基準に累計していくため、開始のオフセット値は **LAST( ) から期間パラメータの値を引いて 1 を加えた値** となり、終了のオフセット値は **0** となります。

##### ②移動合計の作成
　以下のように作成します。（フィールド名は **[Sales_moving_total]** とする）
 ``` sql:移動合計: [Sales_moving_total]
WINDOW_SUM(SUM([Sales]), -[Aggregation_period]+1, 0)
 ```
　移動合計は、グラフ表示範囲外含めての集計期間（期間パラメータの値）の合計になるため、開始のオフセット値は **0から期間パラメータの値を引いて 1 を加えた値** となり、終了のオフセット値は **0** となります。

 #### 7. フィールド（ピル）にメジャーの配置
  　行 に [メジャー バリュー] を配置します。
　**[Sales]、[Sales_cumulative_sum]、[Sales_moving_total]** の３メジャーだけにします。
 　Ｚチャートの形になりました。
  <font color="red">　※ [Exclude_latest_month] がコンテキストフィルタになっていますが、気にしなくてよいです。 </font>

<img width="400" alt="set_major" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919346/ad41b3ac-0a3d-e157-56f5-460e6b1f4b6a.png">
 
#### 8. 他マークやフィルターの設定（お好きに）
　マークの「色」にメジャーネームをセットします。
　現在、全[Product]の合計になっているため、各製品ごとに確認できるようにフィルターで切替できるようにします。
 <img width="400" alt="set_mark_and_filter" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919346/c8c15c64-e0e4-099b-133a-c343975efd04.png">

　完成です。
 　
　各製品ごとのZチャートの形を確認したり、期間パラメータ（[Date_filter]）と[Date]フィルターを変更して、集計期間を変えてみてください。

  今回のような作りにしておくメリットとしては、日付の集計期間だけでなく単位（年、四半期、月など）を簡単に変えられるようになります。
　例えば、データ量が少ないため4点しか取れませんが、今回のサンプルデータでも四半期単位のZチャートを簡単に作成が可能です。（変更方法は割愛します）
 <img width="400" alt="set_mark_and_filter" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919346/adbba687-a55a-5949-b604-ea7d48f8115d.png">

# おわりに
　本来であれば、事前に集計単位を決定し、データセット時点でその単位に集計しておいた方が表示範囲の制御は楽だと思います。
　さらに集計単位や期間が固定であれば、もっとシンプルに作成できますのでどこまで需要があるか疑問ですが、いくつかTableauならではのテクニックを使用してますので、練習にはなるのかなと思います。
 　少しでも皆さんのお役に立てば幸いです。