關聯規則R語言實戰(Apriori算法)

2021-02-21 表哥有話講

作者:婷婷糖

博客專欄:

https://ask.hellobi.com/blog/tingtingtang

最近遇到一個業務問題需要用關聯規則的算法來實現,為了解決業務問題,我又重新複習了一遍以前就學過的Apriori算法並將其運用到業務場景中。下面,我想談一談在具體的業務實現過程中我的一些感想。   

一.理論背景

1.1基本術語定義  

X和Y各代表某一個項集,M代表樣本中的總項集數。

1.2關聯規則的三個度量  

衡量關聯規則有三個最基本也是最重要的指標,我將其稱為『三度』。這裡的三度指的可不是《三傻大鬧寶萊塢》裡面那三個蠢萌蠢萌的印度人,而是指的度量關聯規則最基礎也是最核心的指標三兄弟:支持度,置信度,提升度。   

下面我將對這三兄弟進行逐一介紹。  

老大支持度,是『三度』家族裡最沉穩最老實的孩子。出於兄長對兩個弟弟的謙讓之情,關聯規則家族建立的時候,老大主動表示他要來度量關聯規則中最苦最累隨時要給弟弟們提供理論支持的概念。關聯規則家族表示老大good job,於是便給老大賜名為支持度,基本公式是

說完了基本公式,我們來說說老大支持度的基本公式代表的基本概念:老大支持度表示了X項集出現的次數在所有項集的總次數中所佔的比例。  

  老二置信度,是『三度』家族中最高調也是最不折手段的孩子。為了獲得最重要的地位,老二踩著老大的肩膀往上爬,於是,他獲得了賜名:置信度,基本公式是


可以明顯地看到,老二置信度的公式的分子分母都靠了老大的幫助,可以說老二的身份完全是踩著老大的肩膀建立起來的,沒有老大支持度的無私奉獻,就沒有老二置信度的今天。說完了基本公式,來說說老二置信度的基本概念:老二置信度,代表了X∪Y這個項集出現的次數在X這個項集出現的次數中所佔的比例。   

老三提升度,是『三度』家族中容易被人給遺忘的小可憐。從定義上來說,老三算是老大支持度和老二置信度的結合體,可由於老二置信度太醒目了,許多人在做關聯規則時在沒有完全吃透理論的情況下往往容易忽略老三提升度的存在。下面先給出老三提升度的公式

先給出提升度的基本概念:老三提升度,計算的是相比於從所有項集中找Y,在存在X的項集中找Y找到的可能性提升的倍數。通常在數據挖掘中,提升度大於3的關聯規則才是有意義的,這是因為如果太低甚至小於1,那麼說明從存在X的項集中找Y找到的可能性並不比從所有項集中找Y高多少甚至還要低,這樣的話,那還不如直接從所有項集中找Y,免得費時又費力還提升不了效率,這樣的規則,不要也罷。 

1.3Apriori算法理論  

在了解了關聯規則的三個度的基本定義之後,下一步則需要闡述清楚Apriori算法的基本定義。  

在講Apripri算法之前,我們首先要清楚兩個概念:  

1)設定最小支持度的閾值,如果一個項集的支持度大於等於最小支持度,則其為頻繁項集,如果一個項集的支持度小於最小支持度,則其為非頻繁項集。  

2)對於一個項集,如果它是頻繁集,則它的子集均是頻繁集;如果它是非頻繁集,則它的父集都是非頻繁集。這是因為一個項集的所有子集的支持度都大於等於它本身,一個項集的所有父親的支持度都小於等於它本身。  

有了上面兩個概念打底,Apriori算法就可以被定義了。Apripri算法主要分為三步:  

1)設定最小支持度的閾值。從單項集開始,先計算所有單項集的支持度,過濾掉非頻繁單項集及其父集;將剩餘的單項集組合為二項集,先計算所有二項集的支持度,過濾掉非頻繁二項集及其父集;不斷地迭代上述過程,最後篩選出所有的頻繁項集。  

2)設定最小置信度的閾值。對頻繁項集進行計算,求出滿足置信度條件的強關聯規則。  

3)設定最小提升度的閾值。對第2)步進行計算,求出滿足提升度條件的強關聯規則,作為最後的關聯規則的模型結果。  

相比於最原始的一一計算,使用Apripor算法計算頻繁項集可以大大地減少運算量,提升計算效率。  到底,理論的梳理就完全結束,下一步我將會對關聯規則進行實戰演練。

二.實操演練2.1數據源  

因為業務需要保密,所以實戰演練部分我並沒有用業務中的真實數據來進行記錄,而是借用了arules包中和我業務數據很像的Epub數據來對我的建模過程來進行一個回顧和梳理。  

  Epub數據包含了來自維也納大學經濟與工商管理學院的電子文檔平臺的下載歷史。

library(arules)
#導入數據
>data(Epub)
#查看數據類型
>class(Epub)
[1]"transactions"
#因為我的業務數據是從oracle資料庫裡面導出來的,所以我這裡便把Epub數據轉成data.frame格式,然後導出到資料庫之後,重新從資料庫導入,以便能夠記錄整個建模流程
>Epub<-as(Epub,"data.frame") 
#因為業務不需要,所以演示時也去掉時間欄位
>Epub<-Epub[,1:2] 

導出進資料庫因為不屬於建模流程,這裡就不記錄了。

2.2數據準備  

上一節對數據源進行了基本的闡釋下面正式進入正題,我將會從資料庫導入開始一步步記錄我的建模流程。  

首先,是數據準備過程。


library(RODBC)

channel<-odbcConnect("資料庫名",uid="orcl",pwd="orcl")

Epub<-sqlQuery(channel,"select * from Epub")

head(Epub)

  此時數據應該是如下表格的data.frame結構:


這個時候,表格是資料庫存儲的格式而非事務集的格式,因此首先要對數據進行格式轉換。  

首先,要對數據進行分組,一個transactionID的所有items應該在一個組裡,因此,我們可以使用split函數,指定它的分組變量和目標變量:

>Epub<-split(Epub$items,Epub$transacionID)
#分組之後,將Epub數據轉換成事務集形式
>Epub<-as(Epub,"transacions")
#查看Epub數據的前十行
>inspect(Epub[1:10])
  items                    transactionID          
[1]  {doc_154}                session_4795  
[2]  {doc_3d6}                session_4797  
[3]  {doc_16f}                session_479a  
[4]  {doc_11d,doc_1a7,doc_f4} session_47b7  
[5]  {doc_83}                 session_47bb  
[6]  {doc_11d}                session_47c2  
[7]  {doc_368}                session_47cb  
[8]  {doc_11d,doc_192}        session_47d8  
[9]  {doc_364}                session_47e2  
[10] {doc_ec}                 session_47e7  

Eupb已經被轉化成了事務集,到此,我們就已經做好數據的準備。 

2.3建模  

數據準備好之後,就進入整個流程中最重要也是最核心的建模步驟中了。


>summary(Epub)
transactions as itemMatrix in sparse format with
15729 rows (elements/itemsets/transactions) and
936 columns (items) and a density of 0.001758755

most frequent items:
doc_11d doc_813 doc_4c6 doc_955 doc_698 (Other)
   356     329     288     282     245   24393

element (itemset/transaction) length distribution:
sizes
   1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16    17    18    19
11615  2189   854   409   198   121    93    50    42    34    26    12    10    10     6     8     6     5     8
  20    21    22    23    24    25    26    27    28    30    34    36    38    41    43    52    58
   2     2     3     2     3     4     5     1     1     1     2     1     2     1     1     1     1

  Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
 1.000   1.000   1.000   1.646   2.000  58.000

includes extended item information - examples:
  labels
1 doc_11d
2 doc_13d
3 doc_14c

includes extended transaction information - examples:
     transactionID    
10792  session_4795
10793  session_4797
10794  session_479a

>dim(Epub)
[1] 15729   936

第一步,查看數據集的統計匯總信息。summary()含義的具體解釋如下:  

1)共有15729個項集和936 個item,稀疏矩陣中1的百分比為0.001758755。  

2)most frequent items描述了最頻繁出現的5個item以及其分別出現的次數。  

3)sizes描述了項集的項的個數以及n項集共有幾個,例如單項集有10個,二項集有11個,58項集有1個。sizes之後描述了sizes對應的5個分位數和均值的統計信息。


>itemFreq<-itemFrequency(Epub)
#每個項集transaction包含item的個數
>Size<-size(Epub)

> itemCount<-(itemFreq/sum(itemFreq)*sum(Size))

除此之外,還可以更直觀地作圖觀測itemFrequency。

#查看支持度排行前10的圖
>itemFrequencyPlot(Epub,topN=10,col="lightblue")


當對數據的基本統計信息心中有數之後,就開始最重要的建模步驟。

#最小支持度0.001,最小置信度0.6,最小項數2
>rules<-apriori(Epub,parameter=list(support=0.001,confidence=0.6,minlen=2))

這裡解釋一下最小項數。minlen和maxlen表示LHS+RHS併集的元素的最小個數和最大個數。有意義的規則起碼是LHS和RHS各至少包含1個元素,所以minlen為2。  

 生成模型之後,觀測模型結果。

#展示生成的規則
inspect(sort(rules,by="lift"))
   lhs                  rhs       support     confidence lift    
[1] {doc_6e7,doc_6e8} => {doc_6e9} 0.001080806 0.8095238  454.7500
[2] {doc_6e7,doc_6e9} => {doc_6e8} 0.001080806 0.8500000  417.8016
[3] {doc_6e8,doc_6e9} => {doc_6e7} 0.001080806 0.8947368  402.0947
[4] {doc_6e9}         => {doc_6e8} 0.001207960 0.6785714  333.5391
[5] {doc_6e9}         => {doc_6e7} 0.001271537 0.7142857  321.0000
[6] {doc_506}         => {doc_507} 0.001207960 0.6551724  303.0943
[7] {doc_6e8}         => {doc_6e7} 0.001335113 0.6562500  294.9187
[8] {doc_6e7}         => {doc_6e8} 0.001335113 0.6000000  294.9187
[9] {doc_87c}         => {doc_882} 0.001335113 0.6000000  171.5891

使用inspect函數,將會具體的展示生成的每一條強規則,其對應的支持度support,置信度confidence ,提升度為lift。by設置為lift,表示展示的規則將會按照提升度lift的大小進行排序。  

除了一次性查詢所有規則,還可以指定搜索條件,查看規則的子集。

>subrules<-subset(rules,items %in% c("doc_882") & lift>=3)
>inspect(sort(subrules,by="lift"))
   lhs          rhs       support     confidence lift    
[1] {doc_87c} => {doc_882} 0.001335113 0.6000000  171.5891

#對於規則,我們也可單獨查詢它的三度,例如現在查詢自規則subrules的三度:
>subrulesquality<-quality(subrules)
>subrulesquality
      support confidence     lift
22 0.001335113  0.6000000 171.5891
23 0.001335113  0.3818182 171.5891

這樣就得到了包含doc_882的規則。  

到此,建模部分就梳理完畢,下面進入關聯規則可視化部分。  

2.4可視化  

在關聯規則中,歸納關聯規則規律比較重要的圖有三個,分別是散點圖,分組矩陣圖和graph圖。下面,我們將會對這三種圖進行一一闡述。    

2.4.1散點圖   

散點圖表示了求出的強關聯規則裡支持度support和置信度confidence的分布,每個點顏色的深淺表示了提升度lift的大小.

 #載入arulesViz畫圖包
library(arulesViz)
#顏色包
library(RColorBrewer)
#如果想看交互圖,可以設置interactive=TRUE,默認為FALSE
>plot(rules,control=list(jitter=2,col=rev(brewer.pal(9,"BrBG"))),shading="lift")


從圖中可以看出,關聯規則的支持度support普遍偏低,confidence分布較為均勻,提升度的位置基本上都在百級,總體都遠遠大於3,表示出來的強規則均是有意義的。

2.4.2分組矩陣圖  

分組矩陣圖將有共同點比較相近的規則聚成類,然後展示聚類規則的大體分布。默認是20類,這裡將聚類個數設置為5.

>plot(rules,method="grouped",control=list(k=5,col=rev(brewer.pal(9,"YlOrRd")[3:8])))


相似的關聯規則分成一組,從而能夠更深入地提取出關聯規則的總體規律和重要規則共性。其中,橫坐標代表被聚成的8類,且均是先導,縱坐標代表先導最後可能產生的10類後繼,圓圈顏色的深淺表示提升度的大小,顏色越深,提升度越大;圓圈的大小表示支持度的大小,圓圈越大,支持度越大。

2.4.3graph圖  

最後,我們做出graph圖。

>plot(Rule,method = "graph",measure = "confidence",
    control = list(type="items"),shading = "lift")


graph圖中,源頭表示先導,箭頭表示關係指向的方向,中間的圓圈表示此規則置信度的大小,圓圈越大,置信度越大;圓圈顏色的深度表示提升度的大小,圓圈顏色越深,該規則提升度越大;箭頭指向的盡頭表示該規則的後繼。觀察關聯規則因果圖,可以直觀地對重要的關聯規則有一個初步的認識。   

  到此,關聯規則的梳理就正式完畢。

三.總結  

關聯規則最開始被用於購物籃分析,在購物籃分析中,大家關心的都是items之間的關係,而並不會去關心每個項集對應的transactionID到底是誰。可隨著關聯規則被用於多種場景中,總會有場景會關心最後求出的關聯規則背後的transactionID到底是什麼,我現在做的業務就遇到了這麼個情況。  在這裡,我提出一個疑問,如何求出強關聯規則背後對應的transactionID。


微信回復關鍵字即可學習

回復 R              R語言快速入門免費視頻 
回復 統計          統計方法及其在R中的實現
回復 用戶畫像   民生銀行客戶畫像搭建與應用 
回復 大數據      大數據系列免費視頻教程
回復 可視化      利用R語言做數據可視化
回復 數據挖掘   數據挖掘算法原理解釋與應用
回復 機器學習   R&Python機器學習入門 

相關焦點

  • 機器學習實戰(15.2):Apriori算法示例
    在前一章我們了解了Apriori算法。它可以通過尋找物品的不同組合,找到頻繁項以及頻繁項之間的關聯,今天為大家帶來的是Apriori算法的實際應用示例。我們會通過一個從毒蘑菇中尋找相似特徵的示例來看Apriori算法是如何發現頻繁項以及找到他們的關聯關係的。
  • 機器學習(三) 關聯規則Apriori算法R語言實戰
    最後給出了在R語言中使用Apriori算法進行關聯規則挖掘的實戰案例。關聯規則來源。。。。。。。。。。。上個世紀,美國連鎖超市活爾瑪通過大量的數據分析發現了一個非常有趣的現象:尿布與啤酒這兩種看起來風馬牛不相及的商品銷售數據曲線非常相似,並且尿布與啤酒經常被同時購買,也即購買尿布的顧客一般也同時購買了啤酒。
  • 數據挖掘之關聯規則算法(Apriori)
    1 關聯規則挖掘定義大多數關聯規則挖掘算法通常採用的一種策略是,將關聯規則挖掘任務分解為如下兩個主要的子任務:頻繁項集產生(Frequent Itemset Generation關聯分析的目標發現頻繁項集;由頻繁項集產生強關聯規則,這些規則必須大於或等於最小支持度和最小置信度。
  • 關聯規則的挖掘與應用——Apriori和CBA算法
    文|光大科技大數據部 魏樂 盧格潤1 關聯規則1.1 關聯規則基本概念1.2 Apriori算法基本思路2 關聯分類2.1 CBA關聯分類算法思路1.2 Apriori算法基本思路關聯規則的挖掘可以分為兩步,第一步找到頻繁項集,第二步從頻繁項集中再找出滿足最小置信度的強關聯規則。整體來看,第二步比較簡單,主要算力都耗費在第一步上,如果採用統計方法,需要將所有K項集統計一遍,費時耗力。
  • 機器學習 關聯規則(Apriori)及實例解析
    這就歸功於關聯規則(Apriori)算法了。今天小編給大家介紹關聯規則算法的原理及使用實例。關聯規則就是發現存在於大量數據集中的關聯性或相關性,從而描述了一個事物中某些屬性同時出現的規律和模式。由關聯規則作出的推論並不必然蘊涵因果關係。它只表示規則前件和後件中的項明顯地同時出現。
  • 【典型算法】Apriori
    其中arules用於管理規則的數位化生產,提供Apriori和Eclat兩種快速挖掘頻繁項集和關聯規則算法的現實函數;arulesViz作為arules的擴展包,提供了實用而新穎的關聯規則可視化技術,使得關聯分析從算法運行到結果呈現一體化。
  • 數據挖掘原理與實戰(一)--關聯規則Apriori算法
    首先會先學習數據挖掘的重要算法和實戰,在有了一個較為清晰的認識之後,再開始從理論上理清數據挖掘的理論體系,與大家共勉。今天首先分享最經典的數據挖掘算法Apriori算法,它屬於關聯規則挖掘算法,我們常聽到的「啤酒與尿布」的故事就是源於此類算法。
  • Apriori算法詳解
    Apriori算法簡介Apriori算法是一種常用的用於挖掘出數據關聯規則(Association Rules)的算法,「apriori」在拉丁語中翻譯為「來自以前」,顧名思義,這個算法是使用先驗知識來預測數據的關聯規則。說到關聯規則,我們不得不提到一個經典案例——啤酒與尿布。
  • 關聯規則挖掘基本概念與Aprior算法
    如有好文章投稿,請點擊 → 這裡了解詳情關聯規則挖掘在電商、零售、大氣物理、生物醫學已經有了廣泛的應用,本篇文章將介紹一些基本知識和Aprori算法。一、關聯規則、自信度、自持度的定義關聯規則就是有關聯的規則,形式是這樣定義的:兩個不相交的非空集合X、Y,如果有X–>Y,就說X–>Y是一條關聯規則。舉個例子,在上面的表中,我們發現購買啤酒就一定會購買尿布,{啤酒}–>{尿布}就是一條關聯規則。
  • 十大經典數據挖掘算法—Apriori
    打開APP 十大經典數據挖掘算法—Apriori 發表於 2018-02-04 09:37:56 因此,關聯規則分析可分為下列兩個步驟: 生成頻繁項集F=X∪Y; 在頻繁項集F中,找出所有置信度大於最小置信度的關聯規則X⟶Y。 暴力方法 若(對於所有事務集合)項的個數為d,則所有關聯規則的數量:
  • Apriori算法原理與實現
    好久沒寫過數據挖掘相關的代碼了,python語言基礎也丟了,就先來一篇Apriori練練手吧。
  • 一步步教你學Apriori算法
    同時滿足最小支持度閥值和最小置信度閥值的規則稱為強規則。3 Apriori 算法實現算法思想首先找出所有的頻集,這些項集出現的頻繁性至少和預定義的最小支持度一樣。然後由頻集產生強關聯規則,這些規則必須滿足最小支持度和最小可信度。
  • R語言—Rattle包數據挖掘(5)
    Rattle包基於R語言開發的強大數據挖掘工具,圖形交互式可視化界面,如同SPSS Modeler一樣,可以讓很多R初學者或R語言薄弱的同學完成數據挖掘工作。Rattle提供了數據清洗、簡單統計檢驗、數據建模分析和模型評估。數據建模包括:聚類、關聯規則、決策樹、隨機森林、支持向量機、回歸、神經網絡和生存分析。
  • R語言:機器學習程序包
    ://cran.r-project.org/web/packages/boost/index.html)執行多種多樣的梯度boosting算法,gbm包做基於樹的梯度下降boosting,boost包包括LogitBoost和L2Boost。
  • R語言學習路線和常用數據挖掘包
    對於初學R語言的人,最常見的方式是:遇到不會的地方,就跑到論壇上吼一嗓子,然後欣然or悲傷的離去,一直到遇到下一個問題再回來。那麼,眾多書籍中,一個生手應該從哪一本著手呢?入門之後如何才能把自己練就成某個方面的高手呢?相信這是很多人心中的疑問。有這種疑問的人有福了,因為筆者將根據自己的經歷總結一下R語言書籍的學習路線圖以使Ruser少走些彎路。本文分為6個部分,分別介紹初級入門,高級入門,繪圖與可視化,計量經濟學,時間序列分析,金融等。
  • Machine Learning-常見算法優缺點匯總
    前文傳送門:Machine Learning-算法匯總介紹  Machine Learning-模型調優備忘錄
  • 原理+ 代碼|手把手教你用Python實現智能推薦算法
    問:購物籃的常用算法?答:常用算法有不考慮購物順序:關聯規則。購物籃分析其實就是一個因果分析。05基於Apriori 算法的Python實戰由於有關Apriori等算法的研究已經很成熟,我們在用Python實戰時無需一步一步計算,直接調用現有函數即可,主要是要明白背後的原理與不同算法的使用場景與優劣比較。
  • 《機器學習實戰》中英文電子書、源碼分享
    《機器學習實戰》通過精心編排的實例,切入日常工作任務,摒棄學術化語言,利用高效的可復用Python代碼來闡釋如何處理統計數據,進行數據分析及可視化。通過各種實例,讀者可從中學會機器學習的核心算法,並能將其運用於一些策略性任務中,如分類、預測、推薦。另外,還可用它們來實現一些更高級的功能,如匯總和簡化等。
  • 數據挖掘十大經典算法
    :C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and CART.不僅僅是選中的十大算法,其實參加評選的18種算法,實際上隨便拿出一種來都可以稱得上是經典算法,它們在數據挖掘領域都產生了極為深遠的影響。1.C4.5C4.5算法是機器學習算法中的一種分類決策樹算法,其核心算法是ID3算法.
  • Machine Learning-算法匯總介紹
    (分類與回歸)經典算法:Logistic Regression and the Back Propagation Neural Network.(邏輯回歸算法與BP神經網絡算法),貝葉斯定理網絡)Bayesian Network (BN,貝葉斯網絡)