NumPy 统计函数

NumPy提供了大量的统计函数,用于描述数据的集中趋势、离散程度、相关性以及分布特征。这些函数是数据分析的基础工具,能够帮助你快速了解数据的整体特性。

1. 顺序统计

顺序统计量包括最小值、最大值、中位数、百分位数等,它们描述了数据的分布位置。

import numpy as np

data = np.array([12, 35, 28, 7, 42, 19, 33, 25])

print("数据:", data)
print("最小值 (np.min):", np.min(data))
print("最大值 (np.max):", np.max(data))
print("中位数 (np.median):", np.median(data))
print("25% 分位数 (np.percentile):", np.percentile(data, 25))
print("75% 分位数 (np.percentile):", np.percentile(data, 75))
print("0.5 分位数 (np.quantile):", np.quantile(data, 0.5))   # 等价于中位数

# 同时获取多个分位数
print("多个分位数:", np.percentile(data, [25, 50, 75]))

输出:

数据: [12 35 28  7 42 19 33 25]
最小值 (np.min): 7
最大值 (np.max): 42
中位数 (np.median): 26.5
25% 分位数 (np.percentile): 18.25
75% 分位数 (np.percentile): 34.0
0.5 分位数 (np.quantile): 26.5
多个分位数: [18.25 26.5  34.  ]

2. 中心趋势

均值是最常用的中心趋势度量,NumPy还提供了加权平均和忽略NaN的版本。

2.1 算术平均

print("均值 (np.mean):", np.mean(data))

# 沿轴计算
data2d = np.array([[1, 2, 3], [4, 5, 6]])
print("二维数组列均值 (axis=0):", np.mean(data2d, axis=0))
print("二维数组行均值 (axis=1):", np.mean(data2d, axis=1))

输出:

均值 (np.mean): 25.125
二维数组列均值 (axis=0): [2.5 3.5 4.5]
二维数组行均值 (axis=1): [2. 5.]

2.2 加权平均

np.average() 可以指定权重计算加权平均,如果不指定权重则等同于 mean

values = np.array([10, 20, 30, 40])
weights = np.array([0.1, 0.2, 0.3, 0.4])
weighted_avg = np.average(values, weights=weights)
print("加权平均:", weighted_avg)   # 10*0.1 + 20*0.2 + 30*0.3 + 40*0.4 = 30.0

输出:

加权平均: 30.0

3. 离散程度

方差、标准差、极差等度量数据的分散程度。

print("方差 (np.var):", np.var(data))
print("标准差 (np.std):", np.std(data))
print("极差 (np.ptp):", np.ptp(data))   # max - min

# 可以指定自由度参数 ddof(Delta Degrees of Freedom)用于样本方差
print("样本方差 (ddof=1):", np.var(data, ddof=1))

输出:

方差 (np.var): 127.109375
标准差 (np.std): 11.274279
极差 (np.ptp): 35
样本方差 (ddof=1): 145.267857

注意:ddof=0(默认)是总体方差,ddof=1 是无偏样本方差。

4. 协方差与相关系数

协方差衡量两个变量的联合变异性,相关系数则标准化了协方差,反映线性相关强度。

4.1 协方差

np.cov 返回协方差矩阵。默认每行代表一个变量,每列代表一个观测值;可通过 rowvar=False 使每列代表一个变量。

x = np.array([2, 4, 6, 8])
y = np.array([1, 3, 5, 7])

cov_matrix = np.cov(x, y)
print("协方差矩阵:\n", cov_matrix)
# 对角线元素是方差,非对角线是协方差

输出:

协方差矩阵:
 [[6.66666667 6.66666667]
 [6.66666667 6.66666667]]

这里 x 和 y 完全正相关,协方差为正且等于各自的方差(因为数据完美线性)。

4.2 相关系数

np.corrcoef 返回 Pearson 相关系数矩阵。

corr_matrix = np.corrcoef(x, y)
print("相关系数矩阵:\n", corr_matrix)
# 对角线上为1,非对角线为相关系数

输出:

相关系数矩阵:
 [[1. 1.]
 [1. 1.]]

表示 x 和 y 完全正相关。

4.3 实际数据示例

# 生成一些随机数据
rng = np.random.default_rng(42)
x = rng.normal(0, 1, 100)
y = 2*x + rng.normal(0, 0.5, 100)   # 近似线性关系

print("协方差:\n", np.cov(x, y))
print("相关系数:\n", np.corrcoef(x, y))

5. 直方图

直方图用于估计数据的概率分布。NumPy 的 histogram 函数返回直方图计数和箱边界。

data = np.random.normal(0, 1, 1000)
counts, bin_edges = np.histogram(data, bins=10)
print("箱边界:", bin_edges)
print("频数:", counts)

# 也可以使用 density=True 得到概率密度
counts_norm, _ = np.histogram(data, bins=10, density=True)
print("密度估计:", counts_norm)

输出示例:

箱边界: [-3.056   -2.4188  -1.7816  -1.1444  -0.5072   0.13     0.7672   1.4044   2.0416   2.6788   3.316 ]
频数: [ 3 14 47 130 238 264 194 77 24  9]
密度估计: [0.0469 0.2188 0.7344 2.0312 3.7188 4.125  3.0312 1.2031 0.375  0.1406]

6. 其他统计函数

  • np.ptp():峰峰值(已介绍)
  • np.percentile()np.quantile()(已介绍)
  • np.histogram2d()np.histogramdd():多维直方图
  • np.bincount():计算非负整数数组中每个值的出现次数(常用于分类)
# bincount 示例
arr = np.array([0, 1, 1, 3, 2, 1, 0, 3])
counts = np.bincount(arr)
print("bincount:", counts)   # 索引0出现2次,1出现3次,2出现1次,3出现2次

输出:

bincount: [2 3 1 2]

7. 忽略NaN的统计函数

当数据包含缺失值 NaN 时,NumPy 提供了一组以 nan 开头的统计函数,它们会自动忽略 NaN 值。

data_with_nan = np.array([10, 20, np.nan, 40, 50])
print("忽略 NaN 的均值:", np.nanmean(data_with_nan))
print("忽略 NaN 的中位数:", np.nanmedian(data_with_nan))
print("忽略 NaN 的标准差:", np.nanstd(data_with_nan))
print("忽略 NaN 的百分位数:", np.nanpercentile(data_with_nan, 50))

输出:

忽略 NaN 的均值: 30.0
忽略 NaN 的中位数: 30.0
忽略 NaN 的标准差: 15.811388
忽略 NaN 的百分位数: 30.0
提示: 许多统计函数也可以通过数组对象的方法调用,例如 data.mean()data.std() 等,但注意这些方法不支持 ddof 等参数?实际上支持。对于习惯面向对象风格的开发者,使用方法更简洁。

总结

本节介绍了NumPy中常用的统计函数,包括描述数据集中趋势、离散程度、相关性以及分布的函数。掌握这些工具,可以快速进行探索性数据分析,为更复杂的建模打下基础。下一章我们将学习NumPy的排序与搜索功能。