NumPy 统计函数(长文讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
在数据分析和科学计算领域,NumPy 统计函数是处理数值数据的核心工具。无论是计算均值、方差,还是探索数据分布特征,NumPy 提供的高效、简洁的接口都能显著提升开发效率。对于编程初学者而言,理解这些函数不仅能快速掌握数据处理的基础,还能为后续学习 Pandas、SciPy 等高级库打下坚实基础。本文将通过循序渐进的讲解和实战案例,帮助读者系统掌握 NumPy 统计函数的应用场景与实现逻辑。
一、NumPy 统计函数的基础概念
1.1 什么是统计函数?
统计函数是用于对数据集进行数值化描述的工具。例如:
- 均值:数据的平均值
- 标准差:衡量数据波动程度
- 分位数:将数据分割成等分点
在 NumPy 中,这些函数被封装为 numpy.<函数名>
形式,例如 numpy.mean()
和 numpy.median()
。它们直接作用于数组(Array),并返回计算结果。
1.2 NumPy 的优势:为什么选择它?
- 速度优势:基于底层 C 语言实现,比纯 Python 代码快数百倍
- 简洁语法:一行代码即可完成复杂统计计算
- 兼容性:与 Pandas、Matplotlib 等库无缝衔接
1.3 示例数据准备
以下代码创建一个包含学生成绩的示例数组,后续案例均基于此数据:
import numpy as np
np.random.seed(42) # 固定随机种子保证结果可复现
scores = np.random.randint(0, 101, 10)
print("原始成绩数据:", scores)
二、基础统计函数详解
2.1 均值(Mean)与中位数(Median)
2.1.1 均值:数据的“平衡点”
均值是所有数值的平均值,计算公式为:
[
\text{均值} = \frac{\sum_{i=1}^n x_i}{n}
]
代码示例:
mean_score = np.mean(scores)
print("平均分:", mean_score)
2.1.2 中位数:数据的“中间值”
中位数是排序后位于中间位置的数值。若数据量为偶数,则取中间两数的平均值。
代码示例:
median_score = np.median(scores)
print("中位数:", median_score)
比喻:
将成绩想象为超市货架上的商品高度,均值是“平均高度”,而中位数是“中间货架的高度”,后者更能抵抗极端值(如某个异常高分或低分)的影响。
2.2 标准差与方差:数据的波动程度
2.2.1 方差(Variance)
方差衡量数据与均值的偏离程度,计算公式为:
[
\text{方差} = \frac{\sum_{i=1}^n (x_i - \bar{x})^2}{n}
]
代码示例:
variance = np.var(scores)
print("方差:", variance)
2.2.2 标准差(Standard Deviation)
标准差是方差的平方根,单位与原始数据一致,更直观。
代码示例:
std_dev = np.std(scores)
print("标准差:", std_dev)
比喻:
标准差如同“数据的体温计”,数值越大表示数据越“发烧”(波动剧烈),越小则“冷静”(集中于均值附近)。
2.3 极差(Range):简单但实用的指标
极差是最大值与最小值之差,反映数据跨度。
range_score = np.ptp(scores) # ptp = "peak-to-peak"
print("极差:", range_score)
三、排序与分位数分析
3.1 数组排序:基础操作
sorted_scores = np.sort(scores)
print("排序后的成绩:", sorted_scores)
3.2 分位数(Quantile)与百分位数(Percentile)
分位数将数据分为等分部分,例如:
- 四分位数(25%、50%、75%)
- 百分位数(如第 90 百分位数)
代码示例:
quartiles = np.quantile(scores, [0.25, 0.5, 0.75])
print("四分位数:", quartiles)
percentile_90 = np.percentile(scores, 90)
print("第 90 百分位数:", percentile_90)
比喻:
分位数如同快递分拣站,将数据按比例分到不同区域,帮助快速定位数据分布。
四、高级统计函数应用
4.1 协方差与相关系数:探索变量关系
4.1.1 协方差(Covariance)
协方差衡量两个变量的协同变化程度。
returns_a = np.array([0.05, -0.02, 0.08, 0.01, -0.03])
returns_b = np.array([0.03, -0.01, 0.07, 0.02, -0.04])
covariance = np.cov(returns_a, returns_b)[0, 1] # 获取两个变量的协方差
print("协方差:", covariance)
4.1.2 相关系数(Correlation Coefficient)
相关系数标准化了协方差,取值范围 [-1, 1],消除量纲影响。
correlation = np.corrcoef(returns_a, returns_b)[0, 1]
print("相关系数:", correlation)
表格对比:
(与前一行空一行)
| 指标 | 协方差 | 相关系数 |
|--------------|-------------------------|--------------------------|
| 范围 | 无限制 | -1 到 1 |
| 量纲影响 | 有 | 无 |
| 解释 | 变化方向与幅度 | 变化方向与强度 |
4.2 统计函数的轴(axis)参数
当处理多维数组时,可通过 axis
参数指定统计方向:
data = np.array([[1, 2, 3],
[4, 5, 6]])
col_means = np.mean(data, axis=0)
print("列均值:", col_means) # 输出 [2.5, 3.5, 4.5]
row_means = np.mean(data, axis=1)
print("行均值:", row_means) # 输出 [2., 5.]
五、实战案例:学生成绩分析
5.1 数据生成与预处理
np.random.seed(42)
students = np.random.randint(60, 101, (100, 3))
math, chinese, english = students[:,0], students[:,1], students[:,2]
5.2 多维统计分析
subject_means = np.mean(students, axis=0)
print("各科平均分:", subject_means)
student_std = np.std(students, axis=1)
print("学生总分标准差:", student_std[:5]) # 展示前 5 个
5.3 分位数与异常值检测
math_90 = np.percentile(math, 90)
print("数学高分阈值:", math_90)
high_performers = students[math >= math_90]
print("高分学生数量:", high_performers.shape[0])
六、性能优化与注意事项
6.1 NumPy 的速度优势
对比纯 Python 实现:
def pure_python_mean(arr):
return sum(arr) / len(arr)
np_mean = np.mean(scores)
6.2 处理缺失值(NaN)
NumPy 提供了忽略 NaN
的专用函数,例如:
data_with_nan = np.array([1, 2, np.nan, 4])
print("忽略 NaN 的均值:", np.nanmean(data_with_nan))
6.3 轴参数的常见误区
若未指定 axis
,默认对所有元素进行统计:
total = np.sum(data) # 输出 1+2+3+4+5+6 = 21
结论
通过本文的系统讲解,读者应能掌握 NumPy 统计函数 的核心功能与应用场景。从基础的均值、标准差,到进阶的协方差、分位数分析,这些工具为数据探索提供了强大的支持。建议读者通过以下步骤深化理解:
- 动手练习:基于本文代码示例修改参数,观察结果变化
- 结合业务场景:尝试用统计函数分析实际数据集(如销售记录、传感器数据)
- 探索扩展:学习
numpy.histogram()
等高级函数,或结合 Pandas 进行更复杂分析
掌握这些技能后,你将能够更高效地从数据中提取有价值的信息,为决策提供科学依据。