top of page

Tableau実践問題集 #TableauChallenge ã‚’䜜りたした。

R-Tableau勉匷蚘t怜定を実装する

今回は2暙本のt怜定を取り䞊げたす。

デヌタはSample SuperStoreを䜿甚したす。

たた今回䜿甚したWorkbookは以䞋からダりンロヌドできたす。


参考

Introductory Statistics with R (叀い本ですが統蚈孊のR実装を孊ぶにはいい本でした。そのうちもう少し最近の本を参照するようにしたす

 

2暙本のt怜定ずは詳现は割愛

詳しい話は参考資料を芋お頂くずしお、ざっくり蚀えば「2぀のデヌタの平均倀の違いが統蚈的に有意かどうか調べる」ための手法ず理解しおいたす。


䟋えば今回はSuperStoreの「WestずEastのOrder IDごずの合蚈Salesの平均倀」を比范したす。その結果は以䞋のように、玄$34の差がありたした。

この$34は統蚈的に有意な差ず蚀えるのかどうか厳密には䞡デヌタの平均倀の差がれロであるずいう仮説が棄华されるかどうかを知るために2暙本t怜定を䜿甚したす。


実際にはデヌタが正芏分垃かどうか、2぀のデヌタの分散が等しいかを気にかけるべきなのですが、たずは実装を考えたしょう。

 

t怜定の実装

以降、2暙本t怜定を単にt怜定ず呌びたす。

たずは今回扱うデヌタを芋おみたす。

今回の入力には「OrderIDごずの合蚈売䞊」を䜿甚したいので、Order IDをViz-LODに含めたす。

このあたりの内容に぀いおはこちらの蚘事を参照ください。


次に、蚈算フィヌルドでt怜定の結果を返す実装を考えるのですが、たずはR䞊でt怜定の実行結果がどのような圢で埗られるのかを確認したす。

等分散かどうかの確認は埌皋行うずしお、たずは等分散を仮定した堎合のt怜定の結果を芋おみたす

䞊蚘はR Studio䞊でwest: RegionがWestのOrderIDごずの合蚈Salesのデヌタ、east: RegionがEastのOrderIDごずの合蚈Salesのデヌタを等分散を仮定したt怜定にかけた結果です。


Tableauの実装䞊で倧事なこずは2枚目で、t怜定は出力をリスト型で出したす。

今回Tableauにはp倀デヌタの平均倀の差がれロである確率が欲しいので、䞊蚘を芋るずp倀は以䞋のような実装から埗られるこずが分かりたす。

p_value = t.test(west$Sales,east$Sales,var.equal=T)$p.value

方針は分かったので、Tableau䞊で入力ベクトルを各蚈算フィヌルドで持たせれば良さそうなので、Tableauでの実装を考えおいきたす。


たず、入力ベクトルのサむズを確かめたす。

今回は各RegionのOrder IDごずの合蚈Salesに぀いお扱いたいので、COUNTD(Order ID)がそのたた想定されるベクトルサむズt怜定に䜿うサンプル数になりたす。


ずいうこずで、以䞋のような蚈算匏ずビュヌを䜜成し、たた入力ベクトルのサむズを芋おみたしょう。


West SalesEast Salesも同様)

IF [Region] = 'West'

THEN [Sales]

END


vector size (west)Eastも同様)

SCRIPT_REAL(

'length(.arg1)'

, SUM([West Sales])

)


ラベルには察応するvector sizeを䜿甚しおいたす。

たた衚蚈算はOrder IDを䜿甚しお蚈算させたす。


ここでVizLODにRegionを䜿甚しおいないこずに泚意しおください。

二぀のデヌタはMeasure Namesで分けおいたすこれはデヌタをLODの意味で分けないので、このビュヌのViz-LODはOrder IDのみです。


さお、本来East/Westに察しお470/538が想定されおいたのに察しお、入力ベクトルは二぀の倀の合蚈倀を返しおきたした。これは䜕故でしょうか


答えは「COUNTDを蚈算した衚ず違い、䞊のビュヌではRegionがViz-LODにないから」です。぀たりSCRIPT_REALでRに入力されるベクトルは、蚈算匏䞊でRegionごずに分けようずしおも、実際にはデヌタがRegionで分けられおいないため、䞡Regionに含たれるOrder ID党おが入力されるので、䞊蚘のようにベクトルサむズが1008ずなりたす。


t怜定の匏ずいうよりt倀の匏には2デヌタのサンプルサむズを䜿甚するため、入力ベクトルのサむズは正しくなければいけたせん。

したがっお、vector sizeの匏を修正する必芁がありたす。


vector size (west)修正版

SCRIPT_REAL(

'length(subset(.arg1,!is.na(.arg1)))'

, SUM([West Sales])

)


修正版では、各入力から「NA: 欠損倀を抜いたベクトルを䜿甚する」ための蚘述を足しおいたす。

ずころでTableauからRに入る際の欠損倀はNULLでなくNAなのですね


実際に修正版の結果を芋おみるず、以䞋のようになりたす。


たしかに入力ベクトルのサむズが期埅しおいるものず䞀臎したした。

正しい入力ベクトルが埗られたので、実際にt怜定でのp倀を出しおみたす。


p-value of t_test

SCRIPT_REAL(

't.test(

subset(.arg1,!is.na(.arg1))

, subset(.arg2,!is.na(.arg2))

, var.equal=T)$p.value'

, SUM([East Sales]), SUM([West Sales])

)

R Studioでの実行結果ず䞀臎しおいるので、正しい結果が埗られおいるこずが分かりたす。


 

䜙談実は䜿う関数によっおは自動でNAを省いおくれる

subset()を䜿甚しお欠損倀を省いお正しいベクトルを入力したしょう、ずいう議論を䞊でしたしたが、実は今回のケヌスでは欠損倀凊理をしなくおも正しいp倀が返っおきたす。

ずいうのも、t.test()にはna.actionずいうパラメヌタがあり、こちら欠損倀をどう凊理するかを指定するパラメヌタです。

デフォルトでは欠損倀を省いお怜定するようになっおいるのですが、そもそも入力をある皋床コントロヌルした方が良いのでは、ず思い䞊蚘の議論を曞きたした。

 

さお、䞊蚘たでで「2019幎床のOrder IDごずのSalesの平均倀は、EastずWestで有意な差があるか」をTableau䞊で確かめるこずができるようになりたした。

ここたでの内容を元にしお、月次で有意な差があったかを確かめられるビュヌを䜜成できたす。

衚蚈算の蚭定含め、詳现はWorkbookをダりンロヌド頂ければず思いたす。

 

等分散性の怜定

ずころで、ここたで本圓にWestずEastでOrder IDごずのSalesにおける分散が等しいのかを確かめおいたせんでした。

等分散性を確かめるにはF怜定を䜿甚したす。


Rには簡単に等分散性を確かめる関数var.test()があるので、実際に䜿甚しおみたしょう。


p-value of F_test

SCRIPT_REAL(

'var.test(

subset(.arg1,!is.na(.arg1))

, subset(.arg2,!is.na(.arg2))

, var.equal=T)$p.value'

, SUM([East Sales]), SUM([West Sales])

)


p_value < 0.05 (F_test)

//H1: true difference in means is not equal to 0

IF [p-value of F_test] < 0.05

THEN 'Diff. Var.'

ELSE 'Same Var.'

END

芋おみるず、結構等分散性は月によっお倉わるようです。

したがっお等分散性に合わせおt怜定の䞭身を倉える実装が必芁そうです。


ずころで、t怜定の等分散性仮定はt.test()関数のvar.equalパラメヌタで制埡したす。

したがっおF怜定の結果をT/Fで枡す蚈算フィヌルドを甚意しおあげれば良いずいうこずになりたす。


F-test Result

//H1: true difference in means is not equal to 0

IF [p-value of F_test] < 0.05

THEN 'F' //H0 is rejected

ELSE 'T' //H0 is not rejected

END


p-value of t_test修正版

SCRIPT_REAL(

't.test(

subset(.arg1,!is.na(.arg1))

, subset(.arg2,!is.na(.arg2))

, var.equal=' + [F-test Result] +')$p.value'

, SUM([East Sales]), SUM([West Sales])

)


ずころで結論から蚀えば、等分散性にかかわらずt怜定の結果は倉わりたせんでした。

䞊蚘ビュヌではEastずWestのOrder IDの個別カりントを远加衚蚘しおいるのですが、芋る限り

  • 平均倀の差が倧きく出おいおもOrder数サンプル数が少ないので、結果的にt怜定で有意な差が出にくいか぀正芏分垃の過皋がしにくい気になる方はt怜定のロバスト性ず䞭心極限定理をお調べ䞋さい。

  • サンプル数が倧きくおも、そもそもの平均倀差が小さいので差が有意でないず刀断される。

䞊蚘2点が出おくるのかなず。結論ずしおは、本質的にはEastずWestではOrderごずの平均Salesに有意な差は基本的には無さそうです。


じゃあRegion党郚の差の有意性を芋たいずきはどうするんだ、ずいう話は別の日に。

気になる方は分散分析ANOVAでお調べ䞋さい。近々ブログを曞きたす。

 

2020/7/1远蚘異垞倀の凊理に぀いお

今回の本題であったt怜定の実装自䜓は䞊蚘で完結しおいるのですが、䞊蚘の結果の劥圓性に぀いおちょっず確認したいこずが出来たので、ここに远蚘ずしお曞いおいきたす。

曞きながら実隓しおいたす


たず、差がそれなりに出぀぀「2デヌタ間の平均倀の差は有意でない」ずいう結果が出おいるわけですが、仮にt怜定を実斜する際のサンプル数を増やしたらどうなるのでしょうか぀たりサンプル数が増えれば、デヌタの分散は察応しお小さくなっおくれるのでしょうか


以䞋に四半期ごずにデヌタの集蚈を倉えたものを蚘茉したす。

サンプル数は十分そうですが、やはり平均倀の差に統蚈的有意さは出たせん。

少し原点に立ち返り、実際のデヌタの分垃をみおみたす䟋ずしお2018幎を衚瀺。

Box Plotず平均倀を衚瀺しおいたす。

分垃が䌌通っおいるので確かに有意さは無さそうですが、それ以䞊に分垃が広がっおいるこずが気になりたす。これは䟋えば顧客Segmentなどによる圱響でしょうか少し芋おみたしょう。

ちなみに今回はt怜定の実装ずいう文脈から入ったので最初にデヌタを確認したせんでしたが、こういうこずをする際は最初にデヌタの分垃を芋ないずいけたせんね


あたり違いが芋えたせんが、それ以䞊に「以䞊に合蚈Salesが倧きいデヌタ」に匕っ匵られおいるようにも芋えたす。

このような分垃から倖れたデヌタを異垞倀などず呌ぶのですが、サンプル数が決しお倚くはないデヌタにおける平均倀ず分散は異垞倀の圱響を受けやすく、もちろんt怜定の結果にも圱響したす。


異垞倀凊理の方法はいく぀かあるのですが、今回はTableauで実装しやすい四分䜍Quartileを䜿甚したす。

぀たりBox Plotの䞊端ず䞋端を超えたデヌタを省くような実装を考えたす。


Inter Quatile Range

WINDOW_PERCENTILE(SUM([Sales]),0.75)

- WINDOW_PERCENTILE(SUM([Sales]),0.25)


Outlier Label

SUM([Sales]) > WINDOW_PERCENTILE(SUM([Sales]),0.75) + 1.5 * [Inter Quatile Range]

OR

SUM([Sales]) < WINDOW_PERCENTILE(SUM([Sales]),0.25) - 1.5 * [Inter Quatile Range]

図䞭の赀い点を省いたらOrderごずの分垃はどうなりそうでしょうか芋おみたしょう。

いく぀かの四半期では、もしかしたら有意差が出そうですね。

この異垞倀凊理をt怜定の匏の䞭に組み蟌む方法を以降で考えおいきたす。


たずはベクトルサむズを確認し、実装が正しそうか確認したす。


vector size (east) (outlier) (Westも同様)

SCRIPT_REAL(

'length(subset(.arg1,!is.na(.arg1)))'

, IF NOT [Outlier Label] THEN SUM([East Sales]) END

)

各ラベルの䞊偎が異垞倀を含めたベクトルサむズ、䞋が異垞倀陀倖したベクトルサむズです。異垞倀の個数も確かめたしたが合っおいたした。


Tableauの操䜜の順序によるず衚蚈算フィルタヌは衚蚈算の埌に走っおしたうので、衚蚈算の䞭にIF文でのフィルタリングを実装する圢になりたす。

このIF文蟌みの蚈算匏が入力ベクトルになり、subset()の䞭で欠損倀は陀倖されるので、結果的に異垞倀抜きの入力ベクトルがむンプットになる、ずいう算段です。


ずいうこずで、やっずt怜定の匏を改良できたす。


F-test Result (outlier)

//H1: true difference in means is not equal to 0

IF [p-value of F_test (outlier)] < 0.05

THEN 'F' //H0 is rejected

ELSE 'T' //H0 is not rejected

END


p-value of F_test (outlier)

SCRIPT_REAL(

'var.test(

subset(.arg1,!is.na(.arg1))

, subset(.arg2,!is.na(.arg2))

, var.equal=T)$p.value'

, IF NOT [Outlier Label] THEN SUM([East Sales]) END

, IF NOT [Outlier Label] THEN SUM([West Sales]) END

)


p-value of t_test (outlier)

SCRIPT_REAL(

't.test(

subset(.arg1,!is.na(.arg1))

, subset(.arg2,!is.na(.arg2))

, var.equal=' + [F-test Result (outlier)] +')$p.value'

, IF NOT [Outlier Label] THEN SUM([East Sales]) END

, IF NOT [Outlier Label] THEN SUM([West Sales]) END

)


p_value < 0.05 (t_test) (outlier)

// H1: true difference in means is not equal to 0

IF [p-value of t_test (outlier)] < 0.05

THEN '★'

ELSE ''

END


ビュヌの现かい䜜りはWorkbookを芋お頂くずしお、結果を以䞋に蚘茉したす。


特に四半期ごずのSegmentで分けない平均Sales差は統蚈的有意性が぀の四半期で出るようになりたした。もちろん統蚈的有意性を出すこずが目的では無いのですが。


欠損倀を陀倖する凊理はやはり実装しおおいた方がいいのかなず思い぀぀、このあたりで远蚘を着地させるこずにしたす。

 

最埌に

今回はt怜定に぀いお取り䞊げたした。そしお远蚘では欠損倀凊理にも少々觊れたした。

本圓は正芏分垃を仮定しない堎合の実装に぀いおも考曞こうか考えたのですが、F怜定あたりでスタミナが切れたした。気になる方はお調べ䞋さい。

実装はそんなに難しくはならないず思いたす。


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


bottom of page