Tableau Prep Builder の使い方 - 欠損値の補完 (How to handle missing data)

#欠損値の補完
Qiita で "欠損値" というワードで検索すると様々な方法がでてきます。
https://qiita.com/search?q=%E6%AC%A0%E6%90%8D%E5%80%A4
が、今日は敢えて Tableau Prep Builder でやってみます。

##サンプルデータ
|日付|A|B|C|D|
|---|---|---|---|---|
|2019/4/1|100|-|90|400|
|2019/4/2|40|30|100|100|
|2019/4/3|30|40|-|300|
|2019/4/4|10|60|40|50|

こんなデータを用意してみました。A ~ D のカテゴリで、日次で売上データをまとめているクロス集計表です。
"-" となっている箇所はなんらかの理由でデータが欠損しているということにしておきましょう。

##Tableau Prep Builder で欠損値を NULL に置換してみる
上記のサンプルデータを Excel ファイルとして、Tableau Prep Builder に取り込みます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/23e6b1bf-8ee1-d2ef-18ac-4dfdd38fd22e.png)
"ピボットの追加" を選択して A ~ D を属性値に変換します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/b890e321-bc1d-a59c-c948-f355169cdb74.png)
ピボットの名前 -> カテゴリ, ピボットの値 -> 売上 としてカラム名を変更します。さらにステップの追加をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/c5f562e5-aa4d-bfa9-83e8-833f3f8da99e.png)
売上が "-" となっている箇所で右クリックします。Tableau Prep Builder では "値の編集" で任意の値に置換をすることもできますし、"NULLで置換する" を選ぶこともできます。ここでは NULL に置換してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/cc5a4f28-126b-40e8-6df2-889f5d9c963c.png)
左上にある "Abc" アイコンは "売上" 列が文字列型であることを意味しています。本来数値型であるべき列ですが、さきほどまで "-" が含まれていたため文字列として認識されてしまっています。"Abc" アイコンをクリックするデータ型を変えることができます。ここでは 数値(整数) としておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/e130dbbb-a54d-ecfa-4c99-302f9ed39488.png)
これで "売上" 列を数値型として扱うことができました。
##統計値を使って欠損値の補完がしたい
さきほどの続きです。カテゴリごとに平均値や中央値を計算して、それを欠損値の補完に使いたいです。さてどうするか。
まずはカテゴリごとの統計値を取得するために、集計を行います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/63bf4919-c380-6fc6-b5cc-bf22cd9857ef.png)
"カテゴリ" をグループ化したフィールドへ。"売上" を集計フィールドにドラッグ&ドロップします。(矢印手書きでｺﾞﾒﾝﾅｻｲ)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/f6235cdd-7aac-2981-8ba3-d333f669c798.png)
Tableau Prep Builder ではデフォルトの集計方法は 合計 (SUM) となります。 SUM をクリックすると他の集計方法に変えることができます。今回は中央値としておきましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/b358828d-4737-6418-af55-0ccf12318111.png)
これでカテゴリごとの中央値を取得することができました。このステップを一個前のステップにドラッグ&ドロップして結合を行います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/252e8344-e9bd-8fb3-5b5a-86e337e50590.png)
こんな感じで結合ができたはずです。カテゴリ列は重複しているので片方はフィールドの削除で消しておきましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/80657a1c-56d5-36fa-a33c-1c856ef20c31.png)
"売上" 列はもともとあった欠損値を含む実績列です。"売上-1" はさきほどの手順で計算した中央値となります。この二つの列をマージすることによって、データが欠損していた箇所に中央値を補完することができます。"ステップの追加" をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/8ca00e98-7505-1e8d-5298-196006832af7.png)
列のマージはドラッグ&ドロップで行います。"売上-1" 列をつかんで "売上" 列に投げます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/afd5afc6-dca8-5239-e068-83e10c0b0eee.png)
以上で欠損値をカテゴリ内における中央値で補完することができました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/7324b927-a00c-43c9-d188-85ea629b0f9a.png)

#まとめ
スクリプト一発、、とまではいきませんが、Tableau Prep Builder を使うことで可読性の高い状態で欠損値の補完を行うことができました。
各ステップには日本語で説明を書けるようになっているので、あとで見た際にわかるようになるべく丁寧に記述しておくのがおすすめです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246284/826f30ad-ac8e-10d9-ff29-3781481f3228.png)

#関連リンク
[Tableau Prep の使い方 - LOD 表現的な計算をしてみる](https://qiita.com/tab123/items/744af3de293c4af1610a)
[Tableau Prep の使い方 - コマンドラインによる自動化](https://qiita.com/tab123/items/e7a37a683ad4bce234c5)
[Tableau Prep Builder の使い方 - Index 列 (行 ID 列) を追加する](https://qiita.com/tab123/items/14b8b8803c903a0006d0)