@Author:By Runsen
@Date: 2019/07/26
作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件。导致翘课严重,专业排名中下。.在大学60%的时间,都在CSDN。
本专栏数据分析全系列:将使用Excel,Powerbi,Python,R,Sql,SPSS,stata以及Tableau,后面还会补充BI。这个从2020年期末考试,由于大三上大学挂了大学以来的两科化工原理和热力学。从此,决定逃离CSDN,但是发现我已经深深爱上了CSDN,这个我从大一奋斗到现在的地方。
没看上篇的先看上篇
statsmodels介绍
官网:http://www.statsmodels.org
statsmodels是一个Python模块,它提供对许多不同统计模型估计的类和函数,并且可以进行统计测试和统计数据的探索。
说实话,statsmodels这个词我总是记不住,但是国宝“熊猫”这个单词pandas我还是记得住的,它提供用于估计许多不同统计模型的类和函数,以及用于进行统计测试和统计数据探索。
如果安装导入出现了ImportError: cannot import name 'factorial’的问题。
安装scipy==1.2.0版本可以解决
(base) C:\Users\YIUYE>pip uninstall scipy
(base) C:\Users\YIUYE>pip install scipy==1.2.0
在statsmodels模块中主要有这么几个重要点
- 线性模型
- 方差分析
- 时间序列
1、线性模型
# 线性模型
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]
2、方差分析
方差分析(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
3、时间序列
时间序列,就是按时间顺序排列的,随时间变化的数据序列。
生活中各领域各行业太多时间序列的数据了,销售额,顾客数,访问量,股价,油价,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()