面向初学者的指南:创建时间序列预测 (使用Python和R代码)

17 篇文章 1 订阅

概览:

  • 学习创建时间预测序列的步骤
  • 额外关注 Dickey-Fuller test & ARIMA(自回归移动平均) 模型
  • 从理论上学习这些概念,以及它们在python中的实现

介绍

时间序列(从现在开始称为TS)被认为是数据科学领域中不太为人所知的技能之一(就连我几天前也对它知之甚少)。我开始了一段新的学习旅程,学习解决时间序列问题的基本步骤,现在我和大家分享一下。这些绝对会帮助你在未来的项目中得到一个不错的模型!

在阅读本文之前,我强烈建议阅读关于R中的时间序列建模的完整教程,并学习自由时间序列预测课程。它侧重于基本概念,我将重点介绍如何使用这些概念来解决端到端问题,以及Python中的代码。R中有很多时间序列的资源,但是很少有Python的资源,所以我将在本文中使用Python。

我们的旅程将经过以下步骤:

  1. 是什么让时间序列如此特别?
  2. Pandas 记载并处理时间序列
  3. 如何检验时间序列的平稳性?
  4. 如何使时间序列平稳?
  5. 预测时间序列

1. 是什么让时间序列如此特别?

顾名思义,TS是按固定的时间间隔收集的数据点的集合。这些分析是为了确定长期趋势,以便预测未来或进行其他形式的分析。但是TS和常规回归问题有什么不同呢?有两件事:

  1. 它与 时间 有关。所以线性回归模型的基本假设即观测值是独立的在这种情况下并不成立。
  2. 随着增加或减少的趋势,大多数 TS 具有某种形式的 季节性(seasonality trends) 趋势,即特定于特定时间段的变化。例如,如果你看到一件羊毛夹克的销量随着时间的推移,你一定会发现冬季的销量更高。

由于 TS 的固有性质,分析它涉及到很多步骤。下面将详细讨论这些问题。让我们从用Python加载一个TS对象开始。我们将使用流行的航空乘客数据集,可以在这里下载

2. 用 Pandas 加载并处理时间序列

Pandas有专门的库来处理TS对象,特别是 datatime64[ns] 类,它存储时间信息并允许我们快速执行某些操作。让我们从引入所需的库开始:

import pandas as pd
import numpy as np
import matplotlib.pylab as plt
%matplotlib inline
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 15, 6

现在,我们可以加载数据集,看看列的一些初始行和数据类型:

data = pd.read_csv('AirPassengers.csv')
print data.head(n = 10) # 默认 n为5
print '\n Data Types:'
print data.dtypes

在这里插入图片描述

数据包含一个特定的月份和该月的乘客数量。但是由于数据类型是“object”和“int”,所以它仍然不是作为TS对象读取的。为了将数据读取为时间序列,我们必须将特殊参数传递给read_csv命令:

dateparse = lambda dates: pd.datetime.strptime(dates, '%Y-%m')
data = pd.read_csv('AirPassengers.csv', parse_dates=['Month'], index_col='Month',date_parser=dateparse)
print data.head()

在这里插入图片描述

让我们一个一个的来理解这些参数:

  1. parse_dates:指定包含日期-时间信息的列。正如我们上面所说,列名是’ Month '。
  2. index_col:将panda用于TS数据背后的一个关键思想是,索引必须是描述日期-时间信息的变量。所以这个参数告诉熊猫使用“Month”列作为索引。
  3. date_parser:指定一个函数,该函数将输入字符串转换为datetime变量。默认情况下,熊猫读取的数据格式为“YYYY-MM-DD HH:MM:SS”。如果数据不是这种格式,则必须手动定义格式。类似于这里定义的dataparse函数可以用于此目的。

现在我们可以看到数据的索引是time对象,列是#passenger。我们可以用以下命令交叉检查索引的数据类型:

data.index

在这里插入图片描述
注意,dtype= 'datetime[ns] ’ 确认它是一个datetime对象。作为个人偏好,我将把列转换成一个Series对象,以防止每次使用TS时引用列名。

ts = data['#Passengers'] 
ts.head(10)

在这里插入图片描述

在进一步讨论之前,我将讨论一些用于TS数据的索引技术。让我们从选择Series对象中的一个特定值开始。这可以通过以下两种方式实现:

#1. Specific the index as a string constant:
ts['1949-01-01']

#2. Import the datetime library and use 'datetime' function:
from datetime import datetime
ts[datetime(1949,1,1)]

两者都将返回值“112”,这也可以从以前的输出中确认。假设我们想要到1949年5月为止的所有数据。这可以通过两种方式实现:

#1. Specify the entire range:
ts['1949-01-01':'1949-05-01']

#2. Use ':' if one of the indices is at ends:
ts[:'1949-05-01']

两者都会产生以下输出:
在这里插入图片描述

这里有两件事需要注意:

  1. 与数字索引不同,这里 包含了结束索引。例如,如果我们将列表索引为[:5],那么它将返回索引处的值-[0,1,2,3,4]。但是这里的输出中包含索引 ‘1949-05-01’。
  2. 索引必须按照范围排序。如果随机打乱索引,这将不起作用。

考虑另一个需要1949年所有值的例子。可以这样做:

ts['1949']

在这里插入图片描述

月份部分被省略了。同样,如果你把某一个月的所有日子都算上,则可以省略day部分。
现在,我们继续分析TS。

3.如何检查时间序列的平稳性?

如果TS的 统计特性 (如均值、方差) 随时间保持不变,它就被称为平稳的。但是为什么它很重要呢?大多数的TS模型都假设TS是平稳的。直观地说,我们可以认为,如果TS随着时间的推移具有特定的行为,那么它很有可能在未来也会遵循同样的行为。与非平稳级数相比,平稳级数的相关理论更加成熟,易于实现。

平稳性是用非常严格的准则来定义的。然而,在实际应用中,我们可以假设这个级数是平稳的,如果它在一段时间内具有恒定的统计特性。以下几点:

  1. 常数平均值
  2. 常数方差
  3. 不依赖于时间的自协方差。

我将跳过细节,因为它在本文中定义得非常清楚。让我们继续测试平稳性的方法。首先也是最重要的是简单地绘制数据图并进行可视化分析。数据可以使用以下命令绘制:

plt.plot(ts)

在这里插入图片描述

很明显,数据中有一个总的 增长趋势,同时也有一些季节变化。然而,可能并不总是能够做出这样的视觉推断(我们稍后将看到这样的情况)。因此,更正式地说,我们可以使用以下方法检查平稳性:

  1. 绘制滚动统计:我们可以绘制移动平均或移动方差,看看它是否随时间而变化。我说的移动平均/方差是指在任何时刻t,我们取去年的平均/方差,即过去12个月。但这更像是一种视觉技巧。
  2. Dickey-Fuller检验:这是检验平稳性的统计检验之一。这里零假设是 TS 是非平稳的。测试结果由 测试统计数据 和一些不同置信水平的临界值组成。如果“检验统计量”小于“临界值”,我们可以拒绝零假设,认为序列是平稳的。详情请参阅本文

在这一点上,这些概念听起来可能不是很直观。我建议阅读前传的文章(查阅相关资料进一步深入理解)。如果你对一些理论统计学感兴趣,你可以参考Brockwell和Davis的 时间序列导论和预测。这本书的统计数据有点多,但如果你有阅读字里行间的技巧,你就能理解其中的概念,并间接地接触到统计数据。

回到检查平稳性,我们将经常使用滚动统计图和Dickey-Fuller测试结果,所以我定义了一个函数,它接受TS作为输入并为我们生成它们。请注意,我画的是标准差而不是方差来保持单位接近均值。

from statsmodels.tsa.stattools import adfuller
def test_stationarity(timeseries):
    
    #Determing rolling statistics
    rolmean = pd.rolling_mean(timeseries, window=12)
    rolstd = pd.rolling_std(timeseries, window=12)

    #Plot rolling statistics:
    orig = plt.plot(timeseries, color='blue',label='Original')
    mean = plt.plot(rolmean, color='red', label='Rolling Mean')
    std = plt.plot(rolstd, color='black', label = 'Rolling Std')
    plt.legend(loc='best')
    plt.title('Rolling Mean & Standard Deviation')
    plt.show(block=False)
    
    #Perform Dickey-Fuller test:
    print 'Results of Dickey-Fuller Test:'
    dftest = adfuller(timeseries, autolag='AIC')
    dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
    for key,value in dftest[4].items():
        dfoutput['Critical Value (%s)'%key] = value
    print dfoutput

代码非常简单。如果您在掌握代码方面遇到困难,请在评论中讨论代码。

让我们运行输入序列:

test_stationarity(ts)

在这里插入图片描述
虽然标准差的变化很小,但均值明显随时间增加,这不是一个平稳序列。此外,测试统计量远远超过临界值。注意,应该比较带符号的值,而不是绝对值。

接下来,我们将讨论使TS趋于平稳性的技术。

4. 如何使时间序列平稳?

虽然在许多TS模型中采用了平稳性假设,但几乎没有一个实际的时间序列是平稳的。统计学家已经找到了使序列平稳的方法,我们现在就来讨论。实际上,让一个级数完全静止几乎是不可能的,但我们试着让它尽可能地接近。

让我们来理解是什么使TS非平稳。TS不稳定的主要原因有两个:

  1. 随时间变化的趋势平均值。例如,在这个例子中,我们看到平均来说,乘客的数量随着时间在增长。
  2. 季节性——特定时间段的变化。由于工资的增加或节日的缘故,人们在特定的月份可能会有买车的倾向。

其基本原理是对序列中的趋势和季节性进行建模或估计,并将其从序列中去除,得到一个平稳序列。在此基础上,应用统计预测技术对该系列产品进行预测。最后一步是通过应用趋势和季节约束将预测值转换为原始规模。注意:我将讨论一些方法。有些可能在这种情况下工作得很好,而另一些则不然。但我们的想法是掌握所有的方法,而不是只关注手头的问题。让我们从趋势部分开始。

估计和消除趋势

减少趋势的首要技巧之一是转变。例如,在这种情况下,我们可以清楚地看到,有一个显著的积极趋势。所以我们可以用变换来惩罚更大的值而不是更小的值。可以取对数,平方根,立方根,等等。为了简单起见,我们在这里做一个对数变换:

ts_log = np.log(ts)
plt.plot(ts_log)

在这里插入图片描述
在这个更简单的例子中,很容易看到数据中的正向趋势。但在有噪声的情况下,它不是很直观。因此,我们可以使用一些技术来估计或建模这种趋势,然后将其从系列中删除。有很多方法可以做到这一点,其中最常用的有:

  1. 汇总—取一段时间内的平均值,如月/周平均值
  2. 平滑——取滚动平均线
  3. 多项式拟合-拟合回归模型

我将在这里讨论平滑,您也应该尝试其他技术,这可能会解决其他问题。平滑是指采用滚动估计,即考虑过去的几个例子。有很多种方法,但我将在这里讨论其中的两种。

移动平均数

在这种方法中,我们根据时间序列的频率取“k”连续值的平均值。这里我们可以取过去一年的平均值,也就是最近12个值。panda定义了用于确定滚动统计数据的特定函数。

moving_avg = pd.rolling_mean(ts_log,12)
plt.plot(ts_log)
plt.plot(moving_avg, color='red')

在这里插入图片描述
红线表示滚动平均值。从原级数中减去这个。注意,由于我们取最后12个值的平均值,所以前11个值没有定义滚动平均值。这可以观察到:

ts_log_moving_avg_diff = ts_log - moving_avg
ts_log_moving_avg_diff.head(12)

在这里插入图片描述
注意前11位是Nan。让我们删除这些NaN值,并检查这些图以测试平稳性

ts_log_moving_avg_diff.dropna(inplace=True)
test_stationarity(ts_log_moving_avg_diff)

在这里插入图片描述
这个级数看起来好多了。滚动值似乎略有变化,但没有特定的趋势。同时,检验统计量 小于5%的临界值 所以我们可以有95%的信心说这是一个平稳序列。

然而,这种特殊方法的缺点是必须严格定义时间段。在这种情况下,我们可以取年平均水平,但在预测股票价格等复杂情况下,很难得出一个数字。因此,我们采用“加权移动平均”,即赋予较近期值较高的权重。可以有许多技术来分配权重。一种流行的方法是 指数加权移动平均法,它将权重分配给所有具有衰减因子的先前值。在这里找到详细信息。这可以在panda中实现为:

expwighted_avg = pd.ewma(ts_log, halflife=12)
plt.plot(ts_log)
plt.plot(expwighted_avg, color='red')

在这里插入图片描述
注意,这里使用参数“半衰期”来定义指数衰减的数量。这只是一个假设,主要取决于业务领域。其他参数,如跨度和质心也可以用来定义衰减,这是讨论在上面共享的链接。现在,让我们把这个从级数中移除,并检查平稳性:

ts_log_ewma_diff = ts_log - expwighted_avg
test_stationarity(ts_log_ewma_diff)

在这里插入图片描述
这个TS在平均值和标准差上的变化更小。同时,测试统计量 小于1%的临界值,优于前一种情况。注意,在这种情况下,不会缺少值,因为从一开始所有的值都是给定权重的。所以即使没有之前的值,它也能工作。

消除趋势和季节性

前面讨论的简单趋势减少技术并不是在所有情况下都有效,特别是那些具有高季节性的技术。让我们讨论两种消除趋势和季节性的方法:

  1. 差分-在特定的时间间隔内进行差分
  2. 分解——对趋势和季节性进行建模,并将它们从模型中移除。

区别:
差分处理趋势和季节性的最常见方法之一。在这种方法中,我们取某一时刻的观测值与前一时刻的观测值之差。这在提高平稳性方面很有效。一阶差分可以在 Pandas 中运行:

ts_log_diff = ts_log - ts_log.shift()
plt.plot(ts_log_diff)

在这里插入图片描述
这似乎大大降低了趋势。让我们用我们的图来验证:

ts_log_diff.dropna(inplace=True)
test_stationarity(ts_log_diff)

在这里插入图片描述
我们可以看到,平均值和std随时间的变化有很小的变化。此外,Dickey-Fuller检验统计量小于10%的临界值,因此TS是稳定的,有90%的置信度。我们也可以采取二阶或三阶的差异,这可能在某些应用中得到更好的结果。我把它们留给你去尝试。

分解
在这种方法中,趋势和季节性分别建模,并返回系列的其余部分。我将跳过统计数据,来看一下结果:

from statsmodels.tsa.seasonal import seasonal_decompose
decomposition = seasonal_decompose(ts_log)

trend = decomposition.trend
seasonal = decomposition.seasonal
residual = decomposition.resid

plt.subplot(411)
plt.plot(ts_log, label='Original')
plt.legend(loc='best')
plt.subplot(412)
plt.plot(trend, label='Trend')
plt.legend(loc='best')
plt.subplot(413)
plt.plot(seasonal,label='Seasonality')
plt.legend(loc='best')
plt.subplot(414)
plt.plot(residual, label='Residuals')
plt.legend(loc='best')
plt.tight_layout()

在这里插入图片描述
这里我们可以看到趋势,季节性从数据中分离出来我们可以对残差进行建模。检验残差的平稳性:

ts_log_decompose = residual
ts_log_decompose.dropna(inplace=True)
test_stationarity(ts_log_decompose)

在这里插入图片描述
Dickey-Fuller检验统计量显著低于1%的临界值。所以这个TS非常接近于静止。您还可以尝试高级分解技术,这些技术可以生成更好的结果。另外,您应该注意,在这种情况下,将残差转换为未来数据的原始值并不十分直观。

5.预测时间序列

我们看到了不同的技术它们都能很好地使 TS 静止。让我们在差分后的TS上做模型,因为这是一种非常流行的技术。此外,在这种情况下,在预测残差中添加噪声和季节性因素也相对容易。执行趋势和季节估计技术后,可以出现两种情况:

  1. 一个严格平稳的序列,各值之间不依赖。这是一个简单的例子,我们可以把残差建模为白噪声。但这种情况非常罕见。
  2. 值之间具有显著相关性的序列。在这种情况下,我们需要使用一些统计模型,如ARIMA来预测数据。

让我给你简单介绍一下ARIMA。我不会详细介绍技术细节,但是如果您希望更有效地应用这些概念,您应该详细了解这些概念。ARIMA代表自回归综合移动平均线。平稳时间序列的ARIMA预测只不过是一个线性(类似于线性回归)方程。预测因子依赖于ARIMA模型的参数(p,d,q):AR(自回归)项数§:

  1. AR项只是因变量的滞后。例如,如果p是5,那么x(t)的预测器将是x(t-1)……x(t-5)。
  2. MA(移动平均)项数(q): MA项是预测方程中的滞后预测误差。例如,如果q是5,x(t)的预测因子将是e(t-1)…e(t-5)其中e(i)是第i个时刻的移动平均线与实际值之间的差值。
  3. 差异数量(d):这些是非季节性差异的数量,即在本例中我们取一阶差异。所以我们要么传递这个变量,让d=0,要么传递原始变量,让d=1。两者将产生相同的结果。

这里的一个重要问题是如何确定“p”和“q”的值。我们用两个图来确定这些数字。让我们先讨论一下。

  1. 自相关函数(ACF):它是一种度量TS与自身滞后版本之间相关性的方法。例如,在滞后5时,ACF会将瞬时“t1”…“t2”的序列与瞬时“t1-5”…“t2”的序列进行比较(t1-5和t2是端点)。
  2. 部分自相关函数(PACF):该函数测量TS与自身滞后版本之间的相关性,但在消除了已经由中间比较解释的变化之后。在滞后5时,它将检查相关性,但删除已经由滞后1到滞后4解释的影响。

经差分后的TS的ACF和PACF图可以绘制为:

#ACF and PACF plots:
from statsmodels.tsa.stattools import acf, pacf

lag_acf = acf(ts_log_diff, nlags=20)
lag_pacf = pacf(ts_log_diff, nlags=20, method='ols')

#Plot ACF: 
plt.subplot(121) 
plt.plot(lag_acf)
plt.axhline(y=0,linestyle='--',color='gray')
plt.axhline(y=-1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
plt.axhline(y=1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
plt.title('Autocorrelation Function')

#Plot PACF:
plt.subplot(122)
plt.plot(lag_pacf)
plt.axhline(y=0,linestyle='--',color='gray')
plt.axhline(y=-1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
plt.axhline(y=1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
plt.title('Partial Autocorrelation Function')
plt.tight_layout()

在这里插入图片描述
在这个图中,0两边的虚线是置信区间。这些可以用来确定“p”和“q”的值如下:

  1. p - PACF图第一次越过上置信区间时的滞后值。如果你仔细观察,这里p=2。
  2. q - ACF图第一次越过上置信区间时的滞后值。如果你仔细观察,这里q=2。

现在,让我们制作3种不同的ARIMA模型,考虑单独的和组合的效果。我还将为每个人打印RSS。请注意,这里的RSS用于残差值,而不是实际的系列。

我们需要先加载ARIMA模型:

from statsmodels.tsa.arima_model import ARIMA

可以使用ARIMA的order参数指定p、d、q值,该参数接受一个元组(p、d、q)。让我们对这3种情况建模:

AR MODEL

model = ARIMA(ts_log, order=(2, 1, 0))  
results_AR = model.fit(disp=-1)  
plt.plot(ts_log_diff)
plt.plot(results_AR.fittedvalues, color='red')
plt.title('RSS: %.4f'% sum((results_AR.fittedvalues-ts_log_diff)**2))

在这里插入图片描述

MA Model

model = ARIMA(ts_log, order=(0, 1, 2))  
results_MA = model.fit(disp=-1)  
plt.plot(ts_log_diff)
plt.plot(results_MA.fittedvalues, color='red')
plt.title('RSS: %.4f'% sum((results_MA.fittedvalues-ts_log_diff)**2))

在这里插入图片描述

Combined Model

model = ARIMA(ts_log, order=(2, 1, 2))  
results_ARIMA = model.fit(disp=-1)  
plt.plot(ts_log_diff)
plt.plot(results_ARIMA.fittedvalues, color='red')
plt.title('RSS: %.4f'% sum((results_ARIMA.fittedvalues-ts_log_diff)**2))

在这里插入图片描述

在这里,我们可以看到AR和MA模型拥有几乎相同的RSS,但是合并起来要好得多。现在,我们只剩下最后一步,即将这些值恢复到原来的比例。

回到原来的比例

由于组合模型给出了最佳结果,因此我们可以将其缩放回原始值并查看其在那里的表现。第一步是将预测结果存储为单独的系列并观察它。

predictions_ARIMA_diff = pd.Series(results_ARIMA.fittedvalues, copy=True)
print predictions_ARIMA_diff.head()

在这里插入图片描述
您可以使用以前的输出快速进行一些回溯计算,以检查这些计算是否正确。接下来我们要把它们加到底数上。为此,让我们创建一个以所有值为基数的系列,并将差异添加到其中。可以这样做:

predictions_ARIMA_log = pd.Series(ts_log.ix[0], index=ts_log.index)
predictions_ARIMA_log = predictions_ARIMA_log.add(predictions_ARIMA_diff_cumsum,fill_value=0)
predictions_ARIMA_log.head()

在这里插入图片描述
这里第一个元素是基数本身,并且从那里累加的值。最后一步是取指数并与原始系列进行比较。

predictions_ARIMA = np.exp(predictions_ARIMA_log)
plt.plot(ts)
plt.plot(predictions_ARIMA)
plt.title('RMSE: %.4f'% np.sqrt(sum((predictions_ARIMA-ts)**2)/len(ts)))

在这里插入图片描述

这些都是用Python编写的。让我们学习如何在R中实现时间序列预测。
第一步:读取数据并计算基本总结
输出

class(tsdata)
"ts"
> #Observations of the time series data
> tsdata
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1949 112 118 132 129 121 135 148 148 136 119 104 118
1950 115 126 141 135 125 149 170 170 158 133 114 140
1951 145 150 178 163 172 178 199 199 184 162 146 166
1952 171 180 193 181 183 218 230 242 209 191 172 194
1953 196 196 236 235 229 243 264 272 237 211 180 201
1954 204 188 235 227 234 264 302 293 259 229 203 229
1955 242 233 267 269 270 315 364 347 312 274 237 278
1956 284 277 317 313 318 374 413 405 355 306 271 306
1957 315 301 356 348 355 422 465 467 404 347 305 336
1958 340 318 362 348 363 435 491 505 404 359 310 337
1959 360 342 406 396 420 472 548 559 463 407 362 405
1960 417 391 419 461 472 535 622 606 508 461 390 432
> #Summary of the data and missi

tsdata was converted to a data frame
Data Frame Summary 
tsdata 
Dimensions: 144 x 1 
Duplicates: 26

----------------------------------------------------------------------------------------------------
No Variable Stats / Values Freqs (% of Valid) Graph Valid Missing 
---- ---------- -------------------------- ----------------------- --------------------- -------- --
1 tsdata Mean (sd) : 280.3 (120) 118 distinct values . : . 144 0 
[ts] min < med < max: Start: 1949-01 : : . . : (100%) (0%) 
104 < 265.5 < 622 End : 1960-12 : : : : : 
IQR (CV) : 180.5 (0.4) : : : : : : : 
: : : : : : : : . . 
----------------------------------------------------------------------------------------------------

步骤2:检查时间序列数据的循环,绘制原始数据
输出

cycle(tsdata)
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1949 1 2 3 4 5 6 7 8 9 10 11 12
1950 1 2 3 4 5 6 7 8 9 10 11 12
1951 1 2 3 4 5 6 7 8 9 10 11 12
1952 1 2 3 4 5 6 7 8 9 10 11 12
1953 1 2 3 4 5 6 7 8 9 10 11 12
1954 1 2 3 4 5 6 7 8 9 10 11 12
1955 1 2 3 4 5 6 7 8 9 10 11 12
1956 1 2 3 4 5 6 7 8 9 10 11 12
1957 1 2 3 4 5 6 7 8 9 10 11 12
1958 1 2 3 4 5 6 7 8 9 10 11 12
1959 1 2 3 4 5 6 7 8 9 10 11 12
1960 1 2 3 4 5 6 7 8 9 10 11 12

在这里插入图片描述
步骤3:分解时间序列数据
输出
在这里插入图片描述
步骤4:测试数据的平稳性

Augmented Dickey-Fuller Test

data: tsdata
Dickey-Fuller = -7.3186, Lag order = 5, p-value = 0.01
alternative hypothesis: stationary

p值为0.01,即<0.05,因此我们拒绝零假设,因此时间序列是平稳的。

在这里插入图片描述
最大滞后时间为1个月或12个月,与12个月周期呈正相关。
自动绘制排除NA值的7:138随机时间序列观测值
在这里插入图片描述
第五步:模型拟合
在这里插入图片描述

Series: tsdata 
ARIMA(2,1,1)(0,1,0)[12]

Coefficients:
ar1 ar2 ma1
0.5960 0.2143 -0.9819
s.e. 0.0888 0.0880 0.0292

sigma^2 estimated as 132.3: log likelihood=-504.92
AIC=1017.85 AICc=1018.17 BIC=1029.35

在这里插入图片描述
第六步:预测
在这里插入图片描述
最后给出了原尺度下的预测结果。我认为这不是一个很好的预测但是你的想法是对的?现在,我让您进一步完善方法并做出更好的解决方案。

一些推荐的工程:
现在,是时候大胆尝试一下,实际操作一些其他真实的数据集了。那么你准备好接受挑战了吗?测试这篇文章中讨论的技术,并通过以下实践问题加速时间序列分析的学习:

在这里插入图片描述Practice Problem: Food Demand Forecasting Challenge 对某外卖公司的餐饮需求进行预测
在这里插入图片描述Practice Problem: Time Series Analyses 预测城市轨道交通的客运量

写在最后

通过本文,我试图为您提供一种解决时间序列问题的标准方法。这是最好的时机,因为今天是我们的 Mini DataHack,它将挑战您解决一个类似的问题。我们讨论了平稳性的概念,如何用一个更接近平稳性的时间序列最后预测残差。这是一个漫长的旅程,我跳过了一些统计细节,我鼓励你使用建议的材料参考。如果不想复制粘贴,可以从我的GitHub存储库下载包含所有代码的iPython笔记本。

我希望本文能够帮助您在今天实现一个好的first solution。所有最好的人!

你喜欢这篇文章吗?今天的黑客马拉松有什么用?有什么事困扰着你,你想进一步讨论吗?请随时发表评论,我将非常乐意讨论。

Note – The discussions of this article are going on at AV’s Discuss portal. Join here!

翻译自:A comprehensive beginner’s guide to create a Time Series Forecast (with Codes in Python and R)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值