热线电话:13121318867

登录
首页大数据时代【CDA干货】季节分解法:解锁时间序列数据的“四季密码”
【CDA干货】季节分解法:解锁时间序列数据的“四季密码”
2025-12-03
收藏

每到“双十一”,电商平台的销售额会迎来爆发式增长;每逢冬季,北方的天然气消耗量会显著上升;每月的10号左右,工资发放会带动零售消费的小幅波动——这些数据的周期性波动,藏着业务运行的“季节密码”。季节分解法(Seasonal Decomposition)便是解锁这些密码的核心工具,它通过数学模型将时间序列拆分为趋势、季节、循环、随机四大成分,让数据的内在规律从杂乱波动中显现。本文将从原理本质、公式体系、分解步骤到实操案例,全面解析季节分解法的核心逻辑。

一、核心认知:季节分解法的本质是“成分拆分”

时间序列数据(如月度销售额、日降水量、季度GDP)的变化往往是多种力量共同作用的结果:长期来看受经济增长、技术进步等因素影响呈现趋势性;中期可能因季节、节假日等因素呈现周期性;短期则受突发天气、政策变动等随机因素干扰。季节分解法的核心思想,就是用统计学方法将这些交织的成分分离,使每个成分的特征独立呈现,为预测和决策提供依据。

1. 时间序列的四大核心成分

任何含季节波动的时间序列,都可抽象为四大成分的组合,这是季节分解法的理论基础:

  • 趋势成分(Trend, Tₜ):时间序列在长期内的稳定变化方向,如人口增长的线性上升、智能手机销量的饱和式增长,反映数据的“长期惯性”。

  • 季节成分(Seasonal, Sₜ):周期固定且重复出现的波动,周期通常为1年(如夏季空调销量增长)、1个月(如工资日消费上升)或1周(如周末餐饮客流增加),是季节分解的核心目标。

  • 循环成分(Cyclical, Cₜ):周期不固定的中长期波动,如经济周期(繁荣-衰退-复苏-萧条),周期通常为数年,与季节成分的“固定周期”形成鲜明区别。

  • 随机成分(Irregular, Iₜ):无法预测的偶然波动,如突发疫情对消费的冲击、极端天气对农产品产量的影响,是分解后剩余的“噪声”成分。

关键辨析:季节成分与循环成分的核心差异在于“周期固定性”——季节成分的周期由自然季节、人为规则(如节假日)决定,长度固定;循环成分的周期由经济规律、行业周期决定,长度不固定(如房地产周期可能为3-5年)。在实际应用中,若数据周期较短(如月度数据),常将“趋势+循环”合并为“趋势循环成分(TCₜ)”简化分析。

2. 分解的核心逻辑:从“组合”到“分离”

季节分解法的本质是建立四大成分的组合模型,再通过统计学方法逆向拆分。根据成分间的作用关系,分为“加法模型”和“乘法模型”两类,这是后续公式推导和应用的核心依据。选择哪种模型,取决于季节波动的幅度是否随趋势变化:

  • 若季节波动幅度不随趋势变化(如每月服装销量比趋势值固定增减500件),采用加法模型;

  • 若季节波动幅度随趋势变化(如每月服装销量比趋势值固定增减20%),采用乘法模型。

二、核心公式体系:加法与乘法模型的数学表达

季节分解法的公式体系围绕“成分组合模型”和“成分分离算法”展开,其中组合模型是基础,分离算法是实现路径。无论是经典的移动平均法,还是现代的STL分解法,都基于这两类模型衍生。

1. 两大组合模型:加法 vs 乘法

设时间序列在第t期的观测值为Yₜ,四大成分分别为Tₜ(趋势)、Sₜ(季节)、Cₜ(循环)、Iₜ(随机),则两类模型的数学表达式如下:

(1)加法模型:成分间为“线性叠加”关系

当季节波动的绝对幅度稳定时,各成分以加法形式组合,公式为:

若简化为“趋势循环+季节+随机”三成分,则公式可写为:

其中,季节成分Sₜ的取值可正可负,代表“偏离趋势循环成分的绝对幅度”。例如,某奶茶店月度销量的趋势循环值为1000杯,夏季Sₜ=300(代表比趋势多卖300杯),冬季Sₜ=-200(代表比趋势少卖200杯)。

适用场景:趋势平稳、季节波动幅度固定的数据,如居民月度基本生活消费、图书馆日均借阅量。

(2)乘法模型:成分间为“比例乘积”关系

当季节波动的相对幅度稳定时,各成分以乘法形式组合,公式为:

简化为三成分后,公式为:

其中,季节成分Sₜ通常以“指数”或“百分比”形式呈现,取值围绕1波动。例如,某电商平台月度销售额的趋势循环值为100万元,“双十一”所在月Sₜ=2.5(代表销量是趋势的2.5倍),传统淡季Sₜ=0.8(代表销量是趋势的0.8倍)。

适用场景:趋势增长/下降、季节波动幅度随趋势放大的数据,如电商销售额、房地产成交量、能源消耗量。

2. 核心分解算法:移动平均法的公式推导

移动平均法是季节分解的经典算法,核心思路是“先提取趋势循环成分,再分离季节成分,最后得到随机成分”,适用于加法和乘法模型。以下以最常用的“月度数据(周期12)”为例,推导分解过程的核心公式。

步骤1:计算趋势循环成分(TCₜ)——中心化移动平均

对于周期为m的时间序列(月度m=12,季度m=4),采用“m期移动平均”平滑掉季节和随机波动,得到趋势循环成分。由于m为偶数(如12),直接移动平均后结果会偏离原时间点,需再进行“2期中心化移动平均”,公式如下:

(1)首先计算12期移动平均(MA₁₂):

(2)再对MA₁₂进行2期中心化移动平均,得到趋势循环成分TCₜ:

例如,计算第6期的TC₆,需先得到第5.5期和第6.5期的12期移动平均,再取平均值。通过该公式,可消除季节波动的影响,保留长期趋势和循环特征

步骤2:分离季节成分(Sₜ)——计算季节指数

根据组合模型的不同,季节成分的计算方式分为两类:

  • 加法模型:用观测值减去趋势循环成分,得到“季节+随机”成分(Sₜ+Iₜ),再对相同季节的成分取平均,消除随机干扰,公式为:

  • 乘法模型:用观测值除以趋势循环成分,得到“季节×随机”成分(Sₜ×Iₜ),再对相同季节的成分取平均,公式为:

步骤3:提取随机成分(Iₜ)——剩余误差

随机成分是分解后剩余的“噪声”,通过剔除趋势循环和季节成分得到,公式对应两类模型:

  • 加法模型

  • 乘法模型

随机成分Iₜ应满足“均值为0(加法)或1(乘法)、无明显规律”的特征,若出现异常波动,需检查数据是否存在异常值或分解模型选择是否合理。

3. 现代分解方法:STL分解的核心改进

传统移动平均法仅适用于线性趋势和固定周期的季节波动,而STL(Seasonal and Trend Decomposition using Loess)分解法通过局部加权回归(Loess)优化,支持非线性趋势和不规则周期波动,其核心公式基于“局部拟合”思想:

其中,α为平滑参数(控制拟合程度),β为多项式阶数(β=1为线性拟合,β=2为二次拟合),t mod m代表“季节周期内的位置”(如月度数据中t mod 12=3代表3月)。STL分解无需预设周期,可通过数据自适应调整,已成为Python、R等工具中季节分解的默认算法。

三、实操落地:从数据到成分的完整分解步骤

理论与公式需结合实操才能发挥价值。以下以“某连锁超市2020-2022年月度销售额数据”为例,采用Python的statsmodels库实现季节分解,完整呈现从数据预处理到成分解读的全流程。

1. 数据准备与模型选择

数据特征:36个月销售额(单位:万元),呈现“春节、国庆期间增长,夏季淡季下降”的规律,且销售额随时间整体上升(趋势增长,季节波动幅度随趋势放大),因此选择乘法模型

2. 核心代码与公式应用


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import seasonal_decompose

# 1. 构造模拟数据(2020-2022年月度销售额)
dates = pd.date_range(start='2020-01-01', periods=36, freq='M')
# 构造趋势成分(线性增长:T_t = 100 + 2*t)
trend = 100 + 2 * np.arange(36)
# 构造季节成分(月度周期,乘法形式,春节1-2月、国庆10月为高峰)
seasonal = np.array([1.81.50.80.90.70.60.70.81.01.61.11.2] * 3)
# 构造随机成分(围绕1波动的噪声)
irregular = np.random.normal(loc=1, scale=0.05, size=36)
# 乘法模型组合:Y_t = T_t * S_t * I_t
sales = trend * seasonal * irregular
# 生成时间序列数据框
df = pd.DataFrame({'销售额': sales}, index=dates)

# 2. 季节分解(乘法模型,周期m=12)
decomposition = seasonal_decompose(df['销售额'], model='multiplicative', period=12)
# 提取四大成分
trend_component = decomposition.trend  # 趋势成分(T_t)
seasonal_component = decomposition.seasonal  # 季节成分(S_t)
residual_component = decomposition.resid  # 随机成分(I_t,已合并循环成分)

# 3. 结果可视化
plt.rcParams['font.sans-serif'] = ['SimHei']
fig, axes = plt.subplots(41, figsize=(1210), sharex=True)
# 原始数据
df['销售额'].plot(ax=axes[0], title='原始销售额数据', color='blue')
# 趋势成分
trend_component.plot(ax=axes[1], title='趋势成分(T_t)', color='red')
# 季节成分
seasonal_component.plot(ax=axes[2], title='季节成分(S_t)', color='green')
# 随机成分
residual_component.plot(ax=axes[3], title='随机成分(I_t)', color='purple')
plt.tight_layout()
plt.show()

# 4. 关键指标计算:季节指数(以2022年为例)
seasonal_2022 = seasonal_component['2022-01-01':'2022-12-31']
print("2022年各月季节指数:")
print(seasonal_2022.round(2))

3. 结果解读与业务价值

  • 趋势成分:呈线性上升(Tₜ=100+2t),说明超市销售额年均增长24万元,业务整体向好;

  • 季节成分:1月季节指数1.8(春节高峰,销售额是趋势的1.8倍)、6月指数0.6(夏季淡季,仅为趋势的60%),为促销活动策划提供依据(如6月推出满减活动对冲淡季影响);

  • 随机成分:波动围绕1上下,无明显规律,说明数据无异常干扰,分解效果可靠。

四、常见误区与避坑指南

季节分解法虽实用,但新手易陷入“模型选错”“周期误判”等误区,以下是四大核心避坑要点:

1. 误区1:模型选择凭经验,忽视数据特征

正确做法:通过“趋势-季节散点图”判断——若相同季节的波动幅度(Yₜ-Tₜ)固定,选加法模型;若波动幅度(Yₜ/Tₜ)固定,选乘法模型。可通过“对数转换”将乘法模型转化为加法模型(lnYₜ=lnTₜ+lnSₜ+lnIₜ)辅助判断。

2. 误区2:周期设定随意,未结合业务场景

正确做法:周期m需结合业务实际——零售行业常用m=12(月度)、m=4(季度);餐饮行业可能用m=7(周度);外卖行业甚至用m=24(小时级)。若周期未知,可通过“自相关函数(ACF)”判断(ACF图中峰值对应的滞后阶数即为周期)。

3. 误区3:过度关注随机成分,解读偏离业务

正确做法:随机成分是“噪声”,核心价值在于验证分解效果(若随机成分有规律,说明分解不彻底),业务决策应聚焦趋势和季节成分(如根据趋势预测明年销售额,根据季节成分制定月度库存计划)。

4. 误区4:用短期数据分解,结果不可靠

正确做法:数据需包含至少2个完整周期(如月度数据需24个月以上),否则无法准确计算季节指数。若数据不足,可采用“移动假日调整”“指数平滑法”辅助补充。

五、总结:从分解到决策的价值闭环

季节分解法的核心不是“拆分成分”,而是“通过成分解读数据背后的业务逻辑”——趋势成分反映长期战略的有效性(如超市扩张是否带动销售额增长),季节成分揭示短期运营的规律性(如节假日消费高峰的时间节点),随机成分验证数据的可靠性。

从公式推导到代码实现,季节分解法构建了“理论-工具-应用”的完整闭环。无论是宏观经济分析、企业销售预测,还是农业产量预估,只要数据含季节波动,季节分解法都能成为解锁规律的“钥匙”,让时间序列数据从“杂乱无章”变为“有理可依”。

推荐学习书籍 《CDA一级教材》适合CDA一级考生备考,也适合业务及数据分析岗位的从业者提升自我。完整电子版已上线CDA网校,累计已有10万+在读~ !

免费加入阅读:https://edu.cda.cn/goods/show/3151?targetId=5147&preview=0

数据分析师资讯
更多

OK
客服在线
立即咨询
客服在线
立即咨询