**本文将介绍使用Python来完成时间序列分析ARIMA模型的完整步骤与流程,绘制时序图,平稳性检验,单位根检验,白噪声检验,模型定阶,参数估计,模型检验等完整步骤。Python建立时间序列分析–ARIMA模型实战案例时间序列指的是将带有同一指标单位的数值按照产生时间的先后顺序排成的数列,对时间序列分析的主要目的是对目前已有的数据对未来进行预测。本文将使用将差分移动自回归模型(ARIMA)来对中国区域CH4浓度未来变化趋势做预测。
步骤:
(1) 首先判断时间序列数据是否平稳,若平稳,则进行下一步,若不平稳,就通
过差分处理将序列变为平稳,为保证数据的准确性,差分次数应该不超过2。
(2) 判断时间序列是否是白噪声序列,如果是白噪声序列,那么该不序列并不适合ARIMA 模型分析,若不是,则进行下一步。
(3) 模型定阶,通过自相关函数 ACF 和偏自相关函数 PACF 来决定模型的阶数
P、Q,也可以通过Bayesian Information Criterion(贝叶斯信息量BIC)准则来确定。
(4) 建模并进行残差分析和白噪声检验。
(5) 对时间序列数据使用训练完成的 ARIMA 模型进行预测,并对差分的数据进
行还原。
参考文章:
https://blog.csdn.net/qq_45176548/article/details/111504846#comments_14302892
https://blog.csdn.net/weixin_41013322/article/details/111221251
https://blog.csdn.net/u010414589/article/details/49622625
import decimal
import sys
import os
import statsmodels
from math import sqrt
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score
import warnings
import seaborn as sns
import matplotlib as matplotlib
import math
import matplotlib
from keras.losses import mean_squared_error, mean_absolute_error
from pasta.augment import inline
from sklearn.metrics import r2_score
import matplotlib.pyplot as plt
warnings.filterwarnings("ignore")
import pandas as pd
import numpy as np
from arch.unitroot import ADF
import matplotlib.pylab as plt
# %matplotlib inline
from matplotlib.pylab import style
style.use('ggplot')
import statsmodels.api as sm
import statsmodels.formula.api as smf
import statsmodels.tsa.api as smt
from statsmodels.tsa.stattools import adfuller
from statsmodels.stats.diagnostic import acorr_ljungbox
from statsmodels.graphics.api import qqplot
pd.set_option('display.float_format', lambda x: '%.5f' % x)
np.set_printoptions(precision=5, suppress=True)
"""中文显示问题"""
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
pd.set_option('display.width', 10000)
data = pd.read_csv('LSTM-01.csv',parse_dates=True)
dc=data["ch4"]
data1 = data["ch4"].diff(1)
data1.dropna(inplace=True)
print(data.head())
print("原始单位根检验:\n")
print(ADF(data["ch4"].dropna())) #原始
data["diff1"] = data["ch4"].diff(1).dropna()
print("一阶单位根检验:\n")
print(ADF(data.diff1.dropna())) #一阶
from statsmodels.stats.diagnostic import acorr_ljungbox
lb=acorr_ljungbox(data["ch4"].diff(1).dropna(), lags = [i for i in range(1,12)],boxpierce=True)
print("白噪声检验")
print(lb)
建立 ARIMA 模型首先要确定模型阶数,也就是要确定(P,D,Q)的值,在前一步已经确定差分次数为 1,所以 D 的值为 1。为找到适合模型的最佳阶数 P,Q 的值,将通过BIC 信息准则来进行判断。
data1为一阶差分的序列
train_results = sm.tsa.arma_order_select_ic(data1, ic=['aic', 'bic'], max_ar=4, max_ma=4)
print('AIC', train_results.aic_min_order)
print('BIC', train_results.bic_min_order)
首先观察连续残差是否(自)相关,进行D-W检验。求得DW的值为#1.0077473271396427说明不存在自相关性。
print('dwwwwwwwwwwww的值为')
print(sm.stats.durbin_watson(result.resid.values))
Ljung-Box test是对randomness的检验,或者说是对时间序列是否存在滞后相关的一种统计检验。对于滞后相关的检验,我们常常采用的方法还包括计算ACF和PCAF并观察其图像,但是无论是ACF还是PACF都仅仅考虑是否存在某一特定滞后阶数的相关。LB检验则是基于一系列滞后阶数,判断序列总体的相关性或者说随机性是否存在。
时间序列中一个最基本的模型就是高斯白噪声序列。而对于ARIMA模型,其残差被假定为高斯白噪声序列,所以当我们用ARIMA模型去拟合数据时,拟合后我们要对残差的估计序列进行LB检验,判断其是否是高斯白噪声,如果不是,那么就说明ARIMA模型也许并不是一个适合样本的模型。
r,q,p = sm.tsa.acf(resid.values.squeeze(), qstat=True)
print(r[1:])
print('---------')
print(q)
print('-------p值为--')
print(p)
print('ssssss')
统计量的 P 值大于 0.05 的显著性水平,通过了显著性检验,结果说明 ARIMA(3,1,2),模型的残差序列为白噪声序列,模型显著有效
model1 = sm.tsa.ARIMA(data1, order=(3, 1, 2)) # 传入参数,构建并拟合模型
result=model1.fit()
predict_data = result.predict(0, 227) # 预测数据
print('预测数据')
print(predict_data)
forecast_data = result.forecast(200) # 预测未来数据
```bash
绘制图像
plt.plot(dc, label='原数据')
plt.plot(predict_data, label='预测数据')
plt.plot(forecast_data, label='未来数据')
plt.legend()
plt.show()
print('----------预测未来值')
print(forecast_data)
以下可以求一些用于评价模型标准的值
# calculate MSE 均方误差
mse=mean_squared_error(dc,pred)
# calculate RMSE 均方根误差
rmse = math.sqrt(mean_squared_error(dc,pred))
#calculate MAE 平均绝对误差
mae=mean_absolute_error(dc,pred)
#calculate R square
r_square=r2_score(dc,pred)
print('均方误差MSE: %.6f' % mse)
print('均方根误差RMSE: %.6f' % rmse)
print('平均绝对误差MAE: %.6f' % mae)
print('R_square: %.6f' % r_square)
11.