3 min read

Business Process Analytics in R 学习笔记

# 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函数,计算的单位是环节、任务、tasks
  • resource_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.