Statsmodels的发行版中有很多的范例数据集。可以在https://github.com/statsmodels/statsmodels/tree/master/statsmodels/datasets找到这些数据集的完整列表。
本章我们将聚焦copper数据集,其中包含的信息有:铜价、全球铜消费量和其他参数。
准备工作
你可能需要先安装patsy。判断是否需要安装patsy很容易,只需运行一下本攻略的完整代码。如果得到的运行结果是和pasty有关的错误信息,则需要执行如下两条命令之一。
sudo easy_install patsy
pip install --upgrade patsy
具体步骤
在本节中,你将看到怎样从statsmodels加载数据集到Pandas的DataFrame
对象或Series
对象。
- 加载数据。
需要调用的函数是load_pandas
。用如下语句加载数据。
data = statsmodels.api.datasets.copper.load_pandas()
这将生成一个DataSet
对象,数据被加载到了该对象包含的pandas
对象中。
- 拟合数据。
对于数据以pandas
对象加载的情况,使用Dataset
对象的exog
属性,可以获得一个多列的DataFrame
对象。此外对于本例的情况,DataSet
对象的endog
属性包含了全球铜消费量的数据。
采用最小二乘拟合,创建一个OLS
(ordinary least squares)对象,并调用其fit
方法。
x, y = data.exog, data.endog
fit = statsmodels.api.OLS(y, x).fit()
print "Fit params", fit.params
打印出拟合的参数,如下所示。
Fit params COPPERPRICE 14.222028
INCOMEINDEX 1693.166242
ALUMPRICE -60.638117
INVENTORYINDEX 2515.374903
TIME 183.193035
- 汇总结果。
使用summary
方法,对最小二乘拟合的结果进行汇总,如下所示。
print fit.summary()
打印出回归分析的结果。
OLS Regression Results
==============================================================================
Dep. Variable: WORLDCONSUMPTION R-squared: 0.978
Model: OLS Adj. R-squared: 0.974
Method: Least Squares F-statistic: 224.9
Date: Thu, 18 Jul 2013 Prob (F-statistic): 2.55e-16
Time: 15:36:44 Log-Likelihood: -172.62
No. Observations: 25 AIC: 355.2
Df Residuals: 20 BIC: 361.3
Df Model: 4
==================================================================================
coef std err t P>|t| [95.0% Conf. Int.]
----------------------------------------------------------------------------------
COPPERPRICE 14.2220 12.090 1.176 0.253 -10.998 39.442
INCOMEINDEX 1693.1662 1970.555 0.859 0.400 -2417.339 5803.671
ALUMPRICE -60.6381 32.023 -1.894 0.073 -127.437 6.161
INVENTORYINDEX 2515.3749 1670.948 1.505 0.148 -970.162 6000.912
TIME 183.1930 36.879 4.967 0.000 106.264 260.122
==============================================================================
Omnibus: 8.007 Durbin-Watson: 1.316
Prob(Omnibus): 0.018 Jarque-Bera (JB): 6.014
Skew: -0.936 Prob(JB): 0.0494
Kurtosis: 4.506 Cond. No. 2.20e+03
==============================================================================
The condition number is large, 2.2e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
加载copper数据集的完整代码如下。
import statsmodels.api
# 请见https://github.com/statsmodels/statsmodels/tree/master/statsmodels/datasets
data = statsmodels.api.datasets.copper.load_pandas()
x, y = data.exog, data.endog
fit = statsmodels.api.OLS(y, x).fit()
print "Fit params", fit.params
print
print "Summary"
print
print fit.summary()
攻略小结
statsmodels中的Dataset
类采用了特殊的数据存储格式,这其中就包括了endog
和exog
属性。statsmodels中有一个load
函数,用来把数据加载到NumPy数组中。而本攻略选用的load_pandas
方法,则是用来把数据加载到pandas
对象中。我们对这些数据做了最小二乘拟合,得到了铜价和消费量之间关系的统计模型。