R1(下)—數據挖掘—關聯規則理論介紹與R實現

Apriori algorithm是關聯規則裏一項基本算法。是由Rakesh Agrawal和Ramakrishnan Srikant兩位博士在1994年提出的關聯規則挖掘算法。關聯規則的目的就是在一個數據集中找出項與項之間的關係,也被稱爲購物藍分析 (Market Basket analysis),由於"購物藍分析"很貼切的表達了適用該算法情景中的一個子集。 git

關於這個算法有一個很是有名的故事:"尿布和啤酒"。故事是這樣的:美國的婦女們常常會囑咐她們的丈夫下班後爲孩子買尿布,而丈夫在買完尿布後又要順 手買回本身愛喝的啤酒,所以啤酒和尿布在一塊兒被購買的機會不少。這個舉措使尿布和啤酒的銷量雙雙增長,並一直爲衆商家所津津樂道。 web

  • 圖解

        

  • 關聯規則概念介紹

資料庫(Transaction Database):存儲着二維結構的記錄集。定義爲:D 算法

全部項集(Items):全部項目的集合。定義爲:I。 數據庫

記錄 (Transaction ):在資料庫裏的一筆記錄。定義爲:T,T ∈ D api

項集(Itemset):同時出現的項的集合。定義爲:k-itemset(k項集),k-itemset ? T。除非特別說明,不然下文出現的k均表示項數。 網絡

支持度(Support):定 義爲 supp(X) = occur(X) / count(D) = P(X)。 session

1. 解釋一:好比選秀比賽,那個支持和這個有點相似,那麼多人(資料庫),其中有多少人是選擇(支持)你的,那個就是支持度; 數據結構

2. 解釋二:在100我的去超市買東西的,其中買蘋果的有9我的,那就是說蘋果在這裏的支持度是 9,9/100; app

3. 解釋三:P(X),意思是事件X出現的機率; less

4. 解釋四:關聯規則當中是有絕對支持度(個數)和相對支持度(百分比)之分的。

置信度(Confidence/Strength): 定義爲 conf(X->Y) = supp(X ∪ Y) / supp(X) = P(Y|X)。

候選 集(Candidate itemset):經過向下合併得出的項集。定義爲C[k]。

頻繁集(Frequent itemset):支持度大於等於特定的最小支持度(Minimum Support/minsup)的項集。表示爲L[k]。注意,頻繁集的子集必定是頻繁集。

提高比率(提高度Lift):lift(X -> Y) = lift(Y -> X) = conf(X -> Y)/supp(Y) = conf(Y -> X)/supp(X) = P(X and Y)/(P(X)P(Y))

通過關聯規則分析後,針對某些人推銷(根據某規則)比盲目推銷(通常來講是整個數據)的比率,這個比率越高越好,咱們稱這個規則爲強規則;

剪枝步

只有當子集都是頻繁集的候選集纔是頻繁集,這個篩選的過程就是剪枝步;

• More information about the concepts of arules!

一、項集(Itemset):是一組項,而每個項都是一個屬性值。在購物籃分析示例中,項集包含一組產品,例如Cake、Pepsi、Milk。在研究客戶的人口統計信息示例中,項集包含一組屬性值,好比{Gender='Male',Education='Bachelor'}。每一個項集都有一個大小,該大小表示項集中包含的項的數目。項集{Cake、Pepsi、Milk}的大小是3。

頻繁項集是在數據集中出現頻率至關高的那些項集。項集出現頻率的閾值是用"支持度"來定義的。

二、支持度(Support):支持度用來度量一個項集的出現頻率。項集{A,B}的支持度是同時包含A和B的事務的總個數。即:

Support({A,B})=NumberofTransactions(A,B)

Minimum_Support是一個閾值參數,必須在處理關聯模型以前指定該參數。該參數表示用戶只對某些項集和規則感興趣,這些規則表示數據集的最低支持度。它是用於對項集進行限制,而不是對規則進行限制。

三、機率(Probability):也叫置信度(Confidence),是關聯規則的屬性。規則A=>B要機率是使用{A}的支持度除項集{A,B}的支持度來計算的。公式以下:

Probability(A=>B)=Probability(B|A)=Support(A,B)/Support(A)

也等於NumberofTransactions(A,B)/TotalNumberofTransactions

Minimum_Probability是一個閾值參數,必須在運行算法以前指定該參數.它表用戶只對某些規則感興趣,這些規則搖擁有比較高的機率,而不是最小的機率.Minimum_Probability對項集沒有任何影響,它影響的是規則.

三、重要性(Importance):在一些文獻中也稱爲興趣度分數或者增益。重要性能夠用於度量項集和規則。

項集的重要性是使用如下公式來定義的:

若是Importance=1,剛A和B是獨立的項,它表示購買A和購買B是兩個獨立的事件。若是Importance<1,剛A和B是負相關的,這表求若是一個客戶購買A了,剛他購買B是不太可能發生的。若是Importance>1,剛A和B是正相關的。這表示若是一個客戶購買了A,剛他也可能購買B。

規則的重要性是使用如下公式計算的:

Importance(A=>B)=Log(P(B|A)/P(B|not A))

重要性爲0,表示A和B之間沒有任何關聯。正的重要性分數表示當A爲真時,B的機率會上升。負的重要性分數表示,當A爲真時,B的機率會降低。

  • 簡單例子

  • R實現

 

綱要(Outline)

介紹(Introduction)

關聯規則挖掘(Association Rule Mining)

去除冗餘(Removing Redundancy)

關聯規則解讀(Interpreting Rules)

關聯規則可視化(Visualizing Association Rules)

補充閱讀和在線資源(Further Reading and Online Resources)

 

介紹

一句話關聯規則:關聯規則是展示項集(itemsets)間關聯(association)與相關性(correlation)的規則!

幾個重要公式

P(A)是包含A項的case(這裏的cases即爲數據庫中的transaction每筆交易記錄)百分比或機率!

R中的關聯規則挖掘算法:APRIORI和ECLAT算法

APRIORI是一種計算交易記錄(transaction)來發現頻繁項集,而後從這些頻繁項集中導出(derive)關聯規則的逐層(level-wise)、寬度優先(breadth-first)算法、也是最有影響的挖掘布爾關聯規則頻繁項集的算法。其核心是基於兩階段頻集思想的遞推算法!

Apriori()算法在arules包中已實現!

ECLAT算法的特色是發現具備等價類的頻繁項集(equivalence class),深度優先搜索,集合相交(set intersection)而不是計數(counting)

Eclat()算法也在arules包中!

關聯規則挖掘

泰坦尼克號數據集(The Titanic Dataset):

在數據集包中的泰坦尼克號數據集是一個四維表,它根據社會地位(social class)、性別、年齡、和是否倖存(survival)彙總了在泰坦尼克號上的乘客命運的信息!

爲了使得該數據集適用於關聯規則挖掘,咱們對原始數據進行了一下簡答的重構,命名爲Titanic.raw,其中每一行表明一我的!重構後的數據集能夠在http://www.rdatamining.com/data/titanic.raw.rdata 進行下載!

Step1:加載數據集查看統計描述信息

> library(arules)

> path.package(package = 'arules')

[1] "C:/Users/wb-tangyang.b/Documents/R/win-library/3.1/arules" #查看arules包所在路徑

> load(file = 'E:/文檔/2015/校外/tangyang/學習/R筆記/1-數據分析與挖掘/數據挖掘算法-R運用/01-關聯規則(市場籃子分析!)/datasets/titanic.raw.rdata') #這個數據集是經過上面上面那個連接先下載下來,而後在這兒進行加載,導入到R中!

> idx<-sample(1:nrow(titanic.raw),5)

> titanic.raw[idx,]

Class Sex Age Survived

1699 Crew Male Adult Yes

1977 1st Female Adult Yes

2200 Crew Female Adult Yes

1457 3rd Female Adult No

2170 3rd Female Adult Yes

> summary(titanic.raw)

Class Sex Age Survived

1st :325 Female: 470 Adult:2092 No :1490

2nd :285 Male :1731 Child: 109 Yes: 711

3rd :706

Crew:885

Step2:apriori()函數

使用Aprior算法挖掘頻繁項集,關聯規則或者關聯超邊(hyperedge),Aprior算法運用逐層(level-wise)方法搜索頻繁項集。

其關於支持度、置信度、最大規則長度的默認設置以下:

  • minimum support: supp=0.1
  • minimum condence: conf=0.8
  • maximum length of rules: maxlen=10

 

#####用法說明

apriori(data, parameter = NULL, appearance = NULL, control = NULL)

#####參數說明

Data:交易數據(transactions)類對象或任何可以被轉化成transaction的數據結構

Parameter:APparameter類對象或命名列表。挖掘規則默認的行爲是:支持度=0.1;置信度=0.8;輸出的最大規則長度;

Appearance:APappearance類對象或命名列表。

Control:APcontrol類對象或命名列表。控制挖掘算法的性能!

####細節說明

APparameter中minlen(最小規則數)默認的值是1,這意味着將會產生只有一項(item:好比,先前項/LHS)的規則:{}=>{beer}—這項規則說明,no matter what other items are involved the item in the RHS will appear with the probability given by the rule's confidence (which equals the support)。若是想要避免這些規則,可使用參數:parameter=list(minlen=2)!

####返回值說明:返回一個rules類對象或itemsets類對象。

 

step3:運用apriori函數進行關聯規則分析

1)關聯規則—默認參數

> rules.all<-apriori(titanic.raw)

> inspect(rules.all)

<注> lhs=left hand side;rhs=right hand side.

2)關聯規則—調整參數

#若是隻想檢查其它變量和乘客是否倖存的關係,那麼須要提早設置變量rhs=c("Survived=No", "Survived=Yes")

######rules with rhs containing "Survived" only!

rules <- apriori(titanic.raw,

control = list(verbose=F),

parameter = list(minlen=2, supp=0.005, conf=0.8),

appearance = list(rhs=c("Survived=No","Survived=Yes"),

#如今生成的關聯規則結果只包含("Survived=No", "Survived=Yes")

default="lhs"))

@結果

> rules

set of 12 rules

> quality(rules)

support confidence lift

1 0.010904134 1.0000000 3.095640

2 0.042253521 0.8773585 2.715986

3 0.069968196 0.8603352 1.270871

4 0.064061790 0.9724138 3.010243

5 0.009086779 0.8695652 2.691861

6 0.191731031 0.8274510 1.222295

7 0.005906406 1.0000000 3.095640

8 0.036347115 0.8602151 2.662916

9 0.069968196 0.9166667 1.354083

10 0.063607451 0.9722222 3.009650

11 0.009086779 0.8695652 2.691861

12 0.175829169 0.8376623 1.237379

######keep three decimal places

> quality(rules) <- round(quality(rules), digits=3)

> quality(rules)

support confidence lift

1 0.011 1.000 3.096

2 0.042 0.877 2.716

3 0.070 0.860 1.271

4 0.064 0.972 3.010

5 0.009 0.870 2.692

6 0.192 0.827 1.222

7 0.006 1.000 3.096

8 0.036 0.860 2.663

9 0.070 0.917 1.354

10 0.064 0.972 3.010

11 0.009 0.870 2.692

12 0.176 0.838 1.237

####order rules by lift(根據關聯結果中的提高度(life)進行降序排序)

> rules.sorted <- sort(rules, by="lift")

####檢查排序後的變量

> inspect(rules.sorted)

去除冗餘(Removing Redundancy)

> inspect(rules.sorted[1:2])

規則#2未能在規則#1之上提供更多的信息,由於規則#1已經告訴咱們:全部的2nd-class children都倖存啦!也就是說實際上規則2只是規則1的超集!!!

請記住去除冗餘的一項規則:當一個規則(好比:規則#2)是另外一個規則(好比#1)的父規則。前者有相同或更低的lift(提高度),前面的規則(規則#2)就被認爲是冗餘(redundant)的,即留下子規則child rules!

因而可知,上述其餘冗餘規則還有是#四、#7和#8,與只對應的是規則#三、#六、#5!

#####發現冗餘規則!

插播—函數介紹:

  1. Is.subset(x,y=NULL, proper=FALSE, sparse=FALSE,...) #is.subset和is.superset函數用於在關聯和項集矩陣對象中發現子集或父集!
  2. Lower.tri(x,diag=FALSE) #返回一個與給定矩陣(在上三角或下三角中TRUE)相同大小的邏輯矩陣

   

#####哪個規則是冗餘的?

#####生成一個關聯規則的子集矩陣

> subset.matrix <- is.subset(rules.sorted, rules.sorted)

> subset.matrix#####註釋:從結果中能夠看到矩陣中對角線上的位置的TRUE表示12個規則,而其它行位置上TRUE則表示行座標值表明的規則是縱座標值表明的規則的子集。例如[2,1],[2,5]上面的TRUE,就表示規則2是規則1和規則5的子集。這個從上面的排序後的規則列表中就能夠看出啦!

####將矩陣對角線如下的元素置爲空,這樣只包含TRUE的元素列就是子規則,須要去除

> lower.tri(subset.matrix, diag = T)

> subset.matrix[lower.tri(subset.matrix, diag = T)] <- NA

> subset.matrix

####將子集矩陣中每列元素和大於等於1的列找出來

> redundant <- colSums(subset.matrix, na.rm = T) >= 1

> redundant

[1] FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE

#####移除冗餘規則!

> which(redundant)

[1] 2 4 7 8

#####從規則矩陣中去掉這些列

> rules.pruned <- rules.sorted[! redundant]

## remove redundant rules

> rules.pruned

set of 8 rules

###Remaining Rules

#####檢查最終生成的結果集

> inspect(rules.pruned)

關聯規則解讀(Interpreting Rules)、

> inspect(rules.pruned[1])

這條規則告訴了咱們什麼呢?難道2nd class(二等艙)的孩子比其餘孩子的倖存率更高??!

須要注意的是:這條規則僅僅講述了全部二等艙的孩子都倖存了下來,並無其餘艙位倖存率的比較信息!

#######進一步優化(Rules about Children)

rules <- apriori(titanic.raw, control = list(verbose=F),

parameter = list(minlen=3, supp=0.002, conf=0.2),

appearance = list(default="none", rhs=c("Survived=Yes"),

lhs=c("Class=1st", "Class=2nd", "Class=3rd",

"Age=Child", "Age=Adult")))

> rules

set of 6 rules

> rules.sorted <- sort(rules, by="confidence")

> inspect(rules.sorted)

關聯規則可視化(Visualizing Association Rules):使用arulesViz包

#####加載包arulesViz, 畫出關聯規則的圖形表示方法

> plot(rules)

> plot(rules.pruned)

> plot(rules.pruned, method = "grouped")

          

> plot(rules.pruned, method = "graph")

   

> plot(rules.pruned, method = "graph", control = list(type = "items"))

 

> plot(rules.pruned, method = "paracoord", control = list(reorder = TRUE))

補充閱讀和在線資源(Further Reading and Online Resources)

####further readings

I More than 20 interestingness measures, such as chi-square,

conviction, gini and leverage

Tan, P.-N., Kumar, V., and Srivastava, J. (2002). Selecting the right

interestingness measure for asso ciation patterns. In Pro c. of KDD '02,

pages 32-41, New York, NY, USA. ACM Press.

I Post mining of association rules, such as selecting interesting

association rules, visualization of association rules and using

association rules for classification

Yanchang Zhao, Chengqi Zhang and Longbing Cao (Eds.). "Post-Mining

of Asso ciation Rules: Techniques for Effective Knowledge Extraction",

ISBN 978-1-60566-404-0, May 2009. Information Science Reference.

I Package arulesSequences: mining sequential patterns

http://cran.r- project.org/web/packages/arulesSequences

####online resources

I Chapter 9: Association Rules, in book

R and Data Mining: Examples and Case Studies

http://www.rdatamining.com/docs/RDataMining.pdf

I R Reference Card for Data Mining

http://www.rdatamining.com/docs/R- refcard- data- mining.pdf

I Free online courses and documents

http://www.rdatamining.com/resources/

I RDataMining Group on LinkedIn (8,000+ members)

http://group.rdatamining.com

I RDataMining on Twitter (1,800+ followers)

@RDataMining

   

附錄 1

數據挖掘是指以某種方式分析數據源,從中發現一些潛在的有用的信息,因此數據挖掘又稱做知識發現,而關聯規則挖掘則是數據挖掘中的一個很重要的課題,顧名思義,它是從數據背後發現事物之間可能存在的關聯或者聯繫。舉個最簡單的例子,好比經過調查商場裏顧客買的東西發現,30%的顧客會同時購買牀單和枕套,而購買牀單的人中有80%購買了枕套,這裏面就隱藏了一條關聯:牀單—>枕套,也就是說很大一部分顧客會同時購買牀單和枕套,那麼對於商場來講,能夠把牀單和枕套放在同一個購物區,那樣就方便顧客進行購物了。下面來討論一下關聯規則中的一些重要概念以及如何從數據中挖掘出關聯規則。

關聯規則挖掘中的幾個概念

先看一個簡單的例子,假若有下面數據集,每一組數據ti表示不一樣的顧客一次在商場購買的商品的集合:

t1: 牛肉、雞肉、牛奶

t2: 牛肉、奶酪

t3: 奶酪、靴子

t4: 牛肉、雞肉、奶酪

t5: 牛肉、雞肉、衣服、奶酪、牛奶

t6: 雞肉、衣服、牛奶

t7: 雞肉、牛奶、衣服

 假若有一條規則:牛肉—>雞肉,那麼同時購買牛肉和雞肉的顧客比例是3/7,而購買牛肉的顧客當中也購買了雞肉的顧客比例是3/4。這兩個比例參數是很重要的衡量指標,它們在關聯規則中稱做支持度(support)和置信度(confidence)。對於規則:牛肉—>雞肉,它的支持度爲3/7,表示在全部顧客當中有3/7同時購買牛肉和雞肉,其反應了同時購買牛肉和雞肉的顧客在全部顧客當中的覆蓋範圍;它的置信度爲3/4,表示在買了牛肉的顧客當中有3/4的人買了雞肉,其反應了可預測的程度,即顧客買了牛肉的話有多大可能性買雞肉。其實能夠從統計學和集合的角度去看這個問題, 假如看做是機率問題,則能夠把"顧客買了牛肉以後又多大可能性買雞肉"看做是條件機率事件,而從集合的角度去看,能夠看下面這幅圖:

上面這副圖能夠很好地描述這個問題,S表示全部的顧客,而A表示買了牛肉的顧客,B表示買了雞肉的顧客,C表示既買了牛肉又買了雞肉的顧客。那麼C.count/S.count=3/7,C.count/A.count=3/4。

  在數據挖掘中,例如上述例子中的全部商品集合I={牛肉,雞肉,牛奶,奶酪,靴子,衣服}稱做項目集合,每位顧客一次購買的商品集合ti稱爲一個事務,全部的事務T={t1,t2,....t7}稱做事務集合,而且知足ti是I的真子集。一條關聯規則是形以下面的蘊含式:

  X—>Y,X,Y知足:X,Y是I的真子集,而且X和Y的交集爲空集

  其中X稱爲前件,Y稱爲後件。

  對於規則X—>Y,根據上面的例子能夠知道它的支持度(support)=(X,Y).count/T.count,置信度(confidence)=(X,Y).count/X.count 。其中(X,Y).count表示T中同時包含X和Y的事務的個數,X.count表示T中包含X的事務的個數。

  關聯規則挖掘則是從事務集合中挖掘出知足支持度和置信度最低閾值要求的全部關聯規則,這樣的關聯規則也稱強關聯規則。

  對於支持度和置信度,咱們須要正確地去看待這兩個衡量指標。一條規則的支持度表示這條規則的可能性大小,若是一個規則的支持度很小,則代表它在事務集合中覆蓋範圍很小,頗有多是偶然發生的;若是置信度很低,則代表很難根據X推出Y。根據條件機率公式P(Y|X)=P(X,Y)/P(X),即P(X,Y)=P(Y|X)*P(X)

  P(Y|X)表明着置信度,P(X,Y)表明着支持度,因此對於任何一條關聯規則置信度老是大於等於支持度的。而且當支持度很高時,此時的置信度確定很高,它所表達的意義就不是那麼有用了。這裏要注意的是支持度和置信度只是兩個參考值而已,並非絕對的,也就是說假如一條關聯規則的支持度和置信度很高時,不表明這個規則之間就必定存在某種關聯。舉個最簡單的例子,假如X和Y是最近的兩個比較熱門的商品,你們去商場都要買,好比某款手機和某款衣服,都是最新款的,深受你們的喜好,那麼這條關聯規則的支持度和置信度都很高,可是它們之間沒有必然的聯繫。然而當置信度很高時,支持度仍然具備參考價值,由於當P(Y|X)很高時,可能P(X)很低,此時P(X,Y)也許會很低。

END

關聯規則挖掘的原理和過程

從上面的分析可知,關聯規則挖掘是從事務集合中挖掘出這樣的關聯規則:它的支持度和置信度大於最低閾值(minsup,minconf),這個閾值是由用戶指定的。根據支持度=(X,Y).count/T.count,置信度=(X,Y).count/X.count  ,要想找出知足條件的關聯規則,首先必須找出這樣的集合F=X U Y ,它知足F.count/T.count ≥ minsup,其中F.count是T中包含F的事務的個數,而後再從F中找出這樣的蘊含式X—>Y,它知足(X,Y).count/X.count ≥ minconf,而且X=F-Y。咱們稱像F這樣的集合稱爲頻繁項目集,假如F中的元素個數爲k,咱們稱這樣的頻繁項目集爲k-頻繁項目集,它是項目集合I的子集。因此關聯規則挖掘能夠大體分爲兩步:

  1)從事務集合中找出頻繁項目集;

  2)從頻繁項目集合中生成知足最低置信度的關聯規則。

   最出名的關聯規則挖掘算法是Apriori算法,它主要利用了向下封閉屬性:若是一個項集是頻繁項目集,那麼它的非空子集一定是頻繁項目集。它先生成1-頻繁項目集,再利用1-頻繁項目集生成2-頻繁項目集。。。而後根據2-頻繁項目集生成3-頻繁項目集。。。依次類推,直至生成全部的頻繁項目集,而後從頻繁項目集中找出符合條件的關聯規則。

   

 附錄 2:Introduction to arules

  • 數據結構概述

在arules(http://CRAN.R-Project.org)包中,對於輸入數據集:能夠是transactions類和tidLists類(交易事物表ID列表,是表示交易事物數據的另外一種方式!) ;對於挖掘算法的輸出:有itemsets類和rules類,分別表明項集合規則的集合。arules包中實施的S4類結構以下:

   

itemsets類和rules類是對提供了一個通用接口的通用虛擬類associations的擴展。在這個結構中,很容易經過添加一個擴展associations接口的新類來添加一種新的關聯類型!

associations和transactions中的項(iterms)是經過itemMatrix類來實現的。ASparameter和 AScontrol兩個類是用來控制挖掘算法行爲的。由於每個算法均可以使用其餘特定算法的參數,咱們爲每個接口算法實現了各自的控制類集。這裏使用前綴"AP"來表示Apriori算法,"EC"表示Eclat算法!

#####表示項集集合(represent collection of itemsets)

事物數據庫中的一條交易記錄包括了一個交易ID,一個項集.挖掘到的關聯規則集中,一條規則包括兩個項集,一個是LHS(left hand side),一個是RHS(right hand side),以及其餘優質信息(quality information),好比各類相關度量(interest measures)的值!

交易數據庫使用的項集集合和關聯集能夠被表示成二元關聯矩陣(binary incidence matrices),列對應項(items),行對應項集(itemsets)。矩陣元素/條目(entries)表示在一個特定的項集中某一項的有無(presence (1) or absence(0))

例如:將圖1中的交易數據庫表示成圖3中的包含項集的二元關聯矩陣,以下!

   

 

 對於這類數據的天然表示是用一個稀疏矩陣格式。對於代碼實現,咱們選擇了定義在Matrix包中的ngCMatrix類。

將上述稀疏矩陣的數據變成以下List格式的數據,

  • 更多的例子(一大波例子來襲)

#####例子1:分析和準備一個交易數據集

該例主要說明在進行關聯挖掘以前,如何分析和處理(manipulate)一個數據集。這對於發現可能會影響後續關聯規則質量的問題很是重要!例如,這裏使用arules包中的Epub交易數據,該數據集包括了從Vienna University of Economics and Business的Elaectronic Publication平臺上的2003年1月到2008年12月的文件下載量!(http://epub.wu-wien.ac.at )

先加載arules包和Epub數據集

> library("arules")

> data(Epub)

> Epub

transactions in sparse format with

15729 transactions (rows) and

936 items (columns)

能夠看到,Epub數據集包括了15729條交易記錄,並用一個15729行和表明項的936列的稀疏矩陣表示!下一步,使用summary()函數來獲取更多信息.

> summary(Epub)

Summary顯示了數據集中最頻繁項(most frequent items),交易記錄長度分佈的信息以及包含了一些擴展交易信息的數據集!下一步,咱們使用POSIXct類來查看包含了交易IDs和時間戳的數據集,這些額外的信息能夠用於分析數據集。

> year <- strftime(as.POSIXlt(transactionInfo(Epub)[["TimeStamp"]]), "%Y") #strftime進行日期和字符轉化!

> table(year)

year

2003 2004 2005 2006 2007 2008 2009

986 1376 1610 3010 4052 4692 3

對於2003年,數據集中的第一年,總共有987比交易(即下載記錄).下一步,選擇相應的交易記錄,使用level-plot來查看(inspect)其結構!

注:Epub數據集的格式以下

>transactionInfo(Epub)

> Epub2003 <- Epub[year == "2003"]

> length(Epub2003)

[1] 986

> image(Epub2003)

這幅圖是二元關聯矩陣的一個直接可視化,其中黑色的點(dark dots)表明對應矩陣中的值。從這幅圖中,可知:數據集中的項分佈不均勻(not evenly distributed).事實上,圖中右邊最空白的區域暗示,在2003年初,僅僅有少許的項可用(少於50)。在這一年間,更多的項被添加進來,最終到了300項左右的數量。一樣,還可知:數據集中的有一些交易記錄中,包含了很是高的項數(number of items)【密度較大的水平線】,這些交易記錄須要進一步檢查,由於他們多是因爲數據收集時產生的問題而引發(例如,一個網絡機器人,從pub網站上下載了不少文檔!!!)。下一步,使用size函數來選擇很是長的交易記錄,並從中選擇很是長的交易記錄(包括了超過20項!)

> transactionInfo(Epub2003[size(Epub2003) > 20])

transactionID TimeStamp

11092 session_56e2 2003-04-30 01:30:38

11371 session_6308 2003-08-18 06:16:12

咱們發現了兩個長交易記錄(即這條交易記錄包括了不少項),並打印出了響應的交易信息。固然,size()還能夠用於移除長或短的交易記錄!下一步,使用inspect()函數檢查交易記錄。由於上面識別出來的長交易記錄將會導入很是長的輸入,所以,咱們來僅看2003年的前五個交易!

> inspect(Epub2003[1:5])

items transactionID TimeStamp

1 {doc_154} session_4795 2003-01-02 09:59:00

2 {doc_3d6} session_4797 2003-01-02 20:46:01

3 {doc_16f} session_479a 2003-01-02 23:50:38

4 {doc_11d,

doc_1a7,

doc_f4} session_47b7 2003-01-03 07:55:50

5 {doc_83} session_47bb 2003-01-03 10:27:44

大多數的交易記錄只包含一項,只有交易4包含了3項。進一步查看(以列表的方式)

> as(Epub2003[1:5], "list")

$session_4795

[1] "doc_154"

$session_4797

[1] "doc_3d6"

$session_479a

[1] "doc_16f"

$session_47b7

[1] "doc_11d" "doc_1a7" "doc_f4"

$session_47bb

[1] "doc_83"

最後,使用coercion,水平佈局的交易數據能夠被轉化成垂直佈局的交易ID列表

> EpubTidLists <- as(Epub, "tidLists")

> EpubTidLists

tidLists in sparse format with

936 items/itemsets (rows) and

15729 transactions (columns)

處於性能的緣由,交易ID列表也能夠被存儲在一個稀疏矩陣中。以下:

$doc_11d

[1] "session_47b7" "session_47c2" "session_47d8"

[4] "session_4855" "session_488d" "session_4898"

[7] "session_489b" "session_489c" "session_48a1"

[10] "session_4897" "session_48a0" "session_489d"

[13] "session_48a5" "session_489a" "session_4896"

[16] "session_48aa" "session_48d0" "session_49de"

[19] "session_4b35" "session_4bac" "session_4c54"

[22] "session_4c9a" "session_4d8c" "session_4de5"

[25] "session_4e89" "session_5071" "session_5134"

[28] "session_51e6" "session_5227" "session_522a"

[31] "session_5265" "session_52e0" "session_52ea"

[34] "session_53e1" "session_5522" "session_558a"

[37] "session_558b" "session_5714" "session_5739"

[40] "session_57c5" "session_5813" "session_5861"

[43] "session_wu48452" "session_5955" "session_595a"

[46] "session_5aaa" "session_5acd" "session_5b5f"

[49] "session_5bfc" "session_5f3d" "session_5f42"

[52] "session_5f69" "session_5fcf" "session_6044"

[55] "session_6053" "session_6081" "session_61b5"

[58] "session_635b" "session_64b4" "session_64e4"

[61] "session_65d2" "session_67d1" "session_6824"

[64] "session_68c4" "session_68f8" "session_6b2c"

[67] "session_6c95" "session_6e19" "session_6eab"

[70] "session_6ff8" "session_718e" "session_71c1"

[73] "session_72d6" "session_7303" "session_73d0"

[76] "session_782d" "session_7856" "session_7864"

[79] "session_7a9b" "session_7b24" "session_7bf9"

[82] "session_7cf2" "session_7d5d" "session_7dae"

[85] "session_819b" "session_8329" "session_834d"

[88] "session_84d7" "session_85b0" "session_861b"

[91] "session_867f" "session_8688" "session_86bb"

[94] "session_86ee" "session_8730" "session_8764"

[97] "session_87a9" "session_880a" "session_8853"

[100] "session_88b0" "session_8986" "session_8a08"

[103] "session_8a73" "session_8a87" "session_8aad"

[106] "session_8ae2" "session_8db4" "session_8e1f"

[109] "session_wu53a42" "session_8fad" "session_8fd3"

[112] "session_9083" "session_90d8" "session_9128"

[115] "session_9145" "session_916e" "session_9170"

[118] "session_919e" "session_91df" "session_9226"

[121] "session_9333" "session_9376" "session_937e"

[124] "session_94d5" "session_9539" "session_9678"

[127] "session_96a0" "session_9745" "session_97b3"

[130] "session_985b" "session_9873" "session_9881"

[133] "session_9994" "session_9a20" "session_9a2f"

[136] "session_wu54edf" "session_9af9" "session_9b69"

[139] "session_9ba4" "session_9c27" "session_9c99"

[142] "session_9ce8" "session_9de3" "session_9e8a"

[145] "session_9ebc" "session_a051" "session_a16e"

[148] "session_a19f" "session_a229" "session_a24a"

[151] "session_a328" "session_a340" "session_a3ab"

[154] "session_a3ee" "session_a43a" "session_a4b2"

[157] "session_a515" "session_a528" "session_a555"

[160] "session_a5bb" "session_a62d" "session_a77a"

[163] "session_ab9c" "session_abe9" "session_ac0e"

[166] "session_ad30" "session_adc9" "session_af06"

[169] "session_af4a" "session_af8d" "session_b0b7"

[172] "session_b391" "session_b6d3" "session_b807"

[175] "session_b8c7" "session_b91f" "session_bb0b"

[178] "session_bb8a" "session_bc3d" "session_bc40"

[181] "session_bceb" "session_bea7" "session_bf9f"

[184] "session_c359" "session_c3c2" "session_c442"

[187] "session_c62d" "session_c6ba" "session_c936"

[190] "session_ca81" "session_cad3" "session_cbd4"

[193] "session_cbe1" "session_cd63" "session_d14f"

[196] "session_d370" "session_d69f" "session_d815"

[199] "session_d82e" "session_d849" "session_d8b5"

[202] "session_da68" "session_db51" "session_db75"

[205] "session_dbcd" "session_dde2" "session_deac"

[208] "session_dfb7" "session_dfe9" "session_e00a"

[211] "session_e2ad" "session_e3c7" "session_e7d2"

[214] "session_e7e5" "session_e7f2" "session_ea38"

[217] "session_edbc" "session_edf9" "session_edfc"

[220] "session_f0be" "session_f2d9" "session_f2fe"

[223] "session_f39b" "session_f5e9" "session_f650"

[226] "session_f853" "session_f989" "session_fab1"

[229] "session_fcef" "session_fd0e" "session_fe49"

[232] "session_fe4f" "session_ffa0" "session_10057"

[235] "session_1019a" "session_1028a" "session_10499"

[238] "session_10513" "session_105e3" "session_10b03"

[241] "session_10b53" "session_10c0c" "session_10cb2"

[244] "session_10e4d" "session_10e67" "session_10e92"

[247] "session_10fbd" "session_10fcc" "session_114f1"

[250] "session_116fb" "session_11822" "session_1185e"

[253] "session_118d0" "session_11b0d" "session_12182"

[256] "session_121af" "session_121ee" "session_12405"

[259] "session_126db" "session_12825" "session_12896"

[262] "session_12a0b" "session_12c7c" "session_12e21"

[265] "session_1346d" "session_13622" "session_13886"

[268] "session_13d33" "session_140bd" "session_14428"

[271] "session_14b8a" "session_14e58" "session_14fdc"

[274] "session_1517f" "session_151b2" "session_15549"

[277] "session_155a9" "session_1571b" "session_15b18"

[280] "session_15b99" "session_15d2c" "session_15e0c"

[283] "session_15f75" "session_15fbf" "session_16621"

[286] "session_16691" "session_16f0d" "session_17027"

[289] "session_173fe" "session_17eaf" "session_17ecd"

[292] "session_180dd" "session_18641" "session_187ae"

[295] "session_18a0b" "session_18b18" "session_18db4"

[298] "session_19048" "session_19051" "session_19510"

[301] "session_19788" "session_197ee" "session_19c04"

[304] "session_19c7a" "session_19f0c" "session_1a557"

[307] "session_1ac3c" "session_1b733" "session_1b76a"

[310] "session_1b76b" "session_1ba83" "session_1c0a6"

[313] "session_1c11c" "session_1c304" "session_1c4c3"

[316] "session_1cea1" "session_1cfb9" "session_1db2a"

[319] "session_1db96" "session_1dbea" "session_1dc94"

[322] "session_1e361" "session_1e36e" "session_1e91e"

[325] "session_wu6bf8f" "session_1f3a8" "session_1f56c"

[328] "session_1f61e" "session_1f831" "session_1fced"

[331] "session_1fd39" "session_wu6c9e5" "session_20074"

[334] "session_2019f" "session_201a1" "session_209f9"

[337] "session_20e87" "session_2105b" "session_212a2"

[340] "session_2143b" "session_wu6decf" "session_218ca"

[343] "session_21bea" "session_21bfd" "session_223e1"

[346] "session_2248d" "session_22ae6" "session_2324d"

[349] "session_23636" "session_23912" "session_23a70"

[352] "session_23b0d" "session_23c17" "session_240ea"

[355] "session_24256" "session_24484"

 

$doc_13d

[1] "session_4809" "session_5dbc" "session_8e0b" "session_cf4b"

[5] "session_d92a" "session_102bb" "session_10e9f" "session_11344"

[9] "session_11ca4" "session_12dc9" "session_155b5" "session_1b563"

[13] "session_1c411" "session_1f384" "session_22e97"

 

$doc_14c

[1] "session_53fb" "session_564b" "session_5697" "session_56e2"

[5] "session_630b" "session_6e80" "session_6f7c" "session_7c8a"

[9] "session_8903" "session_890c" "session_89d2" "session_907e"

[13] "session_98b4" "session_c268" "session_c302" "session_cb86"

[17] "session_d70a" "session_d854" "session_e4c7" "session_f220"

[21] "session_fd57" "session_fe31" "session_10278" "session_115b0"

[25] "session_11baa" "session_11e26" "session_12185" "session_1414b"

[29] "session_14dba" "session_14e47" "session_15738" "session_15a38"

[33] "session_16305" "session_17b35" "session_19af2" "session_1d074"

[37] "session_1fcc4" "session_2272e" "session_23a3e"

在這個表達式中,每一項都有一個條目/元素(entry:即全部發生的交易記錄組成的一個向量)。TidLists能夠直接做爲挖掘算法的輸入(使用垂直數據庫佈局來挖掘關聯規則!)

在下一節中,將會介紹如何建立一個數據集,以及如何挖掘規則!

#######例子2:準備和挖掘已給調查問卷數據集

第二個例子使用來自UCI機器學習庫中的Adult數據集(arules包中有)。該數據集和市場籃子數據集相似,起源於美國人口普查數據庫,包含了14個屬性(年齡、工做類別、教育等)的48942個實例。該數據集以前是用這些屬性來預測我的的收入水平。咱們作了一些改變,將收入屬性(attribute)設置成兩個水平:small和large,分別表明收入小於50,000美圓和大於50,000美圓。

@ 加載數據集(AdultUCI)

> data("AdultUCI")

> dim(AdultUCI)

[1] 48842 15

> AdultUCI[1:2,]

AdultUCI包含了分類和指標屬性的混合,在進行關聯規則挖掘前,須要作一些準備工做。

@ 首先,移除兩個屬性:fnlwgt和education-num(一個表明體重,一個表明教育等級!)

> AdultUCI[["fnlwgt"]] <- NULL

> AdultUCI[["education-num"]] <- NULL

@ 而後,須要對剩下的四個度量屬性(metric attributesagehours-per-weekcapital-gaincapital-loss)經過創建合適的類別映射成順序屬性(ordinal attributes)!對於age和hours-per-week屬性,使用了通用的年齡範圍和工做時長劃分。對於兩個capital相關的屬性,使用None表明have no gains/loss的狀況(案例)。而後,繼續group with gains/losses劃分紅兩類Low和High!

> AdultUCI[[ "age"]] <- ordered(cut(AdultUCI[[ "age"]], c(15,25,45,65,100)),labels = c("Young", "Middle-aged", "Senior", "Old"))

> AdultUCI[[ "hours-per-week"]] <- ordered(cut(AdultUCI[[ "hours-per-week"]], c(0,25,40,60,168)),labels = c("Part-time", "Full-time", "Over-time", "Workaholic"))

> AdultUCI[[ "capital-gain"]] <- ordered(cut(AdultUCI[[ "capital-gain"]],c(-Inf,0,median(AdultUCI[[ "capital-gain"]][AdultUCI[[ "capital-gain"]]>0]),Inf)), labels = c("None", "Low", "High"))

> AdultUCI[[ "capital-loss"]] <- ordered(cut(AdultUCI[[ "capital-loss"]],c(-Inf,0,median(AdultUCI[[ "capital-loss"]][AdultUCI[[ "capital-loss"]]>0]),Inf)),

+ labels = c("none", "low", "high"))

@ 如今,如今這個數據就能夠經過將其強轉成transactions而被自動編碼成一個二元發生矩陣(也叫關聯矩陣:incidence matrix)!

> Adult <- as(AdultUCI, "transactions")

> Adult

transactions in sparse format with

48842 transactions (rows) and

115 items (columns)

剩下的115個分類屬性被自動編碼趁個15個二元項。項標籤以<變量名>=<類別標籤>的形式被生成!注:對於缺失值的cases(案例/行),對應該屬性的全部項都會被設置爲0

> summary(Adult)

這個結果的說明已在以前有全部描述,不記得的朋友請自行回顧!

@ 查看數據集中哪些項最重要,使用itemFrequencyPlot()函數,爲了減小項的數量,咱們只對支持度大於10%(使用參數support)的項回執項的頻率(item frequency)。調整標籤的大小,使用cex.names參數:

> itemFrequencyPlot(Adult, support = 0.1, cex.names=0.8)

Figure 6: Item frequencies of items in the Adult data set with support greater than 10%.

@ 如今,調用apriori函數發現全部規則(the default association type for apriori()) with a minimum support of 1% and a confidence of 0.6,這在前面也已經介紹啦哈!)

> rules <- apriori(Adult,parameter = list(support = 0.01, confidence = 0.6))

 

 

 

 

 

> rules

set of 276443 rules

簡要解讀一下這個結果:首先,輸出了算法使用的參數。除了指定的最小支持度和最小置信度(minimum support and minimum confidence),全部的參數都有默認值!注意maxlen參數,挖掘出的最大頻繁項集大小默認被限制爲5,而長規則(long association rules)只在maxLen被設置成一個更高的值才被挖掘出來!這是須要注意的!||||在參數設置以後,輸出的事算法控制和事件信息|||

@ 挖掘算法獲得的是一個276443條規則的集合。使用summary函數查看挖掘規則概覽.

> summary(rules)

能夠看到,輸出了規則的數量、包含在LHS和RHS中的最頻繁項以及他們各自的長度分佈、挖掘算法得出的優質度量(quality measures:這裏指的其實就是支持度、置信度、提高度三個指標)簡要統計信息!

@ 一般,獲得的關聯規則數量之巨大,爲了分析這些規則,可使用subset函數。例如:針對規則中右邊(LHS)中收入(income)變量的每一項(如高收入、低收入等)生成單獨的子規則。同時,要求提高度度量指標超過1.2

> rulesIncomeSmall <- subset(rules, subset = rhs %in% "income=small" & lift > 1.2)

> rulesIncomeLarge <- subset(rules, subset = rhs %in% "income=large" & lift > 1.2)

如今,咱們獲得了低收入人羣和高收入人羣的規則集合,做爲對比,咱們查看兩個集合中置信度最高的三個規則(使用sort()函數)

> inspect(head(sort(rulesIncomeSmall, by = "confidence"), n = 3))

inspect(head(sort(rulesIncomeLarge, by = "confidence"), n = 3))

From the rules we see that workers in the private sector working part-time or in the service industry tend to have a small income while persons with high capital gain who are born in the US tend to have a large income.

這個例子說明:使用subset函數和sort函數對規則進行選擇排序,即使是規則很大,也是能夠分析的!

@ 最後,挖掘到的規則能夠被寫入到磁盤,以便分享給其餘運用使用。使用write函數,將規則保存成文本格式。

> getwd()

[1] "D:/tangyang/documents/Data Analysis Examples"

> write(rulesIncomeSmall, file = "data.csv", sep = ",", col.names = NA)

# 將一組規則保存到文件名爲data.csv(以逗號分隔)的文件中!

@補充,另外,使用pmml包,能夠將一組規則以PMML(predictive modeling markup language)格式保存,一種基於XML的使用了諸多數據挖掘工具的標準化表達形式!須要注意的事pmml包的依賴包XML包可能不是對全部的操做系統均可用!!!

> write.PMML(rulesIncomeSmall, file = "data.xml")

保存的數據能夠輕鬆的被用來分享。一樣項集(itemsets)也能夠用write函數寫入一個文件!

######例子3:加入一個新的相關測度(Extending arules with a new interest measure)

這個例子中,主要講解一下,向arules中添加一個新的相關測度是多麼的容易,這裏的相關測度使用Omiecinski (2003)介紹的all-confidence,一個項集X的all-confidence(全置信度)定義爲:

該度量有一個特色:,這裏的I是項,X是項集。這意味着全部產生自項集X的規則至少必須有一個經過項集的全置信度值給定的置信!Omiecinski (2003)指出:上述方程分母中的支持度必須來自單個項,所以能夠被簡化爲。爲了獲取計算全置信度的項集,咱們使用Ecalt算法來挖掘Adult數據集中的頻繁項集!

> fsets<-eclat(Adult,parameter = list(support=0.05),control = list(verbose=FALSE))

對於全置信的分母,咱們須要找到全部已挖掘的單個項(single items)和他們響應的支持度值。接下來,咱們建立一個命名向量(其中,名稱是項的列數和值是他們支持度!)

> items(fsets)

itemMatrix in sparse format with

8496 rows (elements/transactions) and

115 columns (items)

> size(items(fsets))

[1] 4 3 3 3 3 2 2 2 2 4 3 3 3 2 2 2 2 5 5 5 4 4 4 5 4

[26] 4 4 3 3 3 3 5 4 4 4 3 3 3 4 3 3 3 2 2 2 2 2 2 4 3

[51] 3 3 5 4 4 4 3 3 3 5 4 4 4 3 3 3 4 3 3 3 2 2 2 2 2

[76] 2 2 4 3 3 5 4 4 5 4 4 4 3 3 3 3 4 4 4 4 3 3 3 3 6

[101] 5 5 5 4 4 4 5 4 4 4 3 3 3 3 5 4 4 4 3 3 3 4 3 3 3

[126] 2 2 2 2 2 2 2 2 4 4 5 4 4 4 5 4 4 4 5 4 4 4 5 4 4

[151] 4 3 3 3 3 3 3 3 5 4 4 4 3 3 3 5 4 4 4 3 3 3 5 4 4

[176] 5 4 4 4 3 3 3 3 5 4 4 5 4 4 4 3 3 3 3 5 4 4 4 3 3

[201] 3 4 3 3 3 2 2 2 2 2 2 2 2 2 4 3 3 4 4 6 5 5 5 4 4

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

[8301] 4 4 3 3 3 3 3 6 5 5 5 4 4 4 5 4 4 4 3 3 3 3 5 4 4

[8326] 4 3 3 3 4 3 3 3 2 2 2 2 2 2 2 7 6 6 6 5 5 5 6 5 5

[8351] 5 4 4 4 4 6 5 5 5 4 4 4 5 4 4 4 3 3 3 3 3 6 5 5 5

[8376] 4 4 4 5 4 4 4 3 3 3 3 5 4 4 4 3 3 3 4 3 3 3 2 2 2

[8401] 2 2 2 6 5 5 5 4 4 4 5 4 4 4 3 3 3 3 5 4 4 4 3 3 3

[8426] 4 3 3 3 2 2 2 2 2 5 4 4 4 3 3 3 4 3 3 3 2 2 2 2 4

[8451] 3 3 3 2 2 2 3 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

[8476] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

####查找出只有單個項(item)的transactions(記錄)

> singleItems <- fsets[size(items(fsets)) == 1] > singleItems

set of 36 itemsets

##### 獲取單個項對應的支持度列(Get the col numbers we have support for)

> quality(singleItems)

support

8461 0.95327792

8462 0.91738668

8463 0.89742435

8464 0.85504279

。。此處省略。。

8493 0.07907129

8494 0.06420703

8495 0.06187298

8496 0.05439990

> singleSupport <- quality(singleItems)$support #獲取支持度列

####對支持度命名!

> items(singleItems)

itemMatrix in sparse format with

36 rows (elements/transactions) and

115 columns (items)

> LIST(items(singleItems))

[[1]]

[1] "capital-loss=None"

[[2]]

[1] "capital-gain=None"

[[3]]

[1] "native-country=United-States"

[[4]]

[1] "race=White"

………此處省略………

[[33]]

[1] "workclass=Self-emp-not-inc"

[[34]]

[1] "workclass=Local-gov"

[[35]]

[1] "occupation=Machine-op-inspct"

[[36]]

[1] "education=Masters"

> unlist(LIST(items(singleItems),decode = FALSE))

[1] 66 63 111 60 8 62 70 114 2 31 50 61 33 21 3 71 51 25 1

[20] 115 26 53 29 45 38 39 69 36 47 54 43 58 10 6 42 27

> head(singleSupport, n = 5)

66 63 111 60 8

0.9532779 0.9173867 0.8974243 0.8550428 0.6941976

#####如今可使用方程2(上面給出的全置信公式)計算全部的項集的全置信啦!公式中的分母部分咱們已經獲得(即命名向量singleSupport),獲得的結果添加到集合優質(set's quality)數據框中!

> itemsetList <- LIST(items(fsets), decode = FALSE)

> allConfidence <- quality(fsets)$support/sapply(itemsetList, function(x) max(singleSupport[as.character(x)]))

> quality(fsets) <- cbind(quality(fsets), allConfidence)

> fsets

set of 8496 itemsets

> quality(fsets)[1:10,]

support allConfidence

1 0.05345809 0.05607818

2 0.05697965 0.05977234

3 0.05548503 0.06048162

4 0.05053028 0.05300687

5 0.05583309 0.05856959

6 0.05972319 0.06265034

7 0.05798288 0.06320441

8 0.05243438 0.05842763

9 0.05900659 0.08499971

10 0.05139020 0.05390893

####如今新的quality measure就是項集集合的一部分啦!查看一下便知!

> summary(fsets)

既然已經新的度量已經加入到quality measure集合中啦,它就能夠被用來處理集合。例如,下面查看包含了與教育(education)相關的一項的項集(使用部分匹配%pin%),並用all-confidence對其排序!(咱們首先過濾掉長度爲1的項集,由於根據定義(per definition),他們的全置信爲1)。

> fsetsEducation <- subset(fsets, subset = items %pin% "education") ##這個部分匹配略屌啊!!!(pin是partial in的縮寫)

> inspect(sort(fsetsEducation[size(fsetsEducation)>1],by = "allConfidence")[1:3])

items support allConfidence

1 {education=HS-grad,

hours-per-week=Full-time} 0.2090209 0.3572453

2 {education=HS-grad,

income=small} 0.1807051 0.3570388

3 {workclass=Private,

education=HS-grad} 0.2391794 0.3445408

最後,獲得的結果顯示:the item high school graduate (but no higher education) is highly associated with working full-time, a small income and working in the private sector!

忙活了大半天,就是說的這個啊!哈哈……其實,all-confidence已經和其餘相關測度一併被arules包實現了,調用這些相關測度的函數時interestMeasure()。

######例子4:抽樣

這個例子演示sampling,即抽樣如何在arules中使用,爲了方便,數據集仍是用adult數據集!

@ 加載數據集

> data("Adult")

> Adult

transactions in sparse format with

48842 transactions (rows) and

115 items (columns)

爲了計算一個合理的樣本量 n,這裏使用Zaki et al. (1997a)開發的公式。同時選擇5%的最小置信度。選擇10%做爲支持度可接受的偏差率epsilon,選擇90做爲置信水平(1-c)%

> supp <- 0.05

> epsilon <- 0.1

> c <- 0.1

> n <- -2 * log(c)/ (supp * epsilon^2)

> n

[1] 9210.34

可見:獲得的樣本量比原始數據庫小不少不少。

@ 使用sample函數(replace=TRUE:重複抽樣!)從數據庫中生成一個大小爲n的樣本

> AdultSample <- sample(Adult, n, replace = TRUE)

> AdultSample

transactions in sparse format with

9210 transactions (rows) and

115 items (columns)

@ 可使用項頻率圖(item frequency plot)比較樣本和數據庫(整體)。樣本中的項頻率用條形表示(bars),而原始數據庫中的項頻率用線條(lines)表示。一樣,使用cex.names參數調整label的大小,加強可讀性(readability)。

itemFrequencyPlot(AdultSample, population = Adult, support = supp, cex.names = 0.7,col.lab='red')

@ 另外,可使用提高比率(lift=TRUE)來比較樣本與整體。每一項的提高比率=P(i|sample)/P(i|population),其中機率經過項頻率來估計。提高比爲1,表示:items occur in the sample in the same proportion as in the population!提高比大於1表示that the item is over-represented in the sample and vice versa,這個很好理解,就不囉嗦啦。

> itemFrequencyPlot(AdultSample, population = Adult,support = supp, lift = TRUE,cex.names = 0.9,col='yellow')

能夠看到,less frequent items(非頻繁項)有很大的相對誤差(deviations)

@ 爲了比較樣本達到的speed-up(這個詞,我暫且理解成因爲樣本抽樣帶來速度提高而引發的項集優化等blablabla…),這裏使用Eclat算法來對樣本和整體同時挖掘頻繁項集,並比較各自挖掘所需的系統時間!

> time <- system.time(itemsets <- eclat(Adult,parameter = list(support = supp), control = list(verbose = FALSE)))

> time

user system elapsed

0.19 0.02 0.20

> timeSample <- system.time(itemsetsSample <- eclat(AdultSample,parameter = list(support = supp), control = list(verbose = FALSE)))

> timeSample

user system elapsed

0.04 0.00 0.04

這裏大概解釋一下system.time返回的幾個參數的意思哈!表示的是語句執行的須要的CPU時間。所以,對樣本進行挖掘而不是整體能夠獲得一個加速因子:

> # speed up

> time[1] / timeSample[1]

user.self

4.75

@ 爲了評估從樣本中挖掘到的項集的準確性,一般分析兩個集合之間的difference(差距)

> itemsets

set of 8496 itemsets

> itemsetsSample

set of 8351 itemsets

可見,兩個集合的項集大體相同。

@ 檢查兩個集合是否包含類似的項集,這裏進行集合(sets)匹配,來看看:fraction of frequent itemsets found in the database were also found in the sample.

> match <- match(itemsets, itemsetsSample, nomatch = 0) # 能夠看到,沒有匹配的都令其值爲0

> match

[1] 8 9 10 0 11 12 13 14 15 0 2 3 4 5 6 7 0 16 17

[20] 0 18 19 20 0 21 22 23 24 25 26 27 28 29 30 31 32 33 34

[39] 35 36 37 38 39 40 41 42 43 44 51 52 53 54 55 56 57 58 59

[58] 60 61 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

[77] 80 82 83 84 0 86 87 88 89 90 91 92 93 94 95 0 0 0 96

[96] 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115

[115] 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134

> ## remove no matches

> sum(match>0) / length(itemsets)

[1] 0.9662194

匹配率竟然如此之高! 使用樣本挖掘幾乎找到了全部的頻繁項集。

@ 沒有在樣本中發現的頻繁項集的支持度合在樣本中的頻繁項集的統計摘要(summary)以下:

> summary(quality(itemsets[which(!match)])$support)

Min. 1st Qu. Median Mean 3rd Qu. Max.

0.05004 0.05053 0.05100 0.05120 0.05159 0.05503

> summary(quality(itemsetsSample[-match])$support)

Min. 1st Qu. Median Mean 3rd Qu. Max.

0.05005 0.05049 0.05092 0.05128 0.05168 0.05527

這個說明:只有支持度與最小支持度很接近的項集纔會被錯誤的遺漏或發現!

@ 對於在數據庫和樣本中發現的頻繁項集,這裏從錯誤率中計算準確性

> supportItemsets <- quality(itemsets[which(match > 0)])$support

> supportSample <- quality(itemsetsSample[match])$support

> accuracy <- 1 - abs(supportSample - supportItemsets) / supportItemsets

> summary(accuracy)

Min. 1st Qu. Median Mean 3rd Qu. Max.

0.8939 0.9628 0.9785 0.9738 0.9893 1.0000

結論:The summary shows that sampling resulted in finding the support of itemsets with high accuracy.(說白了,說了這麼多就是在說這個,最後終於得證)。This small example illustrates that for extremely large databases or for application where mining time is important, sampling can be a powerful technique!

參考文獻

Aggarwal CC, Procopiuc CM, Yu PS (2002). "Finding Localized Associations in Market

Basket Data." Knowledge and Data Engineering, 14(1), 51–62.

Agrawal R, Imielinski T, Swami A (1993). "Mining Association Rules between Sets of Items

in Large Databases." In Proceedings of the 1993 ACM SIGMOD International Conference

on Management of Data, pp. 207–216. ACM Press. URL http://doi.acm.org/10.1145/

170035.170072.

Agrawal R, Srikant R (1994). "Fast Algorithms for Mining Association Rules." In JB Bocca,

M Jarke, C Zaniolo (eds.), Proc. 20th Int. Conf. Very Large Data Bases, VLDB, pp. 487–

499. Morgan Kaufmann.

相關文章
相關標籤/搜索