这个图表存在多个问题:
- 由于两组观察数量不同,两个直方图不可比较。
- 箱子的数量是任意的。
我们可以通过使用 stat 选项绘制密度而不是计数,并将 common_norm 选项设置为 False 来解决第一个问题,以单独对每个直方图进行归一化。
现在这两个直方图是可比较的!
然而,一个重要的问题仍然存在:箱子的大小是任意的。在极端情况下,如果我们将数据分组得较少,就会出现最多只有一个观察的箱子;如果我们将数据分组得更多,就会得到一个单一的箱子。在这两种情况下,如果我们过度夸大,图表将失去信息性。这是一个经典的偏差-方差权衡(bias-variance trade-off)。
2.3 核密度估计(Kernel Density Estimation)一种可能的解决方案是使用核密度函数,它尝试用连续函数来近似直方图,称之为核密度估计(KDE)。
从图中可以看出,实验组的收入估计核密度具有更"厚的尾部"(即方差较高),而平均值在各组之间似乎相似。
核密度估计的问题在于它有点像黑匣子,可能掩盖了数据的相关特征。
2.4 累积分布函数(Cumulative Distribution)两个分布的更透明的表示是它们的累积分布函数。在 x 轴(收入)的每个点上,我们绘制了具有相等或更低值的数据点的百分比。累积分布函数的主要优点是:
- 我们不需要做任何任意选择(例如,箱子的数量);
- 我们不需要进行任何近似(例如,使用 KDE),而是表示所有数据点。
我们如何解读这个图呢?
- 由于这两条线在 0.5(y 轴)左右交叉,这意味着它们的中位数相似;
- 由于橙色线在左侧高于蓝色线,在右侧低于蓝色线,这意味着实验组的分布具有更厚的尾部。
一个相关的方法是Q-Q 图,其中Q代表分位数。Q-Q图将两个分布的分位数相互绘制。如果两个分布相同,我们应该得到一条 45 度的线。
Python 中没有原生的 Q-Q 图函数,虽然 statsmodels 包提供了一个 qqplot 函数,但使用起来相对繁琐。因此,我们将手动绘制。
首先,我们需要使用百分位函数计算两组的四分位数。