トレジャーデータ(Treasure Data)ブログ

トレジャーデータ(Treasure Data)ブログです。

本サイトは移転しました。新サイトにリダイレクトします。

トレジャーデータで実践:A/B テスト(実践編その1)

本記事は移転しました。新サイトにリダイレクトします。

トレジャーデータはクラウドでデータマネージメントサービスを提供しています。

 

はじめに

今回は,具体的なデータを事例にしてA/Bテストをわかりやすく紹介します。本記事では理論的なところは控えめに,手順とポイントについて詳しく紹介していきます。実のところ,手順とポイントだけおさえておけば,理論は知らなくても全く問題ありません。また,心の準備編でも紹介しましたが,最終的にはAとBに差違があるのかは,

検定によって求められた統計量に基づいて人間が判断する = 人がテスト結果ときちんと向き合う

ことの習慣化が重要なので,テストを実施するにはできるだけ心理的ハードルは低い方がむしろ良いのかもしれません。

A/Bテストとは?

A/Bテストは統計的仮説検定の枠組みの中で,「2つの母平均の差の検定」に該当するものです。独立して実施された結果,AとBに統計的見地から見て,違い(これを「有意な差」とよびます)があったかどうかを判定するものです。

ポイント1:「絶対数」を比較するのでは無く「平均」,または「比率」を比較する

例えばサイトA,Bのクリック結果が

  • A は1000アクセスに対して 10 回のクリックがあった
  • B は2000アクセスに対して 21 回のクリックがあった

という結果を見るときに,単純にAとBのクリック数(10回と21回)を比較することはできません。なぜならAとBではサンプル数(ここではアクセス数)が異なるためです。ここで比較できるのは双方の比率である「クリック率」:Aの10/1000=0.01 とBの21/2000=0.0105 です。「平均の差」と「比率の差」は似ているようですがテストが異なります(後の記事で説明します。)。本記事では「平均の差」の事例を紹介します。

統計的仮説検定の世界ではサンプル数が十分に大きい時,テストAとBの結果が同じであるとすると,AとBの「サンプル数」,「平均」および「標準偏差」を用いて計算される統計量Tが,z 分布と呼ばれる平均0,分散1^2の正規分布 N(0,1) に従うという理念を元にしています。

f:id:doryokujin:20150605152121p:plain

↑ z分布は平均0,分散1のいわゆる「正規化された」正規分布を指します。A/Bテストではあらゆるケースでの問題をこのz分布に乗っかるように工夫して解くというところに面白さがあります。

ポイント2:計画的に小さな違いを付けて行われ,かつ十分なサンプル数に基づくABテストは,統計量Tはz分布に従うとして理論を組み立てる事ができる汎用性を持つ。逆に言えば,無計画に多くの違いを持つAとBに対しても手法が適用できてしまう事により,誤解が生み出される事も多々ある。

前者は,あらゆるテストは同じ手法で説明できることになります。Webページのリンクの色の違いも,セール実施前/後の売上の違いも,アンケート調査の結果の違いも,全て同じ計算手順で汎用的に扱うことができます。

ただし統計的なテストとは,本来意図的に設けられた小さな差違の効果を検証するために,計画的に実施された結果を基に行われるものです。

# しかし実際は結果的に得られたデータを見て,「AとBに違いがあったのでは?」という考察から後付けで実施されるケースが少なくありません。この場合,AとBの差違というのはあらゆる不確定要素を含むために,テストの結果が意味を持つかは判別の難しいところがあります。この点については「実践編その2」で掘り下げていきます。

ポイント3:もし統計量Tがz分布らしからぬ状況を確認した場合には,大前提とした仮説「AとBが同じ」が否定され,故に「AとBには有意な差がある」と判断できる。

後述しますが,始めに前提とした「帰無仮説 H0: μA=μB」を否定することで対立仮説を採用するという背理法を行うのがA/Bテストです。

前置きが長くなってしまいましたが,ここであげたポイントはいつも意識するようにしてください。

実例A/Bテスト

 Q. あるデパートが特定のカテゴリ商品で「会員なら10%ポイント還元」セールを実施した。このセールに効果があったとすれば,セールを実施したカテゴリで会員(A)/非会員(B)で平均購買単価に違いが見られるはず。

今,以下のようなセール期間中の発注ログが手元にあるとします。

timeorder_idmember_idcategorypriceamount
Dec 17, 2013 @ 10:45:03 AM 694 0 弁当 350 1
Dec 17, 2013 @ 10:45:03 AM 6047 0 野菜 283 1
Dec 17, 2013 @ 10:45:03 AM 461 0 リキュール 350 1
Dec 17, 2013 @ 10:45:03 AM 461 0 農産加工品 350 1
Dec 17, 2013 @ 10:45:03 AM 2948 2500000003639 塩干漬魚 1560 2

 

非会員はmember_id=0ですが,会員はそれぞれのmember_idを持っています。 まずはこれをインプットデータにして,各々のカテゴリの購入数,平均購買単価,標準偏差の3つの値を持った中間テーブルを生成します。今回は会員のケースをA,非会員のケースをBとしてA/Bテストを行います。

f:id:doryokujin:20150605151650p:plain

↑ avg_ratio はAとBの平均値の比を取ったものです。セールを実施した赤掛けのカテゴリでは,会員/非会員での平均勾配単価(avg_a, avg_b)に差があったのかどうかは判断の微妙なものになっていますね。そこで統計的検定の出番です。

ポイント4:テストA,テストBに関してインプットデータから上表のような「サンプル数(COUNT)」,「平均(AVG)」,「標本標準偏差(STDDEV_SAMP)」を集計した stat_summary テーブルを作成する。

この3項目は、後で統計量Tを求めるのに必ず必要になります。これは他のあらゆるテストに対しても必要な必須項目です。

A/BテストではAとBを足した総サンプル数が100以上を「大標本」,100以下を「小標本」と呼び,今回は大標本のケースのみ(よって「リキュール」は省かれます)を扱います。

小標本の場合はz分布でなくt分布が使われます。また,小標本では等分散か否かでさらにケースがわかれますのでなかなか複雑です。

ポイント5:大標本の場合, 帰無仮説H0: μA=μB のもとで,統計量T=\frac{\bar{X}_{A}-\bar{X}_{B}}{\sqrt{\frac{\sigma^{2}_{A}}{n_A}+\frac{\sigma^{2}_{B}}{n_B}}} を計算する。そして,対立仮説H1: μA≠μB または μA>μB のどちらかで有意水準5%, 10%それぞれの棄却域Rを求めTと比較し,有意な差があるかを判定する。

少し難しいことを書きましたが,順を追って説明します。まず,今回のA/Bテストが

  • AとBに差があるのか無いのかだけを知りたい(対立仮説H1: μA≠μB)
  • Aの方がBより上である事まで確認したい(対立仮説H1: μA>μB)

で対立仮説が異なります。前者を両側検定,後者を片側検定と呼び,それぞれの有意水準による棄却域Rの値が異なります。一般的には,両側検定が使用されます。今回は両側検定を前提とします。

次に有意水準ですが,(誤解を恐れずに言うと)これは判別の厳しさを決定するパラメータで,有意水準5%の方が10%よりもかたくなに帰無仮説 H0: μA=μB を否定(棄却)しようとします。今回は有意水準5%,10%の両方場合で棄却域を求める事にします。

ポイント6:本記事では前提として有意水準5%,10%とした両側検定を実施するものとする。それぞれの有意水準での棄却域(5%でR=1.96,10%でR=1.64)と統計量Tを比較して,Tの方が大きければ「棄却(=有意な差がある)」,小さければ「棄却しない(=有意な差があると言えない)」とします。

# おかしな言い方ですが,背理法を用いる統計的テストのスタンスとして,できるだけ「Reject されたい(帰無仮説を棄却したい)」というのがあり,そのスタンスの元では片側検定よりも両側検定が,有意水準10%よりも5%(時には1%)が好まれる傾向があります。

実行手順

それでは今回の事例を実際に解いてみましょう。

ステップ1:サンプル数,平均,標準偏差を求めた stat_summary テーブル(既出)を作成する。
ステップ2:大標本のもので統計量Tを求める。

categorycnt_acnt_bavg_aavg_bstat_t
... ... ... ... ... ...
調味料 846 2029 1422 4557 2.07
菓子 59 49 19860 39386 2.07
ビール 830 2376 8318 11156 1.85
403 1441 262 701 1.75
... ... ... ... ... ...
ステップ3:有意水準5%,10%における棄却域Rと比較し,結論を得る

categorycnt_acnt_bavg_aavg_bstat_tSL5SL10
焼酎 178 422 640 994 2.23 Reject Reject
調味料 846 2029 1422 4557 2.07 Reject Reject
菓子 59 49 19860 39386 2.07 Reject Reject
ビール 830 2376 8318 11156 1.85 Accept Reject
403 1441 262 701 1.75 Accept Reject
ジャム・蜂蜜 218 525 2192 3472 1.71 Accept Reject
その他乳製品 802 2375 866 1120 1.64 Accept Reject
冷凍食品 185 369 1678 2230 1.57 Accept Accept
乾豆・米類(雑穀) 245 544 2437 3328 1.4 Accept Accept
箱代 39 94 1859 2927 1.11 Accept Accept
弁当 385 1283 1492 1341 0.93 Accept Accept

有意水準5%で見るならば,「ビール」以下のカテゴリでは「有意な差が認められない」と判断されます。逆にビールより上の「菓子」以上のカテゴリでは「有意な差がある」つまり,セールスの効果があったものと判断することができます。

有意水準10%で見れば,「その他乳製品」以上のものが「有意な差がある」とみなされ,5%の時よりも Reject(有意な差が認められない) されないカテゴリが少なくなっています。後述しますが,「Reject されない」とうことは「結論を得られない」となってしまう場合があるため,できるだけ棄却される有意水準5%が好まれます。

「有意な差が認められない」≠「AとBは同じ」⇒「何とも言えない」

ところでこの結果に多くの方は驚くかもしれません。なぜなら「水」カテゴリではA(会員)の平均購買単価が262円に対してBが701円であるのに「有意な差が認められない」と判定されているからです。

categorycnt_acnt_bavg_aavg_bstd_astd_bdiststat_tSL5SL10
403 1441 262 701 461 9487 z 1.75 Accept Accept

統計量Tの計算式を再度確認してみてください,

(水カテゴリの統計量T) = (701-262) / √(461*461/403)+(9487*9487/1441)

= 439 / √( 527 + 62458 ) = 439 / 250 = 1.75

これは B の標準偏差がAに対してあまりにも大きいため(分散=ばらつきが大きいともいえる)に,Tの分母の値が大きくなりすぎて,棄却域R=1.96 を下回っている事によるものです。この事実から,私達は,

「有意な差が認められない」の解釈が,

  • 「AとBは同じ」と断定するものでなく,
  • 「AとBの差については何とも言えない」としかいえないケースがある。

という,テスト(背理法)の曖昧性を思い知らされる事になります。

ポイント7:片方に対して他方のばらつきががあまりにも大きい場合,A/Bテストは「AとBに差が認められない」という結論を得るが,この場合は「今回のA/Bテストケースではサンプルが不安定すぎて正常な判定ができない状況である=今回のテストでは何とも言えない」という解釈になる。

最後に

心の準備編で述べた「統計的手法それ自信が完全な意思決定を行ってくれる(白黒はっきりしてくれるもの)ものではなく,最終的には人間の判断に委ねられるものである」の真意は,

  • 実際には差が無いのに「AとBには差がある」と誤判断される可能性が必ず含まれていること,
  • 逆に「AとBに差がない」と判断されても,「AとBは同じ」と結論できるケースは少なく,「AとBが同じかどうかは何とも言えない」というあいまいな結果に終わってしまう可能性が結構あること,
  • 有意水準(信頼度)の設定を変えれば,有意な差があるかの判断が変わってしまうこと,

この3点が背景があります。

実際,私達が出会う実データでは,残念ながら統計の教科書や論文に出てくるような大人しいデータではありません。多数のエラーや外れ値が含まれたり,非常にばらつきの大きな値を潜在するデータに対して統計的手法を用い,多数の誤解・矛盾がうまれることは免れません。

データ分析が本質的に難しいと捉えられるのは,こうした手法やデータの成立の深い理解があり,かつ時折生じる矛盾や誤解をきちんと察知できるところに至るまでに多数の時間と経験がかかってしまう所にあるのかもしれませんね。

次回は異なる事例を見ていきます。