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 统计函数 都是通往专业之路的关键一步。现在就开始实践吧,把数据变成你的洞察力。