比较一个变量在不同组中的分布是数据科学中的一个常见问题。当我们想要评估一项策略(用户体验功能、广告活动、药物等)的因果效应时,因果推断的黄金标准便是随机对照试验,也就是所谓的A /B测试。在实践中,我们为研究选择一个样本,并将其随机分为对照组(control group)和实验组(treatment group)比较两组之间的结果。随机化确保了两组之间的唯一差异,这样我们就可以将结果差异归因于实验效果。
因为是随机的所以两组个体不会完全的相同(identical)。但是有时候,它们在总体表现时甚至不是“相似”的(similar)。例如,我们可能在一个群体中有更多的男性,或者年长的人,等等。(我们通常称这些特征为协变量或控制变量)。当这种情况发生时,就不能再确定结果的差异只是由于实验得来的。因此,随机化后,检查所有观察变量是否在组间平衡,是否没有系统差异是非常重要的。
在这篇文章中,我们将看到比较两个(或更多)分布的不同方法,并评估它们差异的量级和重要性。我们将考虑两种不同的方法,可视化和统计。这两种方法可以为我们的提供直觉和严谨的数值来快速评估和探索差异,但是需要注意的是,这些方法很难区分这些差异是系统性的还是由于噪声造成的。
假设我们需要对一组人进行实验并且已经将他们随机分为实验组和对照组。我们希望它们尽可能具有可比性,以便将两组之间的任何差异仅归因于实验效果。我们还将实验组分为不同的组,以检验不同实验方法的效果(例如,同一种药物的轻微变化)。
对于这个例子,我模拟了1000个人的数据集,我们观察他们的一组特征。我从src导入了数据生成进程dgp_rnd_assignment()。DGP和src.utils中的一些绘图函数和库。
from src.utils import *
from src.dgp import dgp_rnd_assignment
df = dgp_rnd_assignment().generate_data()
df.head()
我们有1000个人的信息,观察他们的性别、年龄和周收入。每个人要么被分配到4个不同的实验组要么被分配到对照组。
2组数据对比-可视化
让我们从最简单的开始:我们想要比较整个实验组和对照组的收入分配。我们首先探索可视化方法,然后是统计方法。第一种方法的优点是可以使用我们的直觉进行判断,第二种方法的优点是使用数字判断更加的严谨。
对于大多数可视化,这里将使用Python的seaborn库。
箱线图
第一种视觉方法是箱线图。箱线图是汇总统计和数据可视化之间的良好折衷。框的中心代表中位数,而边框分别代表第1(Q1)和第3四分位数(Q3)。扩展线延伸到框外超过四分位距 (Q3 - Q1) 1.5 倍的第一个数据点。落在扩展线之外的点是单独绘制的,通常会被认为是异常值。
因此,箱线图提供了汇总统计数据(方框和扩展线)和直接数据可视化(异常值)。
sns.boxplot(data=df, x='Group', y='Income');
plt.title("Boxplot");
实验组的收入分配更加分散:橙色盒子更大,它的扩展线覆盖范围更广。但是箱线图的问题是它隐藏了数据的形状,它告诉我们一些汇总的统计数据,但没有显示实际的数据分布。
直方图
绘制分布图最直观的方法是直方图。直方图将数据分组到同等宽的容器(bin)中,并绘制出每个容器中的观察数据的数量。
sns.histplot(data=df, x='Income', hue='Group', bins=50);
plt.title("Histogram");
直方图也存在一些问题
- 由于两组的观察次数不同,因此两个直方图不具有可比性
- bin的数量是任意的
我们可以使用 stat 选项来绘制密度而不是计数来解决第一个问题,并将 common_norm 设置为 False 分别对每个直方图进行归一化。
完整文章
https://avoid.overfit.cn/post/883ffe04b1e340c8a5fd2a7ea6364cbf