一、概念
关联算法常用于购物篮分析:找到正向、强关联的商品集合,用来优化货架商品摆放和捆绑销售。
关联算法需要明确:频繁项集(A,B),A->B和B->A的关联方向(正、负)与关联程度(强、弱)。
频繁项集:出现次数不小于设定阀值的商品集合
电商常用单品推荐单品,称为频繁2项集,形如(A,B)。
关联算法重要定理:频繁项集的所有非空子集也都必须是频繁的。
比如(A,B,C)是频繁项集,那(A,B)肯定也是频繁项集。如果(A,B)不是频繁项集,那(A,B,C)肯定也不是频繁项集。
支持度(Support):用来找频繁项集、计算作用度和置信度
Support(A,B)=A、B两件商品同时出现的次数 / 总购物车次数。
分母N是固定的,所以很多文章都用分子frq(X,Y)取名"支持计数"来比较支持度小大。
支持度不小于用户设定的最小支持度阀值的项集,称为频繁项集。
作用度(Lift):又名提升度,用来衡量关联方向
传统关联算法是没有作用度指标的,很多文章示例都没有提及。
加入这个指标的用意是:看两个商品之间的关联是正向的还是负向的。
也就是说看一个商品的出现会提高还是会降低另一个商品的出现概率。
Life(A,B)=Support(A,B)/(Support(A)*Support(B))有A的情况下有B的概率/有B的概率。
大于1说明正相关、提高购买概率。小于1说明负相关、降低购买概率。等于1说明互不影响。
比如总共100条购物记录,A出现的次数是30次,B出现的次数是50次,AB同时出现的次数是10次,那么:
Life(A->B)=Life(B->A)=Life(A,B)=(10/100) / (30/100)*(50/100)=2/3。
对购物车中已经包含商品A/B的用户推荐商品B/A,其购买概率(10/30)是单独购买B/A概率(50/100)的2/3倍。
比如对购买雨衣的用户推荐雨伞,比对未购买雨衣的用户推荐雨伞的收益小。这个关联是无效的、反向的。
置信度(Confidence):用来衡量关联程度
Confidence(A->B)=Support(A,B)/Support(A)。即购买A后也会购物B的概率。
Confidence(A->B)<>Confidence(B->A),如果Confidence(A->B)更大,表示对已购买A的推荐B的成功率更高。
二、总结关联算法步骤
1.从支持度大于支持度阀值的热销商品里找到多个频繁2项集(Ai,Bi);
2.计算Life(Ai,Bi),筛选出大于1的频繁2项集(Ai,Bi);
3.计算Confidence(Ai->Bi)和Confidence(Bi->Ai),所有值高低排序;
4.找到大于置信度阀值的或者取前N个最高的(X->Y),营销策略:对购买X的用户推荐Y。
总购物记录条数是K,A的出现次数是N1,B的出现次数是N2,A、B的出现次数是M,那么:
假设用户设定的最小支持度阀值=J/K,Support(A,B)=M/K,如果M>J,那么(A,B)是频繁项集。
Life(A,B)=Support(A,B)/(Support(A)*Support(B))=(M/K)/((N1/K)*(N2/K))=(M*K)/(N1*N2)。
Confidence(A->B)=Support(A,B)/Support(A)=M/N1,Confidence(B->A)=Support(A,B)/Support(B)=M/N2。
关联算法(Assocaition Algorithm)的区别主要在步骤1的实现速度。
主要是数据的存储形式与查找方式不同,导致频繁项集的生成过程不同,进而性能不同。
根据数据的表述形式:水平、垂直、前缀树,分别对应三种关联算法:Apriori、Eclat 、FP growth。
Apriori要持续全表扫描数据库,对超大型数据会出现性能问题,所以又推出了Eclat 、FP growth和其他。
sklearn没有现成模块支持关联算法。可以自己写个封装起来,或者去网上找别人写好的。
实际的关联营销会比上述关联算法更复杂一些:会结合库存、流量分配、支持度和置信度的权重综合考虑。
三、关于支持度和置信度阀值的困惑
支持度阀值,困惑较大:
Q:小于支持度阀值的低销量物品,为什么不用关联营销?也许关联性更强。
A:如果一个物品本身购买的人就不多,再怎么提升它也不会高到哪去。低销量物品的关联性,偶然成分更大。
Q:100次购物记录中有的物品出现10次、有的20次、有的30次,如何设置支持度阀值?
A:可以选取支持度前N%个作为支持度的阀值。
置信度阀值,困惑较小:
Q:购买了一个商品后同时购买另一个商品的概率,也许是30%、50%、70%。如何设置置信度阀值?
A:可以选取置信度前N个作为置信度的阀值。
四、算法示例
首先设定最小支持计数为2,最小支持度为2/5=40%。
第1步:扫瞄所有的事务,统计每件商品的出现次数,产生候选1-项集的集合C1
第2步:将C1中支持计数不小于最小支持计数2的候选1-项集选出,产生频繁1-项集的集合L1
第3步:利用自身连接L1 X L1产生候选2-项集的集合C2,扫瞄所有事务,统计C2中每个候选项集的支持计数
第4步:通过比较,将C2中支持计数不小于最小支持计数2的候选2-项集选出,产生频繁2-项集的集合L2
第5步:利用自身连接L2 X L2,产生候选3-项集的集合C3,重复上述过程,直至产生的候选项集不满足Apriori定理。此处由于候选3-项集为空, 频繁2-项集为最终结果。
举个例子理解为什么候选3-项集为空:比如说L2 X L2得到其中的一个3 -项集是{啤酒,尿布,牛奶},Apriori定理说频繁项集的所有非空子集也都必须是频繁的,{啤酒,尿布,牛奶}包括三个子集{啤酒,尿布},{啤酒,牛奶},{尿布,牛奶},其中{啤酒,尿布},{啤酒,牛奶}是频繁的,因为它们都出现在了L2中,但是{尿布,牛奶}不是频繁的,因此3 -项集是{啤酒,尿布,牛奶}不满足Apriori定理,其余理解类似。
第6步:计算每个项集的作用度,保留作用度大于1的。
作用度(啤酒->尿布/尿布->啤酒)=(3*5)/(4*4) =15/16 <1
作用度(啤酒->牛奶/牛奶->啤酒)=(2*5)/(4*2) =5/4 >1
作用度(尿布->婴儿爽身粉/婴儿爽身粉->尿布)= (2*5)/(4*2) =5/4 >1
保留项集(啤酒,牛奶)、(尿布,婴儿爽身粉)。
第7步:计算保留项集间的置信度。
置信度(啤酒→牛奶)= 2/4= 50%
置信度(牛奶→啤酒)= 2/2= 100%
置信度(尿布→婴儿爽身粉)= 2/4= 50%
置信度(婴儿爽身粉→尿布)= 2/2= 100%
第8步:取置信度>60%的进行营销策划:
(牛奶→啤酒):对购买牛奶的用户推荐啤酒
(婴儿爽身粉→尿布): 对购买婴儿爽身粉的用户推荐尿布
也许你认为就算不推广,他们也会有100%的概率会自己去买。何必关联营销?
要知道,这个置信度是会变的啊!
如果电商平台能给出快捷购买的渠道,体验性非常好,用户的忠诚度也会增加,置信度可能就上升了!
如果本着不管不问的态度,让用户自己去找,也许哪天他偷个懒或者忘了就不买了,置信度就降低了!