时间序列的数据分析(七):数据平稳性

news2024/11/25 15:54:12

之前已经完成了六篇关于时间序列的博客,还没有阅读过的读者请先阅读:

  1. 时间序列的数据分析(一):主要成分

  2. 时间序列的数据分析(二):数据趋势的计算

  3. 时间序列的数据分析(三):经典时间序列分解 
  4.  时间序列的数据分析(四):STL分解
  5. 时间序列的数据分析(五):简单预测法

     6. 时间序列的数据分析(六):指数平滑预测法

数据平稳性(Stationarity)

 数据平稳性是指时间序列的统计特性如均值、方差、协方差不随时间变化而变化。换句话说,时间序列的均值、方差和协方差随时间保持不变。

 如何评估数据的平稳性: 视觉评估

如果时间序列数据同时具有恒定的均值,方差,协方差这三个特征,那么我们可以认定数据是平稳的,反之数据是非平稳的。因此我们可以通过简单的视觉方法来观察数据的变化规律,从而可以判断出数据是否是平稳:

简单计算来识别数据的平稳性

我们大体上可以将时间序列数据分成两半:前半部分和后半部分。并比较前半部分和后半部分的均值、振幅和周期长度。这里振幅对应方差,周期长度对应协方差。

  • 常数均值:数据的前半部分和后半分的均值相似(无需绝对相等)
  • 常数方差: 数据的前半部分和后半分的振幅相似(无需绝对相等)
  • 常数协方差: 数据的前半部分和后半分的周期长度相似(无需绝对相等)

如果时间序列数据同时具有常数均值,常数方差,常数协方差这三个特征,那么我们可以认定数据是平稳的,反之数据是不平稳的。

统计检验来评估平稳性

严格的统计检验来评估数据的平稳性也称为单根检验(unit root test),单根是一种随机趋势,称为“带漂移的随机游走”。由于无法预测随机性,这意味着:

  • 存在单位根:非平稳(不可预测)
  • 没有单位根:平稳

要使用单位根检验来评估平稳性需要使用假设检验:

  • 零假设(Null hypothesis,H0): 时间序列是平稳的(不存在单根)
  • 备择假设 (Alternative hypothesis,H1) :时间序列不平稳的(存在单位根)

注意,这里的H0和H1具体的假设内容并不一定为上述内容为准,也可能正好相反,假设的内容要有具体的检验方法确定的。

然后,将根据统计计算结果评估是否拒绝零假设,如果拒绝H0,则意味着接受H1,反之亦然。

  • p 值方法:
    如果 p 值 > 0.05,则无法拒绝零假设。
    如果 p 值 ≤ 0.05,则拒绝零假设。
  • 临界值方法:
    如果检验统计量没有临界值那么极端,则无法拒绝零假设。
    如果检验统计量比临界值更极端,则拒绝零假设。

注:当 p 值接近显著值(例如,大约 0.05)时,应使用临界值方法 .

常用的单根检验方法

1.Augmented Dicky Fuller Test(ADF检验)

Augmented Dickey-Fuller (ADF) 检验的假设是:

  • 零假设 (H0):时间序列非平稳的,因为存在单位根(如果 p 值 > 0.05)
  • 备择假设 (H1):时间序列是平稳的,因为没有单位根(如果 p 值 ≤ 0.05)

在Python中我们可以使用statsmodels包的adfuller方法来实现ADF检验。不过为了检验单根检验结果的有效性,我们事先准备好了两套数据,一个是航空公司历年乘客数量数据,另一个是白噪声数据,这里的乘客数据有着明显的趋势性,所以它是非平稳的,而白噪声数据则是平稳的。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')
plt.rc("figure", figsize=(10,4))

#非平稳的航空乘客数据
df=pd.read_csv('passengers.csv').set_index('Period')
df.plot();

# 平稳的白噪声序列
np.random.seed(10)
y= np.random.normal(loc=0,scale=1,size=500)
white_noise = pd.Series(y)
white_noise.plot();

 下面我们使用adf来分别检验这两种数据的平稳性。

from statsmodels.tsa.stattools import adfuller

#航空公司乘客数据adf检验
result = adfuller(df["passengers"].values)

print('ADF Statistics: %f' % result[0])
print('p-value: %f' % result[1])
print('Critical values:')
for key, value in result[4].items():
    print('\t%s: %.3f' % (key, value))

print(f'Result: The series is {"not " if result[1] > 0.05 else ""}stationary')

判断标准:

  • 如果P-value <=0.05 并且 test statistic< 1% 的临界值(Critical values) 则拒绝零假设。
  • 如果P-value > 0.05 或者 test statistic> 1% 的临界值(Critical values) 则接接受零假设。

这里我们的P-value为0.99 > 0.05 所以接受零假设,即数据是非平稳的。(adf的零假设为数据是非平稳的)。

#白噪声的adf建议结果
result = adfuller(white_noise.values)
print('ADF Statistics: %f' % result[0])
print('p-value: %f' % result[1])
print('Critical values:')
for key, value in result[4].items():
    print('\t%s: %.3f' % (key, value))
print(f'Result: The series is {"not " if result[1] > 0.05 else ""}stationary')

 

 这里pvale值为0.0<0.05 并且 test statistic值为-23.677<1%的临界值-3.443,所以拒绝H0,接受H1,即数据是平稳的。

2. Kwiatkowski-Phillips-Schmidt-Shin Test (KPSS 检验)

KPSS是用来计算零假设数据是水平或趋势平稳的检验方法。

KPSS 检验的假设是:

  • 零假设 (H0):时间序列是平稳的,因为没有单位根(如果 p 值 > 0.05)
  • 备择假设 (H1):时间序列非平稳的,因为存在单位根(如果 p 值 ≤ 0.05)

注意:KPSS检验和ADF检验它们的假设正好相反。

在Python中我们可以使用statsmodels包的kpss方法来实现KPSS检验。在kpss中有一个参数regression,因为航空公司乘客数据是有明显的趋势,看上去是趋势稳定的,因此regression必须设置为“ct”

from statsmodels.tsa.stattools import kpss
# 检验航空乘客数据
statistic, p_value, n_lags, critical_values = kpss(df["passengers"].values,
                                                   regression = "ct");
print(f'KPSS Statistic: {statistic}')
print(f'p-value: {p_value}')
# print(f'num lags: {n_lags}')
print('Critial Values:')
for key, value in critical_values.items():
    print(f'   {key} : {value}')
print(f'Result: The series is {"not " if p_value < 0.05 else ""}stationary')

判断标准:

  • 1.如果P-value <=0.05 并且 test statistic>临界值(Critical values) 则拒绝零假设。
  • 2.如果P-value > 0.05 或者 test statistic<临界值(Critical values) 则接接受零假设。

这里我们的P-value为0.1 > 0.05 所以接受零假设,即数据是平稳的。

#检验白噪声
statistic, p_value, n_lags, critical_values = kpss(white_noise.values)
print(f'KPSS Statistic: {statistic}')
print(f'p-value: {p_value}')
print(f'num lags: {n_lags}')
print('Critial Values:')
for key, value in critical_values.items():
    print(f'   {key} : {value}')
print(f'Result: The series is {"not " if p_value < 0.05 else ""}stationary')

 这里白噪声的P-value为0.1 > 0.05 所以接受零假设,即数据是平稳的。

单根检验存在的问题

不同的单根检验方法如adf,kpss等有时候会给出截然相反的结论,这会使人产生困惑,为了确保检验结果的正确性,我们必须要用2种或以上方法同时做检验,下面是2种方法做检验时候会遇到的情况:

  • 情况1:两个测试都得出的结论都是是平稳的,那么数据是平稳的。
  • 情况2: 两个测试都得出的结论都是非平稳的,那么数据是非平稳的。
  • 情况3:ADF 得出非平稳的结论,KPSS 得出平稳的结论,那么数据是趋势平稳。
  • 情况4:ADF 得出平稳的结论,KPSS 得出非平稳的结论,那么数据是差分平稳。

如何处理非平稳的数据

当我们的时间序列时间是非平稳的时候,那么我们可以通过以下方法使数据变的平稳:

  • 差分
  • 通过模型拟合去趋势
  • 对数变换

1.差分

差分是计算两个连续观察值之间的差值。它会使时间序列的均值变得稳定,从而减少了趋势。下面我们拿特斯拉的股票数据来实现差分操作:

#加载特斯拉股票数据
df= pd.read_csv('./data/tsla.csv')
df.date=pd.to_datetime(df.date)

# 对特斯拉股票数据进行差分处理
df['diff_Close']= df['Close'].diff()

#绘图
fig, axs = plt.subplots(2, 1,figsize=(10,8))
axs[0].plot(df.date,df.Close)
axs[0].set_title('Tsla Stock Price')
axs[1].plot(df.date,df.diff_Close)
axs[1].set_title('differencing Tsla Stock Price')
plt.show();

 通过对特斯拉股票数据进行一阶差分操作后我们得到了一个类似于白噪声的序列,它近似平稳。有时候如果一阶差分的结果仍然不平稳,那么还可以进行二阶差分操作,但一般不会做二阶以上的差分。

2.通过模型拟合去除趋势

从非平稳时间序列中去除趋势的一种方法是将简单模型(如线性回归)拟合到数据,然后从该拟合中对残差进行建模。

from sklearn.linear_model import LinearRegression

#非平稳的航空乘客数据
df=pd.read_csv('passengers.csv')
df.Period=pd.to_datetime(df.Period)

# 训练线下回归模型 
X = [i for i in range(0, len(df))]
X = np.reshape(X, (len(X), 1))
y = df["passengers"].values
model = LinearRegression()
model.fit(X, y)

# 计算趋势
trend = model.predict(X)

# 去除趋势
df["detrend"] = df["passengers"].values - trend

#绘图
fig, axs = plt.subplots(2, 1,figsize=(10,8))
axs[0].plot(df.Period,df.passengers)
axs[0].set_title('passengers')
axs[1].plot(df.Period,df.detrend)
axs[1].set_title('detrend passengers')
plt.show();

 去趋势的方法可以稳定数据的均值,但是均值稳定了并不意味着数据就是平稳的,上述航空乘客数据经过去趋势操作后悔,虽然均值稳定了,但是方差仍然不稳定,那是否可以让让方差也变得稳定呢?

3.对数变换

对数变换可以让时间序列数据的方差变得更加稳定,上述航空公司乘客数据经过去除趋势处理后,均值变得稳定了,但是方差仍然不稳定,因此我们需要做对数变换,让其方差变得稳定。

df=pd.read_csv('passengers.csv')
df.Period=pd.to_datetime(df.Period)
#对数变换
df['log_passengers'] = np.log(df['passengers'].values)

# 训练线下回归模型 
X = [i for i in range(0, len(df))]
X = np.reshape(X, (len(X), 1))
y = df["log_passengers"].values
model = LinearRegression()
model.fit(X, y)

# 计算趋势
trend = model.predict(X)

# 去除趋势
df["detrend_log_passengers"] = df["log_passengers"].values - trend

#绘图
fig, axs = plt.subplots(3, 1,figsize=(10,10))
axs[0].plot(df.Period,df.passengers)
axs[0].set_title('passengers')
axs[1].plot(df.Period,df.log_passengers)
axs[1].set_title('log passengers')

axs[2].plot(df.Period,df.detrend_log_passengers)
axs[2].set_title('detrend log passengers')
plt.show();

 上述数据经过对数变换和去趋势操作以后,数据变得均值稳定和方差稳定,因此是比较理想的结果。

总结

在时间序列预测中,当时间序列数据具有恒定统计特性(均值、方差和协方差)并且这些统计特性与时间无关时,则被称为数据是平稳的。由于恒定的统计特性,平稳时间序列比非平稳时间序列更容易建模。因此,许多时间序列预测模型都假设数据是平稳的。

平稳性可以通过视觉评估或统计方法来检查。统计方法检查数据中是否存在单根(unit root)。两个最常用的单根检验是 ADF 和 KPSS。我们可以在Python的第三方库statsmodels.tsa.stattools中调用它们。

如果时间序列是非平稳的,您可以尝试通过差分、对数变换或去除趋势使其变得平稳。

参考资料

stationarity_detrending_adf_kpss

statsmodels.tsa.stattools.adfuller

statsmodels.tsa.stattools.kpss

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/456658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么使用gpt4-在哪里使用gpt

gpt-4怎么用 目前&#xff0c;GPT-4尚未发布或公开释放。因此&#xff0c;我们目前无法使用GPT-4。GPT-4是由OpenAI公司开发的人工智能语言模型&#xff0c;其预计能够比先前的版本GPT-3更加强大和智能化&#xff0c;但我们需要等待OpenAI官方发布有关GPT-4的更多信息。 如果…

搜索引擎找外贸客户

说起搜索引擎&#xff0c;我们每个人都不陌生&#xff0c;也许第一时间就能想到平日经常使用的“百度一下”和凭借强大算法及丰富功能占据近85%市场份额的谷歌搜索&#xff08;Statista 2023年1月数据&#xff09;这些耳熟能详的搜索引擎。对于外贸人而言搜索引擎也是非常实用的…

内卷的上海车展上,百度Apollo带来新型开放整零关系

/ 导读 / 汽车的智能化发展已然成为了当前市场最有热度的话题&#xff0c;更有希望引领新一代产业革命的浪潮。百度作为最早探索智能驾驶领域的企业之一&#xff0c;多年来始终打磨技术产品&#xff0c;已经形成了全栈的解决方案&#xff0c;从而帮助企业造好车。 在上海车展前…

谁不看谁是

报错Cannot create property type on string 是因为 你定义的相关变量是字符串 改成这样就行了 vue报错Cannot set properties of undefined (setting ‘xxx‘) 是因为没获取到值&#xff0c;需要在方法外层定义变量等于this&#xff0c;然后在方法内使用变量.name去查找值&a…

项目沟通管理5大技巧 第4个很重要

1、充分使用twitter管理沟通模型 项目沟通会议可以充分使用witter的管理沟通模型&#xff0c;提高会议沟通效率。使用此模型&#xff0c;主要是有三步&#xff1a; 第一步&#xff1a;倾听&#xff0c;项目经理需要保持中立的立场&#xff0c;不先表态&#xff0c;让团队成员畅…

nacos 1.4.2升级到nacos 2.1.1遇到的一些坑

文章目录 1 前言2 拉取nacos配置失败2.1 可能是端口号问题2.2 可能存在jar冲突2.3 可能nacos配置不对 1 前言 为了各组件更好的的兼容&#xff0c;最近系统进行了nacos升级, 由1.4.2升级为2.1.1&#xff0c;这里把遇到的一些坑做一下记录。 2 拉取nacos配置失败 在升级后&am…

Vue(事件处理、计算属性、监视属性)

一、事件处理 1. 语法 Vue模板 v-on:xxx"处理函数" xxx&#xff08;作为绑定事件的简写&#xff09;"处理函数" xxx指代的都是事件名 Vue实例 必须使用methods配置对象&#xff08;配置多个函数方法&#xff09; methods中配置函数&#xff0c;都是Vue…

哈希表题目:网格照明

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;网格照明 出处&#xff1a;1001. 网格照明 难度 6 级 题目描述 要求 在 n n \texttt{n} \times \texttt{n} nn 的二维网格 grid \texttt{grid}…

【C++技能树】原来比C方便这么多 --引用、内联函数、Auto、NULL与nullptr

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

【软考备战·希赛网每日一练】2023年4月24日

文章目录 一、今日成绩二、错题总结第一题第二题第三题第四题第五题 三、知识查缺 题目及解析来源&#xff1a;2023年04月24日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; 第二题 解析&#xff1a; DPI表示每英寸像素点的个数。 300DPI表示每英寸…

ESP32学习六-构建系统

一、简介 如果想要新建一个ESP32项目&#xff0c;需要包含很多其他的文件夹和文件&#xff0c;如果对ESP32的勾线系统原理不理解&#xff0c;就会产生出很多编译不通过的问题。这里就对ESP-IDF构建系统的实现原理做一个简单的总结。 测试环境&#xff1a;Ubuntu18.4 ESP-IDF&am…

Observability:添加免费和开放的 Elastic APM 作为 Elastic 可观察性部署的一部分 - 8.x

作者&#xff1a;David Hope 在最近的一篇博文中&#xff0c;我们向你展示了如何开始使用 Elastic 可观察性的免费开放层。 下面&#xff0c;我们将介绍你需要做些什么来扩展你的部署&#xff0c;这样你就可以开始免费从应用程序性能监控&#xff08;APM&#xff09;或跟踪集群…

我国直播电商行业市场增速下降 核心竞争力发生转变 新一轮洗牌变革步伐将加快

1、直播电商概念及其产业链图解 直播电商是属于网络直播的一个分支&#xff0c;属于一种泛娱乐类直播&#xff0c;电商店铺的店家或模特主播在直播间通过借助视频录制工具&#xff0c;将店铺所售的商品展示给用户&#xff0c;并为用户答疑解惑&#xff0c;提供实时的客服服务&…

【JavaEE初阶】多线程(二)线程状态以及多线程安全问题

摄影分享~~ 文章目录 线程的状态多线程带来的风险线程安全线程安全的原因解决线程不安全问题&#xff08;加锁&#xff09;synchronized关键字-监视器锁monitor locksynchronized的特性 java中的死锁问题死锁死锁的三个典型情况死锁的四个必要条件如何避免死锁&#xff1f; J…

家用洗地机怎么选?2023高性价比家用洗地机推荐

相信大家和我一样是妥妥的“懒人一族”了&#xff0c;不喜欢做家务、不喜欢碰脏水、不喜欢花费过多的时间在家务上&#xff0c;但是却想有一个整洁干净的家居环境。而作为家务清洁中面积最大、耗时耗力最多的就是扫地拖地了。传统的地面清洁方式&#xff0c;要先用扫把扫一遍&a…

Git上传本地代码到Github

参考 https://zhuanlan.zhihu.com/p/138305054 文章目录 上传本地代码到github仓库&#xff08;1&#xff09;创建一个空文件夹&#xff0c;在该文件夹下右键&#xff0c;Git bash here&#xff08;2&#xff09;初始化仓库&#xff08;3&#xff09; 建立本地与github上项目的…

ChatGPT 速通手册——让 ChatGPT 来写正则表达式

regex 生成 正则表达式可谓是一门让广大程序员们又爱又恨的技术。它易学难精&#xff0c;而且可维护性又差&#xff0c;别说交接给其他同事&#xff0c;同一个人写的正则表达式&#xff0c;三个月后回头再看&#xff0c;也可能完全不知所云。 因此&#xff0c;让 ChatGPT 来写…

【计网 从头自己构建协议】一、libpcap 介绍 手撕以太网帧

上一篇&#xff1a;IndexError: list index out of range 下一篇&#xff1a;[【计网 从头自己构建协议】二、收发 ARP 请求帧与响应帧] 介绍 理论的学习总是枯燥的&#xff0c;想要加深对理论的理解&#xff0c;最好的方法就是自己实践一遍。 想要亲手实现各种协议&#xf…

通讯方式连接成功,其他原因导致的连接失败解决方案

一、电脑中有其他品牌visa导致的冲突&#xff08;以tekvisa为例&#xff09; 1、删除tekvisa 2、下载一个NI Package Manager&#xff0c;卸载里面所有NI的东西 &#xff08;https://www.ni.com/zh-cn/support/downloads/software-products/download.package-manager.html#32…

❀五一劳动节来啦❀

今年“五一”&#xff0c;4月29日至5月3日放假调休&#xff0c;共5天。 如果你在5月4日到5月6日请假3天&#xff0c;加上5月7日周日&#xff0c;就可以形成9天的假期。 一&#xff0c;五一劳动节的由来⭐ 国际劳动节又称“五一国际劳动节”“国际示威游行日”&#xff08;英语…