目录
一、项目背景
二、字段说明?
三、数据处理
1.导入库
2.读取数据
3.查看数据
4??数据预处理
4.1??检查错误数据
5??假设校验
5.1??提出零假设和备择假设
5.2??确定抽样分布类型
5.3??确定检验类型
5.4??确定检验方向
5.5??显著性水平α
5.6??计算校验统计量
一、项目背景
数据集来源于一家电商网站,希望通过对于一次AB测试数据的分析判断新旧两版页面在用户转化上是否有显著区别,帮助公司决定是应当采用新的页面,还是保留老的页面。
二、字段说明?
user_id :用户ID ? timestamp :用户行为时间戳 ? ? ? group :分组标签:control-对照组;treatment-实验组 ?? landing_page :展示的页面版本 ?? converted :是否转化:0-没有转化;1-有转化 ? ?
三、数据处理
1.导入库
import pandas as pd
import os
from scipy.stats import norm
import numpy as np
2.读取数据
df=pd.read_csv('ab_data.csv')
3.查看数据
df.info()
df.describe()
?
df.describe(include='object')
?
df.head()
?
4??数据预处理
4.1??检查错误数据
df[((df['group']=='control')&(df['landing_page']=='new_page'))|((df['group']=='treatment')&(df['landing_page']=='old_page'))]
?
存在数据是对照组且为新页面,实验组且为旧页面,需要删除
df=df[((df['group']=='control')&(df['landing_page']=='old_page'))|((df['group']=='treatment')&(df['landing_page']=='new_page'))]
?4.2??删除重复值
df.duplicated(subset='user_id').sum()
?
?存在一条重复值,需要删除
df.drop_duplicates(subset='user_id',keep='first',inplace=True)
df.reset_index(inplace=True)
# 检查流量占比
df[df.group=='control'].shape[0]/df[df.group=='treatment'].shape[0]
?新、旧版本流量占比基本一比一
5??假设校验
5.1??提出零假设和备择假设
旧页面的转化率设为p1,新页面的转化率设为p2
- 零假设: p1>p2 即p1-p2>0
- 备择假设: p1<p2 即p1-p2<0
5.2??确定抽样分布类型
本次实验满足的判断结果只有0和1(转化和未转化),符合0-1分布
5.3??确定检验类型
独立双样本,样本n>30,总体的均值和标准差未知,用Z检验。
5.4??确定检验方向
判断是否相等就是双侧,是否大于或小于就是单测。根据备择假设,确定检验方向为单侧(左尾)
5.5??显著性水平α
本次检验α取0.05
5.6??计算校验统计量
# 旧页面的用户数
n_old=df[(df.group=='control')].shape[0]
# 新页面的用户数
n_new=df[(df.group=='treatment')].shape[0]
# 旧页面的转化用户数
n_convert_old=df[(df.group=='control')&(df.converted==1)].shape[0]
# 新页面的转化用户数
n_convert_new=df[(df.group=='treatment')&(df.converted==1)].shape[0]
# 旧页面的转化率
p_old=n_convert_old/n_old
# 新页面的转化率
p_new=n_convert_new/n_new
print('旧页面的转化率{:.6f},新页面的转化率{:.6f}'.format( p_old, p_new))
# 转化率的联合估计
p_c=(n_convert_old+n_convert_new)/(n_old+n_new)
print('转化率的联合估计:', p_c)
# 检验统计量z
z=(p_old - p_new)/ np.sqrt(p_c*(1 - p_c)*( 1/n_old + 1/n_new))
print('检验统计量z:', z)
# z_alpha
z_alpha=norm.ppf(0.05) # 若为双侧,则norm.ppf(0.05/2)
print('z-alpha:{:.2f}'.format(z_alpha))
if abs(z)>abs(z_alpha):
print('拒绝零假设')
else:
print('支持零假设')
?
?
|