# 数据科学篇| statsmodels库的使用（六）

statsmodels

statsmodels是一个Python模块，它提供对许多不同统计模型估计的类和函数，并且可以进行统计测试和统计数据的探索。

• 线性模型
• 方差分析
• 时间序列

### 线性模型

```#  线性模型
import statsmodels.api as sm
import numpy as np
x = np.linspace(0,10,100)
y = 3*x + np.random.randn()+ 10
# Fit and summarize OLS model
mod = sm.OLS(y,X)
result = mod.fit()
print(result.params)
print(result.summary())
```
```[9.65615842 3.        ]
OLS Regression Results
==============================================================================
Dep. Variable:                      y   R-squared:                       1.000
Method:                 Least Squares   F-statistic:                 7.546e+31
Date:                Thu, 25 Jul 2019   Prob (F-statistic):               0.00
Time:                        21:10:18   Log-Likelihood:                 3082.0
No. Observations:                 100   AIC:                            -6160.
Df Residuals:                      98   BIC:                            -6155.
Df Model:                           1
Covariance Type:            nonrobust
==============================================================================
coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const          9.6562      2e-15   4.83e+15      0.000       9.656       9.656
x1             3.0000   3.45e-16   8.69e+15      0.000       3.000       3.000
==============================================================================
Omnibus:                        4.067   Durbin-Watson:                   0.161
Prob(Omnibus):                  0.131   Jarque-Bera (JB):                4.001
Skew:                           0.446   Prob(JB):                        0.135
Kurtosis:                       2.593   Cond. No.                         11.7
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
```
```print(y[:5])
# 预测数据
print(result.predict(X[:5]))
```
```[ 9.65615842  9.95918872 10.26221902 10.56524933 10.86827963]
[ 9.65615842  9.95918872 10.26221902 10.56524933 10.86827963]
```

### 方差分析

```import statsmodels.api as sm
from statsmodels.formula.api import ols
moore = sm.datasets.get_rdataset("Moore", "car",
data = moore.data
data = data.rename(columns={"partner.status":
"partner_status"}) # make name pythonic
moore_lm = ols('conformity ~ C(fcategory, Sum)*C(partner_status, Sum)',
data=data).fit()
table = sm.stats.anova_lm(moore_lm, typ=2) # Type 2 ANOVA DataFrame
print(table)
```
```                                              sum_sq    df          F    PR(>F)
C(fcategory, Sum)                          11.614700   2.0   0.276958  0.759564
C(partner_status, Sum)                    212.213778   1.0  10.120692  0.002874
C(fcategory, Sum):C(partner_status, Sum)  175.488928   2.0   4.184623  0.022572
Residual                                  817.763961  39.0        NaN       NaN
```

### 时间序列

```# 回归移动平均线（ARMA）
import pandas as pd
import statsmodels.api as sm
from statsmodels.tsa.arima_model import ARMA
import matplotlib.pyplot as plt
import warnings
%matplotlib inline
# 过滤warning
warnings.filterwarnings('ignore')

# 创建数据，每一个数据对应到一个年份
data = [5922, 5308, 5546, 5975, 2704, 1767, 4111, 5542, 4726, 5866, 6183, 3199, 1471, 1325, 6618, 6644, 5337, 7064, 2912, 1456, 4705, 4579, 4990, 4331, 4481, 1813, 1258, 4383, 5451, 5169, 5362, 6259, 3743, 2268, 5397, 5821, 6115, 6631, 6474, 4134, 2728, 5753, 7130, 7860, 6991, 7499, 5301, 2808, 6755, 6658, 7644, 6472, 8680, 6366, 5252, 8223, 8181, 10548, 11823, 14640, 9873, 6613, 14415, 13204, 14982, 9690, 10693, 8276, 4519, 7865, 8137, 10022, 7646, 8749, 5246, 4736, 9705, 7501, 9587, 10078, 9732, 6986, 4385, 8451, 9815, 10894, 10287, 9666, 6072, 5418]

# 转化成series格式 index values
data=pd.Series(data)

# sm.tsa.datetools.dates_from_range 转换日期字符串序列并返回日期时间列表(返回格式为列表)。参数 开始(str:1901) 结束(str:1990) 长度(None)
data_index=sm.tsa.datetools.dates_from_range('1901','1990')
# 返回的 datetime.datetime(1901, 12, 31, 0, 0) 表示1901年12月31号0点0分
# print(data_index)

# 从series对象中找到某元素（行）对应的索引,将pd.Index(data_index)设置为data的index
# print(pd.Index(data_index))
data.index=pd.Index(data_index)
# print(data)

# 绘制数据图
data.plot(figsize=(12,8))
plt.show()

# 创建ARMA模型,(7,0) 代表 (p,q) 的阶数。
arma=ARMA(data,(7,0)).fit()
# AIC 准则，也叫作赤池消息准则，它是衡量统计模型拟合好坏的一个标准，数值越小代表模型拟合得越好。
# print('AIC: %0.4lf'%arma.aic)

# 模型预测,预测1990-2000年的走势
predicted=arma.predict('1990','2000')

# 预测结果绘图
fig, ax = plt.subplots(figsize=(12, 8))
# ax = ax表示在ax这个子图上画图形
ax = data.ix['1901':].plot(ax=ax)
# 同理在ax这个子图上画图
predicted.plot(ax=ax)
plt.show()

# 还不清楚的话可以借鉴这段被注释的代码
# fig,(ax1,ax2)=plt.subplots(2,1,figsize=(12,9))
# ax1=data.ix['1901':].plot(ax=ax1)
# predicted.plot(ax=ax1)
# plt.show()
```

0 条评论

• ### Python北京空气质量数据处理

这是我接单的一个单，看了数据源，马发现很有印象，马上就知道来源kaggle中国北京上海广州成都，沈阳的Pm2.5数据集，对应的链接：https://www.ka...

• ### 机器学习认识聚类（KMeans算法）

导读：机器是怎样学习的，都学到了什么？人类又是怎样教会机器学习的？本文通过案例给你讲清楚各类算法的原理和应用。

• ### 自从我会了Python中的PIL，发现了其实超级简单

PIL全称是Python Image Library，顾名思义，是用来做图像处理的。

• ### :before 和 :after的多用途实践 — 特效篇（1）

讲了一些，:before和:after的知识，但是用他们去做页面内容的美化并没有太多，我们知道CSS控制网页内容的外观，CSS的意义就是实现将内容与表现形式...

• ### 手把手搭建一个聊天机器人（二）

这里，我们要去网上申请一个API，我们使用的是图灵聊天机器人。，网址是：http://www.tuling123.com/申请步骤就不说了，如果不会...

版权声明：本文为博主原创文章，转载请注明出处。 https://blog.csdn.net/...

• ### [Python3 开发技巧]·如何打乱字典中多个对应数组

当我们把数个对应数组保存到字典中，在我们读取的时候这些数据会按照我们保存的顺序读取出来。如果我们需要打乱顺序，但不改变对应数组的关系时，例如原先位置0对应的各个...

• ### py-ops面向编程的关键字测试框架

这是一款基于pytest封装，同时支持关键字和BDD，测试数据分离，面向编程，轻量级的，对上层自动化应用友好的基础测试框架。