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