两个方差的故事:为什么 NumPy 和 Pandas 给出不同的答案

假设您正在分析一个小数据集:您想要计算一些汇总统计数据以了解该数据的分布,因此您使用 numpy 来计算均值和方差。你的输出看起来像这样:太棒了!现在您已经了解了数据的分布。然而,你的同事来了……《两个方差的故事:为什么 NumPy 和 Pandas 给出不同的答案》一文首先出现在《走向数据科学》上。

来源:走向数据科学

您正在分析一个小数据集:

\[X = [15, 8, 13, 7, 7, 12, 15, 6, 8, 9]\]

您想要计算一些汇总统计量以了解该数据的分布,因此您使用 numpy 来计算均值和方差。

将 numpy 导入为 np

X = [15, 8, 13, 7, 7, 12, 15, 6, 8, 9]

平均值 = np.mean(X)

var = np.var(X)

print(f"平均值={mean:.2f}, 方差={var:.2f}")

您的输出如下所示:

均值=10.00,方差=10.60

太棒了!现在您已经了解了数据的分布。然而,您的同事告诉您,他们还使用以下代码计算了同一数据集的一些汇总统计数据:

将 pandas 导入为 pd

X = pd.Series([15, 8, 13, 7, 7, 12, 15, 6, 8, 9])

平均值 = X.mean()

var = X.var()

print(f"平均值={mean:.2f}, 方差={var:.2f}")

他们的输出如下所示:

均值=10.00,方差=11.78

均值相同,但方差不同!什么给?

出现这种差异是因为 numpy 和 pandas 使用不同的默认方程来计算数组的方差。本文将从数学角度定义这两个方差,解释它们为何不同,并展示如何在不同的数值库中使用任一方程。

两个定义有两种计算方差的标准方法,每种方法都有不同的目的。这取决于您是计算整个总体(您正在研究的整个群体)的方差还是只是一个样本(您实际拥有数据的总体的较小子集)的方差。总体方差定义为:\[\sigma^2 = \frac{\sum_{i=1}^N(x_i-\mu)^2}{N}\]样本方差定义为:\[s^2 = \frac{\sum_{i=1}^n(x_i-\bar x)^2}{n-1}\](注:代表数据集中的每个单独的数据点。代表总体中数据点的总数,代表样本中数据点的总数,并且是样本平均值)。请注意这些方程之间的两个主要区别:为什么它们不同?自由度库默认值以及如何对齐它们numpyR