热线电话:13121318867

登录
首页大数据时代Python 统计学计算库全景:从基础统计到贝叶斯推断的工具选型
Python 统计学计算库全景:从基础统计到贝叶斯推断的工具选型
2026-11-06
收藏

一、为什么 Python 成了统计分析的主流工具

十年前做统计分析,主流选择是 SPSS、SAS、Stata。现在越来越多的研究者、分析师转向 Python,原因有三:

  • 生态完整:从数据读取、清洗、统计检验、建模到可视化,一条链路全部覆盖。
  • 免费开源:不像 SPSS/SAS 需要昂贵的授权费。
  • 可复现:代码即分析过程,别人能跑出同样的结果,这在学术研究里很重要。

但 Python 的统计库非常多,初学者容易搞不清该用哪个。本文按功能层次梳理主流库,说清每个库的定位和适用场景。

二、基础数值计算层:NumPy

2.1 定位

NumPy 是整个 Python 科学计算生态的地基,几乎所有统计库都建立在它之上。它提供多维数组对象 ndarray 和向量化运算能力。

2.2 统计相关能力

import numpy as np

data = np.array([12, 15, 18, 20, 22, 25, 100])

np.mean(data)      # 均值
np.median(data)    # 中位数
np.std(data)       # 标准差
np.var(data)       # 方差
np.percentile(data, [25, 50, 75])   # 四分位数
np.corrcoef(x, y)  # 相关系数矩阵

2.3 适用场景

  • 需要快速算基础描述统计量
  • 处理大规模数值数组运算
  • 作为其他统计库的底层依赖

不适合:复杂统计检验、回归建模(这些交给上层库)。

三、核心统计检验层:SciPy

3.1 定位

SciPy 是 Python 的"科学计算标准库",其中 scipy.stats 子模块提供了最常用的统计分布、检验和描述统计函数。这是做统计分析最常用的一个库。

3.2 核心能力

描述统计与分布:

from scipy import stats

# 正态性检验
stats.shapiro(data)        # Shapiro-Wilk
stats.normaltest(data)     # D'Agostino K²

# 分布拟合
stats.norm.fit(data)       # 拟合正态分布的 μ 和 σ
stats.norm.pdf(x, mu, sigma)  # 概率密度

常用假设检验:

# 单样本 t 检验
stats.ttest_1samp(data, popmean=20)

# 独立样本 t 检验(Welch)
stats.ttest_ind(group_a, group_b, equal_var=False)

# 配对 t 检验
stats.ttest_rel(before, after)

# 单因素方差分析
stats.f_oneway(g1, g2, g3)

# 卡方检验
stats.chi2_contingency(contingency_table)

# 非参数检验
stats.mannwhitneyu(a, b)     # 曼-惠特尼 U
stats.kruskal(g1, g2, g3)    # 克鲁斯卡尔-沃利斯
stats.wilcoxon(before, after)  # 威尔科克森符号秩

相关分析:

stats.pearsonr(x, y)    # 皮尔逊相关
stats.spearmanr(x, y)   # 斯皮尔曼秩相关
stats.kendalltau(x, y)  # 肯德尔相关

3.3 特点

  • 覆盖面广:几乎涵盖了教科书上所有经典统计检验。
  • 返回标准化:统一返回统计量和 p 值,便于程序化处理。
  • 缺点:不支持公式接口,不能像 R 那样写 y ~ x1 + x2;复杂模型要换 statsmodels。

四、建模与回归层:statsmodels

4.1 定位

statsmodels 是 Python 里最"像 R"的统计建模库,提供完整的统计模型、检验结果输出(含系数、标准误、t 值、p 值、R²、置信区间),是做计量经济学、社会科学的标配。

4.2 核心能力

线性回归:

import statsmodels.api as sm

X = sm.add_constant(df[['x1', 'x2']])
model = sm.OLS(df['y'], X).fit()
print(model.summary())   # 完整统计输出表

summary() 会输出一张完整的回归结果表,包括:

  • 系数、标准误、t 值、p 值
  • R²、调整 R²、F 统计量
  • AIC、BIC
  • 置信区间

这是 SciPy 给不了的——SciPy 只能算检验,statsmodels 能给出完整的模型诊断。

其他模型:

# 逻辑回归
sm.Logit(y, X).fit()

# 广义线性模型(泊松、伽马等)
sm.GLM(y, X, family=sm.families.Poisson()).fit()

# 时间序列
sm.tsa.ARIMA(y, order=(1,1,1)).fit()
sm.tsa.stattools.adfuller(y)   # ADF 平稳性检验

# 混合效应模型(多层数据)
sm.MixedLM(y, X, groups=df['group']).fit()

方差分析:

from statsmodels.formula.api import ols
model = ols('score ~ C(group)', data=df).fit()
sm.stats.anova_lm(model, typ=2)

4.3 特点

  • 支持 R 风格的公式接口(ols('y ~ x1 + x2', data=df))
  • 统计输出详尽,适合写论文
  • 涵盖 OLS、GLM、混合模型、时间序列、生存分析等

五、数据处理层:pandas

5.1 定位

pandas 严格说不是"统计库",而是数据分析库。但统计分析的第一步永远是数据整理,pandas 承担了这部分工作,且内置了大量统计方法。

5.2 统计相关能力

import pandas as pd

df.describe()                    # 一键输出描述统计
df.groupby('group')['score'].agg(['mean', 'std', 'count'])  # 分组统计
df.corr()                        # 相关系数矩阵
df['x'].value_counts()           # 频数统计
df.pivot_table(values='score', index='group', columns='gender', aggfunc='mean')  # 交叉表

5.3 与其他库的协作

pandas 是统计分析的"数据中转站":从 Excel/CSV/数据库读进来 → 清洗分组 → 转成 numpy 数组或 DataFrame 交给 scipy/statsmodels 做检验 → 结果用 pandas 整理成表。

六、机器学习与聚类层:scikit-learn

6.1 定位

scikit-learn 是机器学习库,但它也包含大量统计相关的功能:回归、分类、聚类、降维、交叉验证、特征选择。

6.2 统计相关能力

from sklearn.linear_model import LinearRegression, LogisticRegression
from sklearn.cluster import KMeans, DBSCAN
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score, roc_auc_score

6.3 与 statsmodels 的区别(重要)

这是最常被问的问题:

对比 statsmodels scikit-learn
目的 解释变量关系、做统计推断 预测效果、泛化能力
输出 完整统计表(p值、置信区间) 模型对象、预测值
关注点 系数显著吗、模型解释力如何 预测准不准
适用 学术研究、计量分析 工程落地、预测建模

一句话:要解释因果、看 p 值用 statsmodels;要预测新数据用 sklearn。

七、专用统计工具层

7.1 pingouin:统计检验的"一站式"封装

pingouin 是一个相对新的库,把 scipy 的统计检验封装成更友好的接口,直接返回 DataFrame 格式的结果,包含效应量、置信区间,省去自己拼装的麻烦。

import pingouin as pg

pg.ttest(group_a, group_b)          # 直接返回含 Cohen's d 的表
pg.anova(data=df, dv='score', between='group')  # 带回效应量
pg.corr(x, y, method='spearman')     # 带置信区间
pg.pairwise_tests(data=df, dv='score', between='group')  # 两两比较

优势:输出规范、带效应量、适合直接放进报告。

7.2 PyMC / Stan:贝叶斯统计

做贝叶斯推断需要专门的库:

import pymc as pm

with pm.Model() as model:
    mu = pm.Normal('mu', 0, 10)
    sigma = pm.HalfNormal('sigma', 5)
    obs = pm.Normal('obs', mu=mu, sigma=sigma, observed=data)
    trace = pm.sample(2000)

适用:小样本推断、先验信息利用、复杂层级模型、不确定性的完整刻画。

代价:需要 MCMC 采样,计算慢、学习曲线陡。

7.3 lifelines / scikit-survival:生存分析

做 Kaplan-Meier 曲线、Cox 比例风险模型:

from lifelines import KaplanMeierFitter, CoxPHFitter

kmf = KaplanMeierFitter()
kmf.fit(durations, event_observed)
kmf.plot()

cph = CoxPHFitter()
cph.fit(df, duration_col='time', event_col='event')
cph.print_summary()

适用:医学随访数据、客户流失分析、设备寿命分析。

7.4 arch:时间序列与计量经济

ARCH/GARCH 波动率模型、单位根检验、协整检验:

from arch import arch_model

am = arch_model(returns, vol='Garch', p=1, q=1)
res = am.fit()

7.5 seaborn / matplotlib / plotly:统计可视化

seaborn 专门针对统计图表设计:

import seaborn as sns

sns.histplot(data, kde=True)        # 直方图 + 密度曲线
sns.boxplot(x='group', y='score', data=df)  # 箱线图
sns.regplot(x='x', y='y', data=df)  # 散点 + 回归线 + 置信带
sns.heatmap(df.corr(), annot=True)  # 相关性热力图

八、库选型决策表

任务 推荐库 理由
基础描述统计 NumPy / pandas 最快最直接
单一假设检验 SciPy.stats 覆盖全,返回规范
回归建模 + 统计推断 statsmodels 完整统计表,p值、置信区间齐备
预测建模 scikit-learn 工程化、泛化能力优先
统计检验一站式报告 pingouin 自动带效应量、输出规范
贝叶斯推断 PyMC 生态成熟,文档好
生存分析 lifelines 接口友好,Kaplan-Meier/Cox 齐备
波动率、单位根检验 arch GARCH 系列标准库
统计图表 seaborn 内置统计绘图模板

九、一个典型的完整分析流程

实际做一次统计分析,通常是多个库配合:

import pandas as pd
import numpy as np
from scipy import stats
import statsmodels.api as sm
import seaborn as sns

# 1. 读取与整理(pandas)
df = pd.read_csv('data.csv')
df = df.dropna(subset=['score'])

# 2. 描述统计(pandas + numpy)
print(df.groupby('group')['score'].agg(['mean', 'std', 'count']))

# 3. 正态性检验(scipy)
for g in df['group'].unique():
    print(g, stats.shapiro(df[df.group==g]['score']))

# 4. 组间差异检验(scipy)
groups = [df[df.group==g]['score'] for g in df['group'].unique()]
print(stats.f_oneway(*groups))

# 5. 回归建模(statsmodels)
X = sm.add_constant(df[['age', 'income']])
model = sm.OLS(df['score'], X).fit()
print(model.summary())

# 6. 可视化(seaborn)
sns.boxplot(x='group', y='score', data=df)

这就是标准的数据分析流水线:pandas 整理 → scipy 检验 → statsmodels 建模 → seaborn 呈现。

十、常见误区

10.1 用 sklearn 做统计推断

sklearn 的线性回归没有 p 值、没有标准误,因为它不是为推断设计的。要用回归系数解释变量影响,必须用 statsmodels。

10.2 只看 p 值不看效应量

scipy 的 ttest_ind 只返回 t 和 p。要报告效应量(Cohen's d),得自己算,或者直接用 pingouin。

10.3 忘记检查检验前提

t 检验需要正态性和方差齐性,卡方检验需要期望频数 ≥5。直接调函数不检查前提,结论可能不可靠。

10.4 混合使用导致结果不一致

同一份数据用 scipy 和 statsmodels 算出来的 p 值偶尔会有细微差异,原因是默认参数(如是否 Welch 校正、尾部设定)不同。报告时要写清用的哪个库、什么参数。

十一、总结

Python 的统计学库按层次划分非常清晰:

  • NumPy:数值计算地基
  • pandas:数据整理与描述统计
  • SciPy.stats:假设检验主力
  • statsmodels:统计建模与推断
  • scikit-learn:机器学习与预测
  • pingouin / PyMC / lifelines / arch:专用场景增强

学习路径建议:先掌握 pandas + scipy 应付日常检验,需要写论文做回归就上 statsmodels,做机器学习预测用 sklearn,有特殊需求再按场景补 pingouin(便利性)、PyMC(贝叶斯)、lifelines(生存分析)。

不用一开始全学,按任务驱动选库,用熟了自然就形成自己的工具箱。

推荐学习书籍 《CDA一级教材》适合CDA一级考生备考,也适合业务及数据分析岗位的从业者提升自我。完整电子版已上线CDA网校,累计已有10万+在读~ !

免费加入阅读:https://edu.cda.cn/goods/show/3151?targetId=5147&preview=0

数据分析师资讯
更多

OK
客服在线
立即咨询
客服在线
立即咨询