NumPy 统计函数(完整教程)

NumPy 统计函数:数据分析的基石工具

在 Python 的数据科学生态中,NumPy 是最基础也是最重要的库之一。它不仅提供了高效的数组操作能力,还内置了一套完整而强大的 NumPy 统计函数,让开发者能快速完成数据的统计分析任务。无论是处理学生的考试成绩、用户的消费记录,还是传感器采集的原始数据,这些函数都能帮你轻松提炼出关键信息。

对于初学者来说,掌握这些统计函数就像学会使用一把万能尺——它不光能测量长度,还能判断高低、计算平均、分析分布。而对于中级开发者,深入理解这些函数的底层逻辑和使用场景,能显著提升代码效率与可读性。

本文将带你从零开始,系统掌握 NumPy 中最常用的统计函数,结合真实案例和详细注释,让你真正“用得上、用得好”。


基础统计:均值、中位数与众数

在数据分析中,最基础的三个统计量是均值(平均数)、中位数和众数。它们分别代表了数据的“中心趋势”,就像一座城市的核心区,不同的人会从不同角度感知它的位置。

计算均值:np.mean()

np.mean() 用于计算数组中所有元素的算术平均值。它的作用就像把一整袋糖果平均分给所有小朋友,每个人分到多少颗。

import numpy as np

scores = np.array([85, 92, 78, 96, 88, 73, 90, 85, 89, 91])

average_score = np.mean(scores)

print(f"平均分是:{average_score:.2f}")

注释:np.mean(scores) 会将所有元素相加后除以元素个数,结果保留两位小数。这个函数支持轴参数,比如对二维数组按行或列求平均。


求中位数:np.median()

中位数是将数据从小到大排列后位于中间位置的值。它不受极端值影响,因此比均值更“稳重”。想象一个班级里有 9 个学生,成绩从低到高排好,第 5 个学生的成绩就是中位数。

median_score = np.median(scores)

print(f"中位数是:{median_score}")

注释:当数组元素个数为偶数时,中位数是中间两个数的平均值。np.median() 会自动处理这种情况,无需手动判断。


查找众数:np.bincount() 配合 np.argmax()

NumPy 本身没有直接的 mode() 函数,但我们可以用 np.bincount() 来统计每个值出现的频次,再找出频次最高的那个值,这就是众数。

scores_int = scores.astype(int)

counts = np.bincount(scores_int)

mode_score = np.argmax(counts)

print(f"众数(最常见成绩)是:{mode_score}")

注释:np.bincount() 会返回一个数组,索引代表原始值,值代表该值出现的次数。np.argmax() 返回最大值的索引,即众数。这个方法适用于小范围整数数据。


离散程度:方差、标准差与极差

数据不仅要看“中心”,还要看“离散程度”。一个班级的平均分都是 85,但有的班成绩集中,有的班两极分化严重。这时候,方差和标准差就是衡量“波动性”的好帮手。

方差:np.var()

方差衡量数据与平均值之间的偏离程度。方差越大,说明数据越分散。

variance = np.var(scores)

print(f"成绩的方差是:{variance:.2f}")

注释:np.var() 默认使用总体方差(除以 N),如果要计算样本方差(除以 N-1),需设置 ddof=1,即 np.var(scores, ddof=1)


标准差:np.std()

标准差是方差的平方根,单位与原始数据一致,更直观。它告诉你“平均偏离了多少”。

std_dev = np.std(scores)

print(f"成绩的标准差是:{std_dev:.2f}")

注释:标准差越小,说明成绩越集中;越大则说明差异越大。6.88 分的标准差意味着大多数学生成绩在 85 ± 7 分之间波动。


极差:最大值减最小值

极差是数据集中最大值与最小值的差,是衡量数据跨度的最简单方式。

range_score = np.max(scores) - np.min(scores)

print(f"成绩的极差是:{range_score}")

注释:np.max()np.min() 分别返回数组中的最大值和最小值。极差虽然简单,但对异常值敏感,常作为初步分析工具。


位置分析:百分位数与四分位数

当你想知道“有多少人比我高”或“我处于哪个区间”时,百分位数就派上用场了。它能告诉你某个值在整体中的相对位置,就像在马拉松比赛中,你跑在第 90 百分位,意味着你比 90% 的选手快。

百分位数:np.percentile()

np.percentile() 可以计算任意百分位数,比如第 25、50、75 百分位,也就是常说的四分位数。

q1 = np.percentile(scores, 25)    # 第一四分位数
q2 = np.percentile(scores, 50)    # 中位数
q3 = np.percentile(scores, 75)    # 第三四分位数

print(f"第一四分位数(Q1):{q1:.2f}")
print(f"中位数(Q2):{q2:.2f}")
print(f"第三四分位数(Q3):{q3:.2f}")

注释:np.percentile(scores, 25) 表示从低到高排序后,第 25% 的位置上的值。这些值常用于绘制箱线图,判断数据分布是否对称。


四分位距(IQR):Q3 - Q1

四分位距是第三和第一四分位数的差,反映中间 50% 数据的离散程度。

iqr = q3 - q1

print(f"四分位距(IQR):{iqr:.2f}")

注释:IQR 越小,说明中间数据越集中。它常用于识别异常值:若某点小于 Q1 - 1.5×IQR 或大于 Q3 + 1.5×IQR,则可能是异常值。


多维数组的统计操作

在真实项目中,数据往往是二维甚至更高维的。例如,多个班级的学生成绩可以组织成二维数组。NumPy 的统计函数支持对特定轴进行操作。

class_scores = np.array([
    [85, 92, 78, 96, 88, 73, 90, 85, 89, 91],  # 班级 A
    [80, 87, 91, 85, 94, 88, 82, 89, 90, 86]   # 班级 B
])

avg_per_student = np.mean(class_scores, axis=0)
print("每个学生的平均分:", avg_per_student)

avg_per_class = np.mean(class_scores, axis=1)
print("每个班级的平均分:", avg_per_class)

注释:axis=0 表示沿列方向操作(对每一列求平均),axis=1 表示沿行方向操作(对每一行求平均)。这是处理表格数据时的核心技巧。


实际案例:分析用户消费行为

假设你有一组用户的月度消费数据,每行代表一个用户,每列代表一个月。

spending = np.array([
    [2500, 2600, 2400, 2700, 2550, 2650],  # 用户1
    [1800, 1900, 1750, 2000, 1850, 1950],  # 用户2
    [3500, 3400, 3600, 3300, 3550, 3450],  # 用户3
    [1200, 1100, 1300, 1250, 1150, 1350],  # 用户4
    [4200, 4100, 4300, 4000, 4250, 4150]   # 用户5
])

avg_spending_per_user = np.mean(spending, axis=1)
print("每个用户的月均消费:", avg_spending_per_user)

total_monthly = np.sum(spending, axis=0)
print("每个月的总消费:", total_monthly)

std_spending = np.std(spending, axis=0)
print("每个月的消费标准差:", std_spending)

注释:通过 axis=1 求每个用户平均,可以发现谁是“高消费人群”;通过 axis=0 求每月总和,可以发现哪个月消费最高。这些操作在商业分析中非常常见。


总结与建议

NumPy 统计函数 是数据分析的“第一道工序”。它们高效、简洁、功能强大,几乎能覆盖所有基础统计需求。从均值、方差到百分位数,从一维数组到多维数据,这些函数都能轻松应对。

建议你在日常开发中养成“先用 NumPy 统计”的习惯。它比纯 Python 循环快得多,代码也更简洁。尤其在处理大规模数据时,性能优势会非常明显。

记住,统计不是为了算出一个数字,而是为了理解数据背后的故事。掌握这些函数,你就能更准确地识别趋势、发现异常、做出决策。

无论你是数据初学者,还是正在构建分析系统,深入理解 NumPy 统计函数 都是通往专业之路的关键一步。现在就开始实践吧,把数据变成你的洞察力。