关联性分析又称关联挖掘,就是在交易数据、关系数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式、关联、相关性或因果结果。通俗地讲就是发现各种商品之间的关系,一种商品的售卖是否会影响另一种商品的售卖,这些数据可以用于用户推荐系统。
比较形象一点的案例就是商场里的货架物品摆放。在美国有这样一家奇怪的超市,它将啤酒与尿布这样两个奇怪的东西放在一起进行销售,并且最终让啤酒与尿布这两个看起来没有关联的东西的销量双双增加,这家超市的名字叫做沃尔玛,后来经过市场研究,发现美国的太太们常叮嘱她们的丈夫下班后为小孩买尿布,而丈夫们在买尿布后又随手带回了他们喜欢的啤酒(小栈内心表示是我的话会买包长寿烟)。
虽然这个故事是事后分析,但是如何找出物品之间的关联规则,是我们应该关注的,今天就介绍一下用Apriori算法来找到物品之间的关联规则。
一、Apriori知识点与原理
做 Apriori分析主要分为两步:
1、找出频繁一起出现的物品的集合,我们称之为频繁项集。比如一个超市的频繁项集可能有{{啤酒,尿布},{鸡蛋,牛奶},{香蕉,苹果}}等,
2、在频繁项集的基础上,使用关联规则算法找出其中物品的关联结果。
还有以下几个概念要明白,都是统计学的概率理论:
1、支持度(Support):可以理解为某物品出现的概率
支持度(A)= (包含A物品的记录数)/(总记录数)
2、置信度(Confidence):指在A出现的概率下有多大可能性出现B
置信度(A→B) = (包含A和B物品的记录数)/(A的记录数)
3、提升度(Lift):当销售一个物品时,另一个物品销售率会增加多少
提升度(A→B) = 置信度(A→B)/支持度(A)
二、Apriori分析
根据上面的步骤解析,小栈主要使用python里的mlxtend库。频繁项集的查找使用Apriori,关联规则的解释使用的是association_rules
1、数据导入与清洗
关联分析是一种机器学习的语言,所以数据要编码成机器可识别的语言,如下图所示,这里介绍两种编码方式:一种是label编码,另一种是独热编码
#label编码#
import pandas as pd
df = pd.read_csv(r'C:\Users\didi\Desktop\apriori.csv')
print(df)#原数据#
for i in range(7,18):
df.iloc[:,i] =df.iloc[:,i].apply(lambda x : True if x == 'T' else False)
df
小栈的数据是经过初步处理的数据,但是生活中拿到的数据应该是下面这样的,这种数据要怎么处理呢?使用mlxtend自带的独热编码
#独热编码#
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
dataset = [['牛奶','洋葱','肉豆蔻','芸豆','鸡蛋','酸奶'],
['莳萝','洋葱','肉豆蔻','芸豆','鸡蛋','酸奶'],
['牛奶','苹果','芸豆','鸡蛋'],
['牛奶','独角兽','玉米','芸豆','酸奶'],
['玉米','洋葱','洋葱','芸豆','冰淇淋','鸡蛋']]
te = TransactionEncoder()
te_df = te.fit_transform(dataset)
df = pd.DataFrame(te_df,columns=te.columns_)
df
2、找出频繁集
from mlxtend.frequent_patterns import apriori
df1 = df.iloc[:,7:]
freq = apriori(df1,min_support=0.1,use_colnames= True)
freq
#由于数据原因,小栈把支持度设置成0.1#
3、找出关联规则
from mlxtend.frequent_patterns import association_rules
result = association_rules(freq,metric='confidence', min_threshold=0.8)
result
小栈把置信度设置成0.8,算比较高的了,意思是买A项集的产品有80%以上的可能性买B项集的产品。从上面可以看到买(beer, cannedveg)的人有87.42%的可能性买frozenmeal,如果(beer, cannedveg)销售额提升,frozenmeal的销售额会提升289%