Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >时间序列 ACF 和 PACF 理解、代码、可视化

时间序列 ACF 和 PACF 理解、代码、可视化

作者头像
Python数据科学
发布于 2024-02-05 06:33:50
发布于 2024-02-05 06:33:50
2.7K00
代码可运行
举报
文章被收录于专栏:Python数据科学Python数据科学
运行总次数:0
代码可运行

我们说时间序列可以被预测,主要基于以下事实:我们可以部分掌握影响该时间序列的因素的变化情况。换句话说,对时间序列进行预测,其实就是利用各种理论和工具,对观察到的时间序列进行“抽丝剥茧”,以试图掌握其变化的本质,从而对未来的表现进行预测。

而自相关性是时序预测的基础,对于时序的平稳性、白噪声检测、确定

ARMA

模型中的阶数(p/q)有着重要的作用。本篇将着重介绍自相关的概念

ACF

PACF

ACF 自相关函数

概念理解

ACF(Autocorrelation Function)就是用来计算时间序列自身的相关性的函数。

对于同一时间

xt

的计算,

Cov(xt,xt)=1

,这个很好理解。

如果是不同的时间,比如

Cov(xtk,xt)

,该如何计算呢?

实际上,在应用自相关函数时,其输入分别为原始的时间序列

xt

及其

k

阶滞后序列

xtk

,于是

Cov(xtk,xt)

就变成了:

Cov({x1,...,xtk},{xk+1,...,xt})

,这里两个序列的长度是一致的,如下图所示:

计算和代码

ACF的公式定义为:

acf(k)=NNk×Nt=k+1(xt¯x)(xtk¯x)Nt=1(xt¯x)2
acf(k)=Nt=k+1(xt¯x)(xtk¯x)Nt=1(xt¯x)2

Python代码实现可以直接使用statsmodels包进行计算,当然也可以自己通过Numpy复现一遍公式,结果是一样的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np

# statsmodels包计算acf
import statsmodels.tsa.stattools as stattools
def default_acf(ts, k):
    return statools.acf(ts, nlags=k, unbiased=False)

# 手撸公式计算acf,有偏
def acf(ts, k):
    """ Compute autocorrelation coefficient, biased
    """
    x = np.array(ts) - np.mean(ts)
    coeff = np.zeros(k+1, np.float64) # to store acf
    coeff[0] = x.dot(x) # N*c(0)

    for i in range(1, k+1):
        coeff[i] = x[:-i].dot(x[i:]) # (N-k)*c(i)
        
    return coeff / coeff[0]

可视化

通过可视化可以更清楚的看出不同lag的系数值和趋势变化,通过statsmodels函数的直接绘制,以下是示例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
df = pd.read_excel('data.xlsx',engine='openpyxl')

df['price'].plot()
plot_acf(df['price'], lags=40, adjusted=False)
plt.show()

第一个图是一组时间序列的数据。第二个图是计算的ACF相关系数图。

ACF图的横坐标表示滞后的阶数,纵坐标表示对应的滞后序列与原始序列的相关系数。可以看出,随着滞后阶数的增加,滞后序列与原始序列的相关性也在不断地降低。图中的蓝色区域表示置信区间,用来标识相关系数是否具有统计显著性。简单来说,如果相关系数落在置信区间内,表明对应的两个序列的相关系数并不能代表其真实相关性。

即使是两个完全不相干的白噪声序列,由于随机性的影响,其相关系数也不可能全都为0,因此,需要使用置信区间来过滤掉那些由于随机性造成的“伪相关”。

PACF 偏自相关函数

概念理解

我们知道求导是对所有项都求导,求偏导只对某一个求导忽略其他项。

ACF

PACF

也可以理解为这样的关系。

前面我们计算

ACF

自相关函数时,得到的并不是

Xt

Xtk

之间单纯的相关关系。因为

Xt

同时还会受到中间

k1

个随机变量

Xt1

Xt2

...

Xtk+1

的影响,而这

k1

个随机变量又都和

Xtk

具有相关关系,所以自相关系数里面实际掺杂了其他变量对

Xt

Xtk

的影响。

为了得到

Xtk

Xt

直接影响,引入了偏自相关系数

PACF

的概念。滞后

k

偏自相关系数是指,对于平稳时间序列

{Xt}

,在剔除了中间

k1

个随机变量

Xt1

Xt2

...

Xtk+1

的干扰之后,

Xtk

Xt

影响的纯相关程度

计算和代码

PACF

的计算比

ACF

要复杂很多。这里我们借助AR模型来说明,对于AR(p)模型,一般会有如下假设:

xi+1=ϕ1xi+ϕ2xi1+...+ϕpxip+1+εi+1

其中,

ϕj,j=1,2,...,p

是线性相关系数,

εi+1

是噪声,即我们假设点

xi+1

与前

p

个点

xip+1,xip+2,...,xi

是线性相关的。而

PACF

所要表示的就是点

xi

与点

xip

的相关性,所以,

序列的偏相关系数PACF

pacf(p)=ϕp

有几种方法可以求解相关系数,方法包括最小二乘法(MLS)、尤尔-沃克方程(Yule-Walker equation)、伯格算法(Burg"s method。由于公式推导内容较多,本篇对求解方法不做详细介绍。

Python计算代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
from scipy.linalg import toeplitz

# 使用statsmodels
import statsmodels.tsa.stattools as stattools
def default_pacf(ts, k):
    return statools.pacf(ts, nlags=k, unbiased=True)

# 尤尔-沃克方程公式复现
def yule_walker(ts, order):
    ''' Solve yule walker equation
    '''
    x = np.array(ts) - np.mean(ts)
    n = x.shape[0]

    r = np.zeros(order+1, np.float64) # to store acf
    r[0] = x.dot(x) / n # r(0)
    for k in range(1, order+1):
        r[k] = x[:-k].dot(x[k:]) / (n - k) # r(k)

    R = toeplitz(r[:-1])

    return np.linalg.solve(R, r[1:]) # solve `Rb = r` to get `b`

def pacf(ts, k):
    ''' Compute partial autocorrelation coefficients for given time series,unbiased
    '''
    res = [1.]
    for i in range(1, k+1):
        res.append(yule_walker(ts, i)[-1])
    return np.array(res)

可视化

使用statsmodels函数直接绘制,methond可以选择合适的方法求解,下面使用最小二乘法ols进行求解。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 使用最小二乘法ols求解
plot_pacf(df['price'], lags=40,  method='ols')
plt.show()

以上就是对

ACF

PACF

的介绍,理解自相关的概念对于学习时间序列非常重要,下一篇将介绍它们的应用场景。

参考链接 [1].https://blog.csdn.net/SunJW_2017/article/details/126993853,芳樽里的歌 [2].https://www.jianshu.com/p/811f9ea0b52d,洪于祥 [3].https://zhuanlan.zhihu.com/p/59089924,gwave [4].https://www.statsmodels.org/ [5].https://mp.weixin.qq.com/s/llMZaMkhoXLRDlFxoFlXiw,seriesc

--end--

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-02-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python数据科学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【数据挖掘 & 机器学习 | 时间序列】时间序列必备工具箱: 自相关与偏相关检验
【数据挖掘 & 机器学习 | 时间序列】时间序列必备工具箱: 自相关与偏相关检验 作者: 计算机魔术师 版本: 1.0 ( 2023.11.18 )
计算机魔术师
2023/11/20
1.6K0
【数据挖掘 & 机器学习 | 时间序列】时间序列必备工具箱: 自相关与偏相关检验
【机器学习 | 数据挖掘】时间序列算法
智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘,以提取有价值的信息和洞察。它结合了大数据技术、人工智能(AI)、机器学习(ML)和数据挖掘等多种方法,旨在通过自动化的方式分析复杂数据集,发现潜在的价值和关联性,实现数据的自动化处理和分析,从而支持决策和优化业务流程。与传统的人工分析相比,智能大数据分析具有自动化、深度挖掘、实时性和可视化等特点。智能大数据分析广泛应用于各个领域,包括金融服务、医疗健康、零售、市场营销等,帮助企业做出更为精准的决策,提升竞争力。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/Intelligent_bigdata_analysis。
Francek Chen
2025/01/22
1500
【机器学习 | 数据挖掘】时间序列算法
线性平稳时间序列
王燕老师的书上的符号和我们老师讲课的符号有一些出入,虽然在写的过程中有意识地去使用赵老师上课用的符号但难免会有所疏漏,这里将两本书上符号的对应关系列一下:
爱编程的小明
2022/10/31
1K0
线性平稳时间序列
时间序列平稳性检验方法(Python)
当我们拿到时序数据后,首先要进行平稳性和纯随机性的检验,这两个重要的检验是时间序列的预处理。根据检验的结果可以判断出序列属于什么类型,然后对症下药使用相应的分析方法。
Python数据科学
2024/03/05
2.3K0
时间序列平稳性检验方法(Python)
干货 | 20个教程,掌握时间序列的特征分析(附代码)
【导语】时间序列是指以固定时间为间隔的序列值。本篇教程将教大家用 Python 对时间序列进行特征分析。
AI科技大本营
2019/07/11
6.1K0
干货 | 20个教程,掌握时间序列的特征分析(附代码)
一个时间序列可视化神器:Plotnine
我们将利用6种不同的图表来揭示时间序列数据的各个方面。重点介绍Python中的plotnine库,这是一种基于图形语法(Grammar of Graphics)的绘图工具。
数据STUDIO
2024/07/24
9010
一个时间序列可视化神器:Plotnine
一阶差分序列garch建模_时间序列分析
趋势变动:在长时期内按某种规则稳定地呈现出来的持续向上或向下或保持在某一水平。季节变动:在一个年度内重复出现的周期性波动。它是诸如气候条件、生产条件、节假日或人们的风俗习惯等各种因素影响的结果。循环波动:是时间序列呈现出得非固定长度的周期性变动。循环波动的周期可能会持续一段时间,但与趋势不同,它不是朝着单一方向的持续变动,而是涨落相同的交替波动。不规则波动(随机变动):是许多不可控的偶然因素共同作用的结果,致使时间序列产生一种波浪形或震荡式的变动。
用户7886150
2021/01/30
1.9K0
【时序预测】一文梳理时间序列预测——ARMA模型
在统计研究中,常用按时间顺序排列的一组随机变量X1​,X2​,⋯,Xt​,⋯来表示一个随机事件的时间序列,简记为{Xt,t∈T}。在时间的角度上来说,数据类型可分为两类:横截面数据和时间序列[1]。横截面数据是值在某一时间点搜集来自不同对象的数据,时间序列是一组按照时间排序的数据;横截面数据与时间序列的组合在计量经济学上构成了面板数据集。
roganhuang
2020/07/22
19K0
【时序预测】一文梳理时间序列预测——ARMA模型
深入机器学习系列之时间序列分析
时间序列指的是按时间顺序排列的一组数字序列,而时间序列分析就是利用这组数列,应用数理统计方法加以处理,从而来预测未来事物的发展。该分析方法属于定量预测方法,既承认事物发展的延续性,应用历史数据即可推测事物发展趋势;其次也考虑了事物发展的随机性,为此要利用统计分析中各种方法对历史数据进行处理。目前该方法常应用在国民经济宏观控制、企业经营管理、区域综合发展规划、气象预报和环境污染控制等各个方面。
数据猿
2019/08/06
2.7K0
【机器学习 | ARIMA】经典时间序列模型ARIMA定阶最佳实践,确定不来看看?
🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)
计算机魔术师
2023/11/23
3740
时间序列分析这件小事(四)--AR模型
之前说了,分析时间序列和回归一样,目的都是预测。在回归里面,我们有一元回归于多元回归,在时间序列里面,我们有自回归。与一元、多元一样,我们分为一阶与多阶自回归。其实还是那样的理念,只不过之前是变量与应变量,现在则是存在时滞的序列之间的关系而已。
钱塘小甲子
2019/01/28
4.6K0
用python做时间序列预测十:时间序列实践-航司乘客数预测
陆陆续续写了10篇时间序列相关的文章了,本系列主要是应用为主,包括初识概念、时间序列数据可视化、时间序列分解、平稳/非平稳时间序列、时间序列缺失值处理、相关函数图/偏相关函数图/滞后图、时间序列复杂度量化、Granger causality test(格兰杰因果检验)、ARIMA模型简介、时间序列实践-航司乘客数预测。 暂时先记录到这里,后续应该还会补充一些,比如基于深度学习的时间序列预测等。
AI粉嫩特工队
2020/06/16
4.1K0
最完整的时间序列分析和预测(含实例及代码)
在生产和科学研究中,对某一个或者一组变量 进行观察测量,将在一系列时刻所得到的离散数字组成的序列集合,称之为时间序列。
润森
2022/09/22
4.3K0
最完整的时间序列分析和预测(含实例及代码)
打开我的收藏夹 -- Python时间序列分析篇
这两天,又接收到了不少新的讯息。我是越来越佩服“梦想橡皮檫”,檫哥了(打开周榜/总榜很好找,前排),他居然能用几年的时间来打磨一个系列。别说收39块,就是原价99我也买了,不为啥,就凭人家打磨了三年的毅力,我服!!!
看、未来
2021/09/18
8070
【机器学习】--时间序列算法从初识到应用
指数平滑法对时间序列上连续的值之间的相关性没有要求。但是,如果你想使用指数平滑法计算出预测区间, 那么预测误差必须是不相关的, 且必须是服从零均值、 方差不变的正态分布。即使指数平滑法对时间序列连续数值之间相关性没有要求,在某种情况下, 我们可以通过考虑数据之间的相关性来创建更好的预测模型。 自回归移动平均模型( ARIMA)是最常用的时间序列预测模型。
LhWorld哥陪你聊算法
2018/09/13
7590
【机器学习】--时间序列算法从初识到应用
用python做时间序列预测六:相关函数图、偏相关函数图、滞后图
对于白噪声序列,按理说不会有任何自相关性,我们期望的自相关性为0,但是由于随机扰动的存在,自相关性不会为0,而通常假设随机扰动符合标准正态分布(均值为0,标准差为1),那么这个随机扰动的95%置信区间(一般都取95%,当然也可以调整这个概率)可以通过如下算式计算
AI粉嫩特工队
2020/06/10
4.7K1
时间序列预测模型-ARIMA原理及Python实现!
再介绍本篇的内容之前,我们先来看一下本文用到的数据。本文用到的中国银行股票数据下载:http://pan.baidu.com/s/1gfxRFbH。
石晓文
2018/12/06
14.7K1
时间序列ARIMA模型详解:python实现店铺一周销售量预测
顾名思义,时间序列是时间间隔不变的情况下收集的时间点集合。这些集合被分析用来了解长期发展趋势,为了预测未来或者表现分析的其他形式。但是是什么令时间序列与常见的回归问题的不同? 有两个原因: 1、时间序列是跟时间有关的。所以基于线性回归模型的假设:观察结果是独立的在这种情况下是不成立的。 2、随着上升或者下降的趋势,更多的时间序列出现季节性趋势的形式,如:特定时间框架的具体变化。即:如果你看到羊毛夹克的销售上升,你就一定会在冬季做更多销售。 常用的时间序列模型有AR模型、MA模型、ARMA模型和ARI
机器学习AI算法工程
2018/03/14
8.9K0
时间序列ARIMA模型详解:python实现店铺一周销售量预测
时间序列分析算法【R详解】
简介 在商业应用中,时间是最重要的因素,能够提升成功率。然而绝大多数公司很难跟上时间的脚步。但是随着技术的发展,出现了很多有效的方法,能够让我们预测未来。不要担心,本文并不会讨论时间机器,讨论的都是很实用的东西。 本文将要讨论关于预测的方法。有一种预测是跟时间相关的,而这种处理与时间相关数据的方法叫做时间序列模型。这个模型能够在与时间相关的数据中,寻到一些隐藏的信息来辅助决策。 当我们处理时序序列数据的时候,时间序列模型是非常有用的模型。大多数公司都是基于时间序列数据来分析第二年的销售量,网站流量,
Angel_Kitty
2018/04/09
2.8K0
时间序列分析算法【R详解】
如何在时间序列预测中检测随机游走和白噪声
无论多么强大,机器学习都无法预测一切。例如与时间序列预测有关的领域中,表现得就不是很好。
deephub
2021/07/23
2K0
如何在时间序列预测中检测随机游走和白噪声
推荐阅读
相关推荐
【数据挖掘 & 机器学习 | 时间序列】时间序列必备工具箱: 自相关与偏相关检验
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验