当前位置:首页 > 随笔复盘 > 正文内容

用Python实现Nelson规则:完整可复用的判异模块

[公开] 用Python实现Nelson规则:完整可复用的判异模块

【摘要】本文针对半导体Fab中SPC控制图判读依赖人工、标准不一、漏判误判频发的问题,用Python实现一套完整可复用的Nelson八规则判异模块。文章从规则原理、代码实现、测试验证到落地避坑四个维度展开,给出可直接复用、可嵌入现有SPC系统的实战方案。适合Fab工艺工程师、SPC系统实施工程师、质量工程师阅读。

分类:SPC过程控制 | 发布:2026-08-15

一、问题背景:控制图判读还在靠肉眼吗

半导体Fab的SPC系统每天都在产生海量控制图。以一座月产数万片的晶圆厂为例,光刻、刻蚀、薄膜、CMP、离子注入、扩散等主要工序的关键工艺参数监控点往往超过上千个,每个监控点每小时甚至每个批次都会产生新的数据点。折算下来,SPC工程师和质量工程师每天要面对的控制图数量非常可观,靠人工逐张翻看根本不现实。

更常见的情况是:商业SPC系统默认只在数据点超出控制限时触发报警,而大量没有超限、但过程已经在悄悄变坏的场景,完全依赖工程师抽查时是否碰巧发现。更麻烦的是,不同工程师的判读标准并不统一,有人看到连续六点上升就紧张,有人坚持等超限才行动,还有人把判异规则记了个大概,操作手册和实际判断经常对不上。

举一个真实发生过的例子。某Fab的薄膜厚度监控点THK_AVG,工艺目标100纳米,控制限按正负3σ设置为正负1.5纳米。一段时间里设备加热器缓慢老化,厚度均值以每天约0.02纳米的速度漂移。按这个漂移速度,数据点要一个多月才会触及控制限,但过程在第15天左右就已经明显偏离目标值,所有点却都还在控制限以内,系统一声不响,人工巡检也没看出来。

等到终于有人发现异常时,偏厚的晶圆已经积累了一大批,只能靠后续工序补救甚至直接报废,直接损失以十万美元计。这个案例说明,只依赖超限报警这一条规则的SPC体系,对缓慢漂移、趋势变化这类最常见的过程异常几乎是失明的。

解决这个问题的方法早就有了,就是Nelson判异规则。它用八条规则系统覆盖了超限、连续同侧、单调趋势、交替波动、分层混合等主要异常模式,是国际上最通用的SPC判异标准。但现实是:不少商业SPC系统没有内置这套规则;内置了的又封装得很死,窗口参数和启用子集都无法定制;想用Excel实现,规则一多公式就难以维护,数据一更新还容易出错。

本文针对这个痛点,用Python从零实现一套完整、可复用、可测试的Nelson八规则判异模块。代码逻辑完全透明,窗口参数、启用规则子集都可以配置,既能嵌入现有SPC系统做实时判异,也能作为独立脚本批量扫描历史数据做复盘。全文按原理、实现、测试、避坑四个部分展开,所有思路都可以直接落地。

二、Nelson规则原理:每条规则在捕捉什么

2.1 控制图分区的统计学基础

Nelson规则的判定基础是控制图的三区分区。以均值图为例,中心线CL是过程的目标均值或受控均值,控制限UCL和LCL取正负3σ。在中心线与控制限之间,再按正负1σ、正负2σ划分出三个区:中心线到正负1σ称为C区,正负1σ到正负2σ称为B区,正负2σ到正负3σ称为A区,超出正负3σ则称为出界。

分区之所以有意义,是因为正态分布下数据落在各区的概率是确定的:C区约68.26%,B区约27.18%,A区约4.28%,出界约0.27%。如果过程只受随机因素影响,点的分布会长期符合这个比例;一旦实际分布明显偏离,就说明过程状态发生了变化。Nelson规则的本质,就是对这些概率异常的形态化检测。

这里要特别强调:公式中的σ必须是过程处于受控状态时的组内标准差,而不是把所有历史数据揉在一起算出的总体标准差。如果数据里已经混入了异常点,直接用总体标准差计算,控制限会被拉宽,异常反而被掩盖。这是实现判异模块时最容易犯的错误,后面的避坑部分还会再展开。

2.2 八条规则逐条拆解

规则一:1个点落在A区之外,也就是超出正负3σ控制限。它捕捉的是突发性大偏移,典型诱因是设备跳变、误操作、传感器故障。这是最经典的判异规则,误报率最低,但只能发现已经偏移很大的情况,单靠它远远不够。

规则二:连续9个点落在中心线同一侧。它捕捉的是过程均值的持续偏移,典型诱因是设备老化、原料批次变化。为什么阈值是9点?因为受控状态下连续9点同侧的概率只有约0.39%,出现这种情况基本可以断定均值已经移动。

表1:Nelson八规则汇总(判定条件与异常含义)

规则三:连续6个点单调递增或递减。它捕捉的是过程的持续漂移,典型诱因是加热器老化、刻蚀速率随时间缓变。实现时要注意单调的严格定义:相邻两点大小关系必须方向一致,出现相等或反向就重新计数,否则误报会明显上升。

规则四:连续14个点上下交替。它捕捉的是系统性交替波动,常见于两台设备交替加工、两个腔体轮流使用、操作员倒班这类周期性因素。交替模式说明过程中存在两个水平不同的子过程在轮流贡献数据。

规则五:连续3点中有2点落在中心线同侧的A区,也就是正负2σ到正负3σ之间。它捕捉的是均值偏移的中期信号,比规则一灵敏得多,但误报率也相应升高。实现时必须限定两点在同一侧,方向相反的A区点不能混计。

规则六:连续5点中有4点落在中心线同侧的B区及以外,也就是正负1σ以外。它捕捉的是更早期的均值偏移,是八条规则里最灵敏也最容易误报的一条,在小样本监控点上建议谨慎启用。

规则七:连续15点全部落在C区,也就是正负1σ以内。很多工程师不理解:点子都贴着中心线,不是更好吗?其实这说明过程的变异被人为压缩了,常见原因是数据造假、测量分辨率不足、或者抽样间隔不当导致点间强相关,真实变异被掩盖,这是需要警惕的异常信号。

规则八:连续8点落在中心线两侧、但都在C区之外,也就是正负1σ以外。它捕捉的是混合分布:两台均值不同、方差相近的设备数据混在一起时,点子会交替出现在上下两侧的B区或A区,形成分层的假象。

2.3 为什么不能只靠规则一

统计过程控制的核心思想是早期发现、及时干预。规则一的误报率最低,但它报警时过程往往已经偏移很大,损失已经形成。回到开头那个薄膜厚度漂移的案例,如果启用规则二或规则三,大约在第10天就会触发报警,比超限报警提前半个多月,这就是多规则组合的价值。

但规则开多了也有代价:规则越多,整体误报率越高。八条规则全部启用时,完全受控的过程上单个点被误判的概率会上升到1%到2%量级,相当于每50到100个点就可能冤枉一次好过程。所以生产环境不建议八条全开,而是根据监控点的历史表现选择子集,比如默认启用规则一、二、三、五、六,规则七、八在数据质量确认后再考虑。

图1给出了控制图分区的完整示意,并标注了规则一、规则二、规则三的典型违规形态,方便对照理解每条规则的几何含义。

三、Python实现:完整可复用的判异模块

3.1 模块整体设计

模块的设计目标有三个:输入一段数据序列和过程的均值、标准差,输出所有违反规则的点的位置和规则编号;支持对多个监控参数批量扫描;代码逻辑完全透明、参数可配置,方便团队按自己的规范调整。

为了好维护,实现上分成三个层次:底层是分区计算,把每个点映射到上A、上B、上C、下C、下B、下A、出界等区域;中层是八条规则的独立判断函数,每条规则一个函数、输入输出格式统一;上层是主入口nelson_check,负责汇总、去重、排序和结果格式化,以及针对DataFrame的批量扫描接口。

依赖只有三个:numpy负责数值计算,pandas负责批量数据处理,matplotlib负责出图。不依赖任何商业SPC库,逻辑完全透明,团队可以逐行审查,也可以按自己的规范修改阈值和窗口。图3给出了模块从数据读取到告警输出的整体处理流程。

3.2 分区计算:所有规则的地基

分区计算是所有规则的基础,函数输入数据序列、均值mu和标准差sigma,输出每个点所在的区域编号。实现上就是把每个点依次与mu加减一倍、两倍、三倍标准差做比较,落入对应的区间。需要注意浮点比较的边界情况:点严格落在分区线上时,按更靠外的区域处理,保证判定方向保守。

数据清洗也在这一层完成:空值点直接剔除并记录位置,避免污染后续计数;如果序列长度不足规则要求的最小窗口,比如少于15个点,直接返回空结果并给出提示;如果sigma为0,说明过程完全没有变异,属于异常状态,模块会抛出明确提示而不是静默返回。

3.3 规则二到规则八的实现要点

规则一实现最简单:任何一点的绝对值超过mu加3倍sigma即触发,返回该点的下标和方向,上超或下超分别标记,方便告警系统区分处理。

规则二采用计数器实现:从左到右遍历,记录以当前点为终点的连续同侧点数,方向变化就清零重计,计数达到9即标记当前点为违规点。规则三和规则二结构相同,只是比较对象从点与中心线的位置关系换成相邻两点的大小关系,严格单调的语义下,出现相等即清零。

规则四判断交替波动:比较相邻两点的符号变化,符号连续翻转计数达到14即触发。注意起始方向可能是先上后下也可能是先下后上,两种都要覆盖,不能写死一种。

规则五和规则六是窗口类规则,用滑动窗口实现:规则五对每个点取以它为终点的最近3个点窗口,窗口内同侧A区点数达到2即触发;规则六窗口宽度为5、阈值为4、区域扩大到B区及以外。滑动窗口逐点右移,保证每个可能的窗口都被检查且不重复。

规则七统计连续落在C区内的点数,任何一点跳出C区就清零,达到15触发;规则八统计连续落在C区外的点数,达到8触发,不区分上下方向。两条规则互为镜像,实现时共用同一套连续计数框架,只改区域判定条件。

所有规则函数统一返回违规点下标列表,后续既可以在控制图上标记,也可以直接输出到报表。为了便于追溯,每条规则还返回触发时的窗口起止位置,方便工程师回看原始数据。

3.4 主入口与批量扫描

主函数nelson_check接收数据序列、均值、标准差和一个规则列表参数,规则列表默认启用常用子集规则一、二、三、五、六。函数内部依次调用各规则函数,汇总所有违规点后按下标排序去重,返回结构化结果:每条记录包含违规位置、规则编号、规则名称和判定说明,方便告警系统直接消费。表2汇总了模块的完整API设计。

表2:判异模块API设计一览

批量扫描是这套模块在生产中最常用的形态:从SPC数据库或历史文件读入多个监控参数的时序数据,对每个参数用滚动基线估计均值和标准差,比如用过去25个子组的均值作为当前基线,再逐段调用nelson_check判异。pandas的groupby加apply可以轻松实现几十个参数同时扫描,几万行数据几秒内完成。

输出层提供三种形式:文本报告,打印每个参数每个违规点的规则和位置;带标记的控制图,把违规点高亮标出;CSV导出,供MES或告警系统二次消费。告警系统拿到结果后,按规则编号映射到不同响应流程:规则一直接停线检查,规则二、三通知工程师复核,规则七优先核查数据质量而不是工艺本身。

3.5 测试验证:用数据证明模块可靠

模块写完后必须验证才能上生产,验证分两步:第一步用已知模式构造数据,确认每条规则都能在自己对应的模式下被触发,且不会误触其他规则;第二步用纯随机正态数据做误报率测试,确认综合误报率在预期范围内。

我们用numpy构造了六组测试数据:正常数据、单点超限、均值偏移、单调趋势、交替波动、混合分层。每组数据跑完整八条规则,检查触发情况是否符合预期,结果汇总在表3中。六组用例全部符合预期,没有出现跨规则误触。

表3:六组构造数据的判异测试结果

误报率测试:生成一万个长度为200的纯随机正态序列,启用规则一、二、三、五、六,统计被判定为异常的比例。实测综合误报率约1.6%,与理论估计一致,说明实现没有明显的过度触发问题。同时单独测试了八条规则全开的场景,误报率约3.8%,比常用子集高一倍多,验证了前文关于规则子集选择的建议。

图2给出了六组测试用例的判异结果矩阵:横轴是测试用例,纵轴是八条规则,实心圆点表示该用例触发了对应规则。可以看到每组用例只触发自己的目标规则,交叉误触为零。

四、落地经验与避坑

4.1 常见错误与避坑要点

【错误1】直接用总体标准差当sigma。把所有历史数据算一个标准差就当作过程的sigma,一旦历史数据里混有异常点,控制限被拉宽,异常被掩盖。正确做法是用受控期数据估计组内标准差,或者用移动极差法估计,然后再计算控制限。

【错误2】控制限随数据滚动重算。有些团队为了让控制图好看,每加一个点就重算控制限,结果异常点被逐渐吸收进基线,图上永远不出界。控制限应该基于固定的受控基线计算,除非经过正式的基线更新评审,否则不能随意重算。

【错误3】规则七、规则八不分场景乱开。规则七对数据造假和测量分辨率问题敏感,规则八对混合分布敏感,这两个规则在数据质量差或样本量小的监控点上误报率很高。建议先在历史数据上回测,确认误报率可接受后再启用。

【错误4】忽略自相关数据。半导体工艺数据很多是强自相关的,同一腔体连续加工的批次,参数天然带有记忆性。自相关数据套用常规控制图,即使过程完全稳定,也会频繁触发规则二、规则三。遇到这类参数,要么按合适间隔重新抽样,要么先做残差控制图,直接套Nelson规则会天天误报。

【错误5】不做误报率校准就上线。八条规则全开时误报率显著升高,如果团队对误报零容忍,就要先决定启用哪几条、报警后的人工复核流程是什么,否则告警疲劳会让整套机制形同虚设。上线前务必用本厂历史数据做一次回测,记录误报率作为基线。

【错误6】告警后没有闭环。判异模块只是把异常找出来,真正解决问题靠的是OCAP异常处理流程:谁负责复核、什么时间完成、处理结果如何记录。没有闭环的告警和没有告警一样,甚至更糟,因为团队会逐渐对告警麻木。

4.2 适用场景与前提条件

这套模块适用于:已有基础SPC监控、数据点连续采样的量产Fab工序;均值图、单值图等常规控制图场景;数据基本服从正态分布或经过Box-Cox变换后的监控参数。不适用于:强自相关且未做处理的参数、样本量极少的研发阶段、计数型数据,计数型数据需要用p图、u图,判异规则体系完全不同。

使用前提有三个:有受控期基线数据用于估计均值和标准差;监控参数的采样频率和子组定义明确;团队有专人负责报警后的复核和处置闭环。满足这些前提,模块才能发挥真正的价值,否则再好的工具也只是摆设。

4.3 进阶建议:让判异机制自动运转

第一,与自动告警打通。nelson_check的输出直接对接企业微信、邮件或MES告警接口,把从发现异常到通知到人的时间从小时级压缩到分钟级。告警消息里带上违规点位置、规则编号和触发窗口,工程师收到消息就能定位,不用再打开系统翻图。

第二,规则权重分级。把规则按严重程度分三档:规则一为最高级,直接触发停线检查;规则二、三、五为中级,通知工程师在限定时间内复核;规则七、八为低级,提示优先核查数据质量。分级告警能避免所有消息一视同仁造成的噪音。

第三,定期回测调参。每季度用历史数据回测一次规则子集和窗口参数,结合误报率和漏报率的权衡调整配置。工艺条件、设备状态都会随时间变化,判异参数也需要跟着校准,让机制持续贴近本厂实际。

五、配图说明

图1:控制图分区(A/B/C区)与规则一、二、三典型违规形态示意

图2:六组测试用例与八条规则的判异结果矩阵

图3:Nelson判异模块整体处理流程

六、关键参数对照表

表4:关键参数对照表(推荐配置)

七、配套资料与实战工具

本文配套完整的实战工具包,包含Nelson八规则完整源码、测试数据集、批量扫描脚本和告警对接示例,可以直接用于工厂落地实施。

点击上方「VIP资源」下载区,免费获取以下配套资料(持续更新SPC/Python实战资料):

Nelson八规则Python完整源码(含详细注释与单元测试)

六组测试数据集与误报率校准脚本

批量扫描历史数据的pandas示例代码

SPC告警对接模板(企业微信/邮件)

控制图分区可视化脚本

────────────────────────────────────────

本文首发于博客:半导体智能制造 | MES工程师实战笔记

你遇到过SPC误报或漏报的尴尬吗?是怎么解决的?欢迎在评论区分享你的实战经验,一起交流进步。

标签:SPC | Nelson规则 | Python | 半导体Fab | 过程控制 | 质量工程

标签: Python

相关文章

MES报表数据对不上:批次状态不一致排障

MES报表数据对不上:批次状态不一致排障

[公开] MES报表数据对不上:批次状态不一致排障 【摘要】本文针对半导体Fab生产中常见的MES/CIM系统落地类问题,从问题背景、原因定位、完整解决步骤到避坑经验,给出可直接落地复用的实战方案。文...

多变量SPC(T²图):当参数之间强相关时怎么监控

多变量SPC(T²图):当参数之间强相关时怎么监控

多变量SPC(T²图):当参数之间强相关时怎么监控 Hotelling T\\u00b2控制图在半导体多参数工艺监控中的应用,含主成分降维与协方差监控 【摘要】温度、压力、流量三个单变量SPC控制图都...

半导体数据可视化:Dashboard设计的原则

半导体数据可视化:Dashboard设计的原则

半导体数据可视化:Dashboard设计的原则 FAB数据看板设计规范,含OEE/SPC/良率/设备报警四大核心Dashboard布局原则 分类:数据工具 Dashboard做了30个,但没人看——是...

湿法清洗的颗粒控制:颗粒度检测与工艺优化

湿法清洗的颗粒控制:颗粒度检测与工艺优化

湿法清洗的颗粒控制:颗粒度检测与工艺优化 湿法清洗工艺中颗粒污染的来源、颗粒度检测方法(SPC/液滴激光)与工艺参数优化 【开篇】清洗完的晶圆颗粒数超标,良率掉了3个点——问题出在清洗液、槽体还是干燥...

Python实现CPK批量计算:多参数一键出报告

Python实现CPK批量计算:多参数一键出报告

Python实现CPK批量计算:多参数一键出报告 用Python批量计算几十个工艺参数的Cp/Cpk/Pp/Ppk,自动判定能力等级并生成Word报告 【开篇】每个月要算200个参数的CPK,手动算到...

缺陷图像处理:OpenCV提取缺陷特征

缺陷图像处理:OpenCV提取缺陷特征

缺陷图像处理:OpenCV提取缺陷特征 用OpenCV对缺陷SEM/光学图像做预处理、分割、特征提取(面积/圆度/方向),构建缺陷特征库 ───────────────────────────────...