计算A/B Test需要的样本量

本文介绍了在A/B Test中使用Z检验的重要性,解释了Z检验的原理和适用条件,并提到了Python的statsmodels库作为计算工具。此外,还推荐了一个在线样本量计算器帮助确定实验所需的样本数量。

A/B Test是我们做算法模型时离不开的助手,只有通过A/B Test的模型才能进入产品。但要使A/B Test达到应有的效果,我们必须严格地满足它的一些要求。这里有一篇关于A/B test的文章:ABtest和假设检验、流量分配写得很好,我只在这里补充一些细节。

Z检验

很多情况下,我们要用Z检验来判断A/B Test的有效性。Z检验,也称“U检验”,是为了检验在零假设情况下测试数据能否可以接近正态分布的一种统计测试。根据中心极限定理,在大样本条件下许多测验可以被贴合为正态分布。在不同的显著性水平上,Z检验有着同一个临界值,因此它比临界值标准不同学生t检验更简单易用。当实际标准差未知,而样本容量较小(小于等于30)时,学生T检验更加适用。

我们设H0假设为A、B没有显著性差异,H1假设为A、B有显著性差异。那我们就有几个重要的数据需要考虑:

  • 样本容量,即A、B的sample数量,一般我们会设 n a = n b n_a = n_b n
### A/B 测试中的分层抽样实现 在 A/B 测试中,分层抽样是一种用于提高实验效率的技术。通过将总体划分为若干个具有相似特征的子集(即“层”),可以减少样本间的方差并提升统计检验能力。如果某些工具不可用,则可以通过 `ranuni` 函数结合多个数据步骤来获取分层样本[^1]。 以下是基于 SAS 或其他编程环境实现分层抽样的方法: #### 方法概述 为了确保每层内的分布均匀以及各组之间的平衡性,在实际操作过程中通常采用如下方式完成分层采样: - **定义层次变量**:识别影响目标指标的关键因素作为分层依据; - **计算比例分配**:按照每一层在整个群体所占的比例决定其应抽取的数量; - **随机选取个体**:利用伪随机数生成器从指定范围内挑选适当数量的对象加入到最终集合里去; 下面给出一段 Python 实现代码示例: ```python import pandas as pd from sklearn.utils import resample def stratified_sample(df, strata_column, sample_size_per_stratum): """ Perform stratified sampling on DataFrame. Parameters: df (pd.DataFrame): Input dataset. strata_column (str): Column name used for stratification. sample_size_per_stratum (int): Number of samples per stratum. Returns: pd.DataFrame: Sampled dataframe. """ sampled_dfs = [] # Iterate over each unique value in the specified column for category_value in df[strata_column].unique(): sub_df = df[df[strata_column]==category_value] # Ensure we don't request more than what's available within any given layer n_samples = min(len(sub_df),sample_size_per_stratum) # Use scikit learn utility function 'resample' here instead of manually implementing it via numpy etc... sampled_subdf=resample( sub_df, replace=False,# No replacement allowed since this would violate independence assumption required by most tests anyway.. n_samples=n_samples, random_state=42 # For reproducibility purposes only; remove or set differently depending upon your needs! ) sampled_dfs.append(sampled_subdf) result=pd.concat(sampled_dfs).reset_index(drop=True) return result ``` 此函数接受三个参数:输入的数据框 (`df`)、用于分层的列名(`strata_column`) 和每个层所需的样本量(`sample_size_per_stratum`) 。它遍历给定列的不同类别值,并从中提取固定大小的小样本。最后将这些部分重新组合成一个新的DataFrame返回。 值得注意的是,这种方法假设您已经知道应该为每个层收集多少观察结果。如果您不确定最佳数值是多少,可能需要先执行一些探索性数据分析(EDA),或者考虑使用更复杂的算法自动确定合适的划分界限和相应的配额设置方案。 另外需要注意的一点是关于替代与否的选择——这里选择了无放回的方式(replace=False),因为这样能够更好地保持原始资料内部结构特性不变的同时也满足独立同分布的要求。当然也可以根据具体情况调整这个选项。 此外,还可以引入像SMOTE这样的技术处理不平衡分类问题的情况下的合成少数族类过采样策略[^2] ,尽管这超出了单纯讨论分层取样的范畴但仍值得提及作为一种潜在解决方案当遇到极端不均衡状况之时可尝试应用此类手段加以缓解负面影响程度从而获得更加稳健可靠的结论推断过程。 综上所述,实施有效的分层抽样不仅可以显著降低估计标准误差约百分之五左右对于绝大多数试验而言而且还能使得原本不具备统计学意义的变化变得明显起来进而促进更多有利新功能上线发布进程加快步伐节省资源消耗成本效益俱佳的做法确实非常有价值[^3].
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值