Learn R | Association Rules of Data Mining(二)
一、Apriori演算法的優缺點
上一文主要闡述了關聯規則的基本思想與測度標準,在實際中,這一類型的演算法旨在於發掘數據的內在關聯性,並廣泛應用在精準推薦,定位需求偏好,保險索賠分析等業務領域中。簡單關聯規則下的Apriori演算法就是其中的典型代表。該演算法通過尋找最大頻繁項集來產生相應的關聯規則,並通過置信度、支持度等指標進行篩選,得到切合實際的關聯規則結論。
在進行R實現之前,我們還需要認識到,一方面,在演算法的運行過程中,Apriori演算法有著簡單清晰、易理解、數據要求低等優點;而另一方面,在每一步產生侯選項目集時,Apriori循環產生的組合過多,沒有排除不應該參與組合的元素,從而產生大量的頻繁項集,並且在每次計算支持度時,都需要對資料庫中的全部記錄進行了一遍掃描比較,這樣的做法在應用於大型數據集時會大大影響演算法的運行效率。
後面我們將會學到基於克服Apriori的局限所提出的新的改進舉措,不過這裡暫且不談,先來學習如何在R中完成Apriori的詳細分析。
二、Apriori演算法的R實現
R中專門提供了兩個用於關聯規則的包,即arules和arulesViz,前者用於產生關聯規則的定量化結果,後者用於產生關聯規則的可視化結果。
> install.packages("arules")n> install.packages("arulesViz")n> library(arules)n
arules包中的apriori()函數用於演算法實現,調用公式如下:
> apriori(data, parameter = NULL, appearance = NULL, control = NULL)n# data:指定類型為"transactions"的數據(同樣也支持data.frame與matrix,除此之外類型的數據需要在使用前進行轉化)n# parameter:以列表形式(list)存儲眾多參數,包括支持度(默認0.1),置信度(默認0.8),最小項目數(minlen:默認1),最大項目數(maxlen:默認10),輸出關聯規則(rules),輸出最大頻繁項集(maximally frequent itemsets)等n# appearance:可為先決條件和關聯結果指定明確的項集,(一般是分析人員感興趣的項集),默認情況下不指定某些項集n# control:用來控制函數性能,如對項集進行升序或降序,生成演算法運行的報告進程等n
在關聯規則的應用中,泰坦尼克號的數據是非常經典的一個數據集,可用此數據來分析船艙等級,性別,年齡(Child or Adult)與最終獲救的關聯gu。
首先在http://www.rdatamining.com/data/titanic.raw.rdata上下載數據,並導入R中。
> load("~/titanic.raw.rdata")n> apriori_data <- titanic.rawn> head(apriori_data)n Class Sex Age Survivedn1 3rd Male Child Non2 3rd Male Child Non3 3rd Male Child Non4 3rd Male Child Non5 3rd Male Child Non6 3rd Male Child Non> summary(apriori_data)n Class Sex Age Survived n 1st :325 Female: 470 Adult:2092 No :1490 n 2nd :285 Male :1731 Child: 109 Yes: 711 n 3rd :706 n Crew:885 n
# 使用apriori()函數運行演算法n# rhs參數用於指定規則中後項的特徵,如果不指定的話任何變數都有可能作為後項,在我們這個案例中就不適用了。n> apriori_rules <- apriori(apriori_data, parameter = list(minlen=2, n+ supp=0.01, conf=0.8), appearance = list(rhs=c(Survived=No, Survived=Yes), default=lhs),control = list(verbose=F)) n
# 查看模型的基本情況n> summary(apriori_rules)nset of 9 rulesnnrule length distribution (lhs + rhs):sizesn3 4 n5 4 nn Min. 1st Qu. Median Mean 3rd Qu. Max. n 3.000 3.000 3.000 3.444 4.000 4.000 nnsummary of quality measures:n support confidence lift n Min. :0.01090 Min. :0.8275 Min. :1.222 n 1st Qu.:0.04225 1st Qu.:0.8602 1st Qu.:1.271 n Median :0.06406 Median :0.8774 Median :2.663 n Mean :0.08052 Mean :0.9027 Mean :2.175 n 3rd Qu.:0.06997 3rd Qu.:0.9722 3rd Qu.:3.010 n Max. :0.19173 Max. :1.0000 Max. :3.096 nnmining info:n data ntransactions support confidencen apriori_data 2201 0.01 0.8n
模型生成了9條規則,其中前項後項之和為3的有5條,為4的有4條。同時,summary還給出了支持度、置信度和提升度的分布情況,如果我們想對模型進行進一步優化的話,這方面的信息是非常有用的。
# 查看具體的9條規則n> inspect(apriori_rules)n lhs rhs support confidencen[1] {Class=2nd,Age=Child} => {Survived=Yes} 0.01090413 1.0000000 n[2] {Class=2nd,Sex=Female} => {Survived=Yes} 0.04225352 0.8773585 n[3] {Class=2nd,Sex=Male} => {Survived=No} 0.06996820 0.8603352 n[4] {Class=1st,Sex=Female} => {Survived=Yes} 0.06406179 0.9724138 n[5] {Class=3rd,Sex=Male} => {Survived=No} 0.19173103 0.8274510 n[6] {Class=2nd,Sex=Female,Age=Adult} => {Survived=Yes} 0.03634711 0.8602151 n[7] {Class=2nd,Sex=Male,Age=Adult} => {Survived=No} 0.06996820 0.9166667 n[8] {Class=1st,Sex=Female,Age=Adult} => {Survived=Yes} 0.06360745 0.9722222 n[9] {Class=3rd,Sex=Male,Age=Adult} => {Survived=No} 0.17582917 0.8376623 n lift n[1] 3.095640n[2] 2.715986n[3] 1.270871n[4] 3.010243n[5] 1.222295n[6] 2.662916n[7] 1.354083n[8] 3.009650n[9] 1.237379n
# 使用sort()函數可對關聯規則進行自定義排序n> apriori_rules_sort <- sort(apriori_rules,by=confidence)n> apriori_rules_sort nset of 9 rules n> inspect(apriori_rules_sort)n lhs rhs support confidencen[1] {Class=2nd,Age=Child} => {Survived=Yes} 0.01090413 1.0000000 n[2] {Class=1st,Sex=Female} => {Survived=Yes} 0.06406179 0.9724138 n[3] {Class=1st,Sex=Female,Age=Adult} => {Survived=Yes} 0.06360745 0.9722222 n[4] {Class=2nd,Sex=Male,Age=Adult} => {Survived=No} 0.06996820 0.9166667 n[5] {Class=2nd,Sex=Female} => {Survived=Yes} 0.04225352 0.8773585 n[6] {Class=2nd,Sex=Male} => {Survived=No} 0.06996820 0.8603352 n[7] {Class=2nd,Sex=Female,Age=Adult} => {Survived=Yes} 0.03634711 0.8602151 n[8] {Class=3rd,Sex=Male,Age=Adult} => {Survived=No} 0.17582917 0.8376623 n[9] {Class=3rd,Sex=Male} => {Survived=No} 0.19173103 0.8274510 n lift n[1] 3.095640n[2] 3.010243n[3] 3.009650n[4] 1.354083n[5] 2.715986n[6] 1.270871n[7] 2.662916n[8] 1.237379n[9] 1.222295n
在這個模型中,第三條,第四條,第七條和第八條規則手動可剔除掉,因為第二條,第六條,第五條和第九條規則已經能夠很好的作出解釋了,換句話說這四條規則是"冗餘"的,對模型的幫助並不大。剔除後得到最終的五條關聯規則。
# 使用subset()函數可進行關聯規則篩選n# 經過前面的分析,可發現冗餘的規則的前項都是包含三個項目的,並且符合這一特徵的所有規則都是冗餘的,所以我們可以使用以下篩選條件,即篩選出前項後項和為3的所有規則n> apriori_rules_subset <- subset(apriori_rules,subset=size(apriori_rules)==3)n> apriori_rules_subsetnset of 5 rules n> inspect(apriori_rules_subset)n lhs rhs support confidence lift n[1] {Class=2nd,Age=Child} => {Survived=Yes} 0.01090413 1.0000000 3.095640n[2] {Class=2nd,Sex=Female} => {Survived=Yes} 0.04225352 0.8773585 2.715986n[3] {Class=2nd,Sex=Male} => {Survived=No} 0.06996820 0.8603352 1.270871n[4] {Class=1st,Sex=Female} => {Survived=Yes} 0.06406179 0.9724138 3.010243n[5] {Class=3rd,Sex=Male} => {Survived=No} 0.19173103 0.8274510 1.222295n
最後對模型結果進行解釋,可以發現,優先離開泰坦尼克號的人群主要以頭等艙和二等艙的婦女和兒童為主,這部分人群最終得以生還。
據統計,頭等艙男乘客的生還率比三等艙中兒童的生還率還稍高一點。美國新澤西州州立大學教授、著名社會學家戴維·波普諾研究後毫不客氣地修改了曾使英國人頗感「安慰」的「婦女和兒童優先社會規範」:在泰坦尼克號上實踐的社會規範這樣表述可能更準確一些——頭等艙和二等艙的婦女和兒童優先。
三、Apriori模型的可視化
# 導入所用包n> library(arulesViz)n
# 首先查看9條規則的基本情況n# plotly_arules為arulesViz包內的函數,基於plotly實現動態圖繪製n> plotly_arules(apriori_rules_subset)n
# 可視化頻繁項集n> plot(x=apriori_rules_subset,method = graph)n
# 可視化簡單關聯規則n# grouped表示以類似氣泡圖的形式展示關聯規則n> plot(x=apriori_rules_subset,method = grouped)n
圖中橫坐標為規則前項(LHS)的簡化表示,其中+1表示增加一個項目的超集(除此之外還有+0:表示自身;-1:表示減少一個項目的子集)。縱坐標為為規則後項(RHS)。
和上圖一樣,圓圈大小代表支持度大小,顏色深淺代表提升度高低,例如Class =1st + 1 items (即Class=1st,Sex=Female)的支持度較低(總體而言),而提升度較高。
# 繪製paracoord平行圖n> plot(x=apriori_rules_subset,method = paracoord)n
paracoord圖通過由左至右的箭頭折線表示關聯規則的前項和後項,通過這些折線構造出具體的關聯規則,其中折線粗細表示規則支持度大小,顏色深淺表示提升度的高低。例如,{Class = 3rd,Sex = Male}的提升度和支持度都是非常高的。
References:
- 數據挖掘:概念與技術 (豆瓣)
- R語言數據挖掘(豆瓣)
- 基於R語言的關聯規則實現
- 數據挖掘十大演算法--Apriori演算法 - 小硒 - 博客頻道 - CSDN.NET
- 關聯規則:R與SAS的比較 | 統計之都
- R語言關聯規則可視化:擴展包arulesViz的介紹 | 數據分析
- R語言與數據挖掘:最佳實踐和經典案例 (豆瓣)
推薦閱讀:
※如何用R語言計算形態坐標矩陣的質心距離?
※【詐屍譯文】R 3.4.0的性能提升
※[譯] 解密 Airbnb 的數據科學部門如何構建知識倉庫
※僅用四行代碼就可以挖掘你的QQ聊天記錄