本節內容:
1:理解關聯分析及專業名詞
2:關聯分析指定數據結構-->transactions(事務結構)
3:關聯分析規則規定流程
4:R代碼實現規則
一、理解關聯分析及專業名詞
1.1:什么是關聯分析:
有一個非常有名的故事:"尿布和啤酒"。故事是這樣的:美國的婦女們經常會囑咐她們的丈夫 下班后為孩子買尿布,而丈夫在買完尿布后又要順 手買回自己愛喝的啤酒,因此啤酒和尿布在 一起被購買的機會很多。這個舉措使尿布和啤酒的銷量雙雙增加,並一直為眾商家所津津樂道。 我們從中會有疑問?為什么尿布和啤酒放在一起就提升銷量呢? 如何去發現尿布和啤酒之間的關系就是我們要講的關聯分析
1.2:要進行關聯分析要用什么方法?
Apriori algorithm是關聯規則里一項基本算法。
是由Rakesh Agrawal和Ramakrishnan Srikant兩位博士在1994年提出的關聯規則挖掘算法。 關聯規則的目的就是在一個數據集中找出項與項之間的關系,
也被稱為購物藍分析 (Market Basket analysis),因為“購物藍分析”很貼切的表達了適用該算法情景中的一個子集。
我們將每一個顧客購買的購物藍中物品稱之為項,而購物籃的物品集合就叫做項集,這一次購買的東西的行為叫做事務
1.3:專業名詞
支持度(Support):定 義為 supp(X) = occur(X) / count(D) = P(X)。
1. 解釋一:比如選秀比賽,那個支持和這個有點類似,那么多人(資料庫),其中有多少人是選擇(支持)你的,那個就是支持度; 2. 解釋二:在100個人去超市買東西的,其中買蘋果的有9個人,那就是說蘋果在這里的支持度是 9,9/100; 3. 解釋三:P(X),意思是事件X出現的概率; 4. 解釋四:關聯規則當中是有絕對支持度(個數)和相對支持度(百分比)之分的。
置信度(Confidence/Strength): 定義為 conf(X->Y) = supp(X ∪ Y) / supp(X) = P(Y|X)。
買A的支持度是0.8 買B的支持度是0.6 同時買A和B的支持度是0.4 那么我們求A對B的置信度 = 0.4 / 0.8 = 0.5 ##求是說夠買了A之后那么再購買B的成功率是0.5,而原本B的支持度是0.6,那么在后面的算法我們就不會生成這個關聯規則
支持度(提升度Lift)
通過置信度A對B的支持度 = 0.5 / 0.6 =0.83 ##這說明支持度降低,不應該把A和B放在一起進行銷售
頻繁集
我們指定支持度為(0.25)那么項集從1到n的項集 > 0.25就叫做頻繁集。 當購物車有2個商品:叫做2項集 當購物車有3個商品:叫做3項集
二、關聯分析指定數據結構-->(事務結構)
要進行關聯分析那么其數據集的數據結構必須為transactions(事務結構)。
library(arules) library(gridBase) tr_list = list( c("Bread","Milk"), c("Bread","Beer","Milk"), c("Eggs","Beer","DR") ) ##重命名 names(tr_list) = paste("tr",c(1:3),sep = "") summary(tr_list) ##變成事務類型 #使用as函數,將鏈表轉化為事務類型 trans = as(tr_list,"transactions")
如何查看事務類型的屬性
##展現事務 LIST(trans) ##查看事務數據 inspect(trans) image(trans) ##可視化查看事務 trans@data size(trans) #每個事務中包含多少項 filter_trans = trans[size(trans)>=3] ##篩選出事務中項數大於等於3的事務 summary(filter_trans)
三、關聯分析規則規定流程
從1項集到N項集,求出各個項集的支持度,我們指定支持度的閾值為(0.25),當支持度小於0.25,我們就
將其項集刪除。然后就出各個的置信度和提升度判定是否要生成規則
支持度: Beer = 0.6 Bread=0.8 Coke=0.4 Diaper = 0.8 Mike=0.8 置信度: Be,Br = 0.4 求置信度Be:Be和Br都發生的概率是0.4,原本購買Br的概率是0.8 所以0.4/0.8=0.5 就是說,夠買了Br之后那么再購買Be的成功率是0.5 那么原本購買Be的0.6 變成了 0.5,所以就生成不了這個規則。 提升度: 0.5/0.6 = 0.83 購買Be提升度降低
四、R代碼實現規則
1:實現:事務轉換、查看事務數據
library(arules) library(gridBase) install.packages("arulesViz") library(arulesViz) tr_list = list( c("Bread","Milk"), c("Bread","Beer","Diaper","Eggs"), c("Milk","Diaper","Beer","Coke"), c("Bread","Milk","Diaper","Beer"), c("Bread","Milk","Diaper","Coke") ) names(tr_list) = paste("tr",c(1:5),sep = "") summary(tr_list) ##變成事務類型 #使用as函數,將鏈表轉化為事務類型 trans = as(tr_list,"transactions") inspect(trans)
2:實現:查看單項集的支持度,還有經過支持度的篩選得到的多項集的支持度
##查看支持度 ac = itemFrequency(trans,type="relative") summary(ac) ec = eclat(trans,parameter = list(support=0.25,maxlen=5)) #找到所有項集 支持度大於0.25的,maxlen[最大項集是幾項] summary(ec) inspect( sort(ec,by="support")) #查看各個項集的支持度,按支持度排序
3:實現規則
##-----------------生成規則,--------------- #conf = 0.5[置信度要大於0.5也就是起碼不能是靠猜的買還是不買] rules = apriori(trans,parameter = list(supp=0.25,conf=0.5,target="rules")) inspect(rules) summary(rules) #對規則的置信度進行排序 rules.sorted = sort(rules,by="confidence",decreasing = T) inspect(rules.sorted)
##去重復規則 is_redun = is.redundant(rules.sorted) trans_punds = rules.sorted[!is_redun] inspect(trans_punds)
4:單獨針對Milk的規則
#買Milk的人 我們要怎么做推薦 mike_rules = apriori(trans,parameter = list(supp=0.2,conf=0.5,minlen=2), appearance = list(default="rhs",lhs="Milk")) inspect(mike_rules) plot(mike_rules,by="lift",main="milk_rule by lift",method="graph", control=list(type="items")) ##買了什么產品會推薦Mike,rhs=>右邊是milk mike_rules_r = apriori(trans,parameter = list(supp=0.2,conf=0.5,minlen=3), appearance = list(default="lhs",rhs="Milk")) plot(mike_rules_r,by="lift",main="milk_rule by lift",method="graph", control=list(type="items")) plot(c(rules.sorted,mike_rules_r),mian="RHS_milk rules") ##繪制關聯規則的氣球圖 #兩個以上才能圖畫出來