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 统计函数 的核心功能与应用场景。从基础的均值、标准差,到进阶的协方差、分位数分析,这些工具为数据探索提供了强大的支持。建议读者通过以下步骤深化理解:

  1. 动手练习:基于本文代码示例修改参数,观察结果变化
  2. 结合业务场景:尝试用统计函数分析实际数据集(如销售记录、传感器数据)
  3. 探索扩展:学习 numpy.histogram() 等高级函数,或结合 Pandas 进行更复杂分析

掌握这些技能后,你将能够更高效地从数据中提取有价值的信息,为决策提供科学依据。

最新发布