NumPy提供了大量的统计函数,用于描述数据的集中趋势、离散程度、相关性以及分布特征。这些函数是数据分析的基础工具,能够帮助你快速了解数据的整体特性。
顺序统计量包括最小值、最大值、中位数、百分位数等,它们描述了数据的分布位置。
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. ]
均值是最常用的中心趋势度量,NumPy还提供了加权平均和忽略NaN的版本。
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.]
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
方差、标准差、极差等度量数据的分散程度。
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 是无偏样本方差。
协方差衡量两个变量的联合变异性,相关系数则标准化了协方差,反映线性相关强度。
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 完全正相关,协方差为正且等于各自的方差(因为数据完美线性)。
np.corrcoef 返回 Pearson 相关系数矩阵。
corr_matrix = np.corrcoef(x, y)
print("相关系数矩阵:\n", corr_matrix)
# 对角线上为1,非对角线为相关系数
输出:
相关系数矩阵:
[[1. 1.]
[1. 1.]]
表示 x 和 y 完全正相关。
# 生成一些随机数据
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))
直方图用于估计数据的概率分布。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]
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]
当数据包含缺失值 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的排序与搜索功能。