上一篇我们讲了关联分析的几个概念,支持度,置信度,提升度。以及如何利用Apriori算法高效地根据物品的支持度找出所有物品的频繁项集。
- Python --深入浅出Apriori关联分析算法(一)
这次呢,我们会在上次的基础上,讲讲如何分析物品的关联规则得出关联结果,以及给出用apyori这个库运行得出关联结果的代码。
一. 基础知识
上次我们介绍了几个关联分析的概念,支持度,置信度,提升度。这次我们重点回顾一下置信度和提升度:
置信度(Confidence):置信度是指如果购买物品A,有较大可能购买物品B。计算方式是这样:
置信度( A -> B) = (包含物品A和B的记录数量) / (包含 A 的记录数量)
举例:我们已经知道,(牛奶,鸡蛋)一起购买的次数是两次,鸡蛋的购买次数是4次。那么置信度Confidence(牛奶->鸡蛋)的计算方式是Confidence(牛奶->鸡蛋)=2 / 4。提升度(Lift):提升度指当销售一个物品时,另一个物品销售率会增加多少。计算方式是:
提升度( A -> B) = 置信度( A -> B) / (支持度 A)
举例:上面我们计算了牛奶和鸡蛋的置信度Confidence(牛奶->鸡蛋)=2/4。牛奶的支持度Support(牛奶)=3 / 5,那么我们就能计算牛奶和鸡蛋的支持度Lift(牛奶->鸡蛋)=0.83
当提升度(A->B)的值大于1的时候,说明物品A卖得越多,B也会卖得越多。而提升度等于1则意味着产品A和B之间没有关联。最后,提升度小于1那么意味着购买A反而会减少B的销量。
举个例子,有了这个指标,你就能看出卖越多的汉堡就会卖越多的番茄酱。但卖越多的沐浴露,则可能香皂的销量会下降。
二. 关联规则
我们前面已经用Apriori得到频繁项集了。那么我们就可以在频繁项集的基础上,找到这里面的关联规则。而计算关联规则所用到的,就是我们上面所说的置信度和提升度。
这里有一点要注意,当我们发现置信度(A->B)很高的时候,反过来的值置信度(B->A)不一定很高。
一个物品的关联结果是非常多的。但好在,我们上一节学习了Apriori思想。运用在置信度上也是合适的:
如果一个关联结果的置信度低,那么它的所有超集的置信度也低。
这样一来,我们就能节省很多的计算量。
三. Apriori关联规则实战
我们还是用mlxtend库,根据上一篇找到的频繁项集,计算出它们的关联规则。在此之前,还是先介绍一下相应API的参数。
association_rules
完整代码如下:
import
这里我们根据置信度来计算,找出置信度大于0.6的关联规则。
计算结果如下:
我们可以发现,除了置信度(confidence),提升度(lift)外,还有两个指标,leverage和conviction。这两个用得比较少,和置信度,提升度也有些类似,就不展开说了。
既然返回的结果是Dataframe,那么就可以很方便得用pandas的排序方法找出置信度或提升度高的物品组合,方法如下:
DataFrame.sort_values
比如上面例子中要找出最大的置信度,用
result.sort_values(by = 'confidence',ascending=False,axis=1)
上面例子中我们可以发现,{洋葱 -> 鸡蛋,芸豆} 的置信度是 1.00 ,而它们的提升度是 1.25 。这说明买了洋葱的人很可能会再购买 1.25 份的 {鸡蛋,芸豆} 。所以可以让它们放到一起出售。
OK,相信通过这个前面的介绍和这次的这个例子,已经能够明白Apriori算法的原理以及如何使用它。当然Apriori只能算是关联挖掘算法中比较基础的一个,还有其他的关联挖掘算法,比如FP-growth,以后有机会再介绍吧。
对了,我从网上找了个关联分析的数据和大概针对这个数据写了个小的demo代码。
关联分析数据
数据是超市的购物清单,大概有7500条,足够我们来运算分析了。
我把数据和我写的一点点demo代码放在我的公众号中了,关联公众号:哈尔的数据城堡,回复“apriori”(不需要双引号),就能获得下载链接了。
以上~