天天看點

使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論

目錄

  • 一.項目背景與資料來源
    • 1.1 項目背景
    • 1.2 資料來源
  • 二.提出問題
  • 三. 資料處理
    • 3.1 資料得擷取和檢視
    • 3.2 資料處理
  • 四. 使用者總體消費趨勢分析
    • 4.1 每月的總銷售額
    • 4.2 每月的消費次數
    • 4.3 每月的銷量
    • 4.4 每月的消費人數
  • 五.使用者個體消費資料分析
    • 5.1 使用者消費金額和消費次數的描述統計
    • 5.2 使用者消費金額和消費次數的散點圖
    • 5.3 使用者消費金額的分布圖
    • 5.4 使用者消費次數的分布圖
    • 5.5大客戶貢獻情況
      • 5.5.1使用者銷售額貢獻情況
    • 5.5.2使用者銷量貢獻情況
  • 六.使用者消費周期分析
    • 6.1 使用者購買周期(按訂單)
      • 6.1.1 使用者消費周期描述
      • 6.1.2 使用者消費周期分布
    • 6.2 使用者生命周期(按第一次&最後一次消費)
      • 6.2.1 使用者生命周期描述
      • 6.2.2 使用者生命周期分布
  • 七.使用者分層
    • 7.1 按使用者價值分層---RFM模型
    • 7.2 按使用者活躍程度分層——新使用者、活躍使用者、不活躍使用者、回流使用者
  • 八.使用者品質分析
    • 8.1 複購率
    • 8.2 回購率
    • 8.3分析留存率(3,7,15,30,90,365天為周期)
  • 九.結論

一.項目背景與資料來源

1.1 項目背景

  使用者分析一方面我們要知道使用者得基礎屬性,他可以反映使用者的能力和意願。另一方面我們需要使用者的行為資料,他反映了使用者消費能力,興趣偏好。通過使用者行為資料分析,可以使營運部門在營銷時更加具有針對性,進而節省成本,提升效率。為産品營運提供政策幫助,提升産品生命周期。

  CDNow曾經是一家線上音樂零售平台,後被德國波泰爾斯曼娛樂集團公司出資收購,其資産總價值在最輝煌時曾超過10億美元。本文主要通過分析CDNow網站的使用者購買明細來分析該網站的使用者消費行為。

1.2 資料來源

資料來源CDNow網站的使用者在1997年1月1日至1998年6月30日期間内購買CD交易明細,共有234213條資料,主要包含以下四個字段:

  • user_id 使用者ID
  • order_dt 購買日期
  • order_products 購買産品數
  • order_amount 購買金額

資料連結——提取碼:m6ct

二.提出問題

三. 資料處理

3.1 資料得擷取和檢視

#導入常用庫
import pandas as pd 
import numpy as np
from datetime import datetime
#導入源資料
columns = ['使用者ID','購買日期','訂單數','訂單金額']
df = pd.read_table("CDNOW_master.txt",names = columns,sep = '\s+')

#加載包和資料,檔案是txt,用read_table方法打開
#因為原始資料不包含表頭,是以需要賦予
#字元串是空格分割,用read_table中\s+表示比對任意空白符
#加載包和資料,檔案是txt,用read_table方法打開,因為原始資料不包含表頭,是以需要賦予。字元串是空格分割,用\s+表示比對任意空白符

           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論

觀察資料,order_dt表示購買時間,但是他是年月日組合的一串數字,不是時間類型,,需要轉換。

使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 使用者每個訂單平均購買2.41個商品,每個訂單平均消費35.89元。
  • 購買商品數量的标準差為2.33,說明資料具有一定的波動性;中位數為2個商品,75分位數為3個商品,說明大部分訂單的購買數量都不多。最大值在99個,數字比較高。購買金額的情況差不多,大部分訂單都集中在小額。大部分使用者都是小額,然而小部分使用者貢獻了收入的大頭,俗稱二八。
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 原資料沒有空值,很幹淨的資料。
  • 當利用pandas進行資料處理的時候,經常會遇見資料類型的問題,order_dt資料類型是int64

3.2 資料處理

df["order_dt"]= pd.to_datetime(df.order_dt,format="%Y%m%d")
# pandas to_datetime将給定的日期時間轉換為timestamp的标準日期時間格式 
# https://pandas.pydata.org/pandas-docs/version/0.15/generated/pandas.to_datetime.html
# https://blog.csdn.net/qq_39290225/article/details/98313743
    
df["month"]=df.order_dt.astype("datetime64[M]")
# astype 轉換資料類型 時間類型可以截取到年Y 或 月M 等等
# https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.astype.html

df.head()
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論

在這裡插入圖檔描述

四. 使用者總體消費趨勢分析

#加載可視化的包
import matplotlib.pyplot as plt
#可視化顯示在頁面
%matplotlib inline
#更改設計風格
plt.style.use('ggplot')
#解決中文顯示參數設定
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文标簽
plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負号
           
#按照月份進行分組
grouped_month = df.groupby("month")
order_month_amount = grouped_month[["order_amount"]].sum()
order_month_amount.head()
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論

4.1 每月的總銷售額

使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 由上圖可知,消費金額在前三個月達到最高峰,後續消費金額較為穩定,有輕微下降趨勢

4.2 每月的消費次數

使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論

前三個月的消費次數在10000次左右,後續月份的平均消費此時在2500次

4.3 每月的銷量

使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論

4.4 每月的消費人數

使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 四個折線圖的整體趨勢基本一緻,可以看出來,1997年前3個月的銷量特别高,随之而來的銷售額也是暴漲,在3月份之後驟然下降,接近平穩。為什麼會呈現這個原因呢?我們假設是使用者身上出了問題,早期時間段的使用者中有異常值,第二假設是各類促銷營銷,但這裡隻有消費資料,是以無法判斷。
  • 另一方面,在2月到3月這段期間,可以發現消費人數稍有下降,但總銷量與總銷售額卻依然上升,是不是說明3月份的使用者中有我們需要重點發展的高價值客戶呢?

五.使用者個體消費資料分析

#根據使用者分組
grouped_user = df.groupby('user_id')
           

5.1 使用者消費金額和消費次數的描述統計

使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論

從使用者角度看,每位使用者平均購買7張CD,最多的使用者購買了1033張。使用者的平均消費金額(客單價)106元,标準差是240,結合分位數和最大值看,平均值才和75分位接近,肯定存在小部分的高額消費使用者,這也符合二八法則。

5.2 使用者消費金額和消費次數的散點圖

使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論

我們将消費金額大于等于4000的點比較稀疏,我們将其過濾掉

# 進行一個過濾
grouped_user.sum().query('order_amount<4000').plot.scatter(x='order_amount',y='order_products')
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 金額和商品量的關系也是以呈線性,沒幾個離群點,商品比較單一,使用者比較健康而且規律性很強。

5.3 使用者消費金額的分布圖

使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 大部分使用者的消費能力并不高,将近半數的使用者消費金額不超過40元,高消費使用者( >200元 )不超過2000人。

5.4 使用者消費次數的分布圖

grouped_user.sum().query(‘order_products < 60’).order_products.plot.hist(bins = 50)

使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 大部分使用者購買CD的數量都是在3張以内,購買大量CD的使用者數量并不多。

5.5大客戶貢獻情況

5.5.1使用者銷售額貢獻情況

# 計算每個使用者的消費金額總額
user_sum = grouped_user.sum().sort_values('order_amount')
# 計算使用者的累加消費額
user_cumsum = grouped_user.sum().sort_values('order_amount').cumsum()
# 計算累計消費占比= 使用者累加消費額/總消費額
user_cumsum = grouped_user.sum().sort_values('order_amount').apply(lambda x:x.cumsum()/x.sum())
user_cumsum.reset_index().order_amount.plot()
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 說明:前20000個使用者,大約80%的使用者貢獻了40%的銷售額,20%的使用者貢獻了60%的銷售額

5.5.2使用者銷量貢獻情況

# 計算累計消量占比= 使用者累加消量/總消量
user_Pcumsum = grouped_user.sum().sort_values('order_products').apply(lambda x:x.cumsum()/x.sum())
user_Pcumsum.reset_index().order_amount.plot()
plt.xlabel("使用者數")
plt.ylabel("累計消量占比")
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 跟銷售額十分接近。前80%使用者貢獻了40%的消費,而後20%使用者貢獻了60%的消費。符合二八趨勢。也就是們隻要維護了這20%使用者就可以把業績KPI完成60%,如果能把20%的使用者營運的更好就可以占比70%—80%之間。

六.使用者消費周期分析

6.1 使用者購買周期(按訂單)

6.1.1 使用者消費周期描述

使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
#計算每個使用者的每筆訂單的周期
order_diff = grouped_user.apply(lambda x:x.order_dt - x.order_dt.shift())#d
#購買周期描述
order_diff.describe()
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 使用者平均購買周期是68天,最大購買周期是533天,想要召回使用者,在六十幾天天左右的消費間隔是比較好的。

6.1.2 使用者消費周期分布

#購買周期分布圖
plt.style.use('ggplot')
(order_diff / np.timedelta64(1,'D')).hist(bins = 20)#去掉機關
plt.title('使用者購買周期分布')
plt.xlabel('時間天數')
plt.ylabel('頻次')
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 典型的(指數)長尾分布,大部分使用者的消費間隔确實比較,消費在一到十天的使用者非常多。不妨将時間召回點設為消費後立即贈送優惠券,消費後10天詢問使用者禮品怎麼樣,消費後20天提醒優惠券到期,消費後30天短信推送。

6.2 使用者生命周期(按第一次&最後一次消費)

接下來計算每一位使用者生命周期,這裡定義第一次消費至最後一次消費為整個使用者生命。

6.2.1 使用者生命周期描述

#使用者第一次消費(首購)
grouped_user.min().order_dt.value_counts().plot()
# pandas 的 value_counts() 函數可以對Series裡面的每個值進行計數并且排序。https://www.cnblogs.com/keye/p/9664414.html
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
#使用者最後一次消費
grouped_user.max().order_dt.value_counts().plot()
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 使用者最後一次購買買的分布比第一次分布廣 大部分使用者最後一次購買,集中在前三個月,說明很多使用者購買一次後就不再購買
  • 随着時間的遞增,最後一次購買數也在遞增,消費呈現流失上升的情況
user_life= grouped_user.order_dt.agg(['min','max'])
user_life.head()
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
#使用者生命周期(按第一次&最後一次消費)
(user_life['max'] - user_life['min']).describe()
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 所有使用者的平均生命周期是134天, 消費一次的使用者超過一半。

6.2.2 使用者生命周期分布

plt.style.use('ggplot')
((user_life['max'] - user_life['min']) / np.timedelta64(1,'D')).hist(bins = 40)
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 大部分使用者隻消費了一次,所有生命周期的大頭都集中在了0天。

但這不是我們想要的答案,不妨将隻消費了一次的新客排除,來計算所有消費過兩次以上的老客的生命周期。

#排除隻消費一次的資料
user_life['a0']=(user_life['max']-user_life['min'])/np.timedelta64(1,'D')
plt.style.use('ggplot')
user_life.loc[user_life['a0']>0]['a0'].hist(bins=50)
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論

上圖可見,使用者生命周期呈現雙峰趨勢,20天内生命周期的使用者是一個高峰,400至500天内生命周期的使用者是另一個高峰。

根據此情況,應該在20天内對客戶進行引導,促進其再次消費并形成消費習慣,延長其生命周期;在100至400天的使用者,也要根據其特點推出有針對性的營銷活動,引導其持續消費。

七.使用者分層

7.1 按使用者價值分層—RFM模型

為了進行使用者精細化營運,可以利用RFM模型來衡量使用者價值和使用者創利能力,其中

R(Recency)最近一次消費時間:客戶最近一次交易時間的間隔。R值越大,表示客戶交易發生的日期越久,反之則交易發生的日期越近。

F(Frequency)消費頻率:消費頻率是指使用者在統計周期内購買商品的次數。F值越大,表示客戶交易越頻繁,反之則表示客戶交易不夠活躍。

M(Monetary)消費金額:消費金額是指使用者在統計周期内消費的總金額。M值越大,表示客戶價值越高,反之則表示客戶價值越低。

根據上述三個次元,對客戶做細分:

使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
#透視表将rfm需要的字段拎出來
rfm = df.pivot_table(index = "user_id",
                              values=['order_products','order_amount','order_dt'],
               aggfunc={'order_products':'sum','order_amount':'sum','order_dt':'max'})
rfm.head()
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
将日期的最大值和目前日期的內插補點作為R
rfm['R'] = -(rfm.order_dt - rfm.order_dt.max())/np.timedelta64(1,'D')#最近一次消費距離最近時間的天數,np.timedelta64(1,'D')相當于天數的機關 1表示小數位的個數
rfm.rename(columns= {'order_products':'F','order_amount':'M'},inplace = True)
rfm
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
# 标準化 減去平均值
rfm[['R','F','M']].apply(lambda x: x-x.mean()) 
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
# 建構rfm模型
def rfm_func(x):
    level = x.apply(lambda x:'1' if x >= 0 else '0')
    label = level.R + level.F +level.M
    d = {
        '011':'重要價值客戶',
        '111':'重要保持客戶',
        '001':'重要發展客戶',
        '101':'重要挽留客戶',
        '010':'一般價值客戶',
        '110':'一般保持客戶',
        '000':'一般發展客戶', 
        '100':'一般挽留客戶',
    }
    result = d[label]
    return result

rfm['label'] = rfm[['R','F','M']].apply(lambda x: x-x.mean()).apply( rfm_func, 
                                                                    axis=1 )
rfm
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
#c求和
rfm.groupby("label").sum()
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 從rfm分層可知,重要價值客戶的累計消費金額排名最高,高達1592039。
#計數
rfm.groupby("label").count()
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 不同層次使用者的消費人數,一般挽留使用者的消費人數排名第一,有14074人,重要價值客戶排名第二,有4554人,與一般挽留使用者差距比較大,但累計消費金額最多,業務方可以根據結果對客戶分類營運,降低營銷成本,提高ROI。
rfm.loc[rfm.label == '重要價值客戶','color'] = 'g' # 給rfm添加顔色這一列,将重要價值客戶表示成綠色
rfm.loc[rfm.label == '重要保持客戶','color'] = 'r'# 将重要保持客戶表示成紅色
rfm.loc[rfm.label == '重要挽留客戶','color'] = 'b'# 将重要發展客戶表示成藍色
rfm.loc[rfm.label == '重要發展客戶','color'] = 'y'# 将重要挽留客戶表示成藍色
#将一般客戶表示成黑色
rfm.loc[rfm.label == '一般價值客戶','color'] = 'k' 
rfm.loc[rfm.label == '一般保持客戶','color'] = 'k'
rfm.loc[rfm.label == '一般挽留客戶','color'] = 'k'
rfm.loc[rfm.label == '一般發展客戶','color'] = 'k'
#rfm.loc[~(rfm.label == '重要價值客戶'or rfm.label == '重要保持客戶'or rfm.label == '重要挽留客戶' or rfm.label == '重要發展客戶'),'color'] = 'k' #給rfm添加顔色這一列,将非重要客戶表示成黑色
rfm.plot.scatter('F','R',c = rfm.color) # scatter(x坐标,y坐标,c表示顔色) 我們必須在rfm增加一列
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論

7.2 按使用者活躍程度分層——新使用者、活躍使用者、不活躍使用者、回流使用者

  • 新使用者的定義是第一次消費。
  • 活躍使用者即老客,在某一個時間視窗内有過消費。
  • 不活躍使用者是注冊了的使用者在這個時間視窗内沒有消費過的老客。
  • 回流使用者是注冊了得使用者在上一個視窗中沒消費,而在目前時間視窗内有過消費。
#将使用者消費資料進行資料透視:
pivoted_counts = df.pivot_table(index="user_id",
                               columns = "month",
                               values = "order_dt",
                               aggfunc = "count").fillna(0)
pivoted_counts.head()
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 圖中的數字(0,1,2)代表了當月的消費次數。
df2 = df1.applymap(lambda x:1 if x>0 else 0)
df2.tail()
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 0代表當月沒有消費,1代表有消費。
#使用者活躍分層函數
def active_status(data):
    status = []#活躍狀态
    for i in range(18):#month 上面得月份數     
        if data[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') #這個月就是活躍使用者
       
    data.iloc[0:]=status#将status指派給第一行
    return data     
           
#可得到一張不同使用者在不同月份的不同狀态(new=新、active=活躍、return=回流、unactive=流失),unreg相當于未注冊,指這個使用者在這個月及以前從未購買過産品,主要為了統計起來更加友善而加進去。
indexs=df['月份'].sort_values().astype('str').unique()
purchase_stats = df_purchase.apply(active_status,axis = 1)#軸向為行
product_stats.head(5)
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
#将未注冊的使用者調整為缺失值,便于對其他類型進行計數
purchase_stats_ct = purchase_stats.replace('unreg',np.NaN).apply(lambda x:pd.value_counts(x))
purchase_stats_ct 
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
#将NAN換成0 然後用T進行轉列
purchase_stats_ct.fillna(0).T.head()
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 從表中可以看出,新客都是集中在前三個月,回流使用者整體在1000左右,而不活躍使用者數量随時間稍有上升。
#每個月消費占比構成
purchase_stats_ct.fillna(0).T.apply(lambda x:x/x.sum(),axis=1)
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
#制作面積圖,可以更直覺的觀察走勢
plt.style.use('ggplot')
purchase_stats_ct.fillna(0).T.plot.area()
plt.title('每月使用者活動狀态')
plt.ylabel('使用者人數')
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論

由上面的圖表我們看到:

  • 新客使用者:僅在前三個月,後續再無新增客戶。
  • 活躍使用者:比例持續下降,說明持續消費的使用者數量在減少,也說明營運部門的促活效果并不好。
  • 回流使用者:比例也稍有下降,在4%左右波動。
  • 不活躍使用者:比例稍有上升,流失較大。
#每月使用者回回占比
#求出每月不同狀态使用者的個數
pivot_user_status=purchase_stats.apply(lambda x:x.value_counts()).fillna(0).T.drop('unreg',axis=1)
(pivot_user_status['return']/pivot_user_status['unactive'].shift()).plot()#shift()表示取上一個單元格得資料  即這個月得回流除以上個月的活躍 https://blog.csdn.net/weixin_30760895/article/details/95394034?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
plt.title('每月回流使用者占比')
plt.ylabel('使用者占比')
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論

每月回流使用者占比:指的是上個月不活躍的使用者在本月重新活躍的使用者占比; 從圖可知,使用者的整體活躍度在不斷下降,使用者正在流失。

八.使用者品質分析

8.1 複購率

複購率的定義:在某時間視窗内消費兩次及以上的使用者在總消費使用者中占比。這裡的時間視窗是月,如果一個使用者在同一天下了兩筆訂單,這裡也将他算作複購使用者

##求複購,消費次數大于1的則說明是複購,其餘不是
# x > 1 就表示購買多次 複購了 purchase_r指派為1 
# x = 1 就表示購買1次  purchase_r指派為0
# x = 0  就表示沒有購買 purchase_r指派為NaN
purchase_r = pivoted_counts.applymap(lambda x:1 if x > 1 else np.NaN if x == 0 else 0)#多重條件得嵌套寫法 當x<=1 np.NaN if x == 0 else 0
plt.style.use('ggplot')
(purchase_r.sum() / purchase_r.count()).plot(figsize = (10,4))
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 複購率穩定在20%左右,前三個月因為有大量的新使用者湧入,而這批使用者隻購買了一次,是以導緻複購率并不高

8.2 回購率

回購率:是某一個時間視窗内消費的使用者,在下一個時間視窗仍舊消費的占比。比如,1月消費使用者1000,他們中有300個2月依然消費,回購率是30%。

#回購率的定義
#本月有消費,下月有消費,為1;
#本月有消費,下月無消費,為0;
# 本月無消費,則為空值。
def purchase_back(data):
    status = []
    for i in range(17):
        if data[i] == 1:
            if data[i+1] == 1:
                status.append(1)
            if data[i+1] == 0:
                status.append(0)
        else:
            status.append(np.NaN)
    status.append(np.NaN)    #最後這邊是因為我們的資料截止到6月,沒有7月的資料進行計算,是以定義為空值
    data.iloc[0:]=status
    return data
           
purchase_b = df_purchase.apply(purchase_back,axis = 1)
plt.style.use('ggplot')
(purchase_b.sum() / purchase_b.count()).plot(figsize = (10,4))
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
  • 上圖可以看出,在初期使用者的回購率并不高,1月的回購率隻有15%左右,4月份起回購率穩定在30%左右。
  • 從每月有回購消費的使用者數資料可以看出,回購使用者數整體有下降趨勢。
  • 對回購率的分析,再次說明了對于新使用者,在其第一次消費後的三個月内是一段重要的時期,需要營銷政策積極引導其再次消費及持續消費。
  • 另外,對于有持續消費的老客,也要适時推出回報老客戶的優惠活動,以加強老客的忠誠度

8.3分析留存率(3,7,15,30,90,365天為周期)

orderdt_min=df.groupby('user_id').order_dt.min().reset_index()#第一次消費
orderdt_copy = df[['user_id','order_dt','order_products','order_amount']]
user_purchase_retention = pd.merge(left=orderdt_copy,right=orderdt_min,how='inner',on='user_id',suffixes=('','_min'))
user_purchase_retention.head()
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論

增加一列,表示訂單日期與使用者首次消費日期間的間隔時間,将時間內插補點分桶處理:

分成0~3天内,3~7天内,7~15天……代表使用者目前消費時間距第一次消費屬于哪個時間段

#每一次消費時間與第一次消費時間間隔
user_purchase_retention['order_date_diff']=user_purchase_retention['order_dt']-user_purchase_retention['order_dt_min']
#将timedelta轉換為數值型
user_purchase_retention['date_diff']=user_purchase_retention.order_date_diff.apply(lambda x:x/np.timedelta64(1,'D'))
user_purchase_retention.head(5)
#将時間間隔分桶(0-3)(3-7)等
bin=[0,3,7,15,30,60,90,180,365]
user_purchase_retention['date_diff_bin']=pd.cut(user_purchase_retention.date_diff,bins=bin)#用cut進行分桶
user_purchase_retention.head(10)
#這裡date_diff=0并沒有被劃分入0~3天,因為計算的是留存率,如果使用者僅消費了一次,留存率應該是0。另外,如果使用者第一天内消費了多次,但是往後沒有消費,也算作留存率0。
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
#用pivot透視表 使用者第一次消費之後,後續各時間段的消費次數
pivoted_retention=user_purchase_retention.pivot_table(index='user_id',
columns='date_diff_bin',values='order_products',aggfunc=sum,dropna=False)
#1代表有消費,0代表沒有
pivoted_retention_trans=pivoted_retention.applymap(lambda x:1 if x>0 else 0)
pivoted_retention_trans
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論
#不同時間間隔的留存率
(pivoted_retention_trans.sum()/pivoted_retention_trans.count()).plot.bar(figsize=(10,5))
plt.xlabel('消費時間間隔')
plt.title('留存率')
           
使用者消費行為分析一.項目背景與資料來源二.提出問題三. 資料處理四. 使用者總體消費趨勢分析五.使用者個體消費資料分析六.使用者消費周期分析七.使用者分層八.使用者品質分析九.結論

隻有2.5%的使用者在第一次消費的次日至3天内有過消費,3%的使用者在3~7天内有過消費。數字并不好看,CD購買确實不是高頻消費行為。有20%的使用者在第一次消費後的三個月到半年之間有過購買,27%的使用者在半年後至1年内有過購買。

從營運角度看,CD機營銷在服務新使用者的同時,應該注重使用者忠誠度的培養,放長線掉大魚,在一定時間内召回使用者購買。

九.結論

1.整體趨勢:按年的月份趨勢銷量和銷售額在1-3月份相對極高,然後驟降,原因可能跟這段時間的大力促銷或與商品的季度屬性有關。

2.使用者個體特征:每筆訂單的金額和商品購買量都集中在區間的低段水準,都是小金額小批量進行購買,此類交易群體,可在豐富産品線和增加促銷活動提高轉換率和購買率。

3.大部分使用者的消費總額和購買總量都集中剛在低段,長尾分布,這個跟使用者需求有關,可以對商品進行多元文化價值的賦予,增強其社交價值屬性,提高使用者的價值需求。

4.使用者的消費周期:有二次以上消費的使用者,平均68天,是以在50天到60天期間,應該對這批使用者進行刺激召回,細緻點,比如10天回複滿意度,30天發放優惠券,55天的時候提醒優惠券的使用。

5.使用者的生命周期:有二次及以上消費的使用者的平均生命周期是276天。使用者的生命周期分别在20天内與400至500天間,應該在20天内對客戶進行引導,促進其再次消費并形成消費習慣,延長其生命周期;在100至400天的使用者,也要根據其特點推出有針對性的營銷活動,引導其持續消費。

6…新客戶的複購率約為6%,老客戶的複購率在20%左右;新客戶的回購率在15%左右,老客戶的回購率在30%左右,需要營銷政策積極引導其再次消費及持續消費。

7.使用者品質:使用者個體消費有一定規律性,大部分使用者的消費集中在2000以下,使用者消費反應了2/8法則,消費排名前20%的使用者貢獻了80%的消費額。是以說,狠抓高品質使用者是萬古不變的道理,這些高品質客戶都是“會員”類型,需要專門為會員優化購物體驗,比如專線接聽、特殊優惠等等。

7.留存率來看,一半的使用者會流失,是以應該注重對使用者的忠誠度的培養,比如打卡簽到,積分制度,老使用者打折制度會員更新制度。

繼續閱讀