
Preppin Data Practice #01 (24年4月 -2024: Week 13 Easter Sales -)
Tableau Prepユーザー会のNakajima2です。
Japan Preppin Data Fam 第1回目のPreppin Data勉強会、24年4月の記念すべき第1回目YouTube動画公開は、2024W13の課題にチャレンジです。
24年3月にPreppin Dataで出題された全4題(W10 〜13、下表参照)から、時期に合った、また日付データの扱いを思案するテーマとしてW13を取り上げています。

以下、課題の内容、対応のポイント、参加者の解答例をご紹介します。
Preppin Data勉強会の配信動画(YouTube)も、以下リンク先からご覧ください。
公開した動画はこちらです
1)課題の内容
Preppin Dataの課題は、下記を参照ください。https://preppindata.blogspot.com/2024/03/2024-week-13-easter-sales.html
・出題の背景
イースター、クリスマス以上の盛り上がりとなる、キリスト教最大のお祭り! です。グレゴリウス歴に合わせでイースターの日程が毎年変わる(春分の日以降で最初に満月に当たる週の日曜日)ことが特徴。
このイースターに合わせてセールスを実施した過去5年間(2020〜2024年)の結果を比較するデータ作成が課題となっています。
イースターの日から12週間前の月曜日よりセールスを開始。
毎年変わるイースターの期日(該当の5年間は、3月31日〜4月17日で変動)から遡り、セールス期間中の販売実績を各年で比較するためのデータ前処理が求められています。
・データソース、Outputデータ
Inputのデータソースは、Excelファイル。5年分のデータは、ワークシートにそれぞれ入力されています。

Prep処理後のOutputデータは、9フィールド、1,752行(ヘッダ除く)となります。

・Requirements(ポイント)
Outputデータから、各年のセールス結果の比較と2024年の最終結果予測(今回の出題が3月27日行われたため、イースター直前までの販売データが入っていない)が出来るようなデータ加工が求められています(下のVizが提示されている)。

ポイントは、次の通りです。
全ての年を1つのテーブルにまとめる。
週番号を数え、各年の販売実績を週単位で比較できるようにする。この際、週の初めは月曜日でとする指定あり。
販売日を曜日が分かるように工夫する。アルファベット記号表記、月曜日を1として並べ替え処理に対応出来るようにする。
販売日ごと、製品ごと の売上額を集計する。
2)対応のポイント
Prepでの前処理作業における、技術的なポイント(上記 Requirementsに対応)は次の通りです。
ワイルドカードユニオン
週番号の扱い、算出方法
曜日の扱い(記号、番号に変換)
販売金額の算出(四則演算)
特に本課題では、日付関数の利用方法、1週間(7日間)を配慮した計算での週番号の計算方法が大切です。
参加者それぞれのアイディア、思想があり、この点の比較だけでも知見が広がります。
3)参加者の解答例、Tipsなど

参加者それぞれの技で使用する関数やフローの流れが違っています。
各項目で使われた方法の違いを比較して記載をしてみました。
ワイルドカードユニオン : データソースの接続
提供されているデータソースは、Excelのワークシートに年ごとにデータが記載されている。フィールドの構成(4つのフィールド、フィールド名)が全て同じとなっていることから、データソース接続時にワイルドカードユニオンが利用出来ます。

データセット接続時に代表的なワークシートを1つ接続した後に、データペインの「テーブル」タブで「複数のテーブルをユニオン」を選択し、画面下の「適応」のボタンを押すことで、Excelワークシートが一度に読み込むことが出来ます。

読み込まれたデータは、ユニオン処理で縦に全て繋がったデータとなります。
なお、この機能はcloud版のPrep利用では、ワイルドカードユニオンが利用が出来ない仕様になっています。
年の抽出 : 文字列扱い
(1)ワークシート名の利用
今回のデータソースでは、ワークシート名として使われている数値情報を年のデータとして利用することが出来ます。
ユニオン時に作成される[Table Names]フィールドをそのまま使用し、「Year」フィールドとして利用出来ます。
cloud版のPrepなどでは、[Table Names]に年数値がExcelファイル名の右側に追記されているため、RIGHT関数で年数値を取り出すことが出来ます。
RIGHT([Table Names],4)
(2)日付データからの計算
日付関数を使用し、[Sales Date]のフィールドから年を抽出出来ます。利用する関数例は、次の通りです。
STR(YEAR([Sales Date]))
週番号の算出 [Easter Week Number]
(1)各年の最初の販売日を基準とする
最初の販売日をLOD関数を用いて抽出します(FIXEDでYearを固定した、最初の販売日)。
{ FIXED [Year] : MIN([Sales Date])}
この最初の販売日を基準として、各販売日の日数差から1週間(7日間)を割り算して週の番号を計算します。
DIV(DATEDIFF('day',[First Sales Date of Year],[Sales Date]),7)+1
CEILING((DATEDIFF('day',[First Sales Date of Year],[Sales Date])+1)/7)
(2)DATETRUNC関数で月曜日を指定して週番号を得る
( DATEPART('week', DATETRUNC('week',[Sales Date],'monday')) )-( { FIXED [Year] : MIN([Sales Date])} ). +1
説明では、ふたつの計算フィールドを作成し、それらを引き算して週番号を得ています
曜日の記号、数値化
ここでは、条件式で記号、数値を作成していきます。
(1)記号 [Weekday]
・CASE文で文字を指定
DATENAME('weekday',[Sales Date])
CASE [Weekday]WHEN 'Monday' THEN 'M'WHEN 'Tuesday' THEN 'Tu'WHEN 'Wednesday' THEN 'W'WHEN 'Thursday' THEN 'Th'WHEN 'Friday' THEN 'F'WHEN 'Saturday' THEN 'Sa'WHEN 'Sunday' THEN 'Su'END
・2文字抽出するケースを指定する
IF LEFT ( DATENAME weekday', [Sales Date]), 1) = 'T' or LEFT ( DATENAME weekday', [Sales Date]), 1) = 'S' THEN LEFT ( DATENAME weekday', [Sales Date]), 2)ELSE LEFT ( DATENAME weekday', [Sales Date]), 1)END
(2)数値化 [Weekday Order]
・DATEPART関数
IF DATEPART('weekday',[Sales Date]) =1 THEN 7ELSE DATEPART('weekday',[Sales Date])-1END
・% を利用した割り算余りの利用
IF [Easter Week Number]%7=0 THEN 7ELSE [Easter Week Number]%7END
・CEILINGとRANK_DENSEを用いた方法
CELING( {PARTITION [Year] : ORDERBY [Sales Date]ASC: RANK_DENSE()}} ) /7
・ダミーとしてDATEADD関数で仮の日付を設定し、DATEPART関数で週の数値化を行う
DATEPART ('weekday', DATEADD ('day', -1 , [Sales Date]))
販売金額の算出 [Sales]
[Price]*[Quantity Sold]
その他重要事項
(1)販売データの内訳を確認(中身を検証) 販売開始日が月曜日、抜けないか
日々の販売データに抜け(日付が無い)などの有無を確認する
{ PARTITION [Year] : { ORDERBY [Sales Date]ASC : RANK_DENSE()}}
今回の課題はイースター当日以外の83日がカウントされる
(2)Input、Outputデータを事前に確認を行って前処理の仕方を整理する。
Excelなどでの確認を行う。
(3)Inputデータの素性をPrep内で事前検証
次処理で確認を実施
・販売データ記録がある日[Sales Date]の確認
各年をグループとして集計を行い、MIN(最初の販売日)、MAX(最後の
販売日)、CNTD(販売日の日数計)を確認
*FIXED LOD関数と同様な確認が集計で出来る


[Easter Day]DATE(DATEADD('week',1, DATE(DATETRUNC('week',[Sales Date-1]))))
(4)データの並べ替え整理
{ORDERBY [Field Name] : LOOKUP ([Field Name], 0) の利用で
フィールドの追加をすること無しにデータの整理並べ替えが出来る
*詳細は、近日 Tableau Prep Tips週に掲載予定
(5)フローのフォルダ整理
長いフローになる場合は、フロー内にフォルダを作成して表示を整理出来る
*AIさんの説明を参照されてください
4)おわりに
今回、Preppin Data勉強会がスタートした23年7月から参加のメンバーが2名、23年11月から参加したメンバーが5名の計7名が参加。
初心者の方から、上級者まで多種多様。仕事の業種も異なる方々だけあり、提示されたPrepの手法、関数使い方、計算方法は、参加者それぞれ。同じやり方だったケースの方が少ない感じ。
特に業務での利用頻度が多く、扱い方に注意を要する日付については、参加者それぞれの工夫やノウハウが垣間見れる内容でした。
他の方の方法を知り、技の引き出しを増やす、自分の方法よりも効率的な良い方法を知ることが出来た有意義な場となりました。
実は、参加者は定例の勉強会で今回の課題を1度発表した上で、YouTube撮影用に2度目の発表を対応しています。
同じ課題への対応ですが、定例勉強会で得た別知見を入れ込んで、修正した内容を発表してくるメンバーばかり。
それでも違う技の提示があり、改めて「ホント勉強になった」との意見が多く聞かれる勉強会となりました。
Practice(練習する)ことの大切さ を、改めて感じられた時間となりました。
Preppin Data勉強会(Japan Preppin Data Fam)では、新規参加者を募集しています。
初心者の方も大歓迎。Tableau Prepが使い慣れた中級以上の方も、目から鱗いっぱいありますので、よろしければご参加を検討ください。
参加希望の方は、下記までメールご連絡ください。
Tableau Prepユーザー会 : tableauprep.usergroup@gmail.com