公號:碼農充電站pro
主頁:https://codeshellme.github.io
在資料分析領域有一個經典的故事,叫做“尿布與啤酒”。
據說,在美國西部的一家連鎖超市發現,很多男人會在週四購買尿布和啤酒。這樣超市就可以將尿布與啤酒放在一起賣,便可以增加銷售量。
“尿布與啤酒”這個案例就屬於資料分析中的關聯分析,也就是分析資料集中的內在隱含關係。
關聯分析可以被用於發掘商品與商品之間的內在關聯關係,進而通過商品捆綁銷售或者相互推薦,來增加商品銷量。
關聯分析除了可以用於零售行業外,還可以用於網站流量分析和醫藥行業等。
Apriori 演算法是一種發掘事物內在關聯關係的演算法,它可以加快關聯分析的速度,從而讓我們更有效的進行關聯分析。
1,關聯分析
關聯分析用於發掘大規模資料集中的內在關係。
關聯分析一般要分析資料集中的頻繁項集(frequent item sets)和關聯規則(association rules):
- 頻繁項集:是資料集中頻繁項的集合,集合中可以有一項或多項物品。
- 關聯規則:暗示了兩種物品之間可能存在很強的內在關係。
假設,我們收集了一家商店的交易清單:
交易編號 | 購物清單 |
---|---|
1 | 牛奶,麵包 |
2 | 牛奶,麵包,火腿 |
3 | 麵包,火腿,可樂 |
4 | 火腿,可樂,方便麵 |
5 | 麵包,火腿,可樂,方便麵 |
頻繁項集是一些經常出現在一起的物品集合。比如:{牛奶,麵包}
,{火腿,方便麵,可樂}
都是頻繁項集的例子。
項集中的物品,一般不考慮順序關係。
關聯規則意味著有人買了一種物品,還會買另一種物品。比如方便麵->火腿
,就是一種關聯規則,表示如果買了方便麵,還會買火腿。
2,三個重要概念
關聯分析中有三個重要的概念,分別是:
- 支援度
- 可信度 / 置信度
- 提升度
支援度
要進行關聯分析,首先要尋找頻繁項,也就是頻繁出現的物品集。那麼怎樣才叫頻繁呢?我們可以用支援度來衡量頻繁。
支援度是針對項集來說的,一個項集的支援度就是該項集的記錄佔總記錄的比例。通常可以定義一個最小支援度,從而只保留滿足最小支援度的項集。
一個項集{A}
的支援度的定義如下:
比如,在上面表格中的5 項記錄中,{牛奶}
出現在了兩條記錄中,所以{牛奶}
的支援度為 2/5
;而{麵包,火腿}
出現在了三條記錄中,所以{麵包,火腿}
的支援度為3/5
。
可信度
可信度又叫置信度,它是針對關聯規則來說的,比如{火腿}->{可樂}
。
一個關聯規則{A}->{B}
表示,如果購買了物品A,會有多大的概率購買物品B?它的可信度的定義如下:
所以,在上面的表格中,{火腿,可樂}
的支援度是 3/5
,{火腿}
的支援度是 4/5
,所以{可樂}->{火腿}
的可信度為 3/5
除以 4/5
,等於 0.75
。這意味著,如果購買了火腿,有 75%
的可能性會購買可樂。
提升度
提升度也是針對關聯規則來說的,它表示的是“如果購買物品A,會對購買物品B 的概率提升多少”。
一個關聯規則{A}->{B}
的提升度的定義如下:
提升度會有三種情況:
- 提升度{A}->{B} > 1:表示購買物品A 對購買物品B 的概率有提升。
- 提升度{A}->{B} = 1:表示購買物品A 對購買物品B 的概率沒有提升,也沒有下降。
- 提升度{A}->{B} < 1:表示購買物品A 對購買物品B 的概率有下降。
3,如何尋找頻繁項
尋找頻繁項的一個簡單粗暴的方法是,對所有的物品進行排列組合,然後計算所有組合的支援度,這種演算法也可以叫做窮舉法。
窮舉法
窮舉法就是列出所有物品的組合,然後計算每種組合的支援度。
比如,我們有一個物品集{0,1,2,3},其中有四個物品,那麼所有的物品組合如下:
從圖中可以看到一共有15 種組合,計算每一種組合的支援度都需要遍歷一遍所有的記錄,檢查每個記錄中是否包含該組合。因此有多少種組合,就需要遍歷多少遍記錄,時間複雜度則會很大。
可以總結出:包含N 種物品的資料集,共有 2N - 1 種組合。為了計算每種組合的支援度,則需要遍歷 2N - 1 次記錄。
如果一個商店中有100 款商品,將會有1.26*1030 種組合,這是一個非常龐大的數字。而普通商店一般都會有成千上萬的商品,那麼組合數將大到無法計算。
4,Apriori 演算法
為了降低計算所需的時間,1994 年 Agrawal 提出了著名的 Apriori 演算法,該演算法可以有效減少需要計算的組合的數量,避免組合數量的指數增長,從而在合理的時間內計算出頻繁項集。
Apriori 原理是說:如果一個項集是非頻繁集,那麼它的所有超集也是非頻繁的。
比如下圖中的項集{1,3}
是非頻繁集,那麼{0,1,3}
,{1,2,3}
,{0,1,2,3}
就都是非頻繁項集。這就大大減少了需要計算的項集的數量。
5,Apriori 演算法的實現
這裡,我們使用Apriori 演算法來尋找上文表格中的購物清單的頻繁項集(為了方便檢視,我把表格放在這裡)。
交易編號 | 購物清單 |
---|---|
1 | 牛奶,麵包 |
2 | 牛奶,麵包,火腿 |
3 | 麵包,火腿,可樂 |
4 | 火腿,可樂,方便麵 |
5 | 麵包,火腿,可樂,方便麵 |
efficient_apriori 模組
Efficient-Apriori 包是Apriori 演算法的穩定高效的實現,該模組適用於 Python 3.6+
。
使用Apriori 演算法要先安裝:
pip install efficient-apriori
efficient_apriori 包中有一個 apriori
函式,原型如下(這裡只列出了常用引數):
apriori(data,
min_support = 0.5,
min_confidence = 0.5)
引數的含義:
- data:表示資料集,是一個列表。列表中的元素可以是元組,也可以是列表。
- min_support:表示最小支援度,小於最小支援度的項集將被捨去。
- 該引數的取值範圍是 [0, 1],表示一個百分比,比如0.3 表示30%,那麼支援度小於30% 的項集將被捨去。
- 該引數的預設值為0.5,常見的取值有0.5,0.1,0.05。
- min_confidence:表示最小可信度。
- 該引數的取值範圍也是 [0, 1]。
- 該引數的預設值為0.5,常見的取值有1.0,0.9,0.8。
使用 apriori 函式
首先,將表格中的購物清單轉化成 Python 列表,如下:
data = [
('牛奶', '麵包'),
('牛奶', '麵包', '火腿'),
('麵包', '火腿', '可樂'),
('火腿', '可樂', '方便麵'),
('麵包', '火腿', '可樂', '方便麵')
]
挖掘頻繁項集和頻繁規則:
# 該函式的使用很簡單,就一行程式碼
# 最小支援度為 0.5
# 最小可信度為 1
itemsets, rules = apriori(data, min_support=0.5, min_confidence=1)
檢視頻繁項集和頻繁規則:
>>> itemsets # 頻繁項集
{1: { # 只有一個元素的項集
('麵包',): 4, # 4 表示記錄數
('火腿',): 4,
('可樂',): 3
},
2: { # 有兩個元素的項集
('火腿', '麵包'): 3,
('可樂', '火腿'): 3
}
}
>>> rules # 頻繁規則
[{可樂} -> {火腿}]
6,總結
本篇文章主要介紹了什麼是關聯分析,關聯分析中三個重要的概念,以及 Apriori 演算法。
Apriori 演算法用於加快關聯分析的速度,但它也需要多次掃描資料集。其實除了Apriori 演算法,還有其它演算法也可以加快尋找頻繁項集的速度。
2000 年提出的FP-Growth 演算法,對 Apriori 演算法進行了改進。FP-Growth 通過建立一棵 FP樹來儲存頻繁項集。對不滿足最小支援度的項不會建立節點,減少了儲存空間。而且整個生成過程只遍歷資料集 2 次,大大減少了計算量。
另外,還有CBA 演算法,GSP 演算法等,都對Apriori演算法進行了改進,這裡不再詳細介紹。
(本節完。)
推薦閱讀:
歡迎關注作者公眾號,獲取更多技術乾貨。