跳至主要内容

在 R 中进行马尔可夫链分析

在本教程中,您将了解什么是马尔可夫链,并使用它在 R 中分析销售速度数据。
· 8分钟 阅读

使用 AI 探索

什么是马尔可夫链?

马尔可夫链是一个数学系统,它根据一组给定的概率规则在不同状态之间发生转移。马尔可夫链属于随机过程,但其不同之处在于必须不具有“记忆”。也就是说,系统下一状态的概率仅取决于系统的当前状态,而与之前的任何状态无关。这被称为马尔可夫性(如下所示):

马尔可夫性

要构建一个可用的马尔可夫链模型,关键是要定义一个转移矩阵 Pt。转移矩阵包含系统在不同状态之间转移的概率信息。为了使转移矩阵有效,每一行必须是一个概率向量,其各项之和必须为 1。

转移矩阵具有这样的性质:相继矩阵的乘积可以描述一段时间内的转移概率。因此,可以通过计算以下内容来建模在经过 k 步之后处于某个状态的概率:

计算

本教程还将介绍吸收型马尔可夫链。当至少存在一个状态一旦到达,留在该状态的概率为 1(无法离开)时,就会出现这种链。

什么是吸收型马尔可夫链?

吸收型马尔可夫链是指一旦进入某些状态,就不可能再离开的马尔可夫链。不过,这只是成为吸收型马尔可夫链的前提条件之一。要构成吸收型马尔可夫链,所有其他暂态都必须能够以概率 1 到达某个吸收态。

与一般的时间齐次马尔可夫链相比,吸收型马尔可夫链具有一些独特性质。其中之一是其转移矩阵的写法。对于具有 t 个暂态和 r 个吸收态的链,转移矩阵 P 可按如下规范形式表示:

转移矩阵 P

其中,Q 为 t x t 矩阵,R 为 t x r 矩阵,0 为 r x t 的零矩阵,Ir 为 r x r 的单位矩阵。特别地,将转移矩阵分解到基本矩阵有助于进行某些计算,例如从各状态起始到被吸收所需的期望步数。基本矩阵 N 按如下方式计算:

基本矩阵 N

其中,It 为 t x t 的单位矩阵

期望步数基于期望线性性的概念,计算如下:

期望步数

其中,1 为一个列向量,其长度等于暂态数,且所有元素均为 1

此外,我们还可以计算:从任一给定暂态出发,被某个特定吸收态吸收的概率。该概率的计算如下:

概率

销售速度分析

马尔可夫链广泛应用于金融、博弈论和遗传学等诸多领域。不过,本教程的重点是如何使用它来建模一家公司的销售流程时长,因为这可能是一个马尔可夫过程。事实上,我们通过检验描述交易在成功成交前经历步骤的序列是否满足马尔可夫性来验证了这一点。

本分析基于这样一个假设:为了使用时间齐次马尔可夫链,在特定行业中,我们的销售流程里某笔交易继续推进的概率在每个月是恒定的。也就是说,这是一个随着时间推移(步数 k 增加)各状态间转移概率保持不变的马尔可夫链。

计算得到的概率如下:

  • 某月内,交易从我们的销售代表阶段转入客户经理阶段与留在销售代表阶段的概率。
  • 某月内,交易从客户经理阶段转为成功成交与留在客户经理阶段的概率。
  • 成功成交后保持在该状态的概率为 1。因此,“已成交”构成一个吸收态。

本分析使用 R 语言完成。R 有一个名为 Markov Chain 的便捷包,能够处理多种类型的马尔可夫链。

首先,我们检查销售序列是否满足马尔可夫性。为此,Markov Chain 包提供了一个便捷函数 verifyMarkovProperty(),它通过对由事件序列构建的一系列列联表进行卡方检验,来判断给定的事件序列是否满足马尔可夫性。较大的 p 值表明不应拒绝“序列满足马尔可夫性”的原假设。下面给出了一个销售序列示例,展示了从第一次会面到最终成交每个月交易所处的阶段:

library(markovchain)
library(dplyr)
# SDR Funnel is our sales representative stages, AE Funnel is our account executive stages, and CW is a successfully closed deal
seq <- c('SDR Funnel','SDR Funnel','AE Funnel','AE Funnel','AE Funnel','AE Funnel','AE Funnel','AE Funnel','CW')
verifyMarkovProperty(seq)
## Testing markovianity property on given data sequence
## Chi - square statistic is: 0.5733333  degrees of freedom are: 27  and corresponding p-value is: 1

由于所示 p 值高于 0.05,我们不拒绝该序列满足马尔可夫性的原假设。

在完成验证后,我们根据数据得到的转移概率绘制了马尔可夫链结构。以下代码通过定义转移矩阵及状态名称来实例化一个马尔可夫链对象,并显示马尔可夫链及其转移概率。

source('TransProb.R')
source('MatDataBase.R')
source('GatherTransMat.R')
transElec <- GatherTransMat('Manufacturing','Between 100M and 500M', 'Between 500 and 1k')
print(transElec)

markov2 <- new('markovchain',
              transitionMatrix = transElec, # These are the transition probabilities of a random industry
              states = c('SDR','AE','CW'))

layout <- matrix(c(0,0,0,1,1,0), ncol = 2, byrow = TRUE)
plot(markov2, node.size = 10, layout = layout)
##           [,1]      [,2]      [,3]
## [1,] 0.5573215 0.4426785 0.0000000
## [2,] 0.0000000 0.8678118 0.1321882
## [3,] 0.0000000 0.0000000 1.0000000
马尔可夫链

由于我们拥有一个吸收型马尔可夫链,我们来计算到被吸收为止的期望时间。向量的第一个元素将给出从 SDR 漏斗到成交所需的期望步数,第二个元素将给出从 AE 漏斗开始时的期望步数。

# Extract Q from the transition matrix
Q <- transElec[1:2,1:2]
# Generate It
It <- diag(2)
#Calculate fundamental matrix
N <- solve(It-Q)
#Generate column vector of 1s
one <- t(t(c(1,1)))

# Calculate the expected steps by matrix multiplication
expected <- N%*%one
print(expected)
##          [,1]
## [1,] 9.823945
## [2,] 7.564969

不过,我们也可以通过可视化来对比期望步数,观察随着步数增加各概率如何变化。因此,我们还检查了在 24 步内,交易处于三种阶段中任一阶段的概率。

library(ggplot2)

initState <- c(1,0,0) # The initial state will be SDR Funnel (mimicking setting an initial discovery appointment)

# Initiate probability vectors
SDRProb <- c()
AEProb <- c()
CW <- c()

# Calculate probabilities for 24 steps.
for(k in 1:24){
  nsteps <- initState*markov2^k
  SDRProb[k] <- nsteps[1,1]
  AEProb[k] <- nsteps[1,2]
  CW[k] <- nsteps[1,3]
}

# Make dataframes and merge them
SDRProb <- as.data.frame(SDRProb)
SDRProb$Group <- 'SDR'
SDRProb$Iter <- 1:24
names(SDRProb)[1] <- 'Value'

AEProb <- as.data.frame(AEProb)
AEProb$Group <- 'AE'
AEProb$Iter <- 1:24
names(AEProb)[1] <- 'Value'

CW <- as.data.frame(CW)
CW$Group <- 'CW'
CW$Iter <- 1:24
names(CW)[1] <- 'Value'

steps <- rbind(SDRProb,AEProb,CW)

# Plot the probabilities using ggplot
ggplot(steps, aes(x = Iter, y = Value, col = Group))+
  geom_line() +
  xlab('Chain Step') +
  ylab('Probability') +
  ggtitle('24 Step Chain Probability Prediction')+
  theme(plot.title = element_text(hjust = 0.5))
图表

结合这两项结果,可以明显看出在第 6–9 步后,CW 状态成为最有可能的状态。鉴于这些转移概率是按月计算的,您可以认为该行业从初次预约到成功成交的典型销售速度大约在 6 到 9 个月之间。这是一个相当漫长的销售流程。

结论

本次分析的目标是展示马尔可夫链和吸收型马尔可夫链的基本原理如何用于回答与业务相关的问题。在本例中,尽管采用了时间齐次的假设,马尔可夫链的结果仍相当准确,因为进一步的实证分析显示,本分析中所用行业的平均销售速度为 208 天,接近 7 个月。希望这个示例能促使您进一步自行探索马尔可夫链,并将其应用于您的业务问题。

如果您有兴趣进一步学习 R,请参加 DataCamp 的Intermediate R课程。

查看我们的Python 中的马尔可夫链:入门教程。

主题