4. 探索性数据分析(EDA):时间序列可视化、趋势/季节性/周期性分解、相关性热力图
EDA 这一步,说白了就是跟数据「混个脸熟」。
我见过不少同学,拿到数据就急着上模型,结果跑出来的预测值跟实际需求差了十万八千里。为什么?因为数据里藏着的问题,你根本没发现。EDA 就是帮你把这些「坑」提前挖出来。
4.1 时间序列可视化:先看趋势,再谈预测
我个人习惯,拿到物料需求数据的第一件事——画图。别急着算统计量,先看曲线长什么样。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 假设 df 包含 'date' 和 'demand' 两列
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
plt.figure(figsize=(14, 6))
plt.plot(df.index, df['demand'], color='#2E86AB', linewidth=1.5)
plt.title('物料A 日需求时序图', fontsize=16)
plt.xlabel('日期')
plt.ylabel('需求量')
plt.grid(alpha=0.3)
plt.show()
嗯,这里要注意:如果数据跨度超过一年,建议按月或按周聚合后再画。否则密密麻麻的点,根本看不出规律。
我的小技巧: 画图时把周末、节假日用不同颜色标出来。我在某芯片厂的项目中,发现节假日前后需求会骤降,如果不做标记,模型会误以为是异常值。
4.2 趋势/季节性/周期性分解
光看原始曲线还不够。你得把时间序列拆开看——趋势、季节性、残差,这三部分各有什么特征?
我常用 statsmodels 的 seasonal_decompose 函数。它用的是加法模型,适合大多数半导体物料需求场景。
from statsmodels.tsa.seasonal import seasonal_decompose
# 确保数据是日频,且无缺失值
result = seasonal_decompose(df['demand'], model='additive', period=7)
fig, axes = plt.subplots(4, 1, figsize=(14, 10), sharex=True)
result.observed.plot(ax=axes[0], title='原始序列', color='#2E86AB')
result.trend.plot(ax=axes[1], title='趋势', color='#A23B72')
result.seasonal.plot(ax=axes[2], title='季节性', color='#F18F01')
result.resid.plot(ax=axes[3], title='残差', color='#C73E1D')
plt.tight_layout()
plt.show()
为什么会这样?因为半导体行业有明显的季节性——Q3 通常是消费电子旺季,Q1 是淡季。如果你不把季节性拆出来,模型会把「每年 Q3 需求上涨」当成异常波动来处理。
关键点: period 参数怎么设?日数据一般设 7(周周期)或 365(年周期)。月数据设 12。我建议先试 7,再看残差是否还有规律。如果残差还有周期性,说明你选的 period 不对。
我曾经踩过的坑: 有一次数据里有个明显的「尖峰」,我以为是异常值,直接删掉了。后来才发现那是某款芯片的「量产爬坡期」,需求本来就该高。所以,分解后的残差一定要结合业务背景去看,别盲目清洗。
4.3 相关性热力图:找「帮凶」变量
物料需求不是孤立的。它跟库存水位、在途订单、客户预测、甚至天气都有关系。相关性热力图就是帮你快速找出哪些变量跟需求「关系暧昧」。
# 假设 df_features 包含多个特征列
corr_matrix = df_features.corr()
plt.figure(figsize=(12, 10))
sns.heatmap(corr_matrix,
annot=True,
fmt='.2f',
cmap='RdBu_r',
center=0,
square=True,
linewidths=0.5)
plt.title('特征相关性热力图', fontsize=16)
plt.show()
你想想看,如果「客户预测」和「实际需求」的相关系数只有 0.3,那说明客户的预测基本是拍脑袋的。这时候你还敢用它做输入特征吗?
| 相关系数范围 | 含义 | 我的建议 |
|---|---|---|
| 0.8 ~ 1.0 | 强正相关 | 可以考虑合并或只保留一个 |
| 0.5 ~ 0.8 | 中等正相关 | 保留,但注意多重共线性 |
| 0.3 ~ 0.5 | 弱正相关 | 结合业务判断是否保留 |
| < 0.3 | 几乎无关 | 建议删除,省得干扰模型 |
避坑指南: 我曾经把「库存水位」和「在途订单」同时放进模型,结果两个变量相关系数高达 0.92。模型训练时直接报「奇异矩阵」错误。所以,热力图不只是给你看的,更是帮你做特征筛选的。
4.4 本章知识体系
下面这张图,是我自己总结的 EDA 核心流程。你照着这个顺序走,基本不会漏掉关键信息。
EDA 做扎实了,后面的建模就是水到渠成的事。别急着跑模型,先跟数据「聊聊天」。