异常值与离群点检验器|SPC实战工具
这个工具解决什么问题
把手工反复核对的环节交给脚本,是这类工具最实在的收益:省下的不是时间,是返工。
「这个数据点该不该剔掉」天天遇到:测厚仪偶尔跳一个读数、来料混进一颗异常样品。凭感觉剔点会掩盖真实异常,一律保留又会让均值与标准差被单点带偏。更麻烦的是,不同判据在不同样本量下表现不同,用错方法会误杀正常数据。
输入数据格式
数据文件 outlier_sample.csv,列顺序为:group、sample_id、value。
示例首行:镀层厚度(μm),N-01,12.65
示例输出(真实运行结果节选)
==============================================================================================================
异常值与离群点检验报告
==============================================================================================================
判据:Grubbs(α=0.05,迭代) / Dixon r10(n≤10) / 稳健Z(MAD,阈值3.5) / IQR(×1.5)
--------------------------------------------------------------------------------------------------------------
【镀层厚度(μm)】n = 20 ;均值 12.5291,标准差 0.1987,中位数 12.5455,MAD 0.1025
Q1 = 12.4400,Q3 = 12.6065,极差 = 0.9800
--------------------------------------------------------------------------------------------------------------
Grubbs 临界值 G_crit = 2.7082(n=20,α=0.05)
第 1 次迭代:PLANT-LOW = 11.9800,G = 2.7635,G_crit = 2.7082 → 剔除
第 2 次迭代:PLANT-HIGH = 12.9600,G = 2.5932,G_crit = 2.6809 → 保留并停止
Dixon r10:不适用(n>10,请以 Grubbs 为准)
稳健 Z(MAD):MAD = 0.1025,检出 ['PLANT-LOW']
IQR 箱线:界限 [12.1903, 12.8562],检出 ['PLANT-HIGH', 'PLANT-LOW']
结论:
PLANT-LOW 值 = 11.9800,偏离均值 -2.76σ,被 Grubbs/稳健Z/IQR 检出 → 高置信(3 个方法同时指认)
PLANT-HIGH 值 = 12.9600,偏离均值 +2.17σ,被 IQR 检出 → 仅单一方法指认,建议复测
========
一句话
四种判据交叉验证离群点,并用蒙特卡洛自检判据的误报率。
运行环境与快速开始
纯 Python 标准库,零第三方依赖,Python 3.8+ 开箱即跑。
python outlier_detection.py # 首次运行会用同目录的示例数据跑出报告 python outlier_detection.py 你的数据.csv # 需要时可在脚本内改成读取自己的文件
运行后在控制台打印完整中文报告,并写出 示例输出报告.txt。
输入数据格式
CSV 列为:group(数据组)、sample_id、value(测量值)
同目录的 outlier_sample.csv 即为可直接运行的示例数据。
输出说明
① 基本统计(均值、标准差、中位数、MAD、Q1/Q3、极差);② Grubbs 迭代过程与临界值、Dixon r10、稳健 Z、IQR 四种判据的检出结果;③ 交叉确认的离群点分级(高置信 / 仅单方法指认);④ 自检:Grubbs 判据的蒙特卡洛实际显著性水平;⑤ 处理建议
算法口径(关键公式)
Grubbs:G = max|x − x̄|/s,G_crit = ((n−1)/√n)·√(t²/(n−2+t²)),t 为 t 分布 α/(2n) 分位(自实现不完全贝塔函数求逆),迭代剔除;Dixon r10:Q = 极值与其相邻值之差 / 极差(n ≤ 10 适用);稳健 Z:|0.6745(x − 中位数)/MAD| > 3.5;IQR:超出 [Q1 − 1.5IQR, Q3 + 1.5IQR]。
参数与调整点
· ALPHA:Grubbs 显著性水平(默认 0.05,双侧)。 · MAD_K / IQR_K:稳健 Z 与箱线法阈值。 · MC_REPS:蒙特卡洛重复次数,用固定种子,结果可复现。
常见误判与注意事项
1. 剔除前必须先查明原因(设备跳数、记录串行、来料异常),无原因的剔除等于伪造数据。 2. 只有被 ≥2 个方法同时指认的点才适合剔除;单一方法指认的点优先复测。 3. 多点离群会发生「掩蔽效应」:两个方向相反的离群点会互相抬高标准差,导致都检不出。 4. Grubbs 适合 n≥7 的单变量数据;n≤10 可加做 Dixon;稳健 Z 与 IQR 对偏态分布更宽容。 5. 工具内置蒙特卡洛自检:在纯正态数据上实测误报率应接近名义 5%。
附赠
· 附赠提示词.txt:3 条同主题 AI 提示词,可直接投喂给任意大模型继续扩展分析。
可调参数与计算口径
脚本顶部集中了主要阈值与常量:CSV_NAME="outlier_sample.csv"、REPORT_NAME="示例输出报告.txt"、FIELDS=["group", "sample_id", "value"]。改完直接重跑即可,不必改动计算逻辑。
会生成哪些文件
运行后除控制台输出外,还会生成:outlier_sample.csv、示例输出报告.txt。
脚本里的主要处理步骤
t_crit_two_sided():求双侧 alpha 的 t 临界值:解 I_{df/(df+t²)}(df/2, 1/2) = alphagrubbs():迭代 Grubbs,返回 (被剔除的下标列表, 每步明细)。下标按原始顺序。mc_alpha():在纯正态样本上跑 Grubbs,统计至少剔除一个点的比例(应≈名义 alpha)make_sample():20 件测厚数据(标称 12.50 μm,σ≈0.12),植入两个已知离群点:一低一高。
以上步骤在脚本中是分开的函数,可以单独调用或按需替换其中一段,不必整体重写。
工具中出现的字段与提示
- 迭代 Grubbs,返回 (被剔除的下标列表, 每步明细)。下标按原始顺序。
- 在纯正态样本上跑 Grubbs,统计至少剔除一个点的比例(应≈名义 alpha)
- 20 件测厚数据(标称 12.50 μm,σ≈0.12),植入两个已知离群点:一低一高。
- 镀层厚度(μm)
- 异常值与离群点检验报告
- Q1 = %.4f,Q3 = %.4f,极差 = %.4f
- Grubbs 临界值 G_crit = %s(n=%d,α=%.2f)
- 不适用(n>10,请以 Grubbs 为准)
- 临界值 %.3f,未检出
- 临界值 %.3f,检出 %s
- 稳健 Z(MAD):MAD = %.4f,%s
- IQR 箱线:界限 [%.4f, %.4f],%s
下载与文件清单
压缩包内包含:主程序脚本、示例数据文件、示例输出报告、中文说明文档,以及同主题 AI 提示词一套。解压后按说明运行即可,示例数据可直接试跑。
主程序文件:outlier_detection.py。
本站工具免费下载,无需注册。工具为 Python 脚本,Python 3.8 及以上环境可直接运行,核心功能尽量不依赖第三方库。
常见问题
输入数据要准备成什么样?
按 示例首行中的列顺序准备即可,共 3 列:group、sample_id、value。列为空或格式不符时结果会失真,建议先用示例数据试跑一遍。
跑完最该关注哪几项?
报告按 %s 等部分组织,其中判定结论与建议部分直接对应下一步动作。
阈值可以改成我们自己的标准吗?
可以,脚本顶部已把主要阈值与常量集中声明,按自己产线的标准修改后重跑即可,不需要改计算逻辑。
附赠的提示词怎么用?
把提示词与自己的数据一起交给大模型,可以让它按同一套口径帮你改写分析流程或扩展报告字段。
同分类的其它工具
本工具归在 SPC与质量分析工具包,全部工具见 工具资源包下载页。





