统计估计和误差条#

数据可视化有时涉及聚合或估计步骤,其中多个数据点被简化为一个汇总统计量,例如平均值或中位数。当显示汇总统计量时,通常适合添加误差条,它提供关于汇总统计量如何代表基础数据点的视觉提示。

当给定完整数据集时,几个 seaborn 函数会自动计算汇总统计量和误差条。本章解释了如何控制误差条显示的内容以及选择 seaborn 提供的每个选项的原因。

围绕中心趋势估计值的误差条可以显示两种一般事物之一:估计值的不确定性范围或基础数据围绕它的范围。这些度量是相关的:给定相同样本量,当数据具有更广泛的范围时,估计值将更加不确定。但随着样本量的增加,不确定性会减小,而范围不会减小。

在 seaborn 中,有两种构建每种误差条的方法。一种方法是参数化的,使用依赖于对分布形状假设的公式。另一种方法是非参数化的,仅使用您提供的数据。

您的选择是通过errorbar参数完成的,该参数存在于将估计作为绘图一部分执行的每个函数中。该参数接受要使用的方法的名称,以及可选的控制区间大小的参数。这些选择可以在一个 2D 分类法中定义,该分类法取决于显示的内容及其构建方式

../_images/error_bars_2_0.svg

您会注意到,大小参数对参数化和非参数化方法的定义不同。对于参数化误差条,它是一个标量因子,乘以定义误差的统计量(标准误差或标准差)。对于非参数化误差条,它是一个百分位数宽度。这将在下面针对每个特定方法进行进一步说明。

注意

这里描述的errorbar API 是在 seaborn v0.12 中引入的。在早期版本中,唯一的选择是显示引导置信区间或标准差,选择由ci参数控制(即,ci=<size>ci="sd")。

要比较不同的参数化,我们将使用以下辅助函数

def plot_errorbars(arg, **kws):
    np.random.seed(sum(map(ord, "error_bars")))
    x = np.random.normal(0, 1, 100)
    f, axs = plt.subplots(2, figsize=(7, 2), sharex=True, layout="tight")
    sns.pointplot(x=x, errorbar=arg, **kws, capsize=.3, ax=axs[0])
    sns.stripplot(x=x, jitter=.3, ax=axs[1])

数据范围度量#

代表数据范围的误差条提供了一个紧凑的分布显示,使用三个数字,而 boxplot() 将使用 5 个或更多数字,而 violinplot() 将使用一个复杂的算法。

标准差误差条#

标准差误差条是最容易解释的,因为标准差是一个熟悉的统计量。它是每个数据点到样本均值的平均距离。默认情况下,errorbar="sd" 将在估计值周围 +/- 1 个标准差处绘制误差条,但可以通过传递缩放大小参数来增加范围。请注意,假设数据呈正态分布,大约 68% 的数据将落在一个标准差内,大约 95% 的数据将落在两个标准差内,大约 99.7% 的数据将落在三个标准差内。

plot_errorbars("sd")
../_images/error_bars_6_0.png

百分位数区间误差条#

百分位数区间也代表了某些数据范围内的范围,但它们是通过直接从样本中计算这些百分位数来实现的。默认情况下,errorbar="pi" 将显示一个 95% 的区间,范围从 2.5 个百分位数到 97.5 个百分位数。您可以通过传递大小参数来选择不同的范围,例如,显示四分位数间距。

plot_errorbars(("pi", 50))
../_images/error_bars_8_0.png

标准差误差条将始终围绕估计值对称。当数据倾斜时,这可能是一个问题,尤其是当存在自然边界时(例如,如果数据代表一个只能为正值的量)。在某些情况下,标准差误差条可能会扩展到“不可能”的值。非参数化方法没有这个问题,因为它可以解释不对称范围,并且永远不会扩展到数据的范围之外。

估计值不确定性的度量#

如果您的数据是从更大的总体中随机抽取的样本,那么均值(或其他估计值)将是对真实总体平均值的非完美度量。显示估计值不确定性的误差条试图表示真实参数的可能值的范围。

标准误差条#

标准误差统计量与标准差相关:实际上它只是标准差除以样本量的平方根。默认情况下,使用 errorbar="se",将在均值 +/- 1 个标准误差处绘制一个区间。

plot_errorbars("se")
../_images/error_bars_11_0.png

置信区间误差条#

用于表示不确定性的非参数化方法使用引导:一个过程,其中数据集被随机地从替换中重新采样多次,并且估计值从每个重新采样中重新计算。此过程创建了一个统计量分布,近似于如果获得不同的样本,则可能获得的估计值的分布。

置信区间是通过取引导分布的百分位数区间来构建的。默认情况下 errorbar="ci" 绘制一个 95% 的置信区间。

plot_errorbars("ci")
../_images/error_bars_13_0.png

Seaborn 术语有些特殊,因为统计学中的置信区间可以是参数化的或非参数化的。要绘制参数化置信区间,您可以缩放标准误差,使用类似于上面提到的公式。例如,一个近似 95% 的置信区间可以通过取均值 +/- 两个标准误差来构建。

plot_errorbars(("se", 2))
../_images/error_bars_15_0.png

非参数化引导具有与百分位数区间类似的优点:它会以标准误差区间无法实现的方式自然适应倾斜和有界数据。它也更通用。虽然标准误差公式是特定于均值的,但可以使用引导方法为任何估计量计算误差条。

plot_errorbars("ci", estimator="median")
../_images/error_bars_17_0.png

引导涉及随机性,每次运行创建它们的代码时,误差条都会略有不同。一些参数控制这一点。其中一个设置迭代次数 (n_boot):使用更多的迭代,结果区间将更加稳定。另一个设置随机数生成器的seed,这将确保结果相同。

plot_errorbars("ci", n_boot=5000, seed=10)
../_images/error_bars_19_0.png

由于其迭代过程,引导区间可能很昂贵,尤其是对于大型数据集。但是,由于不确定性随着样本量的增加而减少,在这种情况下,使用代表数据范围的误差条可能更有信息量。

自定义误差条#

如果这些配方不足,也可以将一个通用函数传递给 errorbar 参数。该函数应该接受一个向量并产生一对值,表示区间的最小值和最大值。

plot_errorbars(lambda x: (x.min(), x.max()))
../_images/error_bars_21_0.png

(实际上,您可以使用 errorbar=("pi", 100) 显示数据的完整范围,而不是上面的自定义函数)。

请注意,seaborn 函数目前无法从外部计算的值中绘制误差条,尽管 matplotlib 函数可以用来将这些误差条添加到 seaborn 图中。

回归拟合上的误差条#

前面的讨论重点介绍了围绕聚合数据的参数估计显示的误差条。当估计回归模型以可视化关系时,误差条也会出现在 seaborn 中。在这里,误差条将由回归线周围的“带”表示。

x = np.random.normal(0, 1, 50)
y = x * 2 + np.random.normal(0, 2, size=x.size)
sns.regplot(x=x, y=y)
../_images/error_bars_24_0.png

目前,回归估计上的误差条的灵活性较差,只显示置信区间,其大小通过 ci= 设置。这在未来可能会改变。

误差条是否足够?#

您应该始终问问自己,是否最好使用只显示汇总统计量和误差条的图表。在许多情况下,情况并非如此。

如果您对汇总问题感兴趣(例如,均值是否在组之间不同或随时间增加),聚合会降低图表的复杂性,并使这些推断更容易。但这样做会掩盖有关基础数据点的宝贵信息,例如分布的形状和异常值的存在。

在分析您自己的数据时,不要满足于汇总统计量。始终查看基础分布。有时,将这两种观点结合到同一张图中可能会有所帮助。许多 seaborn 函数可以帮助完成此任务,尤其是 分类教程 中讨论的那些函数。