ABTest原理及python实现
程序员文章站
2022-07-11 14:58:11
...
ABTest原理及python实现
1. ABTest原理
- 大数定律:在一个随机事件中,随着试验次数的增加,事件发生的频率趋于稳定值,即概率。
- 中心极限定理:
设随机变量X1,X2,…Xn独立同分布,并且具有有限的数学期望和方差:E(Xi)=μ,D(Xi)= 则对任意x,
分布函数 =P{},满足
该定理说明,当n很大时,随机变量 近似地服从标准正态分布N(0,1)。因此,当n很大时, 近似地服从正态分布N(nμ,nσ2)。
将其标准化,于是变量
服从标准正态分布。
当样本数量较大时,样本方差近似总体方差。所以,当样本量大于30时,可以通过Z检验来检验测试组和对照组两个样本均值差异的显著性。样本量小于30时,可进行T检验。
2. 假设检验
原假设H0:,两个样本均值不存在显著性差异;
备择假设H1:,两个样本均值存在显著性差异。
为第1类错误容许值,一般取0.05。当时,拒绝原假设,接受备选假设,认为两个样本均值存在显著性差异。
3. Python实现
# 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)
运行结果