首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据科学篇| statsmodels库的使用(六)

数据科学篇| statsmodels库的使用(六)

作者头像
润森
发布2019-08-29 11:11:58
14.9K0
发布2019-08-29 11:11:58
举报
文章被收录于专栏:毛利学Python毛利学Python

statsmodels

官网:http://www.statsmodels.org

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

说实话,statsmodels这个词我总是记不住,但是国宝“熊猫”这个单词pandas我还是记得住的,它提供用于估计许多不同统计模型的类和函数,以及用于进行统计测试和统计数据探索。

在statsmodels模块中主要有这么几个重要点

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

线性模型

#  线性模型
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
X = sm.add_constant(x)
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
Model:                            OLS   Adj. 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]

方差分析

方差分析(Analysis of Variance,简称ANOVA),又称“变异数分析”,为数据分析中常见的统计模型,主要为探讨连续型(Continuous)因变量(Dependent variable)与类别型自变量(Independent variable)的关系。当自变量的因子等于或超过三个类别时,检验各类别平均值是否相等,采用方差分析。 anova_lm的方差模型,用于使用线性OLSModel进行ANOVA分析。

import statsmodels.api as sm
from statsmodels.formula.api import ols
moore = sm.datasets.get_rdataset("Moore", "car",
                                 cache=True) # load data
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

时间序列

时间序列,就是按时间顺序排列的,随时间变化的数据序列。 生活中各领域各行业太多时间序列的数据了,销售额,顾客数,访问量,股价,油价,GDP,气温。

# 回归移动平均线(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()

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小刘IT教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 线性模型
  • 方差分析
  • 时间序列
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档