1.概念关联分析用于发现隐藏在大数据集中的有意义的联系。找到的链接可以用关联规则或频繁项集的形式表示。项集:在关联分析中,包含0个或多个项的集合称为项集。如果一个项集包含k个项,则称它为k-项集。例如:{啤酒、尿布、牛奶、花生}是一个包含4项的集合。空集是不包含任何项目的项目集。关联规则:是X→Y形式的蕴涵表达式,其中X和Y是不相交的项集,即:X∩Y=?。关联规则的强度可以通过其支持度和置信度来衡量。支持度:项集或规则在所有事物中出现的频率决定了规则可用于给定数据集的频率。σ(X):表示项目集X的支持度项目集X的支持度:s(X)=σ(X)/N;规则X→Y的支持度:s(X→Y)=σ(X∪Y)/N置信度:确定Y在包含X的交易中出现的频率。c(X→Y)=σ(X∪Y)/σ(X)支持度是一个重要的衡量标准,因为支持度很低的规则可能只是偶然出现,支持度低的规则大多没有意义。因此,支持度通常用于删除那些无意义的规则;置信度是通过规则进行推理的可靠性。对于给定的规则X→Y,置信度越高,Y越有可能出现在包含X的事物中。即Y在给定X下的条件概率P(Y|X)越大。2.R语言Apriori算法的实现R语言Apriori算法的应用包含在arules包中。本文不涉及算法的实现,而是使用arules包实现关联规则的挖掘。1.数据来源:使用arules包自带的Groceries数据集,是现实世界某超市一个月的购物数据集,包含9835笔交易。我们按照超市12小时工作时间计算,每小时交易笔数约为9835/30/12=27.3,说明超市规模中等。>library(arules)#loadarulespackage>data(Groceries)>Groceriestransactionsinsparseformatwith9835transactions(rows)and169items(columns)2.探索和准备数据:(1)每行交易数据指定一个实例,每条记录包括一个逗号A任意数量的分隔商品列表,通过inspect()函数,可以看到超市的交易记录,以及每笔交易的商品名称;通过summary()函数,可以查看数据集的一些基本信息。>inspect(Groceries[1:5])#通过inspect函数items1{citrusfruit,semi-finishedbread,margarine,readysoups}2{tropicalfruit,yogurt,coffee}3{wholemilk}4检查Groceries数据集的前5条交易记录{pipfruit,yogurt,creamcheese,meatspreads}5{othervegetables,wholemilk,condensedmilk,longlifebakeryproduct}
>summary(Groceries)transactionsasitemMatrixinsparseformatwith9835rows(elements/itemsets/transactions)and169columns(items)andadensityof0.02609146mostfrequentitems:wholemilkothervegetablesrolls/bunssodayogurt(Other)2513190318091715137234055element(itemset/transaction)lengthdistribution:sizes123456789101112131415161718192021222324262728292159164312991005855645545438350246182117787755462914149114611113321Min.1stQu.MedianMean3rdQu.Max.1.0002.0003.0004.4096.00032.000includesextendediteminformation-examples:labelslevel2level11frankfurtersausagemeatandsausage2sausagesausagemeatandsausage3liverloafsausagemeatandsausage>itemFrequency(Groceries[,1:3])#itemFrequency()函数可以查看商品的交易比实例
frankfurtersausageliverloaf
0.0589730550.0939501780.005083884分析:①密度值0.02609146(2.6%)是指非零矩阵细胞的比例。),因此矩阵中一共有9835*169=1662115个位置,可以得出30天内一共购买了1662115*0.02609146=43367件商品。进一步可以得出,每笔交易购买了43367/9835=4.409件商品,从平均值(Mean=4.409)一栏可以看出我们的计算是正确的;②最常购买的物品:列出交易数据中最常购买的物品。全脂牛奶在9835笔交易中被购买了2513次。因此,我们可以得出全脂牛奶在所有交易中出现的概率为2513/9835=25.6%;③元素(itemset/transaction)长度分布:呈现了一组交易规模的统计,共2159笔交易包含一种商品,一笔交易包含32种商品。从分位数分布可以看出,25%的交易包含两种或更少的商品,约一半交易中的商品数量为3;(2)可视化商品的支持——商品的频率图为了直观地呈现统计数据,可以使用itemFrequencyPlot()函数生成一个图表,描绘包含特定商品的交易比例直方图在。因为包含多种商品,不可能同时显示,所以可以通过support或者topN参数排除部分商品进行显示(3)Visualizetransactiondata-drawingsparsematrix可以可视化整个稀疏矩阵通过使用image()函数。image(Groceries[1:5])#生成一个5行169列的矩阵。矩阵中黑色填充的单元格表示在此交易(行)中购买了产品(列)。从上图可以看出,第一行记录(交易)包含四种商品(黑色方块),这种可视化是数据探索的好工具。它可能有助于识别潜在的数据问题,例如:由于该列代表产品名称,如果该列从上到下填充,则表示每次交易都购买了该产品;另一方面,模式可以帮助揭示交易或项目的有趣部分,尤其是当数据以有趣的方式排序时,例如,如果交易按日期排序,那么黑色方块的模式可能会揭示金额或类型人们购买的物品受季节性影响。这种可视化对于非常大的交易数据集毫无意义,因为单元格太小而无法找到有趣的模式。3.训练模型grocery_rules<-apriori(data=Groceries,parameter=list(support=,confidence=,minlen=))运行apriori()函数很简单,但是找到support和confidence参数生成一个合理的数的关联规则,可能需要大量的试错评估。如果参数设置得太高,那么结果可能没有规则或者规则太常见而不是非常有用的规则;内存不足。aprior()函数默认设置support=0.1和confidence=0.8。但是使用默认设置,是无法获取到规则的>apriori(Groceries)setof0rules#因为support=0.1,表示商品至少要出现在0.1*9835=983.5这个交易中,在前面的分析中,我们发现只有8种商品支持>=0.1,因此使用默认设置不会生成任何规则也就不足为奇了。解决supportsetting问题的一种方法是在考虑一个有趣的模型之前,提前想好需要的最小事务数。举个例子:我们可以认为如果一个商品每天被购买两次,那么一个月就有60条交易记录。这可能是我们感兴趣的,基于此,我们可以计算出所需的支撑support=60/9835=0.006;关于置信度:如果设置太低,可能会被大量不可靠的规则淹没,如果设置太高,可能会有很多明显的规则阻碍我们发现有趣的模式;选择合适的置信水平取决于我们的分析目标。我们可以尝试从一个保守的值入手。如果没有找到可行的规则,我们可以降低置信度来扩大规则的搜索范围。在此示例中,我们将从0.25的置信度开始,这意味着为了将规则包含在结果中,此时规则必须至少正确25%,这将排除最不可靠的规则minlen=2表示该规则至少包含两种商品,可以防止因为某一种商品被频繁购买而创建无用的规则。比如在上面的分析中,我们发现wholemilk的概率(支持度)是25.6%,很可能会出现如下规则:{}=>wholemilk,这个规则没有意义。最后,根据以上分析,我们确定了如下参数设置:>grocery_rules<-apriori(data=Groceries,parameter=list(support=0.006,confidence=0.25,minlen=2))>grocery_rulessetof463rules4。评估模型性能>summary(grocery_rules)setof463rulesrulelengthdistribution(lhs+rhs):sizes#前片+后片的规则长度分布23415029716#有150条规则只包含2种商品,297条规则包含3种商品,以及包含4种商品的16条规则Min.1stQu。MEDIANMEAN3RDQU.MAX.2.0002.0003.0002.7113.0004.000summaryOfQualityMeasures:supportConfidenceliftmin。:0.006101min。:0.2500min。:0.99321Stq.:0.99321Stquh。0.3786Mean:2.03513rdQu.:0.0123033rdQu.:0.44953rdQu.:2.3565Max.:0.074835Max.:0.6600Max.:3.9565mininginfo:datantransactionssupportconfidenceGroceries98350.0060.25
>inspect(grocery_rules[1:5])lhsrhssupportconfidencelift1{potplants}=>{全脂牛奶}0.0069140820.40000001.5654602{意大利面}=>{全脂牛奶}0.0061006610.40540541.5866143{香草}=>{根菜}0.0070157600.vegetable.43125003.9564>{oherbsabs>774=}les}0.0077275040.47500002.4548745{herbs}=>{wholemilk}0.0077275040.47500001.858983 这里需要说明一下lift(升力),用来衡量一类商品相对于它的一般购买率,以及此时被购买的可能性通俗地说:比如第一个规则{盆栽}=>{全脂牛奶},lift=1.565,表示(购买盆栽后购买全脂牛奶的可能性)是(不购买盆栽但是买全脂牛奶的可能性是1.565倍;第一条规则解读:如果一个顾客买了盆栽,那么他也会买全脂牛奶,支持度是0.0070,置信度是0.4000,我们可以确定这个规则覆盖了大约0.7%的交易,并且在购买之后盆栽,他购买全脂牛奶的概率为40%,提升值为1.565,说明他购买全脂奶制品的概率比一般不购买盆栽的顾客增加了1.565倍。从上面的分析我们知道,有25.6%的顾客购买了全脂牛奶,所以计算出来的promotion是0.40/0.256=1.56,和显示的结果是一致的。注意:带有支持的列表示规则的支持,而不是前件(lhs)或结果(rhs)的支持。Liftlift(X→Y)=P(Y|X)/P(Y),lift(X→Y)等同于lift(Y→X)。如果提升值>1,则意味着两种产品一起购买的频率高于仅购买一种产品的频率。较大的提升值是规则重要的重要指标,反映了项目之间的真实关系。5.改进模型的性能(1??)对关联规则集进行排序根据购物篮分析的目标,最有用的规则可能是那些具有高支持度、可靠性和提升度的规则。Arules包包含一个sort()函数,它通过将参数指定为“support”、“confidence”或“lift”来重新排序规则列表。默认是降序排列,可以指定参数decreasing=FALSE来反转排序方式。>inspect(sort(grocery_rules,by="lift")[1:10])lhsrhssupportconfidencelift3{herbs}=>{rootvegetables}0.0070157600.43125003.95647757{berries}=>{whipped/sourcream}0.0090493140.27217133.7968milvekfruits,fruits,0.0070157600.43125003.95647757}=>{rootvegetables}0.0070157600.41071433.768074174{beef,othervegetables}=>{rootvegetables}0.0079308590.40206193.688692285{tropicalfruit,othervegetables}=>{pipfruit}0.0094560240.26345613.482649176{beef,wholemilk}=>{rootvegetables}0.0080325370.37799043.467851284{pipfruit,othervegetables}=>{tropicalfruit}0.0094560240.36186773.448613282{pipfruit,yogurt}=>{tropicalfruit}0.0064056940.35593223.392048319{citrusfruit,othervegetables}=>{rootvegetables}0.0103711240.35915493.295045455{othervegetables,wholemilk,yogurt}=>{tropicalfruit}0.0076258260.34246583.263712(2)抽取关联规则子集:我们感兴趣的规则可以通过subset()函数抽取>fruit_rules<-subset(grocery_rules,items%in%"pipfruit")#items表示出现any在规则项中匹配的位置匹配,为了限制子集只匹配左边或者右边,可以用lhs或者rhs代替>fruit_rulessetof21rules>inspect(fruit_rules[1:5])lhsrhssupportconfidencelift127{pipfruit}=>{tropicalfruit}0.0204372140.27016132.574648128{pipfruit}=>{othervegetables}0.0261311640.34543011.785237129{pipfruit}=>{wholemilk}0.0300965940.39784951.557043281{tropicalfruit,pipfruit}=>{yogurt}0.0064056940.31343282.246802282{pipfruit,yogurt}=>{tropicalfruit}0.0064056940.35593223.392048以上,It是使用R语言附加包arules中实现的先验算法进行关联规则挖掘的应用。欢迎交流!
