AB Test
AB test完整流程
1.建立实验目标
2.提出实验假设
3.实验方案设计
4.开发需求文档
5.开始实验
6.采集分析评估数据
7.发布产品
实验设计流程
确定监测指标(核心指标(本次实验需要提升的指标))
确定实验受众(所选择的用户群体)
确定样本量
根据预估的功能体校数值和显著性水平得出确定实验时长
时长一般不超过两周
开发需求文档
- 实验目的
- 实验假设
- 实验方案
- 流量配置
3.进行假设检验并判断实验结果
- 假设检验(假设检验前进行数据清洗)
原假设H0与备择假设H1
双侧检验还是单侧检验
根据样本量(N>30?)确定是T检验还是Z检验
计算统计量T值或Z值从而得出P值
p值:实验组与对照组之间的差异是否显著
p值<0.05,实验带来的差异是显著的
-注意点
-实验组与对照组的用户分布要一致
-2个实验改动的变量相互独立
-排除实验结果由偶然因素引发的(两类错误)
python实现
import numpy as np
import pandas as pd
ba_sales_data=pd.read_csv("E:/miki/coupang/ba_sales_data.csv")
ba_sales_data
ba_sales_data.info()
ba_sales_data.describe()
#删除重复值
df_noDup=ba_sales_data.drop_duplicates()
df_noDup
df_noDup.describe()
#sale_price<0的值需要去除
df_noDup_del=df_noDup[df_noDup['sale_price']>0]
df_noDup_del
#将age字段中为999的替换为空
df_noDup_del['age']=df_noDup_del['age'].replace(999,np.nan)
df_noDup_del.info()
#将清洗好的数据存入excel中
writer = pd.ExcelWriter('E:/miki/coupang/df_noDup_del.xlsx')
data.to_excel(writer, 'df_noDup_del', float_format='%.5f')
writer.save()
writer.close()
#汇总每个用户的总消费金额
#计算实验组和对照组的平均消费金额
import pymysql
#打开数据库连接
cursor=conn.cursor()
conn = pymysql.connect(host='localhost',user = "root",passwd = "root",db = "miki")
sql="select user_id,test_option,sum(sale_price) as sp from (select distinct * from df_noDup_del) a group by user_id,test_option order by test_option"
cursor.execute(sql,args=None)
name_list=[]
myresult = cursor.fetchall()
result=list(myresult)
#将sql数据结果转换为dateframe
from pandas.core.frame import DataFrame
data=DataFrame(result)
data.rename(columns={0:'uid',1:'type',2:'sale_price'},inplace=True)
data
#计算检验统计量
from scipy import stats
sales0_mean=data[data.type=='0'].sale_price.mean()
sales0_std=data[data.type=='0'].sale_price.std(ddof = 1)
sales1_mean=data[data.type=='1'].sale_price.mean()
sales1_std = data[data.type=='1'].sale_price.std(ddof = 1)
z = (sales0_mean - sales1_mean) / np.sqrt(sales0_std ** 2 / len(data[data.type=='0'].sale_price) + sales1_std ** 2 /len(data[data.type=='1'].sale_price))
p = 2*stats.norm.sf(abs(z))
s = np.sqrt(((len(data[data.type=='0'].sale_price) - 1)* sales0_std**2 + (len(data[data.type=='1'].sale_price) - 1)* sales1_std**2 ) / (len(data[data.type=='0'].sale_price) + len(data[data.type=='1'].sale_price) - 2))
# 效应量Cohen's d
d = abs((sales0_mean - sales1_mean)) / s
sales0_mean,sales1_mean,z,p,d
#计算样本量
from statsmodels.stats.power import NormalIndPower
import math
effect_size=d
ztest=NormalIndPower()
num=ztest.solve_power(
effect_size=effect_size,
alpha=0.05,
power=0.8,
ratio=1,
alternative='two-sided'
)
print(num)
```