Tableau + R 連携を使いこなそう! その2 - K-meansクラスタリングに挑戦



RとTableau連携を使いこなしたい! の2回目です。

前回は簡単な足し算をRに実行させてみましたが、今回はもう少しリアルなケースとしてk-meansクラスタリングを取り上げ、Tableau+R連携の中で何をしているのか考察してみましょう。

まずはRを使ってk-meansの意味するところを理解します。

Rに含まれているirisサンプルデータ(アイリスの花弁の標本データ)を使ってk-meansクラスタリングを行ってみましょう。 アイリスの花弁とガク片の長さ、幅が分かればk-meansクラスタリングを使ってその花の種類ガ大体わかる・・・というのが主旨です。

3種類のアイリス(setosa/versicolor/verginica) の花の花弁とガク片の長さ、幅の4種類のデータ標本を取ったもので、Fisherの研究で使われた有名なデータセット iris を利用しましょう。









Rのコンソールで 
>iris
と打てば iris のサンプルデータを見ることができます。 


> plot(iris)


と打てば散布図が表示されます。
k-meansクラスタリング(K平均法)の詳細については、他の文献を参照いただきますが、
ザックリと書くと標本の属性値から標本を意味のあるグループに機械的に分類するという仕組みです。
この場合は、アイリスの花弁とガク片の長さ、幅 から標本を属性の似ているグループに分類します。

以下のコマンドをRコンソールから実行してみます。
※ K-meansを利用できるように事前に"plyr"パッケージをインストールください。
install.packages("plyr")

# iris の1列目から4列目のデータをベクトルとして格納
.arg1 <- iris[,1]
.arg2 <- iris[,2]
.arg3 <- iris[,3]
.arg4 <- iris[,4]

#データフレーム(※)にまとめる
 d<-data.frame(.arg1,.arg2,.arg3,.arg4)

{※ 数値ベクトル、文字ベクトルを集めた2次元行列 data.frame(ベクトル1, ベクトル2・・・で作成する。)

cluster <- kmeans(d,3) #k-meansの実行。クラスタ数は3に指定。<- d="" font="" k-means="" kmeans="">
cluster #k-means の結果表示

result <- km$cluster #クラスタリング結果の抽出
result #クラスタリング結果の表示


これで150の標本が3つのクラスターに分類され、それぞれに1,2,3というクラスター番号が割り振られているのがわかるかと思います。

---------------------------------------------------------
次に、これと同じことをTableauからデータを与えてRに実行させてみたいと思います。
まずはデータの準備から。

> d<-iris
> write.table(d,file="c:/iris")

でirisのデータがCSVに落とせますので、これをTableauから読み込みます。
列の名前は図のように指定します。

次にSCRIPT_INTを使ってRスクリプトを含む計算式"Cluster" を作ります。

---- 計算式の中身 ----

SCRIPT_INT(
'
set.seed(42);
d<-data.frame(.arg1,.arg2,.arg3,.arg4)
result <- kmeans(d, 3);
result$cluster;
', 
SUM([Petal.Length]), SUM([Petal.Width]),SUM([Sepal.Length]),SUM([Sepal.Width]))


---- ---- ---- ---- ---- 

Tableauからデータを入れるところ以外は先ほどRコンソールから実行したコマンドとほとんど一緒なので、今度は、中で何をしているか気持ちは分かるような気がしませんか??

そしてこの関数の結果が整数型のベクトルとなることも理解できると思います。
クロス表にすると、各標本データに対して計算されたクラスター番号が割り振られているのが分かります。
ここまでくれば、あとはTableauの世界で自由にビジュアライゼーションを行えます。
花の花弁とガク片の長さ、幅の4種類のデータ標本を散布図にしてクラスターを色にドラッグして見ましょう。標本が3種類のクラスターに分類されていることが分かります。
※ K-meansを利用できるように事前に"plyr"パッケージをインストールください。

install.packages("plyr")


実際の花の種類(Setosa,Versicolor,Virginica)の分類と比べて見ます。
ほとんど変わりませんね。k-meansのクラスタモデルが実際のアイリスの花の種類をうまく分類できていることが分かります。


応用編として、パラメータの数を自由に指定できるようにすれば、より細かに標本を分類することができますし、もしかしたら、同じ品種の中でも新たなクラスターを発見することができるかもしれませんね。Tableauであればマウスを当てればすぐに何番の標本がどのクラスターに属するか一発でわかるので便利ですよね!

------------------------------------------------------------------------------------------------

今回はTableauR連携の仕組みを理解するためにk-meansを取り上げてみましたが、
実はTableau 10 ではk-meansクラスタの機能をTableau自体が既に取り込んでいるんですね。

ただ、k-means以外のモデリング技法(階層型クラスタリング、EMアルゴリズム、はたまた今話題の機械学習などなど・・・)Rが提供する先進的なアルゴリズムを利用するには、これからもR連携が必要になります。

Tableauだったら、可視化のプログラミングを考えることなく、データからもっと簡単に自由な発見を得ることができるのがスゴイところだと思います。

Tableau+Rの連携でデータサイエンティストとデータアーティストのコラボレーションが進んだらオモシロイことが起きそうですね。

以上、ご参考になれば幸いです。

※ ワークブックのダウンロードはこちらからどうぞ。(文末にワークブックの添付があります)
Tableau Community Japan: 
Tableau + R 連携で知っておきたいこと
https://community.tableau.com/docs/DOC-10017

※ 尚、Tableau+R連携におけるRのコードスクリプティングについては、サポートの範囲外となりますので、ご了承ください。





Tableau + R 連携を使いこなそう! その1 - 簡単な足し算に挑戦









皆さんこんにちは bashii と申します。





今回、初めてこちらのブログに投稿させていただきます。
よろしくお願いします。

データサイエンスが注目される昨今、RとTableau連携を使いこなしたい! と考えてる方もたくさんいらっしゃると思います。

TableauRを連携させる意味や、Rをセットアップして実際にTableauから利用するところまでインストラクションについてはこちらのブログで紹介されているので、是非最初にこちらをご覧になってください。

TableauでRをつかってみよう!(準備編)

TableauでRをつかってみよう!(実践編)

Tableau Rを連携をやってみて、Rserve(Rサーバー)との接続はできた! サンプルも動いた!というところまでは簡単にできるかと思います。さて、次のステップとして実際にRのコーディングを含む計算フィールドを作成することになりますが、その際に知っておくべきポイントがいくつかありますので、今回はそのあたりをご紹介していきたいと思います。
実際にRの気持ちになって考えられるよう、Rコンソールからコマンドを打ちながら理解していきましょう。 

まず、Tableau Rを連携の基本的な仕組みについて図に表してみました。
TableauとRは以下のように連携して処理を行います。

1.TableauからRサーバーに入力データを送る
2.事前に書かれたRスクリプトにしたがってRサーバーに計算をさせる
3.TableauRサーバーから計算された結果を受け取って新しいメジャー(またはディメンジョン)とする
まずは、簡単なサンプルでTableauRのデータ入出力の仕組みを解説してみます。
Rに「足し算をさせるだけ」のサンプルです。

下のようなデータを読み込みます。


TableauからRのスクリプトを実行するには、SCRIPT_INT関数 (Rからの出力が整数型の場合)や、SCRIPT_REAL関数(Rからの出力結果が実数型の場合) を使って計算フィールドを作成します。 
さて、VALUE1とVALUE2を足すための計算フィールドを作ってみましょう。

整数の足し算なので SCRIPT_INT() 関数を使って "R_ADD_VALUE"という計算フィールドを以下のように作成します。

-------  計算式"R_ADD_VALUE"の中身 -------
















VALUE1 と VALUE2 を受け取り、それぞれ.arg1 と.arg2 に代入し、足し算した結果を返します。


結果は下の図の右端ようになります。
Tableauからの入力はRに対してベクトル(ザックリ言うと、データをいくつかまとめて並べたもの)として渡されます。

同じことを今度はRの気持ちになって、Rのコンソールからも実行してみましょう。

Rでベクトルを作成するには c(10,20,30,40,50) のように書きます。

実際にRコンソールから以下を実行してみましょう。



ここで、ポイントとして、SCRIPT_* の引数に列を指定するときは、何らかの集計を掛けるということです。この理由としてはSCRIPT_* が内部で表計算を用いていることに起因するのですが、とりあえず SUM() か ATTR()を付けてあげないといけません。入力がユニークな行であればSUM()でもATTR()でも実は結果は同じになります。

ここで、ID列を取り去ってみると、NAMESUM合計された値がRに渡されていることがわかります。
これは、ドリルダウン・アップをしたときに分析の切り口に応じてRに渡される入力値も動的に変わるので有用です。

以上、ご参考になれば幸いです。

※ ワークブックのダウンロードはこちらからどうぞ。(文末にワークブックの添付があります)
Tableau Community Japan: 
Tableau + R 連携で知っておきたいこと
https://community.tableau.com/docs/DOC-10017

※ 尚、Tableau+R連携におけるRのコードスクリプティングについては、サポートの範囲外となりますので、ご了承ください!!