top of page

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

R-Tableau勉強記4:one-way ANOVAを実装する

前回の記事では、対応のない2標本のt検定の実装方法について書きました。

対応のない2標本のt検定では、ある全く対応していない/関係のない二つのグループから得られた数値の平均値の差が、統計的に有意なものかどうかを調べる方法でした。


一方で、例えば前回ではEast RegionとWest RegionのOrder IDごとの売上の平均値を比較しましたが、実際にはRegionにはCentralとSouthがあります。

つまり前回では2標本t検定のためグループを2つとしましたが、実際には3つ以上のグループにおける何らかの平均値比較をする必要はあります。


例えば以下の例では、2019年各月のSuperStoreのArtサブカテゴリの合計Salesについて、Segment間での比較をしています。

このようなデータに対し「2019年のArtの月売上の平均値に、統計的有意な差はあったのか」を考えたいとします。


前回取り上げたt検定を各Segmentのペアに対して適応し、計3回t検定を実施するという方法が思いつきそうですが、この場合少しまずいことがあります。

例えばt検定で有意差ありとする水準にp=0.05をしたとして、3回t検定を実施して、少なくとも1回は有意差ありとなる確率は「3回全て有意差なし」の余事象の確率を考えればよく、

1 - (1 - 0.05)^3 ≒ 0.14

となり、p = 0.05を水準にしたかったはずが、結局p = 0.14程度を水準としてしまいます。


というわけで、2グループのみを対象にしていたt検定を3グループ以上に拡張した検定法である分散分析:ANOVAを使用していきます。


なお、本記事では対応なし1要因ANOVA (one-way ANOVA)を単にANOVAと呼称します。

「1要因である」とは、例えば今回のように各月のデータをひとつのディメンションで分けている場合を指します。

「対応がある」とは、今回の場合ではSegmentそれぞれが互いに影響するかどうかを指します。比較に使用するディメンションの値が、それぞれ互いに影響するかどうかを考慮します。


例えば以下の例では、ある10人のCustomer Nameの、2019年の四半期売り上げを持ってきています。

ある四半期で大きく買い物したら、次の四半期は買い物を控える場合が想定される場合、それは「対応あり」と考えることが出来ます。














本記事ではTableau上での実装に焦点を合わせたいので、詳細は各自参考資料をご覧ください。

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


参考

 

ANOVAの基本的な考え方

まず、今回取り上げるデータの分布の様子を見てみます。

ここでTotal AVGはデータ点全ての平均値、Group AVGはグループ(ここでは各Segment)内のデータ点の平均値です。

分散分析の帰無仮説は「全てのGroup AVGが等しい」こととします。見た感じ各Group AVGは異なっていそうですが、これはどの程度統計的に有意な違いなのでしょうか。


この違いを調べるために、F分布という概念を応用します。

 

F値

正規分布に従う以下の2つの母集団を考えます。





それぞれの母集団から抽出した標本について、以下を考えます。

このFはF値と呼ばれ、基本的には2つの正規分布の分散を比較しています。

計算されたF値とF分布表の対応する値を比較し、計算値がF分布表から有意にずれていれば、その2つの分布は等しくないものとします。

(詳細は割愛しますので、気になる方はお調べ下さい)


この分散に関する検定をANOVAで使用するのですが、F検定は2つの正規分布を必要とします。

この2つの正規分布について、以下のように考えていきます。

 

群間変動と群内変動

まず、以下のようにデータを一般化します。








単に添え字をつけたのみですが、例えば以下の表ではnは1~12, mは1~3となり、例えばx11 = $118となります。














このそれぞれの要素:x_ijについて、以下の式が(天下り的ですが)考えられます。

この式を少し変形し2乗和をとると、以下のように要素を分解することができます。











ここで1つ目の項は、各要因内のデータ点の平均値と、全体の平均値を比較しています。

2つ目の項は各データ点と、全体の平均値を比較しています。


この式のエッセンスは、各データ点のばらつきは「要因内の平均値の全体平均値に対するばらつき」と「各データの要因内の平均値に対するばらつき」によって構成される、ということです。


ANOVAでは「各要因の平均値は有意な差を持つのかどうか」をテーマとしますが、平均値という代表値を見ることはその裏側のデータの分布を見ることでもあります。

その分布を評価するために、手元のデータそれ自体の分布、ばらつきを見た結果、そのばらつきは「要因内の平均値の全体平均値に対するばらつき」と「各データの要因内の平均値に対するばらつき」に影響されることがわかりました。


つまり「それぞれの要因のデータの分布は異なるのか」を見るにあたって、仮に「全て同じ分布であった」とした場合、それぞれの要因内のデータは詰まるところ同じ分布のデータ=同じ母集団から取られたことになるので、「要因内の平均値の全体に対するばらつき」と「各データの要因内の平均値に対するばらつき」に有意な差がないことになります。


上記を調べるためには、「要因内の平均値の全体平均値に対するばらつき」と「各データの要因内の平均値に対するばらつき」に対しての等分散検定を実施すればいいことになります。

つまりこの2つのばらつきについて、F値を計算し、そのF値が有意にF分布表から外れているか計算することになります。


これがANOVAのエッセンスです。

 

2つのばらつきは正規分布なのか

ところで、F値は2つの正規分布を仮定していました。

「要因内の平均値の全体平均値に対するばらつき」と「各データの要因内の平均値に対するばらつき」は、正規分布になるのでしょうか。


まず後者について、こちらは各要因内のデータが正規分布することを前提としなければなりません。つまり厳密には、元データが正規分布しているかを先に検定する必要があります。


前者について、こちらは中心極限定理より、標本数が大きければ正規分布に近づきます。

したがって前者についてはデータの正規分布の仮定が必要、後者については標本数が大きい場合に問題ないと言えます。

(そうはいいつつ、調べた限りANOVAはそこまで正規分布を厳密に仮定しなくても大丈夫なようです)

 

ANOVAの実装

やっと実装の話まで来ました。というより実装は関数に渡すだけなのでとても簡単です。

以下の式でANOVAを実行し、そのp値を取得します。


one-way ANOVA's p-value

SCRIPT_REAL(

"summary(aov(.arg1 ~ .arg2))[[1]][5][1,1];"

, ZN(SUM([Sales]))

, MIN([Segment])

)


上記の式について、まずSummary(aov())は、以下のようなリストを返します。

欲しいものはp値なので、リスト内の配列要素を指定する形でp値を抜き出しています。


また表計算の設定は以下のようにしています。






















このp値を使用し、以下のp < 0.05かどうかのラベル付け用計算式を作成します。


p-value < 0.05?

IF [one-way ANOVA's p-value] < 0.05

THEN '★'

ELSE ''

END


以下のように、各Segmentの各年月のSalesの平均値が、ANOVAの結果有意かどうかを示せます。


ということで、前置きが長くなりましたが、対応なしone-way ANOVAのTableau実装ができました。

 

最後に

今回は対応なしone-way ANOVAについて取り上げました。

これは前回のt検定を3群以上に拡張したものであり、この3群以上のそれぞれの平均値の差が有意なものかどうかを調べる検定でした。


少し厳密な話をすると、ANOVAはaov関数をそのまま使う場合、標本数が各群で同じであることを仮定するので、もし標本数が異なる群に対してANOVAを行う場合、少し計算を工夫しなければいけません。


また、群間の差が有意であることがANOVAで分かったとして、ではどの群間に差があるのかを調べるためには、多重比較を実施する必要があります。

これらトピックは次回以降で述べていきます。


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

bottom of page