A / B测试和Chi-Squared测试可最大程度地提高转化次数和点击率
主要内容: 前四个部分说明了用于此A / B测试的概念,后两个部分逐步介绍了对转换率执行A / B测试的示例。介绍
什么是A / B测试?
卡方检验
计算卡方检验统计量
数据集
A / B测试项目演练
1. 介绍
可以说,工作场所中最实用的数据科学概念之一是A / B测试。但是,由于存在许多复杂性,所以这个概念很容易被误解。
举个例子,许多实验者使用t检验来确定两种选择之间是否存在显着差异。但是,如果不将分布假定为高斯呢?如果两组的标准差不同怎么办?如果分发完成未知,该怎么办?
在本文中,我将讨论一种特定的A / B测试方法,该方法可以很好地比较点击率和转化次数。
2. 什么是A / B测试?
从最简单的意义上讲,A / B测试是对两个变体进行的实验,以查看在给定指标的基础上性能更好。通常,两个消费者群体会接触到同一事物的两个不同版本,以查看会话,点击率和/或转化等指标是否存在重大差异。
以上面的图像为例,我们可以将客户群随机分为两组,即对照组和变体(或处理)组。然后,我们可以用红色的网站横幅显示我们的变体形式组,看看转化率是否有明显提高。重要的是要注意,在执行A / B测试时,所有其他变量都必须保持恒定。
越来越多的技术,A / B测试是统计和两样本假设测试的一种形式。统计假设检验是一种将样本数据集与总体数据进行比较的方法。两样本假设检验是一种确定两个样本之间的差异是否在统计上显着的方法。
3. 卡方检验
点击率和转换有什么共同点?它们具有Bernoulli分布,即【1,0】的离散概率分布。对于点击率,用户将单击(1)或不单击(0)。同样,对于转换,用户将转换(1)或不转换(0)。
由于我们要对转换执行A / B测试,这是遵循伯努利分布的分类变量,因此我们将使用Chi-Squared测试。
进行卡方检验的步骤如下:计算卡方检验统计量
计算p值
将p值与显着性水平进行比较 当您跟随项目演练时,这将更有意义。
4. 计算卡方检验统计量
确定卡方检验统计量的公式如下:
让我们来看一个例子,以使这更有意义。
想象一下,我们展示了两个不同的广告A和B,以测试用户是否单击了广告。测试结束时,收集了以下信息:
在这种情况下,我们将必须进行四个计算,然后将它们求和:广告A,点击
广告A,无点击
广告B,点击
广告B,无点击
让我们以广告A为例。我们将需要计算观察值和期望值。 观测值等于360,如上表所示。
期望值等于显示广告A的次数乘以点击概率。因此,期望值= 500 *(660/1050)= 31.429。这些数字也来自上表。 在针对所有四种情况计算了此值之后,可以将这些数字输入到x²方程中以确定卡方检验统计量。
5. 数据集
我用于执行此A / B测试的数据集来自Kaggle(这是数据集的链接)。
此数据集包含A / B测试的结果,其中对照组和治疗组这两个组分别暴露于旧网页和新网页。该测试的目的是确定新网页与旧网页相比是否导致转化次数显着增加。每行代表一个唯一的用户,并显示他们是否属于对照组或治疗组,以及他们是否进行了转化。
6. A / B测试项目演练
# Import libraries and data
import numpy as np
import pandas as pd
import scipy
import matplotlib.pyplot as plt
df = pd.read_csv('../input/ab-testing/ab_data.csv')
与往常一样,我首先导入相关的库和数据。
7. 数据整理
在执行卡方检验之前,我想检查几件事,因为我不知道数据的清洁程度。我检查的第一件事是查看对照组中是否有看到新网页的用户,反之亦然。
#检查控件中是否有看到新页面的用户以及正在查看老页面的 正在处理的用户
df.groupby(['group','landing_page']).count()
在上方,您可以看到似乎有一个错误,对照组中的一些用户看到了新页面,而治疗组中的一些用户看到了旧页面。由于我不确定使用哪种方法还原错误分类的用户,因此我决定使用下面的代码将其删除。
# Removing control/new_page and treatment/old_page
df_cleaned = df.loc[(df['group'] == 'control') & (df['landing_page'] == 'old_page') | (df['group'] == 'treatment') & (df['landing_page'] == 'new_page')
df_cleaned.groupby(['group','landing_page']).count()
现在,对照组仅限于旧页面,而治疗组仅限于新页面。我想检查的下一件事是基于user_id的重复值。
# Checking for duplicate values
df_cleaned['user_id'].duplicated().sum()
| 1
由于存在重复项,因此我想对其进行更多的研究。
# Finding user_id for duplicate value
df_cleaned[df_cleaned.duplicated(['user_id'],keep=False)]['user_id']
df[df['user_id'] == 773192]
看起来该用户两次浏览了新的目标网页,但两次都没有进行转换。为了简化实验,我只想将其限制为每个用户的第一个决定。因此,我删除了该用户的第二个实例。
df_cleaned = df.drop_duplicates(subset='user_id', keep="first")
探索性数据分析
清除数据后,我希望对数据有更好的了解。我对照条形图绘制了数据,以查看两组转化的比例。看来它们具有相似的转换率(大约1/7),但是通过卡方检验,我们将看到是否存在显着差异。
groups = df_cleaned.groupby(['group','landing_page','converted']).size()
groups.plot.bar()
同样,我想通过饼图查看每个组中用户数量之间的比例是否相似。
df_cleaned['landing_page'].value_counts().plot.pie()
资料准备
此时,我准备为卡方数据准备数据。下面的代码等效于以上部分中的示例,在该部分中,我解释了如何计算卡方检验统计量。
### Re-arrrange data into 2x2 for Chi-Squared
# 1) Split groups into two separate DataFrames
a = df_cleaned[df_cleaned['group'] == 'control']
b = df_cleaned[df_cleaned['group'] == 'treatment']
# 2) A-click, A-noclick, B-click, B-noclick
a_click = a.converted.sum()
a_noclick = a.converted.size - a.converted.sum()
b_click = b.converted.sum()
b_noclick = b.converted.size - b.converted.sum()
# 3) Create np array
T = np.array([[a_click, a_noclick], [b_click, b_noclick]])
卡方检验
数据格式正确后,就可以进行测试了。只需通过从Scipy库导入统计信息即可完成。此步骤将计算卡方统计量和p值。
import scipy
from scipy import stats
print(scipy.stats.chi2_contingency(T,correction=False)[1])
p值经计算为19%。假设显着性水平为5%,我们可以推断出p值大于alpha,并且我们不拒绝原假设。简单来说,新旧网页之间的转换没有意义。
# Sanity Check
a_CTR = a_click / (a_click + a_noclick)
b_CTR = b_click / (b_click + b_noclick)
print(a_CTR, b_CTR)
作为健全性检查,我计算了两组之间的转换率,并且它们之间的差异很小,这可以确保正确进行了转换。
这就是本教程的结尾!希望您觉得这有用。:)