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 模块作为数据探索的第一步,用它快速了解数据的基本特征,再决定是否引入更复杂的分析工具。掌握它,就是迈出了数据驱动开发的第一步。