4. 按车辆编组与部件的重复故障热力分析

为什么用“编组位置 × 部件类别 × 故障模式”三维矩阵

重复故障的根因往往藏在“位置”里:同一故障模式如果只集中在某一节车厢,多半是该车的装配、线束或局部环境问题;如果六节车厢普遍出现,则更可能是设计共性、批次物料或全线运用条件问题。因此本例把故障记录聚合成编组位置(Tc1–Mp1–M1–M2–Mp2–Tc2)× 部件类别 × 故障模式的频次矩阵,再用热力色阶把高频单元“点亮”,最后用两个判据区分个别车集中与全线普遍两类模式。

数据准备与矩阵构建

输入为已标准化的重复故障明细(承接前序文本归并结果),每条记录至少含:车号、编组位置、部件类别、故障模式编码、发生日期。先按“编组位置 + 部件类别 + 故障模式”做计数透视,得到三维频次表;再对每个故障模式计算两个派生指标:

  • 集中度:该模式在最高频编组位置上的次数 ÷ 该模式总次数。集中度 ≥ 0.6 视为“个别车集中”候选。
  • 覆盖率:出现该模式的编组位置数 ÷ 6。覆盖率 ≥ 0.8(即 ≥5 节车厢出现)视为“全线普遍”候选。

下面用一段可直接运行的 Python 代码完成矩阵构建与两类模式判定(示例数据为教学构造,非实测)。

import pandas as pd

# 教学示例:已标准化的重复故障明细(节选)
rows = [
    # 车号, 编组位置, 部件类别, 故障模式编码, 次数
    ("Tc1-001", "Tc1", "车门系统", "DOOR_OPEN_FAIL", 7),
    ("Tc1-001", "Tc1", "车门系统", "DOOR_SENSOR_ERR", 5),
    ("Mp1-002", "Mp1", "牵引变流器", "TCU_OVERTEMP", 6),
    ("M1-003",  "M1",  "牵引电机",   "MOTOR_BEARING_HOT", 4),
    ("M2-004",  "M2",  "制动系统",   "BRAKE_PRESSURE_LOW", 3),
    ("Mp2-005", "Mp2", "辅助电源",   "APS_FAULT", 2),
    ("Tc2-006", "Tc2", "车门系统",   "DOOR_OPEN_FAIL", 6),
    ("Mp1-002", "Mp1", "车门系统",   "DOOR_OPEN_FAIL", 5),
    ("M1-003",  "M1",  "车门系统",   "DOOR_OPEN_FAIL", 4),
    ("M2-004",  "M2",  "车门系统",   "DOOR_OPEN_FAIL", 5),
    ("Mp2-005", "Mp2", "车门系统",   "DOOR_OPEN_FAIL", 4),
    ("Tc1-001", "Tc1", "制动系统",   "BRAKE_PRESSURE_LOW", 3),
    ("Mp1-002", "Mp1", "制动系统",   "BRAKE_PRESSURE_LOW", 2),
    ("M1-003",  "M1",  "制动系统",   "BRAKE_PRESSURE_LOW", 3),
    ("M2-004",  "M2",  "制动系统",   "BRAKE_PRESSURE_LOW", 2),
    ("Mp2-005", "Mp2", "制动系统",   "BRAKE_PRESSURE_LOW", 3),
    ("Tc2-006", "Tc2", "制动系统",   "BRAKE_PRESSURE_LOW", 2),
]
df = pd.DataFrame(rows, columns=["车号","编组位置","部件类别","故障模式","次数"])

# 三维频次矩阵:行=编组位置,列=部件类别+故障模式
pivot = df.pivot_table(index="编组位置", columns=["部件类别","故障模式"],
                       values="次数", aggfunc="sum", fill_value=0)
pivot = pivot.reindex(["Tc1","Mp1","M1","M2","Mp2","Tc2"])

# 每个故障模式的集中度与覆盖率
mode_stats = df.groupby("故障模式").apply(lambda g: pd.Series({
    "总次数": g["次数"].sum(),
    "最高位置次数": g.groupby("编组位置")["次数"].sum().max(),
    "出现位置数": g["编组位置"].nunique(),
}))
mode_stats["集中度"] = mode_stats["最高位置次数"] / mode_stats["总次数"]
mode_stats["覆盖率"] = mode_stats["出现位置数"] / 6

def classify(r):
    if r["集中度"] >= 0.6:
        return "个别车集中"
    if r["覆盖率"] >= 0.8:
        return "全线普遍"
    return "待观察"

mode_stats["模式类型"] = mode_stats.apply(classify, axis=1)
print(mode_stats.round(2))

按上述示例数据运行后,预期可得到如下判读(示例结果,由给定输入直接推出):DOOR_OPEN_FAIL 在 6 节车厢均出现、覆盖率 1.0,判为全线普遍;TCU_OVERTEMP 仅出现在 Mp1、集中度 1.0,判为个别车集中;BRAKE_PRESSURE_LOW 覆盖率 1.0 同样归入全线普遍,需优先排查批次或设计共性。

热力矩阵与两类模式判读

下图把编组位置作为纵轴、部件类别与故障模式作为横轴,用色深表示重复频次,并在右侧标出每个故障模式的集中度/覆盖率判定结果。读图时先看“亮块落在哪一行”,再看“亮块是否贯穿整列”,即可快速区分两类模式。

编组位置 × 部件/故障模式 重复频次热力矩阵 色深 = 重复次数;右侧标签给出集中度/覆盖率判定 车门系统 DOOR_OPEN_FAIL 车门系统 DOOR_SENSOR_ERR 牵引变流器 TCU_OVERTEMP 牵引电机 MOTOR_BEARING_HOT 制动系统 BRAKE_PRESSURE_LOW 辅助电源 APS_FAULT Tc1 Mp1 M1 M2 Mp2 Tc2 7 5 0 0 3 0 5 0 6 0 2 0 4 0 0 4 3 0 5 0 0 0 2 0 4 0 0 0 3 2 6 0 0 0 2 0 全线普遍 个别车集中 个别车集中 个别车集中 全线普遍 待观察 色阶: 0 1–2 3 4–5 6–7 集中度≥0.6 → 个别车集中;覆盖率≥0.8 → 全线普遍

判读要点与后续动作

从矩阵可直接读出三条结论:其一,DOOR_OPEN_FAIL 在 Tc1、Mp1、M1、M2、Mp2、Tc2 六行均有 4–7 次,属贯穿整列的“全线普遍”模式,应优先核查车门控制逻辑版本、门控器批次或全线站台间隙等共性因素;其二,TCU_OVERTEMP 只在 Mp1 行出现 6 次,集中度 1.0,属典型“个别车集中”,应聚焦 Mp1 牵引变流器的冷却风道、滤网与温度传感器;其三,APS_FAULT 仅 Mp2 出现 2 次,样本量小,暂列“待观察”,需累积更多记录再判定。

判读时注意样本量下限:某模式总次数低于 3 时,集中度与覆盖率都容易失真,宜先归入“待观察”,避免把偶发记录误判为个别车集中。
热力矩阵只反映“频次分布”,不能直接证明根因。全线普遍模式仍需结合例5的运用工况关联与例6的检修作业记录对齐,才能把“位置集中”推进到“原因集中”。