線形回帰かT検定か。どちらを選ぶべきか?
\ 私たちはしばしば、華やかな機械学習モデルやディープラーニングのブレークスルーに関する話題に夢中になりがちですが、謙虚な線形回帰を見過ごしてはいけません。
\ ==LLMや最先端のアーキテクチャが存在する世界において、線形回帰は静かに重要な役割を果たしており、今日でもどのように有益であるかに光を当てる時が来ました。==
\ eコマース企業が新しいバナーを導入し、平均セッション長への影響を評価することを目指すシナリオを考えてみましょう。これを達成するために、実験が実施され、分析のためのデータが収集されました。結果を分析してみましょう。
このタスクに馴染みのあるツールを使用してみましょう:T検定です。
結果は非常に有望です:
指標の上昇は、単純に対照群と処置群のサンプル平均の差です。私たちの場合、推定上昇は0.56分であり、ユーザーは平均して製品を33秒長く使用していることを示しています。
次に、処置ベクトル(新しいバナーが表示されるかどうか)を独立変数として、平均セッション長を出力変数として線形回帰を使用してみましょう。
次に、モデルの要約を出力します:
\
\ 注目すべきは、処置変数の係数が以前の上昇推定値0.56と一致していることです。R二乗はわずか0.008であり、このモデルでは分散をあまり説明できていないことは注目に値します。
T検定から得られた上昇と処置係数が同じであることは偶然でしょうか?その関連性を掘り下げてみましょう。
\ 処置変数が何を反映しているかを考えてみましょう。それが1に等しい場合、バナーを閲覧したユーザーの平均セッション長を示します。0に等しい場合、バナーを見なかったユーザーの平均セッション長を示します。つまり、処置変数(または線形回帰用語では傾き)は、対照群と処置群の間の平均の変化を意味します。
線形回帰における処置変数の帰無仮説は何でしょうか?
実験にT検定を適用する場合の帰無仮説は何でしょうか?まったく同じです。
したがって、同一の仮説に対してt統計量とp値を計算する場合、私たちの調査結果は一貫して同一のままです。
しかし、線形回帰を使用する理由は何でしょうか?単に物事を過度に複雑にしたくありません。
\ まず、処置のみが主要指標の変化の原因であるかどうかを考えてみましょう。
\ 実際には、選択バイアスの存在により、これは完全に正確ではない可能性があります。
\ A/Bテストにおける選択バイアスは、比較されるグループ間にランダムな偶然によるものではない体系的な差がある場合のエラーの一種です。例えば:
\
古いユーザーが新規顧客よりも頻繁に新しいバナーに露出していることがわかります。
\
ABテストで使用するランダム割り当ては、これを軽減するのに役立ちますが、完全に排除することは困難です。
\ 真の効果を推定する方法を定式化してみましょう。
ATE: 推定を目指す平均処置効果。
\ ATT: 処置を受けた者の平均処置効果。これをACE:平均因果効果とも呼ぶことができます。実際に計算できます。これは対照群と処置群のサンプル平均の差です。
\ SB: 最小化を目指す選択バイアス。
\ どのようにしてそれを最小化できるでしょうか?
\ 線形回帰では、 共変量/交絡変数を追加できます。試してみて、交絡変数の1つとして 実験前のユーザーの平均セッション長を追加しましょう。
そして、モデルの要約を出力します:
R二乗が急上昇しました!今、私たちは分散の86%を説明しています。
\ 私たちの処置効果は現在0.47です。
それで、私たちには2つの処置効果があります:0.47と0.56。どちらが正しいのでしょうか?
\ この場合、データをシミュレートし、実際の上昇が0.5であるため、真の効果を確実に知っています
import numpy as np import pandas as pd from scipy import stats import statsmodels.api as sm np.random.seed(45) n = 500 x = np.random.normal(loc = 10 ,scale = 3, size= 2 * n) y = x + np.random.normal(loc = 2 , scale = 1 ,size = len(x)) # For 50% of users we simulate treatment effect treat = 1 * (np.random.rand(2 * n) <= 0.5) experiment = pd.DataFrame(x, columns=["covariate"]) experiment['metric'] = y experiment['treatment'] = treat experiment['noise'] = np.random.normal(size = len(experiment)) # Add noise and uplift to 'metric' for rows where 'treat' is equal to 1 # The real uplift is 0.5 experiment['metric'] = experiment.apply(lambda row: row['metric'] + 0.5 * row['treatment'] + row['noise'] if row['treatment'] == 1 else row['metric'], axis=1)
つまり、0.47は絶対差の観点でより良く、実際の上昇をより正確に反映しています。
線形回帰を使用することには次の利点があります:
\ ウェルチのt検定やカイ二乗検定など、他の検定に線形回帰を使用できるでしょうか?
\ 簡単な答えはイエスです。ただし、次の記事で説明するいくつかの調整を行う必要があります!


