1. 程式人生 > 其它 >python-關聯規則

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}, {Cola Egg}
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。
強關聯規則 大於或等於最小支援度閾值 和 最小置信度閾值 的規則叫做強關聯規則。關聯分析的最終目標就是要找出強關聯規則。

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='lift',ascending=False,inplace=True)    
association_rule
# 規則是:antecedents->consequents

參考來源:

Apriori演算法原理總結

【轉載】Python 關聯規則分析

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