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