在统计学中,方差用来衡量一组数据的离散程度。它的定义是:先取每个数据与平均数的差的平方,然后再取平均。
对于方差来说,它具有以下性质:
- 方差越大,表示数据越分散。
- 方差越小,表示数据越集中。
- 方差为 0,表示所有数据都相等。
方差的公式如下:
方差 = mean((x - x.mean()) ** 2)其中,x.mean() 表示平均值,x - x.mean() 表示每个数据与平均值的差(离均差)。
NumPy 求方差函数
在 NumPy 中,我们可以使用 var() 函数来计算数组的方差。其中,var 是 “variance(方差)” 的缩写。
语法:
numpy.var(
arr,
axis=None,
dtype=None,
out=None,
ddof=0,
keepdims=False,
where=True
)说明:
var() 函数接收以下参数,初学的小伙伴只需要重点关注前 3 个即可。
arr(必选):是一个数组。axis(可选,默认:None):表示沿着哪条轴来计算方差。- 默认值为 None,表示计算整个数组的方差。
- 对于二维数组来说:axis=0 表示计算每一列的方差(竖着算),axis=1 表示计算每一行的方差(横着算)。
- 如果 axis 是一个元组,则表示在指定的多个轴上计算方差。
ddof(可选,默认:0):用于指定自由度修正量,默认为 0。- 当 ddof=0 时,表示计算总体方差(分母是 N)。
- 当 ddof=1 时,表示计算样本方差(分母是 N-1,更符合统计学要求)。
dtype(可选,默认:None):用于指定输出数组的数据类型。如果没有指定,整数自动转换为 float64,而浮点数保留原类型。out(可选,默认:None):将计算结果存到指定的已有数组中,而不是创建新数组,适用于节省内存和提升性能的场景。keepdims(可选,默认:False):是否保留被压缩的维度。如果设置为 True,则保留计算结果的维度。where(可选,默认:True):是一个布尔数组或条件表达式,只有满足 True 条件的元素才会参与计算。
需要清楚的是,方差的计算遵循以下公式:
方差 = mean(abs(x - x.mean()) ** 2)其中,x.mean() 是平均值,而 abs(x - x.mean()) 是离均差,平方之后取平均就是方差了。
当设置 ddof 时,分母变为 N - ddof(N 为有效数据个数)。
提示: 标准差与方差非常相似,另请参阅:NumPy 求标准差。
NumPy 求方差示例
接下来,我们通过几个简单的例子来讲解一下 NumPy 是如何求方差的。
示例 1:一维数组计算方差
import numpy as np
arr = np.array([3, 5, 7, 9])
# 总体方差(N分母)
result1 = np.var(arr)
print(result1)
# 样本方差(N-1分母)
result2 = np.var(arr, ddof=1)
print(result2)运行结果如下。
5.0
6.666666666666667分析:
从这个例子,我们可以看出 “总体方差” 和 “样本方差” 的区别。
- np.var(arr) 默认计算的是 “总体方差” ,分母是数组中元素的总个数(这里是 4)。
- np.var(arr, ddof=1) 表示计算 “样本方差” ,ddof=1 将分母从 N 变为 N-1(这里是 3)。这种计算方式在统计学上更常用,因为它能提供对方差的无偏估计。
示例 2:多维数组计算方差
import numpy as np
arr = np.array([[1, 2], [3, 4], [5, 6]])
# 列方差(axis=0)
result1 = np.var(arr, axis=0)
print(result1)
# 行方差(axis=1)
result2 = np.var(arr, axis=1)
print(result2)运行结果如下。
[2.66666667 2.66666667]
[0.25 0.25 0.25]分析:
在这个例子中,我们使用 np.array() 创建了一个二维数组。
- 当 axis=0 时,函数会沿着 “列(竖方向)” 来计算方差。它会分别计算第一列 [1, 3, 5] 和第二列 [2, 4, 6] 的方差,其结果是一个包含两个元素的数组。
- 当 axis=1 时,函数会沿着 “行(横方向)” 来计算方差。它会分别计算第一行 [1, 2]、第二行 [3, 4] 和第三行 [5, 6] 的方差,其结果是一个包含三个元素的数组。
示例 3:条件筛选计算方差
import numpy as np
arr = np.array([2, 4, 6, 8])
mask = np.array([True, False, True, False])
result = np.var(arr, where=mask) # 仅计算第 0、2 个元素
print(result)运行结果如下。
4.0分析:
在这个例子中,我们通过 where 参数来计算数组中满足特定条件的元素的方差。这种方式本质上是使用了 “NumPy 布尔索引” 的语法。
where=mask 表示告诉 np.var() 函数只处理 mask 数组中对应值为 True 的元素。在这里,mask 数组的第一个和第三个元素为 True,所以只有 arr 数组中的 2 和 6 参与计算。
通过 where 参数,我们可以灵活地筛选数据子集,以进行有针对性的统计分析。
