数据挖掘之时间序列分析[通俗易懂]

2022-06-25 16:25:18 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

按时间顺序排列的一组随机变量X1,X2,…,Xt表示一个随机事件的时间序列。

时间序列分析的目的是给定一个已被观测了的时间序列,预测该序列的未来值。

模型名称

描述

平滑法

常用于趋势分析和预测,利用修匀技术,削弱短期随机波动对序列的影响,使序列平滑化。 根据所用平滑技术的不同,可分为移动平均法和指数平滑法。

趋势拟合法

把时间作为自变量,相应的序列观察值作为因变量,建立回归模型。 根据序列的特征,可分为线性拟合和曲线拟合。

组合模型

时间序列的变化主要受到长期趋势(T)、季节变动(S)、周期变动(C)和不规则变动()这四个因素的影响。 根据序列的特点,可以构建加法模型和乘法模型。 加法模型:x = T S C 乘法模型:x = TSC

AR模型

以前p期的序列值为自变量,随机变量Xt为因变量建立线性回归模型

MA模型

随机变量Xt的取值与前各期的序列值无关,建立Xt与前q期的随机扰动()的线性回归模型

ARMA模型

随机变量Xt的取值,不仅与前p期的序列值有关,还与前q期的随机扰动()有关

ARIMA模型

许多非平稳序列差分后会显示出平稳序列的性质,称这个非平稳序列为差分平稳序列。 对差分平稳序列可以使用ARIMA模型进行拟合

ARCH模型

能准确地模拟时间序列变量的波动性变化,适用于序列具有异方差性并且异方差函数短期自相关

GARCH模型及其衍生模型

称为广义ARCH模型,是ARCH模型的拓展。更能反映实际序列中的长期记忆性、信息的非对称性等性质

1、时间序列分析之前,需要进行序列的预处理,包括纯随机性和平稳性检验。根据检验结果可以将序列分为不同的类型,采取不同的分析方法。

纯随机序列

又叫白噪声序列,序列的各项之间没有任何相关关系,序列在进行完全无序的随机波动。 白噪声序列是没有信息可提取的平稳序列,可以终止分析。

平稳非白噪声序列

均值和方差是常数。通常建立一个线性模型来拟合该序列的发展,从而提取有用信息。 ARMA模型是最常用的平稳序列拟合模型。

非平稳序列

均值和方差不稳定。一般将其转变成平稳序列,应用有关平稳时间序列的分析方法,如ARMA模型。 如果时间序列经差分运算后,具有平稳性,称该序列为差分平稳序列,使用ARIMA模型进行分析。

(1)纯随机性检验

如果序列是纯随机性检验,则序列值之间应该没有任何关系。实际上纯随机性序列的样本自相关系数不会绝对为零,但是很接近零,并在零附近随机波动。

纯随机性检验,又叫白噪声检验,一般是构造检验统计量来检验。常用的检验统计量有Q统计量、LB统计量,由样本各延迟期数的自相关系数,可以计算出检验统计量,然后计算对应的p值,如果p值大于显著性水平,则表示接受原假设,是纯随机序列,停止分析。

(2)平稳性检验

如果时间序列在某一常数附近波动且波动范围有限,即有常数均值和常数方差,并且延迟k期的序列变量的自协方差和自相关系数是相等的,或者说延迟k期的序列变量之间的影响程度是一样的,则称该时间序列为平稳序列。

两种检验方法:

a. 根据时序图和自相关图的特征做出判断的图检验,该方法操作简单、应用广泛,缺点是带有主观性;

时序图检验:根据平稳时间序列的均值和方差都为常数的性质,平稳序列的时序图显示序列值始终在一个常数附近随机波动,且波动的范围有界。

如果有明显的趋势性或周期性,通常不是平稳序列。

自相关图检验:平稳序列具有短期相关性,所以平稳序列中,只有近期的序列值对现时值得影响比较明显,间隔越远的过去值对现时值的影响越小。

随着延迟期数k的增加,平稳序列的自相关系数会比较快的衰减趋向于零,并在零附近随机波动,而非平稳序列的自相关系数衰减的速度比较慢。

b. 构造检验统计量,目前最常用的方法是单位根检验。

单位根检验是指检验序列中是否存在单位根,因为存在单位根就是非平稳时间序列。

2、平稳时间序列分析

ARMA模型的全称是自回归移动平均模型,可以细分为AR模型、MA模型和ARMA模型三类,都可以看做是多元线性回归模型。

建模步骤:

(1)计算自相关系数(ACF)和偏自相关系数(PACF)

(2)ARMA模型识别,也叫模型定阶,由AR(p)模型、MA(q)模型和ARMA(p,q)的自相关系数和偏自相关系数的性质,选择合适的模型。

模型

自相关系数(ACF)

偏自相关系数(PACF)

AR(p)

拖尾

p阶截尾

MA(q)

q阶截尾

拖尾

ARMA(p,q)

拖尾

拖尾

(3)估计模型中未知参数的值,并进行参数检验

(4)模型检验

(5)模型优化

(6)模型应用:进行短期预测。

3、非平稳时间序列分析

实际上,在自然界中绝大部分序列都是非平稳的。

分析方法分为两类:

(1)确定性因素分解的时序分析

把所有序列的变化都归结为四个因素,长期趋势、季节变动、循环变动和随机变动的综合影响。

缺点是由随机因素导致的波动难以确定和分析,对随机信息浪费严重,会导致模型拟合精度不够理性。

(2)随机时序分析

根据时间序列的不同特点,随机时序分析可以建立的模型有ARIMA模型、残差自回归模型、季节模型、异方差模型等。

ARIMA模型建模步骤:

a. 检查序列的平稳性

b. 对原始序列进行差分,并进行平稳性和白噪声检验

c. 选择ARIMA模型

需要为ARIMA(p、d、q)模型指定参数p、d、q。其中d为差分次数。

或者使用forecast包里面的auto.arima函数实现最优ARIMA模型的自动选取。

模型

ACF

PACF

ARIMA(p,d,0)

逐渐减小到零

在p阶后减小到零

ARIMA(0,d,q)

q阶后减小到零

逐渐减小到零

ARIMA(p,d,q)

逐渐减小到零

逐渐减小到零

d. 拟合模型

e. 预测


举例说明ARIMA模型的应用。

R语言实现:

1、读取数据集

2、生成时序对象,检验平稳性

代码语言:javascript复制
sales = ts(data) #生成时序对象

plot.ts(sales,xlab="时间",ylab="销量") #作时序图

acf(sales) #作自相关图

library(fUnitRoots)
unitrootTest(sales) #单位根检验

时序图如下,具有单调递增趋势。

自相关图如下,自相关系数长期大于零,说明序列间具有很强的长期相关性。

单位根检验 结果如下,p值显著大于0.05,判断为非平稳序列。(非平稳序列一定不是白噪声序列

3、对原始序列进行一阶差分,并进行平稳性检验。

代码语言:javascript复制
difsales = diff(sales) #一阶差分

plot.ts(difsales,xlab="时间",ylab="销量残差") #作时序图

acf(difsales) #作自相关图

unitrootTest(difsales) #单位根检验

时序图如下,在均值附近比较平稳的波动。

自相关图如下,有很强的短期相关性。

单位根检验 结果如下,p值小于0.05,所以一阶差分后的序列是平稳序列。

4、白噪声检验

代码语言:javascript复制
Box.test(difsales,type = "Ljung-Box") #白噪声检验

结果为

p值显著小于0.05,所以一阶差分后的序列是平稳非白噪声序列。

5、拟合ARIMA模型

第一种方法:

代码语言:javascript复制
pacf(difsales) #作偏自相关图

偏自相关图如下,

根据表4的选择方法,选定ARIMA(1,1,0)模型。

代码语言:javascript复制
fit = arima(sales,order=c(1,1,0)) #ARIMA(1,1,0)模型

第二种方法:

代码语言:javascript复制
auto.arima(CWD) #另一个实例

输出结果如下:

6、模型检验

模型确定后,检验其残差是否为白噪声,如果不是白噪声,说明残差中还存在有用的信息,需要修改模型参数,进一步提取。

代码语言:javascript复制
fit = arima(CWD,order = c(0,1,1)) #另一个实例

r3 = fit$residuals

Box.test(r3,type = "Ljung-Box")

7、预测

代码语言:javascript复制
library(forecast) 
forecast(fit,5) #预测接下来5期的序列值

plot(forecast(fit,5)) #作预测图,深色区域分别为80%和95%的置信区间

结果为

8、模型评价

采用三个衡量模型预测精度的统计量指标:平均绝对误差、均方根误差、平均绝对百分误差。这三个指标从不同方面反映了模型的预测精度。

代码语言:javascript复制
mae = mean(abs(pre-real)) #平均绝对误差

rmse = mean((pre-real)^2) #均方根误差

mape = mean(abs(pre-real)/real) #平均绝对百分误差

结合实际业务分析,将误差阈值设定在一个值,如1.5,评价模型的预测精度。

Python实现:

代码语言:javascript复制
#ARIMA时序模型
import pandas as pd

forecastnum = 5
data = pd.read_excel("arima_data.xls",index_col=u'日期') #pandas自动将“日期”列识别为datetime格式

#时序图
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] 
plt.rcParams['axes.unicode_minus'] = False
data.plot()
plt.show()

#自相关图
from statsmodels.graphics.tsaplots import plot_acf
plot_acf(data).show()

#ADF单位根检验
from statsmodels.tsa.stattools import adfuller as ADF
print(u'原始序列的ADF检验结果为:',ADF(data[u'销量']))
#返回值依次是adf、pvalue

输出结果为:

可以得出时间序列不平稳,需要进行差分操作。

代码语言:javascript复制
D_data = data.diff().dropna() #差分
D_data.columns = [u'销量差分']
D_data.plot() #时序图
plt.show()

plot_acf(D_data).show() #自相关图

from statsmodels.graphics.tsaplots import plot_pacf
plot_pacf(D_data).show() #偏自相关图

print(u'差分序列的ADF检验结果为:',ADF(D_data[u'销量差分']))

输出结果为:

这时差分后的序列符合平稳性。

代码语言:javascript复制
#白噪声检验
from statsmodels.stats.diagnostic import acorr_ljungbox
print(u'差分序列的白噪声检验结果为:',acorr_ljungbox(D_data,lags=1)) #返回统计量和p值

输出结果为:

p值小于显著性水平,所以非白噪声。

代码语言:javascript复制
from statsmodels.tsa.arima_model import ARIMA
data[u'销量'] = data[u'销量'].astype(float)
#定阶
pmax = int(len(D_data)/10) #一般阶数不超过length/10
qmax = int(len(D_data)/10) 
bic_matrix =[] #bic矩阵
for p in range(pmax 1):
    tmp = []
    for q in range(qmax 1):
        try: #存在部分报错
            tmp.append(ARIMA(data,(p,1,q)).fit().bic)
        except:
            tmp.append(None)
    bic_matrix.append(tmp)
    
bic_matrix = pd.DataFrame(bic_matrix)
p,q = bic_matrix.stack().idxmin() #先用stack展平,用idxmin找出最小值位置
print (u'BIC最小的p值和q值为:%s,%s' % (p,q))

model = ARIMA(data,(p,1,q)).fit() #建立ARIMA(0,1,1)模型
model.summary2() #模型报告

model.forecast(5) #预测5天的数据,返回预测结果、标准误差、置信区间

输出结果为:

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151153.html原文链接:https://javaforall.cn

0 人点赞