TableauPrepを快適に扱うTips集
はじめに
Tableau Tips * Tabjo Advent Calendar 2023に参加しようと思って、さて何を書こうかと考えた結果、最近取り組んでいる「Preppin' Data」で培ったTableauPrepの便利Tipsを紹介したいなということで書いてみました。
TableauDesktopに比べると、TableauPrepくんの情報はまだまだ少ないので、これからも気づいたことを色々書いていきたいと思います。
「Tableau Prep」について
「Tableau」というツールの話をするとき、ほとんどの場合は「Tableau Desktop」のことを指すと思います。ですが、Tableauの名を冠する製品には他にも「Tableau Cloud」というプラットフォーム製品や、この記事の本題であるデータ前処理ツールの「Tableau Prep」があります。
TableauPrepはとてもパワフルなツールで、SQLや各種プログラミング言語を使わないと難しいようなデータ処理でも、StepByStepのGUI操作で実装することができます。Desktopのデータソース画面では対応が難しいデータ準備が必要なときに、力を発揮してくれます。
この記事では「TableauPrepを使う時に、知っていると便利なTips」を紹介していくのですが、実際に操作したことがないと「なんのこっちゃ」な内容になるので、まだ触ったことない人はぜひ一度使ってみてもらいたいと思います。基本的な機能については、公式ページの説明もご参照ください。
なお、ここから先のTips紹介に出てくる画面キャプチャ内のデータですが、後述の「Preppin' Data」という学習コンテンツで使用される架空のデータであり、実在するデータではありませんのでご安心ください。
① 計算フィールドは同名で上書きできる
TableauPrepでデータを加工していく中で、「フィールドの中に入ってる値を変更したい」という状況は非常に多いと思います。条件式を書いてグルーピングしたり、コード値にデコード値を振ったり、表記揺れを整えたり、欠損値を穴埋めしたり…。こういうとき、「フィールド名は変えずに、値だけを変える」という処理が必要になるのですが、そんなときにこの「フィールドが上書きできる」ということを知ってるとグッと作業が楽になります。
(裏を返すと、これを知らないと「別名でフィールドを作る→元のフィールドを削除する→別名を元の名前に戻す」という手数を踏まないといけなくなります…)
上記のフローで作成中のデータでは、「leave_date」に多くのNULL値が存在している状態です。例えば、この出力データを別システムに取り込むとき、NOT NULL制約があるからそのままでは取り込めないので、このNULL値を'2099/12/31'に書き換えたいという状況があったとします。
そのときは「NULLを'2099/12/31'に置き換える」という計算フィールドを作ることになるのですが、この計算フィールドのフィールド名をそのまま「leave_date」とすることで上書きすることができる、というのが紹介したいTipsになります。
私の観測範囲では、これができることを皆さん意外と気づかれていないように感じていて、自分自身もそれで相当時間を溶かしていたので、最初に紹介しようと思いました。先のキャプチャの警告っぽいメッセージもさることながら、「同じフィールド名を作れない」という先入観があるのではないかと思います。(Desktopではこれができなくて、フィールド名の末尾に半角スペースとか入れてやり過ごした経験がある人も少なくないのではと…)
一方、SQL的に考えれば、「select ifnull(leave_date,#2099-12-31# as leave_date ~」と書いてる感じになると思うので、まあそれならできないことはないよなと今では納得しています。
② レコードをソートすることができる
TableauPrepくんには、「作成されたレコードの並び順がバラバラになる」という特徴があります。出力データをDesktopなどで使うだけならそこまで気にならないのですが、Excelやcsvで二次利用するというケースではこの仕様に頭を悩ませるということも出てくると思います。
これが、バージョン2023.2で使えるようになった「LOOKUP」の関数を使うことで、思い通りの順番に並べ替えれるようになる!というのが次のTipsになります。
先ほど①で加工したデータを使って説明していきます。
このデータは「employee_id」と「month_end_date」が主キーとなっていて、画面上ではレコードの並び順がバラバラになっています。このまま出力すると、この状態のままのファイルができあがるのですが、二次利用するときに「employee_id」と「month_end_date」の順番で並んでいてほしい…という状況です。
ここで、ORDERBY+LOOKUP関数を使った下記の計算式でフィールドを上書き保存すると、「並べ替えはするけど、値はそのままの位置を参照する」という処理が走り、結果的にソート処理だけが走った状態を作れます。
{ ORDERBY [employee_id] ASC,[month_end_date] ASC : LOOKUP([employee_id],0) }
ORDERBYの中は複数のフィールド&ソート方法をカンマ区切りで指定でき、先に書いてあるルールから適用されていきます。今回の場合は、先に「employee_idの昇順で並べる」をした後に「month_end_dateの昇順で並べる」が適用されていった形です。なお、昇順/降順を指定する「ASC/DESC」ですが、省略した場合は「DESC(降順)」となるようです。
また、LOOKUPで指定するフィールドは何を使っても大丈夫なはずですが、私はソートに使うフィールドを使うことが多いです。なんとなく「この順番で並んでてほしい!」という気持ちが乗るような気がしています。
③ 調べたいフィールドを簡単に辿れる
①②は「作るとき」のTipsですが、こちらは「見るとき」のTipsです。
Prepフローによって作られたデータソースがダッシュボードに利用されて、それを通じて多くの人たちがデータ見るようになると、「このデータって、どうやって作られてるの?」「なんかこのデータ変じゃない?」みたいな声も出てくるようになります。
そんなとき、まずはダッシュボード(=ワークブック)側の仕様を確認することから始めることが多いと思いますが、そこに問題がなかったら、今度はデータソースの成り立ちを確認するために「Prepフローを読み解く」ということが起きてきます。
①②で見てきたフローの全体像は上記のようになっていますが、ここでは「"出力2"で作ったデータソースにある●●というフィールドを調べたい!」という状況だと仮定します。自分で作ったPrepフローでないと、どのデータから・どのように加工されたフィールドなのかを素早く確認することは難しいと思うかもしれません。(そして、時には自分で作ったものでさえ難しいことも…)
ですが、そんなときは、出力ステップの前にあるクリーニングステップで、調べたいフィールドをクリックしてみてください(クリーニングステップがない場合は、先に出力の手前にステップを追加します)。すると、選択したフィールドがどのデータからそのステップに辿りついているかがハイライトされてわかりやすく可視化されます!
上記のキャプチャでは「dc_nbr」というフィールドが、左下のデータソースから作成されているフィールドだということがわかります。あとは、フローを遡っていくように確認していけば、元のデータソースにあるフィールドをそのまま使用しているフィールドであるということに辿りつけます。
これを知らずにただ順番に戻っていくだけだと、結合やユニオンなどで複数の分岐が発生したときに全部を確認していかねばならず、やや手間がかかります。この手の調査をするときはスピードを求められることも多く、少しでも調査範囲を絞れるのは非常に助かります。
さらに、この機能は気が利いているところがありまして、フローの途中でなんらかの処理がかかっている場合、そのアイコンをハイライトしてくれたりもします。「なんか変な処理かかってないかな?」という当たりをつけたいときには地味に役に立つと思います。
「Preppin' Data」のススメ
Tipsの紹介は以上となりますが、最後にTableauPrepの有効な勉強法である「Preppin' Data」について紹介させてください。
こちらは、一言でいうと「TableauPrep版のWoW(Workout Wednesday)」という感じで、毎週出てくるデータ処理の課題にTableauPrepを使って解いていく中で実践的なスキルを身に着けていくことができる勉強ツールです。
TableauPrepユーザー会での紹介動画もありますので、詳しくはそちらもぜひ見ていただければと思います。TableauPrepが上達したい人には、間違いなくオススメのコンテンツです!
ここまで読んでくださった皆様、ありがとうございました。大好きなTableauPrepくんの魅力を、少しでも伝わっていたら嬉しい限りです。
これが初めてのTableauブログ記事になりまして、読みづらいところやわかりにくいところもあったと思いますが、温かい目で見てもらえると幸いです。もし、「ここどういうことですか?」「ここって違くないですか?」ということあれば、Xにてご連絡いただけると助かります。