R中的實現
1 相關軟件包
R中兩個專用於關聯分析的軟件包-—arules 和 arulesViz。其中,arules用於關聯規則的數字化生成,提供Apriori和 Eclat這兩種快速挖掘頻繁項集和關聯規則算法的實現函數;而arulesViz軟件包作為arules 的擴展包,提供了幾種實用而新穎的關聯規則可視化技術,使得關聯分析從算法運行到結果呈現一體化。
2 核心函數
Apriori是最經典的關聯分析挖掘算法,原理清晰且實現方便,可以說是學習關聯分析的入門算法,但效率較低;而 Eclat算法則在運行效率方面有所提升。
(1). apriori函數
在R中實現Apriori算法,其核心函數為apriori(),來源於前面介紹數據集時提到的arules軟件包。函數的基本格式為:
apriori (data,parameter = NULL,appearance = NULL,control = NULL)
其中,parameter參數可以對支持度(support)、置信度(confidence)、每個項集所含項數的最大值/最小值(maxlen/minlen),以及輸出結果(target)等重要參數進行設置。如果沒有對其進行設值,函數將對各參數取默認值: support=0.1,confidence=0.8,maxlen=10,minlen=1,target=“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()相比,我們看到參數 parameter和 control被保留,而不含有appearance參數。其中parameter與 control 的作用與apriori()中基本相同,但需要注意的是,parameter中的輸出結果( target)一項不可設置為rules,即通過eclat()函數無法生成關聯規則,並且maxlen 的默認值為5。
3 數據集
我們選擇使用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])