Preppin'Dataで覚えたTableauPrepのTips集2024
今年もTableau Tips * Tabjo Advent Calendar 2024に参加しようと思って書きました。昨年7月頃から始めたPreppin'Dataが、もう1年半も続けてるのかと振り返ってまして、そこで覚えたPrepくんのTipsを紹介していくことにしました。2024年は初めてWeek1から年間通しでやった年になりまして、せっかくなのでTipsを覚えたWeekの課題も貼りながら紹介していこうと思います。
ちなみに昨年のアドカレ記事はこちら↓で、そもそもTableauPrepやPreppin'Dataなんぞやも書いてます。よろしければ併せてご覧ください。
この時は初心者の方にも実用的なTipsにしたほうがいいかなと思って書いたのですが、今年はあまりそういうこと意識せずに書いていきます。ひょっとしたら、ややマニアックな内容かもしれないので、予めご容赦くださいませ。
Week20:曜日の文字列を簡単に作る方法
顧客の取引データを使って、曜日別のランキングを作るためにパラメータを使ってチャレンジしてみましょうというお題。パラメータで曜日を絞るという要件で、日付のフィールドから「Weekday」(曜日)というフィールドを作る必要があったのですが、最初に私が書いた計算式がこちらです。
CASE DATEPART('weekday',[Date])
WHEN 1 THEN 'Sunday'
WHEN 2 THEN 'Monday'
WHEN 3 THEN 'Tuesday'
WHEN 4 THEN 'Wednesday'
WHEN 5 THEN 'Thursday'
WHEN 6 THEN 'Friday'
WHEN 7 THEN 'Saturday'
ELSE NULL END
うん、長いですね。笑
という中で勉強会に参加したら、もっと簡単に作ってる人がいまして、それを忘れないように書き残しておこうと思って取り上げていきます。
① DATENAMEを使う
DATENAME('weekday',[Date])
はい、そのものズバリの関数がありました。もう忘れない!
② ネイティブの「日付の変換」機能を使う
ちょっと手数は増えるのですが、計算式を書かずに作る方法もありました。日付フィールドを色々な形式に変換できる機能が備わっていまして、曜日に限らず色々な形に変えられます。注意点は、元のフィールド自体を書き換えてしまうので、「元の日付フィールドも残したい!」というときは複製してから変換するという感じになってしまいます。(というか、日付と並べたいことが殆どですよね…)
Week29:いろんなコピペ方法あるよ
F1のラップタイムを3ラウンド分集計して、Positionの順番を決めていくという課題でした。最初にQ1ラウンドのクリーニングステップを作ったあとに、それをコピペしてちょっとずつ変えながらQ2・Q3と作っていきました。
① ステップをコピペ
先に書いた通り、Q1で作ったステップをコピペしてQ2を作るということができます。コピーしたいステップを右クリックすると「コピー」が出てくるのでそれでコピーして、貼り付けは空いてるスペースで右クリックして「貼り付け」ればOKです。
② 変更のコピペ
この課題ではQ1→Q2にコピペしたあとに、同じような計算式を追加していくということが発生しまして、そこではステップ内に計算式などで作った「変更」をコピペすることで効率的に作れるというTipsです。これができることを全然知らなくて、「なぜ俺はあんな無駄な時間を…」となりました。
この課題をやって、「他にもいろいろコピペできるのでは?」と思い立ち、Prepでできるコピペ機能をまとめた記事も書きました。よろしければこちらもぜひご覧ください。
Week41:Not EqualでCross Join
アスリートの獲得賞金をWikipediaのデータを使ってキレイなデータを整えようという課題で、選手や賞金の情報が入ったレコードに、データソース情報としてURLが入った1行1列のテーブルをくっつけたいという要件でした。
こういうとき、SQLでは「CROSS JOIN」という種類の結合で簡単にくっつけることができるのですが、残念ながらPrepくんのJOINにはその機能がありません。
そこで、今までは結合用に「1」などの固定値を持たせたフィールドを結合元となるテーブルに作った上で、結合ステップで「1 = 1」となるように結合条件を設定することで「すべてのレコードにすべてのレコードがくっつく」という状況を作ってCROSS JOINを実現していました。
ただ、このやり方って「両方のテーブルに結合キーを作って、JOINしたあとに両方削除する」ということをしなければならず、ちょっと面倒だよなーと思っていました。
そこでふと「結合条件を不一致にしたらいけるのでは?」と思い立ち、試してみたらうまくいったというTipsです。お互いのテーブルにあるフィールドで「明らかに異なる値が入ってる」ものであれば成立しちゃうので、まず間違いなく準備不要でできるはずです。
このTipsは、「欠損があるデータをくっつけるために、総当たりのテーブルを先に作っておきたい!」みたいなときにも役に立ちます。日付と商品の総当たりを作るなら、両方の一覧を不一致条件で結合して終わりです!
PrepでCROSS JOINできるようになったらいいなと思ってたのですが、これでできるから別にいいやとなりました。笑
Week47:表計算を使ってフィルターできる
最後は最近の課題から。顧客情報の重複レコードを削除するだけの、とてもシンプルな要件でしたが、色々なやり方が考えられるので勉強会では中々に盛り上がりました。
私は2024.1verで実装された「重複行の特定」の機能を使って解こうとしたのですが、この方法だと「①重複行の特定→②”一意”でフィルター→③作ったフィールドを削除」という3個の変更を作る必要があるので、直前の勉強会で教わった「表計算を使ってフィルターする」という方法を試しました。
先に、「重複行の特定」を使った場合の流れを書きます。
これでいいんです。要件は満たしてます。新機能も使えて勉強になります。でも、なんかちょっと物足りなくて、これを一発でやっつけたいんです。
ということで作ったフィルターがこちら。
{PARTITION [Customer ID], [First Name], [Last Name], [Phone Number], [Address]: { ORDERBY [Customer ID] DESC: ROW_NUMBER() } } = 1
フィルターの中身には「PARTITION/ORDERBY/ROW_NUMBER」といった、普通にPrepしてる分にはあまり使わない関数がありますが、実はこの計算式は「重複行の特定」で自動的に作られるもののほぼ流用なのです。
IF ({PARTITION [Customer ID], [First Name], [Last Name], [Phone Number], [Address]: { ORDERBY [Customer ID] DESC: ROW_NUMBER() } } = 1) THEN '一意' ELSE '重複' END
↑が「重複行の特定」で作られる計算式で、IFとTHENに挟まれた部分をそのままフィルター条件として使っているだけなのです。
処理としては、PARTITIONで区切られた範囲でROW_NUMBERを振り、その中から「1」の値だけに絞り込む。というようなものです。ROW_NUMBERはORDERBYで指定したフィールドに重複があっても、同じ番号が振られないようになっているため、この方法なら必ずPARTITIONの中で1行だけを取得することができます。
こう書くことで、変更数が3→1と減らせるので、手数減に大きく貢献するTipsとなります。1stepでのフローを作るときにはものすごく有効です!
ちなみにROW_NUMBERだけでなく、RANKなどの他の表計算もフィルターに書くことが可能です。上位何個に絞るとか、累積の構成比が何%まだとかって使い方もできますね。
終わりに
記事を書くにあたり今年のPreppin' Dataの課題を振り返っていたのですが、やっぱり続けていくとそれなりにスラスラ解けるようになってくるものだなと感じた1年でした。継続は力なり、ですね。
これを書きながらBGMに聴いていたVizトークで、ちょうどPrepの話が出てきていまして、そこでババッと色んなコメントがついたのを見て、やっぱりPrepくんは素敵なツールなんだなぁと嬉しくなりました。
もっともっとTableauユーザーにPrepくんの良さが伝えられるよう、来年もPreppin' Data頑張ったり、勉強会も引き続き参加したり、noteを書いたり、ユーザー会とかも参加したりしていこうと思います。
それでは皆様、良いお年を!