python-關聯規則


1. 什么是關聯規則

關聯規則,從大量數據中發現事物、特征或者數據之間的,頻繁出現的相互依賴關系和關聯關系。

X—>Y,XY的關聯規則,包括支持度support、信任度confidence和提升度lift。

關聯規則最早是為購物籃分析問題所提出,如著名的啤酒與尿布的故事。

2. 關聯規則有什么用

發現項集之間的關聯和相關關系,通過對數據集進行關聯分析可得出形如“由於某些事件的發生而引起另外一些事件的發生”之類的規則。關聯分析對商業決策具有重要的價值,如基於用戶購買習慣,制定相關推薦產品、套裝商品或捆綁商品的銷售策略,達到平台整體銷量提升

3. 如何運用關聯規則

3.1 基本概念

假設某個時間段內存在以下4次交易行為,購買商品如下:

TID Items
001 Cola, Egg, Ham
002 Cola, Diaper, Beer
003 Cola, Diaper, Beer, Ham
004 Diaper, Beer

關聯規則中涉及到的基本概念:

名稱 說明
事務 每一個交易數據稱為一個事務。如上表包含了4個事務
交易的每個商品稱為項。如Cola, Beer等
項集 交易商品組成的集合,如{Cola},
K-項集 包含K個商品的集合叫做 K-項集。如{Cola, Beer, Ham}:3-項集
支持度計數 一個商品集合出現在N個交易中,則該商品集合的支持度計數為N。如{Diaper, Beer}出現在交易 002、 003、 004中,其支持度計數為3
支持度 支持度計數 / 總事務數。如 {Diaper, Beer} 支持度為 3/4 = 75%。這說明75%的人同時買了 Diaper 和 Beer。
頻繁項集 支持度大於或等於某個閾值的項集就叫做頻繁項集。如 閾值設50%時,因為{Diaper, Beer}的支持度是75%,所以它是頻繁項集。
置信度 對於{A}->{B},它的置信度為 {A, B}的支持度計數 除以 {A} 的支持度計數。如,規則{Diaper}->{Beer}的置信度為 3/3,即100%,說明買了Diaper的人 100% 也買了 Beer。
前件和后件 對於規則{A}叫作前件,{C}叫作后件。
強關聯規則 大於或等於最小支持度閾值 和 最小置信度閾值 的規則叫做強關聯規則。關聯分析的最終目標就是要找出強關聯規則。

3.2 頻繁項集評估標准

頻繁項集,顧名思義指頻繁出現item項的集合。

如何定義頻繁呢?用比例來判定,常用的頻繁項集的評估標准有支持度,置信度和提升度三個。

  • 支持度:出現的項集在總事務中的占比。以購買記錄為例子,購買記錄4條,如果商品Cola和Beer同時出現2條購買記錄(即同時購買Cola和Beer的記錄有2),那邊Cola和Beer這個2項集的支持度為50%。

  • 置信度:購買Cola的情況下,再購買Beer的概率。

  • 提升度:使用規則后商品出現的次數是否高於商品單獨出現的概率。

提升度體先了X和Y之間的關聯關系, 提升度大於1則X->Y是有效的強關聯規則, 提升度小於等於1則X->Y是無效的強關聯規則 。一個特殊的情況,如果X和Y獨立,則有Lift(X⇐Y)=1,因為此時P(X|Y)=P(X)。

3.3 Aprior算法思想

Apriori算法的目標是找到最大的K項頻繁集,一是滿足最小支持度的頻繁集,二是找到頻繁集的最大個數。

Apriori算法采用了迭代的方法:

  • 先搜索出候選1項集及對應的支持度,剪枝去掉低於支持度的1項集,得到頻繁1項集。

  • 然后對剩下的頻繁1項集進行連接,得到候選的頻繁2項集,篩選去掉低於支持度的候選頻繁2項集,得到真正的頻繁二項集。

  • 以此類推,迭代下去,直到無法找到頻繁k+1項集為止,對應的頻繁k項集的集合即為算法的輸出結果。

圖中有4個記錄,記錄項有1,2,3,4,5若干

  • 首先先找出1項集對應的支持度(C1),可以看出4的支持度25%低於最小支持閾值50%,先剪掉,得到(L1)。

  • 從1項集生成2項集,並計算支持度(C2),可以看出(1,5)(1,2)支持度均為25%低於最小支持閾值,先剪掉,得到(L2)

  • 從2項集生成3項集,(1,2,3)(1,2,5)(2,3,5)只有(2,3,5)滿足要求,至此無法生成新的頻繁項集,算法結束,最終得到3-項頻繁集。

由於Apriori算法在每次計算項集的支持度時需要掃描所有數據集,當數據量較大,數據種類較多時,算法的效率是很低的。

4. Apriori算法應用

基於Sebastian Raschka 提供的非常有用的具有Apriori算法的MLxtend庫。

import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
from mlxtend.preprocessing import TransactionEncoder

df=pd.read_excel(r'C:\Users\Desktop\My_Python\Online Retail.xlsx')
df.head()

####-------------------------------------------
#### 數據清洗
####-------------------------------------------

df['Description'] = df['Description'].str.strip()
df.dropna(axis=0, subset=['InvoiceNo'], inplace=True)
df['InvoiceNo'] = df['InvoiceNo'].astype('str')
df = df[~df['InvoiceNo'].str.contains('C')]
df = df[~(df['Description']=='POSTAGE')]

####-------------------------------------------
#### 對數據進行One-Hot編碼
####-------------------------------------------

# 選取France樣本數據
basket = pd.DataFrame(df[df['Country'] =="France"].groupby(['InvoiceNo', 'Description'])['Quantity'].sum().reset_index()
                      , columns = ['InvoiceNo', 'Description', 'Quantity'])
df_grouped=basket.groupby('InvoiceNo')['Description'].unique().apply(list).reset_index().set_index(['InvoiceNo'])
# df_grouped

# 將數據格式轉換成One-Hot編碼要求格式 a list of lists
basket_list = [df_grouped['Description'][i] for i in range(len(df_grouped['Description']))]

te = TransactionEncoder()
df_tf = te.fit_transform(basket_list)
basket_sets_encoder = pd.DataFrame(df_tf,columns=te.columns_)

# 篩選滿足大於或等於最小支持度0.07的頻繁項集

frequent_itemsets = apriori(basket_sets_encoder, min_support=0.07, use_colnames=True)

frequent_itemsets.sort_values(by='support', ascending=False, inplace=True)
frequent_itemsets

# 選擇2項頻繁項集

frequent_itemsets['length'] = frequent_itemsets.itemsets.apply(lambda x: len(x))
frequent_itemsets[frequent_itemsets['length'] == 2]


# 計算關聯規則

# metric可以有很多的度量選項,返回的表列名都可以作為參數
association_rule = association_rules(frequent_itemsets,metric='confidence',min_threshold=0.5)
 
#關聯規則可以提升度排序
association_rule.sort_values(by='confidence',ascending=False,inplace=True)    
association_rule
# 規則是:antecedents->consequents

對比上圖中的規則發現,購買紙盤、餐巾紙再購買紙杯的confidence為97.5%,lift>1,盡管數據變現很好,但這個規則是在我們的經濟學常識中,那說明這個規則的價值不大,需要再結合業務特點去篩選規則,發現意想不到的策略。

參考來源:

Apriori算法原理總結

【轉載】Python 關聯規則分析

利用Python進行市場購物籃分析——入門篇


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM