问题:一个看似有数据支持的建议
一家企业发现,接受预防性维护的机器比其他机器更容易出故障。AI系统识别了这种关联,并准确预测维护组的风险更高。根据这个预测减少维护,是否合理?未必,因为维护可能恰恰优先安排给原本更脆弱的机器。数据可能反映的是选择维护对象的规则,而不是维护的效果。
本文要回答的是,如何从“哪些机器会坏”转向“如果实施干预,会改变什么”。我们构造一张包含两千台机器的假设表格,逐步完成直接比较、在可比组内比较、重新组合总体,以及明确必要假设。结论不是证明某种具体维护有效,而是用可核查的方式解释:正确的预测也可能被用于回答错误的问题。
三个变量与统一的时间范围
用 Z 表示决策前测得的机器年龄组:旧机器或新机器。M = 1表示执行一种定义明确的预防性维护,M = 0表示不执行。Y = 1表示随后一个月内至少发生一次故障,Y = 0表示未发生。因此,风险是相同一个月内的概率,不是每小时故障次数。若比较不同观察时长,或把不同维护混为同一标签,问题就变了。
在教学构造中,一半机器属于旧机器。旧机器中90%接受维护,新机器中仅10%接受维护。假设在每个年龄组内部,维护分配不再依赖其他故障原因;这是合成世界的假设,不是现实表格本身能够证明的事实。规定旧机器不维护和维护后的风险分别为40%与20%,新机器则为4%与2%。下表计数与这些概率精确对应,没有模拟抽样噪声。
| Z(0新,1旧) | M | 机器数 | 故障数 | 风险 |
|---|---|---|---|---|
| 1 | 1 | 900 | 180 | 20% |
| 1 | 0 | 100 | 40 | 40% |
| 0 | 1 | 100 | 2 | 2% |
| 0 | 0 | 900 | 36 | 4% |
除法没算错,比较却会误导
把第一行与第三行相加,一千台维护机器有182台故障,风险为18.2%。一千台未维护机器有76台故障,风险为7.6%,差值为+10.6个百分点。算术并没有错,但比较的是组成不同的人群:前者90%是旧机器,后者只有10%。在讨论维护效果之前,这个比较就已经混入了年龄组成差异。
竖线可读作“在满足该条件的案例中”:P(Y=1 | M=1)表示按历史分配规则接受维护的机器中的风险,而不是让所有机器都接受维护后总体的风险。一个模型为这两组输出18.2%与7.6%,可以准确复现这些汇总频率。但预测正确,并不能把两者差值解释成改变维护策略的效果。
组内比较:符号反转了
在旧机器中比较20%与40%,在新机器中比较2%与4%,两个组内的维护风险都更低。这种总体比较与分层比较方向相反的现象,是辛普森悖论的一种形式。它不违背概率规律,而是因为混合各组时使用的权重不同:维护总体以旧机器为主,未维护总体以新机器为主。两种平均数回答的是不同问题。
按年龄分层并不会自动把关联变成因果。在本构造中它有效,是因为我们明确规定:给定 Z 后,维护分配不再依赖其他故障原因。如果技师根据未记录的异常噪声选择机器,即使机器同龄,也可能仍不可比。科学分析的关键是解释比较为何有效,而不是挑选能得出期望结果的分组方式。
干预意味着改变一条规则
用三条箭头表示假设:Z → M、Z → Y和M → Y。年龄同时影响维护选择与故障风险,维护又可能影响故障,所以 Z 是模型中的混杂变量。运算符 do(M=1)表示一种假想操作:不再遵循原来的 Z → M分配规则,而是令 M=1,其他机制保持不变。这不是软件命令,也不是已经执行的工厂试验,而是对因果问题的定义。
问题于是变成:对同一个由一半旧机器、一半新机器构成的总体,全部维护与全部不维护分别会产生什么风险?固定总体至关重要。我们没有把旧机器换成新机器,也没有比较年龄组成不同的部门,只在声明的假设下改变决策 M。这样明确问题,可以避免“AI建议维护”这句看似简单的话掩盖不同目标。
进一步分析:生成表格的合成世界
可将可比性假设写成明确模型,而不只停留在口头声明。设 UZ、UM、UY是三个相互独立、在零到一之间均匀分布的数。第一个决定年龄组;第二个与阈值 qZ比较,决定是否维护;第三个与 rZM比较,决定是否故障。这些数代表其他变量未解释的变化。这是合成世界的概率定义;程序计算精确概率,并没有抽取随机样本。
记号1[条件]在条件为真时等于一,否则等于零。Z=1表示旧机器。rZM的第一个下标是组别,第二个是决策,因此r10是旧机器不维护时的风险,而不是新机器维护时的风险。UM与UY独立,意味着组内的维护选择不会额外揭示故障信息。如果两者存在隐藏的共同原因,该性质就可能不成立。
假想干预只把第二条方程替换为 M=m,不改变年龄分布,也不改变故障随机变化的分布。干预前,联合概率分解为 P(Z) × P(M|Z) × P(Y|M,Z)。固定 M 后,原分配规则的因子消失,剩下 P(Z) × P(Y|m,Z)。对组别求和,就得到下一节的标准化公式。这样既说明了公式来源,也明确了因果模型错误时哪个步骤会失效。
重新建立比较:相同权重,两种决策
使用组内风险,但对两种决策都按目标总体的相同组成加权:50%旧机器、50%新机器。这称为标准化。下式对每个年龄值 z,把该组在决策 m 下的风险乘以组占比,再求和。只有在所述假设下,它才具有因果解释。加权平均当然可以计算,但其因果含义不会由代数运算自动产生。
在设定的世界中,全部维护的平均风险为11%,全部不维护为22%,降低11个百分点。对两千台机器而言,对应预期220台故障,而不是440台。“预期”并不表示真实月份必然如此。它也不等于“降低11%”:相对降幅为50%,因为11是22的一半。报告绝对差值与比较基准,可以避免歧义。
图表解释权重为何重要

横轴表示所比较总体中的旧机器占比,纵轴是月度风险百分比。随着更脆弱机器增加,两条曲线都上升。在每个相同占比处,维护曲线都低于不维护曲线。最初的错误相当于在0.9处读取维护曲线,在0.1处读取不维护曲线,于是得到18.2%与7.6%;但此时干预和总体组成同时改变了。图把汇总数据隐藏的差异展示出来。
另一种计算:给稀少案例更大权重
也可以按接受实际干预的概率之倒数加权,得到相同结果。在维护组中,旧机器权重为1/0.9,新机器为1/0.1。因此,一百台新机器代表一千个加权单位,九百台旧机器也代表一千个。加权风险为(180/0.9 + 2/0.1)/2000 = 0.11。未维护组的权重相反:(40/0.1 + 36/0.9)/2000 = 0.22。这里并没有创造新的观测,只是改变了观测在计算中的代表性。
附带程序核对了两种计算的一致性。这并不使方法天然稳健,因为本例的分配概率和风险由构造精确给定。现实中需要估计,大权重会让结果对少数案例非常敏感。如果新机器从不接受维护,这个对比就没有观测支持。更复杂的算法可以外推,但必须声明额外假设,不能把数据缺失当成已有信息。
良好预测评分无法验证的假设
第一项假设是给定 Z 后具有可比性,不再存在未测量的维护与故障共同原因。第二项是正值性:目标总体的每个组内,两种决策都必须有可能被观察到。第三项是干预一致性:M=1应表示同一种明确行动,并采用相同评价时间范围。还假设对一台机器的干预不直接改变其他机器的结果。共享资源的机群可能恰恰违反最后这一条件。
把所有可用列都加入模型,也不是通用解法。维护后测得的温度可能是维护减少故障的中间机制;固定它,可能把问题从总效应改为其他效应。若某变量同时受维护和故障原因影响,用它筛选案例还可能引入偏差。决定调整什么,需要时间顺序和过程知识,而不只是相关性或模型中的特征重要性。
这对企业AI系统意味着什么
预测模型仍可用于估计当前维护策略下的服务工作量,这不同于选择最佳策略。若目标是决定维护谁,就要先定义所需效应和目标总体,再同时评价风险、成本和约束。本例中旧机器的绝对收益更大,为20个百分点,新机器则为2个百分点。但若不知道维护成本、故障成本和可用能力,仍无法得出最优策略。
在实际可行且满足运行约束的情况下,设计良好的实验评估可以提高比较的可信度。本文并不建议取消必要维护,也没有开展现场实验。已完成的工作仅是确定性教学练习,使用合成数据并保存代码和结果。这些不是客户数据、产品成果或EL-AI测量。算例的价值在于:先把推理讲清,再向真实数据提出问题。
结论:预测不等于决策
对维护机器给出18.2%的初始预测可以是正确的,而据此减少维护的建议仍可能错误。我们混淆了被选择群体中的风险与同一总体上的行动效果。用相同权重重新组合可比组后,本合成世界从表面增加10.6个百分点,变为因果降低11个百分点,但这只在所述假设成立时有效。让AI参与决策之前,必须明确要评价哪种改变,以及什么使这一比较可信。
来源、代码与复现边界
Judea Pearl,Causal inference in statistics: An overview,Statistics Surveys第3卷,2009年,96–146页,DOI 10.1214/09-SS057。查阅了干预相关的3.2.1–3.2.3节,以及后门准则相关的3.3.1节,包括公式25。这是已发表的科学综述,不是新的工业基准。本文机器表格与计算仅作为教学构造具有原创性,不构成新的因果研究,也不是对某篇论文实验的复现。
简短代码计算观测风险和标准化风险。压缩包还包含逆概率加权核对,以及总体组成图。本次没有训练AI模型、没有模拟随机样本,也没有从这些人为构造的计数估计置信区间。结果只是可复现的假设案例算术验证,不是真实机群的不确定性或性能测量。
Judea Pearl (2009) — Causal inference in statistics: An overview.
old = {1: (180, 900), 0: (40, 100)}
new = {1: (2, 100), 0: (36, 900)}
for m in [1, 0]:
observed = (old[m][0]+new[m][0])/(old[m][1]+new[m][1])
standardized = 0.5*old[m][0]/old[m][1]+0.5*new[m][0]/new[m][1]
print(m, f"observed={observed:.3f}", f"standardized={standardized:.3f}")
代码、数据与说明 · JSON. 教学计算使用 Python 3.14.0,图使用 Matplotlib 3.11.2。分析由 AI 辅助,不声称经过同行评审或人工审核。原创 ImageGen 封面仅作示意,不记录 EL-AI 人员、场所或实际安装。来源查阅于 2026 年 9 月 27 日。

