欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ABtest原理及python代码

程序员文章站 2022-07-11 14:58:23
...
  • ABtest 原理:
    根据中心极限定理
    当样本量大于30时,可以通过Z检验来检验测试组和对照组两个样本均值差异的显著性。样本量小于30时,可进行T检验

  • 最小样本量:
    根据显著性水平和两组样本方差计算 最小样本量

    例子:

    library(pwr)
    pwr.t.test(d=.8, sig.level = .05, power = .9, type = “two.sample”, alternative = “two.side”)
    前五个中,输入任意4个值,都会输出另外一个

    n = 33.82555 最小样本量

    d = 0.8 标准化均值之差

    sig.level = 0.05 显著性水平

    power = 0.9 功效水平

    alternative = two.sided
    样本t检验(two.sample)、单样本t检验(one.sample)或相依样本t检验(paired)。默认为双样本t检验

    NOTE: n is number in each group

    结果表明,每组中需要34个样本(总共68个),这样才能保证有90%的把握检测到0.8的效应值,并且最多5%的可能性会误报差异存在。

  • ABtest 一般步骤
    1 对样本进行正态检验
    2 对两组进行方差齐性检验 同方差or异方差T检验
    3 T检验 计算P值

  • Python实现ABtest:

# coding=utf-8
import numpy as np 
import pandas as pd
from scipy import stats
import statsmodels.stats.weightstats as sw

# 两个样本长度相同
x1 = np.array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
x2 = np.array([1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1])

# 大量数据导入
# df_x1 = pd.read_excel()
# df_x2 = pd.read_excel() 
# np.array(df_x1['lable'].tolist())
# np.array(df_x2['lable'].tolist())

# 样本均值是否显著差异检验
def ABTest(x1,x2,alpha = 0.05):
    '''
    :param x1: 样本1
    :param x2: 样本2
    :param alpha: 第1类错误容许值
    :return: z/t p 统计量 p值
    
    '''
    # 样本量大于30时,使用Z检验
    if len(x1) >30:
        z,p = sw.ztest(x1, x2, value=0)
        
        # 详细计算公式
        # 样本标准误差,分母使用n-1
        # x1_mean,x1_std,x2_mean,x2_std = x1.mean(),x1.std(ddof = 1),x2.mean(),x2.std(ddof = 1)
        # z = (x1_mean - x2_mean) / np.sqrt(x1_std ** 2 / len(x1) + x2_std ** 2 /len(x2))
        # p = 2*stats.norm.sf(abs(z))
        
        # 根据alpha计算置信区间 Z分数服从标准正态分布
        d = stats.norm.ppf(1 - alpha / 2)
        floor = - d
        ceil = d
        
        print('使用Z检验')
        print('Z分数为{}'.format(z))
        print('置信区间为[{0},{1}]'.format(floor,ceil))
        print('p值为{0},{1}alpha,认为x1,x2均值差异{2}'.format(p,'大于' if p > alpha else '小于','显著' if p < alpha else '不显著'))
        
        return z,p
    
    # 样本量不够大,使用t检验
    else:
        x = x1 - x2
        t,p = stats.ttest_1samp(x,0)
        d = stats.norm.ppf(1 - alpha / 2) 
        floor = - d
        ceil = d
        
        print('使用T检验')
        print('T分数为{}'.format(t))
        print('置信区间为[{0},{1}]'.format(floor,ceil))
        print('p值为{0},{1}alpha,认为x1,x2均值差异{2}'.format(p,'大于' if p > alpha else '小于','显著' if p < alpha else '不显著'))
        
        return t,p
        
ABTest(x1,x2)

结果:

使用Z检验
Z分数为-7.1414284285428495
置信区间为[-1.959963984540054,1.959963984540054]
p值为9.236596617174027e-13,小于alpha,认为x1,x2均值差异显著
Out[21]: (-7.1414284285428495, 9.236596617174027e-13)
相关标签: 数据分析