使用it.chain迭代的A/B测试校验函数结果重复输出问题
问题描述
实现A/B测试样本显著性校验函数时出现输出异常:核心计算逻辑的结果数值正确,但所有校验结果会重复输出两次。预期每个转化步骤的校验结果仅打印一次,实际运行时输出重复,效果如下:
问题代码
def test (sample1, sample2): for i in it.chain (range(len(sample1)), range(len(sample2))): alpha = .05 difference = (sample1['step_conversion'][i] - sample2['step_conversion'][i])/100 if (i > 0): p_combined = (sample1['unq_user'][i] + sample2['unq_user'][i]) / (sample1['unq_user'][i-1] + sample2['unq_user'][i-1]) z_value = difference / mth.sqrt( p_combined * (1 - p_combined) * (1 / sample1['unq_user'][i-1] + 1 / sample2['unq_user'][i-1])) distr = st.norm(0, 1) p_value = (1 - distr.cdf(abs(z_value))) * 2 print( sample1['event_name'][i], 'p-value: ', p_value) if p_value < alpha: print('Deny H0') else: print('Accept H0') return
根因分析
循环逻辑错误使用it.chain()拼接了两个样本的索引范围:it.chain(range(len(sample1)), range(len(sample2)))会先生成sample1的全量索引序列,再生成sample2的全量索引序列。由于两个样本的转化步骤数一致、同索引下的计算逻辑完全相同,循环跑完第一组索引输出完所有结果后,会用同样的索引值再跑一遍计算、再打印一次结果,最终出现输出重复的问题。
修复方法
删除it.chain拼接逻辑,直接遍历单组索引即可——现有计算逻辑本身已经在同索引下同时取了sample1和sample2的对应字段做对比,不需要遍历两次索引。
修改后的循环开头:
# 直接遍历两个样本共有的索引长度即可,同时避免索引越界 common_step_num = min(len(sample1), len(sample2)) for i in range(common_step_num): alpha = .05 # 后续计算、打印逻辑保持不变
内容的提问来源于stack exchange,提问作者Karina Doll
相关产品推荐
相关产品推荐

