前几天使用duckdb进行数据分析过程中,发现结果不一致,仔细翻阅Duckdb文档中stddev_pop和stddev_samp、var_pop和var_samp 的描述和公式差异:
- stddev_pop(x):总体标准差
- stddev_samp(x):样本标准差
- var_pop(x):总体方差(无贝塞尔修正)
- var_samp(x):样本方差(包含贝塞尔修正)
为什么会有两个标准差、两个方差的定义,为啥一个除以n而另一个除以n-1;为何要贝塞尔修正(Bessel’s Correction)?
总体方差和样本方差
在统计分析中,总体方差和样本方差是衡量数据分散程度的重要指标。总体方差(The population variance)是描述整个数据集的离散程度,也就是说我们手上的数据集是整个数据集,它计算的是数据点与总体均值的差异程度。总体方差的公式如下:
其中 n 是数据集的数据点数量。在计算总体方差时,我们可以直接使用 n 作为除数,因为我们已经有了整个数据集的所有信息。
与此相对,样本方差(The sample variance)是从总体中抽取的样本数据的离散程度,也就是我们计算的数据集只是整体的一部分,通过手上的数据集来估计总体的方差,例如在产品质量分析过程,我们检验的产品可能只是所有产品的抽样部分检测。由于样本数据仅是总体的一个子集,它不包含所有的信息,因此样本方差往往会低估总体方差。为了弥补这一点,我们需要进行贝塞尔修正,将除数从 n 调整为 n−1,这样可以更准确地估计总体方差。样本方差的公式如下:
对于标准差,总体标准差(The population standard deviation)是总体方差的平方根,而样本标准差(he sample standard deviation)则是样本方差的平方根。标准差与方差的区别在于,标准差与原始数据的单位相同,更便于解释。
贝塞尔修正
为什么在(贝塞尔修正)计算样本方差时除以 n−1,我们需要分析使用样本均值代替总体均值时会发生什么。在实际应用中,我们通常只能依赖样本数据。其原理如下:
计算样本方差时,我们会找到每个数据点与样本均值的偏差,平方这些偏差,并计算它们的平均值。然而,样本均值通常不等于总体均值,这导致使用样本均值会低估总体的方差或分布。
以下是几种可能的情况:
1. 样本均值小于总体均值(xˉ<μ)时的情况
当样本均值(xˉ)小于总体均值(μ)时,样本中的大部分数据点离样本均值更近,而不是离总体均值更近。结果是,数据点与均值之间的距离(偏差)变小,导致方差的计算偏小,即低估了实际的方差。因为我们只能从样本中获取数据,无法收集所有总体数据。在样本数据中,接近总体均值的一部分数据的偏差(绝对值或平方差)会大于样本均值的偏差,而接近样本均值的部分数据偏差则更小。由于正态分布的对称性,低估的区域大于高估的区域,因此方差会被低估。
为了补偿方差的低估,使用 n−1代替 n 来计算方差,这就是贝塞尔修正(Bessel’s Correction)。
2. 样本均值大于总体均值(xˉ>μ)时的情况
当样本均值大于总体均值时,低值部分的数据点会比总体均值更接近样本均值,依然导致方差的低估。同样地,由于正态分布的对称性,低估的区域依然大于高估的区域,因此我们通过将偏差除以 n−1 来修正这种低估,确保样本方差是总体方差的无偏估计。
无论是样本均值小于总体均值还是大于总体均值,都会导致方差的低估。通过贝塞尔修正(使用 n−1而非 n)可以补偿这种低估,使得样本方差更加接近总体方差,从而得到无偏的估计。
贝塞尔修正(Bessel’s Correction)的核心在于将样本数据的方差除以 n−1,而不是 n,这种修正确保了我们在使用样本数据来估算总体方差时,得到的是一个无偏估计。无偏估计的意思是,随着样本数量的增加,估算的样本方差会逐渐趋近于总体方差。
贝塞尔修正(Bessel’s Correction)的好处在于,它修正了由于样本均值比总体均值更接近样本数据的现象,避免了方差估计的系统性偏差。举个例子,如果我们直接使用样本均值来计算样本方差(除以 n),可能会低估样本数据的离散程度,从而导致我们对总体方差的估计值偏小。通过贝塞尔修正,我们的样本方差可以更好地反映总体方差的真实情况。
在计算样本方差或标准差时,除以 n−1看似一个微小的变化,但它对于获得总体方差的无偏估计至关重要。这个调整称为贝塞尔修正,它补偿了由于依赖样本均值而非真实总体均值所导致的低估问题。