統計的因果推論(対応が無い2標本t検定)RCTによるメールマーケティングの効果検証

データ分析
こんにちわ!やじろべえです。今回は統計的因果推論ということで、おそらく一番有名であろうRCT(Randomized Controlled Trial)による効果検証についてPythonで分析してみました。
因果推論を学習するにあたり、何か参考書籍は無いか探していたところ良さげな一冊を発見しました。データ分析界隈で有名な方々もこちらの書籍を一押ししていたので、早速私も購入してみました。

この記事を書いている段階ではまだ半分くらいしか読めていないですが、評判通りとても良い書籍だと感じています。内容も難しすぎずかつ大事な部分はしっかり書かれています。
ただ、R言語での説明となりますので、普段Pythonを使い慣れてる方はそこだけ注意を。
この記事もこちらの書籍をベースとしてR言語ではなくPythonで書いてみました。
RCT、t検定、統計的有意差あたりはある程度理解している前提で進めていきます。

データセットの入手

まずデータセットを入手します。書籍でも紹介されている通り、MineThatData E-Mail Analytics And Data Mining Challenge datasetを使います。
このデータセットは、ECサイトのユーザーに対してRCTを適用したメールマーケティングを行ったものです。
segmentカラムを見ていただくとわかる通り、この施策では男性向けにメール配信・女性向けにメール配信・メール配信無しの三つの選択肢がランダムに割り当てられています。
今回の検証では簡略化のため、女性向けのメール配信データは削除し、介入グループは男性向けメール配信ユーザーに限定します。

データの読込と必要なレコードの絞り込み

import pandas as pd
import numpy as np
from scipy import stats

df = pd.read_csv('./MineThatData_E-MailAnalytics.csv')
print(df.shape)
df.head()

mens_df = df[df['segment'] != 'Womens E-Mail']

 

メール配信有りと無しグループで集計

 

# 男性向けにメール配信があったユーザーにフラグ付け
mens_df['treatment'] = 0
mens_df['treatment'].where(mens_df['segment'] != 'Mens E-Mail', 1, inplace=True)

mens_email = mens_df[mens_df['treatment'] == 1]
no_mail = mens_df[mens_df['treatment'] == 0]

print('----- treatment : 1')
print('conversion rate: ', mens_email['conversion'].mean())
print('spend mean: ', mens_email['spend'].mean())
print('----- treatment : 0')
print('conversion rate: ', no_mail['conversion'].mean())
print('spend mean: ', no_mail['spend'].mean())

#----- treatment : 1
#conversion rate:  0.01253109306800582
#spend mean:  1.422616511005773
#----- treatment : 0
#conversion rate:  0.005726086548390125
#spend mean:  0.6527893551112363
この結果を見ると、男性向けにメール配信があったグループでは、コンバージョン率が1.25%であるのに対し、メール配信が無かったグループは0.573%であり、メール配信を行ったグループの方がコンバージョン率が高いことがわかります。
売上金額(spend)も同じようにグループごとで比較すると、メール配信したグループはしていないグループよりも0.76程度高いことがわかります。
すなわち、メール配信を行うことで、コンバージョン率が上がりその影響で平均の売上金額も上がっていると推測できます。

統計学的有意差検定

今回の集計を行うにあたって、事前にRCTによる2グループに分けたことでセレクションバイアスは無いと考え、各グループ間の売上の平均金額に対して有意差検定を行い、この結果が偶然生まれたものかどうかを評価します。
今回は介入が行われたグループとそうでないグループの売上は等分散ではないことを仮定して、信頼度95%としてweltchのt検定を行います。
scipyでweltchのt検定を行う際は、stats.ttest_ind関数を使って引数であるequal_var=Falseに設定します。
stats.ttest_ind(mens_email['spend'],no_mail['spend'], equal_var=False)
#Ttest_indResult(statistic=5.300140358411668, pvalue=1.1638149682254859e-07)
結果を見てみると、p値が1.163e-7という非常に小さな値となり、二つのグループ間の平均の売上げの差は統計的に有意なものを示唆することがわかります。

まとめ

今回は因果推論の一番有名なRCTについて、t検定による効果検証をやってみました。pythonでもpandasとscipyを上手く使えばコード量も少なく検証できます。
効果検証はR言語で解説されていますが、pythonに書き直してみて自分が理解出来ているかどうかを確かめるのも良さそうです。

参考書籍

  • 効果検証入門(正しい比較のための因果推論/計量経済学の基礎)

タイトルとURLをコピーしました