3、时间序列分析基础
时间序列分析,说白了就是跟「带时间戳的数据」打交道。我刚开始做运维那会儿,觉得这玩意儿就是画个折线图看看趋势。后来被线上故障狠狠教育了一次,才发现——嗯,这里面的门道深着呢。
今天咱们就把这块硬骨头啃下来。我会结合自己踩过的坑,把时间序列的核心概念、平稳性检验、自相关函数、以及经典分解模型,一次性讲透。
3.1 时间序列到底是什么?
先别急着背定义。你想想看,服务器CPU使用率、磁盘IO、网络流量、API响应时间……这些数据是不是每隔几秒、几分钟就采集一次?
对,这就是时间序列——按时间顺序排列的观测值集合。
核心三要素:
- 时间戳:记录数据采集的时刻
- 观测值:具体数值(比如CPU 75%)
- 频率:采集间隔(比如5秒一次)
我个人习惯把时间序列分成两类:
- 单变量时间序列:只有一个指标,比如只看CPU使用率
- 多变量时间序列:多个指标一起看,比如CPU+内存+磁盘IO
我在项目中遇到过最典型的场景:某电商大促期间,监控系统采集了上千个时间序列。结果因为某个指标没处理好,导致误报警刷屏。所以,理解时间序列的底层逻辑,是搭建智能运维系统的第一步。
3.2 平稳性检验——为什么它这么重要?
很多AI预测模型,比如ARIMA,都要求数据是「平稳」的。什么叫平稳?说白了就是:
- 均值不随时间变化
- 方差不随时间变化
- 自协方差只与时间间隔有关,与具体时间点无关
你可能会问:「我服务器CPU使用率明明在波动,怎么可能平稳?」
嗯,这里要注意:平稳不是「不变」,而是「统计性质稳定」。比如CPU在30%-70%之间随机波动,但长期均值一直维持在50%左右,这就是平稳。
3.2.1 如何检验平稳性?
最常用的方法是ADF检验(Augmented Dickey-Fuller Test)。我直接上代码:
import pandas as pd
from statsmodels.tsa.stattools import adfuller
# 假设df是时间序列DataFrame,'value'列是观测值
result = adfuller(df['value'].dropna())
print(f'ADF统计量: {result[0]}')
print(f'p值: {result[1]}')
if result[1] < 0.05:
print('数据平稳,可以继续建模')
else:
print('数据不平稳,需要差分处理')
避坑指南:我曾经因为数据里有个明显的周期性波动(比如每天凌晨的定时任务导致CPU飙升),ADF检验一直通不过。后来才发现,需要先做「季节差分」或者「分解」再检验。别傻乎乎地直接差分到平稳为止,那样会丢失业务含义。
3.2.2 不平稳怎么办?
常见处理手段:
- 差分:一阶差分、二阶差分
- 对数变换:消除方差随时间增大的问题
- 季节差分:针对周期性数据
- 分解后去除趋势/季节成分
3.3 自相关与偏自相关函数
这两个概念,我刚开始学的时候也觉得绕。后来用一句话就记住了:
- 自相关函数(ACF):当前值和过去值之间的相关性
- 偏自相关函数(PACF):剔除中间变量影响后,当前值和过去值之间的「纯」相关性
举个例子:你今天CPU飙高,可能跟5分钟前的CPU有关,也可能跟10分钟前的有关。ACF告诉你「有关系」,PACF告诉你「到底是谁直接导致的」。
3.3.1 怎么看ACF和PACF图?
我习惯用statsmodels画图:
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))
plot_acf(df['value'].dropna(), lags=40, ax=ax1)
plot_pacf(df['value'].dropna(), lags=40, ax=ax2)
plt.show()
实战经验:
- ACF图拖尾(缓慢衰减)→ 数据可能不平稳
- ACF图截尾(突然掉到置信区间内)→ 适合用MA模型
- PACF图截尾 → 适合用AR模型
- 两者都拖尾 → 可能需要ARIMA模型
我记得有一次做磁盘IO预测,ACF图显示滞后24阶还有显著相关性。一开始没在意,结果模型预测效果很差。后来发现是业务有「每日结算」的周期性任务。加上季节差分后,ACF图就正常了。
3.4 经典分解模型
时间序列分解,就是把一个序列拆成三部分:
- 趋势成分(Trend):长期上升或下降
- 季节成分(Seasonal):固定周期的波动
- 残差成分(Residual):随机噪声
公式很简单:Y(t) = Trend(t) + Seasonal(t) + Residual(t)(加法模型)
或者:Y(t) = Trend(t) × Seasonal(t) × Residual(t)(乘法模型)
3.4.1 加法模型 vs 乘法模型
| 场景 | 推荐模型 | 举例 |
|---|---|---|
| 季节波动幅度基本不变 | 加法模型 | CPU使用率(波动幅度稳定) |
| 季节波动幅度随趋势变化 | 乘法模型 | 电商交易量(大促期间波动更大) |
3.4.2 用statsmodels做分解
from statsmodels.tsa.seasonal import seasonal_decompose
# 假设数据频率是1小时,周期为24小时
decomposition = seasonal_decompose(df['value'], model='additive', period=24)
trend = decomposition.trend
seasonal = decomposition.seasonal
residual = decomposition.resid
# 画图
decomposition.plot()
plt.show()
注意:分解后的残差如果呈现明显的模式(比如还有周期性),说明你的周期参数设置不对。我曾经因为把周期设成24小时,但实际业务周期是7天,结果残差里还藏着明显的周规律。嗯,这个坑我替你们踩过了。
3.5 知识体系总览
下面这张图,是我自己梳理的时间序列分析知识体系。建议你保存下来,每次做预测前看一眼:
3.6 实战中的避坑总结
最后,分享几个我这些年总结的经验:
- 不要盲目追求平稳:有些业务场景,比如交易量持续增长,本身就是非平稳的。强行差分到平稳,反而会丢失业务趋势信息。
- ACF/PACF图要结合业务看:如果某个滞后阶数相关性特别高,先问问自己「这个时间点是不是有定时任务?」
- 分解模型不是万能的:经典分解假设趋势和季节成分是固定的。如果业务模式经常变化(比如促销活动),可以考虑STL分解或者Prophet。
- 残差一定要检查:如果残差还有明显的模式,说明你的模型没捕捉到全部信息。我曾经因为忽略残差分析,导致预测模型上线后频繁误报。
一句话总结:时间序列分析,就是「看数据、找规律、拆成分、建模型」的过程。平稳性检验是门槛,ACF/PACF是工具,分解模型是手段。三者结合,才能为AI故障预测打下坚实基础。
公众号:蓝海资料掘金营,微信deep3321