实战AB测试
- 1、项目简介
- 2、数据集简介
- 3、实践
- 3.1 导入相关库
- 3.2 数据处理
- 3.3 假设检验
- 4、总结
1、项目简介
我们现在网站也给开通了,然后我们给网站投放广告的时候,一开始给大家看到的落地页是访问课程资料,现在我们又推出了开始免费试学这个落地页,要求检测两个落地页的转化效果了,下面是测试的24天,看数据会有24天的。AB测试理论
2、数据集简介
本数据集包含了测试时长24天内的数据。
- user_id:用户id
- timestamp:时间戳
- group:把新的落地页分到treatment组、把旧的落地页分到了control组
- landing_page:落地页
- converted:是否转化,1表示转化,0表示未转化
3、实践
3.1 导入相关库
import numpy as np
import pandas as pd
import random
import matplotlib.pyplot as plt
3.2 数据处理
1、导入数据
# 导入数据
df = pd.read_csv('E:/ab_data.csv')
# 查看数据首尾5行
df.head().append(df.tail())
2、描述性分析
# 查看数据形状
print(df.shape)
# 查看数据信息
print(df.info())
(294478, 5)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 294478 entries, 0 to 294477
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 user_id 294478 non-null int64
1 timestamp 294478 non-null object
2 group 294478 non-null object
3 landing_page 294478 non-null object
4 converted 294478 non-null int64
dtypes: int64(2), object(3)
memory usage: 11.2+ MB
None
3、查看缺失值
# 查看缺失值
df.isnull().sum() # 没有缺失值
4、清洗数据
- 根据分流的规则:treatment实验组对应new_page,control 控制对照组对应old_page。
- user_id不能重复
# 查看对于treatment和 new_page,或者control和old_page会出现不一致的行
df.loc[(df['group'] == 'treatment') != (df['landing_page'] == 'new_page')].count()
Output:
user_id 3893
timestamp 3893
group 3893
landing_page 3893
converted 3893
dtype: int64
# 去除无效数据,并将其赋值到df2中
df2 = df.loc[((df['group'] == 'treatment') == (df['landing_page'] == 'new_page'))]
# 删除重复值
df2 = df2.drop_duplicates(subset=['user_id'], keep='first') # 保留重复项中的第一项
# 查看df2的形状
print(df2.shape)
# 查看df2中是否还有重复值
print(df2.user_id.nunique())
(290584, 5)
290584
3.3 假设检验
验证:新页面转化率高于旧页面转化率 先了解下新旧版本各自对应的转换率
#整体转化率
p_total=df2['converted'].mean()
print('整体转化率%.2f%%'%(p_total*100))
# 新页面转化率
p_new=df2[df2['landing_page'] == 'new_page']['converted'].mean()
print('新页面转化率%.2f%%'%(p_new*100))
# 旧页面转化率
p_old=df2[df2['landing_page'] == 'old_page']['converted'].mean()
print('旧页面转化率%.2f%%'%(p_old*100))
Output:
整体转化率12.17%
新页面转化率12.30%
旧页面转化率12.04%
原假设H0:P_new-P_old<=0 备择假设H1:P_new-P_old>0
根据备择假设 ,假设条件中符号为“>”,因此检验方向应为单侧右尾;
样本大于30,总体的均值和标准差未知,用Z检验检验方法可为以下几类:
方法一:根据公式计算检验统计量Z值
# 新页面数量
n_new = df2[df2['landing_page'] == 'new_page'].shape[0]
# 旧页面数量
n_old = df2[df2['landing_page'] == 'old_page'].shape[0]
# 引入SciPy库
from scipy.stats import norm
# 计算显著性检验Z值
z_score = (p_new - p_old) / np.sqrt(p_old * (1 - p_old) / n_old + p_new * (1 - p_new) / n_new)
# 计算置信区间
z_alpha = norm.ppf(0.05)#-1.64485
print("z:",z_score,"z_alpha:",z_alpha)
z: 2.1484251875260187 z_alpha: -1.6448536269514729
- 可以看出z值在拒绝域内,因此得出结论显著性水平 =0.05时,拒绝零假设。
方法二:使用Python包直接计算
- Z值和P值可以通过Python包直接算出
import statsmodels.stats.weightstats as sw
z_value, p_value = sw.ztest(df2.query('landing_page=="new_page"')['converted'], df2.query('landing_page=="old_page"')['converted'],
alternative='larger')
#依照备择假设的设定输入,alternative='smaller'表示左尾,'larger'表示右尾
print(z_value,p_value)
2.148415338961362 0.01584038766094882
- Z值与公式所得基本一致。p=0.0158< =0.05,因此拒绝零假设。
4、总结
本文对ABtest进行数据统计,分析新旧页面的转化率以及其他因素的影响。通过分析可知,零假设不成立,即拒绝旧页面转化率高于或等于新页面的可能,新页面的转化率很大机会高于旧页面,也就意味着我们可以将新页面投入使用了。