【實(shí)戰(zhàn)案例9】商品推薦算法(1)

本篇分享適用于中小電商平臺的商品推薦算法芝雪,理論與實(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ù)用戶已知的信息船老,推測出用戶可能感興趣的商品咖熟。
用戶+已知商品\implies推測一個未知的商品

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)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碑定,一起剝皮案震驚了整個濱河市流码,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌延刘,老刑警劉巖漫试,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異碘赖,居然都是意外死亡驾荣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門普泡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秘车,“玉大人,你說我怎么就攤上這事劫哼。” “怎么了割笙?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵权烧,是天一觀的道長。 經(jīng)常有香客問我伤溉,道長般码,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任乱顾,我火速辦了婚禮板祝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘走净。我一直安慰自己券时,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布伏伯。 她就那樣靜靜地躺著橘洞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪说搅。 梳的紋絲不亂的頭發(fā)上炸枣,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼适肠。 笑死霍衫,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的侯养。 我是一名探鬼主播敦跌,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沸毁!你這毒婦竟也來了峰髓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤息尺,失蹤者是張志新(化名)和其女友劉穎携兵,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搂誉,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡徐紧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了炭懊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片并级。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖侮腹,靈堂內(nèi)的尸體忽然破棺而出嘲碧,到底是詐尸還是另有隱情,我是刑警寧澤父阻,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布愈涩,位于F島的核電站,受9級特大地震影響加矛,放射性物質(zhì)發(fā)生泄漏履婉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一斟览、第九天 我趴在偏房一處隱蔽的房頂上張望毁腿。 院中可真熱鬧,春花似錦苛茂、人聲如沸已烤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽草戈。三九已至,卻和暖如春侍瑟,著一層夾襖步出監(jiān)牢的瞬間唐片,已是汗流浹背丙猬。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留费韭,地道東北人茧球。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像星持,于是被迫代替她去往敵國和親抢埋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容