时间序列——季节性检验

人工智能与算法增长营销数据库管理服务

时间序列的季节性是指数据在特定时间段内呈现出重复的模式或趋势。季节性分析通常涉及到检测和理解数据中的周期性波动,这些波动可能是由于季节性变化、节假日或其他定期事件引起的,季节性检验的好处在于它提供了深入了解时间序列中季节性模式的机会,从而进行准确的趋势分析、精准预测和有效的数据分析

1. 季节性检验

  • 季节性图:

作用:通过绘制原始数据的季节性图,可以直观地观察数据在不同时间点的季节性模式

过程:将数据按季节(例如每个月或每个季度)进行分组,然后绘制季节性图。如果在特定时间点上存在明显的周期性波动,就可能表明数据存在季节性

  • 自相关图(ACF):

作用:自相关图用于检查时间序列中的自相关性,包括季节性自相关

过程:绘制自相关图,观察在不同滞后阶数(lag)下的自相关系数。如果在滞后阶数对应于季节性的倍数处存在显著的自相关峰值,可能表示季节性模式

  • 季节性分解:

作用:使用时间序列分解方法,如加法模型或乘法模型,将数据分解为趋势、季节性和残差

过程:季节性分解后,观察季节性部分是否显示明显的周期性模式。这可以通过查看季节性成分的图表或进行统计测试来实现

  • 单位根检验:

作用:用于检验时间序列数据是否具有单位根,即是否是非平稳的。季节性通常导致非平稳性。

过程:进行单位根检验,如果结果显示数据不是平稳的,那么可能存在季节性。在进行检验时,可以考虑使用季节性差分

  • 周期性分析(周期图谱):

作用: 周期图谱用于识别时间序列中的周期性成分,包括季节性

过程: 通过计算傅里叶变换,生成频谱图,观察是否存在在频谱中与季节性周期相对应的峰值

2. 测量季节强度

2.1 测量季节强度意义

计算季节性强度的主要作用是量化季节性在时间序列中的相对强度,以便更深入地了解季节性对总体波动的贡献

2.2 季节强度计算过程:

  • STL分解:

使用STL方法对时间序列进行分解,将其拆分成趋势、季节性和残差三个部分。STL是一种广泛用于时间序列分解的方法,其中 LOESS(局部加权回归)用于拟合趋势和季节性

  • 方差计算:

计算残差和季节性的方差之和,这是通过将分解得到的残差和季节性部分相加,然后计算其方差得到,这个值代表了季节性和残差整体的波动程度

计算残差的方差,这是通过直接计算分解得到的残差部分的方差得到,这个值代表了残差的波动程度

  • 季节性强度计算:

计算季节性强度,季节性强度是通过计算残差的方差占残差和季节性的方差之和的比例,然后用1减去这个比例得到,季节性强度的值在0到1之间,越接近1表示季节性越强

3. 代码实例

3.1 数据生成


          
import numpy as np
          
import matplotlib.pyplot as plt
          
plt.rcParams['font.sans-serif'] = 'SimHei' # 设置中文显示
          
plt.rcParams['axes.unicode_minus'] = False
          

          
# 设置时间周期和数据点数
          
period = 12
          
size = 120
          

          
# 设置两个幅度参数
          
beta1 = 0.3
          
beta2 = 0.6
          

          
# 生成一个包含正弦和余弦值的数组
          
sin1 = np.asarray([np.sin(2 * np.pi * i / 12) for i in np.arange(1, size + 1)])
          
cos1 = np.asarray([np.cos(2 * np.pi * i / 12) for i in np.arange(1, size + 1)])
          

          
# 生成随机游走数据
          
xt = np.cumsum(np.random.normal(scale=0.1, size=size))
          

          
# 生成包含趋势、正弦和余弦成分以及噪声的时间序列
          
series_det = xt + beta1 * sin1 + beta2 * cos1 + np.random.normal(scale=0.1, size=size)
      

代码生成一个时间序列,包含随机游走数据、趋势、正弦和余弦成分,以及噪声

3.2 STL分解时间序列观测数据是否具有季节性


          
import statsmodels.api as sm
          

          
# 进行STL分解
          
result = sm.tsa.seasonal_decompose(series_det, period=12)
          

          
# 可视化分解结果
          
plt.figure(figsize=(12, 8))
          

          
plt.subplot(4, 1, 1)
          
plt.plot(series_det, label='原始时间序列')
          
plt.title('原始时间序列')
          

          
plt.subplot(4, 1, 2)
          
plt.plot(result.trend, label='趋势')
          
plt.title('趋势成分')
          

          
plt.subplot(4, 1, 3)
          
plt.plot(result.seasonal, label='季节性')
          
plt.title('季节性成分')
          

          
plt.subplot(4, 1, 4)
          
plt.plot(result.resid, label='残差')
          
plt.title('残差')
          

          
plt.tight_layout()
          
plt.show()
      

picture.image

可以明显看出该时间序列具有强烈的季节性,其中参数period 是用于指定季节性周期的参数,具体来说,季节性是指在时间序列中重复出现的周期性模式,比如每年、每季度或每月都可能存在某种模式,如果时间序列是按每季度观察的,那么 period=4 可能是一个合适的值,因为季节性的周期是每四个时间点重复一次。如果时间序列是按月观察的,那么 period=12 可能更合适,因为季节性的周期是每十二个时间点重复一次

3.2.1 时间序列季节性分解解读

时间序列分解中,趋势(Trend)、季节性(Seasonal)和残差(Residuals)是分解得到的三个主要部分,它们分别代表了不同的时间序列成分:

趋势: 趋势成分表示时间序列中的长期趋势或变化方向。趋势反映了数据在较长时间尺度上的整体走势。如果趋势是递增的,表示数据整体上呈上升趋势;如果趋势是递减的,表示数据整体上呈下降趋势

季节性: 季节性成分捕捉了时间序列中重复出现的短期周期性模式。这些模式通常与特定的时间段或季节相关,在案例中,设定了周期为12,因此季节性成分是探讨在每个周期(这里是12个数据点)的模式

残差: 残差是分解后剩余的部分,表示不能被趋势和季节性解释的随机波动或噪声。残差是时间序列中无法通过趋势和季节性模型来捕捉的部分,它反映了数据中未被模型考虑的波动

3.3 计算季节性强度


          
import pandas as pd
          
from statsmodels.tsa.api import STL
          

          
# 计算输入时间序列的季节性强度,即时间序列中季节性成分相对于残差和季节性成分的方差之和的相对强度。
          
# 季节性强度的值范围从0到1,值越接近1表示季节性越强。
          
def seasonal_strength(series: pd.Series) -> float:
          
    """
          
    计算时间序列的季节性强度。
          

          
    参数:
          
    series (pd.Series): 输入的时间序列数据。
          

          
    返回:
          
    float: 季节性强度的值,范围从0到1,值越接近1表示季节性越强。
          

          
    """
          
    # 对时间序列进行分解
          
    series_decomp = STL(series, period=12).fit()
          

          
    # 计算残差和季节性的方差之和
          
    resid_seas_var = (series_decomp.resid + series_decomp.seasonal).var()
          
    
          
    # 计算残差的方差
          
    resid_var = series_decomp.resid.var()
          

          
    # 计算季节性强度
          
    result = 1 - (resid_var / resid_seas_var)
          

          
    return result
          

          
print("时间序列季节性强度:\n",seasonal_strength(series_det))
      

picture.image

季节性强度为0.9587,季节性强度接近1表示季节性在时间序列中的影响非常强烈,意味着季节性模式在数据中占主导地位,对整体变动有显著的贡献

结论

分析和预测过程中需要高度关注季节性的影响,特别是在制定业务策略和决策时,考虑到季节性的周期性模式,以及可能进行季节性调整,将有助于更准确地理解数据趋势并 做出明智的决策

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
IDC 大模型应用落地白皮书
大模型技术已深度融入业务实践,各企业期望其释放更大商业价值。 但大模型落地之路面临许多挑战和顾虑。 如何精准对接业务需求与发展蓝图,制定切实可行的大模型落地策略? IDC发布首个大模型应用策略与行动指南 一为您揭晓一
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论