電商用戶消費(fèi)行為數(shù)據(jù)分析

一、分析目的

對于初級階段的新電商來說,積累數(shù)據(jù),找準(zhǔn)運(yùn)營方向,關(guān)注流量,開源是重點(diǎn);
對于中級階段的電商,穩(wěn)定客流,提高店鋪銷量是首要任務(wù);
對于很有規(guī)模的電商,更側(cè)重留存與活躍,提升整體運(yùn)營水平。

不同的階段,對于數(shù)據(jù)分析指標(biāo)的側(cè)重點(diǎn)也不同。
本篇以某電商用戶訂單記錄為例,側(cè)重用戶消費(fèi)整體趨勢和用戶消費(fèi)行為,對用戶規(guī)模和用戶黏性中的幾個核心數(shù)據(jù)點(diǎn)進(jìn)行分析展示:

  • 找出用戶流量趨勢變化
  • 考察用戶分層、生命周期和購買周期

分析過程思維導(dǎo)圖:


電商用戶消費(fèi)數(shù)據(jù)分析.png

二、數(shù)據(jù)描述

數(shù)據(jù)來源于一家電商網(wǎng)站用戶訂單記錄

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('ggplot')

df = pd.read_csv('CDNOW_master.txt',sep='\s+',names = ['user_id','order_dt','pt_quantity','order_amount'])
df.head()
  • user_id::用戶編號
  • order_dt:訂單日期
  • pt_quantity:產(chǎn)品數(shù)量
  • order_amount:訂單金額
image.png
df.info()
WeChatb0f9116ec6f8925a2ead3ae67a052edd.png
df.describe()
WeChat16fb3d83f4459f741a57aae328e45382.png

觀察數(shù)據(jù):
1、日期需要轉(zhuǎn)換格式
2、大部分的訂單購買商品數(shù)量較少,平均值在2個左右,極值99很大,存在干擾
3、用戶消費(fèi)金額穩(wěn)定,同樣也存在極值干擾

三、數(shù)據(jù)清洗

時間格式轉(zhuǎn)換:需要按月分析數(shù)據(jù),這里直接轉(zhuǎn)為月份,忽略具體日期

df['order_dt']=pd.to_datetime(df.order_dt, format='%Y%m%d')
df['Month']=df['order_dt'].astype('datetime64[M]')
df.head()
WeChateb9d543cde1a6529a9fa6f551ec9e2d4.png
查看是否有空值
df.isnull().any()
WeChatd6cb61cb8ccc36d0744cf109944b694e.png

四、分析數(shù)據(jù)

  • 用戶消費(fèi)趨勢分析

1、每月銷量和銷售額分布情況

grouped_month = df.groupby('Month')
plt.rcParams['figure.figsize'] = (10, 6)
plt.subplot(221)
grouped_month.sum().pt_quantity.plot()
plt.title('pt_quantity')
plt.subplot(222)
grouped_month.sum().order_amount.plot()
plt.title('order_amount')
WeChat1f736f8db2db221a311357cf58c74d76.png

銷量與銷售額走勢一致

  • 前三個月,銷售數(shù)量在25000左右,銷售額在
    350000左右;
  • 后續(xù)月份,銷售數(shù)量在7000左右,銷售額在100000左右。

2、用戶數(shù)量、訂單數(shù)量分布情況

plt.subplot(223)
grouped_month['pt_quantity'].count().plot()
plt.title('order')
plt.subplot(224)
grouped_month.nunique().user_id.plot()
plt.title('user')
WeChatd1f198b48ed2d2aa2e47cbf470a46653.png

訂單量和用戶數(shù)量線性分布圖

  • 前三個月訂單數(shù)量在9000--11000之間,后續(xù)月份在2000左右
  • 前三個月用戶數(shù)量在8000--1000之間,后續(xù)月份在2000左右
  • 每月消費(fèi)次數(shù)與消費(fèi)人數(shù)差異不大

3、用戶數(shù)量分布情況
使用數(shù)據(jù)透視表,查看每月用戶數(shù)量、銷量和銷售額

pd.pivot_table(df, index='Month',
                  values=['user_id','pt_quantity','order_amount'],
                  aggfunc={'user_id':'count','pt_quantity':'sum','order_amount':'sum'})
WeChatd451b54c52832ba7d766e682bf0c7604.png
grouped_month['order_amount'].mean().plot()
WeChat0f6e4328018284094be07f8f7418585d.png

用戶平均消費(fèi)金額不穩(wěn)定,此消彼長

pd.pivot_table(df, index='Month',
                    columns='user_id',
                    values=['order_dt'],
                    aggfunc='count').mean(axis=1).plot()
WeChat72ff297068942d329f746f5093d1fe63.png

用戶平均消費(fèi)次數(shù)在1-2次之間,1997-1998呈上漲趨勢

消費(fèi)趨勢匯總:
  1. 1997年前三個月消費(fèi)總金額和產(chǎn)品總銷量比較高,后續(xù)時期迅速下降,后基本穩(wěn)定;
  2. 用戶平均消費(fèi)金額此消彼長;
  3. 用戶平均消費(fèi)次數(shù)穩(wěn)定在1-2次之間;
  • 用戶消費(fèi)行為分析

1、用戶消費(fèi)次數(shù)與消費(fèi)金額

grouped_user = df.groupby('user_id')
grouped_user.sum().describe()
WeChated591f53916e8271c5e06c4353cd7d75.png
  • 共有23570個用戶
  • 用戶平均消費(fèi)數(shù)量為7,平均消費(fèi)金額106元
  • 標(biāo)準(zhǔn)差都為平均數(shù)的兩倍以上,從購買數(shù)量來看,中位數(shù)為3,最大值為1033,說明小部分人購買了大量產(chǎn)品;從購買金額來看,平均消費(fèi)金額106,最大值13990,存在較大的極值干擾。
  • 消費(fèi)數(shù)量和金額的平均值都在75%位置,說明25%的用戶購買金額和數(shù)量較大,拉高了平均值,整體分布左偏
  • 消費(fèi)金額最小值為0,是因?yàn)橛写黉N訂單

用戶消費(fèi)金額、消費(fèi)次數(shù)分布散點(diǎn)圖

grouped_user.sum().plot.scatter(x='pt_quantity',y='order_amount')
image.png

根據(jù)散點(diǎn)圖分布,極值影響嚴(yán)重,根據(jù)切比雪夫定理,篩選數(shù)據(jù)
95%的數(shù)據(jù)集中在距離平均值5個標(biāo)準(zhǔn)差之內(nèi)

grouped_user.sum().query('order_amount<1306').plot.scatter(x='pt_quantity',y='order_amount')

去掉極值,重新調(diào)整后的分布圖


image.png

圖形大致呈現(xiàn)線性回歸,說明客單價穩(wěn)定

grouped_user.sum().query('pt_quantity<80').pt_quantity.plot.hist(bins=30)

用戶消費(fèi)次數(shù)直方圖:


image.png

大部分集中在10次以內(nèi),小部分?jǐn)?shù)據(jù)造成了干擾

grouped_user.sum().query('pt_quantity<80').order_amount.plot.hist(bins=30)

用戶金額次數(shù)直方圖


image.png

大部分集中在250元以下,絕大部分呈現(xiàn)集中趨勢,小部分?jǐn)?shù)據(jù)造成了干擾

2、用戶累計(jì)消費(fèi)額占比

a = grouped_user.sum().sort_values('order_amount').apply(lambda x : x.cumsum()/x.sum())
a.tail()

按消費(fèi)金額排序,使用累計(jì)加和函數(shù),計(jì)算用戶消費(fèi)額占比


image.png
user_cumsum = grouped_user.sum().sort_values('order_amount').apply(lambda x : x.cumsum()/x.sum())
user_cumsum.reset_index().order_amount.plot()
image.png

用戶人數(shù)是23750 50%的人只占了15%的消費(fèi)額 消費(fèi)總金額前4000名貢獻(xiàn)了60%的消費(fèi)額度
也就是維護(hù)好這前4000名客戶,可以完成KPI的60%

3、新老客消費(fèi)比

grouped_user.order_dt.min().value_counts().plot()

每月新客趨勢圖


image.png
  • 波動此消彼長
  • 2.1-2.15有一次劇烈波動
grouped_user.order_dt.max().value_counts().plot()

每月老客趨勢圖


image.png
  • 前三個月數(shù)量很高,原因是前期有大量新客,只消費(fèi)了一次后流失,后期逐漸穩(wěn)定
  • 4月有一次劇烈波動

4、單次用戶消費(fèi)數(shù)量

b = grouped_user.order_dt.agg([np.min,np.max])
(b['amin'] == b['amax']).value_counts().plot.pie(autopct='%.2f%%',startangle=90,shadow=True)
image.png

只消費(fèi)了一次的客戶占比51.14%,有一半客戶只購買了一次

c = df.groupby(['Month','user_id'])['order_dt'].agg(['min','max']).reset_index(level=1)
(c['min']==c['max']).groupby('Month').value_counts().plot.bar()

按月對比:


image.png
  • 每個月新客數(shù)多于老客數(shù)
  • 前三個月新客數(shù)量大,第四個月開始突然大幅度減少,后逐漸降低
  • 老客數(shù)量前三個月遞增,后續(xù)月份遞減

5、用戶分層——rfm模型
使用數(shù)據(jù)透視表,提取出用戶消費(fèi)額、最后一次消費(fèi)日期、消費(fèi)數(shù)量數(shù)據(jù)

rfm = pd.pivot_table(df,index='user_id',values=['order_dt','pt_quantity','order_amount'],
                          aggfunc={'order_dt':'max','pt_quantity':'sum','order_amount':'sum'})
rfm.head()
image.png

將最后一次消費(fèi)日期轉(zhuǎn)為最后一次消費(fèi)日距今的天數(shù)
(由于數(shù)據(jù)是很早之前的,為了更好的展示數(shù)據(jù),將對比標(biāo)準(zhǔn)改為所有用戶最后一次消費(fèi)的日期)

rfm['order_dt'] = (rfm['order_dt'].max() - rfm['order_dt'])/np.timedelta64(1,'D')
rfm.rename(columns={'order_amount':'M','order_dt':'R','pt_quantity':'F'},inplace=True)
rfm.head()
image.png

數(shù)據(jù)以平均值作為x、y、z軸標(biāo)準(zhǔn)值,編寫python函數(shù),將用戶M、R、F數(shù)據(jù),劃分象限,使用0、1作為標(biāo)準(zhǔn)值上下象限之分,給用戶分別貼上標(biāo)簽。
8類標(biāo)簽分別是:重要保持客戶、重要價值客戶、重要發(fā)展客戶、重要挽留客戶、一般保持客戶、一般價值客戶、一般發(fā)展客戶、一般挽留客戶

def rfm_func(x):
    level = x.apply(lambda x : np.where(x>=0,'1','0'))
    label = level.R + level.F +level.M
    dict_n={'011':'重要保持客戶',
           '111':'重要價值客戶',
           '001':'重要發(fā)展客戶',
           '101':'重要挽留客戶',
           '010':'一般保持客戶',
           '110':'一般價值客戶',
           '000':'一般發(fā)展客戶',
           '100':'一般挽留客戶'}
    result=dict_n[label]
    return result
rfm['客戶分類'] = rfm.apply(lambda x : x - x.mean()).apply(rfm_func,axis=1)
rfm.head()
image.png
rfm.groupby('客戶分類').agg({'M':'sum','R':'count','F':'sum'})

統(tǒng)計(jì)各標(biāo)簽用戶的總銷售額、總的消費(fèi)頻率,和人數(shù)


image.png

一般挽留客戶最多,重要保持客戶第二,重要保持客戶銷售金額占比最高

  color_dict= {
        '重要價值客戶':'r',
        '重要保持客戶':'g',
        '重要發(fā)展客戶':'b',
        '重要挽留客戶':'c',
        '一般價值客戶':'m',
        '一般保持客戶':'y',
        '一般發(fā)展客戶':'k',
        '一般挽留客戶':'w'
    }

rfm['color'] = rfm.客戶分類.map(color_dict)
rfm.plot.scatter('R','F',color=rfm['color'])

rfm客戶分層散點(diǎn)圖:


image.png

從RFM分層可知,大部分用戶為重要保持客戶,但這是由于極值影響,拉高了平均值,用戶劃分不夠準(zhǔn)確

6、用戶分層——新老用戶、活躍、回流、流失用戶

pivot_dt = pd.pivot_table(df,index='user_id',values='order_dt',columns='Month',aggfunc='count')
dt = pivot_dt.fillna(0).applymap(lambda x : np.where(x>0,1,0))
dt.head()

使用數(shù)據(jù)透視表,統(tǒng)計(jì)每月各用戶消費(fèi)情況,1表示當(dāng)月購買過,0表示當(dāng)月沒有購買


image.png

使用python函數(shù),根據(jù)用戶每月消費(fèi)情況,貼上標(biāo)簽

  • 未注冊用戶:unreg
  • 新用戶:new
  • 當(dāng)月未購買且已注冊:不活躍 unactive
  • 當(dāng)月購買上個月不活躍:回流用戶 return
  • 當(dāng)月購買上個月也購買:活躍 active
    (這個劃分標(biāo)準(zhǔn)比較簡單,不是很準(zhǔn)確)
    status=[]
    for i in range(18):
        if row[i]==0:
            if len(status)>0:
                if status[i-1]=='unreg':
                    status.append('unreg')
                else:
                    status.append('unactive')
            else:
                status.append('unreg')
                
        else:
            if len(status)==0:
                status.append('new')
            else:
                if status[i-1]=='unactive':
                    status.append('return')
                elif status[i-1]=='unreg':
                    status.append('new')
                else:
                    status.append('active')
    
    for index,value in enumerate(status):
        row.iloc[index]=status[index]

    return row
                            
purchase_status = dt.apply(active_status,axis=1)
purchase_status.head()
image.png

統(tǒng)計(jì)每月各類用戶的數(shù)量

user_fc = purchase_status.replace('unreg',np.nan).apply(lambda x : x.value_counts()).fillna(0).T
user_fc
image.png
user_fc.plot.area()

更直觀的面積圖:


image.png
  • 根據(jù)用戶分層面積圖可以看出,新用戶集中在前三個月,每個月都有大量不活躍用戶

計(jì)算回流率加入表中

user_fc['回流率']=(user_fc['return'].shift()/user_fc['unactive']).fillna(0)
user_fc
image.png
  • 活躍用戶,對應(yīng)的是持續(xù)消費(fèi)的客戶,對應(yīng)消費(fèi)運(yùn)營的質(zhì)量
  • 回流用戶,上月不消費(fèi),本月消費(fèi),對應(yīng)的是喚回運(yùn)營質(zhì)量
  • 不活躍用戶,對應(yīng)的是流失率

7、用戶生命周期
計(jì)算用戶第一次購買和最后一次購買的時間差

user_dt = df.groupby('user_id').order_dt.agg(['min','max'])
user_dt['diff'] = (user_dt['max']-user_dt['min'])/np.timedelta64(1,'D')
user_dt['diff'].describe()
image.png

平均生命周期為135天,最長544天

user_dt['diff'].plot.hist(bins=30)
image.png

用戶的生命周期受只購買過一次的用戶影響比較厲害,可以剔除

user_dt.query('diff>0')['diff'].plot.hist(bins=30)
image.png

剔除只購買一次的用戶,可以看出,用戶生命周期首位兩端人數(shù)比較多,中間值相對少

8、用戶購買周期

order=  df.groupby('user_id').apply(lambda x : x.order_dt-x.order_dt.shift())
order.describe()
image.png
(order/np.timedelta64(1,'D')).plot.hist(bins=20)
image.png
  • 訂單周期呈指數(shù)分布
  • 用戶平均購買周期是68天
  • 絕大部分用戶購買周期小于100天

9、復(fù)購率
復(fù)購率指自然月內(nèi),購買多次的用戶占比

order_dt = pivot_dt.applymap(lambda x : 1 if x>1 else 0 if x==1 else np.nan)
order_dt.head()

使用applymap函數(shù)對用戶購買各月購買次數(shù)進(jìn)行標(biāo)記

  • 當(dāng)月未購買標(biāo)記為null
  • 購買一次標(biāo)記為0
  • 購買1次以上標(biāo)記為1
image.png
((order_dt.sum())/(order_dt.count())).plot()

復(fù)購率線形圖


image.png

復(fù)購率穩(wěn)定在20%左右,前一個月因?yàn)橛写罅啃掠脩?,只購買了一次,拉低了復(fù)購率

10、回購率
回購率指曾經(jīng)購買過且在某一時期內(nèi)再次購買的用戶占比

dt.head()

使用前面分好的購買標(biāo)記
0為本月未購買,1為本月購買


image.png

編寫python函數(shù),對用戶回購情況貼上標(biāo)簽

  • 本月未購買標(biāo)記為null,不存在計(jì)算回購率的情況
  • 本月購買,下個月回購,本月標(biāo)記為1
  • 本月購買,下個月未回購,本月標(biāo)記為0
  • 最后一個月份,由于不清楚下月情況,統(tǒng)一標(biāo)記為null不做統(tǒng)計(jì)
def func_back(x):
    status=[]
    for i in range(17):
        if x[i] == 1:
            if x[i+1] ==1:
                status.append(1)
            if x[i+1] == 0:
                status.append(0)
        else:
            status.append(np.NaN)
    status.append(np.NaN)
    return pd.Series(status,index=x.index)

purchase_b = dt.apply(func_back,axis=1)
purchase_b.head()
image.png
(purchase_b.sum()/purchase_b.count()).plot()

回購率線形圖


image.png
  • 回購率:前三個月受只消費(fèi)一次的大量新客影響,回購率較低,后續(xù)穩(wěn)定在30%左右。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容