Tableau + R 連携で知っておきたいこと

Version 4

    Tableau と Rを連携をやってみて、Rserveとの接続はできた! サンプルも動いた!というところまでは割りと簡単にたどり着けるのですが、次のステップとして実際のRのコーディングを行う際に、知っておくべきポイントがいくつかあると感じましたのでここで共有させていただきたいと思います。 Rのコマンドも打ちながら理解していきましょう。 添付ワークブックもご参考ください。

     

     まず前提知識として TableauRの連携について日本語の資料としては、こちらのブログから読み始めるのがお奨めです! TableauRを連携させる意味や、Rをセットアップして実際にTableauから利用するところまでインストラクションに従って読み進めれば簡単にできました。

     

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

    http://tableaujpn.blogspot.jp/2016/08/tableaur.html

     

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

    http://tableaujpn.blogspot.jp/2016/08/tableaur_12.html

     

    TableauR連携について、やはり、Rを使ってコーディングするデータサイエンティストと、Tableauを使ってビジュアライズするデータアーティストがそれぞれ個別に作業進められるというところに大きな意味があると感じました。

     

    TableauR連携では下の流れで処理が行われます。

    1.TableauからRサーバーに入力データを送る

    2.事前に書かれたRスクリプトにしたがってRサーバーに計算をさせる

    3.TableauRサーバーから計算された結果を受け取って新しいメジャーとする

    ここで、実行されるRスクリプトは計算フィールドの中に書き込むので、正直なところ、中に何が書かれているのかTableauを使うデータアーティスト(Tableauを使う人なみんなアーティスト!)は意識をしなくても構いません。

    Rのコーディングについては、Rを使うデータサイエンティストに任せて、データアーティストはビジュアライゼーションに注力すれば良いということになります。

     

     

     とはいえ、TableauRを連携する上で、データサイエンティストとデータアーティストの間で最低限分かり合っておくべき仕組みがあるので、そのあたりに触れておきたいと思います。

     

    ものすごく簡単なサンプルでTableauRのデータ入出力の仕組みを解説してみます。

    Rに”足し算をさせるだけ”のサンプルです。

     

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

     

     

    TableauからRのスクリプトを実行するには、SCRIPT_*関数を使って計算フィールドを作成します。ここでは、計算フィールド"R_ADD_VALUE" を作成し以下のように入力します。

     

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

     

    SCRIPT_INT     // Rの出力が整数であることを期待します。

    (

     

    //Rのスクリプトを書きます Tableau から受け取る入力を ”.arg1 , … ”とします

    '.arg1 + .arg2',  

     

    SUM([VALUE1]) , SUM([VALUE2])

    //実際にRに送るTABLEAUでの列名を指定します

     

    )

     

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

     

    結果は下のようになります。

    VALUE1 と VALUE2 を足して表示させる簡単なものです。

     

    >> Rコンソール

    { ※1. 同じ型のデータをいくつかまとめて並べたもの: Rでベクトルを作成する基本的な関数は c()

     

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

     

    ここで、ID列を取り去ってみると、NAMESUM合計された値がRに渡されていることがわかります。

    これは、ドリルダウン・アップをしたときに分析の切り口に応じてRに渡される入力値も動的に変わるので有用です。

    TableauとR連携のデータ送受信についてはこちらのBlogに詳細が記載されています。

    Tableau and R Integration

     

     

     

     今度はもう少しリアルなケースとしてk-meansクラスタリングを取り上げ、中で何をしているのか考察してみましょう。

     

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

     

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

     

    Rのコンソールで 

    >iris

    と打てば iris のサンプルデータを見ることができます。 3種類のアイリス(setosa/versicolor/verginica) の花の花弁とガク片の長さ、幅の4種類のデータ標本を取ったもので、Fisherの研究で使われた有名なデータです。

     

     

    k-meansクラスタリング(K平均法)の詳細については、他の文献を参照いただきますが、ザックリと書くとこんなイメージになります。

     

    1.各点にランダムにクラスタを割り当てる(いくつのクラスタに分けるか指定する)

    2.クラスタの重心を計算する。

    3.点のクラスタを、一番近い重心のクラスタに変更する

    4.変化がある限りは 2. に戻る。

    5.変化がなければ終了し、標本がクラスタに分類される。

     

    こちら参考にさせて頂きました↓

    http://tech.nitoyon.com/ja/blog/2009/04/09/kmeans-visualise/

     

     

    以下のコマンドをRコンソールから実行してみます。

     

    # iris の1列目から4列目のデータをベクトルとして格納

    .arg1 <- iris[,1]  

    .arg2 <- iris[,2]

    .arg3 <- iris[,3]

    .arg4 <- iris[,4]

     

     

    #データフレーム(※2)にまとめる

    d<-data.frame(.arg1,.arg2,.arg3,.arg4)

     

     

    cluster <- kmeans(d,3) #k-meansの実行。クラスタ数は3に指定。

    cluster #k-means の結果表示

     

     

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

    result #クラスタリング結果の表示

     

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

     

     

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

     

     

     

     

    + これと同じことをTableauからデータを与えてRに実行させてみたいと思います。

     

     

    まずはデータの準備から。

     

     

    > d<-iris

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

     

     

    でirisのデータがCSVに落とせますので、これをTableauから読み込みます。

    列の名前は図のように指定します。

     

     

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

     

     

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

     

     

    SCRIPT_INT(

     

     

    '

    // Rのコマンド始まり

    set.seed(42); //結果が同じになるように乱数のシードを設定

     

     

    d<-data.frame(.arg1,.arg2,.arg3,.arg4)

    result <- kmeans(d, 3);

    result$cluster;

     

     

    // Rのコマンド終わり

    '

    ,

    SUM([Petal.Length]), SUM([Petal.Width]),SUM([Sepal.Length]),SUM([Sepal.Width])

     

     

    )

     

     

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

     

     

     

     

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

    そしてこの関数の結果が整数型のベクトルとなることも理解できると思います。

    クロス表にすると、各標本データに対して計算されたクラスター番号が割り振られているのが分かります。

    ここまでくれば、あとはTableauの世界で自由にビジュアライゼーションを行えます。

    花の花弁とガク片の長さ、幅の4種類のデータ標本を散布図にしてクラスターを色にドラッグして見ましょう。標本が3種類のクラスターに分類されていることが分かります。

     

     

     

     

    実際の花の種類の分類と比べて見ます。

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

     

     

     

     

     

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

     

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

     

    今回はTableauR連携の仕組みを理解するためにk-meansを取り上げてみましたが、

    実はTableau 10 ではk-meansクラスタの機能をTableau自体が既に取り込んでいるんですね。

     

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

     

    また、R自体も充実した可視化のライブラリを持っているのですが、高度なプログラミングが必要でこんなに簡単にドラッグアンドドロップでハッとするようなレポーティングが一瞬で誰にでも作れるというわけではないのが現状です。

     

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

     

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

     

    ご指摘、コメントよろしくお願いします。

     

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