大家好,本文以真實(shí)案為例手把手教你搭建電商系統(tǒng)的用戶(hù)畫(huà)像。
先來(lái)看該電商用戶(hù)畫(huà)像用到的標(biāo)簽。
數(shù)據(jù)內(nèi)容包括user_id(用戶(hù)身份)、item_id(商品)、IDbehavior_type(用戶(hù)行為類(lèi)型,包含點(diǎn)擊、收藏、加購(gòu)物車(chē)、支付四種行為,分別用數(shù)字1、2、3、4表示)、user_geohash(地理位置)、item_category(品類(lèi)ID,即商品所屬的品類(lèi))、Time(用戶(hù)行為發(fā)生的時(shí)間),其中user_id和item_id因?yàn)樯婕半[私,做了脫敏處理,顯示的是數(shù)字編號(hào)。
下面是具體的代碼實(shí)現(xiàn)過(guò)程。
導(dǎo)入庫(kù)
本示例除了用到numpy、pandas、matplotlib,還用到其他一些模塊。
# 導(dǎo)入所需的庫(kù)
%matplotlib inline
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from datetime import datetime
參數(shù)說(shuō)明如下。
- %matplotlib inline: 一個(gè)魔法函數(shù),由于%matplotlib inline的存在,當(dāng)輸入plt.plot()后,不必再輸入plt.show(),圖像將自動(dòng)顯示出來(lái)。
- datetime: 用來(lái)顯示時(shí)間的模塊。
數(shù)據(jù)準(zhǔn)備
# 導(dǎo)入數(shù)據(jù)集
df_orginal = pd.read_csv('./taobao_persona.csv')
# 抽取部分?jǐn)?shù)據(jù)
df = df_orginal.sample(frac=0.2,random_state=None)
此處使用Pandas的read_csv方法讀取數(shù)據(jù)文件,由于數(shù)據(jù)集太大,為了提高運(yùn)行效率,使用sample函數(shù)隨機(jī)抽取20%的數(shù)據(jù)。
DataFrame.sample()是Pandas中的函數(shù),DataFrame是一種數(shù)據(jù)格式,代指df_orginal。frac(fraction)是抽取多少數(shù)據(jù),random_state是隨機(jī)數(shù)種子,目的是保證每次隨機(jī)抽取的數(shù)據(jù)一樣,防止執(zhí)行命令時(shí)使用不一樣的數(shù)據(jù)。
數(shù)據(jù)預(yù)處理
# 查看其中是否有缺失值,統(tǒng)計(jì)各字段缺失值
df.isnull().any().sum()
# 發(fā)現(xiàn)只有user_geohash有缺失值,且缺失的比例很高,無(wú)統(tǒng)計(jì)分析的意義,將此列刪
df.drop('user_geohash',axis=1,inplace=True)
# 將time字段拆分為日期和時(shí)段
df['date'] = df['time'].str[0:10]
df['time'] = df['time'].str[11:]
df['time'] = df['time'].astype(int)
# date用str方法取0-9位的字符,time取11位到最后一位,將time轉(zhuǎn)化成int類(lèi)型。
# 將時(shí)段分為'凌晨','上午','中午','下午','晚上'
df['hour'] = pd.cut(df['time'],bins=[-1,5,10,13,18,24],labels=['凌晨','上午','中午','下午','晚上'])
結(jié)果如圖1所示。
圖1 數(shù)據(jù)預(yù)處理結(jié)果
# 生成用戶(hù)標(biāo)簽表,制作好的標(biāo)簽都加入這個(gè)表中
users = df['user_id'].unique()
labels = pd.DataFrame(users,columns=['user_id'])
- pd.DataFrame(): 其中數(shù)據(jù)填充的是users,列名為user_id。
結(jié)果如圖2所示。
圖2 制作好的用戶(hù)ID
之后分析后的內(nèi)容都會(huì)放置在此表中,相當(dāng)于建立了一個(gè)空白表,將自己分析后的結(jié)論一一加入。
數(shù)構(gòu)建用戶(hù)行為標(biāo)簽
1)對(duì)用戶(hù)瀏覽時(shí)間段進(jìn)行分析
選取出各用戶(hù)瀏覽次數(shù)最多的時(shí)段,看看用戶(hù)到底在什么時(shí)間瀏覽商品比較多。
# 對(duì)用戶(hù)和時(shí)段分組,統(tǒng)計(jì)瀏覽次數(shù)
time_browse = df[df['behavior_type']==1].groupby(['user_id','hour']).item_id.count().reset_index()
time_browse.rename(columns={'item_id':'hour_counts'},inplace=True)
# 統(tǒng)計(jì)每個(gè)用戶(hù)瀏覽次數(shù)最多的時(shí)段
time_browse_max = time_browse.groupby('user_id').hour_counts.max().reset_index()
time_browse_max.rename(columns={'hour_counts':'read_counts_max'},inplace=True)
time_browse = pd.merge(time_browse,time_browse_max,how='left',on='user_id')
# 之前已經(jīng)按照user_id和hour進(jìn)行了瀏覽物品次數(shù)的計(jì)數(shù)統(tǒng)計(jì),現(xiàn)在借用瀏覽次數(shù)統(tǒng)計(jì)user_id在
# 哪個(gè)時(shí)間段瀏覽次數(shù)最多,并將其作為該用戶(hù)的瀏覽時(shí)間標(biāo)簽的代表。
# 選取各用戶(hù)瀏覽次數(shù)最多的時(shí)段,如有并列最多的時(shí)段,用逗號(hào)連接
time_browse_hour=time_browse.loc[time_browse['hour_counts']==time_browse['read_counts_max'],'hour'].groupby(time_browse['user_id']).aggregate(lambda x:','.join(x)).reset_index()
time_browse_hour.head()
# 將用戶(hù)瀏覽活躍時(shí)間段加入用戶(hù)標(biāo)簽表中
labels = pd.merge(labels,time_browse_hour,how='left',on='user_id')
labels.rename(columns={'hour':'time_browse'},inplace=True)
# labels相當(dāng)于一張考試卷紙,上面展示的都是最后處理好的結(jié)果
結(jié)果如圖3所示。
圖3 用戶(hù)瀏覽時(shí)間段
- groupby([‘key1’,‘key2’]): 多列聚合,分組鍵為列名。
- reset_index(): 默認(rèn)drop=False,可以獲得新的index,原來(lái)的index變成數(shù)據(jù)列保留下來(lái),第一列會(huì)添加計(jì)數(shù)的數(shù)字,不會(huì)使用數(shù)據(jù)中的index。
- rename(): 進(jìn)行重命名,此處將item_id替換成hour_counts,inplace為是否原地填充。
- pd.merge(): 將兩個(gè)表合并在一起,橫向合并,on代表通過(guò)某個(gè)主鍵,how指左合并,每行一一對(duì)應(yīng)。
- loc函數(shù): 通過(guò)行索引Index中的具體值來(lái)取指定數(shù)據(jù)。
- aggregate函數(shù): groupby分組之后會(huì)返回多個(gè)子數(shù)據(jù)幀,該函數(shù)可以實(shí)現(xiàn)數(shù)據(jù)聚合,可以得到每個(gè)子數(shù)據(jù)幀的某些列的某些信息。
- lambda函數(shù): 可以定義一個(gè)匿名函數(shù),lambda [arg1[, arg2, … argN]]: expression,其中參數(shù)是函數(shù)的輸入,是可選的,后面的表達(dá)式則為輸出,此處和join()函數(shù)一起用,其中每個(gè)x值能被“,”隔開(kāi);使用類(lèi)似的代碼可以生成瀏覽活躍時(shí)間段,此處就不再贅述。
2)關(guān)于類(lèi)目的用戶(hù)行為。
df_browse = df.loc[df['behavior_type']==1,['user_id','item_id','item_category']]
df_collect = df.loc[df['behavior_type']==2,['user_id','item_id','item_category']]
df_cart = df.loc[df['behavior_type']==3,['user_id','item_id','item_category']]
df_buy = df.loc[df['behavior_type']==4,['user_id','item_id','item_category']]
根據(jù)不同的用戶(hù)行為,如瀏覽、收藏等,分別導(dǎo)出數(shù)據(jù)進(jìn)行分析。
# 對(duì)用戶(hù)與類(lèi)目進(jìn)行分組,統(tǒng)計(jì)瀏覽次數(shù)
df_cate_most_browse = df_browse.groupby(['user_id','item_category']).item_id.count().reset_index()
df_cate_most_browse.rename(columns={'item_id':'item_category_counts'},inplace=True)
# 統(tǒng)計(jì)每個(gè)用戶(hù)瀏覽次數(shù)最多的類(lèi)目
df_cate_most_browse_max=df_cate_most_browse.groupby('user_id').item_category_counts.max().reset_index()
df_cate_most_browse_max.rename(columns={'item_category_counts':'item_category_counts_max'},inplace=True)
df_cate_most_browse = pd.merge(df_cate_most_browse,df_cate_most_browse_max,how='left',on='user_id')
# 將item_category的數(shù)字類(lèi)型改為字符串型
df_cate_most_browse['item_category'] = df_cate_most_browse['item_category'].astype(str)
# 選取各用戶(hù)瀏覽次數(shù)最多的類(lèi)目,如有并列最多的類(lèi)目,用逗號(hào)連接
df_cate_browse=df_cate_most_browse.loc[df_cate_most_browse['item_category_counts']==df_cate_most_browse['item_category_counts_max'],'item_category'].groupby(df_cate_most_browse['user_id']).aggregate(lambda x:','.join(x)).reset_index()
# 將用戶(hù)瀏覽最多的類(lèi)目加入用戶(hù)標(biāo)簽表中
labels = pd.merge(labels,df_cate_browse,how='left',on='user_id')
labels.rename(columns={'item_category':'cate_most_browse'},inplace=True)
labels.head(5)
用戶(hù)瀏覽最多的類(lèi)目如圖4所示。
圖4 瀏覽最多的類(lèi)目
收藏、加購(gòu)和購(gòu)買(mǎi)最多的類(lèi)目生成邏輯相同,重復(fù)操作后結(jié)果如圖5所示。
圖5 關(guān)于類(lèi)目的用戶(hù)行為
從整理的數(shù)據(jù)中可以看出,瀏覽、加購(gòu)物車(chē)、收藏、購(gòu)買(mǎi)之前其實(shí)不一定存在明顯的必然關(guān)系,我們還需要進(jìn)一步分析得到一些規(guī)律。
3)近30天用戶(hù)行為分析。
近30天購(gòu)買(mǎi)次數(shù):
# 將購(gòu)買(mǎi)行為按用戶(hù)進(jìn)行分組,統(tǒng)計(jì)次數(shù)
df_counts_30_buy = df[df['behavior_type']==4].groupby('user_id').item_id.count().reset_index()
labels = pd.merge(labels,df_counts_30_buy,how='left',on='user_id')
labels.rename(columns={'item_id':'counts_30_buy'},inplace=True)
近30天加購(gòu)次數(shù):
# 將加購(gòu)行為按用戶(hù)進(jìn)行分組,統(tǒng)計(jì)次數(shù)
df_counts_30_cart = df[df['behavior_type']==3].groupby('user_id').item_id.count().reset_index()
labels = pd.merge(labels,df_counts_30_cart,how='left',on='user_id')
labels.rename(columns={'item_id':'counts_30_cart'},inplace=True)
近30天活躍天數(shù):
# 對(duì)用戶(hù)進(jìn)行分組,統(tǒng)計(jì)活躍的天數(shù),包括瀏覽、收藏、加購(gòu)、購(gòu)買(mǎi)
counts_30_active = df.groupby('user_id')['date'].nunique()
labels = pd.merge(labels,counts_30_active,how='left',on='user_id')
labels.rename(columns={'date':'counts_30_active'},inplace=True)
結(jié)果如圖6所示。
圖6 近30天用戶(hù)行為
近30天用戶(hù)行為分析屬于中長(zhǎng)期的用戶(hù)行為,我們可以依此判斷是否需要調(diào)整營(yíng)銷(xiāo)策略,類(lèi)似可以得到短期的7天用戶(hù)行為分析,觀察中短期或一個(gè)小周期內(nèi),用戶(hù)的行為是何種情況。
4)最后一次行為距今天數(shù)。
分析上次和本次用戶(hù)行為的時(shí)間差值可以實(shí)現(xiàn)精確推薦分析,下面我們來(lái)看看具體如何實(shí)現(xiàn)。
上次瀏覽距今天數(shù):
days_browse = df[df['behavior_type']==1].groupby('user_id')['date'].max().apply(lambda x:(datetime.strptime('2014-12-19','%Y-%m-%d')-x).days)
labels = pd.merge(labels,days_browse,how='left',on='user_id')
labels.rename(columns={'date':'days_browse'},inplace=True)
- datetime.strptime(‘2014-12-19’,’%Y-%m-%d’)-x).days: 該部分屬于lambda中的函數(shù)表達(dá)式部分,即計(jì)算規(guī)則,此處最后取相減后的天數(shù)總和。
- apply(): 格式為apply(func,*args,**kwargs),當(dāng)一個(gè)函數(shù)的參數(shù)存在于一個(gè)元組或者一個(gè)字典中時(shí),可間接調(diào)用這個(gè)函數(shù),并將元組或者字典中的參數(shù)按照順序傳遞給該函數(shù),返回值就是func函數(shù)的返回值。相當(dāng)于循環(huán)遍歷,起到處理每一條數(shù)據(jù)的效果。
類(lèi)似可以生成上次加購(gòu)、購(gòu)買(mǎi)距今天數(shù),分析得到用戶(hù)的活躍情況,如圖7所示,如果長(zhǎng)時(shí)間沒(méi)有活躍,則需要推送一些內(nèi)容,或者發(fā)放優(yōu)惠券刺激用戶(hù)。
圖7 最后一次行為距今天情況統(tǒng)計(jì)
5)最近兩次購(gòu)買(mǎi)間隔天數(shù)。
df_interval_buy = df[df['behavior_type']==4].groupby(['user_id','date']).item_id.count().reset_index()
interval_buy = df_interval_buy.groupby('user_id')['date'].apply(lambda x:x.sort_values().diff(1).dropna().head(1)).reset_index()
interval_buy['date'] = interval_buy['date'].apply(lambda x : x.days)
interval_buy.drop('level_1',axis=1,inplace=True)
interval_buy.rename(columns={'date':'interval_buy'},inplace=True)
labels = pd.merge(labels,interval_buy,how='left',on='user_id')
用購(gòu)買(mǎi)間隔數(shù)分析用戶(hù)的購(gòu)買(mǎi)頻率,方便確定用戶(hù)的消費(fèi)活躍等級(jí),精準(zhǔn)制定營(yíng)銷(xiāo)方式。結(jié)果如圖8所示。
圖8 最近兩次購(gòu)買(mǎi)間隔天數(shù)統(tǒng)計(jì)
6)是否瀏覽未下單。
df_browse_buy=df.loc[(df['behavior_type']==1)|(df['behavior_type']==4),['user_id','item_id','behavior_type','time']]
browse_not_buy=pd.pivot_table(df_browse_buy,index=['user_id','item_id'],
columns=['behavior_type'],values=['time'],aggfunc=['count'])
browse_not_buy.columns = ['browse','buy']
browse_not_buy.fillna(0,inplace=True)
# 添加了一列browse_not_buy,初始值為0。
browse_not_buy['browse_not_buy'] = 0
# 瀏覽數(shù)>0,購(gòu)買(mǎi)數(shù)=0的數(shù)據(jù)輸出1.
browse_not_buy.loc[(browse_not_buy['browse']>0) & (browse_not_buy['buy']==0),'browse_not_buy'] = 1
browse_not_buy=browse_not_buy.groupby('user_id')['browse_not_buy'].sum().reset_index()
labels = pd.merge(labels,browse_not_buy,how='left',on='user_id')
labels['browse_not_buy'] = labels['browse_not_buy'].apply(lambda x: '是' if x>0 else '否')
- |: 在Python語(yǔ)句中表示或,&表示且。
- pd.pivot_table(): 透視表功能,df_browse_buy為data塊,values可以對(duì)需要的計(jì)算數(shù)據(jù)進(jìn)行篩選,aggfunc參數(shù)可以設(shè)置我們對(duì)數(shù)據(jù)聚合時(shí)進(jìn)行的函數(shù)操作。
- fillna: 會(huì)填充N(xiāo)aN數(shù)據(jù),返回填充后的結(jié)果,inplace=True代表原地填充。
結(jié)果如圖9所示。
圖9 是否瀏覽未下單情況統(tǒng)計(jì)
針對(duì)瀏覽未下單的用戶(hù)要加大推廣力度,可以增加優(yōu)惠券的發(fā)放次數(shù),促進(jìn)購(gòu)物。
7)是否加購(gòu)未下單。
df_cart_buy=df.loc[(df['behavior_type']==3)|(df['behavior_type']==4),['user_id','item_id','behavior_type','time']]
cart_not_buy=pd.pivot_table(df_cart_buy,index=['user_id','item_id'],columns=['behavior_type'],values=['time'],aggfunc=['count'])
cart_not_buy.columns = ['cart','buy']
cart_not_buy.fillna(0,inplace=True)
cart_not_buy['cart_not_buy'] = 0
cart_not_buy.loc[(cart_not_buy['cart']>0) & (cart_not_buy['buy']==0),'cart_not_buy'] = 1
cart_not_buy = cart_not_buy.groupby('user_id')['cart_not_buy'].sum().reset_index()
labels = pd.merge(labels,cart_not_buy,how='left',on='user_id')
labels['cart_not_buy'] = labels['cart_not_buy'].apply(lambda x: '是' if x>0 else '否')
結(jié)果如圖10所示。
圖10 是否加購(gòu)未下單情況統(tǒng)計(jì)
制定營(yíng)銷(xiāo)策略時(shí),要重點(diǎn)注意這部分人群,因?yàn)榧淤?gòu)未下單的購(gòu)買(mǎi)轉(zhuǎn)化率是最大的,有成功下單、最大潛力的客戶(hù)就在這里。
構(gòu)建用戶(hù)屬性標(biāo)簽
1)是否復(fù)購(gòu)用戶(hù):
buy_again = df[df['behavior_type']==4].groupby('user_id')['item_id'].count().reset_index()
buy_again.rename(columns={'item_id':'buy_again'},inplace=True)
labels = pd.merge(labels,buy_again,how='left',on='user_id')
labels['buy_again'].fillna(-1,inplace=True)
# 未購(gòu)買(mǎi)的用戶(hù)標(biāo)記為'未購(gòu)買(mǎi)',有購(gòu)買(mǎi)未復(fù)購(gòu)的用戶(hù)標(biāo)記為'否',有復(fù)購(gòu)的用戶(hù)標(biāo)記為'是'
labels['buy_again'] = labels['buy_again'].apply(lambda x: '是' if x>1 else '否' if x==1 else '未購(gòu)買(mǎi)')
結(jié)果如圖11所示。
圖11 是否復(fù)購(gòu)用戶(hù)統(tǒng)計(jì)
2)訪問(wèn)活躍度:
user_active_level = labels['counts_30_active'].value_counts().sort_index(ascending=False)
plt.figure(figsize=(16,9))
user_active_level.plot(title='30天內(nèi)訪問(wèn)次數(shù)與訪問(wèn)人數(shù)的關(guān)系',fontsize=18)
plt.ylabel('訪問(wèn)人數(shù)',fontsize=14)
plt.xlabel('訪問(wèn)次數(shù)',fontsize=14)
# 用于顯示中文
plt.rcParams["font.sans-serif"] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 先將user_active_level全部設(shè)置成高,再搜索數(shù)值<16的部分,設(shè)置成低
labels['user_active_level'] = '高'
labels.loc[labels['counts_30_active']<=16,'user_active_level'] = '低'
結(jié)果如圖12所示。
圖12 30天內(nèi)訪問(wèn)次數(shù)與訪問(wèn)人數(shù)的關(guān)系
- value_counts(): 查看表格某列中有多少個(gè)不同值,并計(jì)算每個(gè)不同值在該列中有多少重復(fù)值。
- sort_index(): 按照某一列的大小進(jìn)行排序,ascending=False是按照從大到小排序。
- plt.figure(figsize=(a,b)): 創(chuàng)建畫(huà)板,figsize代表寬為a,高為b的圖形,單位為英寸。
- plt.ylabel: 設(shè)置y軸,fontsize是字體大小。
- plt.xlabel: 設(shè)置x軸。
通過(guò)圖12可以看出,訪問(wèn)次數(shù)多的用戶(hù)比訪問(wèn)次數(shù)少的用戶(hù)數(shù)量多,且以15次左右為拐點(diǎn),因此定義訪問(wèn)次數(shù)小于等于16次的用戶(hù)為低活躍用戶(hù),訪問(wèn)次數(shù)大于16次的用戶(hù)定義為高活躍用戶(hù),此定義只是從用戶(hù)的角度出發(fā),工作中當(dāng)從業(yè)務(wù)角度定義。訪問(wèn)次數(shù)多的訪客比訪問(wèn)次數(shù)少的訪客數(shù)量多,與絕大多數(shù)的產(chǎn)品訪問(wèn)規(guī)律相反,從側(cè)面反映了用戶(hù)黏性之強(qiáng)。
3)購(gòu)買(mǎi)活躍度:
buy_active_level = labels['counts_30_buy'].value_counts().sort_index(ascending= False)
plt.figure(figsize=(16,9))
buy_active_level.plot(title='30天內(nèi)購(gòu)買(mǎi)次數(shù)與購(gòu)買(mǎi)人數(shù)的關(guān)系',fontsize=18)
plt.ylabel('購(gòu)買(mǎi)人數(shù)',fontsize=14)
plt.xlabel('購(gòu)買(mǎi)次數(shù)',fontsize=14)
labels['buy_active_level'] = '高'
labels.loc[labels['counts_30_buy']<=14,'buy_active_level'] = '低'
結(jié)果如圖13所示。
圖13 30天內(nèi)購(gòu)買(mǎi)次數(shù)與購(gòu)買(mǎi)人數(shù)的關(guān)系
由圖13可知,14次左右是個(gè)拐點(diǎn),因此定義購(gòu)買(mǎi)次數(shù)小于等于14次的用戶(hù)為低活躍用戶(hù),大于14次的用戶(hù)為高活躍用戶(hù)。
4)購(gòu)買(mǎi)的品類(lèi)是否單一:
buy_single=df[df['behavior_type']==4].groupby('user_id').item_category.nunique().reset_index()
buy_single.rename(columns={'item_category':'buy_single'},inplace=True)
labels = pd.merge(labels,buy_single,how='left',on='user_id')
labels['buy_single'].fillna(-1,inplace=True)
labels['buy_single'] = labels['buy_single'].apply(lambda x: '是' if x>1 else '否' if x==1 else '未購(gòu)買(mǎi)' )
結(jié)果如圖14所示。
圖14 購(gòu)買(mǎi)品類(lèi)單一情況統(tǒng)計(jì)
了解用戶(hù)購(gòu)買(mǎi)的品類(lèi)有利于構(gòu)建用戶(hù)群體行為,比如該群體統(tǒng)一對(duì)化妝品消費(fèi)占比巨大,則該用戶(hù)群體的主要特征標(biāo)簽之一就是化妝品。
5)用戶(hù)價(jià)值分組(RFM模型):
last_buy_days = labels['days_buy'].value_counts().sort_index()
plt.figure(figsize=(16,9))
last_buy_days.plot(title='最后一次購(gòu)買(mǎi)距今天數(shù)與購(gòu)買(mǎi)人數(shù)的關(guān)系',fontsize=18)
plt.ylabel('購(gòu)買(mǎi)人數(shù)',fontsize=14)
plt.xlabel('距今天數(shù)',fontsize=14)
結(jié)果如圖15所示。
圖15 最后購(gòu)買(mǎi)行為距今天數(shù)與購(gòu)買(mǎi)人數(shù)的關(guān)系
使用RFM模型分析:
labels['buy_days_level'] = '高'
labels.loc[labels['days_buy']>8,'buy_days_level'] = '低'
labels['rfm_value'] = labels['buy_active_level'].str.cat(labels['buy_days_level'])
def trans_value(x):
if x == '高高':
return '重要價(jià)值客戶(hù)'
elif x == '低高':
return '重要深耕客戶(hù)'
elif x == '高低':
return '重要喚回客戶(hù)'
else:
return '即將流失客戶(hù)'
labels['rfm'] = labels['rfm_value'].apply(trans_value)
# 此處的apply()調(diào)用了一個(gè)自己定義(def)的函數(shù)
labels.drop(['buy_days_level','rfm_value'],axis=1,inplace=True)
labels['rfm'].value_counts()
結(jié)果如圖16所示。
圖16 RFM模型分析結(jié)果
- str.cat() 是指將兩個(gè)獨(dú)立的字符串拼接,此處將
- ’buy_active_level‘和’buy_days_level’ 拼接。如果要在兩個(gè)合并的列中間加一個(gè)分隔符號(hào),可在cat括號(hào)內(nèi)加:sep=’-’,用-連接合并內(nèi)容。
將buy_active_level和buy_days_level組合,形成“高高”或者“高低”等。將兩個(gè)重要指標(biāo)合并后,每個(gè)user_id進(jìn)入不同的分類(lèi)組。RFM模型是衡量客戶(hù)價(jià)值和客戶(hù)創(chuàng)利能力的重要工具和手段,其中,R(recently):最近一次消費(fèi);F(Frequently):消費(fèi)頻率;M(Monetary):消費(fèi)金額。
對(duì)最后輸出的用戶(hù)群體制定不同的營(yíng)銷(xiāo)策略。針對(duì)重要價(jià)值客戶(hù)要予以關(guān)注并維護(hù);針對(duì)重要深耕用戶(hù),予以相應(yīng)的價(jià)格刺激,如折扣和捆綁銷(xiāo)售等增加用戶(hù)的購(gòu)買(mǎi)頻率,提高黏性;針對(duì)重要喚回用戶(hù),要在特定時(shí)間點(diǎn)進(jìn)行刺激,比如進(jìn)行產(chǎn)品賣(mài)點(diǎn)刺激、品牌灌輸?shù)龋粩嗉訌?qiáng)他們對(duì)品牌的認(rèn)可,提高忠誠(chéng)度;針對(duì)流失客戶(hù),在此例中,因其數(shù)量占三分之一左右,需進(jìn)一步分析得出流失原因。
技術(shù)交流
歡迎轉(zhuǎn)載、收藏、有所收獲點(diǎn)贊支持一下!
目前開(kāi)通了技術(shù)交流群,群友已超過(guò)2000人,添加時(shí)最好的備注方式為:來(lái)源+興趣方向,方便找到志同道合的朋友
方式③、微信搜索公眾號(hào):Python學(xué)習(xí)與數(shù)據(jù)挖掘,后臺(tái)回復(fù):加群
本文摘自 :https://blog.51cto.com/u