2021-03-12

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)
      ```




©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容