模型|购物蓝分析实用介绍—关联规则
编者按:关联规则是一种无监督的数据挖掘技术,具有广泛地应用,对于产品的摆设,个性化推荐,有针对性的营销等发挥出积极的作用。认识关联规则,首先要了解其数据准备和表示形式,其次要掌握常用的关联规则挖掘算法,第三,深刻理解三个度量指标:支持度,置信度和提升度,第四,关联规则的生成和检查,最后,关联规则的审核与合理利用。我创建了R语言微信群,需要入群的朋友,请添加我的微信:luqin360,备注:R语言入群。

介绍

曾经想过为什么商品在零售/在线商店以一种特殊的方式展示。为什么根据您添加到购物车的内容向您推荐某些项目?这要归咎于市场购物篮分析或关联规则挖掘。
资源
下面是与这篇文章有关的所有资源的链接:
幻灯片
代码和数据
RStudio云
是什么?

市场购物篮分析使用关联规则挖掘来识别经常一起购买的产品。在进入市场购物篮分析的实质之前,让我们先对关联规则挖掘有一个基本的了解。它发现一个集合中不同对象之间的关联。在市场购物篮分析中,对象是客户购买的产品,集合是交易。简而言之,市场购物蓝分析:
-
一种无监督数据挖掘技术
-
揭示了经常一起购买的产品
-
并创建了if-then场景规则
为什么?

市场篮子分析为以下几点提供了可操作的见解:
-
设计店铺布局
-
在线推荐引擎
-
有针对性的营销活动/促销活动/邮件活动
-
交叉/向上销售
-
目录设计
优势

市场购物篮分析是有成本效益的,因为所需的数据是容易通过电子销售点系统获得。它为产品植入、交叉/向上销售策略、目标营销活动、目录设计、定价策略、库存控制等提供可操作的见解。
案例

关联规则挖掘在零售、电信、银行、保险、制造和医疗等多个行业都有应用。让我们更详细地看看它在以下行业的应用:
零售
电子销售点系统的引入使得大量数据的收集成为可能,零售组织对市场进行购物蓝分析:
-
设计商店布局,以便消费者可以更容易地找到经常一起购买的商品
-
推荐经常一起购买的相关产品,“购买此产品的客户也查看了该产品……”
-
给购买特定产品和其他产品的客户发电子邮件,并向他们提供可能感兴趣的产品。
-
将客户经常购买的产品分组到商店的产品展示位置
-
设计组合或折扣某些产品的特殊促销活动
-
优化电子商务网站目录的布局
-
根据产品需求控制库存,哪些产品一起销售更好
银行
银行和金融机构使用市场购物篮分析来分析信用卡购买以进行欺诈检测和交叉销售保险产品,投资产品(共同基金等),税务准备,退休计划,财富管理等。它也可用于下一个最佳报价 ,序列和季节性优惠。
通信
电信行业的特点是高波动性和低客户忠诚度,由于向其他服务提供商给新客户有利可图的报价。客户从特定运营商使用的服务越多,他/她切换到另一个运营商的难度就越大。市场购物篮分析用于将移动,固定电话,电视和互联网服务捆绑给客户,以增加粘性并减少客户流失。
简单的例子

在我们继续讨论案例研究之前,让我们使用一个简单的例子来理解我们将在本教程的其余部分中遇到的重要术语。 在示例中,事务包括以下产品:
-
手机
-
耳机
-
USB电缆
-
移动电源
-
屏幕保护膜
-
手机套
-
调制解调器/路由器
-
老鼠
-
外置硬盘
步骤

市场购物篮分析的两个重要步骤是:
-
生成频繁项集
-
生成关联规则
我们将在案例研究中更详细地讨论这些步骤。
频繁项集

Itemset是客户购买的商品的集合。在我们的例子中,手机和屏幕保护是常见的intemset。它们出现在五分之三的交易中。
前提和结论

前提是规则左手边的项,结论是规则右手边的项。在我们的例子中,手机是前提,屏幕保护是结论。
支持度

支持是先行事件发生的概率。 它是项目集的相对频率。 如果它低于50%,那么该关联被认为不那么有成效。 在我们的示例中,支持是包括移动电话和屏幕保护的交易的相对频率。
置信度

置信度是与先行者共同发生的可能性,它表达了规则的发生效率。在我们的示例中,客户购买屏幕保护装置的可能性是他已经购买了手机。
提升度
与随机选择事务相比,提升度计算了规则在查找结果方面的效率。一般来说,提升度大于1表明该规则具有一定的适用性。要计算规则的提升度,将项集的支撑度除以前件和后件支撑度的乘积。现在,让我们来理解如何解释提升度。
解释
提升度 = 1:意味着移动电话和屏幕保护之间没有任何关系(即移动电话和屏幕保护仅偶然发生)
提升度 > 1:意味着手机和屏幕保护之间存在正相关关系(即手机和屏幕保护一起发生的频率高于随机)
提升度 < 1:暗示移动电话和屏幕保护之间存在负面关系(即移动电话和屏幕保护一起发生的次数少于随机)
数据
用户可使用两个公开数据集来研究及学习市场篮子分析:
-
UCI
-
data.world
杂货数据集也可以在arules包中获得。在本教程中,我们将使用UCI数据集,因为它非常类似于真实世界的数据集,这使我们有机会重新塑造数据,并按照arules包所需的格式重新构造数据。
数据字典
-
发票号码
-
股票代码
-
描述
-
数量
-
发票日期
-
单价
-
客户id
-
国家
R包
library(readxl)
library(readr)
library(arules)
library(arulesViz)
library(magrittr)
library(dplyr)
library(lubridate)
library(forcats)
library(ggplot2)
预处理
这个部分是可选的。您可以跳到Read Data部分,而不会丢失连续性。

如上所示,数据集每项有一行。我们创建了一个很小的R包mbar,用于数据预处理。可以从GitHub上安装,如下图所示:
# install.packages("devtools")
devtools::install_github("rsquaredacademy/mbar")
我们将使用mbar包中的mbar_prep_data()来重新定义数据,以便每个事务中都有一行跨列的项(不包括列名)。
library(mbar)
mba_data <- read_excel("online-retail.xlsx")
transactions <- mbar_prep_data(mba_data, InvoiceNo, Description)
head(transactions)
EDA
在使用arules包生成规则之前,让我们先研究一下数据集。
人们一天中什么时候购物?
purchase_time <-
mba_data %>%
group_by(InvoiceDate) %>%
slice(1) %>%
mutate(time_of_day = hour(InvoiceDate)) %>%
pull(time_of_day) %>%
as.factor() %>%
fct_count()
purchase_time %>%
ggplot() +
geom_col(aes(x = f, y = n), fill = "blue") +
xlab("Hour of Day") + ylab("Transactions") +
ggtitle("Hourly Transaction Distribution")

平均购买多少物品?
items <-
mba_data %>%
group_by(InvoiceNo) %>%
summarize(count = n()) %>%
pull(count)
mean(items)
median(items)
经常购买的物品
mba_data %>%
group_by(Description) %>%
summarize(count = n()) %>%
arrange(desc(count))
平均订单价值
total_revenue <-
mba_data %>%
group_by(InvoiceNo) %>%
summarize(order_sum = sum(UnitPrice)) %>%
pull(order_sum) %>%
sum()
total_transactions <-
mba_data %>%
group_by(InvoiceNo) %>%
summarize(n()) %>%
nrow()
total_revenue / total_transactions
读取数据
现在是将数据读入r的时候了。我们将使用来自arules包的read.transactions()。由于数据的结构问题,无法使用read.csv()或read_csv()读取数据。我们将读取transaction_data.csv文件,因为它包含我们在前一步中修改过的数据。为了读取数据集,我们需要指定以下内容:
-
引号(单引号或双引号)内数据集的名称
-
数据格式,如果每一行表示一个事务,则使用basket,如果每一行表示事务中的一个项,
-
使用single分隔符分隔事务中的项
在我们的数据集中,每一行代表一个事务,事务中的项由逗号分隔
basket_data <- read.transactions("transaction_data.csv", format = "basket", sep = ",")
basket_data
read.transactions()函数允许您读取每行代表项而不是事务的数据。 在这种情况下,format参数应设置为值single,cols参数应指定表示事务ID和项ID的列的名称或位置。 我们也尝试以这种方式读取数据,但未能这样做。 但是,下面的代码可供其他用户试用,如果您找到了让它工作的方法或发现我们可能犯的任何错误,请告诉我们。
get_data <- read.transactions("retail.csv",
format = "single",
sep = ",",
cols = c("InvoiceNo", "item"))
当我们从上面的代码中删除sep参数时,我们能够读取数据,但是summary()函数的结果与我们在下一节中看到的结果截然不同,即它显示了更多的事务和条目。
数据摘要
要快速浏览数据,请使用summary()。它将返回以下内容:
-
交易数量、
-
项目数量、
-
最频繁的项目、
-
项目分布、
-
项目数量的summary()结果
summary(basket_data)
项目频率图
可以使用itemFrequencyPlot()绘制数据集中最频繁的项。我们可以指定要绘制的项的数量,以及Y轴应该表示包含该项的事务的绝对数量还是相对数量。
topN参数可用于指定要绘制的项的数量,类型参数可用于指定Y轴是否表示项的绝对/相对频率。
itemFrequencyPlot(basket_data, topN = 10, type = 'absolute')

在下面的图中,Y轴表示所绘制项目的相对频率。
itemFrequencyPlot(basket_data, topN = 10, type = 'relative')

生成规则
最后,对于大家一直在等待的部分,规则生成。apriori()函数用于生成规则。我们将首先学习必须指定的不同输入,然后再研究它们,看看规则如何生成。
第一个输入是数据集,在本例中是basket_data。接下来,我们将使用参数自变量提供挖掘参数:
-
supp: 项目集的最小支持度
-
conf: 最小置信度
-
maxlen:先行项可能包含的最大项数
-
target:挖掘的关联类型,即规则
参数需要几个额外的输入,但是要开始,了解上面提到的输入就足够了。所有输入都使用list()提供。
在我们的案例研究中,我们将具体说明如下:
-
support: 0.009
-
confidence: 0.8
-
maxlen: 4
请记住,挖掘具有非常低的支持值的关联规则将导致生成大量规则,从而导致长时间的执行,最终耗尽内存。
rules <- apriori(basket_data, parameter = list(supp=0.009, conf=0.8, target = "rules", maxlen = 4))
更改supp、conf和maxlen的值,并观察规则如何生成更改。
规则摘要
一旦apriori()生成了规则,我们就可以使用summary()来获得一些基本信息,比如规则长度分布。
summary(rules)
但是summary()的输出不显示规则。要查看规则,我们必须使用inspect()。
查看规则
inspect()函数显示规则:
-
support
-
confidence
-
lift
-
count
在检查规则之前,您可以根据支持度、置信度或提升度对规则进行排序。在下面的输出中,在检查规则之前,我们按照信心降序对规则进行排序。
basket_rules <- sort(rules, by = 'confidence', decreasing = TRUE)
inspect(basket_rules[1:10])
冗余规则和非冗余规则
冗余规则
如果存在具有相同或更高置信度的更一般规则,则规则是多余的。也就是说,如果一个更具体的规则与一个更一般的规则具有同等甚至更少的预测性,那么它就是多余的。如果规则具有相同的RHS,但从LHS中删除了一个或多个项目,则规则更为通用。
例子1

在上面的例子中,第一个规则与后面两个规则具有相同的支持度、执行度和lift。规则左侧的第二项是不添加任何值,因此规则是多余的。
例子2

在上面的例子中,前两个规则具有相同的支持度、置信度和提升度。第三条规则只有提升度不同。
例子3

在上面的例子中,第一条和第三条规则具有相同的支持度、置信度和提升度。第二条规则在置信度和提升度方面有所不同。
现在我们已经了解了什么是冗余规则以及如何识别它们,让我们使用下面的R代码来检查它们。
inspect(rules[is.redundant(rules)])
非冗余规则
现在让我们看看非冗余规则。
inspect(rules[!is.redundant(rules)])
什么影响了X产品的购买?
到目前为止,我们已经学会了如何生成、检查和修剪规则。现在,我们如何使用这些规则呢?为了让商业更有意义,我们需要制定一套规则,既可以用于实体店的产品植入,也可以作为在线商店的推荐,或者通过电子邮件活动进行定向营销等。要做到这一点,我们需要知道两件事。
-
什么产品影响了X产品的购买?
-
产品X影响了哪些购买?
对于我们的案例研究,我们可以将上述问题修改为:
什么影响了糖的购买?
要查看影响购买糖的产品,我们将继续使用apriori()函数,但添加一个参数appearance。 它限制了项目的出现。 由于我们希望规则的右侧只有一个值,即糖,我们将rhs参数设置为sugar。 规则的左侧应包括影响购买糖的所有产品,即它将排除糖。 我们将使用默认参数并为其提供值lhs,即除了糖之外的所有项目都可以默认显示在规则的左侧。
-
default
-
rhs
sugar_rules <- apriori(basket_data, parameter = list(supp = 0.009, conf = 0.8),
appearance = list(default = "lhs", rhs = "SUGAR"))
对于我们之前提到的支持度和置信度,我们知道以下产品影响了食糖的购买:
-
COFFEE
-
SET 3 RETROSPOT TEA
产品X影响什么购买?
现在我们知道哪些产品影响了糖的购买,让我们回答第二个问题。
什么购买受到糖影响?
在这种情况下,我们希望糖在规则的左侧,并且它影响的所有产品都在右侧。 我们将lhs参数设置为sugar,将默认参数设置为rhs,因为所有产品的购买都受到糖的影响。
sugar_rules <- apriori(basket_data, parameter = list(supp = 0.009, conf = 0.8),
appearance = list(default = "rhs", lhs = "SUGAR"))
对于我们之前提到的支持度和置信度,我们知道以下产品的购买受到了糖的影响:
-
COFFEE
-
SET 3 RETROSPOT TEA
Top规则
让我们来看看最重要的规则
支持度降序
supp_rules <- sort(rules, by = 'support', decreasing = TRUE)
top_rules <- supp_rules[1:10]
inspect(top_rules)
置信度降序
conf_rules <- sort(rules, by = 'confidence', decreasing = TRUE)
top_rules <- conf_rules[1:10]
inspect(top_rules)
提升度降序
lift_rules <- sort(rules, by = 'lift', decreasing = TRUE)
top_rules <- lift_rules[1:10]
inspect(top_rules)
可视化
为了可视化规则,arules的作者创建了一个配套包arulesViz。它提供了几个选项来可视化apriori()生成的规则。
散点图
我们可以使用默认的plot()方法来创建散点图。 x轴表示支持度,y轴表示置信度,由点的颜色的透明程度表示提升度。
plot(basket_rules)

网络图
我们可以使用method参数和提供的网络值来创建网络图。 您可以在下面的图中看到规则的方向性。 例如,购买棚屋的人也购买钥匙扣,同样,购买后门的人也购买钥匙扣。 当我们试图绘制太多规则时,很难确定规则的方向性。 method参数也需要其他几个值。
plot(top_rules, method = 'graph')

要记住的事情..
使用提升度时,规则的方向性会丢失。 在下面的示例中,以下规则的升力相同:
-
{Mobile Phone} => {Screen Guard}
-
{Screen Guard} => {Mobile Phone}
很明显,无论规则的方向如何,提升度都是相同的。

置信度作为衡量标准可能会产生误导
如果您查看以下示例,第二条规则{Screen Guard} => {Mobile Phone}的置信度大于第一条规则{Mobile Phone} => {Screen Guard}。 这并不意味着我们可以向购买屏幕保护的客户推荐手机。 重要的是确保我们不使用规则只是因为它们具有与之相关的高可信度。

这并不意味着我们可以向购买屏幕保护的客户推荐一款手机。重要的是要确保我们使用规则仅仅是因为它们对规则有很高的置信度。

总结
-
市场购物篮分析是一种无监督的数据挖掘技术
-
揭示经常一起买的产品
-
创建if-then场景规则
-
具有成本效益,富有洞察力和可操作性
-
关联规则挖掘在多个行业中都有应用
-
使用提升度时,规则的方向性会丢失
-
置信度作为衡量标准可能会产生误导
当您尝试使用市场购物篮分析时,您对域/业务的了解非常重要。 特别是,当您尝试选择或列出规则并将其用于商店中的产品展示位置或在线推荐产品时。 在实施规则之前批判性地审查规则是一种好的做法。
原文链接:
https://blog.rsquaredacademy.com/market-basket-analysis-in-r/
如果您觉得有用,请点赞和分享给朋友。文中的链接,请点击阅读原文。您有任何问题,请留言。
内容推荐
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!