在与利益相关者会议即将开始之际,心想:“现在是展现成果的时刻!”准备了一个精彩的演示文稿,对自己的工作充满信心。然而,在演示进行到三十分钟时,竭尽全力向利益相关者解释提升、支持和置信度在想象中的三维空间中的概念,但他们似乎并不买账,认为这项技术过于复杂。会议以关键利益相关者的一句话结束:“能创建一个更简单、更直观的东西吗?”
这促使回到起点,开发出一种简单的可视化技术来解释市场篮子分析。这种技术的核心思想是:文本挖掘中使用的算法可以用来创建市场篮子分析中的关系图。市场篮子分析是零售业广泛使用的分析工具,但其应用并不仅限于零售业。不同行业的各种交叉销售策略都可以利用市场篮子分析来制定。网络上关于市场篮子分析的理论有很多内容,但很少看到有关如何可视化市场篮子分析的文章。在本文中,将利用一些文本挖掘算法来获取这样的视觉图。
支持度(Support):支持度简单地说是事件发生的概率。如果有一个购买产品A的事件,支持度(A)就是包含A的交易数量除以总交易数量。
置信度(Confidence):置信度本质上是在B已经发生的情况下,事件A发生的条件概率。
如需更详细的定义,请参考之前的文章。
任何分析的第一步都是引入数据集。使用虚拟数据来演示这个应用。数据包含了12000笔交易的详细信息,每笔交易包含3个产品。以下是导入存储在CSV文件中的交易数据的代码。
txn_data <- read.csv("Retail_Data.csv")
summary(txn_data)
如所见,每笔交易都有3个产品。产品1只包含A、B、C和D。产品2包含E、F和G。产品3包含H和I。所有三个产品都是互斥的。
这是在文本挖掘中学到的一个概念,它也非常适合这个应用。首先创建一个带有每个产品标志的矩阵。总共有9个产品,因此生成9个向量来捕获这些标志。以下是生成9个向量并将它们组合成项目文档矩阵的代码。
# 初始化向量
A <- numeric(0)
B <- numeric(0)
C <- numeric(0)
D <- numeric(0)
E <- numeric(0)
F <- numeric(0)
G <- numeric(0)
H <- numeric(0)
I <- numeric(0)
# 准备标志度量
for ( i in 1:nrow(txn_data)) {
if (txn_data$Prod1[i] == "A") A[i] <- 1 else A[i]<-0
if (txn_data$Prod1[i] == "B") B[i] <- 1 else B[i]<-0
if (txn_data$Prod1[i] == "C") C[i] <- 1 else C[i]<-0
if (txn_data$Prod1[i] == "D") D[i] <- 1 else D[i]<-0
if (txn_data$Prod2[i] == "E") E[i] <- 1 else E[i]<-0
if (txn_data$Prod2[i] == "F") F[i] <- 1 else F[i]<-0
if (txn_data$Prod2[i] == "G") G[i] <- 1 else G[i]<-0
if (txn_data$Prod3[i] == "H") H[i] <- 1 else H[i]<-0
if (txn_data$Prod3[i] == "I") I[i] <- 1 else I[i]<-0
}
final.mat <- rbind(A,B,C,D,E,F,G,H,I)
一旦有了交易-项目矩阵,就该创建一个项目-项目相关性矩阵了。使用了一个简单的数学公式来实现这一点。将交易-项目矩阵与其自身的转置相乘,得到项目-项目相关性矩阵。在这个矩阵中,对角线上的数字给出了支持度的指示,而所有其他数字给出了置信度。使用这两个数字来构建关系图。以下是构建矩阵和图形的代码。
# 创建关系矩阵
termMatrix <- final.mat %*% t(final.mat)
# 创建图形
library(igraph)
# 从上述矩阵构建图形
g <- graph.adjacency(termMatrix, weighted=T, mode = "undirected")
# 移除环
g <- simplify(g)
# 设置标签和顶点的度数
V(g)$label <- V(g)$name
V(g)$degree <- degree(g)
# 设置种子以使布局可重现
set.seed(3952)
layout1 <- layout.fruchterman.reingold(g)
plot(g, layout=layout1)
plot(g, layout=layout.kamada.kawai)
tkplot(g, layout=layout.kamada.kawai)
目前还没有将置信度或支持度的强度纳入图形中。在这个图中,产品A和B没有连接。这只是因为他们在任何交易中从未共同存在过。这个图可以用来可视化负提升项目。这些项目不应该被放置在一起。下一步是将每个产品的支持度纳入视觉图中。
V(g)$label.cex <- 2.2 * V(g)$degree / max(V(g)$degree)+ .2
V(g)$label.color <- rgb(0, 0, .2, .8)
V(g)$frame.color <- NA
egam <- (log(E(g)$weight)+0.2) / max(log(E(g)$weight)+0.2)
在这里,已经将每个产品的支持度纳入了考虑。如所见,H和I形成了最大的字母,而A、B、C和D形成了最小的字母。这是支持度高低的指示。可以从最初的频率分布中验证这些推断。下一步是将置信度也纳入关系线宽度中。
E(g)$color <- rgb(.5, .5, 0, egam)
E(g)$width <- egam
# 在layout1中绘制图形
plot(g, layout=layout1)
tkplot(g, layout=layout.kamada.kawai)
最终的图形使整个故事变得清晰。已经看到H和I拥有最高的支持度。现在也清楚地看到E-I、I-F和H-F具有很高的置信度。因此,如果客户购买了产品F,他们很可能也会购买产品H和I。因此,可以从这个分析中推断出以下规则: