Python中的Statsmodels:统计建模与假设检验

一、什么是 Statsmodels?

statsmodels(全称:Statistical Models)是一个基于 NumPy、SciPy 和 pandas 构建的 Python 库,主要用于:

  • 拟合统计模型(如线性回归、逻辑回归、广义线性模型)
  • 执行统计检验(t检验、F检验、卡方检验等)
  • 进行时间序列分析(ARIMA、VAR 等)
  • 输出详细的统计结果报告(包含 p 值、置信区间、R² 等)

它广泛应用于经济学、社会科学、生物统计等领域。

安装方式

python 复制代码
pip install statsmodels

导入常用模块:

python 复制代码
import statsmodels.api as sm
import statsmodels.formula.api as smf
import numpy as np
import pandas as pd
from scipy import stats

二、核心功能介绍

1. 线性回归分析

使用 statsmodels.api 进行 OLS 回归

我们以经典的"身高-体重"数据为例,演示如何进行普通最小二乘法(OLS)回归。

python 复制代码
# 生成示例数据
np.random.seed(42)
height = np.random.normal(170, 10, 100)
weight = 0.8 * height - 100 + np.random.normal(0, 5, 100)

# 添加常数项(截距)
X = sm.add_constant(height)  # 添加截距列
y = weight

# 拟合模型
model = sm.OLS(y, X).fit()

# 输出结果摘要
print(model.summary())

输出内容包括:

  • 回归系数(coef)及其标准误
  • t 统计量和对应的 p 值(判断显著性)
  • R-squared 和调整后的 R²
  • F-statistic 及其 p 值(整体模型显著性)
  • AIC/BIC 信息准则

关键优势 :相比其他库,statsmodels 提供了完整的统计推断信息,帮助我们判断变量是否真正"显著"。

使用公式接口(类似 R 语言风格)

smf.ols() 支持使用字符串公式,语法更直观:

python 复制代码
# 构造 DataFrame
data = pd.DataFrame({'weight': weight, 'height': height})

# 使用公式拟合
model = smf.ols('weight ~ height', data=data).fit()
print(model.summary())

支持多项式项、分类变量自动编码等高级功能:

python 复制代码
# 包含平方项
model = smf.ols('weight ~ height + np.power(height, 2)', data=data).fit()

2. 假设检验

statsmodels 提供了多种经典的统计检验方法。

(1) t 检验:单样本与双样本
python 复制代码
from scipy.stats import ttest_1samp, ttest_ind

# 单样本 t 检验:均值是否等于某个值?
sample = np.random.normal(5.5, 1, 30)
t_stat, p_val = ttest_1samp(sample, popmean=5.0)
print(f"t={t_stat:.3f}, p={p_val:.3f}")
(2) 正态性检验(Shapiro-Wilk)
python 复制代码
from scipy.stats import shapiro
stat, p = shapiro(residuals)
if p > 0.05:
    print("残差服从正态分布(无法拒绝原假设)")
else:
    print("残差不服从正态分布")
(3) 同方差性检验(Breusch-Pagan)
python 复制代码
from statsmodels.stats.diagnostic import het_breuschpagan

bp_test = het_breuschpagan(model.resid, model.model.exog)
labels = ['LM Statistic', 'LM-Test p-value', 'F-Statistic', 'F-Test p-value']
print(dict(zip(labels, bp_test)))

用于检测回归模型中是否存在异方差问题。

(4) 多重共线性诊断(VIF)
python 复制代码
from statsmodels.stats.outliers_influence import variance_inflation_factor

X_vif = X.iloc[:, 1:]  # 去掉常数项
vif = [variance_inflation_factor(X_vif.values, i) for i in range(X_vif.shape[1])]
pd.DataFrame({'variable': X_vif.columns, 'VIF': vif})

VIF > 10 表示存在严重多重共线性。


3. 广义线性模型(GLM)

当因变量不符合正态分布时,可以使用 GLM。例如:

  • 二分类问题 → 逻辑回归(Logit / Probit)
  • 计数数据 → 泊松回归
python 复制代码
# 生成二分类数据
data['high_weight'] = (data['weight'] > data['weight'].median()).astype(int)

# 逻辑回归
logit_model = smf.logit('high_weight ~ height', data=data).fit()
print(logit_model.summary())

输出包括 Odds Ratio 解释、Wald 检验等。


4. 时间序列分析

statsmodels 在时间序列建模方面非常强大。

(1) ARIMA 模型
python 复制代码
from statsmodels.tsa.arima.model import ARIMA

# 示例:模拟时间序列
ts = np.cumsum(np.random.normal(0, 1, 100)) + np.linspace(0, 10, 100)

# 拟合 ARIMA(p,d,q)
arima_model = ARIMA(ts, order=(1,1,1)).fit()
print(arima_model.summary())

# 预测未来5步
forecast = arima_model.forecast(steps=5)
(2) 单位根检验(ADF 检验)

判断时间序列是否平稳:

python 复制代码
from statsmodels.tsa.stattools import adfuller

result = adfuller(ts)
print(f'ADF Statistic: {result[0]}')
print(f'p-value: {result[1]}')
if result[1] <= 0.05:
    print("序列平稳")
else:
    print("序列非平稳,需差分")
(3) 格兰杰因果检验

检验一个时间序列是否对另一个有预测能力:

python 复制代码
from statsmodels.tsa.stattools import grangercausalitytests

# 构造双变量时间序列
data_ts = pd.DataFrame(np.column_stack([ts, np.roll(ts, shift=1)]), 
                       columns=['x', 'y'])
grangercausalitytests(data_ts[['y','x']], maxlag=2)

三、可视化辅助分析

结合 matplotlibseaborn,我们可以绘制回归诊断图:

python 复制代码
import matplotlib.pyplot as plt

fig, ax = plt.subplots(2, 2, figsize=(10, 8))
sm.graphics.plot_regress_exog(model, 'height', fig=fig)
plt.tight_layout()
plt.show()

常见诊断图包括:

  • 残差 vs 拟合值(检查异方差)
  • Q-Q 图(检查正态性)
  • 杠杆值与残差图(识别异常点)

四、与其他库的对比

特性 statsmodels scikit-learn
目标 统计推断、因果分析 预测建模、机器学习
输出 参数显著性、置信区间、p值 预测值、评分(如准确率)
易用性 公式接口友好,适合统计背景用户 API 统一,适合工程部署
模型类型 OLS、GLM、ARIMA、面板数据等 回归、分类、聚类、降维等

✅ 推荐组合使用:用 statsmodels 分析变量关系和显著性,用 scikit-learn 构建高性能预测模型。


五、总结

statsmodels 是 Python 中进行严谨统计分析不可或缺的工具。它的主要优势在于:

  1. 提供完整的统计推断结果,便于科学决策;
  2. 支持广泛的经典统计模型(线性模型、时间序列、离散选择模型等);
  3. 丰富的假设检验和诊断工具,保障模型有效性;
  4. 兼容 pandas 数据结构,易于集成进数据分析流程。

参考资料

相关推荐
用户8356290780511 天前
无需 Office:Python 批量转换 PPT 为图片
后端·python
markfeng81 天前
Python+Django+H5+MySQL项目搭建
python·django
GinoWi1 天前
Chapter 2 - Python中的变量和简单的数据类型
python
JordanHaidee1 天前
Python 中 `if x:` 到底在判断什么?
后端·python
ServBay1 天前
10分钟彻底终结冗长代码,Python f-string 让你重获编程自由
后端·python
闲云一鹤1 天前
Python 入门(二)- 使用 FastAPI 快速生成后端 API 接口
python·fastapi
Rockbean1 天前
用40行代码搭建自己的无服务器OCR
服务器·python·deepseek
曲幽1 天前
FastAPI + Ollama 实战:搭一个能查天气的AI助手
python·ai·lora·torch·fastapi·web·model·ollama·weatherapi
用户60648767188961 天前
国内开发者如何接入 Claude API?中转站方案实战指南(Python/Node.js 完整示例)
人工智能·python·api
只与明月听1 天前
RAG深入学习之Chunk
前端·人工智能·python