为什么A / A测试会导致原假设拒绝率很高如果alpha = 5%,则拒绝率是30%,而应该是5%?

问题描述

在开始A / B测试之前,建议先进行A / A测试,以确保我们对两组的观察比例为50:50,并且两组的观察值没有差异。 当我们将alpha设置为5%并测试2组之间的差异时,在100次测试中,应该有5次拒绝原假设(2组之间没有差异)。

就我而言,我想测试一下应用程序的新功能是否会使用户走得更多(平均每日步数增加)。
对于脱机A / A测试,我首先过滤上周活动的用户,将5%随机分配给一个组,再将5%分配给另一个组(使用np.random.uniform)。由于未启用新功能,因此这两个小组的经验相同,并且他们的平均每日步伐预计会相同(在统计上不显着)。在2周后对这些选定的用户进行了筛选,我在这2周内收集了他们的每日工作量数据以测试差异。
我选择alpha = 5%,并进行100次测试(意思是随机分配100次并进行测试),结果是30%的时间拒绝了没有差异的零值(应该只能是5%)。

我不知道为什么会这样。当我更改数据收集时间(1周,2周和3周)时,效果平均值和方差的分布不会发生很大变化,而观察数却会增加,从而导致更多的拒绝案例。 请给我一个提示。我已经阅读了有关A / B和A / A测试(link)的Microsoft论文,但仍然坚持使用。非常感谢。

以下是随机分配和t检验代码的一部分:

# draw random sample for testing: 100 times
for i in range(100):
    # list of lastweek active users
    active_full = df_no_outlier[(df_no_outlier['local_date_key'] < end_active) & (df_no_outlier['local_date_key'] >= start_active)]['user_key'].unique().tolist()

    # randomly pick users to groups using random.uniform
    user_df = pd.DataFrame({'user_key': active_full}) 
    user_df['pseudo'] = np.random.uniform(low=0,high=1,size=len(user_df))
    if 'pseudo' in df_no_outlier.columns:
        df_no_outlier = df_no_outlier.drop('pseudo',axis=1)
    df_no_outlier = pd.merge(df_no_outlier,user_df,on=['user_key'],how='left')
    df_no_outlier['group'] = np.where(df_no_outlier['pseudo'] <= r,'C',np.where((df_no_outlier['pseudo'] > r)
                                             &(df_no_outlier['pseudo'] <= 2*r),'T',None))

    # data in testing period (2 weeks) of chosen users
    data_test = df_no_outlier[(df_no_outlier['local_date_key'] > end_active ) \
                          & (df_no_outlier['local_date_key'] < end_test )]

    # statistics
    mu_c = data_test[data_test['group']=='C']['total_step'].mean()
    sigma_c = np.std(data_test[data_test['group']=='C']['total_step'])
    n_c = len(data_test[data_test['group']=='C'])
    mu_t = data_test[data_test['group']=='T']['total_step'].mean()
    sigma_t = np.std(data_test[data_test['group']=='T']['total_step'])
    n_t = len(data_test[data_test['group']=='T'])
    t_ = (mu_t - mu_c)/np.sqrt(sigma_c**2/n_c + sigma_t**2/n_t)
    t_value = t.ppf(0.975,n1+n2-2,loc=0,scale=1)

    if np.abs(t_)> t_value:
        result = 'reject'
    else:
        result = 'cannot reject'
    print('{}: t={},t_value={} => {}'.format(i,t_,t_value,result))

    # save results to list
    mu_c_list.append(mu_c)
    mu_t_list.append(mu_t)
    sigma_c_list.append(sigma_c)
    sigma_t_list.append(sigma_t)
    n_c_list.append(n_c)
    n_t_list.append(n_t)
    t_list.append(t_)
    t_value_list.append(t_value)
    testing_days_list.append(testing_day)

a = pd.DataFrame({'mu_c':mu_c_list,'mu_t': mu_t_list,'sigma_c':sigma_c_list,'sigma_t':sigma_t_list,'n_c': n_c_list,'n_t': n_t_list,'t': t_list,'t_value': t_value_list,'testing_days':testing_days_list})
a['result'] = np.where(np.abs(a['t']) > a['t_value'],'r','nr')

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)