原文:
towardsdatascience.com/how-to-perform-a-b-testing-with-hypothesis-testing-in-python-a-comprehensive-guide-17b555928c7e
你是否曾想过,你对网站或营销策略的更改是否真的产生了影响?🤔 在本指南中,我将向你展示如何使用假设检验来有信心地做出基于数据的决策。
在数据分析中,当运行A/B 测试以比较营销活动的两个版本、网页设计或产品功能时,假设检验经常被使用,以便做出基于数据的决策。
你将学到什么 🧐
假设检验的过程
不同类型的测试
理解 p 值
解释假设检验的结果
1. 理解假设检验 🎯
什么是假设检验?
假设检验是一种决定样本数据中是否有足够证据支持关于总体的特定信念的方法。简单来说,它是一种测试你做出的更改是否有实际效果,或者任何差异是否只是由于偶然的方法。
关键概念:
总体参数:代表整个总体特征的值(例如,网站的真正转化率)。
样本统计量:从样本中计算出的一个值,用于估计总体参数(例如,从访客样本中得出的转化率)。
零假设(H0): 默认假设。它通常表示没有效果或没有差异。
备择假设(H1): 与零假设相矛盾。它代表你正在测试的结果。
⚠️ 你的目标将是否定零假设,因此接受备择假设 ⚠️
测试类型
根据你的数据和测试内容,你可以从几种统计检验中选择。以下是一个简要概述:
1. Z 检验
目的:当样本量较大时,用于查看样本均值与总体均值之间,或两个样本的均值或比例之间是否存在显著差异。
何时使用:
大样本量(n≥30)
数据近似正态分布
示例:检查用户在网站上花费的平均时间是否与行业平均水平不同。
Z 检验的类型:
单样本 Z 检验:检验样本均值是否与已知的总体均值有显著差异。
双样本 Z 检验:比较两个独立样本的均值。
比例 Z 检验:检验关于总体比例的假设,通常在处理分类数据和大型样本量时使用。
2. t 检验
目的:当样本量较小时,用于确定样本均值之间是否存在显著差异。
何时使用:
样本量小(n< 30)
总体方差未知
数据近似呈正态分布
示例:在数据集较小的情况下,比较营销活动前后平均销售额。
T 检验的类型:
单样本 T 检验:检验样本均值是否与已知或假设的总体均值有显著差异。
独立双样本 T 检验:比较两个独立样本的均值。
配对样本 T 检验:比较同一组在不同时间点的均值(例如,治疗前后)。
3. 卡方检验
目的:用于测试分类变量之间的关系。
何时使用:
数据是分类的(如是/否,男/女)
测试独立性或拟合优度
示例:确定客户满意度是否与购买的产品类型相关。
卡方检验的类型:
独立性卡方检验:确定两个分类变量之间是否存在关联。
卡方拟合优度检验:确定样本数据是否与总体分布相匹配。
4. 方差分析(方差分析)
目的:用于比较三个或更多组的均值。
何时使用:
比较超过两组
数据是数值且呈正态分布
示例:比较不同地区的平均销售额。
2. 假设检验过程 📝
要进行假设检验,请遵循以下七个步骤:
提出假设
选择显著性水平(α)
收集和总结数据
选择适当的测试并检查假设
计算检验统计量
确定 p 值
做出决策并解释结果
让我们通过一个实际例子来逐一说明每个步骤
3. 实际例子:营销中的 A/B 测试 📊
场景:
假设你想知道你的网站的新版本(版本 B)是否比你的当前网站(版本 A)导致更高的转化率。让我们找出答案!
你应该使用哪种测试以及为什么?
你正在比较两个网站版本的转化率(比例)。
你的目标:确定版本 B 的转化率是否高于版本 A。
您的数据特征:
数据类型:分类(已转化/未转化)
样本量:两个版本都大(nA=nB=1,000)
已知参数:总体方差未知
组数:两组独立组
研究设计:样本是独立的;访客被随机分配到每个版本
考虑到这些特征,比例的 Z 检验是正确的选择,因为:
你正在比较两个独立样本之间的比例
样本量较大
数据是分类的。
第 1 步:提出假设 🧐
- 零假设(H0):版本 B 的转化率小于或等于版本 A ❌。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7210475aff621a954748a48fff211351.png
- 备择假设(H1):版本 B 的转化率高于版本 A ✅。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/0a4e377912456b019e79e78df88b2185.png
说明:
你正在测试版本 B 是否比版本 A 表现更好。
零假设假设没有改进或版本 B 更差。
替代假设是你希望找到证据支持的假设——版本 B 更好。
第 2 步:选择显著性水平(α)🎯
选择 α 显著性水平,这是在零假设实际上为真时拒绝零假设的概率(犯第一类错误)。
常见选择:0.05(5%),0.01(1%)
对于我们的测试:让我们使用 α=0.05。
说明:
5% 的显著性水平意味着你愿意接受有 5% 的机会错误地拒绝零假设。
选择取决于你愿意承担多少风险。
第 3 步:收集和总结数据 📈
版本 A(当前网站):
样本量(nA)= 1,000 访问者
转化次数(xA)= 80
转化率(pA)= 80/1000=0.08(8%)
版本 B(新网站):
样本量(nB)= 1,000 访问者
转化次数(xB)= 95
转化率(pB)= 95/1000=0.095(9.5%)
第 4 步:计算检验统计量 🧮
计算混合比例(p)
由于你假设在H0下比例是相等的:
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/17ba3942846c7fb53ee240befe7859c2.png
作者
说明:
混合比例代表假设版本之间没有差异的整体转化率。
它提供了一个在H0下计算标准误差的常见比例。
计算标准误差(SE)
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/87ffda9b3965431072053b0484f50e65.png
作者
说明:
- 标准误差衡量我们预期从随机抽样中得到的变异性。
计算 Z 分数
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8e2c9ed17eec1bde714749149b6eed14.png
作者
说明:
Z 分数衡量观察到的两个样本比例之间的差异与零(H0下的预期差异)的距离有多少个标准误差。
Z 分数:1.15
在H0下的预期差异:如果H0为真,我们预期没有差异,因此这是 0
问题:
- 在预期差异之上 1.15 个标准误差是否足以认为增加是显著的?
第 5 步:确定 p-value 📊
理解 p-value
如果零假设H0是真的,p-value 是观察到一个与计算出的 Z 分数一样极端(或更极端)的 Z 分数的概率。
在我们的例子中,p-value 是在没有版本之间实际差异的情况下,得到 1.15 或更高 Z 值的概率。
对于右侧尾部的检验(因为H1:pB>pA),p-value 是:
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/75ae83dd053f8c89ac9c5e57688ced72.png
作者
计算 p-value:
使用标准正态分布表或计算器:
- p-value=1−P(Z≤1.15)≈1−0.8823=0.12
说明:
如果H0是真的,得到 1.15 或更高 Z 分数的概率是12%。
这意味着观察到的差异可能很容易是偶然发生的。
重要提示:在本教程中,我们不会深入探讨计算 p 值的数学细节。相反,我们将使用 Python 的统计库为你计算它们或参考标准概率分布表。
第 6 步:做出决策并解释结果 🧐
为了做出决策,我们必须比较我们的p 值和我们的α。**
为什么比较 p 值与显著性水平(α)?
显著性水平(α):我们设定的阈值,用于判断观察到的结果是否具有统计学意义。通常设定为 5%(0.05)。
如果 p 值 ≤ α:拒绝H0;结果是统计显著的。
如果 p 值 > α:未能拒绝H0;没有足够的证据得出显著影响的结论。
决策:
p 值:0.12
显著性水平(α):我们设定的阈值,用于判断观察到的结果是否具有统计学意义。通常设定为 5%(0.05)。
由于 p 值 > α,我们未能拒绝零假设。
解释:
没有足够的证据表明版本 B 在 5%的显著性水平上比版本 A 更好。
观察到的增加可能仅仅是随机事件的结果。
12% > 5%,在H0下有 12%的机会观察到 Z>1.15,即使实际上两个版本之间没有差异。
想象重复多次进行实验:如果版本 A 和版本 B 之间确实没有差异,并且你多次重复实验,大约**12%**的时间,你可能会观察到 1.5(或更多)的差异,这仅仅是偶然。
快速 Python 教程:A/B 测试实战 🐍
让我们用一个实际的 Python 示例来展示我们所学的一切!我们虚构的公司名为TechGear,他们想要测试其网站上的一项新功能。
场景:
TechGear是一家专注于科技小工具的在线零售商。他们想知道添加新的推荐引擎(版本 B)是否比他们当前的网站(版本 A)提高了购买率。
第 1 步:导入库 📚
首先,你需要导入必要的 Python 库。
importnumpyasnpimportpandasaspdfromstatsmodels.stats.proportionimportproportions_ztestimportmatplotlib.pyplotaspltimportseabornassns第 2 步:生成合成数据 🎲
我们将创建一个数据集,模拟用户在网站两个版本上的行为。
# Set the random seed for reproducibilitynp.random.seed(42)# Define sample sizesn_A=1000# Number of visitors in Version An_B=1000# Number of visitors in Version B# Define conversion ratesp_A=0.08# 8% conversion rate for Version Ap_B=0.095# 9.5% conversion rate for Version B# Generate conversions (1 = purchase, 0 = no purchase)conversions_A=np.random.binomial(1,p_A,n_A)conversions_B=np.random.binomial(1,p_B,n_B)# Create DataFramesdata_A=pd.DataFrame({'version':'A','converted':conversions_A})data_B=pd.DataFrame({'version':'B','converted':conversions_B})# Combine datadata=pd.concat([data_A,data_B]).reset_index(drop=True)第 3 步:总结数据 📊
让我们看看我们的数据看起来如何。
# Calculate the number of conversions and total observations for each versionsummary=data.groupby('version')['converted'].agg(['sum','count'])summary.columns=['conversions','total']print(summary)第 4 步:执行 Z 检验 🧪
我们将使用proportions_ztest函数来进行假设检验。
# Number of successes (conversions) and number of trials (visitors)conversions=[summary.loc['A','conversions'],summary.loc['B','conversions']]nobs=[summary.loc['A','total'],summary.loc['B','total']]# Perform the z-teststat,p_value=proportions_ztest(count=conversions,nobs=nobs,alternative='smaller')print(f"Z-statistic:{stat:.4f}")print(f"P-value:{p_value:.4f}")说明:
Z 统计量:告诉我们观察到的差异与零假设之间的标准差数。
P 值:如果零假设为真,观察到这种结果的概率。
第 5 步:解释结果 🧐
让我们解释输出。
alpha=0.05# Significance levelifp_value<alpha:print("We reject the null hypothesis. Version B has a higher conversion rate! 🎉 ")else:print("We fail to reject the null hypothesis. No significant difference detected. 🤔")如果你拒绝了H0:新的推荐引擎是有效的!你可能考虑将其推广到所有用户。
如果你未能拒绝H0:新功能没有产生显著影响。你可能想测试其他想法。
其他注意事项 📝
随机性:由于我们正在生成随机数据,每次运行代码的结果可能不同。
重复测试:在现实场景中,考虑使用更多用户或更长时间运行测试以收集更多数据。
恭喜!你刚刚使用 Python 完成了一项 A/B 测试。🎉
关键要点 🍀
假设检验基础:陈述零假设(H0)和备择假设(H1)。
目标:确定是否有足够的证据来拒绝H0。
测试类型:根据数据类型和样本大小选择合适的统计测试。
假设检验步骤:
1\.State the Hypotheses2\.Choose Significance Level(αalphaα)3\.CollectandSummarize Data4\.Select the Appropriate Test5\.Calculate the Test Statistic6\.Determine the p-value7\.Make a Decision设定明确的目标:确切知道你要测试什么以及为什么要测试。
随机分配:随机分配用户到控制组和测试组,以避免偏差。
使用足够的样本大小:更大的样本会产生更可靠的结果。
控制变量:保持其他因素不变,以隔离效应。
运行测试足够长的时间:确保测试持续时间能够捕捉典型的用户行为。
考虑实际影响:评估检测到的差异是否对你的业务有意义。
清晰沟通:以直接的方式向利益相关者展示结果。
迭代和学习:使用发现结果来指导未来的测试和改进。
你已经到达了文章的结尾——恭喜!🎉 希望你喜欢这篇文章。如果你觉得它有帮助,请考虑点赞并关注我。我将定期撰写关于揭示机器学习算法的神秘面纱、阐明统计学概念以及分享将 ML 项目部署到生产中的见解。