當(dāng)前位置:首頁(yè) > IT技術(shù) > 編程語(yǔ)言 > 正文

實(shí)戰(zhàn)案例,手把手教你用 Python 構(gòu)建電商用戶畫(huà)像
2022-02-14 14:17:58


大家好,本文以真實(shí)案為例手把手教你搭建電商系統(tǒng)的用戶畫(huà)像。

先來(lái)看該電商用戶畫(huà)像用到的標(biāo)簽。

數(shù)據(jù)內(nèi)容包括user_id(用戶身份)、item_id(商品)、IDbehavior_type(用戶行為類型,包含點(diǎn)擊、收藏、加購(gòu)物車、支付四種行為,分別用數(shù)字1、2、3、4表示)、user_geohash(地理位置)、item_category(品類ID,即商品所屬的品類)、Time(用戶行為發(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類型。
# 將時(shí)段分為'凌晨','上午','中午','下午','晚上'
df['hour'] = pd.cut(df['time'],bins=[-1,5,10,13,18,24],labels=['凌晨','上午','中午','下午','晚上'])

結(jié)果如圖1所示。

實(shí)戰(zhàn)案例,手把手教你用 Python 構(gòu)建電商用戶畫(huà)像_python

圖1 數(shù)據(jù)預(yù)處理結(jié)果

# 生成用戶標(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所示。

實(shí)戰(zhàn)案例,手把手教你用 Python 構(gòu)建電商用戶畫(huà)像_python_02

圖2 制作好的用戶ID

之后分析后的內(nèi)容都會(huì)放置在此表中,相當(dāng)于建立了一個(gè)空白表,將自己分析后的結(jié)論一一加入。

數(shù)構(gòu)建用戶行為標(biāo)簽

1)對(duì)用戶瀏覽時(shí)間段進(jìn)行分析

選取出各用戶瀏覽次數(shù)最多的時(shí)段,看看用戶到底在什么時(shí)間瀏覽商品比較多。

# 對(duì)用戶和時(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è)用戶瀏覽次數(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ù)最多,并將其作為該用戶的瀏覽時(shí)間標(biāo)簽的代表。
# 選取各用戶瀏覽次數(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()
# 將用戶瀏覽活躍時(shí)間段加入用戶標(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所示。

實(shí)戰(zhàn)案例,手把手教你用 Python 構(gòu)建電商用戶畫(huà)像_類目_03

圖3 用戶瀏覽時(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);使用類似的代碼可以生成瀏覽活躍時(shí)間段,此處就不再贅述。

2)關(guān)于類目的用戶行為。

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ù)不同的用戶行為,如瀏覽、收藏等,分別導(dǎo)出數(shù)據(jù)進(jìn)行分析。

# 對(duì)用戶與類目進(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è)用戶瀏覽次數(shù)最多的類目
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ù)字類型改為字符串型
df_cate_most_browse['item_category'] = df_cate_most_browse['item_category'].astype(str)
# 選取各用戶瀏覽次數(shù)最多的類目,如有并列最多的類目,用逗號(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()

# 將用戶瀏覽最多的類目加入用戶標(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)

用戶瀏覽最多的類目如圖4所示。

實(shí)戰(zhàn)案例,手把手教你用 Python 構(gòu)建電商用戶畫(huà)像_數(shù)據(jù)分析_04

圖4 瀏覽最多的類目

收藏、加購(gòu)和購(gòu)買(mǎi)最多的類目生成邏輯相同,重復(fù)操作后結(jié)果如圖5所示。

實(shí)戰(zhàn)案例,手把手教你用 Python 構(gòu)建電商用戶畫(huà)像_類目_05

圖5 關(guān)于類目的用戶行為

從整理的數(shù)據(jù)中可以看出,瀏覽、加購(gòu)物車、收藏、購(gòu)買(mǎi)之前其實(shí)不一定存在明顯的必然關(guān)系,我們還需要進(jìn)一步分析得到一些規(guī)律。

3)近30天用戶行為分析。

近30天購(gòu)買(mǎi)次數(shù):

# 將購(gòu)買(mǎi)行為按用戶進(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)行為按用戶進(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ì)用戶進(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所示。

實(shí)戰(zhàn)案例,手把手教你用 Python 構(gòu)建電商用戶畫(huà)像_數(shù)據(jù)挖掘_06

圖6 近30天用戶行為

近30天用戶行為分析屬于中長(zhǎng)期的用戶行為,我們可以依此判斷是否需要調(diào)整營(yíng)銷策略,類似可以得到短期的7天用戶行為分析,觀察中短期或一個(gè)小周期內(nèi),用戶的行為是何種情況。

4)最后一次行為距今天數(shù)。

分析上次和本次用戶行為的時(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ù)的效果。

類似可以生成上次加購(gòu)、購(gòu)買(mǎi)距今天數(shù),分析得到用戶的活躍情況,如圖7所示,如果長(zhǎng)時(shí)間沒(méi)有活躍,則需要推送一些內(nèi)容,或者發(fā)放優(yōu)惠券刺激用戶。

實(shí)戰(zhàn)案例,手把手教你用 Python 構(gòu)建電商用戶畫(huà)像_數(shù)據(jù)挖掘_07

圖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ù)分析用戶的購(gòu)買(mǎi)頻率,方便確定用戶的消費(fèi)活躍等級(jí),精準(zhǔn)制定營(yíng)銷方式。結(jié)果如圖8所示。

實(shí)戰(zhàn)案例,手把手教你用 Python 構(gòu)建電商用戶畫(huà)像_類目_08

圖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ì)填充NaN數(shù)據(jù),返回填充后的結(jié)果,inplace=True代表原地填充。

結(jié)果如圖9所示。

實(shí)戰(zhàn)案例,手把手教你用 Python 構(gòu)建電商用戶畫(huà)像_數(shù)據(jù)挖掘_09

圖9 是否瀏覽未下單情況統(tǒng)計(jì)

針對(duì)瀏覽未下單的用戶要加大推廣力度,可以增加優(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所示。

實(shí)戰(zhàn)案例,手把手教你用 Python 構(gòu)建電商用戶畫(huà)像_數(shù)據(jù)挖掘_10

圖10 是否加購(gòu)未下單情況統(tǒng)計(jì)

制定營(yíng)銷策略時(shí),要重點(diǎn)注意這部分人群,因?yàn)榧淤?gòu)未下單的購(gòu)買(mǎi)轉(zhuǎn)化率是最大的,有成功下單、最大潛力的客戶就在這里。

構(gòu)建用戶屬性標(biāo)簽

1)是否復(fù)購(gòu)用戶:

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)的用戶標(biāo)記為'未購(gòu)買(mǎi)',有購(gòu)買(mǎi)未復(fù)購(gòu)的用戶標(biāo)記為'否',有復(fù)購(gòu)的用戶標(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所示。

實(shí)戰(zhàn)案例,手把手教你用 Python 構(gòu)建電商用戶畫(huà)像_數(shù)據(jù)挖掘_11

圖11 是否復(fù)購(gòu)用戶統(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所示。

實(shí)戰(zhàn)案例,手把手教你用 Python 構(gòu)建電商用戶畫(huà)像_python_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ù)多的用戶比訪問(wèn)次數(shù)少的用戶數(shù)量多,且以15次左右為拐點(diǎn),因此定義訪問(wèn)次數(shù)小于等于16次的用戶為低活躍用戶,訪問(wèn)次數(shù)大于16次的用戶定義為高活躍用戶,此定義只是從用戶的角度出發(fā),工作中當(dāng)從業(yè)務(wù)角度定義。訪問(wèn)次數(shù)多的訪客比訪問(wèn)次數(shù)少的訪客數(shù)量多,與絕大多數(shù)的產(chǎn)品訪問(wèn)規(guī)律相反,從側(cè)面反映了用戶黏性之強(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所示。

實(shí)戰(zhàn)案例,手把手教你用 Python 構(gòu)建電商用戶畫(huà)像_類目_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次的用戶為低活躍用戶,大于14次的用戶為高活躍用戶。

4)購(gòu)買(mǎ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所示。

實(shí)戰(zhàn)案例,手把手教你用 Python 構(gòu)建電商用戶畫(huà)像_類目_14

圖14 購(gòu)買(mǎi)品類單一情況統(tǒng)計(jì)

了解用戶購(gòu)買(mǎi)的品類有利于構(gòu)建用戶群體行為,比如該群體統(tǒng)一對(duì)化妝品消費(fèi)占比巨大,則該用戶群體的主要特征標(biāo)簽之一就是化妝品。

5)用戶價(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所示。

實(shí)戰(zhàn)案例,手把手教你用 Python 構(gòu)建電商用戶畫(huà)像_數(shù)據(jù)挖掘_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à)值客戶'
elif x == '低高':
return '重要深耕客戶'
elif x == '高低':
return '重要喚回客戶'
else:
return '即將流失客戶'
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所示。

實(shí)戰(zhàn)案例,手把手教你用 Python 構(gòu)建電商用戶畫(huà)像_數(shù)據(jù)挖掘_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)入不同的分類組。RFM模型是衡量客戶價(jià)值和客戶創(chuàng)利能力的重要工具和手段,其中,R(recently):最近一次消費(fèi);F(Frequently):消費(fèi)頻率;M(Monetary):消費(fèi)金額。

對(duì)最后輸出的用戶群體制定不同的營(yíng)銷策略。針對(duì)重要價(jià)值客戶要予以關(guān)注并維護(hù);針對(duì)重要深耕用戶,予以相應(yīng)的價(jià)格刺激,如折扣和捆綁銷售等增加用戶的購(gòu)買(mǎi)頻率,提高黏性;針對(duì)重要喚回用戶,要在特定時(shí)間點(diǎn)進(jìn)行刺激,比如進(jìn)行產(chǎn)品賣點(diǎn)刺激、品牌灌輸?shù)?,不斷加?qiáng)他們對(duì)品牌的認(rèn)可,提高忠誠(chéng)度;針對(duì)流失客戶,在此例中,因其數(shù)量占三分之一左右,需進(jìn)一步分析得出流失原因。

技術(shù)交流

歡迎轉(zhuǎn)載、收藏、有所收獲點(diǎn)贊支持一下!

實(shí)戰(zhàn)案例,手把手教你用 Python 構(gòu)建電商用戶畫(huà)像_類目_17

目前開(kāi)通了技術(shù)交流群,群友已超過(guò)2000人,添加時(shí)最好的備注方式為:來(lái)源+興趣方向,方便找到志同道合的朋友


方式③、微信搜索公眾號(hào):Python學(xué)習(xí)與數(shù)據(jù)挖掘,后臺(tái)回復(fù):加群


實(shí)戰(zhàn)案例,手把手教你用 Python 構(gòu)建電商用戶畫(huà)像_python_18



本文摘自 :https://blog.51cto.com/u

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >