いろいろやってみよう

完璧を目指すより、まず終わらせろ

書籍:効果検証入門[1章1.4.3]

1章

1.4.3 バイアスが含まれるデータにおいて、どの程度効果が不正に多く出てしまうかを確かめる。

前回は、RCTを行ったメールマーケティングのデータに関して、メール配信有無で購入率や購入金額が異なっていたことを示しました。
今回は、そのデータにあえてバイアスを発生させ、それによってメール配信有無の効果がどの程度不正に多く出てくるかを確認します。

# 乱数の固定
set.seed(1)

# しきい値の設定
obs_rate_c <- 0.5
obs_rate_t <- 0.5

# バイアスデータの作成
biased_data <- male_df %>% 
  mutate(obs_rate_c = if_else((history > 300) | (recency < 6) | (channel == 'Multichannel'), obs_rate_c, 1),
         obs_rate_t = if_else((history > 300) | (recency < 6) | (channel == 'Multichannel'), 1, obs_rate_t),
         random_number = runif(n = NROW(male_df))) %>% 
  # データの選定
  filter((treatment == 0 & random_number < obs_rate_c) | (treatment == 1 & random_number < obs_rate_t))

# バイアスデータの作成
前回使用したデータから、セレクションバイアスのあるデータを作成します。
バイアスのあるデータを作る上でのゴールは、あたかも潜在的な購入確率が高いユーザーにはメールをより多く配信していて、逆に低いユーザーにはあまりメールを送っていなかった、となるようにすることです。
処理を場合分けすると、以下のようになります。

f:id:mamamashio:20211013192617p:plain

細かい処理については以下のような形です。
obs_rate_c は、メール配信無しのユーザー郡から、バイアスデータに含まれる確率を表すものです。
もし、潜在的な購入確率が高ければ「0.5」、そうでなければ「1」が入ります。

obs_rate_t はその逆で、メール配信有りのユーザー郡から、バイアスデータに含まれる確率を表すものです。
もし、潜在的な購入確率が高ければ「1」、そうでなければ「0.5」が入ります。

# データの選定
ここの条件により、メール配信有り群には潜在的な購入確率が高いユーザーが選ばれやすくなり、
逆にメール配信無し群では潜在的な購入確率が低いユーザーが選ばれやすくなっています。

# treatment 毎に、指定列の平均等を計算
summary_by_segment_biased <- biased_data %>% 
  group_by(treatment) %>% 
  summarise(conversion_rate = mean(conversion),
            spend_mean = mean(spend),
            count = n())

# 購入金額のみの、ベクトルを作成
mens_mail_biased <- biased_data %>% 
  filter(treatment == 1) %>% 
  pull(spend)

no_mail_biased <- biased_data %>% 
  filter(treatment == 0) %>% 
  pull(spend)

# t検定の実行
rct_ttest_biased <- t.test(mens_mail_biased, no_mail_biased, var.equal = TRUE)
# 単純集計の、結果出力
summary_by_segment_biased

# A tibble: 2 x 4
  treatment conversion_rate spend_mean count
      <dbl>           <dbl>      <dbl> <int>
1         0         0.00498      0.548 14665
2         1         0.0134       1.53  17198


# t検定の結果出力
rct_ttest_biased

	Two Sample t-test

data:  mens_mail_biased and no_mail_biased
t = 5.6708, df = 31861, p-value = 1.433e-08
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.6409145 1.3179784
sample estimates:
mean of x mean of y 
1.5277526 0.5483062 

# 単純集計の、結果出力
結果を見ると、
0.134「treatment = 0:メール配信なし」の conversion_rate が0.498%なのに対して、「treatment = 1:男性向けメール配信あり」の conversion_rate は1.34%あります。
差し引き、0.842%ptの差が発生しました。
これは、前回見たバイアスが発生していないデータでの差分の0.677%ptよりも、0.165%pt高い値になっています。

同様に spend_mean を見ると、前者は0.548ドル、後者は1.53ドルとなり、差分は0.982ドル。
前回確認した際の差分は0.767ドルだったので、こちらも0.215ドル高い値になっています。

この差分は、潜在的に購入確率が高いユーザーにメールを送り、逆に低いユーザーには送らなかったことで生まれたセレクションバイアスによって発生しています。

# t検定の結果出力
こちらを確認すると、「p-value = 1.433e-08」と小さい値になっています。
ということは、メール配信有無ごとの平均購入金額には違いがあると統計的に判断されたことになります。

セレクションバイアスによってメール配信有無の効果が不正に高くなり、ただその効果は統計的に意味がある差と判断されてしまう状況です。

等分散を仮定しているが、実際はそうではない様子。これでよいのかな?

先述のt検定の引数に関して、「var.equal = TRUE」としていました。
これは等分散を仮定しているのですが、本当にそうでしょうか。
一応、前回同様確認してみます。

# 等分散性の検定の実行
var.test(mens_mail_biased, no_mail_biased)

	F test to compare two variances

data:  mens_mail_biased and no_mail_biased
F = 3.2817, num df = 17197, denom df = 14664, p-value < 2.2e-16
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 3.180982 3.385508
sample estimates:
ratio of variances 
          3.281716 

# 等分散性の検定の実行
検定の結果、「p-value < 2.2e-16」となり、等分散ではないという結果になったようです。
前回もそうでしたが、これはどう解釈すればよいのか。。。

次回は、回帰分析を用いたセレクションバイアスの低減方法あたり

書籍で言う、2章の部分に入っていきます。