覺得可以的話理疙,點個贊呀昌妹!
數(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'])
購買數(shù)量應該是大于0的,將小于等于0的異常值去除鬓椭。有兩個數(shù)據(jù)的數(shù)量達到了70000觀察可知颠猴。應該也是合理的,因為進一步觀察發(fā)現(xiàn)單價低
df = df[df['Quantity']>0]
刪除了8872個異常值
UnitPrice
plt.scatter(range(len(df)),df['UnitPrice'])
商品單價應該大于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月份為淡季
(2)月銷售額
df['Amount'] = df['UnitPrice'] * df['Quantity']
month_amount = df.groupby(['Year','Month'])['Amount'].sum()
圖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()
給的數(shù)據(jù)中沒有周六的單數(shù),從單數(shù)來看周二到周四銷量較多,其中周四的訂單量將近周日的兩倍伞广∈∮校可能在周四有某些日子購買了大量的單數(shù)。
但是進一步分析每月每周的統(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()
周二到周四銷售額都超過平均水平
(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)
圖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()
可以看到(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