时间序列分析是统计学和数据科学的一个基本研究领域,它为理解和预测序列数据中的模式提供了一个强大的框架。特别是时间序列数据,它捕获连续时间间隔内的信息,使分析师能够揭示趋势,季节性模式和其他时间依赖性。在时间序列分析的各个方面中,季节性的检测在揭示数据中的重复模式方面起着至关重要的作用。在本文中,我们将检测时间序列数据中的季节性并将其从数据中删除,这将使时间序列数据更适合模型训练。
什么是时间序列数据?
时间序列数据是在连续的、等间隔的时间间隔内记录的观测或测量的集合,在金融、经济、气候科学和医疗保健等各个领域都很普遍。与在单个时间点捕获观察结果的横截面数据不同,时间序列数据提供了对特定现象如何随时间演变的见解,其中每个数据点与特定时间戳相关联,形成了允许分析时间趋势和模式的序列。
什么是季节性?
季节性是指在时间序列内以固定间隔发生的重复和可预测的模式。这些模式通常遵循周期性或周期性的性质,并可能受到天气,假期或商业周期等各种因素的影响。在时间序列分析的背景下,季节性表现为在固定时间间隔(如天,月或年)内重复的周期性波动。识别季节性对于理解数据的内在结构至关重要,并有助于做出明智的决策,特别是在预测和规划方面。
为什么要检测时间序列数据中的季节性?
下面讨论一些具体原因:
- 模式识别:季节性检测允许分析人员识别和理解时间序列中的重复模式,这对于解释历史趋势和对未来行为做出明智的预测很有价值。
- 预测:季节性因素会显著影响预测准确性。通过检测季节性,分析师可以在构建预测模型时考虑这些模式,从而实现更强大和可靠的预测。
- 异常检测:季节性检测可以帮助识别数据中的异常或不规则性。突然偏离预期的季节模式可能预示着重要的事件或变化,需要进一步调查。
- 优化决策:了解季节性使组织能够根据预期的需求或其他相关指标的时间波动来优化资源分配,库存管理和营销策略。
实践案例
首先,我们将导入所有需要的Python模块,如Pandas,NumPy,Matplotlib和Seaborn等。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from statsmodels.tsa.seasonal import seasonal_decompose
数据集加载和可视化
# Load the dataset
data = pd.read_csv('AirPassengers.csv')
data['Month'] = pd.to_datetime(data['Month'], format='%Y-%m')
data.set_index('Month', inplace=True)# Plot the original time series data
plt.figure(figsize=(7, 5))
plt.plot(data, label='Original Time Series')
plt.title('Air Passengers Time Series')
plt.xlabel('Year')
plt.ylabel('Number of Passengers')
plt.legend()
plt.show()
数据分解
由于我们已经得到了时间序列图,现在我们将其分解为趋势,季节和残差分量。为此,我们需要指定季节分解函数的一些参数,如下所示:
- data:这个参数表示我们想要分解的时间序列数据,它应该在pandas Data Frame或Series中,并带有datetime索引。
- model:此参数指定要执行的分解类型,可以采用两个值“加法”或“乘法”。在这里,我们将使用“乘法”模型,因为我们可以看到季节分量的幅度在时间序列的不同水平上相对恒定(意味着模式是恒定的)。在乘法模型中,季节和趋势分量相乘而不是相加(加法模型)。
- extrapolate_trend:此参数控制是否外推趋势分量以覆盖时间序列结束时的缺失值。这里我们将其设置为“freq”,这意味着趋势分量是使用时间序列的频率来推断的。当时间序列末尾有缺失值时,外推趋势可能很有用。
# Decompose the time series into trend, seasonal and residual components
result = seasonal_decompose(data, model='multiplicative', extrapolate_trend='freq')
result.plot()
plt.suptitle('Seasonal Decomposition of Air Passengers Time Series')
plt.tight_layout()
plt.show()
可视化季节性
现在,我们将通过从分解结果中提取唯一的季节分量来可视化它。
# Plot the seasonal component
plt.figure(figsize=(6, 4))
plt.plot(result.seasonal, label='Seasonal Component')
plt.title('Seasonal Component of Air Passengers Time Series')
plt.xlabel('Year')
plt.ylabel('Seasonal Component')
plt.legend()
plt.show()
从数据中去除季节性
为了将时间序列数据用于各种目的,包括模型训练,需要具有无季节性的时间序列数据。在这里,我们将可视化它在去除季节性后的情况。
# Plotting the original data and original data without the seasonal component
plt.figure(figsize=(7, 4))
# Plot the original time series data
plt.plot(data, label='Original Time Series', color='blue')
data_without_seasonal = data['#Passengers'] / result.seasonal
# Plot the original data without the seasonal component
plt.plot(data_without_seasonal, label='Original Data without Seasonal Component', color='green')
plt.title('Air Passengers Time Series with and without Seasonal Component')
plt.xlabel('Year')
plt.ylabel('Number of Passengers')
plt.legend()
plt.show()
从图中我们可以看到,在去除季节性之后,时间序列数据变得非常有组织,这需要用于任何进一步目的的模型训练。
结论
我们可以得出结论,季节性检测并将其从数据中删除是进入模型训练阶段之前非常重要的步骤。季节性会降低预测模型的性能,这可能导致错误的预测。