基于ARIMA的考研国家线预测 使用Python语言
本文使用Python语言编写ARIMA算法,实现对2023年mba考研国家线进行预测。
ARIMA简介
ARIMA可以实现对单变量时间序列数据的预测,适合对小样本数据(n<30)进行短期预测,是基于统计学的原理。本文不关心具体的数学逻辑,只研究怎么实现。
ARIMA建模流程
- 加载数据,并对数据进行平稳性与白噪声检验,通过则计算模型参数d,并进行下一步,
- 使用AIC准则计算模型参数p,q,再进行下一步。
- 对ARIMA(p,d,q)进行残差检验,检验通过则进行下一步。
- 对未来进行预测。
程序流程
- 获取数据,搜寻2012年到2022年10年mba国家线数据,放到一个excel中,进行备用,之后用python进行读取。
df = pd.read_excel('mba分数线.xlsx', usecols = [0,1]) # 读取excel的前两列,分别是年份和对应的分数线
df = df.sort_values('年份') # 按年份对数据进行排序,从小到大排
df = df.set_index(['年份']) # 将年份设置成索引列
df #显示df结果,df = dataframe,一种数据格式,可以认为是一个表格
结果:
- 对数据进行平稳性与白噪声检验:
结果:d0 = df d1 = d0.diff(1) d2 = d1.diff(1) d3 = d2.diff(1) print('\n原始数据平稳性检验:\n',ADF(d0.dropna())) print('\n一阶差分平稳性检验:\n',ADF(d1.dropna())) print('\n原始数据白噪声检验:\n',acorr_ljungbox(d0.dropna(),lags = 5)) print('\n一阶差分白噪声检验:\n',acorr_ljungbox(d1.dropna(),lags = 5))
在这里的查看方式是查看平稳性检验P-value的值与白噪声检验lb_pvalue的值,存在都小于0.05就算通过检验,所以在本文就是1阶差分平稳,ARIMA(p,d,q)的参数d = 1。 - 确定参数(p,q)
可以使用AIC准则与BIC准则确定(p,q),其中AIC适合小样本数据。
结果:'''计算(p,q)参数''' d = d1 # 因为是1阶差分稳定,所在在这里是一阶差分数据源 trend_evaluate = sm.tsa.arma_order_select_ic(d, ic=['aic', 'bic','hqic'], trend='n', max_ar=4, max_ma=2) # 计算AIC print('trend AIC', trend_evaluate.aic_min_order) print('trend BIC', trend_evaluate.bic_min_order) print('trend HQIC', trend_evaluate.hqic_min_order)
在这里我门使用AIC的结果,因此(p,q)= (4,0)加上上面算的参数d = 1,因此ARIMA的参数(p,d,q)为(4,1,0)trend AIC (4, 0) trend BIC (4, 0) trend HQIC (4, 0)
4.对ARIMA(4,1,0)进行检验,判断模型是否可用
# 带入模型
order=(0,1,1)
model = ARIMA(d0, order=order).fit()
resid=model.resid # 残差检验
model.plot_diagnostics()
plt.show()
print('D-W检验的结果为:',sm.stats.durbin_watson(resid.values)) # DW检验
print('残差序列的白噪声检验结果为:\n',acorr_ljungbox(resid)) # LB检验
结果:
查看参看检验图,KDE曲线与N(0,1)曲线近似重合,QQ图散点近似在一条直线上,模型拟合结果较好。
- 结果预测
forecast = model.forecast(3, index = [2023,2024,2025], dynamic=True) print('分数线:') forecast
结果:
2022年度分数线为170,经计算2023年的分数线为177分。