Python-關聯分析-從原理到實戰

【導讀】:本篇文章旨在幫助大家熟悉關聯規則算法,並用Python建立模型進行分析。

關聯規則中不得不提的故事

在美國,一些年輕的父親下班後經常要到超市去買嬰兒尿布,超市也因此發現了一個規律,在購買嬰兒尿布的年輕父親們中,有30%~40%的人同時要買一些啤酒。超市隨後調整了貨架的擺放,把尿布和啤酒放在一起,明顯增加了銷售額。
在這裏插入圖片描述
其中若兩個或多個變量的取值之間存在某種規律性,就稱爲關聯。關聯規則是尋找在同一個事件中出現的不同項的相關性,比如在一次購買活動中所買不同商品的相關性。例如:“在購買計算機的顧客中,有30%的人也同時購買了打印機”

故事講完了,來看一看你得知道的基本概念

在這裏插入圖片描述

  • 一個樣本稱爲一個“事務”
  • 每個事務由多個屬性來確定,這裏的屬性稱爲“項”
  • 多個項組成的集合稱爲“項集”

由k個項構成的集合

  • {牛奶}、{啤酒}都是1-項集;
  • {牛奶,果凍}是2-項集;
  • {啤酒,麪包,牛奶}是3-項集

X==>Y含義:

  • X和Y是項集
  • X稱爲規則前項(antecedent)
  • Y稱爲規則後項(consequent)

事務僅包含其涉及到的項目,而不包含項目的具體信息。

  • 在超級市場的關聯規則挖掘問題中事務是顧客一次購物所購買的商品,但事務中並不包含這些商品的具體信息,如商品的數量、價格等。

支持度(support):一個項集或者規則在所有事務中出現的頻率,σ(X):表示項集X的支持度計數

  • 項集X的支持度:s(X)=σ(X)/N
  • 規則X==>Y表示物品集X對物品集Y的支持度,也就是物品集X和物品集Y同時出現的概率
  • 某天共有100個顧客到商場購買物品,其中有30個顧客同時購買了啤酒和尿布,那麼上述的關聯規則的支持度就是30%

置信度(confidence):確定Y在包含X的事務中出現的頻繁程度。c(X → Y) = σ(X∪Y)/σ(X)

  • p(Y│X)=p(XY)/p(X)。
  • 置信度反應了關聯規則的可信度—購買了項目集X中的商品的顧客同時也購買了Y中商品的可能性有多大
  • 購買薯片的顧客中有50%的人購買了可樂,則置信度爲50%

在這裏插入圖片描述

(X , Y)==>Z :

  • 支持度:交易中包含{X 、 Y 、 Z}的可能性

  • 置信度:包含{X 、 Y}的交易中也包含Z的條件概率

設最小支持度爲50%, 最小可信度爲 50%, 則可得到 :

  • A==>C (50%, 66.6%)
  • C==>A (50%, 100%)

若關聯規則X->Y的支持度和置信度分別大於或等於用戶指定的最小支持率minsupport和最小置信度minconfidence,則稱關聯規則X->Y爲強關聯規則,否則稱關聯規則X->Y爲弱關聯規則。

提升度(lift):物品集A的出現對物品集B的出現概率發生了多大的變化

  • lift(A==>B)=confidence(A==>B)/support(B)=p(B|A)/p(B)
  • 現在有** 1000 ** 個消費者,有** 500** 人購買了茶葉,其中有** 450人同時** 購買了咖啡,另** 50人** 沒有。由於** confidence(茶葉=>咖啡)=450/500=90%** ,由此可能會認爲喜歡喝茶的人往往喜歡喝咖啡。但如果另外沒有購買茶葉的** 500人** ,其中同樣有** 450人** 購買了咖啡,同樣是很高的** 置信度90%** ,由此,得到不愛喝茶的也愛喝咖啡。這樣看來,其實是否購買咖啡,與有沒有購買茶葉並沒有關聯,兩者是相互獨立的,其** 提升度90%/[(450+450)/1000]=1** 。

由此可見,lift正是彌補了confidence的這一缺陷,if lift=1,X與Y獨立,X對Y出現的可能性沒有提升作用,其值越大(lift>1),則表明X對Y的提升程度越大,也表明關聯性越強。

在這裏插入圖片描述

Leverage 與 Conviction的作用和lift類似,都是值越大代表越關聯

  • Leverage : P(A,B)-P(A)P(B)
  • Conviction:P(A)P(!B)/P(A,!B)

概念搞定之後,來看一看怎麼用Python玩玩關聯規則

使用mlxtend工具包得出頻繁項集與規則

  • pip install mlxtend
import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules

自定義一份購物數據集

data = {'ID':[1,2,3,4,5,6],
       'Onion':[1,0,0,1,1,1],
       'Potato':[1,1,0,1,1,1],
       'Burger':[1,1,0,0,1,1],
       'Milk':[0,1,1,1,0,1],
       'Beer':[0,0,1,0,1,0]}
df = pd.DataFrame(data)
df = df[['ID', 'Onion', 'Potato', 'Burger', 'Milk', 'Beer' ]]

在這裏插入圖片描述

設置支持度 (support) 來選擇頻繁項集.

  • 選擇最小支持度爲50%

  • apriori(df, min_support=0.5, use_colnames=True)

frequent_itemsets = apriori(df[['Onion', 'Potato', 'Burger', 'Milk', 'Beer' ]], min_support=0.50, use_colnames=True)

在這裏插入圖片描述
返回的3種項集均是支持度>=50%

計算規則

  • association_rules(df, metric='lift', min_threshold=1)
  • 可以指定不同的衡量標準與最小閾值
rules = association_rules(frequent_itemsets, metric='lift', min_threshold=1)

在這裏插入圖片描述
返回的是各個的指標的數值,可以按照感興趣的指標排序觀察,但具體解釋還得參考實際數據的含義。

rules [ (rules['lift'] >1.125)  & (rules['confidence']> 0.8)  ]

在這裏插入圖片描述
這幾條結果就比較有價值了:

  • (洋蔥和馬鈴薯)(漢堡和馬鈴薯)可以搭配着來賣
  • 如果洋蔥和漢堡都在購物籃中, 顧客買馬鈴薯的可能性也比較高,如果他籃子裏面沒有,可以推薦一下.

所有指標的計算公式:

在這裏插入圖片描述

再來加載一份商品數據集

此處需要大家注意如何進行數據預處理,使用工具包一定得按照人家要求來纔可以!

retail_shopping_basket = {'ID':[1,2,3,4,5,6],
                         'Basket':[['Beer', 'Diaper', 'Pretzels', 'Chips', 'Aspirin'],
                                   ['Diaper', 'Beer', 'Chips', 'Lotion', 'Juice', 'BabyFood', 'Milk'],
                                   ['Soda', 'Chips', 'Milk'],
                                   ['Soup', 'Beer', 'Diaper', 'Milk', 'IceCream'],
                                   ['Soda', 'Coffee', 'Milk', 'Bread'],
                                   ['Beer', 'Chips']
                                  ]
                         }
retail = pd.DataFrame(retail_shopping_basket)
retail = retail[['ID', 'Basket']]
pd.options.display.max_colwidth=100

在這裏插入圖片描述
數據集中都是字符串組成的,需要轉換成數值編碼

retail_id = retail.drop('Basket' ,1)

在這裏插入圖片描述

retail_Basket = retail.Basket.str.join(',')

在這裏插入圖片描述

retail_Basket = retail_Basket.str.get_dummies(',')

在這裏插入圖片描述

retail = retail_id.join(retail_Basket)

在這裏插入圖片描述

frequent_itemsets_2 = apriori(retail.drop('ID',1), use_colnames=True)

在這裏插入圖片描述
如果光考慮支持度support(X>Y), [Beer, Chips] 和 [Beer, Diaper] 都是很頻繁的,哪一種組合更相關呢?

association_rules(frequent_itemsets_2, metric='lift')

在這裏插入圖片描述
顯然{Diaper, Beer}更相關一些

電影數據集關聯分析

movies = pd.read_csv('ml-latest-small/movies.csv')
movies.head(10)

在這裏插入圖片描述
數據中包括電影名字與電影類型的標籤,第一步還是先轉換成one-hot格式

movies_ohe = movies.drop('genres',1).join(movies.genres.str.get_dummies())
pd.options.display.max_columns=100
movies_ohe.head()

在這裏插入圖片描述

movies_ohe.shape

(9125, 22)
數據集包括9125部電影,一共有22種不同類型

movies_ohe.set_index(['movieId','title'],inplace=True)
movies_ohe.head()

在這裏插入圖片描述

frequent_itemsets_movies = apriori(movies_ohe,use_colnames=True, min_support=0.025)

在這裏插入圖片描述

rules_movies =  association_rules(frequent_itemsets_movies, metric='lift', min_threshold=1.25)

在這裏插入圖片描述

rules_movies[(rules_movies.lift>4)].sort_values(by=['lift'], ascending=False)

在這裏插入圖片描述
Children和Animation 這倆題材是最相關的了,常識也可以分辨出來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章