分析A/B测试结果
简介
对于这个项目,你将要了解的是电子商务网站运行的 A/B 测试的结果。你的目标是通过这个 notebook 来帮助公司弄清楚他们是否应该使用新的页面,保留旧的页面,或者应该将测试时间延长,之后再做出决定。
I - 概率
让我们先导入库,然后开始你的任务吧。
import pandas as pd
import numpy as np
import random
import matplotlib.pyplot as plt
%matplotlib inline
#We are setting the seed to assure you get the same answers on quizzes as we set up
random.seed(42)
1.
现在,导入 ab_data.csv
数据,并将其存储在 df
中。 使用你的 dataframe 来回答课堂测试 1 中的问题。
a. 导入数据集,并在这里查看前几行:
df = pd.read_csv("ab_data.csv")
df.head()
user_id | timestamp | group | landing_page | converted | |
---|---|---|---|---|---|
0 | 851104 | 2017-01-21 22:11:48.556739 | control | old_page | 0 |
1 | 804228 | 2017-01-12 08:01:45.159739 | control | old_page | 0 |
2 | 661590 | 2017-01-11 16:55:06.154213 | treatment | new_page | 0 |
3 | 853541 | 2017-01-08 18:28:03.143765 | treatment | new_page | 0 |
4 | 864975 | 2017-01-21 01:52:26.210827 | control | old_page | 1 |
b. 使用下面的单元格来查找数据集中的行数。
df.shape
(294478, 5)
c. 数据集中独立用户的数量。
df.user_id.nunique()
290584
d. 用户转化的比例。
#计算独立用户的转化比例
df.query('converted==1').user_id.nunique()/df.user_id.nunique()
0.12104245244060237
e. new_page
与 treatment
不一致的次数。
df[((df['group'] == 'treatment') != (df['landing_page'] == 'new_page'))]['user_id'].count()
3893
f. 是否有任何行存在缺失值?
df.isnull().sum()
user_id 0
timestamp 0
group 0
landing_page 0
converted 0
dtype: int64
2.
对于 treatment 不与 new_page 一致的行或 control 不与 old_page 一致的行,我们不能确定该行是否真正接收到了新的或旧的页面。我们应该如何处理这些行?在课堂中的 测试 2 中,给出你的答案。
a. 现在,使用测试题的答案创建一个符合测试规格要求的新数据集。将新 dataframe 存储在 df2 中。
df2 = df.drop(df[((df['group'] == 'treatment') != (df['landing_page'] == 'new_page'))].index)
df2.shape
(290585, 5)
# Double Check all of the correct rows were removed - this should be 0
df2[((df2['group'] == 'treatment') == (df2['landing_page'] == 'new_page')) == False].shape[0]
0
3.
使用 df2 与下面的单元格来回答课堂中的 测试3 。
a. df2 中有多少唯一的 user_id?
df2.user_id.nunique()
290584
b. df2 中有一个重复的 user_id 。它是什么?
df2[df2.user_id.duplicated()==True]['user_id']
2893 773192
Name: user_id, dtype: int64
c. 这个重复的 user_id 的行信息是什么?
df2.query('user_id=="773192"')
user_id | timestamp | group | landing_page | converted | |
---|---|---|---|---|---|
1899 | 773192 | 2017-01-09 05:37:58.781806 | treatment | new_page | 0 |
2893 | 773192 | 2017-01-14 02:55:59.590927 | treatment | new_page | 0 |
d. 删除 一个 含有重复的 user_id 的行, 但需要确保你的 dataframe 为 df2。
#这里删除哪一行都可以
df2 = df2.drop(2893)
df2.shape
(290584, 5)
4.
在下面的单元格中,使用 df2 来回答与课堂中的 测试 4 相关的测试题目。
a. 不管它们收到什么页面,单个用户的转化率是多少?
df2.converted.mean()
0.11959708724499628
b. 假定一个用户处于 control
组中,他的转化率是多少?
#将控制组和试验组分别存储到df_ctrl和df_tr中
df_ctrl = df2.query('group == "control"')
df_tr = df2.query('group == "treatment"')
#控制组的转化率
df_ctrl.converted.mean()
0.1203863045004612
c. 假定一个用户处于 treatment
组中,他的转化率是多少?
#试验组的转化率
df_tr.converted.mean()
0.11880806551510564
d. 一个用户收到新页面的概率是多少?
df_tr.shape[0]/df2.shape[0]
0.5000619442226688
e. 使用这个问题的前两部分的结果,给出你的建议:你是否认为有证据表明一个页面可以带来更多的转化?在下面写出你的答案。
通过上面的计算,控制组的转化率为12.04%,试验组的转化率为11.88%,略低于控制组约0.16%。到目前为止我们没有充分的依据来判断新页面是否能带来更多的转化。我们需要通过假设检验来进一步观察样本转化率的差异值是否具有统计显著性。
II - A/B 测试
请注意,由于与每个事件相关的时间戳,你可以在进行每次观察时连续运行假设检验。
然而,问题的难点在于,一个页面被认为比另一页页面的效果好得多的时候你就要停止检验吗?还是需要在一定时间内持续发生?你需要将检验运行多长时间来决定哪个页面比另一个页面更好?
一般情况下,这些问题是A / B测试中最难的部分。如果你对下面提到的一些知识点比较生疏,请先回顾课程中的“描述统计学”部分的内容。
1.
现在,你要考虑的是,你需要根据提供的所有数据做出决定。如果你想假定旧的页面效果更好,除非新的页面在类型I错误率为5%的情况下才能证明效果更好,那么,你的零假设和备择假设是什么? 你可以根据单词或旧页面与新页面的转化率 p o l d p_{old} pold 与 p