top of page

Tableau実践問題集 #TableauChallenge を作りました。

R-Tableau勉強記2:相関係数を計算する

前回でR連携の動作原理を学んだので、今回から実際にRを使った分析例を扱ってみます。

(勉強しながらのため、内容の統計的、学問的厳密さについてはお察しください)


今回は相関係数について取り上げます。

UCI Machine Learning RepositoryからWine Quality Datasetを使用します。


ちなみに相関係数が何か、という点は割愛します。

(Google検索で簡単に内容出てきますので)


今回使用したダッシュボードは以下からダウンロードできます。

 

データの簡単な解説とR連携の動作のおさらい

今回使用するデータは赤ワインと白ワインの品質スコアおよびワインの成分に関するデータです。

今回は「赤/白ワインにおいて、品質と高い相関をもつ成分は何か」を調べたいとします。

データの1~11列がワインの成分情報、12列目のQualityが目的の品質データです。

成分に関して、ざっくりと酸度、糖度、塩化物、硫黄化合物などの情報を見ています。

(自分はお酒を飲まないので、このあたりは良く分かりませんが)


またBI上ではデータを縦持ちで持つことが多いように思いますので、今回はデータをTableau上で(un)pivotし縦持ちさせます。

(ID列のみcsv上で手動作成しています)


ところで相関係数を求める関数への入力について、前回の記事のおさらいですが、TableauはRに「Viz-LODと表計算のPartitionにより作られるベクトル」を入力として渡します。

今回の場合、相関係数の計算には各Wine TypeおよびPivot Field Name内に含まれるデータを入力にする必要があります。


イメージとしては、下図のTypeおよびField内に含まれるIDごとのデータを、ベクトルとしてひとまとめにしてRに渡す感じです。

R側でこの入力を相関係数を求める関数に入力します。

 

相関係数を求め表示する

ということで、早速相関係数を求めます。算出にはcor.test()を使用します。


Tableau上で書く前に、少しだけcor.testの中身について記載します。

この関数は長さの同じ2つのベクトルに対し、Pearson/Kendall/Spearmanの相関係数などなどを算出します(デフォルトではPearsonの総関係数について)。


試しにWhite WineのQualityとfixed.acidityの出力結果を以下に記載します。

>cor.test(target,input[,1]) #targetはquality, input[,1]はfixed.acidity

Pearson's product-moment correlation
data:  target and input[, 1]
t = -8.005, df = 4896, p-value = 1.48e-15
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.14121974 -0.08592991
sample estimates:
       cor 
-0.1136628 

cor.test自体はList形式の出力であり、いくつかの情報を格納しています。

> summary(cor.test(target,input[,1]))
            Length Class  Mode     
            statistic   1      -none- numeric  
            parameter   1      -none- numeric  
            p.value     1      -none- numeric  
            estimate    1      -none- numeric  
            null.value  1      -none- numeric  
            alternative 1      -none- character
            method      1      -none- character
            data.name   1      -none- character
            conf.int    2      -none- numeric  

今回主に必要な情報はestimateのため、cor.test()$estimateの形で相関係数を持ってきます。

ということで、Tableauの計算フィールドには以下を書きます。


pearson correlation

SCRIPT_REAL(

'result = cor.test(.arg1,.arg2);

result$estimate

', MIN([quality]),MIN([Value])

)


適切な表計算設定を施した後の実行結果は以下です。


さて、データに関してのQualityに対する各Fieldの相関係数が出ましたが、各IDごとのデータが相関係数を持ってしまっています。

したがってここから相関係数の可視化を作成する際に、マークの重複が発生します。

不必要なマークの表示はTableau上での描画パフォーマンスに影響するため、ここでは各Fieldに含まれるIDのうちひとつだけに相関係数を表示させます。

したがって計算式を以下の形に修正します(表計算の設定は同様)。


pearson correlation

IF LAST() = 0 THEN

SCRIPT_REAL(

'result = cor.test(.arg1,.arg2);

result$estimate

', MIN([quality]),MIN([Value])

)

END


この実装であれば、各TypeとFieldの組み合わせにおけるLAST()=0のIDにのみ相関係数が表示されるので、ビューがすっきりします。


ということで、簡単に相関係数を棒グラフにしてみます。


ここで相関係数の大きさで順位付けするために、以下の計算フィールドを使用しています。


RANK

RANK_UNIQUE([pearson correlation])


WINDOW_MIN(RANK)

WINDOW_MIN([RANK])


WINDOW_MINを使用している理由について、先ほどpearson correlation内でLAST()を使用した条件分岐を使用しましたが、それによりRANKがNULLのものが生じます。

したがってWINDOW_MINでNULL RANKと数値RANK両方を処理させ、数値RANKのみを出力させます。


またcor.test()はp値(その相関係数が偶然の産物である確率)も出してくれるので、そちらも併せて取得します。


p-value

IF LAST()=0 THEN

SCRIPT_REAL(

'result = cor.test(.arg1,.arg2);

result$p.value

', MIN([quality]),MIN([Value])

)

END


p-value < 0.05

IFNULL(WINDOW_MIN(

IF [p-value] < 0.05

THEN '*'

END

),'')

ところで個人的には弱い相関の可視化上の優先度を下げたいので、絶対値に直します。

またヘッダーにp値が0.05以下かどうか(一般的な統計的有意性の閾値)を表示させます。


以上でPearsonの相関係数とそのp値をRで計算させ、可視化することができました。

 

余談:そもそもPearsonの相関係数はTableauの基本機能で算出可能

ところで、以下はPearsonの相関係数の式です。


結局のところデータの平均値とデータ点数を用いれば計算できるので、Tableauの表計算(WINDOW_AVGなど)を上手く使えば実装できますね。


ところでPearsonの相関係数は結局正規分布過程の量的変数に対する相関係数なので、正規分布していなかったりそもそも量的変数でないものに使用するのは適切じゃなかったりします。

(例えばアンケートの5段階評価:順序尺度のため)


Tableauでの実装では数値計算的に(微分方程式を計算的に解くなど)何かを求める手法が使えないので、使用するデータのタイプによってはTableau基本機能だけでの実装が難しい場合があります。

一方でRかPython連携ならTableauの限界を気にせず分析用の計算処理を走らせることができるため、Tableauでの分析結果の実行と可視化に幅を持たせやすくなります。

(もちろん用いる相関係数によって使用する関数やライブラリが異なりますが)


ちなみにPython向け記事ですが、以下の記事を参考として載せておきます。


その意味では今回のデータのQualityは順序尺度のため、本当はPearsonの相関係数は適切ではないのですが、あくまでも実装に関する記事と言うことでひとつ。

 

最後に

今回は相関係数について取り上げました。

追々Pearson以外の相関係数の実装も試してみたいですね。


ご質問等はTwitter、Linkedinへよろしくお願いします。それでは。

bottom of page