Statsmodels是Python中一个强大的统计分析工具库,支持多种统计模型和数据分析方法。
以下是一些Statsmodels的用法示例,包括线性回归分析、时间序列分析等方面的应用:
一、线性回归分析
线性回归分析是研究自变量与因变量之间线性关系的统计方法。Statsmodels提供了普通最小二乘法(OLS)等线性模型的支持。
示例代码:
import pandas as pd
import statsmodels.api as sm
# 加载数据集,这里使用Statsmodels自带的mtcars数据集作为示例
data = sm.datasets.get_rdataset("mtcars").data
# 数据探索与预处理
print(data.info())
print(data.describe())
print(data.head())
# 定义自变量和因变量
X = data[['hp', 'wt']] # 自变量:马力和重量
y = data['mpg'] # 因变量:每加仑英里数
# 添加常数项,以拟合截距
X = sm.add_constant(X)
# 构建并拟合线性回归模型
model = sm.OLS(y, X).fit()
# 打印模型摘要
print(model.summary())
解释:
data.info():查看数据集的基本信息。
data.describe():查看数据集的统计描述。
data.head():查看数据集的前几行。
sm.add_constant(X):在自变量X中添加常数项,以拟合模型的截距。
sm.OLS(y, X).fit():构建并拟合普通最小二乘法(OLS)线性回归模型。
model.summary():打印模型的摘要,包括回归系数、标准误、t值、p值、R²等统计量。
二、时间序列分析
时间序列分析是研究时间序列数据的统计方法,Statsmodels提供了ADF检验、ARIMA模型等功能,可用于时间序列数据的预测和建模。
示例代码:
import pandas as pd
import numpy as np
import statsmodels.api as sm
# 构造时间序列数据
dates = pd.date_range('2020-01-01', periods=100)
data = pd.DataFrame(np.random.randn(100, 2), index=dates, columns=['A', 'B'])
# 进行时间序列分析,这里以ARIMA模型为例
model = sm.tsa.ARIMA(data['A'], order=(1, 1, 1)).fit()
# 打印模型预测结果
print(model.summary())
# 预测未来数据
forecast = model.forecast(steps=10)
print(forecast)
解释:
pd.date_range(‘2020-01-01’, periods=100):生成一个从2020-01-01开始、长度为100的日期范围。
pd.DataFrame(np.random.randn(100, 2), index=dates, columns=[‘A’, ‘B’]):生成一个包含100行、2列的随机数据框,并将其索引设置为日期范围。
sm.tsa.ARIMA(data[‘A’], order=(1, 1, 1)).fit():构建并拟合ARIMA模型,其中order=(1, 1, 1)表示自回归项、差分次数和移动平均项的阶数均为1。
model.summary():打印模型的摘要,包括模型参数、统计量等。
model.forecast(steps=10):预测未来10个时间点的数据。
三、回归诊断
回归诊断是对回归模型进行评估和检验的过程,Statsmodels提供了多种回归诊断工具,如残差的正态性检验、自相关检验、影响力测试等。
示例代码(部分):
import statsmodels.stats.api as sms
import matplotlib.pyplot as plt
from statsmodels.graphics.regressionplots import plot_leverage_resid2
from statsmodels.stats.outliers_influence import OLSInfluence
# 假设已经拟合了一个回归模型,并存储在results变量中
# ...(省略模型拟合代码)
# 残差的正态性检验
jb_test = sms.jarque_bera(results.resid)
print('Jarque-Bera Test:', jb_test)
# 自相关检验
dw_test = sms.durbin_watson(results.resid)
print('Durbin-Watson Test:', dw_test)
# 影响力测试
influence_test = OLSInfluence(results)
dfbetas = influence_test.dfbetas
print('DFBETAS:', dfbetas)
# 绘制杠杆值-残差图
fig, ax = plt.subplots(figsize=(8, 6))
fig = plot_leverage_resid2(results, ax=ax)
plt.show()
解释:
sms.jarque_bera(results.resid):进行Jarque-Bera检验,以判断残差是否服从正态分布。
sms.durbin_watson(results.resid):进行Durbin-Watson检验,以判断残差是否存在自相关。
OLSInfluence(results):创建OLSInfluence对象,用于进行影响力测试。
influence_test.dfbetas:计算DFBETAS统计量,用于评估每个观测值对回归系数的影响。
plot_leverage_resid2(results, ax=ax):绘制杠杆值-残差图,以可视化观测值对回归模型的影响。
以上仅为Statsmodels的部分用法示例,Statsmodels还支持更多复杂的统计模型和数据分析方法,用户可以根据实际需求进行选择和应用。