最詳細(xì)的 Python 結(jié)合 RFM 模型實(shí)現(xiàn)用戶分層實(shí)操案例!

作者:Cherich_sun
鏈接:https://www.jianshu.com/p/f020dfdce58d
本文為讀者投稿
寫在最前:做數(shù)據(jù)分析的小伙伴可能多多少少都知道一些分析方法,但是談到分析思維卻沒有底氣或者遇到業(yè)務(wù)問題,不知道如何下手。如果你有上述困惑,那么本篇文章可以作為參考。下圖是整理的分析方法論及方法。如果能夠靈活運(yùn)用,將能夠解決工作中 80% 以上問題。注意的是,方法論是思維層面,方法是執(zhí)行層面。那么,重點(diǎn)是我們?nèi)绾螌⑵鋺?yīng)用到實(shí)際業(yè)務(wù)中。本文將以 RFM 模型 為例,運(yùn)用到實(shí)際案例中。(本文以 Python 實(shí)現(xiàn),Excel 也可以。)
數(shù)據(jù)分析思維
項(xiàng)目背景:某生鮮外賣APP于2018年1月1日成立,主營新鮮蔬菜瓜果,海鮮肉禽。APP上線后,市場推廣期為一年。通過分析發(fā)現(xiàn)原來幾個(gè)重要的客戶被競爭對(duì)手挖走了,而這幾個(gè)用戶對(duì)平臺(tái)貢獻(xiàn)了80%的銷售額。之前對(duì)所有用戶采用一樣的運(yùn)營策略,為了解決這個(gè)問題,需要對(duì)用戶進(jìn)行分類,了解當(dāng)前用戶分層情況,進(jìn)行精細(xì)化運(yùn)營。
一、整體分析流程
1、分析目的:用戶分類
2、數(shù)據(jù)獲?。篍xcel 數(shù)據(jù)
3、清洗加工:Excel、Python
4、建立模型:RFM
5、數(shù)據(jù)可視化
6、結(jié)論與建議
二、RFM 模型的理解


最終將 RFM 模型處理后的結(jié)果,作為用戶標(biāo)簽,幫助運(yùn)營更精準(zhǔn)地制定活動(dòng)規(guī)則以提升用戶使用黏性,強(qiáng)化用戶感知。最終實(shí)現(xiàn)的效果圖如下:

三、利用 Python 實(shí)現(xiàn) RFM 用戶分層
1、獲取數(shù)據(jù)
import pandas as pd
data = pd.read_excel('C:/Users/cherich/Desktop/用戶信息.xlsx')
data.head()

data.info()

說明:當(dāng)前數(shù)據(jù)集是5000條用戶數(shù)據(jù),存在缺失值對(duì)本次分析不會(huì)造成影響。數(shù)據(jù)清洗,通常包括處理缺失值、重復(fù)值、轉(zhuǎn)換數(shù)據(jù)類型三種。所以僅考慮數(shù)據(jù)類型即可。這里有個(gè)前提條件,R、F、M 應(yīng)該有一個(gè)參照時(shí)間,如果活動(dòng)持續(xù)到現(xiàn)在,可以截止到現(xiàn)在。但是我們的數(shù)據(jù)是歷史數(shù)據(jù),所以需要查找活動(dòng)結(jié)束時(shí)間。
data.sort_values(by='最后一次成交', ascending=False)

2、數(shù)據(jù)處理
# 活動(dòng)結(jié)束時(shí)間 2019-06-30
data['最后一次成交']=data['最后一次成交'].astype('str')
stop_date = pd.to_datetime('2019-06-30')
datas = data.drop(columns=['注冊(cè)時(shí)間','會(huì)員開通時(shí)間','會(huì)員類型','城市','區(qū)域','最后一次登陸'])
datas['最后一次成交時(shí)間'] = datas['最后一次成交'].apply(lambda x:x.split()[0])
datas['最后一次成交時(shí)間'] = pd.to_datetime(datas['最后一次成交時(shí)間'])
datas['R1'] = datas['最后一次成交時(shí)間'].apply(lambda x:stop_date-x)
datas['F1'] = datas['非會(huì)員累計(jì)購買次數(shù)']+datas['會(huì)員累計(jì)購買次數(shù)']
datas['M1'] = datas['非會(huì)員累計(jì)消費(fèi)'] + datas['會(huì)員累計(jì)消費(fèi)']
datas['R1']= datas['R1'].astype(str)
datas['R1']= datas['R1'].apply(lambda x:x.split()[0])
datas

說明:以上操作目的是將R指標(biāo)由時(shí)間類型轉(zhuǎn)換成可計(jì)算格式,為接下來建立模型,計(jì)算時(shí)間間隔做準(zhǔn)備。
3、建立模型
建立模型,需要分別對(duì)F、R、M 分別計(jì)算各自的平均值。但是要注意三個(gè)指標(biāo)數(shù)據(jù)存在極大值、極小值的情況,這對(duì)結(jié)果會(huì)產(chǎn)生一定的誤差,所以解決方案是將其標(biāo)準(zhǔn)化,設(shè)置分段區(qū)間,5分制,5分為最高。(數(shù)值區(qū)間可根據(jù)具體業(yè)務(wù)靈活調(diào)整或者用四分位數(shù))

def R_score(n):
n = int(n)
if 0<n<=80:
r = 5
elif 80<n<=160:
r = 4
elif 160<n<=240:
r = 3
elif 240<n<=320:
r = 2
else:
r = 1
return r
def F_score(n):
n = int(n)
if 0<n<=14:
r = 1
elif 14<n<=28:
r = 2
elif 28<n<=42:
r = 3
elif 42<n<=56:
r = 4
else:
r = 5
return r
def M_score(n):
n = int(n)
if 0<n<=1500:
r = 1
elif 1500<n<=3000:
r = 2
elif 3000<n<=4500:
r = 3
elif 4500<n<=6000:
r = 4
else:
r = 5
return r
datas['M1_score'] =datas['M1'].apply(M_score)
datas['F1_score'] =datas['F1'].apply(F_score)
datas['R1_score'] =datas['R1'].apply(R_score)
datas.head()

說明:這里對(duì)R、F、M 再求平均值,以平均值為標(biāo)準(zhǔn),如果單個(gè)指標(biāo)大于平均值,顯示1,否則顯示0。最終RFM的結(jié)果由0和1拼接組成,即可得出用戶最終類型。
R_mean = datas['R1_score'].mean()
F_mean = datas['F1_score'].mean()
M_mean = datas['M1_score'].mean()
datas['R'] = datas['R1_score'].apply(lambda x: 1 if x> R_mean else 0)
datas['F'] = datas['F1_score'].apply(lambda x: 1 if x> F_mean else 0)
datas['M'] = datas['M1_score'].apply(lambda x: 1 if x> M_mean else 0)
datas

datas['RFM'] = datas['R'].apply(str)+datas['F'].apply(str)+datas['M'].apply(str)
datas
def user_tag(rfm):
if rfm=='000':
res = '流失用戶'
elif rfm=='010':
res = '一般維持用戶'
elif rfm=='100':
res = '新客戶'
elif rfm=='110':
res = '潛力客戶'
elif rfm=='001':
res = '重要挽留客戶'
elif rfm=='101':
res = '重要深耕客戶'
elif rfm=='011':
res = '重要喚回客戶'
else:
res = '重要價(jià)值客戶'
return res
datas['user_tag']=datas['RFM'].apply(user_tag)
datas

4、數(shù)據(jù)可視化
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib as mpl
sns.set(font='SimHei',style='darkgrid')
user_tag = datas.groupby(datas['user_tag']).size()
plt.figure(figsize = (10,4),dpi=80)
user_tag.sort_values(ascending=True,inplace=True)
plt.title(label='生鮮平臺(tái)用戶分層對(duì)比',
fontsize=22, color='white',
backgroundcolor='#334f65', pad=20)
s = plt.barh(user_tag.index,user_tag.values , height=0.8, color=plt.cm.coolwarm_r(np.linspace(0,1,len(user_tag))))
for rect in s:
width = rect.get_width()
plt.text(width+40,rect.get_y() + rect.get_height()/2, str(width),ha= 'center')
plt.grid(axis='y')
plt.show()

groups_b = datas.groupby(by='user_tag').size()
plt.figure(figsize = (10,6),dpi=80)
plt.title(label='生鮮平臺(tái)用戶分層占比',
fontsize=22, color='white',
backgroundcolor='#334f65', pad=20)
explodes = [0.6, 0, 0, 0, 0,0,0.4,0.8]
patches, l_text, p_text = plt.pie(groups_b.values,labels = groups_b.index, shadow=True,colors=plt.cm.coolwarm_r(np.linspace(0,1,len(groups_b))), autopct='%.2f%%', explode=explodes,startangle=370)
plt.legend(ins,bbox_to_anchor=(2, 1.0))
plt.show()

5、結(jié)論與建議
以上基本完成了RFM模型實(shí)現(xiàn)用戶分層,可以看出新客戶占比30%左右,重要價(jià)值客戶占比30%左右。兩者是平臺(tái)的最主要用戶類型。
接下來就需要結(jié)合具體業(yè)務(wù)來制定運(yùn)營策略。最后分享的是,現(xiàn)在我們看到最多的招聘需求是具備分析思維。那什么是分析思維。
我的理解是,首先要理解業(yè)務(wù),其次要掌握分析方法,要明確分析方法存在的意義是幫助我們將零散業(yè)務(wù)問題歸類,歸類的過程形成分析思路,有了分析思路,那你就具備了分析思維。
公眾號(hào)「Python之每日一課」,后臺(tái)回復(fù):「RFM數(shù)據(jù)」即可獲取本文完整數(shù)據(jù)。
歷史投稿文章:
太秀了!用Excel也能實(shí)現(xiàn)和Python數(shù)據(jù)分析一樣的功能!

