{r setup, include=FALSE} knitr::opts_chunk$set(eval = FALSE)
@Janssenswillen2018 做了一个流程分析的 tutorial。主要有三方面可以学习,
- quality measurement
- exploratory data analysis and
- business process analytics
- 这次学习笔记主要分为四个章节,
- 使用 @bupaR 和 @processmapR 所写的包。
bupaR基于dplyr包开发,processmapR基于diagrammR包开发。 - 数据来自
bupaR包,使用函数data()进行调用。
第一章 Intro to process analysis
- 解释 process analysis 的三个定义
- 给出方法,分析一次业务的流程梳理,基于数据视角
- 给出相应的流程图
流程分析的定义, @Janssenswillen2018 解释得语焉不详,可以直接参考 @Janssenswillen2018pkgdown 给出的解释。 以下是解释的总结, 一个日志数据可以从几个维度来看,
- 从模型层面,这是一个流程,包含了业务的每个环节
- 从事例层面,这是一个用户完成的经过,是整个流程的一个例子,包含了一个用户完成的所有环节
- 从事件层面,一个用户的一个环节的一个动作作为一个样本,这个样本具备不同的特征,比如发生时间、owner、成本等
bupaR包主要的中英文对照表
{r echo=FALSE} tibble( eng = c("A resource in the process","A case, or instance of the process", "An event in the process","Activites","Activity Instances", "events","traces"), chi = c("业务的owner、执行人","流程中的一个例子,如病人", "流程中的一个事件","环节","环节的id", "样本,数量等于表格大小","环节路径,靠不同环节生成") ) %>% mutate_all(str_to_lower)
以医院诊断数据为例,介绍一些功能函数,方便理解。
功能函数
glimpse
{r message=FALSE, warning=FALSE} library(bupaR) data("patients")
{r} patients %>% glimpse
基于dplyr开发,因此bupaR可以使用所有 dplyr的函数。
查看 case 数量
这里即查看病人数量
{r} n_cases(patients)
数据汇总信息
{r} patients %>% summary()
slice
{r} patients %>% slice(1)
slice()函数可以反馈某个或者某些 case(s) 的所有情况。
n_activities
{r} n_activities(patients)
反馈唯一的环节有几个
activity_labels
{r} activity_labels(patients)
反馈唯一的环节有哪些
activities
{r} activities(patients)
反馈唯一的环节出现的频数和频率
traces
{r} traces(patients)
反馈由环节组成的、唯一的流程有哪些,反馈频数和频率,用于作流程图。
trace_explorer
{r} library(processmapR)
{r} trace_explorer(patients,coverage = 1)
可视化 traces(patients) 的结果。
n_traces
{r} n_traces(patients)
反馈由环节组成的、唯一的流程有几个
process_map
{r} process_map(patients)
{r} patients %>% process_map(type = performance(FUN = median, units = "hours"))
反馈流程图。 路程图可以查看业务上哪个环节发生频数高或者转化率情况。
eventlog
... %>%
eventlog(
case_id = "patient",
activity_id = "activity",
activity_instance_id = "activity_instance",
lifecycle_id = "status",
timestamp = "timestamp",
resource_id = "resource
)
构建日志数据
第二章 Analysis techniques
相较于章节 @ref(ch1),章节 @ref(ch2) 会难一些。
这里会从三种视角进行分析
- the control-flow,
- the performance and
- the organizational background.
{r} data("sepsis")
{r} sepsis %>% head
control-flow
这里主要根据环节、resource进行了分析,旨在发现哪些环节比较突出,耗力。
resource_frequency 资源耗费函数
{r} # Print list of resources resource_frequency(sepsis,level = "resource") %>% mutate(relative = percent(relative))
- 这里的
resource可以理解为医生,数据是经过脱敏的。 - 这里衡量了不同医生诊断的次数,衡量工作量。
{r} # Number of resources per activity resource_frequency(sepsis, level = "activity")
- 这里衡量了不同环节对资源的消耗,也就是有多少医生参与作业,衡量每个环节需要多少工作量。
{r} # Plot Number of executions per resource-activity resource_frequency(sepsis, level = "resource-activity")
{r} # Plot Number of executions per resource-activity resource_frequency(sepsis, level = "resource-activity") %>% plot()
- 这里衡量了不同医生对不同环节工作量的分配。
- 这里可以引用到比如渠道价值的分析等。
resource_involvement 资源完成流程函数
{r} resource_involvement(sepsis, level = "resource")
- 这里
resource_involvement函数计算了每个资源,一共介入了多少流程中。 - 当然也可以直接在dplyr内实现。
{r} sepsis %>% group_by(resource) %>% summarise(n_distinct = n_distinct(case_id)) %>% arrange(desc((n_distinct)))
{r} # Show graphically sepsis %>% resource_involvement(level = "resource") %>% plot
{r} # Compare with resource frequency sepsis %>% resource_frequency(level = "resource")
resource_frequency函数,计算的单位是环节、任务、tasksresource_involvement函数,计算的单位是流程、cases
activity_presence 查看流程
{r} sepsis %>% trace_explorer(coverage = .1)
查看top 10% 的流程类型。
{r} sepsis %>% trace_length()
查看一个流程需要多少环节。
{r} # Check activity presence sepsis %>% activity_presence() %>% plot
查看每个流程出现的概率。
number_of_repetitions 重复环节发生情况函数
```{r} # Min, max and average number of repetitions sepsis %>% number_of_repetitions(level = “log”)
Plot repetitions per activity
sepsis %>% number_of_repetitions(level = “activity”) %>% plot
Number of repetitions per resources
sepsis %>% number_of_repetitions(level = “resource”)
`number_of_repetitions(level = "resource")` 衡量了对于一个流程中重复发生的情况,
`group_by(first_resource)`的重复环节发生情况。
### precedence_matrix 函数
```
sepsis %>% precedence_matrix(type = "absolute") %>% plot
- 这里衡量流程中不同环节的前后联系,是描述马尔可夫链的关系。
- 适用于渠道价值的影响力矩阵分析。
performance analysis
这里主要根据环节用时情况,时间关联情况。
# Create performance map
eat_patterns %>% process_map(type = performance(FUN = median, units = "hours"))
# Inspect variation in activity durations graphically
eat_patterns %>% processing_time(level = "activity") %>% plot
# Draw dotted chart
eat_patterns %>% dotted_chart(x = "relative_day", sort = "start_day", units = "secs")

- 如图,这里衡量每个人(流程)吃饭在时间上的关联情况。
- 这里会发现,
- 吃早饭晚,很可能不吃晚饭了。
- 吃早饭早,午饭前会吃零食。
- 虽然吃早饭晚的但是吃中午饭的时间也比较稳定。
常用函数为
# Time per activity
daily_activities %>% processing_time(level = "activity") %>% plot
# Average duration of recordings
daily_activities %>% throughput_time(level = "log", units = "hours")
# Missing activities
daily_activities %>% idle_time(level = "log", units = "hours")