電商價值用戶挖掘

覺得可以的話理疙,點個贊呀昌妹!
數(shù)據(jù)來源:https://www.kaggle.com/jihyeseo/online-retail-data-set-from-uci-ml-repo

1莉御、電商面臨的問題

  • (1)哪些產(chǎn)品最受歡迎(訪問量同仆、購買量)

  • (2)哪些用戶是最有價值的用戶(特定時間內(nèi)消費總額最高浑侥,并分析用戶特征)

  • (3)哪些是最忠誠用戶(復購率高兼贸、考慮怎么增加忠誠用戶的消費額)

  • (4)用戶消費習慣分析(哪些產(chǎn)品喜歡一起購買;或者特定購買時間順序)

  • (5)促銷對哪些用戶最有效(用戶活躍度)

2彼硫、電商運營指標

(1)整體運營指標(了解電商運營情況)

  • 月追蹤:銷售數(shù)量炊豪、銷售總額、月均銷售額

  • 周追蹤:銷售數(shù)量拧篮、銷售總額词渤、周均銷售額

  • 效率指標:

  • 客單價=銷售總額/人數(shù)

  • 件單價=銷售總額/銷售總數(shù)

  • 連帶率=銷售總量/成交單數(shù)

  • 退貨指標:退貨金額、退貨數(shù)量串绩、退貨用戶數(shù)

(2)RFM: Receny缺虐、Frequency、Monetary(挖掘價值用戶進行經(jīng)營策略管理)

(3)價值用戶行為指標:(了解價值用戶消費習慣)

  • 銷量最高產(chǎn)品

  • 銷售金額占比最高產(chǎn)品

  • 價值用戶喜歡一起購買的產(chǎn)品

3礁凡、本次分析目的

(1)了解運營情況(分析各項指標了解經(jīng)營效率與發(fā)展趨勢)

(2)RFM模型對用戶進行分級高氮,找出價值用戶進行經(jīng)營策略管理慧妄,

進一步挖掘高價值用戶的消費模式,提出個性化的銷售服務提高價值用戶體驗剪芍,從而提高運營效率和利潤

模塊導入


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

一塞淹、數(shù)據(jù)說明

1、導入數(shù)據(jù)


df = pd.read_excel('Online Retail.xlsx')

2罪裹、字段含義及數(shù)據(jù)量

  • InvoiceNo 541909 單號 object

  • StockCode 541909 產(chǎn)品號 object

  • Description 540455 產(chǎn)品描述 object

  • Quantity 541909 每一筆交易中產(chǎn)品數(shù)量 int64

  • InvoiceDate 541909 交易時間 datetime64[ns]

  • UnitPrice 541909 產(chǎn)品單價 float64

  • CustomerID 406829 客戶ID float64

  • Country 541909 客戶所在國家 object

二饱普、數(shù)據(jù)清洗

1、刪除重復值

如果 八列值相同則刪除


#備份原數(shù)據(jù)
df_copy = df.copy()
df = df.drop_duplicates()

總共刪除5268條數(shù)據(jù)

2坊谁、缺失值處理

刪除用戶id缺失的行


df = df.dropna(subset=['CustomerID'],how=any)

總共刪除135037數(shù)據(jù)

3费彼、一致化處理

時間值處理:增加年、月口芍、周

df['Year'] = pd.DatetimeIndex(df['InvoiceDate']).year
df['Month'] = pd.DatetimeIndex(df['InvoiceDate']).month
df['Week'] = pd.DatetimeIndex(df['InvoiceDate']).dayofweek

4箍铲、異常值處理

Quantity


plt.scatter(range(len(df)),df['Quantity'])

image

購買數(shù)量應該是大于0的,將小于等于0的異常值去除鬓椭。有兩個數(shù)據(jù)的數(shù)量達到了70000觀察可知颠猴。應該也是合理的,因為進一步觀察發(fā)現(xiàn)單價低

df = df[df['Quantity']>0]

刪除了8872個異常值

UnitPrice


plt.scatter(range(len(df)),df['UnitPrice'])

image

商品單價應該大于0

df = df[df['UnitPrice']>0]

刪除40個異常值

原數(shù)據(jù)集的時期是2010-12-1到2011-12-09小染,2011年12月數(shù)據(jù)不滿一個月翘瓮,為了方便分析和討論本次分析選擇數(shù)據(jù)時間為:2010-12-01到2011-11-30,12個月裤翩。


df = df[df['InvoiceDate']<'2011-12-01']

三资盅、描述統(tǒng)計分析

1、運營指標計算

a踊赠、月追蹤指標

(1)每月銷售單數(shù)(單號可能會重復)


df_InvoiceNo = df.drop_duplicates(subset=['InvoiceNo'])
month_InvoiceNo = df_InvoiceNo.groupby(['Year','Month'])['InvoiceNo'].count()

產(chǎn)品單數(shù)旺季集中在9月到11月呵扛,其中11月銷量最高(考慮可能和雙十一等活動有關(guān)),1-2月份為淡季

image

(2)月銷售額

df['Amount'] = df['UnitPrice'] * df['Quantity']
month_amount = df.groupby(['Year','Month'])['Amount'].sum()

image

圖4:銷售總額來講筐带,9-11月份銷售額最高今穿。結(jié)合銷售單數(shù)分析,11月份銷售單數(shù)比9月和10月都高30%左右伦籍,而總銷售額卻只高了10%左右蓝晒。由此可見11月份有可能進行降價促銷,因此整體表現(xiàn)而言10月份較好帖鸦。

其他幾個月份銷售額都在60000左右芝薇。1月份銷售量最低,但是銷售總額依舊表現(xiàn)良好作儿∈T铮可以進一步分析1月份銷售產(chǎn)品,比如說是否漲價,與2月份的銷售產(chǎn)品進行比較(因為2月份與1月份銷量差不多灭红,但是銷售額卻差了100000左右)。從而分析產(chǎn)品漲價與降價對整體銷售額的影響口注。

(3)月均銷售額

month_amount_avg = month_amount.sum()/12

月均銷售額為697501.5变擒,可見9-11月份的銷售總額遠高于月均水平

b、周追蹤指標

(1)每周銷售單數(shù)

week_InvoiceNo = df_InvoiceNo.groupby('Week')['InvoiceNo'].count()

image

給的數(shù)據(jù)中沒有周六的單數(shù),從單數(shù)來看周二到周四銷量較多,其中周四的訂單量將近周日的兩倍伞广∈∮校可能在周四有某些日子購買了大量的單數(shù)。

image

但是進一步分析每月每周的統(tǒng)計結(jié)果來看重绷,造成這個結(jié)果的應該不是由于某些日子購買大量單數(shù)所致。因為幾乎每個月的周一到周四銷售單數(shù)都很好。尤其是周四表現(xiàn)最好苦丁,需要進一步挖掘周四銷量好的原因,另外也可以考慮一些促銷活動安排在周四物臂。

(2)周銷售額


week_amount = df.groupby('Week')['Amount'].sum()
plt.hlines(y = week_amount_avg,xmin=0,xmax=6,color='r',linestyle='--',alpha=0.5,label='Average')
(week_amount.sum()/6).plot(kind='line',marker='o',alpha=0.6)
plt.xlabel('Week')
plt.legend()

image

周二到周四銷售額都超過平均水平

(3)周均銷售額


week_amount_avg = round(week_amount.sum()/52,2)

計算結(jié)果為160961.89旺拉,這是每周平均銷售額,給運營者提供一個參考棵磷,可以初步評價每一星期的銷售情況蛾狗,是高于還是低于平均值。

c仪媒、效率指標

(1)客單價=銷售總額/人數(shù)

customer_num = df.drop_duplicates(subset=['CustomerID'])
sales_perCustomer = round(df['Amount'].sum()/len(customer_num),2)

每位顧客在店內(nèi)消費額為1947.42

(2)件單價=銷售總額/銷售總數(shù)

sales_perPro = round(df['Amount'].sum()/df['Quantity'].sum(),2)

件單價為:1.72沉桌,由此可見有部分顧客在店內(nèi)消費很高。

(3)連帶率=售出的產(chǎn)品總數(shù)/總的交易單數(shù)


sales_perInvoiceNo = round(df['Quantity'].sum()/len(df_InvoiceNo),2)

每筆成交單數(shù)中平均銷售274.76件產(chǎn)品算吩,可見在銷售過程中有些單數(shù)中有大量采購的用戶

d留凭、退貨金額

在原數(shù)據(jù)集說明中,訂單號如果以字母c開頭表示該訂單為取消訂單赌莺,所以在這里想看看退貨的情況


cancel = df.iloc[:,0].str.startswith('c')

可知沒有取消訂單

2冰抢、RFM指標

a、R-Recently(用戶最后一次購物距離現(xiàn)在幾個月)

計算出最后一次購買時間距離最后一天的天數(shù)艘狭,然后再計算月分數(shù)挎扰。

Last_purchase = df.groupby('CustomerID')['InvoiceDate'].max()
Max_date=Last_purchase.max()
Recency_days=Last_purchase.map(lambda x:(x-Max_date).days)
#Recency in months
Recency_months=Recency_days.map(lambda x:round((-1*x)/30,1))
sns.distplot(Recency_months)

image

圖8可見40%左右的顧客在一個月內(nèi)都有消費,近2個月內(nèi)消費的客戶數(shù)占了約55%巢音。

同樣近45%的客戶在2個月內(nèi)沒進行消費遵倦,這些客戶的流失可能性很大,而且流失比例也很大官撼∥嗵桑可以采取一些促銷方式拉動這批顧客的消費。

b、F-Frequency(一年內(nèi)用戶購買數(shù))一年里面掠哥,用戶總購買次數(shù)


Frequency_Year = df_InvoiceNo.groupby('CustomerID')['InvoiceNo'].count()

image

可以看到(0,5]的購買數(shù)占了近80%巩踏,只購買一次的用戶占了35.81%。由此可見產(chǎn)品復購率表現(xiàn)良好续搀。

c塞琼、M-Monetary(用戶一年所花的總金額)


Monetary_Year = df.groupby('CustomerID')['Amount'].sum()
Monetary_Year.describe()

綜合上面的計算,RFM的三個指標的數(shù)據(jù)區(qū)間范圍分別是:

R [0.0, 12.2]

F [1.0, 201.0]

M [2.9, 268478.0]

四禁舷、建立模型

1彪杉、利用RFM挖掘價值用戶

rfm = pd.DataFrame()
rfm['Recently'] = Recency_months
rfm['Frequency'] = Frequency_Year
rfm['Monetary'] = Monetary_Year
rfm.index = rfm.index.astype(int)

建立用戶行為評分機制


r_labels = range(4,0,-1)
f_labels = range(1,5,1)
m_labels = range(1,5,1)

根據(jù)RFM用戶三個標簽對用戶進行劃分,并進行賦分


rfm['r_quartiles']= pd.qcut(rfm['Recently'], q=4, labels=r_labels)
rfm['f_quarities'] = pd.qcut(rfm['Frequency'].rank(method='first'), q=4, labels=f_labels)
rfm['m_quaritiles'] = pd.qcut(rfm['Monetary'], q=4, labels=m_labels)

有了RFM每個標簽的評分后進行統(tǒng)計和算出每一位用戶的最終得分牵咙,這里是把每個標簽的評分相加派近。


rfm['score'] = rfm['r_quartiles'].astype(int)+rfm['f_quarities'].astype(int)+rfm['m_quaritiles'].astype(int)

用戶根據(jù)RFM的綜合評分RFM_Score分為了10個等級,實際運用中可能需要比較粗略的劃分洁桌,這里把用戶分為3個大的等級渴丸。'Gold''Silver''Bronze'10-12、6-9战坤、3-5

labels = ['Bronze','Silver','Gold']
bins = [3,6,10,13]
rfm['Rank'] = pd.cut(rfm['score'],bins = bins,labels=labels,right=False)

可以找出三類客戶的分界點曙强,對后續(xù)客戶等級進行劃分


rfm.groupby('Rank').mean()

         Recently   Frequency   Monetary

Bronze 6.515435 1.134037 273.283754

Silver 2.339588 2.392539 907.840998

Gold 0.690472 9.499213 5041.829701

通過RFM可以進行價值用戶的劃分,對不同群體用戶進行不同管理途茫,針對性提高運營效率

2碟嘴、利用聚類算法挖掘價值用戶

K-Means算法的應用有三個限制:(1)標簽的分布是對稱的,not skewed囊卜;(2)標簽的平均值一樣娜扇;(3)標簽的方差一樣。

針對對稱問題栅组,可以用對數(shù)變換(Logarithmic transformation)來解決雀瓢,針對平均值和方差一樣的問題,可以標準化轉(zhuǎn)換(standardization)來解決玉掸,這兩步的順序是有嚴格要求的刃麸,因為log變換只適用于大于零的數(shù)值,而標準化會產(chǎn)生負值司浪,所以必須要先進行l(wèi)og轉(zhuǎn)換后進行standardization泊业。

rfm_k = pd.DataFrame()
rfm_k['Frequency'] = rfm['Frequency'].apply(np.log).round(3)
rfm_k['Monetary'] = rfm['Monetary'].apply(np.log).round(3)
rfm_k['Recently'] = rfm['Recently']+0.001
rfm_k['Recently'] = -rfm_k['Recently'].apply(np.log).round(3)
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.pipeline import Pipeline
model = Pipeline([('sta',StandardScaler()),('kmean',KMeans(n_clusters=3,random_state=1))])
rfm_k['label'] = model.named_steps['kmean'].labels_

三個聚類0,1啊易,2分別對應了Silver\Bronze\Gold


rfm['Ra gnk_k'] = pd.cut(rfm_k['label'],bins=3,labels=['Silver','Bronze','Gold'])

分界點

       Recently Frequency Monetary

Silver 1.885546 3.764012 1469.826061

Bronze 4.969639 1.254124 332.801660

Gold 0.396073 13.510574 7904.876224

前10行結(jié)果:

Rank Rank_k

  • 12346 Silver Silver

  • 12347 Gold Silver

  • 12348 Silver Silver

  • 12349 Silver Silver

  • 12350 Bronze Bronze

  • 12352 Gold Silver

  • 12353 Bronze Bronze

  • 12354 Bronze Bronze

  • 12355 Bronze Bronze

  • 12356 Gold Silver

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吁伺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子租谈,更是在濱河造成了極大的恐慌篮奄,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窟却,居然都是意外死亡昼丑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門夸赫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矾克,“玉大人,你說我怎么就攤上這事憔足。” “怎么了酒繁?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵滓彰,是天一觀的道長。 經(jīng)常有香客問我州袒,道長揭绑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任郎哭,我火速辦了婚禮他匪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘夸研。我一直安慰自己邦蜜,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布亥至。 她就那樣靜靜地躺著悼沈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姐扮。 梳的紋絲不亂的頭發(fā)上絮供,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音茶敏,去河邊找鬼壤靶。 笑死,一個胖子當著我的面吹牛惊搏,可吹牛的內(nèi)容都是我干的贮乳。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼胀屿,長吁一口氣:“原來是場噩夢啊……” “哼塘揣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宿崭,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤亲铡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奖蔓,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡赞草,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吆鹤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厨疙。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖疑务,靈堂內(nèi)的尸體忽然破棺而出沾凄,到底是詐尸還是另有隱情,我是刑警寧澤知允,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布撒蟀,位于F島的核電站,受9級特大地震影響温鸽,放射性物質(zhì)發(fā)生泄漏保屯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一涤垫、第九天 我趴在偏房一處隱蔽的房頂上張望姑尺。 院中可真熱鬧,春花似錦蝠猬、人聲如沸切蟋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敦姻。三九已至,卻和暖如春歧杏,著一層夾襖步出監(jiān)牢的瞬間镰惦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工犬绒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旺入,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓凯力,卻偏偏與公主長得像茵瘾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子咐鹤,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344