关联规则,从大量数据中发现事物、特征或者数据之间的,频繁出现的相互依赖关系和关联关系。
X—>Y,XY的关联规则,包括支持度support、信任度confidence和提升度lift。
关联规则最早是为购物篮分析问题所提出,如著名的啤酒与尿布的故事。
发现项集之间的关联和相关关系,通过对数据集进行关联分析可得出形如“由于某些事件的发生而引起另外一些事件的发生”之类的规则。关联分析对商业决策具有重要的价值,如基于用户购买习惯,制定相关推荐产品、套装商品或捆绑商品的销售策略,达到平台整体销量提升。
假设某个时间段内存在以下4次交易行为,购买商品如下:
TID | Items |
---|---|
001 | Cola, Egg, Ham |
002 | Cola, Diaper, Beer |
003 | Cola, Diaper, Beer, Ham |
004 | Diaper, Beer |
关联规则中涉及到的基本概念:
名称 | 说明 |
---|---|
事务 | 每一个交易数据称为一个事务。如上表包含了4个事务 |
项 | 交易的每个商品称为项。如Cola, Beer等 |
项集 | 交易商品组成的集合,如{Cola}, {Cola Egg} |
K-项集 | 包含K个商品的集合叫做 K-项集。如{Cola, Beer, Ham}:3-项集 |
支持度计数 | 一个商品集合出现在N个交易中,则该商品集合的支持度计数为N。如{Diaper, Beer}出现在交易 002、 003、 004中,其支持度计数为3 |
支持度 | 支持度计数 / 总事务数。如 {Diaper, Beer} 支持度为 3/4 = 75%。这说明75%的人同时买了 Diaper 和 Beer。 |
频繁项集 | 支持度大于或等于某个阈值的项集就叫做频繁项集。如 阈值设50%时,因为{Diaper, Beer}的支持度是75%,所以它是频繁项集。 |
置信度 | 对于{A}->{B},它的置信度为 {A, B}的支持度计数 除以 {A} 的支持度计数。如,规则{Diaper}->{Beer}的置信度为 3/3,即100%,说明买了Diaper的人 100% 也买了 Beer。 |
强关联规则 | 大于或等于最小支持度阈值 和 最小置信度阈值 的规则叫做强关联规则。关联分析的最终目标就是要找出强关联规则。 |
频繁项集,顾名思义指频繁出现item项的集合。
如何定义频繁呢?用比例来判定,常用的频繁项集的评估标准有支持度,置信度和提升度三个。
支持度:出现的项集在总事务中的占比。以购买记录为例子,购买记录4条,如果商品Cola和Beer同时出现2条购买记录(即同时购买Cola和Beer的记录有2),那边Cola和Beer这个2项集的支持度为50%。
置信度:购买Cola的情况下,再购买Beer的概率。
提升度:使用规则后商品出现的次数是否高于商品单独出现的概率。
提升度体先了X和Y之间的关联关系, 提升度大于1则X->Y是有效的强关联规则, 提升度小于等于1则X->Y是无效的强关联规则 。一个特殊的情况,如果X和Y独立,则有Lift(X⇐Y)=1,因为此时P(X|Y)=P(X)。
Apriori算法的目标是找到最大的K项频繁集,一是满足最小支持度的频繁集,二是找到频繁集的最大个数。
Apriori算法采用了迭代的方法:
先搜索出候选1项集及对应的支持度,剪枝去掉低于支持度的1项集,得到频繁1项集。
然后对剩下的频繁1项集进行连接,得到候选的频繁2项集,筛选去掉低于支持度的候选频繁2项集,得到真正的频繁二项集。
以此类推,迭代下去,直到无法找到频繁k+1项集为止,对应的频繁k项集的集合即为算法的输出结果。
图中有4个记录,记录项有1,2,3,4,5若干
首先先找出1项集对应的支持度(C1),可以看出4的支持度25%低于最小支持阈值50%,先剪掉,得到(L1)。
从1项集生成2项集,并计算支持度(C2),可以看出(1,5)(1,2)支持度均为25%低于最小支持阈值,先剪掉,得到(L2)
从2项集生成3项集,(1,2,3)(1,2,5)(2,3,5)只有(2,3,5)满足要求,至此无法生成新的频繁项集,算法结束,最终得到3-项频繁集。
由于Apriori算法在每次计算项集的支持度时需要扫描所有数据集,当数据量较大,数据种类较多时,算法的效率是很低的。
基于Sebastian Raschka 提供的非常有用的具有Apriori算法的MLxtend库。
import pandas as pd from mlxtend.frequent_patterns import apriori from mlxtend.frequent_patterns import association_rules from mlxtend.preprocessing import TransactionEncoder df=pd.read_excel(r'C:\Users\Desktop\My_Python\Online Retail.xlsx') df.head() ####------------------------------------------- #### 数据清洗 ####------------------------------------------- df['Description'] = df['Description'].str.strip() df.dropna(axis=0, subset=['InvoiceNo'], inplace=True) df['InvoiceNo'] = df['InvoiceNo'].astype('str') df = df[~df['InvoiceNo'].str.contains('C')] df = df[~(df['Description']=='POSTAGE')] ####------------------------------------------- #### 对数据进行One-Hot编码 ####------------------------------------------- # 选取France样本数据 basket = pd.DataFrame(df[df['Country'] =="France"].groupby(['InvoiceNo', 'Description'])['Quantity'].sum().reset_index() , columns = ['InvoiceNo', 'Description', 'Quantity']) df_grouped=basket.groupby('InvoiceNo')['Description'].unique().apply(list).reset_index().set_index(['InvoiceNo']) # df_grouped # 将数据格式转换成One-Hot编码要求格式 a list of lists basket_list = [df_grouped['Description'][i] for i in range(len(df_grouped['Description']))] te = TransactionEncoder() df_tf = te.fit_transform(basket_list) basket_sets_encoder = pd.DataFrame(df_tf,columns=te.columns_) # 筛选满足大于或等于最小支持度0.07的频繁项集 frequent_itemsets = apriori(basket_sets_encoder, min_support=0.07, use_colnames=True) frequent_itemsets.sort_values(by='support', ascending=False, inplace=True) frequent_itemsets # 选择2项频繁项集 frequent_itemsets['length'] = frequent_itemsets.itemsets.apply(lambda x: len(x)) frequent_itemsets[frequent_itemsets['length'] == 2] # 计算关联规则 # metric可以有很多的度量选项,返回的表列名都可以作为参数 association_rule = association_rules(frequent_itemsets,metric='confidence',min_threshold=0.5) #关联规则可以提升度排序 association_rule.sort_values(by='lift',ascending=False,inplace=True) association_rule # 规则是:antecedents->consequents
参考来源:
Apriori算法原理总结
【转载】Python 关联规则分析
利用Python进行市场购物篮分析——入门篇