本篇分享適用于中小電商平臺的商品推薦算法芝雪,理論與實(shí)踐結(jié)合出發(fā)>>>
認(rèn)真讀完本篇,你會收獲:
1. 為什么各個電商平臺都熱衷于做個性化商品推薦综苔?
2. 常見的商品推薦場景有哪些惩系?以及實(shí)踐中的項(xiàng)目流程。
3. 一個完整的商品詳情頁實(shí)戰(zhàn)案例休里,零基礎(chǔ)也可以寫推薦算法蛆挫。
一、為什么各個電商平臺都熱衷于做個性化商品推薦妙黍?
一句話:能增加收入悴侵。
分析這個問題要從電商銷售額構(gòu)成來講:GMV=流量*轉(zhuǎn)化率
先來看圖中這4款飲品,你喜歡藍(lán)色清新A拭嫁,還是抹茶口味B可免,或是焦糖濃郁D抓于?也可以問一問身邊的朋友更喜歡哪款?你們喜歡的是否是同一款浇借?
這里我想表達(dá)的是:對于不同的顧客捉撮,偏好的飲品是不同的,如果來到店里的每位客人我們都推薦飲品A妇垢,那么喜歡飲品D的客人可能會認(rèn)為這家店過于清淡不太適合自己巾遭。為了實(shí)現(xiàn)轉(zhuǎn)化率/銷售額的最大化,需要做好顧客與商品的匹配關(guān)系闯估。
所幸電商的數(shù)據(jù)積累以及店鋪商品呈現(xiàn)灼舍,給這個想法提供了極佳的實(shí)現(xiàn)條件。
二涨薪、商品推薦場景+實(shí)操流程
1. 商品推薦場景
1>按照購物流程劃分骑素,有四種常見推薦位置:首頁瀑布流推薦、商品詳情頁推薦刚夺、購物車推薦献丑、結(jié)算頁滿額加購?fù)扑]。
(用戶搜索關(guān)鍵詞的商品結(jié)果排序不在此處展開討論)
2>按照用戶的購買場景劃分:有明確購物需求的搜索侠姑、直奔某品類创橄、隨便逛逛、比價(jià)结借、送禮等筐摘。
ps:如有更好的場景劃分方法,歡迎留言哦~
2. 常用商品推薦邏輯
1> 推薦的目標(biāo):根據(jù)用戶已知的信息船老,推測出用戶可能感興趣的商品咖熟。
2> 分析達(dá)到目標(biāo)的路徑(解題):
如下圖:如何將商品A2與用戶1建立聯(lián)系?
兩種途徑:建立用戶1與用戶2之間的關(guān)系1柳畔,建立商品A1與商品A2之間的關(guān)系2
3> 尋找解題線索:
從數(shù)據(jù)源頭出發(fā)馍管,電商最常見的數(shù)據(jù)分為兩類:
a)用戶在商城內(nèi)的行為數(shù)據(jù),如瀏覽薪韩、訪問确沸、停留時長等;
b)用戶的下單支付數(shù)據(jù)俘陷。
基于這兩類數(shù)據(jù)罗捎,可以分析用戶相似度、購物籃商品關(guān)聯(lián)度...
4> 如何建立關(guān)系1 or 關(guān)系2拉盾?
關(guān)系1:通過將用戶在商品的行為數(shù)值化為一個N維向量桨菜,計(jì)算兩兩向量之間的夾角余弦值,來評估他們的相似度,又稱為余弦相似性倒得。
(余弦值區(qū)間[-1,1]泻红,0度角的余弦值是1,夾角越小用戶行為越相似)
用戶行為轉(zhuǎn)化為N維向量數(shù)據(jù)結(jié)構(gòu)示例:
兩個向量的余弦相似性計(jì)算公式:
接下來以每個用戶為中心霞掺,分別計(jì)算與其他n-1個用戶的余弦相似度谊路,需要n(n-1)次計(jì)算;
假設(shè)n=10000菩彬,計(jì)算99990000次缠劝,計(jì)算機(jī)每秒計(jì)算100次,更新一次全量用戶的相似性需要11.6天骗灶;
可以看出這個計(jì)算量非常大且耗時剩彬,以及無法滿足商業(yè)環(huán)境中的實(shí)時反饋要求,因此在真實(shí)環(huán)境中幾乎不采用這種推薦路徑矿卑。
關(guān)系2:通過將每個用戶在商品上的操作作為一個購物籃,計(jì)算每兩件商品出現(xiàn)在用一個購物籃的幾率沃饶,來判斷商品A與商品B之間的相似性/關(guān)聯(lián)度母廷。在本篇第三部分實(shí)戰(zhàn)案例中,會對此方法進(jìn)行詳細(xì)介紹糊肤。
3. 實(shí)踐中的項(xiàng)目流程
很多情況下琴昆,數(shù)據(jù)分析是一個相對獨(dú)立且單線程工作的崗位,接收需求處理需求馆揉。當(dāng)涉及到影響商城業(yè)務(wù)時业舍,需要多團(tuán)隊(duì)合作,流程上的合作方/環(huán)節(jié)越多升酣,出錯的幾率也會越大舷暮,這時候需要承擔(dān)起項(xiàng)目經(jīng)理的角色,更加細(xì)致認(rèn)真得排查可能出現(xiàn)的問題噩茄。(ps:遇事不抓狂下面,有話好好說)
流程這里不啰嗦啦,簡單概括:
1>數(shù)據(jù)調(diào)研------>>>為什么要做這件事绩聘?
2>立項(xiàng)------>>>確定要做這件事沥割,準(zhǔn)備怎么做?(需要哪些人分別負(fù)責(zé)什么凿菩?)
3>算法準(zhǔn)備------>>>確認(rèn)商品推薦的邏輯
4>功能開發(fā)------>>>商城功能是否支持個性化推薦机杜?
5>部署測試------>>>測試環(huán)境中是否邏輯流暢?顯示正常衅谷?
6>功能上線------>>>上線前的數(shù)據(jù)監(jiān)控準(zhǔn)備
7>結(jié)果數(shù)據(jù)&結(jié)論------>>>項(xiàng)目的結(jié)果反饋
三椒拗、實(shí)戰(zhàn)案例
以商品詳情頁推薦為例,介紹相對簡單的中心商品推薦邏輯会喝。
1. 提出可以提升轉(zhuǎn)化率的“假設(shè)”
2. 驗(yàn)證假設(shè)的方法
3. AB測試的用戶分組邏輯
4. 測試時長
5. 推薦算法:從數(shù)據(jù)源到商品關(guān)系的代碼實(shí)現(xiàn)
6. 測試結(jié)果
【1. 提出假設(shè)】
假設(shè)在商品詳情頁推薦用戶數(shù)據(jù)歸類出的相似商品陡叠,可以比運(yùn)營人員根據(jù)經(jīng)驗(yàn)設(shè)置熱銷品玩郊,更符合用戶興趣,推薦商品的點(diǎn)擊率更高(從而提高加車轉(zhuǎn)化率)枉阵。
【2. 驗(yàn)證假設(shè)的方法】
采用AB測試(控制變量法)译红,將用戶隨機(jī)分為AB兩組,僅在商品推薦區(qū)域有差異(如下圖)兴溜,對比推薦商品的點(diǎn)擊率侦厚,驗(yàn)證是否B組的點(diǎn)擊率更高。
【3. AB測試的用戶分組邏輯】
一般情況下用戶ID為數(shù)值格式拙徽,可以將customer_id除以2取余數(shù)即可實(shí)現(xiàn)分組刨沦,余數(shù)=0為A組(人工根據(jù)經(jīng)驗(yàn)推薦),余數(shù)=1為B組(用戶行為數(shù)據(jù)推薦)膘怕。(若分3組想诅,余數(shù)分別為0-1-2,以此類推)
【4. 測試時長】
我們的業(yè)務(wù)屬于飲品類岛心,1-7天為一個購買周期来破,因此實(shí)驗(yàn)周期選擇了2天。(可以根據(jù)業(yè)務(wù)的屬性靈活調(diào)整)
【5. 推薦算法:從數(shù)據(jù)源到商品關(guān)系的代碼實(shí)現(xiàn)】
1> 數(shù)據(jù)源示例(選取每個用戶近期點(diǎn)擊的商品數(shù)據(jù)忘古,表名:data_click)
2> 計(jì)算商品之間的關(guān)聯(lián)度
# 這里給出的是R語言code徘禁,使用Python/SQL的同學(xué)可以參考邏輯(代碼邏輯都是類似的)
# 目標(biāo):計(jì)算每兩個商品被多少個用戶同時購買
data01<-sqldf('select d1.cust_id,d1.prod_name as prod01,d2.prod_name as prod02
? ? ? ? ? ? ? ? ? ? ? ? from data_click as d1 join data_click as d2
? ? ? ? ? ? ? ? ? ? ? ? on d1.cust_id=d2.cust_id
? ? ? ? ? ? ? ? ? ? ? ? where d1.prod_name<>d2.prod_name',drv = 'SQLite')
data02<-sqldf('select prod01,prod02,count(distinct cust_id) as custs_union
? ? ? ? ? ? ? ? ? ? ? ? from data01
? ? ? ? ? ? ? ? ? ? ? ? group by prod01,prod02',drv = 'SQLite')
data02數(shù)據(jù)示例:
3> 商品關(guān)聯(lián)度排序
在實(shí)際數(shù)據(jù)中會遇到熱銷商品與幾乎每一個商品的關(guān)聯(lián)度都在排前幾位;
如果每個商品的推薦列表都是熱銷的飲品髓堪,就會暢銷商品更加暢銷送朱,滯銷商品更加沒有曝光機(jī)會,顧客可能會認(rèn)為店里就這樣幾款商品干旁,導(dǎo)致購買商品數(shù)減少驶沼,頻次降低,因此我們需要做一個降低主商品與熱門物品相似的計(jì)算步驟疤孕,給長尾商品更多的曝光機(jī)會商乎。
# 每個商品點(diǎn)擊的用戶總數(shù)
data03<-sqldf('select prod_name,count(distinct cust_id) as cust_all from data_click group by prod_name',drv = 'SQLite')
# 匹配每個商品的點(diǎn)擊用戶總數(shù)到商品關(guān)聯(lián)關(guān)系表data02
res<-merge(data02,data03,by.x = 'prod01',by.y = 'prod_name',all.x = TRUE)
res<-merge(res,data03,by.x = 'prod02',by.y = 'prod_name',all.x = TRUE)
res<-subset(res,select = c('prod01','prod02','custs_union','cust_all.x','cust_all.y'))
# 降低主商品與熱門物品相似,計(jì)算關(guān)聯(lián)系數(shù)rate_cust
res$cust_all<-sqrt(res$cust_all.x*res$cust_all.y)
res$rate_cust<-res$custs_union/res$cust_all
# 篩選兩兩商品關(guān)聯(lián)人數(shù)≥100(表示是強(qiáng)關(guān)聯(lián)祭阀,可以根據(jù)業(yè)務(wù)來靈活調(diào)整參數(shù))
res<-subset(res,custs_union>=100)
# 以中心商品prod01鹉戚,降序排名關(guān)聯(lián)系數(shù)rate_cust
res<-res%>%group_by(prod01)%>%mutate(rn=rank(-rate_cust))
res數(shù)據(jù)示例:
得到上圖所示的商品關(guān)聯(lián)關(guān)系后,就可以在每個中心商品(prod01)的推薦位展示Top6(rn≤6)的關(guān)聯(lián)商品(prod02)啦专控!~
【6. 測試結(jié)果】
測試6.3上線抹凳,立即有顯著變化:人均點(diǎn)擊商品數(shù)從1.5個提升到1.7個,點(diǎn)擊率從10.6%提升到12.6%伦腐;
再觀測一天赢底,數(shù)據(jù)較為穩(wěn)定,從6.5開始全部調(diào)整為數(shù)據(jù)推薦。
(ps:有些業(yè)務(wù)場景會要求提前估算最小樣本量以及測試結(jié)果的顯著性檢驗(yàn)幸冻,個人認(rèn)為是有些概念學(xué)術(shù)化粹庞,在實(shí)際項(xiàng)目操作中較少遇到。)
以上就是本篇的全部內(nèi)容啦洽损,如果有任何疑問庞溜,歡迎私信小編~
基于用戶的商品推薦,請關(guān)注>>>【實(shí)戰(zhàn)案例9】商品推薦算法(2)