# knitr::opts_chunk$set(warning = FALSE, message = FALSE, cache = T)
knitr::opts_chunk$set(warning = FALSE, message = FALSE, eval=F)
library(tidyverse)
library(formattable)
Janssenswillen (2018c) 做了一个流程分析的 tutorial。主要有三方面可以学习,
- quality measurement
- exploratory data analysis and
- business process analytics
- 这次学习笔记主要分为四个章节,
- 使用 Janssenswillen (2018a) 和 Janssenswillen (2018d) 所写的包。
bupaR
基于dplyr
包开发,processmapR
基于diagrammR
包开发。 - 数据来自
bupaR
包,使用函数data()
进行调用。
第一章 Intro to process analysis
- 解释 process analysis 的三个定义
- 给出方法,分析一次业务的流程梳理,基于数据视角
- 给出相应的流程图
流程分析的定义, Janssenswillen (2018c) 解释得语焉不详,可以直接参考 Janssenswillen (2018b) 给出的解释。 以下是解释的总结, 一个日志数据可以从几个维度来看,
- 从模型层面,这是一个流程,包含了业务的每个环节
- 从事例层面,这是一个用户完成的经过,是整个流程的一个例子,包含了一个用户完成的所有环节
- 从事件层面,一个用户的一个环节的一个动作作为一个样本,这个样本具备不同的特征,比如发生时间、owner、成本等
bupaR
包主要的中英文对照表
以医院诊断数据为例,介绍一些功能函数,方便理解。
功能函数
glimpse
library(bupaR)
data("patients")
patients %>% glimpse
基于dplyr
开发,因此bupaR
可以使用所有 dplyr
的函数。
查看 case 数量
这里即查看病人数量
n_cases(patients)
数据汇总信息
patients %>% summary()
slice
patients %>% slice(1)
slice()
函数可以反馈某个或者某些 case(s) 的所有情况。
n_activities
n_activities(patients)
反馈唯一的环节有几个
activity_labels
activity_labels(patients)
反馈唯一的环节有哪些
activities
activities(patients)
反馈唯一的环节出现的频数和频率
traces
traces(patients)
反馈由环节组成的、唯一的流程有哪些,反馈频数和频率,用于作流程图。
trace_explorer
library(processmapR)
trace_explorer(patients,coverage = 1)
可视化 traces(patients)
的结果。
n_traces
n_traces(patients)
反馈由环节组成的、唯一的流程有几个
process_map
process_map(patients)
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
这里会从三种视角进行分析
- the control-flow,
- the performance and
- the organizational background.
data("sepsis")
sepsis %>% head
control-flow
这里主要根据环节、resource进行了分析,旨在发现哪些环节比较突出,耗力。
resource_frequency 资源耗费函数
# Print list of resources
resource_frequency(sepsis,level = "resource") %>%
mutate(relative = percent(relative))
- 这里的
resource
可以理解为医生,数据是经过脱敏的。 - 这里衡量了不同医生诊断的次数,衡量工作量。
# Number of resources per activity
resource_frequency(sepsis, level = "activity")
- 这里衡量了不同环节对资源的消耗,也就是有多少医生参与作业,衡量每个环节需要多少工作量。
# Plot Number of executions per resource-activity
resource_frequency(sepsis, level = "resource-activity")
# Plot Number of executions per resource-activity
resource_frequency(sepsis, level = "resource-activity") %>% plot()
- 这里衡量了不同医生对不同环节工作量的分配。
- 这里可以引用到比如渠道价值的分析等。
resource_involvement 资源完成流程函数
resource_involvement(sepsis, level = "resource")
- 这里
resource_involvement
函数计算了每个资源,一共介入了多少流程中。 - 当然也可以直接在dplyr内实现。
sepsis %>%
group_by(resource) %>%
summarise(n_distinct = n_distinct(case_id)) %>%
arrange(desc((n_distinct)))
# Show graphically
sepsis %>% resource_involvement(level = "resource") %>% plot
# Compare with resource frequency
sepsis %>% resource_frequency(level = "resource")
resource_frequency
函数,计算的单位是环节、任务、tasksresource_involvement
函数,计算的单位是流程、cases
activity_presence 查看流程
sepsis %>% trace_explorer(coverage = .1)
查看top 10% 的流程类型。
sepsis %>% trace_length()
查看一个流程需要多少环节。
# Check activity presence
sepsis %>% activity_presence() %>% plot
查看每个流程出现的概率。
number_of_repetitions 重复环节发生情况函数
# 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")
参考文献
Janssenswillen, Gert. 2018a. BupaR: Business Process Analysis in R. https://CRAN.R-project.org/package=bupaR.
———. 2018b. “Business Process Analysis in R.” 2018. http://bupar.net/index.html.
———. 2018c. “Business Process Analytics in R.” 2018. https://www.datacamp.com/courses/business-process-analytics-in-r.
———. 2018d. ProcessmapR: Construct Process Maps Using Event Data. https://CRAN.R-project.org/package=processmapR.