3. 重复故障时间分布与聚集性检验
为什么“重复”不等于“聚集”
前两步已经得到一份去重后的重复故障清单,但清单只告诉我们“哪些故障重复了、重复了几次”,并没有回答“这些重复发生在时间轴上的什么位置”。如果同一部件的 5 次故障均匀分布在 18 个月内,它更像随机偶发;如果 5 次中有 4 次挤在连续 6 周内,就存在明显的集中爆发窗口,根因排查应优先锁定该窗口内的运用条件、检修动作或批次件更换记录。
本节的任务是对重复故障序列做两件事:时间间隔分布刻画与聚集性检验。前者看相邻两次故障之间隔了多久,后者判断这种间隔结构是否偏离“随机散布”的假设。为避免把统计结论建立在主观印象上,我们采用两个互补指标:
- 间隔变异系数 CV:CV = 间隔标准差 / 间隔均值。若故障近似泊松随机过程,间隔服从指数分布,CV 理论值约为 1;CV 明显小于 1 说明间隔过于均匀(可能是周期性检修诱发),CV 明显大于 1 说明间隔忽长忽短、存在成簇。
- 扫描窗口最大计数:在给定窗口宽度 W 内滑动统计故障次数,取最大值并与随机模拟的零分布比较,得到经验 p 值。它直接回答“是否存在集中爆发窗口”,且能给出窗口的起止时间,便于后续排查聚焦。
本节使用的示例数据与口径
以下数据为教学示例,模拟某城轨线路一列车(编组示例:Tc1-Mp1-M1-M2-Mp2-Tc2)上“车门关闭故障(现象码 DOR-CLOSE-FAIL,原因码待定)”的重复故障序列。时间以首次故障为第 0 天计,单位为天。示例共 9 次故障,观察期 540 天。
| 序号 | 故障日(天) | 相邻间隔(天) | 备注 |
|---|---|---|---|
| 1 | 0 | — | 首次记录 |
| 2 | 37 | 37 | |
| 3 | 95 | 58 | |
| 4 | 268 | 173 | 长间隔 |
| 5 | 281 | 13 | 进入密集段 |
| 6 | 296 | 15 | |
| 7 | 305 | 9 | |
| 8 | 318 | 13 | |
| 9 | 470 | 152 | 长间隔 |
口径说明:间隔按“相邻两次故障日之差”计算,共 8 个间隔;观察期从第 0 天到第 540 天,用于扫描窗口时把窗口限制在观察期内,避免边界外推。
间隔分布与聚集性检验的实现
下面给出可直接运行的 Python 实现。它读取上述序列,计算间隔统计量与 CV,并用蒙特卡洛方法对扫描窗口做显著性检验。随机零模型采用“在观察期内均匀随机放置同样数量的故障点”,重复 20000 次,得到最大窗口计数的零分布。
import numpy as np
# 教学示例:重复故障发生日(天),已按时间升序
days = np.array([0, 37, 95, 268, 281, 296, 305, 318, 470], dtype=float)
OBS_END = 540.0 # 观察期结束(天)
W = 60.0 # 扫描窗口宽度(天)
N_SIM = 20000
rng = np.random.default_rng(20240501)
# 1) 间隔分布
gaps = np.diff(days)
gap_mean = gaps.mean()
gap_std = gaps.std(ddof=1)
cv = gap_std / gap_mean
# 2) 实际序列的扫描窗口最大计数与对应窗口起点
def scan_max(pts, w, end):
best_cnt, best_start = 0, None
for s in pts:
if s + w > end:
continue
cnt = np.sum((pts >= s) & (pts < s + w))
if cnt > best_cnt:
best_cnt, best_start = cnt, s
return best_cnt, best_start
obs_cnt, obs_start = scan_max(days, W, OBS_END)
# 3) 蒙特卡洛零分布:观察期内均匀随机放置同样数量的点
sim_cnts = np.empty(N_SIM, dtype=int)
for i in range(N_SIM):
sim = np.sort(rng.uniform(0, OBS_END, size=days.size))
sim_cnts[i], _ = scan_max(sim, W, OBS_END)
p_value = (np.sum(sim_cnts >= obs_cnt) + 1) / (N_SIM + 1)
print(f"间隔均值 = {gap_mean:.1f} 天, 标准差 = {gap_std:.1f} 天, CV = {cv:.2f}")
print(f"窗口 W = {W:.0f} 天, 实际最大计数 = {obs_cnt}, 窗口起点 = 第 {obs_start:.0f} 天")
print(f"零分布均值 = {sim_cnts.mean():.2f}, 95% 分位 = {np.percentile(sim_cnts, 95):.0f}")
print(f"经验 p 值 = {p_value:.4f}")
按上述示例数据运行,预期输出为:间隔均值约 58.8 天、标准差约 63.4 天、CV 约 1.08;窗口 W=60 天时实际最大计数为 4,窗口起点为第 268 天;零分布均值约 1.0,95% 分位为 3;经验 p 值约 0.01 量级。这些数值由给定输入直接推出,属于示例结果,不代表真实线路实测。
如何读这张图与这组数
读图要点:
- CV ≈ 1.08 不能直接下“随机”结论。CV 是全局指标,长间隔(173 天、152 天)与短间隔(9~15 天)相互抵消,使整体看起来接近指数分布。这正是只看 CV 会漏判的原因。
- 扫描窗口把问题定位到第 268 天起。60 天窗口内出现 4 次,而随机零模型的 95% 分位只有 3 次,p 值约 0.01,说明“4 次挤在 60 天内”在随机假设下并不常见。
- 窗口宽度 W 是敏感参数。W 太小会把密集段切碎、计数偏低;W 太大则把长间隔也吞进来、稀释信号。工程上建议取“平均间隔的 0.8~1.2 倍”作为初值,并对 W 做一次敏感性扫描(如 30/45/60/90 天),观察 p 值与窗口起点是否稳定。
窗口宽度敏感性检查
单点结论容易受参数选择影响,因此对 W 做一次扫描是必要的。下面代码复用同一序列,输出不同 W 下的最大计数、窗口起点与 p 值,用于判断结论是否稳健。
for w in (30, 45, 60, 90):
obs_c, obs_s = scan_max(days, w, OBS_END)
sims = np.empty(N_SIM, dtype=int)
for i in range(N_SIM):
s = np.sort(rng.uniform(0, OBS_END, size=days.size))
sims[i], _ = scan_max(s, w, OBS_END)
p = (np.sum(sims >= obs_c) + 1) / (N_SIM + 1)
print(f"W={w:>2}天 最大计数={obs_c} 起点=第{obs_s:.0f}天 p={p:.4f}")
示例数据下的预期趋势:W=30 天时最大计数为 3(第 281 天起),p 值偏大;W=45 天与 W=60 天时最大计数为 4,p 值在 0.01 量级;W=90 天时窗口可能把第 268 天前后的点全部纳入,计数升到 5,但零分布分位也同步升高,p 值未必更小。若多个 W 下窗口起点都落在第 268~281 天附近,说明爆发窗口的位置判断是稳健的,可以据此确定排查时间范围。
从统计结论到排查动作
聚集性检验的输出不应停在“p 值显著”,而要转成可执行的排查范围。对本例,建议按以下方式落地:
- 时间聚焦:把第 268~328 天作为重点窗口,向前回溯一个检修周期(如 30 天)检查该窗口前的门控器更换、门页调整、密封条批次记录。
- 对象聚焦:窗口内 4 次故障是否集中在同一车门(如 3 号门)或同一批次门控器,需回到工单明细按“车门位置 + 部件批次”二次分组。
- 反证检查:若窗口内 4 次故障分属不同车门、不同批次,则聚集更可能由运用条件(如该时段线路施工、客流突增)驱动,应转向工况关联分析,而不是继续追部件批次。
- 记录口径复核:确认窗口内是否存在集中检修后“补录工单”导致的时间伪聚集,必要时按工单创建时间与故障发生时间分别统计一次。
结果判读速查
| 观察到的现象 | 可能含义 | 下一步动作 |
|---|---|---|
| CV 明显 < 1(如 0.5) | 间隔过于均匀,疑似周期性检修或定期更换诱发 | 核对检修周期与故障日的关系,检查是否存在“检修后固定天数复发” |
| CV 明显 > 1 且扫描窗口显著 | 存在成簇爆发,局部根因可能性大 | 锁定窗口起止,按车门位置、部件批次、运用条件二次分组 |
| CV ≈ 1 但扫描窗口显著 | 全局近似随机,但局部聚集(本例情形) | 不要因 CV 接近 1 而放弃排查,以窗口结论为准 |
| 多个 W 下窗口起点漂移大 | 聚集信号不稳健,可能是单点偶然 | 扩大样本或延长观察期,暂不下强结论 |
| 窗口内故障分属多车多门 | 更可能是系统性运用条件或批次问题 | 转向工况关联与批次追溯,而非单点部件排查 |
完成本节后,应得到三样可直接使用的输出:一份带间隔列的重复故障序列表、一张标注爆发窗口的时间轴图、一组含 W 敏感性的 p 值结果。这三样构成后续根因排查的时间聚焦依据,而不是停留在“感觉最近故障变多了”的经验判断。