原文出處:https://tianchi.aliyun.com/notebook-ai/detail?spm=5176.12281897.0.0.77c92b4abI9m56&postId=286067
代碼摘抄:
import pandas as pd
import datetime
import matplotlib.pyplot as plt
獲取數(shù)據(jù)
data=pd.read_excel('./工作/商品銷售數(shù)據(jù).xlsx')
data.head(10)#查看前十行
數(shù)據(jù)清洗
#查看數(shù)據(jù)基本信息
data.info()
#處理空值
data=data.dropna(subset=['用戶 ID'])
#查看重復(fù)值
data[data.duplicated()]
#刪除重復(fù)值
data=data.drop_duplicates()
#查看描述性信息
data.describe()
#處理異常值
data=data[data['數(shù)量']>0]
data.describe()
數(shù)據(jù)整理
data.head()
#數(shù)據(jù)整理
data['金額']=data['數(shù)量']*data['價(jià)格']
data.head()
pd.to_datetime(data['發(fā)貨日期'])
today='2012-01-01'
#按照訂單號和用戶ID進(jìn)行分組
grouped_data = data.groupby(['訂單號', '用戶 ID'], as_index=False).agg({'發(fā)貨日期': 'max', '金額': 'sum'})
grouped_data
grouped_data['時(shí)間間隔']=(pd.to_datetime(today)-pd.to_datetime(grouped_data['發(fā)貨日期'])).dt.days
grouped_data
計(jì)算R、F、M值
rfm_data= grouped_data.groupby('用戶 ID', as_index=False).agg({'時(shí)間間隔': 'min', '訂單號': 'count', '金額': 'sum'})
rfm_data.columns=['用戶 ID','間隔天數(shù)','下單次數(shù)','金額']
rfm_data
數(shù)據(jù)分析
計(jì)算R值閾值
#計(jì)算R值
plt.figure(figsize=(10, 8))
x = rfm_data['間隔天數(shù)'].sort_values()
y =rfm_data.index
plt.plot(x, y)
計(jì)算用戶R評分
# 定義函數(shù)按照區(qū)間劃分 R 值
def caculate_r(s):
if s <= 100:
return 5
elif s <= 200:
return 4
elif s <= 300:
return 3
elif s <= 400:
return 2
else:
return 1
rfm_data['R評分'] = rfm_data['間隔天數(shù)'].agg(caculate_r)
rfm_data
計(jì)算F值閾值
#計(jì)算F值
plt.figure(figsize=[6,6])
x=rfm_data['下單次數(shù)'].sort_values()
y=rfm_data.index
plt.plot(x,y)
計(jì)算用戶F評分
def caculate_f(s):
if s <= 5:
return 1
elif s <= 10:
return 2
elif s <= 15:
return 3
elif s <= 20:
return 4
else:
return 5
rfm_data['F評分'] = rfm_data['下單次數(shù)'].agg(caculate_f)
rfm_data
計(jì)算M值閾值
#計(jì)算m值
plt.figure(figsize=[6,6])
x=rfm_data['金額'].sort_values()
y=rfm_data.index
plt.plot(x,y)
計(jì)算用戶M評分
# 定義函數(shù)按照區(qū)間劃分 M 值
def caculate_m(s):
if s <= 2000:
return 1
elif s <= 4000:
return 2
elif s <= 6000:
return 3
elif s <= 8000:
return 4
else:
return 5
rfm_data['M評分']=rfm_data['金額'].agg(caculate_m)
rfm_data
計(jì)算 R評分、F評分、M評分的平均數(shù)
#分別計(jì)算RFM的平均分
r_avg = rfm_data['R評分'].mean()
f_avg = rfm_data['F評分'].mean()
m_avg = rfm_data['M評分'].mean()
print('R評分的均值為:{},F評分的均值為{},M評分的均值為{}'.format(r_avg, f_avg, m_avg))
標(biāo)記用戶RFM的高低
# 將R評分、F評分、M評分 的數(shù)據(jù)分別與對應(yīng)的平均數(shù)做比較
rfm_data['R評分'] = (rfm_data['R評分'] > r_avg) * 1
rfm_data['F評分'] = (rfm_data['F評分'] > f_avg) * 1
rfm_data['M評分'] = (rfm_data['M評分'] > m_avg) * 1
rfm_data
# 拼接R評分、F評分、M評分
rfm_score = rfm_data['R評分'].astype(str) + rfm_data['F評分'].astype(str) + rfm_data['M評分'].astype(str)
rfm_score
標(biāo)記用戶類型
# 定義字典標(biāo)記 RFM 評分檔對應(yīng)的用戶分類名稱
transform_label = {
'111':'重要價(jià)值用戶',
'101':'重要發(fā)展用戶',
'011':'重要保持用戶',
'001':'重要挽留用戶',
'110':'一般價(jià)值用戶',
'100':'一般發(fā)展用戶',
'010':'一般保持用戶',
'000':'一般挽留用戶'
}
# 將RFM評分替換成具體的客戶類型
rfm_data['客戶類型']=rfm_score.replace(transform_label)
rfm_data
## 按【客戶類型】分組,統(tǒng)計(jì)用戶的數(shù)量
customer_data =rfm_data.groupby('客戶類型')['用戶 ID'].count()
customer_data
數(shù)據(jù)展現(xiàn)
# 繪制柱狀圖
plt.rcParams['font.family']=['SimHei']
plt.figure(figsize=(12, 8))
plt.bar(customer_data.index, customer_data)
plt.xlabel('客戶類型', fontsize=12)
plt.ylabel('人數(shù)', fontsize=12)
plt.title('不同客戶的數(shù)量分布', fontsize=16)
# 繪制餅圖
plt.figure(figsize=(14, 10))
plt.pie(customer_data, labels=customer_data.index, autopct='%0.1f%%')
plt.title('不同客戶占比情況', fontsize=16)
結(jié)論和建議
可視化結(jié)果表明一般維持用戶和流失用戶的人數(shù)偏多,分別占比35.8%和38.3%,重要價(jià)值用戶占比14%,其余各類型用戶分別占比不到5%
對于一般維持用戶較多(消費(fèi)頻率高,但最近未消費(fèi),消費(fèi)金額也少)的情況,問題可能在于一般維持用戶后續(xù)的復(fù)購轉(zhuǎn)化不足??梢远嗤ㄟ^短信、平臺網(wǎng)站等渠道,在一般維持用戶購買后的一段時(shí)間內(nèi)可以領(lǐng)取復(fù)購券等策略,將這類用戶轉(zhuǎn)化為更高價(jià)值的用戶類型。
對于流失用戶較多的情況,問題可能在于平臺的產(chǎn)品競爭力或者服務(wù)不足??梢远鄬Ρ雀偲饭镜漠a(chǎn)品,對自身的產(chǎn)品進(jìn)行提升。也可以發(fā)掘用戶興趣,使用推送等低成本手段進(jìn)行挽留同時(shí),可以采取贈(zèng)送優(yōu)惠券的策略,并收集用戶對平臺產(chǎn)品以及服務(wù)的評價(jià)。
對于重要價(jià)值用戶,他們是平臺GMV貢獻(xiàn)最多的一部分用戶。平臺可以投入更多的資源提供VIP或個(gè)性化服務(wù),比如:推薦用戶辦理VIP并提供一對一客服咨詢,創(chuàng)建VIP社群定時(shí)發(fā)放福利,定期舉辦會(huì)員日等手段,提高這類用戶的忠誠度








暫無數(shù)據(jù)