刚入行数据科学,面对成堆的数据和模型,往往最先卡在"算个平均值都要翻文档"这一步。
别急,Python 标准库 statistics 模块 就能帮你搞定 80% 的日常统计需求。
本文挑选了 10 个最常用的统计函数,每个都配上核心代码片段,让你看完就能上手,快速搭起自己的数据分析小工具。
为什么要先掌握这 10 个函数?
在数据科学工作中,描述性统计和基础推断 是每次探索性数据分析(EDA)的起点。无论是清洗数据、发现异常,还是为建模做准备,都绕不开这些计算:
- 集中趋势 ------ 数据"平均"在哪儿?
- 离散程度 ------ 数据"散"成什么样?
- 关联关系 ------ 变量之间怎么相互影响?
statistics 模块是 Python 内置库,无需安装 ,直接 import 即可。
虽然它不如 NumPy/SciPy 功能强大,但胜在轻量、易读、零依赖,对新手极度友好。
1. 均值(mean)------ 最直观的"平均水平"
均值是所有数值加起来除以个数,简单明了。但要注意:它对异常值很敏感,如果你的数据里有极端大或极端小的数,均值会被"带偏"。
数学公式:
xˉ=n1∑i=1nxi
python
import statistics
data = [10, 20, 30, 40, 50]
mean = statistics.mean(data)
print("均值:", mean) # 30
📌 新手场景:计算员工平均工资、商品平均价格时先用它,但记得画个箱线图检查异常值。
2. 中位数(median)------ 抗干扰的"中间水平"
中位数是把数据排序后位于中间的那个数。当数据有异常值或分布偏斜时,中位数比均值更靠谱。
数学公式 (数据排序后记为 X(1),X(2),...,X(n)):
Median(X)={X(2n+1)2X(2n)+X(2n+1)if n is oddif n is even
python
data = [15, 20, 35, 40, 50]
median = statistics.median(data)
print("中位数:", median) # 35
# 偶数个数据时,会自动取中间两个的平均值
📌 新手场景:分析收入分布、房价等常带"长尾"的数据,中位数是你的首选。
3. 众数(mode / multimode)------ 找出"出现最多"的值
众数是频率最高的数值(或类别)。对于分类数据(如性别、产品类型),均值中位数都无效,但众数可以。
数学公式 ( freq(v) 表示数值 v 出现的频次):
Mode(X)=argmaxvfreq(v)
mode()返回找到的第一个众数;multimode()返回所有众数(当有多个并列最高频时很有用)。
python
data = [1, 2, 2, 2, 3, 4, 4, 4, 7, 7, 7]
# 只取第一个众数
mode = statistics.mode(data) # 2
# 取全部众数
modes = statistics.multimode(data) # [2, 4, 7]
📌 新手场景:分析用户最喜欢的产品颜色、最常出现的错误代码等。
4. 标准差(stdev)------ 衡量数据"离散"程度的标尺
标准差告诉我们数据点与均值的平均偏离距离。值越大,数据越分散。
数学公式 (样本标准差,分母为 n−1):
s=n−11∑i=1n(xi−xˉ)2
stdev()计算样本标准差(分母 n-1);pstdev()计算总体标准差(分母 n)。
python
data = [12, 15, 22, 29, 35]
std = statistics.stdev(data)
print(f"样本标准差: {std:.3f}") # 9.555
📌 新手场景:评估测试成绩的波动性、产品质量的稳定性。记得区分总体和样本(绝大多数场景用样本标准差)。
5. 方差(variance)------ 标准差的平方,但同样重要
方差在数学上更方便推导,但解释性不如标准差(因为单位被平方了)。不过很多统计检验直接用到方差。
数学公式 (样本方差,分母为 n−1):
s2=n−11∑i=1n(xi−xˉ)2
python
data = [8, 10, 12, 14, 16]
var = statistics.variance(data)
print(f"样本方差: {var:.2f}") # 10.00
📌 新手场景:ANOVA 分析、特征工程中归一化之前可能需要估算方差。
6. 协方差(covariance)------ 两个变量"同向变化"的度量
协方差为正表示两个变量趋向一起增大;为负则表示一个增大另一个减小。但协方差大小受量纲影响,不易直接比较,一般后续会转为相关系数。
数学公式 (样本协方差,分母为 n−1):
Cov(X,Y)=n−11∑i=1n(xi−xˉ)(yi−yˉ)
python
x = [2, 4, 6, 8, 10]
y = [1, 3, 5, 7, 9]
cov = statistics.covariance(x, y)
print("协方差:", cov) # 10.0
📌 新手场景:初步判断两个指标(如广告投入与销售额)是否有关联。
7. 分位数(quantiles)------ 把数据切成等份,看清分布
分位数将数据划分为多个等大小的区间。四分位数(n=4)是最常用的,帮你快速发现数据集中在哪个区间、有无异常尾巴。
数学公式 (定义方式不唯一,Python 使用位置插值法。此处给出 p 分位数的通用思想):
第 p 分位数是指至少有 p 比例的数据小于等于该值,至少有 1−p 比例的数据大于等于该值。对于 n 等分,计算排序后数据的相应位置。
python
data = [1, 5, 7, 9, 10, 12, 16, 18, 19, 21]
quartiles = statistics.quantiles(data, n=4)
print("四分位数:", quartiles) # [6.5, 11.0, 18.25]
📌 新手场景:绘制箱线图前手动算分位数,或者用它们来标记异常值(如 IQR 法)。
8. 相关系数(correlation)------ 标准化后的"关联强度"
相关系数消除了量纲影响,取值在 -1 到 1 之间。默认是 Pearson 相关系数 (线性相关),设置 method='ranked' 可转为 Spearman 秩相关系数(适用于非线性单调关系)。
数学公式(Pearson 相关系数):
r=∑i=1n(xi−xˉ)2⋅∑i=1n(yi−yˉ)2 ∑i=1n(xi−xˉ)(yi−yˉ)
python
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
corr = statistics.correlation(x, y)
print("相关系数:", corr) # 1.0 (完美正相关)
📌 新手场景:特征选择时筛掉高度相关的冗余特征,或初步探索目标变量与特征的关系。
9. 线性回归(linear_regression)------ 最简单的关系建模
此函数对两组数据执行简单线性回归 (一元),返回斜率 和截距 。它帮你快速得到一个可解释的线性方程 y = slope * x + intercept。
数学公式(最小二乘法估计):
β^=∑i=1n(xi−xˉ)2∑i=1n(xi−xˉ)(yi−yˉ)(斜率)
α^=yˉ−β^xˉ(截距)
python
x = [1, 2, 3, 4, 5]
y = [3, 4, 2, 5, 7]
slope, intercept = statistics.linear_regression(x, y)
print("斜率:", slope) # 0.9
print("截距:", intercept) # 1.5
📌 新手场景:快速验证两个连续变量的线性趋势,或者作为更复杂模型(如多元回归)前的热身。
10. 正态分布(NormalDist)------ 概率与 Z 分数的"瑞士军刀"
NormalDist 是一个类,不是简单函数,但它在统计推断中实在太常用了。你可以基于均值和标准差创建正态分布对象,然后计算累积概率(CDF) 、分位点(inv_cdf) 等。
数学公式(概率密度函数 PDF):
f(x)=σ2π 1e−2σ2(x−μ)2
(累积分布函数 CDF 是该密度函数从 −∞ 到 x 的积分,无初等闭式表达,直接通过 cdf() 方法数值计算。)
python
# 构建一个均值为30、标准差为10的正态分布
dist = statistics.NormalDist(mu=30, sigma=10)
# 小于等于20的概率
prob = dist.cdf(20)
print(f"P(X ≤ 20) = {prob:.3f}") # 0.159
# 求 97.5% 分位点(即 z=1.96 对应的原始值)
z = dist.inv_cdf(0.975)
print(f"97.5% 分位点: {z:.3f}") # 49.600
📌 新手场景:计算置信区间、假设检验的 p 值近似,或者生成模拟数据时使用。
总结
| 你要做的事 | 该用哪个函数 |
|---|---|
| 看数据的"中心" | mean()(无异常值)或 median()(有异常值) |
| 看数据的"多数" | mode() / multimode() |
| 看数据的"分散程度" | stdev()(样本)或 pstdev()(总体) |
| 看两个变量是否"一起动" | covariance()(量纲敏感)或 correlation()(推荐) |
| 看数据的"分段分布" | quantiles(n=4) |
| 快速拟合一条直线 | linear_regression() |
| 做概率计算或正态假设 | NormalDist 类 |
- 别贪快:每个函数都花 2 分钟用真实数据跑一遍,比看十遍教程更管用。
- 组合使用:均值 + 标准差 + 中位数 + 分位数,基本就能写出一份不错的 EDA 报告。
- 进阶一步 :当你熟练这些后,可以转战 NumPy 和 SciPy,它们提供更多进阶统计功能(如 t 检验、卡方检验等)。但扎实的基础永远是你最硬的底牌。