2、流程数据基础:事件日志、案例、活动、时间戳

做流程挖掘,第一步不是跑模型,也不是写代码。

而是搞清楚你手里的数据长什么样。

我见过太多人,一上来就怼算法,结果数据格式不对,折腾半天全白费。说白了,流程特征工程的基础,就是把这四个概念吃透:事件日志、案例、活动、时间戳。

2.1 事件日志:流程挖掘的原材料

事件日志是什么?

简单说,就是系统记录每一步操作的那张表。

你想想看,企业里每发生一件事,系统后台基本都会留下一条记录。比如“用户下了一笔订单”、“仓储发货了”、“财务到账了”。把这些记录按业务维度拼在一起,就成了事件日志。

我个人习惯把事件日志比作“流程的X光片”。它能告诉你:谁,在什么时间,干了什么事。

一个标准的事件日志,至少包含三列:案例ID(Case ID)、活动名称(Activity)、时间戳(Timestamp)。

来个真实世界的例子。我在电商项目里拿到的日志,长这样:

Case_ID,  Activity,           Timestamp
ORD001,   创建订单,            2024-03-01 09:00:00
ORD001,   支付审核,            2024-03-01 09:15:00
ORD001,   仓库拣货,            2024-03-01 10:30:00
ORD002,   创建订单,            2024-03-01 09:05:00
ORD002,   支付审核,            2024-03-01 09:20:00
ORD002,   支付失败,            2024-03-01 09:21:00
ORD002,   支付审核,            2024-03-01 09:25:00
ORD002,   仓库拣货,            2024-03-01 11:00:00

看到没?每一行都是记录,但真正有用的信息藏在列与列的关系里。

2.2 案例:一次完整的业务流程实例

案例,就是一次完整的业务流转。

比如一个订单从创建到完结,或者一次客服工单从提交到关闭。案例是流程分析的“最小分析单元”。

我在电信项目里遇到过一份日志,里面混了不同年份的工单记录。当时没有按案例ID聚合,直接跑流程发现算法,结果出来一团乱麻。后来加了一步按案例分组,整个流程才清晰起来。

踩过的坑: 案例ID必须保证唯一性。我曾经遇到过一个系统,重启后案例ID会自增复位,导致不同月份的日志里出现了相同的案例ID。如果直接合并分析,会把两个完全不同的流程串到一起。

怎么判断一个字段能不能当案例ID?两个标准:

  • 唯一性:同一个ID只能代表一条业务实例
  • 连续性:同一个ID下的所有活动,必须按时间先后,构成一条完整的业务链

2.3 活动:流程中的每一个动作

活动,就是流程里的“一步”。

比如“客户提交申请”、“部门经理审批”、“财务打款”,这些都是活动。

活动名有个学问。太细了会爆炸,太粗了看不出细节。

举个例子:

  • 太细:“订单审核-初级审核员A操作”、“订单审核-初级审核员B操作”——活动名里带了人名,案例数一多,活动节点就上百个,模型根本跑不动。
  • 合理:“订单审核(初级)”——这样既能看出流程阶段,又不会过度膨胀。

我的建议: 活动命名遵循“动作+对象+阶段”的格式。比如“审核-订单-初级”、“打款-退款-已完成”。这样后期做特征聚合时,正则匹配和One-Hot编码都省心。

2.4 时间戳:流程挖掘的轴

没有时间戳,事件日志就是一张死表。

时间戳决定了活动的先后顺序,也决定了流程的耗时。

我见过最蠢的错误,是把字符串当时间戳直接排序。结果因为格式不统一,“2024-01-02”排在了“2024-01-11 09:00”的后面。为什么?因为按字符串排序,1在2前面。

曾经被坑过: 有一次客户给的日志里,时间戳和时区混在一起。有的记录是UTC+8,有的是UTC+0。如果不统一转成同一时区,同一个案例里的活动时间先后都是乱的。后来我加了一步强制转换:pandas.to_datetime() 加上utc=True。

另外要注意,时间戳的精度也影响结果。如果同一个案例里有两个活动发生在同一秒,流程发现算法可能会随机排序它俩。

所以,我建议:

  • 时间戳一定要转成统一的datetime格式
  • 如果精度不够(比如只有日期),要追加一个顺序序号字段
  • 时区必须统一

2.5 四要素的关系

四要素不是孤立的,它们组成了流程数据的核心结构。

下面这张图,是我每次讲基础课时都会画一遍的:

流程数据四要素关系图 事件日志(Event Log) 案例(Case) 活动(Activity) 时间戳(Timestamp) 结构说明 1. 事件日志由多个案例组成 2. 每个案例包含一系列有序的活动 3. 每个活动必须关联一个时间戳 4. 时间戳决定了活动的先后顺序

核心记忆点: 事件日志 = 多张案例的集合;案例 = 一系列有序的活动序列;活动 = 某个时间点发生的具体动作;时间戳 = 串联这一切的轴。

2.6 实战中需要的数据预处理

拿到原始事件日志,通常不能直接用。我总结了一个三步走的流程:

  1. 列筛选:只保留Case ID、Activity、Timestamp三列(如果还有资源列比如“执行人”,可以先留着)
  2. 类型转换:把时间戳字符串转成datetime对象
  3. 排序:按Case ID + Timestamp升序排序,确保每个案例内的活动顺序正确

用Python实现,就几行代码:

import pandas as pd

# 读原始日志
df = pd.read_csv('raw_event_log.csv')

# 列筛选
df = df[['case_id', 'activity', 'timestamp']]

# 时间戳转datetime
df['timestamp'] = pd.to_datetime(df['timestamp'])

# 排序
df = df.sort_values(['case_id', 'timestamp']).reset_index(drop=True)

这三步做完,你的数据才算“能用”。

一个实用技巧: 如果日志量很大,排序前可以先检查重复行。我习惯加一个 df.drop_duplicates(),防止完全相同的记录干扰流程发现。

好了,事件日志、案例、活动、时间戳这四个基础概念,到这里就讲透了。记住一句话:数据准备占到流程挖掘的80%工作量,而这四个要素,就是那80%的基础。花时间把它搞明白,后面的路会顺很多。