本文的代碼與數(shù)據(jù)可在公眾號(hào) “ 數(shù)據(jù)分析與商業(yè)實(shí)踐 ” 后臺(tái)回復(fù) “ 0716 ” 獲取,更多商業(yè)實(shí)踐案例等你來撩
“ 推薦系統(tǒng)將成為未來十年里最重要的變革肾扰,社會(huì)化網(wǎng)站將由推薦系統(tǒng)所驅(qū)動(dòng) ” --- John Riedl明尼蘇達(dá)大學(xué)教授
前言
智能推薦和泛的營(yíng)銷完全不同蜓氨,后者是將產(chǎn)品賣給客戶作為最終目標(biāo)月杉;而智能推薦是以“客戶需求”為導(dǎo)向的盗痒,是給客戶帶來價(jià)值的横漏。常見的如淘寶的 “你可能還喜歡”谨设,亞馬遜的 “購買此商品的用戶也購買了” 便是實(shí)例。本文就將詳細(xì)介紹如何用Python實(shí)現(xiàn)智能推薦算法缎浇,主要將分為兩個(gè)部分:
- 詳細(xì)原理介紹
- Python代碼實(shí)戰(zhàn)
常見的推薦系統(tǒng)與算法
常見的推薦系統(tǒng)分類有:
基于應(yīng)用領(lǐng)域: 電子商務(wù)/社交好友推薦等
基于設(shè)計(jì)思想: 基于協(xié)同過濾的推薦等
-
基于使用數(shù)據(jù): 基于用戶標(biāo)簽的推薦等
上圖為 “ 京騰 ” 合作構(gòu)建用戶畫像標(biāo)簽圖
常見的推薦算法有:
本文將專注于理解起來最容易且又十分經(jīng)典常用的基于關(guān)聯(lián)規(guī)則的購物籃推薦扎拣。商品的關(guān)聯(lián)度分析對(duì)于提高商品的活力、挖掘消費(fèi)者的購買力素跺、促進(jìn)最大化銷售有很大幫助二蓝。其建模理念為:物品被同時(shí)購買的模式反映了客戶的需求模式,適用場(chǎng)景:無需個(gè)性化定制的場(chǎng)景指厌;有銷售記錄的產(chǎn)品刊愚,向老客戶推薦;套餐設(shè)計(jì)與產(chǎn)品擺放踩验。
購物籃簡(jiǎn)介
問:什么是購物籃鸥诽?主要運(yùn)用在什么場(chǎng)景?
答:?jiǎn)蝹€(gè)客戶一次購買商品的綜合稱為一個(gè)購物籃箕憾,即某個(gè)客戶本次的消費(fèi)小票牡借。常用場(chǎng)景:超市貨架布局:互補(bǔ)品與互斥品;套餐設(shè)計(jì)袭异。
問:購物籃的常用算法钠龙?
答:常用算法有
- 不考慮購物順序:關(guān)聯(lián)規(guī)則。購物籃分析其實(shí)就是一個(gè)因果分析御铃。關(guān)聯(lián)規(guī)則其實(shí)是一個(gè)很方便的發(fā)現(xiàn)兩樣商品關(guān)系的算法碴里。共同提升的關(guān)系表示兩者是正相關(guān),可以作為互補(bǔ)品畅买,如豆瓣醬和蔥一起賣也才是最棒的并闲。替代品的概念便是我買了這個(gè)就不用買另外一個(gè)。
- 考慮購物順序:序貫?zāi)P?/strong>谷羞。多在電商中使用帝火,比如今天你將這個(gè)商品加入了購物車,過幾天又將另一個(gè)商品加入了購物車湃缎,這就有了一個(gè)前后順序犀填。但許多實(shí)體商店因?yàn)闆]有實(shí)名認(rèn)證,所以無法記錄用戶的消費(fèi)順序嗓违。
問:求出互補(bǔ)品與互斥品后對(duì)布局有什么用九巡?
答:根據(jù)關(guān)聯(lián)規(guī)則求出的商品間的關(guān)聯(lián)關(guān)系后,可能會(huì)發(fā)現(xiàn)商品間存在強(qiáng)關(guān)聯(lián)蹂季,弱關(guān)聯(lián)與排斥三種關(guān)系冕广。每種清醒有各自對(duì)應(yīng)的布局方式疏日。
- 強(qiáng)關(guān)聯(lián):關(guān)聯(lián)度的值需要視實(shí)際情況而定,在不同的行業(yè)不同的也業(yè)態(tài)是不同的撒汉。強(qiáng)關(guān)聯(lián)的商品彼此陳列在一起會(huì)提高雙方的銷售量沟优。雙向關(guān)聯(lián)的商品如果陳列位置允許的話應(yīng)該相關(guān)聯(lián)陳列,即A產(chǎn)品旁邊有B睬辐,B產(chǎn)品邊上也一定會(huì)有A挠阁,比如常見的剃須膏與剃須刀,男士發(fā)油與定型梳溯饵;而對(duì)于那些單向關(guān)聯(lián)的商品侵俗,只需要被關(guān)聯(lián)的商品陳列在關(guān)聯(lián)商品旁邊就行,如大瓶可樂旁邊擺紙杯丰刊,而紙杯旁邊則不擺大瓶可樂隘谣,畢竟買大可樂的消費(fèi)者大概率需要紙杯,而購買紙杯的顧客再購買大可樂的概率不大藻三。
- 弱關(guān)聯(lián):關(guān)聯(lián)度不高的商品洪橘,可以嘗試擺在一起,然后再分析關(guān)聯(lián)度是否有變化棵帽,如果關(guān)聯(lián)度大幅提高熄求,則說明原來的弱關(guān)聯(lián)有可能是陳列的原因造成的。
- 排斥關(guān)系:指兩個(gè)產(chǎn)品基本上不會(huì)出現(xiàn)在同一張購物小票中逗概,這種商品盡量不要陳列在一起弟晚。
根據(jù)購物籃的信息來進(jìn)行商品關(guān)聯(lián)度的分析不僅僅只有如上三種關(guān)系,它們僅代表商品關(guān)聯(lián)度分析的一個(gè)方面(可信度)逾苫。全面系統(tǒng)的商品關(guān)聯(lián)分析必須有三度的概念卿城,三度包括支持度,可信度和提升度铅搓。
關(guān)聯(lián)規(guī)則
直接根據(jù)關(guān)聯(lián)三度所定義的概念去理解會(huì)有不少難度瑟押,尤其是可信度喝提升度中的“ 誰對(duì)誰 ”的問題。其實(shí)可以換一種方式來看:
- 規(guī)則 X 的支持度 = 規(guī)則 X 的交易次數(shù) / 交易的總數(shù)星掰。理解:支持度表示規(guī)則 X 是否普遍多望。
-
規(guī)則 X(A→B) 的置信度 = 規(guī)則 X 的交易次數(shù)/規(guī)則X中商品B 的交易次數(shù)。理解:置信度是一種條件概率氢烘,表示購買了A產(chǎn)品的客戶再購買B產(chǎn)品的概率怀偷。
為方便理解這些規(guī)則,我們通過下面五個(gè)購物籃的例子來練習(xí)一下
不難發(fā)現(xiàn)播玖,支持度的分母都是5椎工,也就是購物籃的數(shù)量,分子則是選取這個(gè)規(guī)則中的所有商品同時(shí)出現(xiàn)在一個(gè)籃子的次數(shù)。以A->D為例维蒙,同時(shí)包含A和D的籃子有2個(gè)掰吕,總的交易數(shù)量(籃子總數(shù))有5個(gè),所以規(guī)則A->D的支持度為2/5木西;有商品 A 的籃子個(gè)數(shù)為3畴栖,在這三個(gè)籃子中,其中2個(gè)籃子又包含商品D八千,所以該規(guī)則的置信度(可信度)為2/3。有關(guān)關(guān)聯(lián)規(guī)則燎猛,還有以下兩個(gè)問題想補(bǔ)充:
問: 僅看支持度和置信度是否靠譜?
答: 看一個(gè)案例:食堂賣飯恋捆,1000份打飯記錄中,買米飯的有800人次重绷,買牛肉的有600人次沸停,兩個(gè)共同買的有400人次,那么可以得出對(duì)于規(guī)則(牛肉 - > 米飯)Support=P(牛肉&米飯)= 400/1000=0.40; Confidence=P(米飯|牛肉)=400/600=0.67 置信度 和 支持度 都很高昭卓,但是給買牛肉的人推薦米飯有意義嗎愤钾?顯然是沒有任何意義的。因?yàn)闊o任何條件下用戶購買米飯的概率:P(米飯)=800/1000=0.8候醒,都已經(jīng)大過買了牛肉的前提下再買米飯的概率 0.67能颁,畢竟米飯本來就比牛肉要暢銷啊。
這個(gè)案例便引出了提升度的概念:提升度 = 置信度/無條件概率 =0.67/0.8倒淫。規(guī)則 X(A→B) 的提升度為 n 時(shí):向購買了 A 的客戶推薦 B 的話伙菊,這個(gè)客戶購買 B 的概率是 TA 自然而然購買 B 的 n × 100% 左右。生活理解:消費(fèi)者平時(shí)較少單獨(dú)購買桌角防撞海綿敌土,可能偶爾想到或自己小孩碰到的時(shí)候才會(huì)想起購買镜硕,如果我們?cè)谧雷?書桌飯桌)的成功下單頁面添加桌角防撞海綿的推薦,則很大程度上可以提高防撞海綿的銷量返干。這也符合我們希望 "通過暢銷商品帶動(dòng)相對(duì)非暢銷商品" 的宗旨兴枯。
問:除了公式的含義,關(guān)聯(lián)三度(支持度矩欠,置信度财剖,提升度)還有什么關(guān)聯(lián)嗎?
答: 可以這樣理解:
- 支持度代表這組關(guān)聯(lián)商品的份額是否夠大
- 置信度(可信度)代表關(guān)聯(lián)度的強(qiáng)弱
- 而提升度則是看該關(guān)聯(lián)規(guī)則是否有利用價(jià)值和值得推廣晚顷,用了(客戶購買后推薦)比沒用(客戶自然而然的購買)要提高多少峰伙。
所以 1.0 是提升度的一個(gè)分界值,剛才的買飯案例中給買了牛肉的用戶推薦米飯的這種騷操作的提升度小于 1 也就不難理解了该默。另外瞳氓,高置信度的兩個(gè)商品(假設(shè)達(dá)到了 100%,意味著它們總是成雙成對(duì)的出現(xiàn)),但如果支持度很低(意味著份額低)匣摘,那它對(duì)整體銷售提升的幫助也不會(huì)大店诗。
基于Apriori 算法的Python實(shí)戰(zhàn)
由于有關(guān)Apriori等算法的研究已經(jīng)很成熟,我們?cè)谟肞ython實(shí)戰(zhàn)時(shí)無需一步一步計(jì)算音榜,直接調(diào)用現(xiàn)有函數(shù)即可庞瘸,主要是要明白背后的原理與不同算法的使用場(chǎng)景與優(yōu)劣比較。
探索性分析
首先導(dǎo)入相關(guān)庫并進(jìn)行數(shù)據(jù)探索性分析
import pandas as pd
import numpy as np
df = pd.read_csv('bike_data.csv', encoding='gbk')
df.info(); df.head()
數(shù)據(jù)參數(shù)解釋
- OrderNumber:客戶昵稱
- LineNumber:購買順序赠叼,如前三行分別表示同一個(gè)客戶購買的三樣商品的順序
- Model:商品名
接著來看看商品的種類
print(f"數(shù)據(jù)集中共有{df['Model'].nunique()}種商品")
model_names = df['Model'].unique()
print("商品名分別為:")
# 5 個(gè)為一行顯示
for i in range(0, len(model_names), 5):
print(model_names[i:i+5])
再來看看最暢銷的 15 種商品
再進(jìn)行一些簡(jiǎn)單的可視化
top_15 = grouped.sort_values(by='count', ascending=False).head(15)
plt.figure(figsize=(8, 6))
sns.barplot(data=top_15, x='count', y='Model')
plt.grid(True)
使用 Apriori 算法求解關(guān)聯(lián)規(guī)則
首先生成購物籃擦囊,并將同一個(gè)客戶購買的所有商品放入同一個(gè)購物籃,需要提前使用 pip install Apriori 安裝嘴办,之后我們使用 Apriori 包中的 dataconvert 函數(shù)瞬场,下面是需要傳入的參數(shù)解釋
- arulesdata:數(shù)據(jù)集 -- DataFrame
- tidvar: “分類的索引”,即劃分購物籃的標(biāo)準(zhǔn)涧郊,本案例是根據(jù)客戶 OrderNumber -- object類型
- itemvar:將什么東西放進(jìn)籃子里贯被,本案例是將數(shù)據(jù)集中的商品,就是 Model 列放入籃子 -- object類型
- data_type: 默認(rèn)選擇 'inverted'妆艘,庫中提供的不變
注意:需要注意傳入的參數(shù)類型彤灶,只要對(duì)了,直接套用就不是什么難事
import Apriori as apri
# 需要稍微等待一下
baskets = apri.dataconvert(arulesdata=df, tidvar='OrderNumber',
itemvar='Model', data_type='inverted')
# 返回的購物籃是一個(gè)大列表批旺,大列表中的每一個(gè)小列表表示一個(gè)籃子
# 購物籃個(gè)數(shù)剛好等于數(shù)據(jù)集中的客戶數(shù)量
type(baskets), len(baskets) == df['OrderNumber'].nunique()
# (list, True)
現(xiàn)在查看前五個(gè)購物籃中的物品
現(xiàn)在生成關(guān)聯(lián)規(guī)則幌陕,根據(jù)排列組合,可知這些交易將會(huì)產(chǎn)生 21255×21254÷2 這么多個(gè)關(guān)聯(lián)規(guī)則朱沃。首先就要滿足支持度的要求苞轿,太小則直接被刪去,支持度的大小可根據(jù)關(guān)聯(lián)規(guī)則的多少調(diào)整 如果關(guān)聯(lián)規(guī)則很少逗物,可根據(jù)實(shí)際情況放寬支持度的要求搬卒。相關(guān)參數(shù)說明:
- + minSupport:最小支持度閾值
- + minConf:最小置信度閾值
- + minlen:規(guī)則最小長(zhǎng)度
- + maxlen:規(guī)則最大長(zhǎng)度,一般2就夠了
這里翎卓,minSupport 或 minConf 設(shè)定越低契邀,產(chǎn)生的規(guī)則越多,計(jì)算量也就越大
結(jié)果說明: 以 result 第一行為例
- + lhs: 被稱為左手規(guī)則失暴,通俗理解即用戶購買的商品 - 山地車內(nèi)胎
- + rhs: 被稱為右手規(guī)則坯门,通俗理解即根據(jù)用戶購買某商品來推薦的另一件商品 - ll山地胎
- + support: 支持度,山地車內(nèi)胎 和 ll山地胎 同時(shí)出現(xiàn)在一張購物小票中的概率
- + confidence: 置信度逗扒,購買了 山地車內(nèi)胎 的前提下古戴,同時(shí)購買 ll山地胎 的概率
- + lift:向購買了 山地車內(nèi)胎 的客戶推薦 ll山地胎 的話,這個(gè)客戶購買 ll山地胎 的概率是這個(gè)客戶自然而然購買 ll山地胎 的 400% 左右矩肩,即高了300% 多现恼!
現(xiàn)在我們篩選互補(bǔ)品和互斥品,代碼如下
# 互補(bǔ)品
# lift 提升度首先要大于1,然后再排序選擇自己希望深究的前 n 個(gè)
hubu = result[result['lift'] > 1].sort_values(by='lift',
ascending=False).head(20)
# 互斥品
huchi = result[result['lift'] < 1].sort_values(by='lift',
ascending=True).head(20)
hubu.head(5) # 結(jié)果也合情合理
對(duì)結(jié)果簡(jiǎn)單分析一些叉袍,不要期望每個(gè)規(guī)則都有意義始锚,要結(jié)合業(yè)務(wù)思考,比如競(jìng)速型賽道自行車與運(yùn)動(dòng)水壺互斥實(shí)屬正常喳逛,競(jìng)速講究輕量化瞧捌,還配個(gè)水壺干什么... 比如山地車配一個(gè)競(jìng)速公路車用的運(yùn)動(dòng)型頭盔...互斥產(chǎn)品則是成對(duì)出現(xiàn)的!
根據(jù)關(guān)聯(lián)規(guī)則結(jié)果推薦產(chǎn)品
需要結(jié)合業(yè)務(wù)需求
- 獲得最大營(yíng)銷響應(yīng)度润文?-- 看置信度姐呐,越高越好
- 銷售最大化?-- 看提升度转唉,越高越好
- 用戶未產(chǎn)生消費(fèi)皮钠,我們向其推薦商品?
# 注意數(shù)據(jù)類型赠法,frozenset,需要拆一下
result['lhs'][1], type(result['lhs'][1])
# (frozenset({'山地車內(nèi)胎'}), frozenset)
以獲得最高的營(yíng)銷相應(yīng)率為目標(biāo)
如果一個(gè)新客戶剛剛下單了山地車英騎這個(gè)產(chǎn)品乔夯,如果希望獲得最高的營(yíng)銷響應(yīng)率砖织,那在他付費(fèi)成功頁面上最應(yīng)該推薦什么產(chǎn)品?
目標(biāo):獲得最高的營(yíng)銷響應(yīng)率
以最大化總體銷售額為目標(biāo)
如果一個(gè)新客戶剛下單了山地英騎這個(gè)產(chǎn)品末荐,如果希望最大化提升總體的銷售額侧纯,那么在他付費(fèi)成功的頁面上應(yīng)該推薦什么產(chǎn)品?
目標(biāo):最大化銷售額
再次重申提升度通俗含義:提升度是相對(duì)于自然而然購買而言甲脏,A對(duì)B的提升度為4.0的理解如下:向購買了A的用戶推薦B眶熬,則該用戶購買B的概率是該用戶單獨(dú)(即自然而然的購買)購買B的概率的 400% 向購買了A的用戶推薦B,則該用戶購買B的概率比該用戶單獨(dú)(即自然而然的購買)購買B的概率高300%块请!
用戶并未產(chǎn)生消費(fèi)娜氏,為其推薦某樣商品
最后總結(jié)一下,基于關(guān)聯(lián)規(guī)則的 Apriori 算法是智能推薦領(lǐng)域十分經(jīng)典的應(yīng)用之一墩新,簡(jiǎn)單易上手贸弥。其實(shí)推薦領(lǐng)域的難點(diǎn)不一定在于算法,而在于過大的客戶量與其產(chǎn)生的數(shù)據(jù)海渊,所以一般到了最后用的都是混合推薦绵疲。至于更深層次的序貫?zāi)P团c協(xié)同過濾,幾乎沒有人使用 Python 或 R 來實(shí)現(xiàn)臣疑,大部分都是使用分布式框架如 Spark盔憨,后續(xù)也會(huì)推出相關(guān)文章。
本文的代碼與數(shù)據(jù)可在公眾號(hào) “ 數(shù)據(jù)分析與商業(yè)實(shí)踐 ” 后臺(tái)回復(fù) “ 0716 ” 獲取讯沈,更多商業(yè)實(shí)踐案例等你來撩
[圖片上傳失敗...(image-e0cb63-1595841785136)]
不到70行Python代碼郁岩,輕松玩轉(zhuǎn)決策樹預(yù)測(cè)客戶違約模型(附案例數(shù)據(jù)與代碼)
后續(xù)會(huì)不斷更新常見場(chǎng)景下的 Python 實(shí)踐