一、时间序列基础:从概念到实战
大家好,我是你们这趟时间序列之旅的向导。今天咱们聊聊最基础的东西——时间序列到底是什么。
说实话,我刚开始接触数据科学时,觉得时间序列就是「按时间排好的数据」。这话没错,但太浅了。你想想看,股票价格、每日气温、网站访问量……这些数据背后藏着规律,而我们的任务就是把这些规律挖出来。
1.1 什么是时间序列?
时间序列,说白了就是按时间顺序排列的观测值集合。每个数据点都带有一个时间戳,而且时间间隔通常是固定的——比如每小时、每天、每月。
我举个例子。假设你记录了过去100天每天下午3点的气温:
# 一个简单的时间序列示例
import pandas as pd
import numpy as np
# 生成100天的模拟气温数据
dates = pd.date_range(start='2024-01-01', periods=100, freq='D')
temperatures = 20 + 10 * np.sin(np.arange(100) * 2 * np.pi / 365) + np.random.randn(100) * 2
# 创建时间序列
ts = pd.Series(temperatures, index=dates)
print(ts.head())
这就是一个典型的时间序列。注意几个关键点:
- 有序性:数据点的顺序不能乱,交换两个时间点的数据就没意义了
- 等间隔:大多数分析方法要求时间间隔一致
- 相关性:相邻时间点的数据往往相互影响——今天热,明天大概率也热
1.2 时间序列的三大组成部分
任何一个时间序列,都可以拆成三个部分:趋势、季节性、残差。这是时间序列分析的基石,我建议你把它刻在脑子里。
咱们用一张图来直观理解:
这张图展示了时间序列分解的核心逻辑。咱们逐个来看:
趋势(Trend)
趋势就是数据长期的变化方向。是涨了还是跌了?涨得快还是慢?
我记得有一次帮一家零售公司做销售预测,他们的数据看起来乱七八糟的。但去掉季节性因素后,趋势线清晰地显示——每年增长约15%。这个发现直接帮他们调整了库存策略。
季节性(Seasonal)
季节性是指固定周期内的规律波动。周期可以是天、周、月、年。
举个例子:电商网站的访问量,工作日低、周末高,这就是以周为周期的季节性。冰淇淋销量夏天高、冬天低,这是以年为周期的季节性。
残差(Residual)
残差就是去掉趋势和季节性后剩下的部分。说白了就是「说不清楚的那部分」。
残差里有什么?随机噪声、异常事件、测量误差……理想情况下,残差应该是白噪声——均值为0、方差恒定、没有自相关。如果残差还有规律,说明你的模型没拆干净。
1.3 时间序列的应用场景
时间序列分析的应用范围比你想象的要广得多。我随便列几个:
| 领域 | 典型应用 | 我的实战案例 |
|---|---|---|
| 金融 | 股票价格预测、风险管理 | 帮一家基金公司做波动率预测,用GARCH模型效果不错 |
| 零售 | 销量预测、库存管理 | 双十一销量预测,季节性因素占模型权重的60%以上 |
| 能源 | 电力负荷预测、油价分析 | 某省电网的负荷预测,温度作为外生变量很关键 |
| 气象 | 天气预报、气候分析 | 这个我没做过,但原理相通——都是找周期规律 |
| 医疗 | 疫情传播预测、患者流量 | 医院急诊室就诊人数预测,按小时和按周都有季节性 |
| 工业 | 设备故障预警、质量监控 | 传感器数据异常检测,残差分析是核心手段 |
你发现没有?这些场景都有一个共同点——数据随时间变化,且变化有规律可循。如果数据完全是随机的,那时间序列分析就没意义了。
1.4 用Python做一次简单的分解
光说不练假把式。咱们用Python的statsmodels库,对模拟数据做一次分解:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import seasonal_decompose
# 生成模拟数据:趋势 + 季节性 + 噪声
np.random.seed(42)
t = np.arange(0, 365)
trend = 0.05 * t # 线性上升趋势
seasonal = 10 * np.sin(2 * np.pi * t / 30) # 30天周期
noise = np.random.randn(365) * 3
data = trend + seasonal + noise
# 创建时间序列
dates = pd.date_range('2024-01-01', periods=365, freq='D')
ts = pd.Series(data, index=dates)
# 分解
result = seasonal_decompose(ts, model='additive', period=30)
# 查看分解结果
print("趋势成分(前5个值):")
print(result.trend.head())
print("\n季节性成分(前5个值):")
print(result.seasonal.head())
print("\n残差成分(前5个值):")
print(result.resid.head())
这段代码做了三件事:
- 生成一个包含趋势、季节性和噪声的模拟时间序列
- 用
seasonal_decompose函数进行分解 - 输出三个成分的前几个值
model='additive'表示加法模型,即 Y = T + S + R。如果季节性波动幅度随趋势变化,应该用乘法模型 model='multiplicative'。怎么选?看数据——如果夏季波动是冬季的2倍,用乘法;如果波动幅度差不多,用加法。
1.5 本章小结
咱们这一章聊了三个核心概念:
- 时间序列:按时间顺序排列的数据,有序、等间隔、自相关
- 三大成分:趋势(长期方向)、季节性(周期波动)、残差(随机噪声)
- 应用场景:金融、零售、能源……几乎所有随时间变化的数据都能用
嗯,基础打牢了,后面才能走远。下一章咱们会深入探讨时间序列的平稳性——这可是建模前的关键一步。到时候见!
公众号:蓝海资料掘金营,微信deep3321