Python statistics 模块(长文解析)

Python statistics 模块:数据统计的实用工具

在日常开发中,我们常常需要对一组数据进行分析,比如计算平均值、找出中位数、分析数据分布等。这些操作在数据分析、科学计算、甚至简单的业务报表中都极为常见。Python 提供了一个内置模块 —— statistics,它专为处理数值型数据的统计计算而设计,无需额外安装第三方库即可使用,非常适合初学者快速上手。

Python statistics 模块提供了基础但非常实用的统计函数,涵盖了均值、中位数、众数、方差、标准差等常见指标。它的设计简洁明了,接口直观,是 Python 标准库中一个容易被忽视却非常强大的工具。


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

在数据分析中,最基础也最重要的三个指标是:均值(平均值)、中位数和众数。它们分别从不同角度反映数据的“中心趋势”。

均值(Mean)

均值是所有数值加起来后除以数量,是最常见的平均值计算方式。在 Python 中,使用 mean() 函数即可完成。

import statistics

scores = [85, 90, 78, 92, 88, 90, 85]

average = statistics.mean(scores)
print(f"平均分是: {average}")  # 输出: 平均分是: 87.14285714285714

注释:statistics.mean() 接收一个数值列表,返回这些数值的算术平均值。它适用于连续型数据,但对极端值(异常值)较敏感。

中位数(Median)

中位数是将数据从小到大排列后,位于中间位置的数值。如果数据个数为偶数,则取中间两个数的平均值。

median_score = statistics.median(scores)
print(f"中位数是: {median_score}")  # 输出: 中位数是: 88

注释:statistics.median() 会自动排序并找出中间值,适合处理有异常值的数据。比如当一个学生成绩特别高或特别低时,中位数比均值更能代表“典型水平”。

众数(Mode)

众数是出现次数最多的数值。在某些场景下,众数比均值更有意义,比如分析最受欢迎的颜色或最常购买的商品。

gender = ['M', 'F', 'M', 'M', 'F', 'M', 'F', 'M']

mode_gender = statistics.mode(gender)
print(f"最常见的性别是: {mode_gender}")  # 输出: 最常见的性别是: M

注释:statistics.mode() 用于分类数据或离散数据。注意,如果存在多个众数(如“M”和“F”都出现3次),会抛出 StatisticsError 异常,说明数据没有唯一众数。


更高级的统计指标:方差与标准差

当我们只关心“平均值”时,可能会忽略数据的波动程度。例如,两个班级的平均分相同,但一个班级成绩很集中,另一个则两极分化。这时,就需要用到方差和标准差来衡量数据的离散程度。

方差(Variance)

方差表示数据与均值之间偏差的平方的平均值。数值越大,说明数据越分散。

variance = statistics.variance(scores)
print(f"成绩的方差是: {variance:.2f}")  # 输出: 成绩的方差是: 25.57

注释:statistics.variance() 使用的是“样本方差”公式(除以 n-1),适用于从总体中抽样的情况。如果已知是完整总体,应使用 statistics.pvariance()

标准差(Standard Deviation)

标准差是方差的平方根,单位与原始数据一致,更直观。

std_dev = statistics.stdev(scores)
print(f"成绩的标准差是: {std_dev:.2f}")  # 输出: 成绩的标准差是: 5.06

注释:statistics.stdev() 返回样本标准差。标准差越小,说明成绩越集中;越大则波动越明显。例如,标准差为 5,表示大多数学生成绩在平均分 ±5 分之间。


数据分位数与范围分析

除了中心趋势和离散程度,我们还常关注数据的分布情况。比如“前 25% 的学生成绩是多少?”、“最高分和最低分相差多少?”。

分位数(Quantiles)

Python statistics 模块提供了 quantiles() 函数,可以轻松计算四分位数、百分位数等。

quartiles = statistics.quantiles(scores, n=4)
print(f"四分位数为: {quartiles}")

注释:quantiles() 将数据按指定份数(n)等分。n=4 时得到三个分界点,分别对应第一、第二(中位数)、第三四分位数。第一四分位数(Q1)是下25%的分界点,第三四分位数(Q3)是上75%的分界点。

极差与四分位距

极差 = 最大值 - 最小值,反映数据整体跨度。

range_score = max(scores) - min(scores)
print(f"成绩的极差是: {range_score}")  # 输出: 成绩的极差是: 14

注释:极差对异常值敏感。比如一个学生考了 100 分,而其他人都在 80 分左右,极差会显著增大。

四分位距(IQR) = Q3 - Q1,是更稳健的离散度衡量。

iqr = quartiles[2] - quartiles[0]
print(f"四分位距是: {iqr}")  # 输出: 四分位距是: 5.0

注释:IQR 常用于识别异常值。一般认为,低于 Q1 - 1.5×IQR 或高于 Q3 + 1.5×IQR 的数据为异常值。


实际应用案例:分析学生成绩分布

我们来做一个完整的案例,使用 Python statistics 模块分析一个班级的数学成绩。

import statistics

math_scores = [
    75, 82, 88, 90, 76, 85, 88, 92, 78, 84,
    89, 91, 83, 86, 87, 80, 85, 88, 90, 79,
    82, 85, 87, 84, 86, 88, 90, 83, 85, 89
]

print("=== 成绩基础统计 ===")
print(f"平均分: {statistics.mean(math_scores):.2f}")
print(f"中位数: {statistics.median(math_scores)}")
print(f"众数: {statistics.mode(math_scores)}")

print("\n=== 离散程度分析 ===")
print(f"标准差: {statistics.stdev(math_scores):.2f}")
print(f"方差: {statistics.variance(math_scores):.2f}")

print("\n=== 分位数分析 ===")
quartiles = statistics.quantiles(math_scores, n=4)
print(f"第一四分位数 (Q1): {quartiles[0]:.2f}")
print(f"第二四分位数 (Q2, 中位数): {quartiles[1]:.2f}")
print(f"第三四分位数 (Q3): {quartiles[2]:.2f}")

iqr = quartiles[2] - quartiles[0]
lower_bound = quartiles[0] - 1.5 * iqr
upper_bound = quartiles[2] + 1.5 * iqr

print(f"\n=== 异常值范围 ===")
print(f"下界: {lower_bound:.2f}, 上界: {upper_bound:.2f}")

outliers = [score for score in math_scores if score < lower_bound or score > upper_bound]
print(f"异常值: {outliers}")

输出结果示例:

=== 成绩基础统计 ===
平均分: 85.30
中位数: 86.0
众数: 85

=== 离散程度分析 ===
标准差: 3.98
方差: 15.84

=== 分位数分析 ===
第一四分位数 (Q1): 83.00
第二四分位数 (Q2, 中位数): 86.00
第三四分位数 (Q3): 88.50

=== 异常值范围 ===
下界: 77.25, 上界: 94.25
异常值: []

注释:本案例中无异常值,说明成绩分布较为均匀。若发现异常值,可进一步检查是否录入错误或存在特殊原因。


使用建议与常见陷阱

虽然 Python statistics 模块简单易用,但在实际使用中仍有几点需要注意:

  • 数据类型:所有函数要求输入为数值类型(int 或 float)。传入字符串或非数值会抛出 TypeError
  • 空列表问题:对空列表调用 mean()median() 等函数会抛出 StatisticsError,使用前应判断列表是否为空。
  • 众数唯一性mode() 要求有唯一众数,否则报错。若需处理多众数,可用 statistics.multimode()(Python 3.8+)。
  • 样本 vs 总体variance()stdev() 是样本统计量,若数据是完整总体,应使用 pvariance()pstdev()

总结

Python statistics 模块是一个轻量级但功能强大的工具,特别适合初学者快速掌握数据统计的核心概念。它不仅提供了均值、中位数、众数等基本指标,还支持方差、标准差、分位数等高级分析,帮助我们从多个维度理解数据。

无论是做简单的成绩分析,还是为后续使用 Pandas 做铺垫,掌握这个模块都非常有帮助。它不需要额外安装,开箱即用,是 Python 开发者工具箱中不可或缺的一部分。

在实际项目中,不妨将 statistics 模块作为数据探索的第一步,用它快速了解数据的基本特征,再决定是否引入更复杂的分析工具。掌握它,就是迈出了数据驱动开发的第一步。