关联发现更多CP
联系是普遍存在的,关联的存在本身是有价值的,在电商推荐中关联推荐是最简单最直接有效的。关联推荐的核心有三度:支持度,置信度,提升度.
一个实践操作,能让我们在三度中,恍然大悟。
1,数据模拟
订单号<-c('OD001','OD002','OD003','OD004','OD005')
尿布<-c(1, 0,1,1,1)
啤酒<-c(0, 0,1,1,1)
可乐<-c(1, 1,1,1,1)
面包<-c(0, 0,0,1,0)
巧克力<-c(0,1,0,1,0)
buy_goods <- data.frame(订单号, 尿布, 啤酒, 可乐, 面包, 巧克力)
有五个订单,0/1表示订单是包含商品。

为了更方便的利用SQL对数据进行统计,我们这里需要将数据融合,利用melt实现数据的列转行。
melt(buy_goods, id = (c('订单号')), variable_name =c('商品名称'))

统计描述一下数据
library(sqldf)
SQL = sqldf("SELECT 商品名称, COUNT(1) as Total FROM buy_goods_table WHERE 是否购买=1 group by 商品名称 ORDER BY Total DESC ;")
SQL$Total=as.numeric(SQL$Total)
pie(SQL$Total, labels =SQL$商品名称,explode=0.1,col=rainbow(4), main="购买商品的分布",cex.lab=0.5, cex.axis=0.5, cex.main=1,labelcex=1, family='SimSun')

2,什么是支持度?
即关联组合出现的频率,比如‘尿布’在五个订单出现的频率=4/5;‘尿布->啤酒’ 在五个订单出现的频率=3/5;
3,什么是置信度?
关联组合的条件概率,比如尿布->啤酒的置信度是:在尿布出现的条件下,啤酒出现的概率 = 3/4 ,也等于 ‘尿布->啤酒’的支持度 / ‘尿布’的支持度。
4,什么是提升度?
组合推荐购买某产品概率 / 直接购买某产品的概率,就是很衡量组合推荐提高某产品的购买效果。
比如‘尿布->啤酒’的置信度 / ‘啤酒’ 的支持度 = 提升度。
一个有效的简单关联规则应具有较高的置信度和较高的支持度。如果规则的支持度较高,但置信度较低,则说明规则的可信度差;如果规则的置信度较高但支持度较低,则说明规则的应用机会很少。一个置信度较高但普遍性较低的规则并没有太多的实际的应用价值。
5,怎么找到效果好的频繁项集 — Apriori 算法
有兴趣同学,可以考虑一些对等类为核心的Eclat算法
5.1,需要将数据转成事务对象。
Bt <- sqldf('SELECT 订单号, 商品名称 FROM buy_goods_table WHERE 是否购买=1')
BuyList<-split(Bt[, '商品名称'], Bt[,'订单号'])
library(Matrix)
library(arules)
BuyTrans<-as(BuyList, 'transactions')
summary(BuyTrans)
inspect(BuyTrans)

image(BuyTrans);

5.2,在事务对象中搜索频繁项集,生成有效规则
buyrules<-apriori(data=BuyTrans, parameter=list(support=0.5, confidence=0.6, target='frequent itemsets'))
inspect(buyrules)

找出最大的频繁项集:
buyrules<-apriori(data=BuyTrans, parameter=list(support=0.5, confidence=0.6, target='maximally frequent itemsets'))
inspect(buyrules)

5.3,计算组合的提升度
buyrules<-apriori(data=BuyTrans, parameter=list(support=0.5, confidence=0.6, target='rules'))

由此我们可以筛选出最有价值的关联组合「尿布,啤酒,可乐」,「啤酒,尿布」。两个天差地别的商品,就这样成为了传为佳话的一对CP。
6,让简单的规则可视化
buyrules<-apriori(data=BuyTrans, parameter=list(support=0.5, confidence=0.6, target='frequent itemsets'))
inspect(buyrules)
par(family='SimSun')
plot(x= buyrules, method='graph', control=list(main='购买组合可视化'))

buyrules<-apriori(data=BuyTrans, parameter=list(support=0.5, confidence=0.6, target='rules'))
inspect(buyrules)
plot(buyrules, method='grouped')

plot(buyrules, method='paracoord')

plot(buyrules, method='graph',control=list(arrowSize=3,main='关联规则的可视化'))
