qiitaにも同じ記事があるのですが、試しにzennにも移植してみました。
はじめに
A/Bテストを行う際、施策を打ったことによる効果を推定するだけでなく、推定値がどれだけ信頼出来るものなのかを計算することはとても重要です。
そこで、効果の推定誤差と信頼区間を導出します。
![](https://storage.googleapis.com/zenn-user-upload/k4bxafyyk3cs0hwy16pre1tq78xb)
例) ATEの推定値と上下95%信頼区間
問題設定
あるキャンペーンを打つことで、ECサイトの商品購入率がどれだけ変化するかを推定します。
キャンペーンの対象となる介入群をT, キャンペーン対象外となる統制群をC, サンプルサイズをそれぞれn, m、母平均をpT, pCとすると、介入群と統制群におけるユーザーの行動XT, XCはベルヌーイ分布に従います。
ユーザーが商品を購入したなら1, 購入しなかったら0となります。
なお、ユーザーはA/Bを独立して割り付けられ、ユーザーの行動は独立とします。
XT1,XT2,…XTn∼Bern(pT)XC1,XC2,…XCm∼Bern(pC)
効果の分布の推定
キャンペーンを打つことが購入率に与える施策の効果をATEと表記します。
ATEの分布、平均、分散を導出します。
中心極限定理
平均、分散パラメータにμ,σ2を持つ確率分布Fから独立にサンプリングされた標本があるとすると、
X1,X2,…,iid∼F(μ,σ2)
中心極限定理より、標本平均Xˉについて次の分布収束が成り立ちます。
n→∞limP(σn(Xˉ−μ)≤x)=Φ(x)
つまり、平均と分散パラメータを持つ任意の確率分布から独立に発生した標本の標本平均が従う分布は、漸近的に正規分布に近づいていきます。
ベルヌーイ分布の母平均をpとすれば母分散はp(1−p)で表せるので、サンプルサイズが大きい場合、介入群と統制群の標本平均XTˉ,XCˉは以下の正規分布に従います。
XTˉ=n1∑nXTiXCˉ=m1∑mXCiXTˉ∼N(pT,n1pT(1−pT))XCˉ∼N(pC,m1pC(1−pC))
効果の定義
効果ATEは、2つの潜在的な結果変数の期待値の差と定義します。
ATE=E[XT−XC]=E[XT]−E[XC]=pT−pC
「ユーザーの母集団全てが介入群に割り当てられた際の結果」と「ユーザーの母集団全てが統制群に割り当てられた際の結果」の差の平均です。
実際は、ユーザーは介入群か統制群どちらかにしか割り当てられません。
例えば、あるユーザーがキャンペーン対象者になったとき、その後商品を購入したかは観測できます。
しかし、そのユーザーは既にキャンペーン対象に割り当ててしまっているので、そのユーザーがキャンペーン対象にならなかったとき商品を購入したかどうかはわかりません。
なので、ATEは直接データから値を計算することはできません。
そこで、通常A/Bテストは割り当てを完全にランダムに行います。
割り当てがランダムに行われていれば、観測された各群の平均値の差を用いることで効果をバイアスなく(不偏)推定できます。
ATEの推定量をATE^とおきます。
ATE^=n1∑nXT,i+m1∑mXC,i=XTˉ−XCˉE[ATE^]=E[XTˉ]−E[XCˉ]=pT−pC=ATE
効果の推定量が従う確率分布の導出
効果の推定量は介入群の購入率 - 統制群の購入率
で計算します。
介入群の購入率
と統制群の購入率
はそれぞれ正規分布に従うので、それらを元に計算した統計量も正規分布に従います。
ATE^=XTˉ−XCˉ∼N(pT−pC,n1pT(1−pT)+m1pC(1−pC))
施策を打ったことによる効果の統計量ATE^が従う確率分布の母数は
- 平均pT−pC
- 分散n1pT(1−pT)+m1pC(1−pC)
- 標準偏差n1pT(1−pT)+m1pC(1−pC)
となります。
推測統計における単語の整理
ここまで様々な記号を前振りなく使ってきました。
一度様々な用語を整理します。
統計調査と推測統計
統計調査は、母集団の特性を調べるためにデータを抽出し、そのデータを加工して母集団に関する有益な情報を導いて判断や決定の材料にするために行います。
母集団の全員に調査するのが難しい場合、母集団から標本を抽出して母集団に対する推測を行います。
推測統計では、母集団に確率モデルを想定し、その確率分布に従う確率変数の実現値としてデータを捉えます。
ある確率分布に従う標本X1,X2,…,Xnは確率変数で、その実現値x1,x2,…,xnがデータです。nを標本の大きさ(sample size)と言います。
母数と統計量・推定量
母集団の平均μや分散σ2など、母集団の特性を表すものを母数と言います。
標本X1,X2,…,Xnに基づいた関数で母数を含んでいないものを統計量といい、その確率分布を標本分布と言います。
例えば、標本X1や標本平均XTˉなどが統計量です。また、統計量を元に計算するATE^も統計量となります。
推測統計においては、統計量を計算することで母数を推測します。
標本から得た統計量をもとに、母集団のパラメータを推定するとき、標本の統計量のことを、推定量といいます。
推定量と推定値について
推定量は確率変数です。確定的に何かしらの値をとるわけではありません。
実際にデータを観測して得られた数字をつかって計算したものが、推定値です。
推定量と推定値の違い
効果の確率分布の母数の推定
実際に観測されたデータを用いて母数を推定します。
母平均の推定
母集団の平均μは母数ですが、母集団の全てのデータを元に直接計算するのは容易ではありません。
そこで、n個のデータを観測したのち、標本平均Xˉ=n1∑nXiを計算します。
標本平均はその平均が母平均と一致します。E[Xˉ]=μです。
なので、標本平均を通じて母平均を推測することが可能になります。
データを(x1,x2,…,xn)とすると、推定値はxˉ=∑nxiとなります。
母平均の不確実性
ただし、統計量(=推定量)は確率変数なので、不確実性がつきまといます。
10個のデータを元に計算した標本平均と10000個のデータを元にした標本平均では、その値に対する不確実性が大きく変わってきます。
そこで、標準誤差を計算して不確実性を明らかにします。
標準偏差と標準誤差の違い
確率変数Xがあるとき、平均μ=E[X]、分散σ2=Var(X)=E[(X−μ)2]が定義出来ます。
分散のルートを取ったものを標準偏差σ=Var(X)といいます。
統計量も確率変数なので、同様に標準偏差を定義出来ます。
統計量はその平均が母平均になることを通じて、母数の値を推定することによく使われます。
なので、統計量の標準偏差、すなわち真の値に対する推定値の不確実性は「標準誤差」と呼ばれます。
例えば、標本平均Xˉ=n1∑i=1nXiの標準偏差はnσとなりますが、Xˉは母平均μを推定するための統計量であるという観点で、その不確実性を表すnσは標準誤差です。
標準偏差の推定
推定量の期待値が母数と等しい場合、不偏推定量と言います。
例えば、標本平均は母平均の不偏推定量です。
母分散σ2の不偏推定量V2は以下のようになります。
V2=n−11∑n(Xi−Xˉ)2E[V2]=σ2
V2は不偏分散と呼ばれます。
標本平均は個々のデータの合計をnで割りましたが、不偏分散はn−1で割るのがポイントです。
Pandasの関数df.var()
やdf.std()
ではデフォルトで不偏分散が計算されるようになっています。
上の定義に従って不偏分散を計算することも出来ますが、ベルヌーイ分布の分散がp(1−p)で計算できることを利用して、標本平均Xˉや標本分散Xˉ(1−Xˉ)を使って不偏分散V2を計算することも出来ます。
E[Xˉ(1−Xˉ)]E[n−1nXˉ(1−Xˉ)]=E[Xˉ−Xˉ2]=E[Xˉ]−E[Xˉ2]=E[Xˉ]−(E[Xˉ]2+Var(Xˉ))=p−p2−n21∑nVar(Xi)=p(1−p)−n1p(1−p)=nn−1p(1−p)=σ2
従って、Xの不偏分散はV2=n−1nXˉ(1−Xˉ)となります。
介入群と統制群の不偏分散は以下のようになります。
VT2=n−1nXTˉ(1−XTˉ)VC2=m−1mXCˉ(1−XCˉ)
Xの母平均μの推定値として標本平均xˉを計算します。
Xの母分散σ2=p(1−p)の推定値v2は以下のようになります。
xˉ=n1∑nxiv2=n−1nxˉ(1−xˉ)
標準偏差の推定値はvです。
標準誤差の推定
標本平均Xˉの分散(標準誤差の2乗)は以下のようになります。
SE2=nV2
介入群と統制群の標本平均の分散は以下のようになります。
SET2=nVT2SEC2=mVC2
従って、効果の分散は以下のようになります。
VATE2=SET2+SEC2=nVT2+mVC2
プールした分散
介入群と統制群が従う確率分布の分散がVTC2で等しいと仮定すると、ATE^の分散を小さく(=推定精度を高める)ことができます。
等分散性が成り立つか予めチェックが必要です。
VT2=n−1nXTˉ(1−XTˉ)VC2=m−1mXCˉ(1−XCˉ)VTC2=(n−1)+(m−1)(n−1)VT2+(m−1)VC2=n+m−2(n−1)VT2+(m−1)VC2VATE,pool2=nVTC2+mVTC2
効果の確率分布の母数の推定まとめ
今までに出てきた式をまとめます。
介入群と処置群の確率分布について
XT1,XT2,…XTn∼Bern(pT)XC1,XC2,…XCm∼Bern(pC)XTˉ∼N(pT,n1pT(1−pT))XCˉ∼N(pC,m1pC(1−pC))ATE^∼N(pT−pC,n1pT(1−pT)+m1pC(1−pC))
効果の母数の推定量
平均パラメータの推定量
XTˉ=n1∑nXTiXCˉ=m1∑nXCiATE^=XTˉ−XCˉ
分散パラメータの推定量
VT2=n−1nXTˉ(1−XTˉ)VC2=m−1mXCˉ(1−XCˉ)VATE2=nVT2+mVC2VTC2=n+m−2(n−1)VT2+(m−1)VC2VATE,pool2=nVTC2+mVTC2
効果の母数の推定値について
観測されたデータを用いて、統計量の実現値である推定値を計算します。
ほぼ推定量と一緒なので一部省略します。
ate^=xTˉ−xCˉvATE2=nvT2+mvC2vATE,pool2=nvTC2+mvTC2
効果の推定値の信頼区間の計算
最後に、効果の推定値の不確実性を測るため、ATE^の信頼区間を計算します。
仮説検定と信頼区間
仮説検定では、帰無仮説と対立仮説という相対する2つの仮説を立てます。
通常なら母平均μはある値μ0だ、というのが帰無仮説です。
それに対し、母平均の値はμ0ではないのではないか、という仮説を対立仮説と言います。
確率変数Xの実現値xを観測することで、帰無仮説が正しい場合にその実現値が観測される確率がどれだけ珍しいのかを計算し、計算結果に基づいて仮説を受容したり棄却します。
ある確率変数が正規分布に従うとします。
分散σ02は既知とします。
X∼N(μ,σ02)
帰無仮説と対立仮説を以下のように設定します。
H0:μ=μ0H1:μ=μ0
帰無仮説の棄却域、受容域は以下のようになります。
R={x∈Rσ0∣x−μ0∣>zα/2}A={x∈Rσ0∣x−μ0∣≤zα/2}
zα/2とは標準正規分布のz値です。
標準正規分布Φ=N(0,1)からzαという値以上が取り出される確率がαとなります。
標準正規分布表の使い方
ここで、検定方式をXからμ0に反転させると
A={μ0∈Rσ0∣x−μ0∣≤zα/2}={μ0∈R∣x−μ0∣≤σ0zα/2}={μ0∈Rx−σ0zα/2≤μ0≤x+σ0zα/2}
となります。
帰無仮説が正しい場合、標本Xの実現値がxとして観測される確率が1−α%以内に収まる区間は[x−σ0zα/2,x+σ0zα/2]となります。
これを、信頼係数1−αの信頼区間と言います。
効果の推定量の信頼区間の計算
信頼区間の計算方法がわかったので、効果の信頼区間を実際に計算します。
効果が従う確率分布の母数
施策を打ったことによる効果の推定量ATE^が従う確率分布の母数は
μ=ATE=pT−pCσ=n1pT(1−pT)+m1pC(1−pC)
でした。
データから母数の推定値を計算
平均の推定値を計算します。
標準偏差の真の値はわからないので、代わりに不偏分散のルートで代用します。
μ^=ate^=xTˉ−xCˉσ0≈vATE=n−11xTˉ(1−xTˉ)+m−11xCˉ(1−xCˉ)
ATEが従う分布が正規分布の場合(※後述)、施策を打つことによる効果ATEの1−α信頼区間は
[μ^−vATEzα/2,μ^+vATEzα/2]
となります。
αとzα/2の関係は
α=0.05↔zα/2=1.96α=0.1↔zα/2=1.65
なので、例えばα=0.05の場合の両側95%信頼区間は
[μ^−1.96vATE,μ^+1.96vATE]
です。
「標本平均 ± 2 × 標準誤差」が両側95%信頼区間の近似になります。
実用上はまずこれを使うところから始めるといいと思います。
コード
![](https://storage.googleapis.com/zenn-user-upload/k4bxafyyk3cs0hwy16pre1tq78xb)
等分散性を仮定したほうが、推定誤差がわずかに小さいことがわかります。
感想など
色々調べたお陰で推論統計の概念を整理できました。
- ある事象の発生過程に確率分布を仮定し、その形状を決める母数を知りたい。
- 母数は観測不可なので、標本をもとに(不偏)推定量を導出する。
- 推定量は確率変数なので、確からしさを標準偏差や標準誤差として導出する。
- 実際に観測されたデータをもとに平均や標準誤差などの推定値を計算する。
用語がこんがらがってややこしい。。
参考文献
(久保川, 2017) 「現代数理統計学の基礎」
(星野, 2009) 「調査観察データの統計科学」
(安井, 2020) 「効果検証入門〜正しい比較のための因果推論/計量経済学の基礎」
(余談) 正規分布とt分布
信頼区間に正規分布を仮定しましたが、分散が未知の場合ATE^は正規分布ではなくt分布に従います。
今回の問題設定ではECサイトの商品購入率なので、十分なデータ数が集まり、t分布と正規分布の形状はほぼ一致します。そのため説明を省きました。
t分布を用いてより厳密な検定や信頼区間を推定したい場合は、zα/2をtα/2に置き換えてください。
実際に計算する際は、t値を手計算するのではなく、データから直接stats.ttest_ind
などのパッケージを用いた方が楽です。
Discussion