当前位置:网站首页>数据挖掘之时间序列分析[通俗易懂]
数据挖掘之时间序列分析[通俗易懂]
2022-06-25 17:12:00 【全栈程序员站长】
大家好,又见面了,我是你们的朋友全栈君。
按时间顺序排列的一组随机变量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、生成时序对象,检验平稳性
sales = ts(data) #生成时序对象
plot.ts(sales,xlab="时间",ylab="销量") #作时序图
acf(sales) #作自相关图
library(fUnitRoots)
unitrootTest(sales) #单位根检验时序图如下,具有单调递增趋势。
自相关图如下,自相关系数长期大于零,说明序列间具有很强的长期相关性。
单位根检验 结果如下,p值显著大于0.05,判断为非平稳序列。(非平稳序列一定不是白噪声序列)
3、对原始序列进行一阶差分,并进行平稳性检验。
difsales = diff(sales) #一阶差分
plot.ts(difsales,xlab="时间",ylab="销量残差") #作时序图
acf(difsales) #作自相关图
unitrootTest(difsales) #单位根检验时序图如下,在均值附近比较平稳的波动。
自相关图如下,有很强的短期相关性。
单位根检验 结果如下,p值小于0.05,所以一阶差分后的序列是平稳序列。
4、白噪声检验
Box.test(difsales,type = "Ljung-Box") #白噪声检验结果为
p值显著小于0.05,所以一阶差分后的序列是平稳非白噪声序列。
5、拟合ARIMA模型
第一种方法:
pacf(difsales) #作偏自相关图偏自相关图如下,
根据表4的选择方法,选定ARIMA(1,1,0)模型。
fit = arima(sales,order=c(1,1,0)) #ARIMA(1,1,0)模型第二种方法:
auto.arima(CWD) #另一个实例输出结果如下:
6、模型检验
模型确定后,检验其残差是否为白噪声,如果不是白噪声,说明残差中还存在有用的信息,需要修改模型参数,进一步提取。
fit = arima(CWD,order = c(0,1,1)) #另一个实例
r3 = fit$residuals
Box.test(r3,type = "Ljung-Box")7、预测
library(forecast)
forecast(fit,5) #预测接下来5期的序列值
plot(forecast(fit,5)) #作预测图,深色区域分别为80%和95%的置信区间结果为
8、模型评价
采用三个衡量模型预测精度的统计量指标:平均绝对误差、均方根误差、平均绝对百分误差。这三个指标从不同方面反映了模型的预测精度。
mae = mean(abs(pre-real)) #平均绝对误差
rmse = mean((pre-real)^2) #均方根误差
mape = mean(abs(pre-real)/real) #平均绝对百分误差结合实际业务分析,将误差阈值设定在一个值,如1.5,评价模型的预测精度。
Python实现:
#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输出结果为:
可以得出时间序列不平稳,需要进行差分操作。
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'销量差分']))输出结果为:
这时差分后的序列符合平稳性。
#白噪声检验
from statsmodels.stats.diagnostic import acorr_ljungbox
print(u'差分序列的白噪声检验结果为:',acorr_ljungbox(D_data,lags=1)) #返回统计量和p值输出结果为:
p值小于显著性水平,所以非白噪声。
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
边栏推荐
- 旧手机变废为宝,充当服务器使用
- [micro service sentinel] overview of flow control rules | detailed explanation of flow control mode for source | < direct link >
- 浅谈 Web 3.0
- Comprehensive optimization of the six topics, Alibaba performance optimization booklet open source, leading you to the ultimate performance
- XShell连接VMWare虚拟机
- A development of student management system based on PHP
- College Students' hot summer exchange, Rog star product phantom 16 flipped version / phantom 13 / phantom x appointment
- Mathematical modeling - nonlinear programming
- 汇编语言(5)寄存器(内存访问)
- Why are there few embedded system designers in the soft test?
猜你喜欢

ddia数据密集型应用系统设计 整理

【Matlab】曲线拟合

超全金属PBR多通道贴图素材网站整理

项目经理在项目中起到的作用

Why does MySQL limit affect performance?

Are these old system codes written by pigs?

Comprehensive optimization of the six topics, Alibaba performance optimization booklet open source, leading you to the ultimate performance

try with resource

匯編語言(5)寄存器(內存訪問)

SnakeYAML配置文件解析器
随机推荐
匯編語言(5)寄存器(內存訪問)
[untitled]
Why are there few embedded system designers in the soft test?
Distinguishing seven kinds of facial expressions by deep separable convolution neural network
通过深度可分离卷积神经网络对七种表情进行区分
剑指 Offer II 014. 字符串中的变位词 滑动窗口
社交电商如何运营推广?
杰理之如何给外界输出一个时钟源使用【篇】
js禁止浏览器默认事件
Sword finger offer 50 First character that appears only once
学习太极创客 — MQTT(三)连接MQTT服务端
足下教育日精进自动提交
远程终端控制神器——MobaXterm
Pytorch official document learning record
宝藏又小众的国画3d材质贴图素材网站分享
Best practices for data relocation: using CDM to relocate offline Mysql to DWS
Uncover ges super large scale graph computing engine hyg: Graph Segmentation
STM32硬件错误HardFault_Handler的处理方法
巴比特 | 元宇宙每日荐读:三位手握“价值千万”藏品的玩家,揭秘数字藏品市场“三大套路”...
剑指 Offer II 010. 和为 k 的子数组 前缀和差