關聯分析--R實現案例


R中的實現

相關軟件包

R中兩個專用於關聯分析的軟件包-—arules arulesViz。其中,arules用於關聯規則的數字化生成,提供AprioriEclat這兩種快速挖掘頻繁項集和關聯規則算法的實現函數;arulesViz軟件包作為arules 的擴展包,提供了幾種實用而新穎的關聯規則可視化技術,使得關聯分析從算法運行到結果呈現一體化。

核心函數

Apriori是最經典的關聯分析挖掘算法,原理清晰且實現方便,可以說是學習關聯分析的入門算法,但效率較低;Eclat算法則在運行效率方面有所提升。

(1). apriori函數

R中實現Apriori算法,其核心函數為apriori(),來源於前面介紹數據集時提到的arules軟件包。函數的基本格式為:

apriori (dataparameter = NULLappearance = NULL,control = NULL)

其中,parameter參數可以對支持度(support)、置信度(confidence)、每個項集所含項數的最大值/最小值(maxlen/minlen),以及輸出結果(target)等重要參數進行設置。如果沒有對其進行設值,函數將對各參數取默認值: support=0.1confidence=0.8maxlen=10minlen=1target=“rules""“frequent itemsets”(輸出關聯規則/頻繁項集)

而參數 appearance可以對先決條件X(lhs)和關聯結果Y(rhs)中具體包含哪些項進行限制,:設置lhs=beer,將僅輸出 lhs 中含有啤酒這一項的關聯規則,在默認情況下,所有項都將無限制出現。

control參數則用來控制函數性能,如可以設定對項集進行升序(sort=1)還是降序(sort=-1)排序,是否向使用者報告進程(verbose=TURE/FALSE)等。

(2). eclat函數

Eclat算法的核心函數即為eclat(),其格式為:

eclat (data,parameter=NULL,control=NULL)

apriori()相比,我們看到參數 parametercontrol被保留,而不含有appearance參數。其中parametercontrol 的作用與apriori()中基本相同,但需要注意的是,parameter中的輸出結果( target)一項不可設置為rules,即通過eclat()函數無法生成關聯規則,並且maxlen 的默認值為5

數據集

我們選擇使用arules軟件包中的Groceries數據集進行算法演示,該數據集是某一食品雜貨店一個月的真實交易數據。

library(arules)

data("Groceries")

summary(Groceries)

 

結果分析:它共包含9835條交易(transactions)以及169個項( items),也就是我們通常所說的商品;並且全脂牛奶(whole milk)是最受歡迎的商品,之后依次為蔬菜(other vegetables)、面包卷(rolls/buns)等。

現在展示數據集的前10條交易信息:

inspect(Groceries[1:10])

 

結果分析:其中每一條數據即代表一位消費者購物籃中的商品類別,如:第一位消費者購買了柑橘( citrus fruit)、半成品面包( semi-finished bread)、黃油( margarine)以及即食湯(ready soups)四種食物。

 

應用案例

運用R軟件挖掘Groceries 數據中各商品的購買行為中所隱含的關聯性。

1 數據初探

首先,我們嘗試對apriori()函數以最少的限制,來觀察它可以反饋給我們哪些信息,再以此決定下一步操作。這里將支持度的最小閾值(minsup)設置為0.001,置信度最小閾值(mincon)設為0.5,其他參數不進行設定取默認值,並將所得關聯規則名記為rules0。

rules0<-apriori(Groceries,parameter = list(support=0.001,confidence=0.5))

 

rules0    #顯示rules0中生成的關聯規則條數

 

inspect(rules0[1:10])   #觀測rules0中前10條規則

 

結果分析:輸出包括5668條關聯規則,如此大量的關聯規則全部輸出使沒有意義的,所以需要設置具體的參數。

2 對生成規則進行強度控制

最常用的方法即是通過提高支持度和/或置信度的值來實現這一目的,而最終關聯規則的規模大小,或者說強度高低,是根據使用者的需要決定的。但需要知道,如果閾值設定較高,容易丟失有用信息,若設定較低,則生成的規則數量將會很大。

一般來說,我們可以選擇先不對參數進行設置,直接使用apriori()函數的默認值(支持度為0.1,置信度為0.8)來生成規則,再進一步調整。或者如上一節所示,先將閾值設定得很低,再逐步提高閾值,直至達到設想的規則規模或強度。

(1) 通過支持度、置信度共同控制

首先,我們可以考慮將支持度與置信度兩個指標共同提高來實現,如下當僅將支持度提高0.004至0.005時,規則數降為120條,進而調整置信度參數至0.64后,僅余下4條規則。另外,在兩參數共同調整過程中,如果更注重關聯項集在總體中所占的比例,則可以適當地多提高支持度的值:若是更注重規則本身的可靠性,則可多提高一些置信度值。

rules1<-apriori(Groceries,parameter = list(support=0.005,confidence=0.5))

rules1

 

rules2<-apriori(Groceries,parameter = list(support=0.005,confidence=0.6))

rules2

 

rules3<-apriori(Groceries,parameter = list(support=0.005,confidence=0.64))

rules3

 

inspect(rules3)

 

(2) 主要通過支持度控制

另外,也可以采取對其中一個指標給予固定閾值,再按照其他指標來選擇前5強的關聯規則。比如當我們想要按照支持度來選擇:

rules.sorted_sup<-sort(rules0,by="support")  #設置支持度閾值為0.5,按支持度排序

inspect(rules.sorted_sup[1:5])   #輸出前5條強關聯規則

 

(3)主要通過置信度控制

以下類似的,我們按照置信度來選出前5條強關聯規則,由輸出結果得到了5條置信度高達100%的關聯規則,比如第一條規則:購買了米和糖的消費者,都購買了全脂牛奶。這就是一條相當有用的關聯規則,正如這些食品在超市中往往擺放得很近。 

rules.sorted_sup<-sort(rules0,by="confidence")  

inspect(rules.sorted_sup[1:5])   

 

(4)主要通過提升度控制

我們按lift值進行升序排序並輸出前5條:

rules.sorted_lift<-sort(rules0,by="lift")

inspect(rules.sorted_lift[1:5])

 

結果分析:由以上輸出結果,我們能夠清晰地看到強度最高的關聯規則為{即食食品,蘇打水}→{漢堡肉},其后為{蘇打水,爆米花}→{垃圾食品}。

實際應用案例

相信你在逛超市時一定發現過兩種商品捆綁銷售的情況,這可能是因為商家想要促銷其中的某種商品。比如我們現在想要促銷一種比較冷門的商品——芥末(mustard),可以通過將函數 apriori)中的關聯結果(rhs)參數設置為“mustard”,來搜索出rhs中僅包含mustard 的關聯規則,從而有效地找到mustard 的強關聯商品,來作為捆綁商品。

如下輸出結果顯示蛋黃醬(mayonnaise)是芥末( mustard)的強關聯商品,因此我們可以考慮將它們捆綁起來擺放在貨架上,並制定一個合適的共同購買價格,從而對兩種商品同時產生促銷效果。另外,我們還用到了參數 maxlen,這里將其設為2,控制lhs 中僅包含一種食品,這是因為在實際的情形中,我們一般僅將兩種商品進行捆綁,而不是一堆商品。

rules4<-apriori(Groceries,parameter = list(maxlen=2,support=0.001,confidence=0.1),appearance = list(rhs="mustard",default="lhs"))

inspect(rules4)

 

改變輸出結果形式

我們知道,apriori()和eclat()函數都可以根據需要輸出頻繁項集(frequent itemsets)等其他形式結果。比如當我們想知道某超市這個月銷量最高的商品,或者捆綁銷售策略在哪些商品簇中作用最顯著等,選擇輸出給定條件下的頻繁項集即可。

如下即是將目標參數(target)設為“frequent itemsets”后的結果:

itemsets_apr<-apriori(Groceries,parameter = list(supp=0.001,target="frequent itemsets"),control = list(sort=-1))

itemsets_apr   #顯示生成頻繁項集的個數

 

inspect(itemsets_apr[1:5])  #觀察前5個頻繁項集

 

結果分析:我們看到以sort參數對項集頻率進行降序排序后,銷量前5的商品分別為全脂牛奶、蔬菜、面包卷、蘇打以及酸奶。

我們使用eclat()函數來獲取最適合進行捆綁銷售,或者說相近擺放的5對商品。比如,下面的輸出結果中的全脂牛奶和蜂蜜,以及全脂牛奶與蘇打作為共同出現最為頻繁的兩種商品,則可以考慮采取相鄰擺放等營銷策略。(頻繁項集的產生只於支持閾值有關)

itemsets_ecl<-apriori(Groceries,parameter = list(minlen=1,maxlen=3,supp=0.001,target="frequent itemsets"),control = list(sort=-1))

itemsets_ecl

inspect(itemsets_ecl[1:5])

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM