感谢您收看本期节目。这里是“测试数据中的拼写错误识别”。我叫Nathan Gambles,是Frontgrade Technologies的首席产品工程师。我在Frontgrade负责高可靠性集成电路的制造和测试,我们的客户主要面向医疗、航空航天、军事以及其他任何需要高安全性电子产品的领域。
今天,我将和大家分享我参与的一项根本原因分析调查案例。当时我们发现数据中存在一些有趣的异常情况,最终发现是由于一些拼写错误导致了测试结果出现问题。接下来,我将和大家分享我们是如何识别并进一步调查这些问题的。
我先简单介绍一下我当时的工作内容。就像我刚才说的,我当时在生产集成电路。屏幕上这里有一个集成电路的例子。很多人把它们叫做电脑芯片。集成电路的特点是形状、尺寸和引脚数量各不相同。很多集成电路都有很多不同的引脚,每个引脚的功能都不一样。我们在测试这些元件的时候,需要对很多不同的引脚进行相同的测试。我们稍后会从测试数据中看到这一点。
关于集成电路,我想补充一点,就是顶部的标记。通常,这些标记会标明制造商、产品名称、批号,或者也可能是生产日期代码。有时它们还会有序列号。我参与研发的大多数产品都有序列号,我们也正是通过序列号来追踪产品在整个生产过程中的流转。在接下来的内容中,序列号将至关重要。
我们生产的零部件来自我工作的工厂,这家工厂属于高品种、低产量工厂。我们生产的批次不多,不会同时生产太多零件,但任何一天,我们都可能生产多种不同的产品。
我们批量生产后,会先进行整理。接下来我将介绍一下测试环节的操作流程。在测试环节,我们会将测试程序加载到自动化测试设备上。程序加载完毕后,操作员会取出一个零件,查看零件,读取零件上的标记,然后将零件放入测试夹具中,输入零件的序列号,按下测试按钮。测试执行完毕后,数据会被采集。测试完成后,操作员会将零件从测试夹具中取出,放回托盘,然后对该批次的所有零件重复上述步骤。
简单来说,我刚才描述的是我们测试操作的一般流程。主要流程是:首先在室温下测试零件。然后对零件进行应力测试。之后再次在室温下测试零件,最后在冷态和热态下进行测试。冷态和热态测试的温度范围分别对应规范规定的最低和最高工作温度。
我们随后会对部件进行后续测试,包括在室温下再次测试,以及在冷态和热态下再次测试。第二轮测试是我们质量检查的一部分,旨在确保在第二和第三道工序的第一轮筛选中,不会有过多的故障部件漏网。我参与的根本原因调查,源于我们在第四和第五道测试工序中发现故障率高于预期,而我们原本预计这两道工序的故障率不会太高。
调查的许多分支都朝着不同的方向发展。我将重点介绍其中一个分支……我们收集了测试步骤中一些故障的数据,并深入分析了这些数据。通常情况下,对于给定的测量参数,如果我们查看冷态数据,会发现对于某个设备而言,如果它在冷态下处于分布的高端,那么在室温下也会处于分布的高端。在热态下,它同样处于分布的高端。同样,如果某个设备在冷态下处于低端或中间位置,情况也是如此。
有些后期失效的器件并不符合这种模式。它们的模式是这样的:有时一些数据显示它们的性能处于高端,而另一些数据又显示它们的性能处于低端,之后又有一些数据显示它们的性能再次处于高端。这显然不合逻辑。从半导体器件物理学的角度来看,这根本说不通。
经过一番头脑风暴,我们认为造成我们看到的数据最可能的根本原因是,我们可能实际上并没有查看来自我们预期的设备的数据,而且我们的数据中可能混入了一些拼写错误,从而导致了这种混乱。
随着调查的深入,我们希望找到一种分析技术,能够处理来自我们所有部件的数据。我们再次面临一个高度混合的环境。我们需要获取数据。我们希望确保操作过程不需要太多的专业知识。我们想要一个相对简单易行、结果易于查看的流程。这就是我们开展这项调查的目标。
这就是我们工作的背景和原因。我将要使用的示例数据可以在JMP期刊中找到(链接在此)。点击该按钮,即可生成一个数据集。我已经打开了这个数据集。首先,我想简单介绍一下数据内容,以便我们更好地理解它。
这是数据。这个数据表中有 441 行数据。每一行都记录了一次测试操作中的批次信息。这与我们刚才查看的 PowerPoint 内容相符。数据包括测试温度以及操作员在测试过程中输入的序列号。此外,该数据集还包含 300 列测量值。数据表中的每一行都代表一次测试程序的执行。我们可以看到,测试次数很多,共有 300 次。
我之前提到过我们有多个不同的引脚。可以看到,测试 A 在引脚 1 上进行了测量。测试 A 也测量了引脚 2。如果我快速滚动页面,可以看到我们对许多不同的引脚进行了多次测试。还有一些测试并非逐个引脚进行。有些测试没有这种特性,但很多测试都有。基本上,这里包含了各种各样的测试,总共有 300 列测量值。
我想指出的一点是,我们已经有了数据表,但数据是堆叠的。有些行是室温数据,有些行是低温数据,有些行是高温数据。在进行数据准备时,我将使用 JMP 中的分组功能,以确保我们计算的统计数据不会受到这些温度差异的影响。
我快速浏览一下数据。如果我在这里打开一个图表生成器。我们看一下这张图表,可以看到我们当前处于哪个操作阶段,我们采集数据时的温度,以及所有测试过的序列号。Y轴代表测量值,我们可以看到室温下的数据点就在这里。低温下,数据点向下移动到另一个值。高温下,数据点再次移动。然后回到室温,再回到低温,最后回到高温。
半导体测量值出现偏差是很常见的。抱歉,半导体数据采集过程中出现偏差非常普遍。如果我浏览很多测试数据,可以看到我们对很多笔都做了相同的测试。最终会得到很多高度相关的参数。如果我继续浏览,会发现很多测试结果都非常相似。但如果我跳转到一些看起来不同的测试,就会发现有些测试的数据看起来不一样。有些测试对温度的响应也不同。
举个例子。部分测量值确实存在一些相当极端的异常值。在半导体行业,如果器件存在缺陷并发生故障,而且故障幅度很大,这种情况并不少见。处理异常值是我们流程中必须考虑的问题。我们发现,由于温度的影响,测量值出现了偏移。同样,由于我们的数据是按列分组的,因此我们需要使用 JMP 的分组功能来处理这个问题。
快速查看一下序列号的分布情况,可以看到这个数据集里有 65 个不同的唯一序列号条目。这个样本数据集包含 65 个序列号。我们已经探索了数据,对数据有了一定的了解。接下来,我们将开始执行之前确定的、能够有效识别数据中拼写错误的流程。
第一步,我们需要对数据进行一些准备工作,使用“探索异常值”功能去除异常值。我们还要使用公式列计算标准化 Z 分数。为此,我们将使用“分析”、“筛选”、“探索异常值”功能。我们将提取全部 300 个测量值,并按温度进行分析。
我打算使用分位数范围异常值检测方法。需要说明的是,在整个演示过程中,我将使用 JMP 的默认设置来处理所有平台。我将使用默认设置来检测分位数范围异常值。在初始状态下,为了清除表格中的异常值,我将使用“创建公式列”选项。
我将保留默认设置。接下来,我将处理“房间”数据。对于“房间”数据,我将执行相同的操作,即创建公式列。对于“热门”数据,我也将执行相同的操作,即创建公式列。现在,我们的表格中已经生成了多个公式列。如果我在这里进行一些清理,我们将得到 300 列新数据,其中已删除了异常值。
接下来我想做的是,我想将操作和温度设置为分组依据……因为我将使用新的公式列功能,但我希望通过设置此参数来实现分组依据功能,以便按温度和操作计算所有 300 个异常值参数的统计数据。
我已经清除了所有 300 列中的异常值。如果我右键单击“新建公式”列下的“分布”选项,可以看到“标准化”功能,它会计算所有参数的标准化 Z 分数。这样就创建了一组全新的列。如果我再进行一些清理工作,现在我们就有了 300 列标准化数据。
为了快速直观地展示我们刚刚取得的成果,我打开图表生成器,查看测试 E8。之前,我们遇到了一个极端异常值,导致数据难以辨认。移除异常值后,我们能够看到数据,但不同操作和不同温度下的测量值仍然存在跳跃。在按操作和温度进行标准化后,我们使每个分布都以零为中心,标准差均为 1,这意味着所有数据几乎都落在正负 3 的范围内。
在这个尺度上,我们找错了位置。现在我们可以问一些问题,比如,这些点在那个操作和温度下,是处于分布的高端?是处于分布的低端?还是处于分布的中间位置?这就是我们在数据准备步骤中所做的。
接下来,我们要做的就是从这300个参数中找出哪些参数能够有效地预测序列号。为此,我们将使用预测因子筛选。我知道从数据来看,有很多参数彼此高度相关。我也知道预测因子筛选的结果会得出一些高度相关的参数。在进行预测因子筛选之后,我们将使用聚类变量来帮助我们剔除许多高度相关的参数,只保留我们正在寻找的最具代表性的测试结果。
为此,我们将使用筛选功能,即预测筛选。我们会将所有标准化列输入其中,并让它找出序列号。同样,这里也有一些选项。在本演示中,我使用的是默认设置。JMP 将处理这些数据,并生成一份报告,其中会按优先级排序哪些参数最能准确描述设备的序列号。
快速浏览一下,第一个参数看起来非常好,接下来的几个参数也相当不错。如果我们继续往下滚动,似乎在20个参数之后,添加新的参数并没有带来太大的提升。我将选择其中最好的20个参数。这些参数已经在数据表中选定了。现在,在“分析聚类”下,我将使用聚类变量来帮助识别这20个参数中高度相关的变量。
如果我把这20个数字放在Y列,就能得到这份报告。我通常会在报告中寻找鲜红色和鲜蓝色。我会数一数方格的数量。看起来有1、2、3、4、5、6。通过这次分析,我预计会得到大约六个参数,我们可以用它们来进行拼写检查。
在继续之前,我要确保我的列选择中没有任何已选择的列,这样当我在这个报告中选择它们时,它们才会被选中。从下面的聚类摘要来看,它似乎使用了我们全部 20 个参数,并显示“我可以将它们分成四个组,以下是每个组中最具代表性的组”。
那很好。但我发现这个平台很喜欢对数据进行聚类。看起来我这里有两个参数与其他20个参数的相关性都很差。它们被添加到了其他一些分组中,而我并不希望这样。我不仅会查看哪个分组最具代表性,还会查看这一列,确保如果某个参数最终被归入某个分组,那么它在该分组内的其他参数也具有良好的相关性。
往下看,我们发现很多数值都非常接近 1,这意味着它们之间高度相关。但是,这里有个数值非常接近 0,它与它所属的聚类组的相关性很差,与下一个最近的聚类组的相关性也不好,实际上它与任何聚类组都没有相关性。我还是想把这个参数也考虑进去。再往下看,似乎还有一个数值与它所属的聚类组的相关性也不好。这四个数值加上这两个数值,正好是我根据图片预期得到的六个数值。
这样我们就从数据表中选出了六列。如果我对列进行一些调整,比如取消分组、重新分组,就能得到一个列表,其中包含了我们根据现有数据用来理解序列号的最佳预测因子。
现在,我们已经确定了重要的参数。接下来,我们将进行分析,以确定是否存在序列号错误。我们将使用层次聚类平台进行分析。在“分析聚类”下的“层次聚类”中,我们将使用刚刚确定的六个最佳预测因子,并用序列号进行标记。
当然还有更多选项。我只是沿用了 JMP 的所有默认设置。这样我们就得到了层次聚类报告。我想在这里做一些修改,比如设置颜色聚类,这样更容易区分不同的组。我喜欢控制聚类的数量。最初查看数据时,这批数据中有 65 个不同的序列号。我发现,如果不要正好设置成 65,而是比预期批次中的设备总数略少一些,这种方法效果最好。在这个例子中,我把它设置成……不设 65,而是 58。
最后,为了完成这项分析,我需要从数据表中获取一个数据筛选器,并将其设置为按序列号筛选。这样我就可以选中所有序列号为 1 的行。如果这样做,我们可以在树状图报告中看到,所有序列号为 1 的数据行都聚集在一起。它们颜色相同,并且垂直排列。
这表明,我们这里使用的聚类算法在给定的六个参数下运行良好。如果我们逐一查看,序列号 2 的聚类效果也很好。如果我们逐个序列号地查看数据,观察它们的聚类情况……我们来到序列号 17,看起来大部分数据都集中在下方,而至少有一个数据点似乎位于上方。
这些点之间存在相当大的垂直距离。但比垂直距离更重要的是,如果你画一条线沿着这些点,就能连接你正在观察的这些点。看起来我需要画这条线。那么问题是,你需要向右看多远?我们必须向右看很远才能建立这个连接。向右看得越远,这些数据就越有可能与实际情况不符。
根据我对这幅树状图的理解,我认为这些数据看起来截然不同。如果我放大这个看似独立的点,会发现,根据我们掌握的六个参数,在测试中,大多数情况下,那些根据电气测试数据呈现出类似特征的设备,其输入的序列号都是 12,只有一次例外,当时输入的序列号是 17。
这很可能是由于零件上的标记被误读造成的。根据字体和标记的大小,数字 2 很可能看起来像数字 7。这是我们在数据中发现的常见拼写错误方式之一。这种方法已经识别出了这些错误。是的,我们已经能够使用这种方法识别出此数据集中的拼写错误。
接下来,我们选择所有与设备序列号 18 匹配的点。看起来这些点之间存在一些距离。放大数据后,如果我们重复之前的操作,在这些点之间画线,看起来我可以将它们连接起来。
那么问题来了,我需要向右走多远?其实我根本没走多远。这些数据看起来都非常相似。设备 18 和设备 29 的数据看起来几乎一模一样,这导致设备 18 的条目之间出现了一些细微的差别。这在我看来不像是个笔误,只是恰好有两个部分看起来比较相似而已。我肯定不会花时间去深入调查这件事。
如果我们继续查看更多这样的序列号,它们聚集得很好,我们来到了 25。看起来这里出现了一个分离点。如果我们继续观察,似乎需要向右移动相当一段距离,所以这些数据看起来不太相似。如果我们放大选定的单个点,再放大一点,看起来大多数情况下,测试中看起来像这样的零件的序列号都是 26,但我们遇到了一个序列号为 25 的例子。
如果我们放大查看其他选定的数据点,25 通常看起来是这样的,但是……似乎有一个实例出现了 26 这个条目。如果我们密切关注树状图中的选中项,并在序列号 25 和 26 之间切换,看起来是这样的……我们发现了一个实例,其中有两个设备,分别是设备 25 和 26。它们都进行了测试。但是,当测试设备 25 时,输入的序列号是 26。而当测试设备 26 时,输入的序列号却是 25。
这些数据可能顺序错了,或者其他什么原因导致了测试数据中出现这种类型的拼写错误。这是我们用这种方法发现的另一种拼写错误。我们可以继续检查剩下的序列号。如果我们要做完整的测试,我们会这么做。但为了节省时间,我只检查这些。
在这个过程中,我们遇到了一个问题:能否找到一种简单的方法,无需太多专业知识就能分析数据,从而判断是否存在拼写错误?我们刚才演示的这个流程,我觉得我们成功地找到了一个易于遵循的方法。虽然我们对这些测试参数的具体内容并不十分了解,但我们仍然能够完成这个流程,并至少得到一份可能的拼写错误清单,以便与相关领域的专家进行讨论。
这个过程非常简单,无论是经验丰富的工程师还是新工程师都能轻松上手。它完全使用了 JMP 的内置功能,我们甚至使用了所有默认参数,这使得自动化和脚本编写变得非常容易。这就是我们在自己的环境中所做的。他们不必手动操作,但所有工程师都会了解并理解我今天向大家演示的整个流程。
这次测试很成功。我们从中获得了宝贵的经验。我们能够识别测试数据中的拼写错误,并利用这些经验发现了一些系统性问题。这类拼写错误经常发生,原因是什么?这种拼写错误也经常发生,原因又是什么?我们已经对流程系统进行了一些改进。它不仅帮助我们提升了培训效果,而且对于与测试操作员进行讨论和反馈也非常有用,让我们能够了解发现的问题和遇到的困难。当他们掌握更多信息时,就能更好地关注这些问题,并就如何改进以及如何持续提升产品质量提出建议。
这就是我们开发并使用的流程。如果您拥有纵向数据,例如在相同或近似相同的条件下多次测试设备或产品的数据,那么这些方法或许也能帮助您发现数据中可能存在的问题。感谢您的参与。希望对您有所帮助。祝您愉快!