关联规则算法是在一堆数据集中寻找数据之间的某种关联,通过该算法我们可以对数据集做关联分析——在大规模的数据中寻找有趣关系的任务。这些关系可以有两种形式:频繁项集、关联规则。
关联分析典型的例子,沃尔玛超市啤酒于尿不湿的关联分析。例如:购物篮数据
订单编号 | 购买商品集合 |
001 | 羽毛球拍,羽毛球 |
002 | 羽毛球,球网,纸巾,矿泉水 |
003 | 羽毛球拍,球网,纸巾,红牛 |
004 | 羽毛球,羽毛球拍,球网,纸巾 |
005 | 羽毛球,羽毛球拍,球网,红牛 |
名词定义:
频繁项集:经常出现在一块的物品的集合,当数据量非常大的时候,我们不可能通过人工去算,所以催生了关联规则的算法,如:Apriori、prefixSpan、CBA等。有了计算方法,那么常常出现在一块多少次的物品集合才算频繁项集,则还需要一个评估频繁项集的标准。评估标准有支持度,置信度、和提升度等,需要自定义一个阈值来衡量判别。
给定事务的集合T,关联规则发现是指找出支持度大于等于阈值,并且置信度大于等于阈值的所有规则。挖掘关联规则的一种原始方法是:计算每个可能规则的支持度和置信度,但可以从数据集提取的规则的数目达指数级,更具体地说,从包含d个项的数据集提取的可能规则的总数为:。上面的案例中就有3^6-2^7+1种可能的关联规则。
当数据量增加的时候,计算非常庞大,所以往往我们会采取剪枝策略,即设定支持度、置信度的阈值,没有达到阈值的项集将不必再进行后续的计算。
于是将关联规则分为2个主要的子任务:
优化计算开销:通常频繁项集的产生计算开销远远大于规则产生所需要的计算开销。
先验原理:如果一个项集是频繁的,则它的所有子集一定也是频繁的。如果一个项集是非频繁的,则它的所有超集都是非平凡的。这样找到一个非频繁项集后,就可以把它的超集进行剪枝处理了。
如下图,假如0,1,2,3分别表示4类商品,其中我们假定123为频繁项集,则12,13,23,1,2,3都是频繁的。
反而言之,如果012是非频繁项集,那么他的超集0123也是非频繁的。
Apriori算法过程:
# pip install apriori
# pip install MLxtend
import pandas as pd
import xlrd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
import warnings
warnings.filterwarnings("ignore") #用于排除警告
#读取sheet_name='table1'的数据
df=pd.read_excel('e:\glgz.xlsx') #根据表的名称
display(df)#默认读取前5行的数据
订单编号 | 面膜 | 洗面奶 | 美白霜 | 补水霜 | 洁面乳 | |
---|---|---|---|---|---|---|
0 | 1 | 1 | 1 | 1 | 0 | 0 |
1 | 2 | 0 | 1 | 1 | 1 | 1 |
2 | 3 | 0 | 0 | 0 | 1 | 1 |
3 | 4 | 1 | 1 | 0 | 1 | 0 |
4 | 5 | 1 | 0 | 1 | 0 | 1 |
5 | 6 | 1 | 1 | 1 | 1 | 1 |
6 | 7 | 1 | 0 | 0 | 0 | 0 |
7 | 8 | 0 | 0 | 1 | 1 | 1 |
8 | 9 | 1 | 1 | 0 | 1 | 1 |
# 调用apriori算法,并且设定最小支持度
frequent_itemsets = apriori(df[['面膜', '洗面奶', '美白霜', '补水霜', '洁面乳' ]],min_support=0.4, use_colnames=True)
# frequent_itemsets = apriori(df.drop("订单编号",1),min_support=0.4,use_colnames=True)
display(frequent_itemsets)
# 生成关联规则二维表,min_threshold=1表示最少是两种产品的关联规则
rules = association_rules(frequent_itemsets,metric="lift",min_threshold=1)
display(rules)
注意:antecedent support:前置支持度(由前面一个产品到后面一个产品的支持度);consequent support:后置支持度(由后面一个产品到前面一个产品的支持度);support:综合支持度;confidence:置信度;lift:提示度。
其中support太小的话,则表示该关联规则在整体样本中出现的概率较低,对整体来说分析价值会降低(整体贡献度不够);confidence太低,则说明该组产品组合的价值不高,没有组合价值;lift提升度大于1 有效的强关联规则,小于1 无效的强关联规则,等于1 x与y独立。
#筛选出提升度和置信度满足条件的关联规则
rules[ ( rules["lift"] > 1) & (rules["confidence"] > 0.8) ]
结论:在支持度大于等于0.4,置信度大于0.8且提升度大于1的条件下,关联产品组合有洁面乳和补水霜,且是双侧关联。即可以将这两个产品进行组合售卖,会提高收益。