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のコードスクリプティングについては、サポートの範囲外となりますので、ご了承ください!!






傾向線③:スモールマルチプル×統計値

Nanaeです。

傾向線シリーズの最終回です。
第一弾では、Tableauの傾向線はどれくらいインパクトがあるのか、第二弾では、傾向線を出すだけでなく見るべき指標も確認しましょう、とお伝えしました。ラストの第三弾では、第一弾と第二弾でやったことを組み合わせて、Tableauならではの見方をご紹介します。

まずは気になる2つのメジャーを発見し、そのメジャー間の関係を様々なディメンションごとで切り分けるスモールマルチプルを作ります。ここまでは第一弾の内容です。



そして各散布図のR-2乗値を把握します。R-2乗値は、R連携してもいいですが、ここでは計算式を書いてみます。


SQUARE((1 / (Size()-1))*Window_Sum(((Sum([売上]) - Window_Avg(Sum([売上])))/Window_Stdev(Sum([売上]))) *(Sum([数量]) - Window_Avg(Sum([数量])))/Window_Stdev(Sum([数量]))))

これを色に入れます。これで一気に各散布図のR-2乗値が把握できるようになります。違いをわかりやすくするためにステップドカラーにしてみました。

これでマウスオーバーしなくても一度に、分布、傾向線の向き、R-2乗値の大きさがわかりますね!


青色である通常配送の家具と家電は、R-2乗が大きいのでこの傾向線のあてはまりがよく、マウスオーバーしてp値を見ると0.0001未満ですのでたまたま出てきた線でもなさそうです。
紫色である3つの散布図も、R-2乗がある程度大きく、p値は0.0001未満ですので、青と一緒に検討してもよいかもしれません。
青と紫の5つの傾向線を比較すると、通常配送の家具は少ない数量でも売上が大きめかもしれないなどと読み取れます。

R-2乗の行列を組み合わせてもわかりやすいと思います。


以上、計3回の傾向線特集でした。
Tableauは2変数間の関係を見るとき、さまざまなディメンションで切り分けてみていくことが得意です。さらにR-2乗値やp値も同時に見てみてください。そしてそれらを組み合わせて活用する方法の1つをご紹介しました。

Nanae

傾向線②:その傾向線、本当に使って大丈夫??

Nanaeです。こんにちは。傾向線第2弾で、今回は統計側の話題です。

行と列に連続値が入っているチャート、例えば散布図なんかを作ったら、Tableauではドラッグアンドドロップだけで傾向線を引けますよね。傾向線は一瞬で上がり下がりの傾向がわかるのでよく使われる方も多いと思います。そのとき、傾向線の傾きだけですぐに「これは正の相関だな!」とすぐに解釈してませんか!?それ、実は危険かもしれません。そこで今回は、傾向線を引いたときにTableauが出してくれる線や値から、その傾向線を使っても問題ないのか確認してみましょう。

まず、傾向線って何でしょうか。ある変数yを他の変数xによって計算するためのモデルのことです。傾向線をマウスオーバーするとy=ax+bという形で計算式が出てきますよね、傾向線はあの式を描いています。下の例では、yが売上、xが数量で、数量が1個増えると、売上は6349.79円増えるということを意味しています。



でもその傾向線から何かの情報を得る前に、その傾向線をそもそも使っていいのか確認しておく必要があります。傾向線をマウスオーバーすると、式と一緒にR-2乗とP値という値が出てきます。ここが見てほしいポイントです。結論としては、以下2点を満たしているかチェックしてください!ざっくりとした目安になります。

① R-2乗が0.5や0.6程度より大きければOK
②  p値が0に近ければOK

傾向線というのはとにかく無理やりでも出しただけですので、その傾向線ってちゃんとデータをとらえてるんだよね?その傾向線って今回たまたま出てきただけってわけじゃないよね?こんなことを、この2つの値から確認します。

① R-2乗(アールじじょう):データがどの程度モデルから説明されているか?

決定係数とか寄与率と呼ばれます。モデルとデータの関係をみたとき、このモデルはどの程度データを決定(=説明)しているのか、寄与しているか、を表しています。0~1の値を取るもので、値が大きいほどデータはモデルで説明されているよいモデルであり、そのとき各マークは傾向線の近くに集まります。逆に0に近ければ、傾向線とは関係なく散らばります。

じゃあR-2乗がいくつ以上であれば十分だと判断していいか、肝心なところがきっちりと決まっているわけではありませんが、0.5とか0.6より大きければ役に立つと言われています。

② p値(ピーち):その傾向線は偶然できたもの?信頼できるもの?

possibilityのpで、有意確率と呼ばれます。p値が低ければ、この傾向線は偶然ではなく、同じ条件の他のデータで傾向線を出しても、似たような線が得られると考えることができます。

ちなみに、値が小さいほうが良いわけは、こんな流れで考えています。p値とはこのモデルが成立しない確率です。その確率がとても低いってことは、このモデルは偶然できたものではなく意味があるだろう(意味が有る→有意)。という流れです。

ということで、p値というのは、ただの偶然出てきたわけではないことを確認していたんですね。p値は5%か1%より小さければOKです。

まずは傾向線と一緒に出てくるR-2乗とp値の2つを意識すると、より正しく傾向線を扱えるようになると思います!

---Advanced---
さらにもう一歩進めるには、各マークと回帰モデルのズレ(=残差)に偏りがないかも確認したほうがいいです。

残差のデータを得るために、Desktopのメニューから、ワークシート→エクスポート→データ(MSのアクセスファイルになります)に接続します。


ここに入っているデータは、散布図で使った、売上と数量、それから、モデルから算出された予測値と残差です。



この残差が0付近に集中して均等に散らばっていればOKです。どのマークでもモデルとのズレが均等であれば、そのズレは誤差と考えることができるので、このモデルはあてはまりがよかったんだなといえます。

均等にばらついているかみるために残差と数量の散布図と、残差が0付近に集中しているかみるためのヒストグラムを作成しました。


散布図からは、数量が大きくなればなるほど0から遠い位置でプロットされてしまっていることがわかります。よって、数量が少ないときはまだ使えるかもしれないけど、数量が多いときは信頼感に欠けることが読み取れます。理想は、数量がいくつであっても0付近に分布するような散布図です。
ヒストグラムからは0付近に多く出現しているので、OKです。

さらに、実際の売上と、モデルから算出された予測値が近いかどうかも見てみるために、実際の売上と算出された売上を散布図で表しました。y=xすなわち左下から右上に対角線で分布しているので、まぁまぁ予測できていますが、売上が大きくなるにつれて分散が大きくなっていることが読み取れます。もしも予測値が売上とが完全に一致していれば、対角線上にのみプロットされます。



傾向線シリーズ第2弾では、
前半で、
R-2乗から、傾向線はこのデータをうまく説明してるよね?
p値から、たまたま出てきた再現性のない傾向線ではないよね?
後半で、
残差から、モデルの値と実際の値との差は誤差として考えていいんだよね?
ということを確認しました。

気軽に出せる傾向線が、その分析で使うのに本当に適切なのかを判断する方法のご紹介でした!

Nanae



傾向線①:Tableauの傾向線はとっても便利!

Nanaeです。とーってもお久しぶりです。
みんながよく使う傾向線をテーマに、3回シリーズで書いていきます。今回は第一弾です。今回は、Tableauの傾向線の良さを3点に絞ってお話しします。

とにかく簡単!
ご存知のとおり、傾向線を引くのはドラッグアンドドロップするだけです。1秒でできます。操作の簡単さもさることながら、傾向線という名称も誰でもわかるように工夫されています。他の製品だと線形回帰モデルなどと書いてあることが多いですが、そういった専門用語を知らなくても傾向を知るために引く線であるとわかりやすいように考慮されています。

一度に様々な角度から素早く傾向がみられる!
まず、たくさん変数があって、それぞれの変数間の関係性をみたいとき、一気に大きい行列散布図を作れます。散布図同士を比較することも簡単ですね。

散布図と傾向線のかたまりがこれだけ出てくると、気になる散布図をもっと詳しくみてみたくなります。たとえば、利益と数量の散布図を見ると、結構散らばってます。これを地域ごとで分けたらもっとわかりやすい傾向が出てくるかもしれない、さらに出荷の種類ごと、商品のカテゴリごと、いろんな角度で分けて掘り下げていったら何か傾向が出てくるかもしれないと興味が出てくるかと思います。
でもその条件を一つ一つフィルターしながら確認するのは大変すぎます。さらにそれらの結果を並べて比較するのは困難です。。。

Tableauはこのあたり、大得意です!たとえば、1注文ごとの利益と数量の関係を、8地域×3顧客区分×3カテゴリ=72パターンでみてみるとしたとき、Tableauではほんの数秒で以下のように72パターン並べて比較できます。従来のツールと比較すると、これはものすごい時間短縮です!このように深堀が簡単だからこそ、従来わからなかったインサイトも得られます。

このように表しておけば、「四国で家具を買う小規模事業所のお客さんからのオーダーは数量に対する利益が大きい」とか、「中部地方にある大企業のお客さんは、全体的に数量が増えるほど利益が減る(!)傾向にありますが、特に家電はその傾向が強い」とかどんどん読み取れるので、次のアクションや次の分析にスピーディーにつなげていけます。

ちなみにこのように行列型で並べて一気に表現するのはスモールマルチプルと言われる可視化です。ここは従来型の分析ツールとの大きな差の1つです。

インタラクティブ!
Tableauはインタラクティブ性が高いですが、傾向線の場合でも有効です。気になった部分を選択すると、そのマークだけで計算した傾向線がすぐに出てきます。これはインスタント分析と言われるものです。


2015年の後半、事務用品だけたくさん売れるような施策を打っていたとすれば、20157月から12月の事務用品の傾向を確認したくなるでしょう。そのとき、そのマークを選択するだけでピンポイントの傾向線がすぐに出てきます。施策を打った期間は全体と比べて傾向線の上がり度が大きくなっていますね。このように傾向線を引いたら気になったところをどんどん触ってみてください。

傾向線に限らずVizに表現したら選択して変化をみてみる、マウスオーバーしてツールヒントの情報をみてみる、といったことに少しずつ慣れていってほしいと思います。

Nanae

タブローさん

Kaoriです!
みなさん年末はいかがお過ごしでしょうか?
あっという間に2016年も終わりを迎えようとしていますね・・・

最近マメな更新ができておらず、申し訳ないです。
2016年最後の投稿ということで、今回はタブローさんのお話をしたいと思います。
思いのたけをぶちまけたのでよくわかんない感じになってしまった・・・でもきっとTableauってこういうコンセプトなのです。
VizQLの話とか、なぜTableauが生まれたのかとか、これからのロードマップのこととか、やわ~くゆる~くお話調にまとめました。

こんな感じなので、まじめに勉強したい人はこっちを読んでね。

Tableau テクノロジー
http://www.tableau.com/ja-jp/products/technology



さて、でははじまりはじまり~~




むかしむかし 人間は世の中を便利にするためにコンピュータを作りました。
コンピュータは自分が動くためにデータを生むようになりました。
コンピュータはとても便利でしたので、瞬く間にいろいろなところで使われるようになり、たくさんの種類や量のデータが生まれるようになりました。

コンピュータをたくさんの人が便利に使うようになりました。
ですが、データはただコンピュータを動かすために使われ、長い間ただ溜めて置かれるだけの時間が続きました。

しかし、あることに気づいた人間がいました。
データはコンピュータが生んだものなので、これを読み解けばコンピュータをもっと効率的に動かしたり、コンピュータを使ってしている仕事をもっと効率的にすることができるのではないか?ということです。

人間はデータに話しかけました。

しかし問題がありました。
データは人間の言葉を話すことができなかったのです。

最初のうちは、データは少ししかなかったので、データの言葉を勉強した少しの人間が一生懸命データに話しかけて、ようやく答えを得ている状況でした。
しかしデータはコンピュータの発展にともない、どんどん量も種類も増えるようになっていきました。

そうすると、もっとたくさんの人がデータと話したいと思うようになりました。

ほんの少しのデータの言葉が話せる人だけでは足りない。その人はみんなから通訳を頼まれていつも忙しそうです。
また、とあるデータの言葉を話せる人は、データとの会話に夢中になりすぎて、人間の言葉を忘れてしまうことさえありました。
データの言葉を話せないのに、人手不足で無理やり通訳を頼まれた人たちもいました。
この人たちは、通訳が仕事になってしまい、データとお話をして、世の中を便利に、よくしていきたいという本当の目的を忘れてしまう人がたくさん出てきてしまいました。

しかし一度増え始めたデータは、止まることを知らず際限なく増えていきます。
データと話せたらもっといろいろなことがわかるはずなのに・・・たくさんの人が困っていました。
データと話すことなんで本当にできるのだろうか。
人々はだんだん疑心暗鬼になりました。
かくして、世界を便利にするために生まれたデータを、人は持て余すようになってきました。



世界に人間とデータの対立が深まる暗雲が立ち込める中、遠く離れた星からタブローさんがやってきました。
タブローさんは地球の有様を見て驚きました。
世界を良くするために生まれたデータが人を困らせていたからです。

タブローさんのいた星では、みんなVizQLという言葉を話すことができ、データと人が手を取りとてもよい社会を築いていました。
VizQLとは、データの言葉をとても簡単に話し、同時にデータから受け取った言葉を人間にわかりやすい見た目に表現してあげる言葉なのです。

VizQLを話すことができるようになれば、地球の人間もきっと幸せになれるはず。
タブローさんはそう信じました。
そこで、タブローさんは地球で、人とデータを繋ぐ翻訳者としてみんなにVizQLを使ってもらうことを決意しました。

VizQLはもともとデータの言葉でもあり、人にわかりやすい表現を作ることも得意でしたが、タブローさんはこのVizQLをさらに地球の人に寄り添ったものにしていきたいと考えていました。
なにせ遠い星からやってきましたから、タブローさんは地球の人間のことを勉強する意欲も怠りません。
あるときはコミュニティを作って掲示板で世界中の人からアイディアを募ったり、
地球の人間にとってわかりやすい色合いが今とは違うものであるとわかったら、今までのカラーリングを一新してみたり、
数学の苦手な人のために代わりに計算をできるようになってあげたり、
とにかくさまざまな勉強を重ね、人とデータをつなぐ役割を果たしてきました。

その地道な活動の結果、人間はデータの言葉を知らなくても、タブローさんの教えたVizQLでデータとお話ができるようになってきました。

データと少しでも心が通じ合う瞬間があった人々は大変驚きました。
今まで無機質で、そっけなく、本当に自分たちの役に立つのかわからないと思っていたデータたちが、実はさまざまに自分たちに話しかけてきていたことが理解できたからです。
データは実はストーリーを持ち、時に冷静に、時に情熱的に、人間に話しかけていたのです。

かくして、お互いの言葉を通じさせることができず、長く争っていた人間とデータは、一歩ずつ手を取り合い歩み出し始めたのでした。

しかしこの長い旅路ははじまったばかり。

これからもどんどんデータは増えるでしょう。
様々なものがデータになる中で、データと自由にお話できれば、世界そのものを知ることだってできるかもしれません。



タブローさんは人間とデータの架け橋になれたことをとても喜んでいましたが、もともと意欲的な性格ですので、まだまだやれることがあると思っています。
これからデータはもっと増えていきますから、人間を幸せにするためにはもっと早く、もっとわかりやすく表現しなくてはなりません。


タブローさんは考えていました。
人の言葉を話せるようになりたいのです。人間の言葉はタブローさんにはまだ少し難しいので、今は人間もタブローさんもわかりやすい手の操作を受け取っています。
ですが、なんの操作もしなくても、人間が話した言葉を理解することができれば、人は操作を覚えなくてもよくなりますから、もっともっと簡単にどんな人でもデータと対話することができるようになるでしょう。
タブローさんの飽くなき挑戦はこれからもずっとずっと続きます。


2017年、人間とデータがもっともっと仲良くなれますように・・・!


Photo by NASA


Kaori