背景
由于一般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.

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

被折叠的 条评论
为什么被折叠?



