3、数据可视化入门:折线图、散点图、箱线图在异常检测中的应用

做工艺这么多年,我越来越觉得——数据不会骗人,但前提是你得看得懂它。

刚入行那会儿,我对着Excel里密密麻麻的数字,眼睛都快看瞎了,愣是没发现异常。后来老工程师甩给我一张图,我一眼就看出问题在哪。嗯,这就是可视化的力量。

说白了,一张好图胜过千行数据。今天我就带你看看三种最实用的图:折线图、散点图、箱线图。它们怎么帮我们抓异常?我一个个讲。

核心观点:可视化不是花架子,它是异常检测的「第一道防线」。你不需要成为数据分析师,但你需要学会看图说话。

3.1 折线图:盯住趋势,抓住漂移

折线图,我最常用的图,没有之一。

它的逻辑很简单:横轴是时间(或者批次号),纵轴是工艺参数值。点连成线,趋势一目了然。

折线图能发现什么异常?

  • 趋势性漂移:比如炉管温度随着使用时间慢慢升高。单看每个点都在规格内,但连起来看,它一直在往上走。这就是隐患。
  • 突发性跳变:某个点突然窜高或跌低,明显偏离正常范围。这种往往是设备故障或操作失误。
  • 周期性波动:比如每隔几批就出现一个波峰。我遇到过这种情况,后来查出来是冷却水循环泵的间歇性工作导致的。

我的习惯:在折线图上加两条线——规格上限和规格下限。再画一条中心线(目标值)。这样一眼就能看出哪些点「出格」了。我曾经用这个方法,半小时就定位到了CMP机台的抛光液流量异常。

代码示例(Python + Matplotlib):

import matplotlib.pyplot as plt
import pandas as pd

# 假设你有一列温度数据
data = pd.read_csv('furnace_temp.csv')
plt.figure(figsize=(12, 6))
plt.plot(data['batch'], data['temperature'], marker='o', linestyle='-', color='b')
plt.axhline(y=150, color='r', linestyle='--', label='规格上限')
plt.axhline(y=145, color='r', linestyle='--', label='规格下限')
plt.axhline(y=147.5, color='g', linestyle='-', label='目标值')
plt.xlabel('批次号')
plt.ylabel('温度 (°C)')
plt.title('炉管温度趋势图')
plt.legend()
plt.grid(True)
plt.show()

你看,代码不复杂。但加上了上下限和目标线,这张图就活了。

3.2 散点图:发现关联,揪出根因

折线图看时间趋势,散点图看变量关系。

我经常用散点图来回答一个问题:「这个异常是不是跟那个参数有关?」

散点图能发现什么异常?

  • 离群点:大部分点聚在一起,突然有个点孤零零地飘在外面。这个点就是异常样本。
  • 非线性关系:比如压力增大到某个值后,膜厚突然下降。这种拐点往往是工艺窗口的边界。
  • 聚类分离:数据分成两团,说明可能存在两种不同的工艺状态。我遇到过刻蚀速率分成两簇的情况,后来发现是不同腔室之间的差异。

注意:散点图看的是「相关性」,不是「因果性」。两个参数看起来有关系,不代表一个是另一个的原因。我曾经被这个坑过——温度和压力看起来正相关,其实是环境湿度在背后捣鬼。

代码示例:

plt.figure(figsize=(8, 6))
plt.scatter(data['pressure'], data['thickness'], alpha=0.6, c='orange')
plt.xlabel('压力 (mTorr)')
plt.ylabel('膜厚 (Å)')
plt.title('压力 vs 膜厚散点图')
plt.grid(True)
plt.show()

alpha=0.6 这个参数我建议加上。数据点多了会重叠,调低透明度能看出密度分布。

3.3 箱线图:看分布,抓离群

箱线图,我愿称之为「异常检测的照妖镜」。

它不看你随时间怎么变,也不看变量之间的关系。它只看一件事:这批数据的分布长什么样,有没有「野孩子」。

箱线图怎么看?

  • 箱子:中间那条线是中位数。箱子的上下边是四分位数(Q1和Q3)。箱子越窄,数据越集中。
  • 须:从箱子伸出去的线,通常到1.5倍四分位距(IQR)为止。
  • 点:须之外的点,就是离群点。这些就是我们要抓的异常。

箱线图能发现什么异常?

  • 离群点:一目了然。我习惯把离群点标红,然后去查对应的批次记录。
  • 分布偏移:比如两个班次的数据,箱子的位置差了一大截。这说明工艺条件变了,或者操作手法不一致。
  • 分布变宽:箱子变大了,说明工艺波动在增大。这是设备老化的信号。

我的经验:箱线图特别适合做「分组对比」。比如按机台分组、按操作员分组、按班次分组。我曾经用箱线图对比三个刻蚀机台的速率分布,发现其中一台的箱子明显又宽又偏,后来查出来是它的射频电源老化了。

代码示例:

import seaborn as sns

plt.figure(figsize=(10, 6))
sns.boxplot(x='machine_id', y='etch_rate', data=data, palette='Set2')
plt.xlabel('机台编号')
plt.ylabel('刻蚀速率 (Å/min)')
plt.title('不同机台刻蚀速率分布对比')
plt.grid(axis='y')
plt.show()

Seaborn 的 boxplot 用起来比 Matplotlib 方便,颜色也好看。我一般用 Set2 或 Pastel1 调色板,不刺眼。

3.4 三种图怎么选?一张表说清楚

你可能会问:那我到底该用哪种图?

嗯,我整理了一个小表格,你照着选就行。

你想看什么 用什么图 典型异常
参数随时间的变化趋势 折线图 漂移、跳变、周期性波动
两个参数之间的关系 散点图 离群点、非线性、聚类分离
数据分布特征及离群点 箱线图 离群点、分布偏移、波动变大
多组数据对比 箱线图(分组) 机台差异、班次差异、操作员差异

说白了,折线图看「过程」,散点图看「关系」,箱线图看「分布」。三者结合,异常基本无处可逃。

3.5 实战案例:一次刻蚀异常的快速定位

讲个真事。

有一次产线反馈,某批产品的刻蚀深度偏浅。我拿到数据后,先画了折线图——发现最近10批的刻蚀速率在缓慢下降。嗯,有漂移。

然后我画了散点图,把刻蚀速率和射频功率做关联——发现功率没变,但速率在降。这说明问题不在功率上。

最后我画了箱线图,按腔室分组——发现A腔室的速率分布明显低于B腔室,而且A腔室的箱子更宽。

结果呢?打开A腔室一看,电极上有沉积物。清理之后,速率恢复正常。

整个过程不到一小时。如果没有这三张图,我可能还在翻数据表。

总结一下:可视化不是炫技,它是工程师的「眼睛」。折线图看趋势,散点图看关联,箱线图看分布。三招练好,异常检测你就入门了。

数据可视化在异常检测中的应用 折线图 • 趋势性漂移 • 突发性跳变 • 周期性波动 • 加规格限辅助判断 散点图 • 离群点检测 • 非线性关系 • 聚类分离 • 相关性分析 箱线图 • 离群点识别 • 分布偏移 • 波动变大 • 分组对比 三者结合 → 异常无处可逃

小建议:刚开始学的时候,别贪多。先把折线图练熟,每天上班第一件事,把关键参数的折线图拉出来看一眼。坚持一周,你就能发现很多以前忽略的细节。

专注资料整理