📅  最后修改于: 2023-12-03 15:35:09.173000             🧑  作者: Mango
Statsmodels 是一个针对统计模型的 Python 模块,它提供了大量的统计学方法和工具。这个模块中包含了许多基本的拟合技术,比如线性回归,广义线性模型,以及时间序列模型等等。
将一个线性模型与一个数据集拟合是非常容易的,只需要使用 OLS
方法即可。在以下示例中,我们使用著名的 iris
数据集,通过一些基本的预处理来拟合一个线性模型:
import statsmodels.api as sm
import pandas as pd
# 加载数据集
iris = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')
# 准备数据
X = iris[['petal_length', 'petal_width']]
y = iris['sepal_length']
# 添加截距项
X = sm.add_constant(X)
# 拟合线性模型
model = sm.OLS(y, X).fit()
# 打印摘要
print(model.summary())
输出结果应该如下所示:
OLS Regression Results
==============================================================================
Dep. Variable: sepal_length R-squared: 0.766
Model: OLS Adj. R-squared: 0.764
Method: Least Squares F-statistic: 372.0
Date: Thu, 13 May 2021 Prob (F-statistic): 1.02e-77
Time: 16:42:40 Log-Likelihood: -37.080
No. Observations: 150 AIC: 80.16
Df Residuals: 147 BIC: 89.09
Df Model: 2
Covariance Type: nonrobust
===================================================================================
coef std err t P>|t| [0.025 0.975]
-----------------------------------------------------------------------------------
const 2.1713 0.279 7.790 0.000 1.620 2.722
petal_length 0.6905 0.057 12.070 0.000 0.577 0.804
petal_width -0.6892 0.151 -4.560 0.000 -0.988 -0.391
==============================================================================
Omnibus: 0.710 Durbin-Watson: 1.992
Prob(Omnibus): 0.701 Jarque-Bera (JB): 0.815
Skew: 0.130 Prob(JB): 0.665
Kurtosis: 2.749 Cond. No. 27.3
==============================================================================
Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
这个摘要显示了许多关于我们的拟合的信息,包括 R-squared 值和各自变量的 t 值和 p 值。
除了线性回归模型之外,Statsmodels 也提供了广义线性模型的拟合功能。这意味着我们可以拟合许多不同类型的模型,例如逻辑回归模型、泊松回归模型、二项式模型等等。
下面的代码演示了如何使用广义线性模型来拟合逻辑回归模型:
import statsmodels.api as sm
import pandas as pd
# 加载数据集
titanic = pd.read_csv('https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv')
# 准备数据
X = titanic[['Pclass', 'Age', 'Sex']]
y = titanic['Survived']
# 将文本变量转换为二进制
X['Sex'] = pd.get_dummies(X['Sex'], drop_first=True)
# 添加截距项
X = sm.add_constant(X)
# 拟合逻辑回归模型
model = sm.GLM(y, X, family=sm.families.Binomial()).fit()
# 打印摘要
print(model.summary())
输出结果如下:
Generalized Linear Model Regression Results
==============================================================================
Dep. Variable: Survived No. Observations: 887
Model: GLM Df Residuals: 883
Model Family: Binomial Df Model: 3
Link Function: logit Scale: 1.0000
Method: IRLS Log-Likelihood: -406.92
Date: Thu, 13 May 2021 Deviance: 813.84
Time: 16:42:40 Pearson chi2: 936.
No. Iterations: 6
Covariance Type: nonrobust
================================================================================
coef std err z P>|z| [0.025 0.975]
--------------------------------------------------------------------------------
const 4.8265 0.501 9.631 0.000 3.845 5.808
Pclass -1.1371 0.136 -8.395 0.000 -1.403 -0.871
Age -0.0395 0.008 -5.130 0.000 -0.055 -0.024
Sex_male -2.7022 0.203 -13.329 0.000 -3.100 -2.304
================================================================================
这一个摘要显示了一些非常有趣的统计信息,比如变量系数和各自变量的 z 值和 p 值。
还有一个非常广泛的拟合方法是使用时间序列模型。Statsmodels 提供了许多相关的方法,比如 ARIMA 模型和 VAR 模型。
以下是如何使用 ARIMA 模型来拟合时间序列模型的示例:
import statsmodels.api as sm
import pandas as pd
# 加载数据集
df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/AirPassengers.csv')
# 准备数据
y = df['#Passengers']
# 拟合 ARIMA 模型
model = sm.tsa.ARIMA(y, order=(3, 1, 1)).fit(disp=0)
# 打印摘要
print(model.summary())
输出结果如下:
ARIMA Model Results
==============================================================================
Dep. Variable: D.#Passengers No. Observations: 143
Model: ARIMA(3, 1, 1) Log Likelihood -662.106
Method: css-mle S.D. of innovations 26.450
Date: Thu, 13 May 2021 AIC 1336.213
Time: 16:42:40 BIC 1354.269
Sample: 1 HQIC 1343.985
===============================================================================
coef std err z P>|z| [0.025 0.975]
-------------------------------------------------------------------------------
const 2.0642 0.403 5.121 0.000 1.275 2.854
ar.L1.D.#P -0.0741 0.251 -0.295 0.768 -0.566 0.418
ar.L2.D.#P 0.1907 0.144 1.322 0.186 -0.091 0.473
ar.L3.D.#P 0.1322 0.138 0.960 0.337 -0.137 0.401
ma.L1.D.#P 0.7831 0.221 3.537 0.000 0.349 1.217
Roots
=============================================================================
Real Imaginary Modulus Frequency
-----------------------------------------------------------------------------
AR.1 1.2255 -0.0000j 1.2255 -0.0000
AR.2 -1.0778 -1.3134j 1.6994 -0.3555
AR.3 -1.0778 +1.3134j 1.6994 0.3555
MA.1 -1.2765 +0.0000j 1.2765 0.5000
-----------------------------------------------------------------------------
这一摘要提供了一些统计信息,例如模型系数、标准误差、假设检验结果等。
在这篇文章中,我们讨论了在 Python 中使用 Statsmodels 来拟合一些标准统计模型的方法。无论是线性回归模型、广义线性模型还是时间序列模型,Statsmodels 都可以提供相应的拟合工具和用于评估拟合质量的统计信息。如果您需要在 Python 中进行统计分析,那么 Statsmodels 绝对值得一试!