3. 数据清洗基础:缺失值处理与异常值检测
在工业故障诊断中,原始数据往往因传感器故障、通信中断、环境干扰等原因存在缺失值与异常值。若不加以处理,将直接影响后续特征提取、寿命预测与故障判定的准确性。本节系统讲解缺失值处理的三种经典方法以及异常值检测的两大统计准则。
3.1 缺失值处理方法
缺失值处理的核心策略分为三类:删除法、均值填充与插值法。下表从适用场景、优缺点及工业应用角度进行对比:
| 方法 | 原理 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| 删除法 | 直接删除含缺失值的行或列 | 缺失比例低(<5%)、随机缺失 | 简单快速,不引入偏差 | 丢失信息,样本量减少 |
| 均值填充 | 用该特征非缺失值的均值替代缺失值 | 数据分布较对称、缺失比例适中 | 计算简单,保留样本量 | 降低方差,可能扭曲分布 |
| 插值法 | 利用相邻点或多项式拟合估计缺失值 | 时间序列数据、趋势明显 | 保留时序趋势,精度较高 | 计算量较大,边界点不稳定 |
3.1.1 删除法
删除法是最直接的缺失值处理方式。在工业数据中,若某传感器通道在短时间内大量缺失(如通信中断超过10%),通常直接删除该通道或对应时间段的样本。Python实现如下:
import pandas as pd
import numpy as np
# 示例:删除含缺失值的行
df = pd.DataFrame({'温度': [25, np.nan, 27, 28, np.nan],
'振动': [0.1, 0.2, np.nan, 0.4, 0.5]})
df_dropna = df.dropna() # 删除任何含NaN的行
print(df_dropna)
3.1.2 均值填充
均值填充适用于缺失值比例不高且数据分布较为集中的场景。需注意:若数据存在明显趋势或周期性,均值填充会破坏原有波动特征。代码示例:
# 均值填充
df_filled = df.fillna(df.mean())
print(df_filled)
3.1.3 插值法
对于时间序列数据(如振动加速度、温度变化曲线),插值法能更好地保留局部趋势。常用方法包括线性插值、样条插值等。工业案例中,对轴承振动信号的短时缺失(<5个连续点)推荐使用线性插值:
# 线性插值
df_interp = df.interpolate(method='linear')
print(df_interp)
工业经验提示: 对于旋转机械的连续监测数据,优先使用插值法;对于静态工况参数(如环境温度),均值填充可接受;删除法仅用于缺失比例极低或非关键通道。
3.2 异常值检测方法
异常值指显著偏离正常数据分布范围的观测点,可能源于传感器尖峰干扰、设备突发冲击或记录错误。本节重点介绍两种经典统计方法:3σ原则与IQR法。
| 方法 | 判定依据 | 适用分布 | 阈值 | 工业典型应用 |
|---|---|---|---|---|
| 3σ原则 | 均值 ± 3倍标准差 | 近似正态分布 | μ ± 3σ | 稳态工况下的温度、压力监测 |
| IQR法 | 四分位距的1.5倍 | 偏态分布或未知分布 | Q1 - 1.5×IQR, Q3 + 1.5×IQR | 振动幅值、非对称波动参数 |
3.2.1 3σ原则
3σ原则假设数据服从正态分布,超出均值±3倍标准差的值视为异常。在工业故障诊断中,常用于检测传感器突发漂移或瞬时冲击。实现代码:
def detect_outliers_3sigma(data):
mean = np.mean(data)
std = np.std(data)
lower = mean - 3 * std
upper = mean + 3 * std
outliers = (data < lower) | (data > upper)
return outliers, lower, upper
# 示例
data = np.array([10, 12, 11, 13, 12, 100, 11, 12])
outliers, low, up = detect_outliers_3sigma(data)
print("异常值索引:", np.where(outliers)[0])
3.2.2 IQR法
IQR法基于四分位数,对数据分布假设要求较低,适用于工业中常见的偏态分布数据(如振动峰值、磨损量)。其判定区间为:
- 下界 = Q1 - 1.5 × IQR
- 上界 = Q3 + 1.5 × IQR
- 超出上下界的数据点标记为异常
def detect_outliers_iqr(data):
Q1 = np.percentile(data, 25)
Q3 = np.percentile(data, 75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outliers = (data < lower) | (data > upper)
return outliers, lower, upper
# 示例
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 20])
outliers, low, up = detect_outliers_iqr(data)
print("异常值索引:", np.where(outliers)[0])
关键对比: 3σ原则对极端值敏感(均值和标准差易被异常值拉偏),而IQR法基于中位数和四分位距,鲁棒性更强。在工业预处理中,建议先用IQR法做初步筛查,再用3σ原则验证正态分布特征明显的参数。
注意事项: 异常值检测前必须先处理缺失值,否则缺失值会被误判为异常点。同时,对于故障数据中的异常值,需结合物理机理判断是传感器噪声还是真实故障前兆,避免误删关键信息。