相关比例检验

网站投放广告的时候,一开始给大家看到的落地页是访问课程资料,现在又推出了开始免费试学这个落地页,网站的两个不同的落地页(老版本,新版本),想知道哪个版本的落地页能带来更多的转化率,这时候就要检测两个落地页的转化效果,下面是测试的24天数据
一、描述统计分析¶
#读取数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
df = pd.read_csv('C:/Users/mxl/Desktop/小鸟计划/ab_data.csv')
df.head()

user_id-用户,timestamp-用户访问页面的时间,group-旧方案control和新方案trement分组, landing_page-落地页是旧页(访问课程资料)或新页(开始免费试学),converted-1表示已转化
#查看每一列的数据类型
df.dtypes
#描述统计信息
df.describe()
#数据集中有treament和new_page不一致的数据,要对数据集中的这些数据进行剔除,观察treatment有写成treament
df.loc[(df["group"] == "treatment")!=(df["landing_page"] == "new_page")].count()
#剔除错误记录,剩下的作为测试数据
df_test = df.loc[~((df["group"] == "treatment")!=(df["landing_page"] == "new_page"))]
#查看有没有重复用户,若有就去重
df_test.user_id.nunique()
#对重复的数据用duplicate进行删除,对象是User_id,保留第一个
df_test = df_test.drop_duplicates(subset=["user_id"],keep='first')
#样本均值
a_mean=df_test.loc[df_test['landing_page']=='new_page']['converted'].mean()
b_mean=df_test.loc[df_test['landing_page']=='old_page']['converted'].mean()
#样本数量
n_a=df_test.loc[df_test['group']=='treatment'].shape[0]
n_b=df_test.loc[df_test['group']=='control'].shape[0]
print('A版本平均值=',a_mean,'转化量')
print('B版本平均值=',b_mean,'转化量')

二、推论统计分析
1、问题是什么
自变量是指原因。因变量是指结果,也就是自变量发生变化导致改变的值就是因变量。
自变量:我们有两组实验数据,第一组是落地页是新网页。第二组落地页是旧网页。所以自变量是落地页的类型
因变量:落地页带来的转化量
所以,我们要考察的是自变量(落地页)两种情况下对因变量(网页成交转化量)的影响。
零假设和备选假设
测试用户分为两部分,一部分用新页面A,一部分用旧页面B,经过一定时间后,收集到两方案的观测数据,要研究的问题是A和B方案的转化率的差异性。由于我们期望是A方案页面的成交转化率高于B方案页面的成交转化率,所以提出下面两个互为相反的假设:
零假设:u_a-u_b= 0
零假设总是表述为研究没有改变,没有效果,不起作用等。
备选假设:u_a-u_b>0
A版本和B版本有差别,也就是A版本平均值大于B版本平均值。
检验类型
由于两种数据是相关样本,采用的是相关比例检验
相关比例检验只关注每组数据相关比例的差值
检验方向
备选假设是A版本和B版本有差别,也就是A版本转化率平均值大于B版本转化率平均值,所以我们使用右尾检验。
2、证据是什么
在零假设成立前提下,得到样本平均值的概率p是多少?
'''用python统计包statsmodels.stats.proportion.proportions_ztest自动计算
基于正态z检验的比例检验:http://www.statsmodels.org/dev/generated/statsmodels.stats.proportion.proportions_ztest.html#statsmodels.stats.proportion.proportions_ztest
'''
#导入统计模块
import statsmodels.stats.proportion as sm
#计算转化在新网页和旧网页的样本比例
convert_new = df_test.query('group == "treatment" & converted == 1').shape[0]
convert_old = df_test.query('group == "control" & converted == 1').shape[0]
z_score,p_value = sm.proportions_ztest([convert_new,convert_old],[n_a,n_b],alternative='smaller')
这里alternative表示备择假设可以是双侧检验two-sided,也可以是单侧检验之一,smaller表示备择假设为prop < value,较大的表示prop >value。在两个样本检验中,smaller表示备择假设为p1 < p2,较大的表示p1 > p2,其中p1为第一个样本比例,p2第二个样本的比例。
z_score,p_value

3、判断标准是什么
显著水平 alpha=0.05
4、做出结论
#右尾判断条件:p_value<alpha时,拒绝原假设
if(p_value<alpha):
print('拒绝零假设,有统计显著,也就是接受备选假设')
print('备选假设:A版本和B版本有差异')
else:
print('接受零假设,没有统计显著')
print('零假设:A版本和B版本没有差异')

5、置信区间
#1)置信水平对于的z值
#2)计算上下限
#置信区间上限=样本平均值-z_score*标准误差
#置信区间下限=样本平均值+z_score*标准误差
a=(a_mean-b_mean)-z_score*np.sqrt(a_mean*(1-a_mean)/n_a + b_mean*(1-b_mean)/n_b)
b=(a_mean-b_mean)+z_score*np.sqrt(a_mean*(1-a_mean)/n_a + b_mean*(1-b_mean)/n_b)

6、效应量
#总体比例差平均值差值对应的值是0
pop_mean=0
#样本比例差平均值差值对应的值是0
sample_mean=a_mean-b_mean
#总体比例差平均值差值的标准差
sample_std=np.sqrt(a_mean*(1-a_mean)/n_a + b_mean*(1-b_mean)/n_b)
d=(sample_mean - pop_mean) / sample_std
print('d=',d)
三、数据分析报告总结
1、描述统计分析
A版本平均值= 0.11880806551510564 转化量
B版本平均值= 0.1203863045004612 转化量
2、推论统计分析
1)假设检验
本次假设检验是基于正态(z)检验的比例检验 z_score=-1.3109241984234394,p_value=0.094941687240975514,单侧检验(右侧) 统计上不存在显著差异,接受零假设
2)置信区间
总体比例差的95%的置信区间 CI=[-3.5520257269348876e-09,-0.0031564744186853865]
3)效应量
d= -1.31092714883,效果显著
参考链接:
1、数据集
https://www.jianshu.com/go-wild?ac=2&url=https%3A%2F%2Fpan.baidu.com%2Fs%2F1KFernlpMtqgSt2Zp9yZa1g
2、数据分析AB测试实战项目
https://www.jianshu.com/p/1c0c4c3ea889