今回は介入効果を測るための回帰を学ぶ。計量経済学と機械学習の文脈では回帰の捉え方が異なる。つまり、計量経済学の目標はパラメータ推定と仮説検定、因果関係の明示であるのに対し、機械学習の目的は予測が主である。
以下、被説明変数Y、介入変数Z、共変量Xとする。
Y=\beta_0+\beta_1X+\beta_2 Z+\epsilon,\ \ \ \epsilon\sim \mathcal{N}(0,\beta^{-1})
なる線形回帰モデルを考える。介入効果を平均処置効果によって推定する場合、
E[Y|X,Z=1]-E[Y|X,Z=0]=(\beta_0+\beta_1X+\beta_2)-(\beta_0+\beta_1X+0)=\beta_2
より、推定量$\hat{\beta}_2$は介入効果の推定量と言える。モデルにXを加えていることによって、セレクションバイアスを軽減している。
2.1 メールマーケティングの効果の検証
前回と同じデータに対し、回帰分析を行う。
- 'segment', 'channel'に対してラベルエンコーディングを行う。scikit-learnのLabelEncoderを使おうと思ったが、どの数字を割り当てるかを指定できなかったので手動で数字を割り当てた。(SettingWithCopyWarning)
- 前回と同様なセレクションバイアスがかかったデータを作る。
- 'segment'のみを説明変数として単回帰を実行する。
- 共変量を加え重回帰を実行する。
email_data = pd.read_csv('Kevin_Hillstrom_MineThatData_E-MailAnalytics_DataMiningChallenge_2008.03.20.csv')
male_EMail = email_data[email_data['segment'] != 'Womens E-Mail']
#---
# ラベルエンコーディング
#---
male_EMail['segment'][male_EMail['segment'] == 'Mens E-Mail'] = 1
male_EMail['segment'][male_EMail['segment'] == 'No E-Mail'] = 0
male_EMail['channel'][male_EMail['channel'] == 'multichannel'] = 1
male_EMail['channel'][male_EMail['channel'] != 'multichannel'] = 0
#---
# バイアス付きデータの作成
#---
biased_male_EMail = male_EMail[((((male_EMail['history'] > 300) |
(male_EMail['recency'] < 6) |
(male_EMail['channel'] == 1)) & (male_EMail['segment'] == 1)) |
((male_EMail['history'] < 300) &
(male_EMail['recency'] > 6) &
(male_EMail['channel'] == 0) & (male_EMail['segment'] == 0)))]
#---
# 単回帰の実行
#---
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
biased_lr = LinearRegression()
X = male_EMail[['segment']]
Y = male_EMail['spend']
biased_X = biased_male_EMail[['segment']]
biased_Y = biased_male_EMail['spend']
lr.fit(X, Y)
biased_lr.fit(biased_X, biased_Y)
print('result of simple regression')
print(f'RCT: {lr.coef_[0]:.4f}, biased: {biased_lr.coef_[0]:.4f}')
print()
#---
# 重回帰の実行
#---
X = male_EMail[['history', 'recency', 'channel', 'segment']]
Y = male_EMail[['spend']]
biased_X = biased_male_EMail[['history', 'recency', 'channel', 'segment']]
biased_Y = biased_male_EMail[['spend']]
lr.fit(X, Y)
biased_lr.fit(X,Y)
print('result of multiple regression')
print(f'RCT: {lr.coef_[0][-1]:.4f}, biased: {biased_lr.coef_[0][-1]:.4f}')
###出力###
result of simple regression
RCT: 0.7698, biased: 1.1838
result of multiple regression
RCT: 0.7690, biased: 0.7690
このように、共変量を用いて回帰を行うことによって、セレクションバイアスの影響を些少することができる。
2.2脱落変数バイアス
- 脱落変数バイアス(OVB):ある回帰モデルにおいて、セレクションバイアスに含まれているにもかかわらずモデルに含まれていない共変量の影響の大きさ。そのような変数をモデルに加えることでOVBの影響を取り除くことができる。
- 交絡因子:介入変数Zに関連を持っていて、かつ目的変数Yとの相関もある、という変数。交絡因子をモデルに含めることでバイアスを軽減できる。
- CIA (Conditional Independence Assumption):あるモデルに含まれる共変量で条件づけた時に、介入の決定が完全にランダムである、という状態。モデルに含まれていない変数によるOVBが全て0である状態とも言える。
2.3Sensitivity Analysis
Sensitivity Analysisは、手持ちのデータに含まれない変数がセレクションバイアスを起こしているかどうかを評価するための方法。重要だと考えられる共変量以外の変数をモデルから抜くことで効果の推定値が大きく変動しないかを確認する、というもの。例えば、上の重回帰に明らかに効果に影響のない'visit'を含めて分析してみる。
#---
# 効果に影響がないvisitをモデルに入れて分析
#---
biased_X = biased_male_EMail[['history', 'recency', 'channel', 'visit', 'segment']]
biased_Y = biased_male_EMail[['spend']]
biased_lr.fit(X,Y)
print('result of multiple regression (visit is added)')
print(f'{biased_lr.coef_[0][-1]:.4f}')
###出力###
result of multiple regression (visit is added)
0.7690
回帰係数は変化しなかった。したがって、仮にデータセットに含まれていない変数を加えたとしても結果が大きく変化しないと考えられる。