作者:婷婷糖
博客專欄:
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機器學習入門