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 核心流程 原始时序数据 时序可视化 趋势/季节/周期分解 相关性热力图 识别趋势方向 发现多重共线性 特征工程 & 建模

EDA 做扎实了,后面的建模就是水到渠成的事。别急着跑模型,先跟数据「聊聊天」。


专注资料整理