R 语言中的时间序列分析

Series vs Lags plot

作者Anber Arif

在当今数据驱动的世界中,时间序列数据正变得越来越普遍。这种在不同时间点收集的数据类型被用于各种应用,从财务预测到预测客户行为。随着时间序列数据的重要性日益增加,公司正在寻找能够帮助他们理解数据的工具和技术。

其中一个工具是R,这是一种专为统计计算和图形设计的编程语言。R 是一种开源语言,被数据科学家、统计学家和研究人员(以及 Google、Uber 或 Facebook 的开发人员)广泛用于数据分析和可视化。其强大的功能和丰富的包库使其成为时间序列分析的理想选择。

在本文中,您将学习在 R 中分析时间序列数据的基础知识。我们将介绍时间序列分析中使用的关键概念和技术,包括数据探索、季节性和趋势检测以及预测。到本文结束时,您将对如何使用 R 分析时间序列数据并从中提取见解有一个扎实的理解。

什么是时间序列分析?

时间序列数据是随时间推移记录的观测值集合,每个观测值都与特定的时间点相关联。此类数据具有时间维度,在数据随时间推移而累积的业务环境中很常见。它是分析趋势、识别模式和检测给定变量内季节性的宝贵工具。时间序列数据在财务分析、经济预测和机器学习中得到广泛应用

例如,股票价格、汇率和销售额都是时间序列数据的例子。通过分析这些数据,我们可以深入了解这些变量是如何演变的,并对其未来的行为做出明智的预测。

时间序列分析

时间序列分析涉及时间数据的可视化和建模,以揭示潜在的模式和趋势。通过图表等技术,您可以绘制随时间推移的数据点,并识别重复的模式和波动。这些可视化,例如时间序列图,可以深入了解变量随时间推移的变化情况,有助于理解数据动态。

时间序列分析通常有两种主要类型

  • 探索性分析

  • 预测性分析

探索性分析

时间序列数据环境下的探索性分析的根本目的是理解和描述数据集中固有的潜在模式。它涉及几种专门为时间序列数据量身定制的技术,以揭示关键组成部分,如趋势、季节性、周期性和不规则性。

分解

探索性分析中的主要技术之一是分解。这种方法将时间序列数据分解成其组成部分:趋势、季节性、周期性和不规则性。

  • 趋势:趋势成分代表数据的长期运动或方向性,表明数据随时间推移是增加、减少还是稳定。

  • 季节性:季节性是指数据中以固定间隔发生的周期性波动或模式,通常对应于季节性变化,如月度或年度周期。

  • 周期性:周期性捕捉到持续时间长于季节性但短于总体趋势的重复模式。这些周期可能没有固定的间隔,持续时间也可能不同。

  • 不规则性:不规则性是指数据中无法归因于趋势、季节性或周期性的随机波动或噪声。

季节性相关性分析

时间序列探索性分析的另一个重要方面是季节性相关性分析。这种技术旨在识别数据中季节性周期的可能长度。

  • 分析师检查观察到的数据与其滞后版本之间的相关性,考虑对应于潜在季节性周期的不同时间滞后。

  • 通过识别特定滞后间隔处的显著相关性,分析师可以推断出数据中存在的季节性周期的可能长度。

  • 这些信息对于理解数据集中固有的周期性模式和变化至关重要,使分析师能够就建模和预测做出明智的决策。

预测性分析

预测性分析与探索性分析相对应,侧重于利用历史数据开发可以预测未来行为的模型。这种方法在分析师试图根据过去观察结果预测趋势、模式或结果的情况下特别有用。

在预测性分析中,分析师采用各种统计和机器学习技术来构建模型,以捕捉历史数据中存在的关联性和依赖性。这些模型使用过去的观察结果及其相应的结果进行训练,使其能够学习模式并对未来行为做出预测。有几种方法常用于时间序列数据的预测性分析

线性回归

线性回归是一种统计技术,用于对因变量和一个或多个自变量之间的关系进行建模。在时间序列分析的背景下,线性回归可以应用于根据历史趋势和模式预测未来值。

分解预测

在分解技术的基础上,分解预测涉及使用分解后的成分(例如,趋势、季节性)来预测时间序列的未来值。这种方法考虑了数据的潜在趋势和季节性模式。

ARIMA 模型

ARIMA(自回归综合移动平均)模型广泛用于时间序列预测。它们结合了自回归和移动平均成分,以捕捉数据中的时间依赖性和波动性。ARIMA 模型用途广泛,可以适应各种类型的时间序列数据。

了解更多信息

用于 R 的 TSstudio 包

用于 R 的 TSstudio 包是与时间序列数据相关的分析函数和绘图工具的集合。该软件包在MIT 许可证下可用,这是一个宽松的自由软件许可证,允许用户使用、复制、修改、合并、发布、分发、再许可和/或出售该软件的副本,而无需支付任何版税或额外费用。MIT 许可证的唯一要求是在任何副本或实质性使用该软件时都必须包含许可证署名。

TSstudio软件包包含用于时间序列分析的各种函数和工具,包括用于探索性分析的函数(如分解和季节性相关性分析)以及用于预测分析的函数(如线性回归、分解投影和 ARIMA 模型)。

该软件包还包括用于可视化时间序列数据的几种绘图工具,如时间序列图和自相关图。有关TSstudio软件包及其许可证的更多信息,请点击此处。要探索详细的功能和使用指南,请查看TSstudio软件包参考手册

安装

要安装TSstudio软件包,您可以使用R中的install.packages函数

install.packages("TSstudio")

安装软件包后,您可以使用库函数将其加载到R会话中

library(TSstudio)

数据

R中的AirPassengers数据集是一个时间序列数据集,表示从1949年1月到1960年12月的每月国际航空公司乘客数量。它包含144个观测值,每年12个观测值。以下是加载和探索AirPassengers数据集的方法

# Load the dataset
data(AirPassengers)

# Get the dataset info
ts_info(AirPassengers)

A description of the AirPassengers dataset

要绘制AirPassengers数据集的时间序列图,我们可以利用R中TSstudio软件包中的ts_plot()函数。该软件包提供了一系列专为时间序列分析和可视化而设计的工具。

# Plot the time-series graph
ts_plot(AirPassengers,title = "Air Passengers Over the Years",
        Ytitle = "Number of Air Passengers')",
        Xtitle = "Year")

Plot of air passengers over the years

有关更多信息,请深入了解实用教程和示例,以获得有关有效使用TSstudio软件包的动手指导和见解。

使用R进行探索性分析

探索性分析旨在通过描述性方法揭示时间序列的关键特征。在此阶段,我们主要关注的是

  1. 趋势类型的确定

  2. 季节性模式的识别

  3. 噪声数据的检测

这些见解可以更深入地了解历史数据,对于预测未来趋势非常宝贵。

序列分解

我们的第一步是将序列分解为三个组成部分:趋势、季节性和随机性。我们使用ts_decompose函数来实现这一点,该函数为stats软件包中的decompose函数提供了一个交互式界面。

A plot of the decomposition of additive time series

让我们分解这个分解图的每个组成部分

  • **趋势:**趋势组成部分表示数据中的总体方向或模式。在这种情况下,趋势组成部分正在增加,表明航空乘客数量多年来稳步增长。趋势不是严格线性的,而是一条平缓的向上倾斜的曲线。

  • **季节性:**季节性组成部分捕获以固定间隔发生的周期性模式。在这个数据集中,有一个明显的季节性模式,峰值和谷值以规则的间隔出现。

Seasonal plot of air passengers (Detrend)

季节性模式似乎是年度的,每年有一个周期。高峰出现在夏季月份,表明夏季对航空旅行的需求更高。低谷出现在冬季月份,表明冬季的需求较低。

  • **噪声(随机):**噪声组成部分表示数据中不能归因于趋势和季节性组成部分的不规则或残差变化。在此图中,与趋势和季节性组成部分相比,噪声相对较小,表明模型已捕获数据中的大部分潜在模式。

  • **观察值:**这是原始的时间序列数据,它结合了趋势、季节性和随机性组成部分。

季节性相关性

季节性相关性是一种统计技术,用于分析在给定的滞后或时间段后数据之间的相似性。它对于表现出季节性模式的时间序列数据特别有用,因为它可以帮助识别数据的有意义的周期性。这种方法的关键组成部分是

  • **滞后期:**滞后是指两个数据点之间的时间段或间隔。在季节性相关的背景下,滞后用于衡量季节性周期中两个数据点之间的时间差。例如,如果数据是月度的,则滞后4表示4个月的时间段,而滞后12表示一年的时间段。

  • **相关系数:**相关系数衡量两个变量之间关系的强度和方向。在季节性相关性分析中,相关性是在以不同滞后期分隔的观测值之间计算的。相关系数的范围可以从**-1**到**1**,其中值1表示完美的正相关,值-1表示完美的负相关,值0表示不相关。

  • **季节性相关图:**季节性相关图是在给定滞后后数据点之间相关系数的图形表示。它通常以折线图的形式呈现,x轴表示滞后,y轴表示相关系数。该图可以通过突出显示与零显着不同的滞后相关值来帮助识别数据的有意义的周期性。

高相关滞后值表示数据中的周期性行为。这意味着数据在一段时间内表现出重复的模式。例如,如果数据是月度的,并且滞后相关值在滞后12处很高,则表明数据表现出一年的周期。高相关滞后值可以帮助识别季节性模式并预测未来的数据点。

相关性分析

ts_cor()函数计算给定时间序列数据集的自相关函数(**ACF**)和偏自相关函数(**PACF**)。这些函数测量时间序列与其滞后值之间的相关性,从而深入了解数据中的时间依赖性和模式。

ts_cor(AirPassengers, lag.max = 40)

ACF and PACF plots (air passengers)

ACF图显示了时间序列与其自身滞后值的相关性。在此图中,我们可以观察到

  • 在滞后0处,相关性为1,这是预期的,因为它就是原始序列。

  • 在滞后1处,相关性为0.75,表明与前一时期存在强正相关。

  • 在滞后12处,出现了一个显着的峰值,表明存在一个周期为12的强季节性成分。

  • 在滞后12之后,相关性逐渐降低,但在某些滞后仍然为正,表明过去值的影响挥之不去。

PACF图显示了在消除中间滞后的影响后,时间序列与其滞后值之间的相关性。在此图中,我们可以观察到

  • 在滞后0处,相关性为1,这是预期的,因为它就是原始序列。

  • 在滞后1处,相关性为0.75,与ACF图相似。

  • 在滞后12处,出现了一个显着的峰值,与ACF图相似,表明存在一个周期为12的强劲季节性成分。

  • 在滞后12之后,相关性迅速下降到接近于零,表明在考虑了滞后12的影响后,几乎没有剩余的相关性。

我们还可以使用ts_lags()函数来识别序列与其滞后之间的关系。

ts_lags(AirPassengers)

Series vs Lags plot

使用R进行预测分析

预测分析是高级分析的一个分支,它使用各种统计和机器学习技术来识别数据中的模式和趋势,并对未来结果进行预测。它涉及建立统计模型,分析历史数据以识别变量之间的关系和模式。然后,这些模型将根据新数据用于预测未来事件。虽然预测分析可以成为预测和决策的强大工具,但重要的是要认识到它并非没有复杂性。以下是使用R进行预测分析时需要考虑的一些关键点

  • **模型带有数学假设:**R中的预测模型,无论是简单的线性回归还是复杂的机器学习算法,都是建立在数学假设之上的。这些假设可能包括线性、正态性、误差独立性和同方差性等。在应用模型之前,了解这些假设并评估它们是否适用于您的数据至关重要。违反这些假设会导致估计偏差和预测不准确。

  • **准确性指标并不能说明全部问题:**虽然诸如均方误差(MSE)、R平方和准确率得分之类的准确性指标提供了对预测模型性能的宝贵见解,但它们并不能说明全部问题。在评估模型性能时,必须考虑其他因素,例如可解释性、计算效率和实际相关性。在训练数据上高度准确的模型不一定能很好地推广到未见过的数据或现实场景。

  • **理解模型背后的数学原理:**为了有效地应用R中的预测模型,最好对这些模型背后的数学原理有深入的了解。这包括理解用于训练和评估模型的算法、优化技术和数学框架。

  • **调整模型和提出假设:**调整模型涉及调整超参数、选择特征和优化模型性能。了解模型背后的数学原理使从业者能够在调整过程中做出明智的决策,例如选择适当的正则化参数或特征工程技术。此外,了解模型背后的数学原理有助于提出假设来解释意外行为或模型故障,从而迭代改进预测性能。

使用TSLM的分段线性模型

分段线性模型是一种有用的技术,用于通过将数据划分为多个段并对每个段拟合一个单独的线性回归模型来捕获时间序列数据中的非线性趋势。这种方法允许捕获数据中的广泛平均趋势,同时保持简单性和可解释性。分段线性模型的关键特征如下

  • **将数据划分为“近似线性”的部分:**分段线性模型将时间序列数据划分为多个段或区间,在每个段内,预测变量(时间)和响应变量(数据值)之间的关系近似线性。

  • **对每个部分拟合一条线:**在每个段内,对数据点拟合一个线性回归模型。这涉及估计最适合该段内数据的直线的斜率(梯度)和截距。

**捕获广泛的平均趋势:**分段线性模型通过捕获每个段内的广泛平均趋势,提供了对数据中潜在趋势的简化表示。虽然这些模型可能不如更复杂的非线性模型准确,但它们易于解释和理解。

# Load AirPassengers dataset
data("AirPassengers")

# Split the dataset into training and testing sets (80-20 split)
train_data <- window(AirPassengers, end = c(1958, 12))
test_data <- window(AirPassengers, start = c(1959, 1))

# Fit the TSLM model on the training set
tslm_model <- tslm(train_data ~ trend + season)

# Generate forecasts using the fitted TSLM model on the testing set
tslm_forecast <- forecast(tslm_model, h = length(test_data))

# Evaluate the performance of the TSLM model on the test data
tslm_evaluation <- accuracy(tslm_forecast, test_data)

# Print evaluation metrics
print(tslm_evaluation)

# Combine the training and test data for plotting
combined_data <- ts(c(train_data, test_data), start = start(train_data), frequency = frequency(train_data))

# Plot the original data with fitted values and forecast
plot(combined_data, main = "TSLM Model on AirPassengers Dataset", xlim = c(1949, 1961))
lines(fitted(tslm_model), col = "red")
lines(tslm_forecast$mean, col = "blue")
legend("topright", legend = c("Original Data", "Fitted Values", "Forecast"), 
       col = c("black", "red", "blue"), lty = 1)

Query output

TSLM Model on AirPassengers Dataset

该图显示了原始数据(黑色)、拟合值(红色)和预测值(蓝色)。该模型捕获了数据中的一些潜在模式,但它并不完美。

指数平滑模型

指数平滑模型(通过**ETS**(误差、趋势、季节性)框架实现)通常用于时间序列分析中的预测。这些模型对于减少异常值和噪声数据的影响特别有用,同时仍然可以捕获数据集中潜在的趋势和模式。指数平滑模型的关键特征如下

  • **减少异常值和错误数据的影响:**指数平滑模型对观察到的数据应用平滑参数,该参数对较旧的观测值赋予较小的权重,对最近的观测值赋予较大的权重。这减少了异常值和错误数据点的影响,使模型能够专注于捕获数据集中的总体趋势和季节性。

  • **提供更稳定的模型:**通过平滑数据中的波动,指数平滑模型产生更稳定的预测,遵循数据集的总体轨迹。这种稳定性使得模型对短期波动和噪声不太敏感,从而产生更可靠的预测。

# Load necessary libraries
library(forecast)

# Load AirPassengers dataset
data("AirPassengers")

# Split the dataset into training and testing sets (80-20 split)
train_data <- window(AirPassengers, end = c(1958, 12))
test_data <- window(AirPassengers, start = c(1959, 1))

# Fit the ETS model on the training set
ets_model <- ets(train_data)

# Generate forecasts using the ETS model
ets_forecast <- forecast(ets_model, h = length(test_data))

# Plot the original data with forecasted values
plot(ets_forecast, main = "ETS Model on AirPassengers Dataset")
lines(test_data, col = "red")
legend("topright", legend = c("Forecasted Values", "Actual Values"), 
       col = c("blue", "red"), lty = 1)

# Print evaluation metrics
ets_evaluation <- accuracy(ets_forecast, test_data)
print(ets_evaluation)

以下是AirPassengers数据集生成的ETS图,以及评估指标

Query output of the ETS Model plot

ETS Model plot

ARIMA 模型

ARIMA(自回归积分滑动平均)模型是一种广泛使用的时间序列预测方法,它结合了自回归 (AR)、差分 (I) 和滑动平均 (MA) 分量。它对于建模具有线性依赖性和时间模式的时间序列数据特别有效。 ARIMA 模型的关键组件如下:

  • 自回归 (AR) 分量:自回归分量对观测值与多个滞后观测值(自回归项)之间的关系进行建模。它捕捉当前值对其先前值的线性依赖性。

  • 积分 (I) 分量:积分分量表示应用于时间序列数据的差分运算,使其变得平稳。平稳性对于 ARIMA 模型至关重要,因为它确保数据的统计属性随时间推移保持不变。

  • 滑动平均 (MA) 分量:滑动平均分量对观测值与应用于滞后观测值的滑动平均模型的残差项之间的关系进行建模。它捕捉了过去白噪声或冲击对当前值的影响。

# 加载必要的库 library(forecast)

# Load AirPassengers dataset
data("AirPassengers")

# Split the dataset into training and testing sets (80-20 split)
train_data <- window(AirPassengers, end = c(1958, 12))
test_data <- window(AirPassengers, start = c(1959, 1))

# Fit the ARIMA model on the training set
arima_model <- auto.arima(train_data)

# Generate forecasts using the ARIMA model
arima_forecast <- forecast(arima_model, h = length(test_data))

# Plot the original data with forecasted values
plot(arima_forecast, main = "ARIMA Model on AirPassengers Dataset")
lines(test_data, col = "red")
legend("topright", legend = c("Forecasted Values", "Actual Values"), 
       col = c("blue", "red"), lty = 1)

# Print evaluation metrics
arima_evaluation <- accuracy(arima_forecast, test_data)
print(arima_evaluation)

Query output for the ARIMA model

ARIMA model plot on AirPassengers dataset.

该图显示了数据集的实际值以及 ARIMA 模型生成的预测值。总体而言,ARIMA 模型捕捉了数据集的总体趋势,但实际值和预测值之间存在一些差异。

查看此有关预测方法和工具的综合指南,包括 ARIMA、ETS 和 TSLM。

总结:使用 Timescale 进行时间序列分析

时间序列分析是一种强大的工具,用于理解随时间变化的数据中的趋势、模式和季节性。像TSstudio这样的 R 包提供了复杂的时间序列分析方法,但分析的质量最终取决于数据的质量和数量。

准备好将您的时间序列分析提升到一个新的水平了吗?开始使用 Timescale,这是一个基于 PostgreSQL 的强大时间序列数据平台,可扩展以实现对大型数据集的高效分析。Timescale使您可以轻松地管理和分析时间序列数据以及业务数据,并且它与 R 和其他编程语言的兼容性使其成为数据分析的多功能工具。此外,您将能够使用更少的代码行执行更多分析,方法是使用针对查询、聚合和分析时间序列优化的超函数。  

立即注册免费试用,探索 Timescale 如何帮助您从时间序列数据中解锁洞察力。