約2年ぶりにTableau DesktopのR連携について勉強します。
今回は基礎としてR連携の動作について書きます。
ちなみにR連携は表計算の知識が必須のため、表計算の理解に自信のない方は以下の記事もご覧頂ければと思います。
また今回使用したWorkbookは以下からダウンロードできます(Tableau PublicではRが動作しないため)。
TableauのR連携の動作について
Rのセットアップ方法およびSCRIPT_*関数の構文は本記事では割愛します。以下の記事などをご参照ください。
細かい動作は以下の記事に書いてあるのですが、実装上重要な点のみを述べます。
TableauはRに集計データを渡している
R連携の関数(SCRIPT_*関数)は表計算として動作する(これが上記の理由)
RにはTableauの表計算で設定されたpartitionで分割されたデータが、ベクトルとして送られる
個人的に特に重要なことは1番目かなと思います。
統計分析では基本的に(整形後の)粒度が細かいデータをそのまま関数に投入、ということが多い印象ですが、TableauではTableau上で集計されたデータが関数に投入されます。
簡単な例を見てみます。Superstoreのデータの簡単な集計表に対して、以下の計算式を実装しました。
size of vector
SCRIPT_INT(
'length(.arg1)'
, SUM([Sales]))
sum of sales with R
SCRIPT_REAL(
'sum(.arg1)'
, SUM([Sales]))
TableauはRに、表計算のPartitionで区切られたベクトルを渡していると書きました。
上記ではPartitionはなし=集計表の全項目がベクトルとして渡されているので、ベクトルサイズは12となります。
そしてsum of sales with Rでは、その12行を含むベクトルのsum()を求めるため、Tableau上の各集計項目でのSUM(sales)の総和となります。
(つまりWINDOW_SUMと同じ)
さて、SCRIPT_REALを使用した上記2計算式の、表計算の設定を以下のように変えてみます。
この場合、表計算はCategoryごとに再計算される=PartitionがCategoryのため、単純に12行のベクトルをCategoryで区切る→4行のベクトルが3つ生成されます。
そして実際の計算結果が以下です。
したがってR連携の際に「何を関数の入力にするか」は「Tableau上での集計粒度(LOD)と表計算の設定(Partition)」で決まります。
(ここが本当に重要です)
別の例を考えます。式中の[# of clusters]は整数型パラメータです。
(ちなみにパラメータを計算式に渡したい場合、STR()で文字列型にしてからスクリプト中に書き込みます)
kmeans
SCRIPT_INT(
'data = data.frame(.arg1,.arg2);
model = kmeans(data,' + STR([# of clusters]) + ');
result = model$cluster'
,SUM([Sales]),SUM([Profit]))
上記の例ではStateごとのSUM(Sales), SUM(Profit)を元にしたデータを使用したk-meansクラスタリングを実行しています。
表計算はStateを使用して実行させているので、ベクトルサイズは49であり、その49要素をもつSalesとProfitのベクトルを使用してk-meansを実行しています。
ところで「各Stateごとの、OrderごとのSalesとProfitの分布をクラスタリングしたい」場合には、どのようにすればいいでしょうか。
要は以下のようなものを作成したい場合です。
この場合kmeans()に入るベクトル(行列)の行数は、各Stateに含まれるOrder数になります。
そのような行列を作るためには、最小のデータ粒度はOrder単位、PartitionはStateである必要があります。
したがってViz-LOD(TableauのSheet上での集計粒度)にはOrder IDとStateの両方が必要になります(StateはPartitionとして使用するため)。
イメージとしては以下です。
実際にベクトルサイズを見てみると、例えばAlabamaでは34オーダーあるためサイズが34となります。
また入力ベクトルのサイズが各Stateごとに異なっていることは、そのままkmeansの実行がState内のOrderIDごとに行われていることを意味します。
上記設定で「Order IDごとの集計値を使用した、各Stateにおけるk-means」が実装できるので、下図のように各StateごとのOrder IDに対するkmeans実行結果を可視化できます。
(可視化にPanel Chartを使用していますが、本題ではないので省略します)
(またクラスタ数よりも少ないOrder数のStateを除外するため、FilterでOrder数10以下のStateを除外しています)
ということで繰り返しになりますがTableauのR連携では、「何を関数の入力にするか」は「Tableau上での集計粒度(LOD)と表計算の設定(Partition)」で決まります。
したがってViz-LODと表計算設定へのイメージがしっかりしていれば、そんなにR連携は怖くなさそうですね。
ちなみにベクトルサイズを確認する計算式を何度か使用しましたが、R実装の際は入力のベクトルサイズを都度確認しておくと良いと思います。
最後に
今回は1回目なので基礎をお話しました。
次回から応用例を書いていきます。
ご質問等はTwitter、Linkedinへよろしくお願いします。それでは。