AB test

张开发
2026/4/20 3:49:19 15 分钟阅读

分享文章

AB test
搞了这么就归来发现还是有一堆要学的又发现这一块很多帖子写的思路都很乱也没有一个来龙去脉所以当自留笔记整理一下如果有错误的地方欢迎指正可以直接看荧光标记的地方因为是自留笔记所以碎碎念很多另外要是有大佬看到给我一个实习offer好吗本人数科出生研究生在读熟练掌握pythonsqlpower bi。对于统计学机器学习深度学习agent propmt调优尤其是自然语言处理方面都有着深入研究。也对商分例如ab testRFM等等方面也有所研究。同时也了解过埋点相关知识真的是要没招了。目录1. AB测试是什么这里举一个例子那么具体流程就是三个金标准:2. AB测试的检验Z检验正态检验中心极限定理基于statsmodels库中的公式调用Q1那么什么时候用Z检验什么时候用T检验呢Q2那么什么时候用 usevarunequal,什么时候用默认的usevarpooledQ3Z检验和T检验究竟应该如何选择。说回正题1. AB测试是什么说白了A/B 测试A/B Testing就是一种“对照实验”。就像是你小学初中生物学的那种控制变量实验去探究一个变量改变以后是不是和原来不一样。这里举一个例子你面前有两个按钮一个是红色的一个是绿色的你无法确定用户更喜欢点哪个于是你让一部分用户看红色另一部分看绿色最后看谁的点击率高。这就是最基础的 A/B 测试。那么具体流程就是1.分流Randomization将用户随机分成两组。对照组 (Control Group)看到的是现有的方案方案 A。实验组 (Experimental Group)看到的是你改进后的新方案方案 B。2.施加干预两组用户在同一时间内除了你改动的那个变量比如按钮颜色不同其他所有环境都一模一样。3.数据收集收集预先设定的指标如订单量、点击率、留存率4.统计检验三个金标准:一个合格的 A/B 测试必须满足以下三点随机性用户必须是随机分配的不能把核心老用户全分到 A 组把新用户全分到 B 组。唯一变量一次实验通常只改动一个地方。如果你同时改了按钮颜色和文案最后效果好了你无法确定是哪个改动的功劳。统计显著性不能只看均值高了就说好。如果 A 组只有 3 个人B 组 3 个人B 组多买了一单这可能是偶然。只有当样本量足够大且 P 0.05 时(这个数值是人为规定的)结论才成立。2. AB测试的检验ok讲了这么多理论基础那么怎么验证AB测试的效果呢。这里采用的就是统计学里的假设检验真的假设检验这里就是看来忘忘了看必须要存个帖子留档。统计学真是一门神仙学科。Z检验正态检验ps如果完全没有统计学基础建议先去补补课可能会看不懂。但是为了方便我自己后期遗忘以后理解我这里会讲的简单通俗一点。在假设检验里对于Z检验正态检验有一个很重要的支撑就是中心极限定理。中心极限定理无论原始数据的分布长得多么奇形怪状只要你抽取的样本量足够大统计学里通常n30当然如果你的原始总体偏斜很严重这个n会向上调整具体后面可以计算这些样本均值的分布最终都会趋向于正态分布。注意这里是样本均值的分布他是一个未知的东西这里插入一下中心极限定理的公式以前学统计的时候说实话都没怎么搞懂这个。越研究发现这个定理真的太绝了。这个定理给了一个绝杀也就是只要我们有足够多的样本这些样本都来自同一个总体无论离散or连续且独立同时总体的方差有限那么这个样本均值的分布就是趋向或者可以说是等价正态分布的这里说等价肯定不太严谨但是日常生活中绝大多数的情况都是了ok当样本均值的分布趋向于正态分布以后我们一切都已经有了一个度量的标准。这就像是没有秦始皇之前小霓看到英国人要说英语看到日本人要说日语看到中国人要说中文sorry秦始皇也没统一这个东西遇到不同的人小霓就要学不同的语言那下次遇到一个韩国人小霓还得去研究一下韩语。但是这个时候秦始皇把语言统一了大家的语言都可以转换成一套颜文字这个颜文字就像是样本均值的分布小霓无论说哪一国语言样本的分布只要我把这个语言转变成颜文字样本的均值的分布那么一切都有了标准的解释了标准正态分布。要知道标准正态分布是一个固定的东西就像是一个模板一样由于统计里标准正态分布太耳熟能详了这里我就不插入了。ok这样我们就把一个未知的分布一个无论是什么样子的分布都能转化成一个标准的正态分布这样我们也可以用一个模板做很多事情了。就从一个单一的问题变成一个共性的问题了。正态分布的累加/减性独立的正态分布相加相减还是服从正态分布下面是性质公式ok由于正态分布具有累加和累减都是正态分布的性质那么对于两个独立的随机变量X,Y来说其样本均值的分布是服从正态分布的那么也是一个正态分布。ok这样就推出我们统计学里最传统的Z检验了注意是X,Y总体的方差也就是说当已知的时候我们就可以得到这样的标准正态分布且注意图中的,是一个随机变量不是确定的值因为在网上找的图也不想改了但是通常我们会把含有大写的X的东西当作是随机变量小写的x的当作是确定的值所以这图里面应该是。现在就会问嗯是这样的那有什么用呢。还记得之前我们的例子你面前有两个按钮一个是红色的1一个是绿色的2你无法确定用户更喜欢点哪个于是你让一部分用户看红色另一部分看绿色最后看谁的点击率高那么我们已双侧检验为例子代表的就是点击率哈且这里点击率是一个典型的0-1分布伯努利分布0-1分布的期望就是P方差就是P1-P原假设 H0:含义红色按钮和绿色按钮的点击率没有本质区别观察到的差异纯属随机波动。备择假设和 H1:含义两个按钮的点击率存在显著差异。那么这个时候我们构造的方程就变成了因为两个都是0-1分布所以他们方差p1-p是相等的哦就可以合并在一起1. 这个时候有人问了啊原来公式里的呢因为你的假设是那自然就为0了嘛。2. 等等又有人要问我这里条件是和有什么关系。因为0-1分布p1(注意P1P2代表的是总体哦是未知的)通过一个简单的变形这样看会直观点总之不管怎么样这个Z是一个标准正态分布是一个未知变量哈它是服从正态分布的可以画出一个它的分布图。假设检验的思想就是是一个服从正态分布的随机变量也就是我们并不知道它到底取值是多少。而由于假设检验就是基于“小概率事件原理”一个小概率事件在一次抽样中发生了我们就不把他当成小概率事件当然这样说不够严谨但是可以这样理解在原假设成立时若观测结果为小概率事件则拒绝原假。这个时候我们随机抽取一个样本注意这里是一个抽取出来的确定数值当这个算出来的Zx落入一个概率极小的区域如图中绿色那么小概率时间就发生了那么我们就有理由认为这个这个样本是不属于原来那个这个分布之中的也就是说现在这个分布极其可能改变了不一样了有了新的变化。这就像是某金融顾问说我们的产品A特别好买了的用户10万人平均收益都在10万元且方差特别低也就是大家的收益很集中在10万这个范围内这个时候小霓不信随机抽了两个用户算他们去年的平均收益结果发现他们的平均收益居然是-2000元。显然在10万人中抽到两个人且平均收益是-2000元的概率基本上微乎其微。1. 那么很有可能这两个人根本买的不是这个产品2. 或者这个产品本身就是假的。ok说了这么多总算把假设检验的思想讲完了这个时候就要讲到Z检验的问题了基于statsmodels库中的公式调用我们之前提到的Z检验有个前提条件是总体的方差已知在大学学的统计教材里面做题都会给你这个方差然后让你算。但是在现实生活中这个总体的方差我们基本上是不知道的。比如就那之前改进按钮那个例子来说我找1000个人测试红色按钮1000个人测试绿按钮这2000个人都只是样本他们算出来的只能是样本的均值和方差那么显然上面那个Z检验就不能用吗nononononono通过大数定律样本n足够大时样本的方差会收敛的于总体的方差所以我们用样本方差当总体方差计算在实践中是可以的当然你的样本只有5个就当我没说...ok所以当我们使用 statsmodels.stats.weightstats这库进行调用计算的时候注value就是1usevarunequalz_statistic, z_value sw.ztest(group_a, group_b, value0,usevarunequal) t_stat, p_val, df_deg sw.ttest_ind(group_a, group_b, value0, usevarunequal) # 自由度usevarunequal时我们调用的就是这个公式这里我们会默认把group_a,group_b中的样本方差当成公式里的总体方差来计算。同时会发现z检验和t检验是等价的套用的都是这个Z检验的公式只是最终一个查的是z表一个查的是t表的p值。注意这里t检验的自由度不再是简单的通用整数了而是使用的Welchs t-test即那么什么时候调用这个公式呢当你明显发现group_a,group_b的方差不相等的时候但是对于大部分AB test我们的人群数据来自相似的背景我们基本上会默认他们有相同的方差这个时候就不是用这个公式啦。2usevarpooledz_plugin, _ sw.ztest(df_test[item], df_ctrl[item], value0,usevarpooled) t_stat, p_val, df_deg sw.ttest_ind(group_a, group_b, value0)当usevarpooled,也可以不写这个是默认值也就是我们认为group_a,group_b的方差相等的时候公式就是这个。等等肯定有人要说这不是t检验吗课本上有过当总体样本相等且未知的时候就用这个没错这个库把这个公式搬过来了然后查了一个Z表即因为它在计算统计量时套用了 T 检验的公式但最后一步“查表”时换成了正态分布。ps:说实话俺也不知道为什么要这样可能是为了非统计学纯业务的方便吧毕竟大部分人用Z和T检验从来就是直接调用不考虑前提条件。同样这里这个z检验和t检验也是同一个东西套用的就是t检验的公式只是一个查z表一个查t表而在这里这个t检验的自由度就是n1n2-2定值了一句话总结ztest的pooled模式其实就是一个“假装自己是 Z 检验的 T 检验计算器”。它假设你手里的样本多到可以无视 T 和 Z 的差异。ok说了半天头都要绕晕了总之对于statsmodels.stats.weightstats这个库来说研究了一下scipy.stats也应该是同理的Z检验和T检验纯就是一个东西只要参数是一样的用的公式都是一样的唯一的不同在于一个查Z表一个查T表。Q1那么什么时候用Z检验什么时候用T检验呢查看了很多资料大部分人说的是样本大大于30就用Z检验样本小就用t检验为什么会这样呢当自由度df达到 30 时T 分布已经和正态分布非常接近而当自由度超过 100 时两者在肉眼和常规业务决策上几乎没有区别。事实上我们已经知道库中的Z和T计算公式都是完全一样的只是查表不一样。所以当样本足够的时候本人不严谨的认为这里的总样本数应该至少要达到100也就是自由度接近100当然如果遇到两组方差差距巨大的时候这个样本数得增加详情可以看前面Welchs T-test的公式这时t基本上已经很接近zz检验和t检验已经可以等价了我们统一用Z就好啦。而当样本量不太够的情况比如一组只有20那还是用t检验吧Q2那么什么时候用 usevarunequal,什么时候用默认的usevarpooled没有找到相关的资料但我根据一些项目并思考了一下如果在更严谨的条件下那么设置 usevarunequal尤其是t检验的时候配套usevarunequal会更加严谨。Q3Z检验和T检验究竟应该如何选择。根据上述问题研究本人思考了一下做出以下推断。但是纯个人思考如有问题欢迎在评论区指正因为目前这方面我也没看到很系统的理论我也有点懵对于样本量不是巨大的时候我们优先采用t检验usevarunequal如果你足够自信就用Z检验ok写了很多但是有点乱作为自留笔记请见谅如果发现有错误欢迎在评论区指正如果后续有时间的话再写一个实操案例吧但是最近忙着投简历还要写论文和被拉去写书又是春天事情有点太多了不知道什么时候才会更新呢。好了不说了我的游戏已经下载好很久了我急需休息一下。祝好

更多文章