3、数据收集与预处理:失效数据来源、删失数据类型、数据清洗与异常值处理

各位工程师朋友,咱们今天聊聊可靠性分析里最基础、也最容易被忽视的一环——数据收集与预处理。

说实话,我见过太多人一上来就急着建模型、算参数,结果数据本身就有问题。你想想看,垃圾数据进去,再漂亮的Weibull图也是白搭。我自己刚入行那会儿就吃过这个亏,花了三周时间拟合出来的模型,结果被老工程师一句话点醒:“你这数据里混了维修记录,不是失效数据。”嗯,从那以后,我再也不敢跳过数据预处理这一步了。

核心观点:数据质量决定了分析结果的上限。模型再牛,也救不了烂数据。

3.1 失效数据从哪里来?

失效数据的来源,说白了就三大类:

  • 现场数据:产品在实际使用中记录下来的失效时间。这是最宝贵的数据,但也是最“脏”的。我在项目里遇到过,现场工程师记录的“失效时间”其实是“发现时间”,中间可能隔了好几个月。
  • 实验室数据:加速寿命试验、可靠性增长试验等受控环境下产生的数据。数据干净,但样本量通常不大。
  • 维修记录:这个要特别小心。维修记录里往往混着预防性更换、误报、人为损坏等情况,不能直接当失效数据用。

我个人习惯,拿到数据后第一件事就是问清楚:“这个数据是谁记录的?记录的目的是什么?” 目的不同,数据的偏差方向也不同。

3.2 删失数据类型——你遇到的“不完整”数据

可靠性数据里,真正完整的失效数据其实很少。大部分数据都是“删失”的。什么意思?就是你只知道它没坏,或者只知道它坏在某个时间段里,但不知道确切时间。

常见的删失类型有三种:

类型 定义 实际场景
右删失 只知道产品在某个时间点之后还没失效 试验结束时产品还在运行;客户反馈“用了3年还没坏”
左删失 只知道产品在某个时间点之前已经失效 巡检发现设备坏了,但不知道具体什么时候坏的
区间删失 只知道失效发生在两个时间点之间 定期检查发现故障,上次检查时还好好的

为什么会这样?因为现实世界不是实验室。你不可能24小时盯着每个产品看它什么时候坏。我曾经处理过一个风电项目的数据,现场工程师每三个月巡检一次,记录下来的全是区间删失数据。你要是按右删失去处理,参数估计会偏得离谱。

我的经验:处理区间删失数据时,可以尝试用中点法近似,但样本量小的时候误差很大。更稳妥的做法是用极大似然估计(MLE)直接处理区间数据,很多可靠性软件都支持。

3.3 数据清洗——把“脏数据”洗干净

数据清洗,说白了就是“去伪存真”。我总结了一套自己的流程:

  1. 去重:同一个失效事件被记录了两次?常见于多系统交叉记录。
  2. 格式统一:时间格式、单位、编号规则,必须统一。我见过一个项目里,有人用“2024-01-15”,有人用“2024/1/15”,还有人用“15-Jan-2024”。
  3. 逻辑校验:失效时间早于投产时间?安装时间晚于记录时间?这些明显不合逻辑的数据要标记出来。
  4. 缺失值处理:缺失失效时间?缺失产品编号?能补则补,补不了就剔除。

注意:不要轻易删除“看起来奇怪”的数据。我曾经删掉一批数据,后来发现那是产品设计变更前的正常表现。先调查,再处理。

3.4 异常值处理——别让“野点”毁了你的模型

异常值,也叫“野点”。它们可能是真实存在的极端情况,也可能是记录错误。怎么区分?

我常用的方法:

  • 图形法:画个概率图(Probability Plot),异常值会明显偏离直线。Weibull概率图尤其好用。
  • 统计法:用IQR(四分位距)或Z-score做初步筛选。但要注意,可靠性数据往往偏态分布,直接用正态分布的Z-score会误判。
  • 领域知识:这是最重要的。你问问自己:“这个失效时间合理吗?” 如果一台设计寿命10年的设备,用了3个月就坏了,那可能是早期失效,不是异常值。如果用了3天就坏了,那大概率是记录错误。

我曾经处理过一个案例,某批次产品的失效时间特别短,一看就是异常。后来调查发现,是运输过程中包装破损导致进水。这些数据不能直接剔除,但也不能混在正常数据里分析。正确的做法是单独分析,或者标记为“非正常失效”。

3.5 知识体系总览

下面这张图,是我自己梳理的数据收集与预处理流程。你照着这个走,基本不会漏掉关键步骤。

数据收集与预处理流程 数据来源 现场数据 实验室数据 维修记录 删失数据类型识别 右删失 左删失 区间删失 数据清洗与异常值处理 干净可用的失效数据

3.6 避坑指南

最后,分享几个我踩过的坑:

  • 别把“维修时间”当“失效时间”。 维修时间往往比实际失效时间晚,直接使用会导致MTBF估计偏大。
  • 注意“竞争失效”。 一个产品可能有多种失效模式,比如轴承磨损和电路板烧毁。如果混在一起分析,Weibull图会出现明显的拐点。这时候应该分层分析。
  • 保留原始数据。 我习惯在清洗前先备份一份原始数据。万一处理错了,还能回头重来。

一个小技巧: 用Python做数据清洗时,我常用pandasinfo()describe()快速了解数据概况。再用isnull().sum()检查缺失值。代码很简单,但很实用。

import pandas as pd

# 读取数据
df = pd.read_csv('failure_data.csv')

# 快速查看
print(df.info())
print(df.describe())

# 检查缺失值
print(df.isnull().sum())

# 标记异常值(以失效时间为例)
Q1 = df['failure_time'].quantile(0.25)
Q3 = df['failure_time'].quantile(0.75)
IQR = Q3 - Q1
outliers = df[(df['failure_time'] < Q1 - 1.5*IQR) | (df['failure_time'] > Q3 + 1.5*IQR)]
print(f"发现 {len(outliers)} 个异常值")

好了,数据收集与预处理这部分就聊到这儿。记住一句话:数据预处理花的时间,后面建模会加倍还给你。别急,慢慢来。

专注资料整理