问题描述
在开始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论文,但仍然坚持使用。非常感谢。
# 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 (将#修改为@)