Tableauで湯婆婆を実装してみた

プログラミング言語で[湯婆婆を実装するのが流行っている](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)ようなので、
Tableauで湯婆婆を実装していたら面白いかなと思ってやってみました。


![Yubaba-with-Tableau.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/62991356-6446-cb31-9885-5d7f9283e8f5.gif)

ちなみに最初は湯婆婆を実装するってこんなんだと思ってました。（違いました）
特に何の役にも立ちませんが、実装する過程が面白かったのでまとめておきます。

![Yubaba AA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/623daa38-e2a5-0185-a278-420c031e7973.png)




#データを準備する

データを準備する、と言っても今回はユーザーからの入力を受け付けるだけで
可視化するようなデータは何も無いので、1つだけでデータを入れた1つの列を準備しました。列名も内容も何でもOKです。
![Yubaba-Data.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/ddb94fa1-dda0-f24b-cd87-74d312f9d9c2.png)

列名だけだとデータが何もないと見なされて計算式を書こうにも計算式がNULLになってしまったのが第一の落とし穴でした。。。
なので何でもいいのでデータを入れておきましょう。


#ユーザーからの名前入力を受け付ける

###パラメーター準備
入力を受け付けるといえばパラメーターですので、データ型は文字列のパラメーターを用意しました。
ここで入力された[名前]を、次のステップでLength取得したり、ランダム関数でN番目の文字を取ってきたりと活用します。

あとあと気づきましたが、ここで「山田　太郎」という風にユーザーがスペースを入れて入力してしまうと、
出力の段階で湯婆婆から3文字目の空白の名前をもらってしまう可能性があります。

###空白の処理

以下のように、半角または全角のスペースが含まれている場合はそれを削除する計算式を書きました。
![Handling1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/da066451-12f8-eaf3-913d-0543be413dd3.png)

###名前の長さを整える

後述しますが、Tableauで使用できるRAMDOM関数は0-1の小数点第三位までの浮動小数点を出力できます。
このRANDOM関数は公式にサポートされていないこともあり、あまり柔軟には使用できません。
（本当は名前の文字列に応じてRANDBETWEEN的に乱数を発生させられるとよかった。まあそもそもTableauは可視化のツールですしね^^;）

なので苦肉の策としてユーザーからの入力は9文字以下であるという前提のもと、RANDOM関数を使って0-9の数を発生させ
**入力された名前も9文字を超えるよう増幅させる。**を採用しました。

Tableauはプログラミング言語のようにループ処理もできないので、ここはもう力業です。。。
![RepeatName.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/d53f703b-9050-99e3-0bfc-cc184fbb9948.png)


#RANDOM関数から0-9の乱数を整数で取得する

RANDOM関数は触っていただくとわかりますが、返り値は0-1の間で、形式は0.XXXです。（たぶん）
ということは一律に1000倍して、一番左の桁（右の桁でも可）を取れば、0-9の乱数を整数で取得できるのでは？と思いました。

![0-9の整数を取得.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/319b258b-4e2a-fccb-d97c-f92fa2e57bac.png)

#入力された名前からN番目の文字を取得する

いよいよ湯婆婆を実装するところに入ります。

まずそもそも名前のパラメーターで入力された文字数が1だった場合には、その名前を出力するしかないので[名前]を返します。
それ以外は、[名前を繰り返し]で9文字以上に整えた文字列の中から、0-9の乱数を指定し、頭から数えてその番号の文字を返します。

![New Name.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/c3b8f644-a9ac-b308-c0e2-9f99fb187fb9.png)

入力文字数はLEN()関数で取得できます。

![Length.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/b56e09e5-9e65-46ff-0d30-b096e9801f48.png)


#体裁を整える

湯婆婆のセリフは、計算式で書いてあります。
Tableau Publicよりワークブックをダウンロードできますので作り方が気になる方は見てみてください。

問題は、まだ何も名前入力していない段階から、湯婆婆の後半のセリフが丸見えになってしまうということです。。

![Original.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/36f005db-e895-dd11-d920-77b8b24663b3.png)

ここは、パラメーターへの入力がNULL（何も入力されていない）か否かを判定する計算式を作り、
それをフィルターに入れることで解消しました。↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/f47b7f95-1342-f2c8-9b98-35b89d64c5d0.png)

![filter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/27159cdc-c3f5-6cd2-b08e-3728a154e28b.png)

これで、名前を入力したときに初めて湯婆婆の後半のセリフが表示されるようになりました♪

![Yubaba-with-Tableau.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/d1e0f17c-f148-ed69-1120-5d4c0a7ffa6d.gif)


#まとめ

データ可視化という本来の用途ではありませんが、
やろうと思えばTableauでもプログラミングっぽいこともできるんだなということが分かりました。

計算式をもっとブラッシュアップすることができるかもしれませんが、一旦動きましたのでよしとします。笑
なお、この記事で紹介したTableauワークブックは[私のTableau Public](https://public.tableau.com/profile/yuri.goto4888#!/vizhome/Tableau_16054083628020/sheet5)よりダウンロードできますので興味ある方は遊んでみてください。

面白いネタを提供してくださった@Nemesisさんに感謝です！