Tableau Prep Builderのサンプリングについて

Tableau Prep Builderは手元でデータの前処理をするにとても便利です。

https://www.tableau.com/ja-jp/products/prep

特にプロファイル画面にてデータの概要がステップに一眼でわかるのは大きな魅力です。前処理が正しくできているのか確認できたり、この画面に表示されてる値をもとにフィルター処理や名寄せなども行えます。

![スクリーンショット 2023-07-30 9.50.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200471/912eb465-d2e9-8a96-2460-dfd5690f3a88.png)

ただし読み込みデータの量が大きいとパフォーマンスの劣化を防ぐために「サンプリング」が行われます。これによりプロファイル画面に全てのデータの情報がでてこなくなるため、戸惑ってしまうことがあります。

![スクリーンショット 2023-07-30 9.53.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200471/e790e408-5809-0d88-7137-59e13b229676.png)

この記事ではサンプリングの発生する条件や、サンプリングを発生させないためのコツ、サンプリングを避けられない時の対象方について書いてみます。

# どれくらいのデータ量でサンプリングが発生する？

こちらの記事によると**列数**と**データ型**によってサンプリングサイズが決定され、データソースの行数がそのサンプリングサイズを上回るとサンプリングが発生するようです。

https://bit.ly/3OhqgEj

記事によるとほとんどのデータ型において**概ね４列のデータで100万行、8列だと50万行、１６列だと25万行となるようです。** サンプリングのアルゴリズムはもっと複雑とのことなので例外はあると思いますが、参考になると思います。

>As you may have guessed, the algorithm that determines the maximum number of rows is rather complex. We can use a heuristic to describe its behavior. In all cases, the number of rows is capped at roughly 1 million. For most data types, ***your data set can have up to 4 columns and still maintain the 1 million row limit. If your data set has 8 columns, then the maximum number of rows is halved to 500,000. If your data set has 16 columns, then the maximum number of rows is halved again, to 250,000, and so on.*** To increase the maximum number of rows, you can remove unnecessary columns in the Input step. 


# サンプリングを防ぐにはどうするか？

## インプットステップでデータを減らす

インプットステップにてデータ量を減らすのが正攻法です。不要な列を削除しフィルターで行数を減らします。[上記の記事](https://bit.ly/3Yklqe8)でも示されています。(以下画像は当該記事より抜粋)

- 不要な列を削除する。以下の通り列を削除することができます。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200471/3bca8dd6-ab12-4e2d-5b8e-38def3efe9da.png)

- 不要な行を削除する。インプットステップでフィルターをかけることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200471/4f9e3b9d-a337-faf0-5b64-4d8b3e4a0d7f.png)

## データ型をパフォーマンスのよいものに変える（未検証）

ここからは試しておらず推測の域を出ないのですが、こういう方法もあるのではないかというのを書いています。

サンプリング数はデータ型と列数で決まるようなので、もしかすると型を変換することでサンプリングの閾値を上げることができるかもしれません。以下のホワイトペーパーにある通り文字列や日付よりも整数やブールの方がパフォーマンスが良いです。よりパフォーマンスの高い型に変換することでサンプリングの上限数が増えるかもしれないです。

https://www.tableau.com/ja-jp/learn/whitepapers/designing-efficient-workbooks?_gl=1%2A1jzxn8d%2A_ga%2AMzkzMzUxOTAzLjE2ODM1NDA1MTA.%2A_ga_8YLN0SNXVS%2AMTY5MDY3NDQ2MS43MC4xLjE2OTA2NzY0OTMuMC4wLjA.&_ga=2.147940279.1843195928.1690674865-393351903.1683540510&ssologin=true&check_logged_in=1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200471/4d37e9ac-1ea1-a131-108d-acdaa128529d.png)

## 「行数」の設定を変更する（未検証）

ちなみに2022.4以前では「行数」設定のオプションに「すべてのデータを使用」というオプションもあったのですが、2023.1以降ではなくなっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200471/3dd3f8b1-a5c7-0319-8060-e9bb49c9aff9.png)

代わりに「最大値（遅く）」というオプションが追加されました。「自動」よりもサンプリング上限数は大きくなると思うので、もしかすると全て読み込めるかもしれません。

ちなみに以下のtweetの通り最大値は「1,048,576」で固定されているかもしれません。1つのデータソースで簡易的にしか検証していないので確証は持てませんが。。。

https://twitter.com/unbosoms/status/1685459497643606018?s=20

最初に[紹介した記事](https://bit.ly/3OhqgEj)でも以下の通り全てのケースで約１００万行にキャップされているとあるので、この約100万行というのが1,048,576のことなのかもしれません。
>In all cases, the number of rows is capped at roughly 1 million.

Twitter(今はXか)でコメントいただきましたが、１,０２４×1,024=1,048,576なので、サンプリングの上限をここに設定しているように見えますね（キリの良い数字なので読み込んだデータに依存しない固定値な気がします）。

https://twitter.com/kazuya_araki_jp/status/1685492896135528448?s=20

別の手段として「行数」の「指定」オプションを使ってデータソースのデータ量より大きな値を指定することで全てを読み込むことはできるかもしれません。とはいえパフォーマンス劣化が発生することは間違いないと思うので注意が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200471/b249cb32-56ea-a013-58aa-d920eb9b9ab3.png)

# サンプリング中にステップの途中で正しさを確認するには？

## 一度出力ステップをいれてファイル出力して確認する
少し面倒ですがこれが確実な方法だと思います。

ちなみに「Tableau Desktopでプレビュー」という機能もあるのですが、こちらではサンプリングされたデータしか出力されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200471/b85d350e-2a75-61da-ad6e-e64c1e2ab982.png)

ちなみに動作検証した時のスクショがこちら。もともと６行あるデータについて、あえてサンプリングの行数を3行にしていしてTableau Desktopでプレビューをしてみたときの様子です。3行しか表示されていないことがわかります。ここで全ての行が表示されるとありがたいのですけどね...

![スクリーンショット 2023-07-28 21.44.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200471/d52a40c8-a3d1-c839-623e-2e40206f219c.png)

## 「行の選択」オプションを「ランダム」にする

デフォルトでは上からN行がサンプリングされますが、ランダムサンプリングにすることもできます。ランダムサンプリングの方が本来の全データに近いデータになると思うので扱いやすいかもしれません。。ただしパフォーマンスが劣化しますし、それでも全てのデータが表示されるわけではないので注意して使う必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200471/19532380-faa5-fd50-0967-ac038f46acbf.png)

# おわり

Tableau Prep Builderを触り始めた人はサンプリングの存在を知らずに戸惑うことが多いと思います。そういった人にとって参考となる記事になれば幸いです。