运维开发网

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

运维开发网 https://www.qedev.com 2021-03-05 09:08 出处:51CTO 作者:mb5ffd6eef9281a
statsmodels官网:http://www.statsmodels.orgstatsmodels是一个Python模块,它提供对许多不同统计模型估计的类和函数,并且可以进行统计测试和统计数据的探索。说实话,statsmodels这个词我总是记不住,但是国宝“熊猫”这个单词pandas我还是记得住的,它提供用于估计许多不同统计模型的类和函数,以及用于进行统计测试和统计数据探索。在statsmo

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

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()

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

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

■ Over ■

最后,祝有所学习,有所成长

回复【1024】获取学习资料

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

转发,好看支持一下,感谢

你的转发,就是对我最大的支持

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号