看懂python3 之statsmodels包summary的参数解释

放上代码例子:

# -*-coding:utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import time, datetime
import statsmodels.api as sm

df = pd.read_csv('D:\work\数据分析\换师次数学生状态关系\全部学员课消状态表.csv',encoding='gbk')
# data = df.ix[:, ['student_id','累计课消','学生状态']]
data=list(df['累计课消'])
data0 = df[df['学生状态'] == 0]
data1 = df[(df['学生状态'] == 1)]
data2 = df[df['学生状态'] == 2]
data3 = df[df['学生状态'] == 3]
data4 = df[df['学生状态'] == 4]

data_0 = list(data0['累计课消'])
data_1 = list(data1['累计课消'])
data_2 = list(data2['累计课消'])
data_3 = list(data3['累计课消'])
data_4 = list(data4['累计课消'])

list_bin=list(np.arange(3,255,3))

def count_y(object):
    list_count = [0 for i in range(84)]
    out_range_count=[]
    for i in list_bin:
        for k in object:
            if k < i and k >= i-3:
                bin_index=list_bin.index(i)
                list_count[bin_index] += 1
    for k in object:
        if k >= 252:
            list_count[-1] += 1
    list_array = np.array(list_count)
    return list_array

y = count_y(data)

refund=pd.Series(y_5/y)
class_fire=pd.Series(list_bin)
X = sm.add_constant(class_fire)
est=sm.OLS(refund,X).fit()
est.summary()

输出:

在这里插入图片描述

参数解释

左边:(模型背景描述)
Dep.Variable: 输出变量的名称
Model :模型名称
Method: 方法 其中 Least Squares 表示最小二乘法
Date: 日期
Time: 时间
No.Observations: 样本数目
Df Residuals : 残差自由度 (观测数No.Observations - (参数数目Df Model+1常数))
–残差代表的是实际观察值与估计值的差
Df Model: 模型参数个数,相当于输入的X的元素个数

右边:(模型质量描述)(需要参考判断的数据)
R- squared : 可决系数,用来判断估计的准确性,范围在 [0,1] 约接近1 ,说明对y的解释能力越强,拟合越好

在这里插入图片描述

Adj-R- squared: 通过样本数量与模型数量对R-squared进行修正,奥卡姆剃刀原理,避免描述冗杂

(
在这里插入图片描述

F-statistic : 衡量拟合的显著性, 重要程度。模型的均方误差除以残差的均方误差,值越大,H0 越不可能

Prob(F-statistic): 当prob(F-statistic)<α时,表示拒绝原假设,即认为模型是显著的;
当prob(F-statistic)>α时,表示接受原假设,即认为模型不是显著的

Log likelihood (对数似然比LLR) :(很多说法是值越大,说明模型拟合的较好)(但有待考察,似然比服从统计量,大于卡方临界值拒绝原假设), 似然:
在这里插入图片描述
相当于概率:
在这里插入图片描述
通过最大似然估计参数的选取的拟合性
(Davidson 与MacKinnon(1993)年说:对于线性回归模型,不管它误差是不是正态分布,都不需要过问LM,W,LLR,因为这些信息已被F检验所含有)

AIC: AIC可以表示为: AIC=2k-2ln(L) 其中:k是参数的数量,L是似然函数。 衡量拟合优良性,选择AIC 最小的模型, 引入了惩罚项,避免参数过多,过拟合
在这里插入图片描述
BIC: 贝叶斯信息准则 BIC=kln(n)-2ln(L) ,BIC相比AIC在大数据量时对模型参数惩罚得更多,导致BIC更倾向于选择参数少的简单模型。

下半部分:(模型描述)
coef: 系数 const表示常数项
std err :系数估计的基本标准误差
t : t 统计值,衡量系数统计显著程度的指标
P>|t| : 系数= 0的零假设为真的P值。如果它小于置信水平,通常为0.05,则表明该术语与响应之间存在统计上显着的关系。度的指标
[0.025,0.975]: 95%置信区间的下限和上限值

Omnibus :属于一种统计测验,测试一组数据中已解释方差是否显著大于未解释方差,但omnibus不显著,模型也可能存在合法的显著影响, 比如两个变量中有一个不显著,即便另一个显著.通常用于对比
Prob(Omnibus):将上面的统计数据变成概率

Durbin-Watson : 残差是否符合正态分布,在2左右说明是服从正态分布的,偏离2太远,解释能力受影响
是否自相关, 受到前后影响 ,与表中上限进行比较,如果D>上限 不存在相关性 .
D<下限 存在正相关性,在上下限之间,无法得出结论
Skewness: 偏度, 关于平均值的数据对称性的度量。正态分布误差应是关于平均值对称的分布。
Kurtosis: 峰度, 分布形状的量度,比较接近均值与远离均值的数据量 如果大于三,说明峰的形状比较陡峭,形状较尖
正态分布的峰度(系数)为常数3,均匀分布的峰度(系数)为常数1.8
Jarque-Bera(JB) : Jarque–Bera检验是对样本数据是否具有符合正态分布的偏度和峰度的拟合优度的检验。
其统计测试结果总是非负的。如果结果远大于零,则表示数据不具有正态分布。

Prob(JB): 上面统计量的概率形式

Cond. No :多重共线性测试(如果多个参数,这些参数是否相互关联)

优化这段代码import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.stattools import adfuller from statsmodels.stats.diagnostic import acorr_ljungbox from arch import arch_model from pmdarima.arima import auto_arima # 读取Excel数据 data = pd.read_excel(&#39;三个-负向标准化-二分.xlsx&#39;) data2 = pd.read_excel # 将数据转换为时间序列 data[&#39;DATE&#39;] = pd.to_datetime(data[&#39;DATE&#39;]) # data.set_index(&#39;DATE&#39;, inplace=True) data = data[&#39;F4&#39;] # ADF检验 ADFresult = adfuller(data) print(&#39;ADF Statistic: %f&#39; % ADFresult[0]) print(&#39;p-value: %f&#39; % ADFresult[1]) if ADFresult[1] > 0.05: # 进行差分 diff_data = data.diff().dropna() # 再次进行ADF检验 AADFresult = adfuller(diff_data) print(&#39;ADF Statistic after differencing: %f&#39; % AADFresult[0]) print(&#39;p-value after differencing: %f&#39; % AADFresult[1]) data = diff_data # Ljung-Box检验 # result = acorr_ljungbox(data, lags=10) # print(&#39;Ljung-Box Statistics: &#39;, result[0]) # print(&#39;p-values: &#39;, result[1]) # 使用auto_arima函数选择最佳ARIMA模型 stepwise_model = auto_arima(data, start_p=0, start_q=0, max_p=15, max_q=15, start_P=0, seasonal=False, d=1, D=1, trace=True, error_action=&#39;ignore&#39;, suppress_warnings=True, stepwise=True) model_resid = stepwise_model.resid() print(stepwise_model.summary()) # 计算ARIMA-GARCH组合模型的参数 model = arch_model(model_resid, mean=&#39;AR&#39;, lags=2, vol=&#39;GARCH&#39;, p=1, o=0, q=1) AGresult = model.fit(disp=&#39;off&#39;) print(AGresult.summary())
05-30
这段代码已经比较简洁,但是以下是我觉得可以进一步优化的地方: 1. 将函数封装:可以将AD检验、差分、Ljung-Box检验、选择最佳ARIMA模型和计算ARIMA-GARCH组合模型的参数这些操作封装成函数,这样可以提高代码的复用性和可读性。 2. 使用变量名:变量名应该是有意义的,这样可以提高代码的可读性。例如,可以将data改为ts_data,AADFresult改为diff_ADF_result等。 3. 移除注释:注释是很有用的,但是在代码中过多的注释会让代码难以看懂。移除一些不必要的注释可以提高代码的可读性。 4. 只保留需要的模块:在这段代码中,虽然导入了许多模块,但是实际上只使用了其中的一部分。可以只导入需要的模块,避免浪费资源。 优化后的代码如下: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.stattools import adfuller from arch import arch_model from pmdarima.arima import auto_arima def adf_test(data): """进行ADF检验""" result = adfuller(data) print(&#39;ADF Statistic: %f&#39; % result[0]) print(&#39;p-value: %f&#39; % result[1]) if result[1] > 0.05: # 进行差分 diff_data = data.diff().dropna() # 再次进行ADF检验 diff_ADF_result = adfuller(diff_data) print(&#39;ADF Statistic after differencing: %f&#39; % diff_ADF_result[0]) print(&#39;p-value after differencing: %f&#39; % diff_ADF_result[1]) data = diff_data return data def arima_model(data): """使用auto_arima函数选择最佳ARIMA模型""" stepwise_model = auto_arima(data, start_p=0, start_q=0, max_p=15, max_q=15, start_P=0, seasonal=False, d=1, D=1, trace=True, error_action=&#39;ignore&#39;, suppress_warnings=True, stepwise=True) print(stepwise_model.summary()) return stepwise_model def garch_model(data): """计算ARIMA-GARCH组合模型的参数""" model_resid = arima_model(data).resid() model = arch_model(model_resid, mean=&#39;AR&#39;, lags=2, vol=&#39;GARCH&#39;, p=1, o=0, q=1) result = model.fit(disp=&#39;off&#39;) print(result.summary()) if __name__ == &#39;__main__&#39;: # 读取Excel数据 ts_data = pd.read_excel(&#39;三个-负向标准化-二分.xlsx&#39;, usecols=[&#39;DATE&#39;, &#39;F4&#39;]) # 将数据转换为时间序列 ts_data[&#39;DATE&#39;] = pd.to_datetime(ts_data[&#39;DATE&#39;]) ts_data.set_index(&#39;DATE&#39;, inplace=True) # ADF检验 ts_data = adf_test(ts_data) # 计算ARIMA-GARCH组合模型的参数 garch_model(ts_data) ``` 优化后的代码更加简洁明了,同时也提高了可读性和可维护性。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值