3. 重复故障时间分布与聚集性检验

为什么“重复”不等于“聚集”

前两步已经得到一份去重后的重复故障清单,但清单只告诉我们“哪些故障重复了、重复了几次”,并没有回答“这些重复发生在时间轴上的什么位置”。如果同一部件的 5 次故障均匀分布在 18 个月内,它更像随机偶发;如果 5 次中有 4 次挤在连续 6 周内,就存在明显的集中爆发窗口,根因排查应优先锁定该窗口内的运用条件、检修动作或批次件更换记录。

本节的任务是对重复故障序列做两件事:时间间隔分布刻画与聚集性检验。前者看相邻两次故障之间隔了多久,后者判断这种间隔结构是否偏离“随机散布”的假设。为避免把统计结论建立在主观印象上,我们采用两个互补指标:

  • 间隔变异系数 CV:CV = 间隔标准差 / 间隔均值。若故障近似泊松随机过程,间隔服从指数分布,CV 理论值约为 1;CV 明显小于 1 说明间隔过于均匀(可能是周期性检修诱发),CV 明显大于 1 说明间隔忽长忽短、存在成簇。
  • 扫描窗口最大计数:在给定窗口宽度 W 内滑动统计故障次数,取最大值并与随机模拟的零分布比较,得到经验 p 值。它直接回答“是否存在集中爆发窗口”,且能给出窗口的起止时间,便于后续排查聚焦。
两个指标回答的问题不同:CV 描述整条序列的间隔结构,扫描窗口定位具体的时间段。工程上建议先看 CV 判断“要不要怀疑聚集”,再用扫描窗口把怀疑落到具体日期区间。

本节使用的示例数据与口径

以下数据为教学示例,模拟某城轨线路一列车(编组示例:Tc1-Mp1-M1-M2-Mp2-Tc2)上“车门关闭故障(现象码 DOR-CLOSE-FAIL,原因码待定)”的重复故障序列。时间以首次故障为第 0 天计,单位为天。示例共 9 次故障,观察期 540 天。

序号故障日(天)相邻间隔(天)备注
10—首次记录
23737
39558
4268173长间隔
528113进入密集段
629615
73059
831813
9470152长间隔

口径说明:间隔按“相邻两次故障日之差”计算,共 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 量级。这些数值由给定输入直接推出,属于示例结果,不代表真实线路实测。

如何读这张图与这组数

车门关闭故障重复序列:间隔分布与 60 天扫描窗口 第 0 天 第 540 天 0 37 95 268 281 296 305 318 470 W=60 天窗口 窗口内 4 次(第 268/281/296/305 天) 37 58 173 13 15 9 13 152 间隔分布 均值 ≈ 58.8 天 标准差 ≈ 63.4 天 CV ≈ 1.08(接近随机) 扫描窗口 W = 60 天 实际最大计数 = 4 窗口起点 = 第 268 天 显著性判断 零分布均值 ≈ 1.0 95% 分位 = 3 p ≈ 0.01 → 存在聚集 结论:整条序列 CV 接近 1,但局部存在显著爆发窗口 → 根因排查聚焦第 268–328 天

读图要点:

  1. CV ≈ 1.08 不能直接下“随机”结论。CV 是全局指标,长间隔(173 天、152 天)与短间隔(9~15 天)相互抵消,使整体看起来接近指数分布。这正是只看 CV 会漏判的原因。
  2. 扫描窗口把问题定位到第 268 天起。60 天窗口内出现 4 次,而随机零模型的 95% 分位只有 3 次,p 值约 0.01,说明“4 次挤在 60 天内”在随机假设下并不常见。
  3. 窗口宽度 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 次故障分属不同车门、不同批次,则聚集更可能由运用条件(如该时段线路施工、客流突增)驱动,应转向工况关联分析,而不是继续追部件批次。
  • 记录口径复核:确认窗口内是否存在集中检修后“补录工单”导致的时间伪聚集,必要时按工单创建时间与故障发生时间分别统计一次。
扫描窗口检验对“观察期边界”敏感。若故障点靠近观察期两端,窗口会被截断,计数偏低。本例第 470 天距结束还有 70 天,W=60 时仍可完整覆盖,但若 W 取 90 天则末端窗口不完整,需在代码中明确跳过或改用环形/反射边界处理,并在结论中说明所用口径。

结果判读速查

观察到的现象可能含义下一步动作
CV 明显 < 1(如 0.5)间隔过于均匀,疑似周期性检修或定期更换诱发核对检修周期与故障日的关系,检查是否存在“检修后固定天数复发”
CV 明显 > 1 且扫描窗口显著存在成簇爆发,局部根因可能性大锁定窗口起止,按车门位置、部件批次、运用条件二次分组
CV ≈ 1 但扫描窗口显著全局近似随机,但局部聚集(本例情形)不要因 CV 接近 1 而放弃排查,以窗口结论为准
多个 W 下窗口起点漂移大聚集信号不稳健,可能是单点偶然扩大样本或延长观察期,暂不下强结论
窗口内故障分属多车多门更可能是系统性运用条件或批次问题转向工况关联与批次追溯,而非单点部件排查

完成本节后,应得到三样可直接使用的输出:一份带间隔列的重复故障序列表、一张标注爆发窗口的时间轴图、一组含 W 敏感性的 p 值结果。这三样构成后续根因排查的时间聚焦依据,而不是停留在“感觉最近故障变多了”的经验判断。