有偏度数据下假设检验下的一二类错误概率探究

该博客探讨了在有偏度数据下,假设检验(如t-test)的表现。通过模拟数据,作者展示了正态分布和非正态分布条件下,t-test的第一类和第二类错误概率。特别地,异常值的存在显著影响了t-test的效果,降低了统计功效。此外,针对点击数据,异常值导致样本量需求增大,进一步影响了检验的有效性。
摘要由CSDN通过智能技术生成

背景

由于一般ab-test中会使用假设检验判断两组样本的差异,是随机波动造成的,还是真实改动带来的。使用较多的是参数检验,而参数检验一般会假设数据服从某一个分布,如正态分布,二项分布等。二项分布情况相对简单,这里考虑正态分布的影响。

在使用t-test时,会有样本独立同分布且来自正态分布的要求,而现实中得到的数据很难精确服从正态分布。那么在违背正态分布时,使用t-test效果如何呢?

本文通过模拟数据,来分析t-test在不同场景下的效果。通过衡量AA-test时p-value的分布,和AB-test时的ROC曲线来衡量效果。
下面先通过正态分布来考虑,并作为一个基准。

正态分布下的效果

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy import stats
import prettytable as pt
import seaborn as sns

from statsmodels.stats import power as com_power
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.rcParams['font.size']=20

# 定义一个分布图的函数
def plot_distribution(data, label='', title='', plot=True):
    data = pd.Series(data)
    table = pt.PrettyTable()
    table.field_names = (['最小值', '平均值', '中位值', '最大值', '标准差', '变异系数', '偏度', '峰度', '样本量'])
    metric = [data.min(), data.mean(), data.median(), data.max(), data.std(), data.std()/data.mean(), data.skew(), 
                       data.kurt(), 355*data.skew()**2]
    table.add_row([round(x, 3) for x in metric])
    print(table)
    print('\n'*2)
    if plot:
        sns.histplot(data)
        plt.show()

#定义显著性检验得到的p-value的累积分布
def plot_roc(p_list, title=''):
    p_list = pd.Series(p_list)
    table = pt.PrettyTable(['最小值', '平均值', '中位值', '最大值', '标准差', '变异系数', '偏度', '峰度'])
    metric = [p_list.min(), p_list.mean(), p_list.median(), p_list.max(), p_list.std(), p_list.std()/p_list.mean(),
              p_list.skew(), p_list.kurt()]
    table.add_row([round(x, 3) for x in metric])
    print(table)
    print('\n'*2)
    
    fig, ax = plt.subplots(figsize=(10, 8))
    n_bins=50
    n, bins, patches = ax.hist(p_list, n_bins, density=True, histtype='step', cumulative=True, label='Empirical',
                               color='red')
    ax.grid(True)
    ax.legend(loc='best')
    title_p = title if title else '累积分布图'
    ax.set_title(title_p )
    plt.show()
    
mean=100
stdev=10
sample_norm = np.random.normal(loc=mean, scale=stdev, size=
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值