变异的概念:流程变体、偏差、异常
今天我们来聊聊变异这个概念。嗯,说实话,很多人把流程变体、偏差、异常混为一谈,但其实它们是三个不同的层次。
我记得刚接触流程挖掘那会儿,导师甩过来一个日志文件让我分析。我盯着字段里的活动名称,完全看不出门道。后来花了整整一周才弄明白——流程不是铁板一块,每次执行都可能不一样。这种不一样,就是变异。
但变异分等级。有些变异是“正常的走法”,有些是“稍微偏了点”,还有些则是“必须拉红灯”的。下面我按自己的理解,把它们拆开讲清楚。
流程变体 – 变异的第一层
什么是流程变体?说白了,就是同一条流程在实际执行中产生的不同路径。比如一个采购流程,有的订单要走经理审批,有的因为金额小直接跳过。这两种路径,就是两个变体。
我在项目中做过一个客户投诉处理流程的分析,日志里有130万条事件。我粗筛了一遍,居然跑了400多种变体。最频繁的变体占了35%,最少的只出现过1次。你能想象吗?同一个流程,最后跑出400种走法。
流程变体可以用轨迹表示。每条轨迹就是活动序列。比如:A→B→C→D 和 A→C→B→D,就是两个变体。注意,即便活动一样,顺序不同也算不同变体。
# 用Python统计变体(示意)
from pm4py.objects.log.importer.xes import importer as xes_importer
log = xes_importer.apply("order_handling.xes")
variants = list(log)
# 每个变体是一个列表
for i, variant in enumerate(variants[:5]):
print(f"变体{i+1}: {len(variant)}条轨迹")
print(" → " + " → ".join(variant[0]))
这里要注意:变体多不代表有问题。它可能只是业务允许的多种合法路径。但变体数量突然增多,或者出现全新变体,就值得深挖了。
偏差 – 对比参照线的差异
偏差是啥?就是对某个“理想流程”或“标准流程”的偏离。
这里的关键是“参照线”。没有参照线,就谈不上偏差。我们通常用流程模型(比如 BPMN 图、Petri 网)作为参照线。日志里的行为如果跟模型不一致,就产生偏差。
偏差分两种:
- 插入性偏差 – 实际执行中多做了模型里没有的活动。比如模型里没有“重新审核”,但日志里出现了。
- 遗漏性偏差 – 实际执行中跳过了模型里要求的活动。比如模型要求“审批→付款”,但实际从“审批”直接跳到“发货”,漏了付款。
我在一个银行信贷流程里遇到过离谱的遗漏性偏差:模型里要求“信用评估必须由风控经理签字”,但实际日志显示有27%的案例直接跳过了这个环节。这就是根因关联风险。
偏差度量公式(我自己常用的):
偏差度 = (不一致的事件数 / 总事件数) × 100%
例如某流程共1000个事件,其中80个不符合模型
偏差度 = (80/1000) × 100% = 8%
一般偏差度超过15%就算高偏差,需要介入。
偏差不一定就是坏。有时是模型过时了,实际流程已经优化。但偏差一定意味着“需要解释”。记住这个原则:每条偏差背后都有原因。
异常 – 需要重点关注的极端变异
异常是偏差中最极端的那一类。它通常违反业务规则、超过阈值、或者频繁出现在错误路径中。
我个人的定义是这样的:
- 如果某个行为在日志中出现的概率低于1%,且违反了硬性规则(比如金额超过限额却无特批),那就是异常。
- 如果某个轨迹的执行时间超过正常值3个标准差,那也是异常。
- 如果某个活动从未出现在历史变体中,但突然冒出100次,那也是异常。
检测异常我常用两种方法:
| 方法 | 适用场景 | 例子 |
|---|---|---|
| 规则基检测 | 明确知道哪些行为不允许 | “金额>10万必须两人会签” → 日志里只有一人签 → 异常 |
| 统计基检测 | 没有明确规则,但数据有分布规律 | 处理时长 > 均值+3σ → 异常 |
异常处理流程我建议这样走:
- 自动化检测:用规则+统计跑一遍所有案例,标记异常候选。
- 专家复核:让业务人员看异常候选,排除误报。
- 根因分析:找出为什么出现异常,是流程漏洞还是人为错误。
- 反馈闭环:把确认的异常补入规则库,下次就能自动拦截。
哦对了,还有一个概念叫做“异常簇”。当多个异常在时间或空间上聚集时,往往预示着系统性缺陷。比如某个部门的异常在一天内爆发了30次,那大概率不是个人问题,而是流程设计或者系统Bug。
三者的关系
很多人把变体、偏差、异常当成三个独立概念。其实它们是一条链上的不同位置:
- 流程变体是所有实际执行轨迹的集合,包含一切。
- 偏差是从变体中切出的一块——那些跟“标准”不一样的部分。
- 异常又是从偏差中再切出的一块——最极端、最需要关注的偏差。
- 先看变体分布,理解流程有没有“主流”和“支流”。
- 再算偏差度,找模型和现实的差距。
- 最后聚焦异常,处理真正有风险的少数案例。
三步下来,对流程的变异情况就有谱了。
下面这张图把三者的层级关系画出来了。你可以从外到内理解:最外圈是所有变体,中间是偏离标准的偏差,最内圈是需要处理的异常。
一句话总结: 变体是全集,偏差是参照偏离,异常是危险信号。别搞混。下次看到一堆日志,先按这个层次问自己:“这是正常变体、可理解的偏差、还是必须处理的异常?”