ABTest原理及python实现

1 篇文章 0 订阅
1 篇文章 0 订阅

ABTest原理及python实现

1. ABTest原理

  1. 大数定律:在一个随机事件中,随着试验次数的增加,事件发生的频率趋于稳定值,即概率。
  2. 中心极限定理:
    设随机变量X1,X2,…Xn独立同分布,并且具有有限的数学期望和方差:E(Xi)=μ,D(Xi)= σ 2 σ^{2} σ2 则对任意x,
    分布函数 F n ( x ) F_n(x) Fn(x)=P{ ∑ i = 1 n X i − n μ σ n ≤ x \frac{\sum_{i=1}^{n}X_{i}-n\mu}{ \sigma\sqrt{n}}\leq{x} σn i=1nXinμx},满足
    lim ⁡ n → ∞ F n ( x ) = lim ⁡ n → ∞ ∑ i = 1 n X i − n μ σ n ≤ x = 1 2 π ∫ − ∞ x e − t 2 2 d t = ∅ ( x ) \lim_{n\to\infty}F_n(x)=\lim_{n\to\infty}\frac{\sum_{i=1}^{n}X_{i}-n\mu}{ \sigma\sqrt{n}}\leq{x}=\frac{1}{\sqrt{2\pi}}\int_{-\infty}^{x}e^-{\frac{t^{2}}{2}dt=\emptyset(x)} limnFn(x)=limnσn i=1nXinμx=2π 1xe2t2dt=(x)
    该定理说明,当n很大时,随机变量 Y n = ∑ i = 1 n X i − n μ σ n Y_{n}=\frac{\sum_{i=1}^{n}X_{i}-n\mu}{ \sigma\sqrt{n}} Yn=σn i=1nXinμ 近似地服从标准正态分布N(0,1)。因此,当n很大时, ∑ i = 1 n X i = n σ Y n + n μ \sum_{i=1}^{n}X_{i}=\sqrt{n}\sigma{Y_{n}+n\mu} i=1nXi=n σYn+nμ 近似地服从正态分布N(nμ,nσ2)。
    将其标准化,于是变量
    n X ‾ − n μ σ n = X ‾ − μ σ n \frac{n\overline{X}-n\mu}{\sigma\sqrt{n}}=\frac{\overline{X}-\mu}{\frac{\sigma}{\sqrt{n}}} σn nXnμ=n σXμ 服从标准正态分布。

当样本数量较大时,样本方差近似总体方差。所以,当样本量大于30时,可以通过Z检验来检验测试组和对照组两个样本均值差异的显著性。样本量小于30时,可进行T检验。

2. 假设检验

原假设H0: μ 1 = μ 2 \mu_{1}=\mu_{2} μ1=μ2,两个样本均值不存在显著性差异;
备择假设H1: μ 1 ≠ μ 2 \mu_{1}\neq\mu_{2} μ1=μ2,两个样本均值存在显著性差异。
α \alpha α为第1类错误容许值,一般取0.05。当 P < α P<\alpha P<α时,拒绝原假设,接受备选假设,认为两个样本均值存在显著性差异。
在这里插入图片描述

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)

运行结果
在这里插入图片描述

  • 8
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值