此项目数据集来源于一家电子商务网站,数据集大小为294478,经过清洗后保留290584。公司在节假日期间设计了一个新的“落地页”,希望借此提高“潜在用户->注册用户“的转化率,现在借助A/B测试来判断是否应该保留原有网页还是采用新页面。
columns:user_id timestamp group(control,treatment) landing_page (old_page,new_page) converted(0,1)
预处理
获取数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from IPython import display
%matplotlib inline
df = pd.read_csv('ab_data.csv')
df.head(
清洗数据
由于treatment组对应的是new_page,而control组对应的是old_page,需要将不规范的数据去除。
df = df[(
(df['group'] == 'treatment') & (df['landing_page'] == 'new_page')) | (
(df['group'] == 'control') & (df['landing_page'] == 'old_page'))]
df.head()
```python
df_clean = df_clean.drop_duplicates(subset='user_id').reset_index(drop=True)
描述统计
# treatment与control组数量
c_new = df_clean[df_clean['group']=='treatment'].shape[0]
c_old = df_clean[df_clean['group']=='control'].shape[0]
print('c_new:',c_new)
print('c_old:',c_old,'\n')
# treatment与control组转化数量
c_c_new = (df_clean[df_clean['group']=='treatment'].converted==1).sum()
c_c_old = (df_clean[df_clean['group']=='control'].converted==1).sum()
print('c_c_new:',c_c_new)
print('c_c_old:',c_c_old,'\n')
# treatment与control组转化方差
s_new = (df_clean[df_clean['group']=='treatment'].converted==1).std()
s_old = (df_clean[df_clean['group']=='control'].converted==1).std()
print('s_new:',s_new)
print('s_old:',s_old,'\n')
# treatment与control组转率(平均值)
p_new = (df_clean[df_clean['group']=='treatment'].converted==1).mean()
p_old = (df_clean[df_clean['group']=='control'].converted==1).mean()
print('p_new:',p_new)
rint('p_old:',p_old)
c_new: 145310c_old: 145274c_c_new: 17264c_c_old: 17489s_new: 0.3235636406751732s_old: 0.3254138459199159p_new: 0.11880806551510564p_old: 0.1203863045004612
平均数值显示用户处于control组时的转化率高于treatment组,但仅仅一个数据点难以进行判断,需要进行A/B测试。
推论统计
双独立样本检验 双尾检验
α=5%
零假设是,在这两网页转换率之间没有什么区别。
备择假设是,在有两网页转换率之间有显著差异。
使用proportions_ztestfrom statsmodels,它返回z分数和p值。
import statsmodels.api as sm
z_score, p_value = sm.stats.proportions_ztest([c_c_new, c_c_old], [c_new, c_old])
print('z_score:',z_score)
print('p_value:',p_value)
z_score: -1.3109241984234394
p_value: 0.18988337448195103
from scipy.stats import norm
# 计算z-score的显著程度
z = norm.cdf(z_score)
print(z)
0.09494168724097551
由于z得分0.09494168724097551小于临界值1.959963984540054,我们无法拒绝零假设,A版本和B版本不存在显著差异
置信区间
se=np.sqrt(np.square(s_new)/c_new + np.square(s_old)/c_old )
sample_mean=p_new - p_old
a=sample_mean - z * se
b=sample_mean + z * se
print('两个平均值差值的置信区间,95置信水平 CI=[%f,%f]' % (a,b))
两个平均值差值的置信区间,95置信水平 CI=[-0.001693,-0.001464]
新页面的转化率要低于1.5%到1.7%。
#合并标准差
sp=np.sqrt(((c_new-1)*np.square(s_new) + (c_old-1)* np.square(s_old) ) / (c_new+c_old-2))
#效应量Cohen's d
d=(p_new - p_old) / sp
print('d:',d)
d: -0.004863753093161925
描述统计分析
新版本转化率(平均值)是11.88%,标准差是0.3236
旧版本转化率(平均值)是12.04%,标准差是0.3254
推论统计分析
1)假设检验
独立双样本z=0.095,p=1.96(α=5%),双尾检验
接受零假设,统计不显著。
2)置信区间
两个平均值差值的置信区间,
95%置信水平CI=[-0.001693,-0.001464]。
3)效应量 d= -0.0049,效果不显著。
新页面的转化率不如旧页面,应该保留原页面。