用户消费行为分析-Python案例

image

本文是对CD案例的一个总结,主要是根据用户消费记录,分析用户消费行为,建立RFM模型,分析复购率、回购率等关键指标。希望对其他产品的线上消费数据分析有一定的借鉴价值。

目录:
● 项目背景
● 分析目标
● 分析过程
● 小结

一、项目背景

CDNOW是美国的一家网上唱片公司,成立于1994年,后来被贝塔斯曼音乐集团收购。

二、分析目标

本次分析报告的数据来源于这家CD网站上的用户消费记录,旨在分析用户消费行为,建立RFM模型,分析复购率、回购率等关键指标。

● 用户消费趋势分析(按月)——每月消费总金额、消费次数、产品购买量、消费人数、用户平均消费金额、用户平均消费次数。
● 用户个体消费分析——用户消费金额,产品购买量的描述性统计、用户消费金额和产品购买量分布、用户累计消费金额占比。
● 用户消费行为分析——用户第一次消费(首购)时间分布、用户最后一次消费时间分布、新老用户占比、用户分层RFM模型、各类用户(新用户、活跃用户、流失用户、回流用户)数量和占比、用户购买周期、用户生命周期。
● 用户复购率和回购率分析——复购率、回购率。

用户消费行为分析-Python案例_第1张图片
image.png

三、分析过程

1、数据处理
(1)导入数据

# 导入常用库
import pandas as pd
import numpy as np
from datetime import datetime as dt
# 导入数据集
df=pd.read_csv("data/CDNOW.txt",header=None,names=['user_id','order_dt','order_products','order_amount'],sep='\s+',index_col='user_id)
df.head()
用户消费行为分析-Python案例_第2张图片
image

(2)观察数据
order_dt列表示购买日期,需转换为日期格式。
数据中存在一个用户在同一天或不同天下多次订单的情况,如user_id为2的用户就在1月12日下单两次。

(3)清洗数据

检查数据,发现数据集不存在缺失值。把order_dt转换为日期型datetime64[ns]。

df['order_dt']=pd.to_datetime(df['order_dt'],format="%Y%m%d")
df.info()
用户消费行为分析-Python案例_第3张图片
image

(4)数据探索

用户消费行为分析-Python案例_第4张图片
image

● 从数据的统计描述信息中可以看出,用户每个订单平均购买2.41个商品,每个订单平均消费35.89元,有一定极值的干扰。
● 购买商品数量的标准差为2.33,说明数据具有一定的波动性;中位数为2个商品,75分位数为3个商品,说明大部分订单的购买数量都不多。最大值在99个,数字比较高。购买金额的情况差不多,大部分订单都集中在小额。
● 一般而言,消费类的数据分布,都是长尾形态。大部分用户都是小额,然而小部分用户贡献了收入的大头,俗称二八。

2、用户消费趋势分析(月维度)

df['month']=df.order_dt.values.astype('datetime64[M]')    # 新增month字段
df.head()
用户消费行为分析-Python案例_第5张图片
image
#导入绘图包
import matplotlib.pyplot as plt    
# 魔法函数,用于可视化自动显示
 %matplotlib inline
plt.rcParams['font.sans-serif'] = ['Simhei']     # 解决中文乱码问题plt.rcParams['axes.unicode_minus'] = False     # 解决坐标轴刻度负号乱码
plt.style.use('ggplot')      # 更改设计风格,使用自带的形式进行美化
# 设置图的大小,添加子图
plt.figure(figsize=(20,15)) 
# 每月的总销售额
 plt.subplot(221)
df.groupby('month')['order_amount'].sum().plot(fontsize=20)
plt.title('总销售额',fontsize=20) 
 # 每月的消费次数
 plt.subplot(222) 
df.groupby('month')['order_dt'].count().plot(fontsize=20)
plt.title('消费次数',fontsize=20)
# 每月的销量
plt.subplot(223)
df.groupby('month')['order_products'].sum().plot(fontsize=20)
plt.title('总销量',fontsize=20)
# 每月的消费人数 
plt.subplot(224)
df.groupby('month')['user_id'].apply(lambda x:len(x.unique())).plot(fontsize=20)
plt.title('消费人数',fontsize=20) 
plt.tight_layout() # 设置子图的间距
plt.show()
用户消费行为分析-Python案例_第6张图片
image

● 四个折线图的整体趋势基本一致,可以看出来,前3个月的销量与销售额均出现峰值,3月份之后急剧下降,后趋于平稳。
● 仔细对比发现2-3月期间,消费人数有所下降,但总销量与总销售额仍是上升趋势,3月份的客户中是否有高价值客户后续待分析。
● 针对3月之后销量与销售额的剧烈下降,可假设原因为:①用户身上出了问题,早期用户中有异常值,是否有团购大单客户;②是否有大促,但本数据集只有消费数据,暂时无法判断,但这是一个业务思考点。

plt.figure(figsize=(16,8))
# 每月用户平均消费金额
amount=df.groupby('month')['order_amount'].sum()
num=df.groupby('month')['user_id'].apply(lambda x:len(x.drop_duplicates())) avg_amount=amount/num
plt.subplot(121)
avg_amount.plot(fontsize=20)
plt.title('每月用户平均消费金额',fontsize=20)
# 每月用户平均消费次数
times=df.groupby('month')['order_dt'].count()  
num=df.groupby('month')['user_id'].apply(lambda x:len(x.drop_duplicates()))
avg_times=times/num 
plt.subplot(122)
avg_times.plot(fontsize=20)
plt.title('每月用户平均消费次数',fontsize=20)
plt.tight_layout()
plt.show()
用户消费行为分析-Python案例_第7张图片
image

● 由上图可知,每月用户平均消费金额都在37.5元以上,1997年1月份最低,1998年11月最高,最高值为57元左右。

● 由上图可知,每月用户平均消费次数都在1次以上,1997年1月份最低,1998年10月最高,最高值为1.4次左右。

3、客户个体消费分析

(1)用户消费金额,产品购买量的描述性统计

grouped_user=df.groupby('user_id')
grouped_user.sum().describe()
用户消费行为分析-Python案例_第8张图片
image

从用户角度看,每位用户平均购买7张CD,最多的用户购买了1033张。用户的平均消费金额(客单价)100元,标准差是240,结合分位数和最大值看,平均值才和75分位接近,肯定存在小部分的高额消费用户,这也符合二八法则。

(2)用户消费金额和消费次数的散点图

grouped_user.sum().plot.scatter(x='order_amount',y='order_products')
用户消费行为分析-Python案例_第9张图片
image.png

由上图可知,绝大部分的数据集中分布,小部分极值对分析有一定的干扰。
可以使用query方法,筛选出order_amount<4000的用户,排除极值的干扰。

grouped_user.sum().query('order_amount<4000').plot.scatter(x='order_amount',y='order_products')
image.png

● 由散点图可知,用户消费金额与产品购买量几乎成线性关系,购买的商品越多,消费金额越大。
● 因为这是CD网站的销售数据,商品比较单一,金额和销量的关系也因此呈线性,也就是商品单价比较稳定。假如之后商家拓展了商品品类,增加了唱片机,那金额和销量的关系就不会是线性。

(3)用户消费金额分布图

grouped_user.sum().order_amount.plot.hist(bins=20)
# bins = 20,就是分成20块,最低金额是0,最高金额是14000,每个项就是700
用户消费行为分析-Python案例_第10张图片
用户消费金额的分布图

从直方图可知,用户消费金额,绝大部分呈现集中趋势,小部分极大值干扰了判断,可以使用过滤操作排除异常。

grouped_user.sum().query('order_products<100').order_amount.plot.hist(bins=20)
用户消费行为分析-Python案例_第11张图片
用户消费金额分布

可以观察到,用户消费金额集中在0~100元,有大约17000名用户。大部分用户的消费能力并不高,绝大部分呈现集中在较低的消费档次。

(4)用户购买量分布图

grouped_user.sum().query('order_products<100').order_products.plot.hist(bins=20)
用户消费行为分析-Python案例_第12张图片
用户购买量分布图

● 可以观察到,用户购买量集中在0-5,有大约16000名用户购买0-5张CD。
● 这里需要注意一点:通常使用切比雪夫定理过滤掉异常值,因为切比雪夫定理说明,所有数据中至少有96%的数据位于平均数5个标准差之内,剩下4%的极值就过滤掉。这里以order_products作为过滤条件,mean+5std=7.12+5*16.98=92.02,近似选择100作为阈值即可。

(5)用户累计消费金额占比(百分之多少的用户占了百分之多少的消费额)

# 按照用户消费金额进行升序排序,cumsum 是求累加值
user_cumsum=grouped_user.sum().sort_values('order_amount').apply(lambda x:x.cumsum()/x.sum())
# reset_index() 是为了得到一个自然数的行标签,表示累计用户数量
user_cumsum.reset_index().order_amount.plot()
用户消费行为分析-Python案例_第13张图片
用户累计消费金额占比

由图可知:
横坐标表示累计用户数量(总共有23570名用户),纵坐标表示累计消费金额占比。
50%的用户仅贡献了15%的消费额度,70%的用户仅贡献了20%的消费额度,85%的用户仅贡献了40%的消费额度,而排名前3000多的用户就贡献了60%的消费额度。

4、客户个体消费分析

(1)用户第一次消费(首购)时间分布

# 得到最小的日期,然后统计一下各个日期的个数
grouped_user.min().order_dt.value_counts().plot()
用户消费行为分析-Python案例_第14张图片
用户首购时间分布

用户第一次购买分布,集中在前三个月。其中,在2月9日到2月25日之间有剧烈的波动。可以假设原因为:销售渠道发生了变化、销售政策发生了变化等。

(2)用户最后一次消费时间分布

# 得到最大的日期,然后统计一下各个日期的个数,得到最后一次消费的情况,用户流失
grouped_user.max().order_dt.value_counts().plot()
用户消费行为分析-Python案例_第15张图片
用户最后一次消费时间

● 用户最后一次购买的时间分布比第一次购买的时间分布广。上图3月下旬起出现断崖式下跌,一开始用户数量迅猛增长,流失的也比较多,后面趋于稳定,没有再出现此类用户严重流失的情况。
● 大部分最后一次购买的时间,集中在前三个月,刚好首购也是集中在这三个月,说明很多用户购买了一次后就不再进行购买。
● 随着时间的递增,最后一次购买的用户数量也在递增,消费呈现流失上升的状况。随着时间的增长,可能运营没跟上,或者用户忠诚度下降了。

(3)新老用户占比
a、多少用户仅消费一次

# 第一次和最后一次消费日期相同,说明只消费了一次
user_life=grouped_user.order_dt.agg(['min','max'])
# 统计只消费了一次的用户
(user_life['min']==user_life['max']).value_counts()

image.png

结果表明,有一半的用户,只消费了一次。
b、每月新用户占比

# 按照month、userid分组,第一次和最后一次消费日期
user_life_month=df.groupby(['month','user_id']).order_dt.agg(['min','max']).reset_index()
# 新增is_new字段,用于标记新用户
user_life_month['is_new']=(user_life_month['min']==user_life_month['max'])
# 再次按month分组,计算新用户占比
user_life_month_pct=user_life_month.groupby('month').is_new.apply(lambda x:x.value_counts()/x.count()).reset_index()
# 每月新客(level_1为True)占比作图
user_life_month_pct[user_life_month_pct.level_1].plot(x='month',y='is_new')
用户消费行为分析-Python案例_第16张图片
每月新用户占比

1997年1月新用户占比最高,达90%以上,2-4月下降明显,后逐渐趋于平稳。1997年4月到1998年6月维持在81%左右,1998年6月以后无新用户。

(4)用户分层
a、RFM模型

RFM模型
为了进行精细化运营,可以利用RMF模型对用户价值指数(衡量历史到当前用户贡献的收益)进行计算。
最近一次消费-R:客户最近一次交易时间的间隔。R值越大,表示客户交易发生的日期越久,反之则交易发生的日期越近。
消费频率-F:客户在最近一段时间内交易的次数。F值越大,表示客户交易越频繁,反之则表示客户交易不够活跃。
消费金额-M:客户在最近一段时间内交易的金额。M值越大,表示客户价值越高,反之则表示客户价值越低。
根据上述三个维度,对客户做细分。

# 画RFM,先对原始数据进行透视
rfm=pd.pivot_table(df,index='user_id',
                  values=['order_products','order_amount','order_dt'],
                  aggfunc={'order_dt':'max',
                          'order_amount':'sum',
                          'order_products':'count'})
rfm.head()
用户消费行为分析-Python案例_第17张图片
image.png
# R:最近一次消费(距今天数),这里因为消费时间距今太久远,就不用今天了,而是选用一个时间最大值
# 这里是时间格式相减,得到xxx days,所以需要除以一个单位'D'
rfm['R']= -(rfm.order_dt - rfm.order_dt.max())/np.timedelta64(1,'D')
# F:消费频次
# M:消费金额
rfm.rename(columns={'order_products':"F",'order_amount':'M'},inplace=True)
rfm.head()
用户消费行为分析-Python案例_第18张图片
image.png
def rfm_func(x):
    level=x.apply(lambda x:'1' if x>=0 else '0')
    # level是Series,R/F/M都是其索引
    # 字符串拼接
    label=level.R + level.F + level.M
    d={
        '111':'重要价值客户',
        '011':'重要保持客户',
        '101':'重要发展客户',
        '001':'重要挽留客户',
        '110':'一般价值客户',
        '010':'一般保持客户',
        '100':'一般发展客户',
        '000':'一般挽留客户',
    }
    result=d[label]
    return result
# 这里要一行行的传递进来,所以 axis=1,传递一行得到一个 label,然后匹配返回一个值
rfm['label']=rfm[['R','F','M']].apply(lambda x:x-x.median()).apply(rfm_func,axis=1)
rfm.head()
用户消费行为分析-Python案例_第19张图片
image.png
# 其实应该设置8个颜色,这里做了简化:
rfm.loc[rfm.label=='重要价值客户','color']='g'
rfm.loc[~(rfm.label=='重要价值客户'),'color']='r'
rfm.plot.scatter('F','R',c=rfm.color)
用户消费行为分析-Python案例_第20张图片
image.png

绿色部分是重要价值客户,消费频次较高,但最近一次消费时间距今较远

# 8种客户类型的总消费金额、消费频次
rfm.groupby('label').sum()

8种客户中,重要保持客户(011)的消费频次和消费金额最高。其次是一般发展客户(100)。


用户消费行为分析-Python案例_第21张图片
image.png
# 8种客户类型的人数
rfm.groupby('label').count()
用户消费行为分析-Python案例_第22张图片
image.png

8种客户中,一般发展客户(100)的人数最多,其次是重要保持客户(011)。

从RFM分层可知,大部分用户为一般发展客户,但是这是由于极值的影响,所以RFM的划分标准应该以业务为准,也可以通过切比雪夫定理去除极值后求均值,并且 RFM 的各个划分标准可以都不一样。

tips:尽量用小部分的用户覆盖大部分的额度
不要为了数据好看划分等级

b、新用户、活跃用户、流失用户、回流用户

# 每月的消费次数,缺失值用0填充
pivoted_counts=pd.pivot_table(df,index='user_id',
                             columns='month',
                             values='order_dt',
                             aggfunc='count').fillna(0)
pivoted_counts.head()
用户消费行为分析-Python案例_第23张图片
image.png
# 上面填充了一些null值为0,而实际可能用户在当月根本就没有注册,这样会误导第一次消费数据的统计,所以写一个函数来处理
def active_status(data):
    status=[]
    # 数据一共有18个月份,每次输入一行数据,也就是一个user_id的信息,进行逐月判断
    for i in range(18):
        # 若本月没有消费
        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=data.astype('object')
    for i in range(18):
       data[i]=status[i]
    return data

关于active_status的说明:
①若本月没有消费,这里只是和上个月判断是否注册,有一定的缺陷,应该判断是否存在就可以了。
若之前有数据,是未注册,则依旧为未注册;
若之前有数据,不是未注册,则为流失/不活跃;
若之前没有数据,为未注册。
②若本月有消费:
若是第一次消费,则为新用户;
若之前有过消费,上个月为不活跃,则为回流;
若之前有过消费,上个月为未注册,则为新用户;
若之前有过消费,其他情况为活跃;
return:回流 new:新客 unreg:未注册 active:活跃

注意:主流写法还是使用 etl ,不是通过透视表。

purchase_stats=df_purchase.apply(active_status,axis=1)
purchase_stats.head()
用户消费行为分析-Python案例_第24张图片
image.png
# 把未注册的替换为空值,这样count不会计算到,得到每个月的用户分布
purchase_stats_ct=purchase_stats.replace('unreg',np.NaN).apply(lambda x:pd.value_counts(x))
purchase_stats_ct
image.png
# 绘制面积图,描述用户分布
purchase_stats_ct.fillna(0).T.plot.area()
用户消费行为分析-Python案例_第25张图片
image.png

● 蓝色是新用户,前3个月大量涌入,后面没有新增。
● 红色是活跃用户,前几个月较多,后面有所下降。
● 紫色是回流用户,数量趋于稳定,每月1000多。
● 灰色是流失/不活跃用户,数量非常多,基本上每月都在20000以上。

# 计算每月各类用户占比
purchase_stats_ct.fillna(0).T.apply(lambda x:x/x.sum(),axis=1)
用户消费行为分析-Python案例_第26张图片
image.png
purchase_stats_ct.fillna(0).T.apply(lambda x:x/x.sum(),axis=1).plot.area()
用户消费行为分析-Python案例_第27张图片
image.png

● 前三个月有大量新用户涌入,新用户占比很高,而后面几个月不活跃用户占比非常高,普遍在90%以上。
● 活跃用户,持续消费的用户,对应的是消费运营的质量。
● 回流用户,之前不消费,本月才消费,对应的是唤回运营。
● 不活跃用户,对应的是流失。

(5)用户购买周期(按订单)

a、用户购买周期描述

# 计算相邻两个订单的时间间隔,shift函数是对数据进行错位,所有数据会往下平移一下
order_diff=grouped_user.apply(lambda x:x.order_dt-x.order_dt.shift())
order_diff.head(10)
用户消费行为分析-Python案例_第28张图片
image.png
order_diff.describe()

** b、用户购买周期分布**

# 去除单位
(order_diff/np.timedelta64(1,'D')).hist(bins=20)
用户消费行为分析-Python案例_第29张图片
image.png

订单周期呈指数分布。用户的平均购买周期是68天,最小值0天,最大值533天。绝大部分用户的购买周期都低于100天。

(6)用户生命周期(按第一次和最后一次消费)

a、用户生命周期描述

# 描述性统计
(user_life['max']-user_life['min']).describe()

image.png

b、用户生命周期分布

# 去除单位
((user_life['max']-user_life['min'])/np.timedelta64(1,"D")).hist(bins=40)
用户消费行为分析-Python案例_第30张图片
image.png

用户平均生命周期134天,但中位数仅0天。
用户的生命周期分布受只购买一次的用户(用户生命周期0天)影响比较严重,可以排除。

# 提取用户生命周期大于0的数据
u_1=(user_life['max']-user_life['min']).reset_index()[0]/np.timedelta64(1,"D")
u_1[u_1>0].hist(bins=40,figsize=(6,4))
用户消费行为分析-Python案例_第31张图片
image.png
u_1[u_1>0].describe()
image.png

排除了只购买一次的用户(生命周期0天)影响,这部分用户占了接近一半。
用户平均生命周期276天,中位数302天。

(7)复购率和回购率分析:

复购率:自然月内,购买多次的用户占比。
回购率:曾经购买过的用户在某一时期再次购买的占比
a、复购率

pivoted_counts.head(10)
用户消费行为分析-Python案例_第32张图片
image.png
# 区分消费1次,和1次以上的情况,以便于计算复购率,大于1为1,等于1为0,等于0为NaN
# (消费两次及以上记为1,消费一次记为0,没有消费记为NaN。)
# applymap针对DataFrame里的所有数据。用lambda进行判断,因为这里涉及了多个结果,所以要两个if else,记住,lambda没有elif的用法。
purchase_r=pivoted_counts.applymap(lambda x: 1 if x>1 else np.NaN if x==0 else 0)
purchase_r.head()
用户消费行为分析-Python案例_第33张图片
image.png
# 复购人数/总消费人数(不会计算nan值)
(purchase_r.sum()/purchase_r.count()).plot(figsize=(10,4))
用户消费行为分析-Python案例_第34张图片
复购率(每月)

复购率稳定在20%左右,前3个月因为有大量新用户涌入,而这批用户只购买了一次,所以导致复购率较低。

用sum和count相除即可计算出复购率。因为这两个函数都会忽略NaN,而NaN是没有消费的用户,count不论0还是1都会统计,所以是总的消费用户数,而sum求和计算了两次以上的消费用户。这里用了比较巧妙的替代法计算复购率,SQL中也可以用。

b、回购率

pivoted_amount=pd.pivot_table(df,index='user_id',
                             columns='month',
                             values='order_amount',
                             aggfunc='mean').fillna(0)
pivoted_amount.head()
image.png
# 1代表这个月消费了,0代表没消费
df_purchase=pivoted_amount.applymap(lambda x:1 if x>0 else 0)
df_purchase.head()
用户消费行为分析-Python案例_第35张图片
image.png
# 使用函数判断是否回购,这里定义的回购指当月消费过的用户下个月也消费了
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)
    # 第18个月补充NaN,因为没有下个月的数据了
    status.append(np.NaN)
    data=data.astype('object')
    for i in range(17):
        data[i]=status[i]
    return data
# 一行行传递,返回的0代表当月消费下个月未消费,1代表当月消费下个月仍消费,NaN代表当月未消费
purchase_b=df_purchase.apply(purchase_back,axis=1)
purchase_b.head()
用户消费行为分析-Python案例_第36张图片
image.png
# 回购率,回购的次数/总购买次数
(purchase_b.sum()/purchase_b.count()).plot(figsize=(10,4))
用户消费行为分析-Python案例_第37张图片
回购率(每月)

回购率稳定在30%左右,前3个月因为有大量新用户涌入,而这批用户只购买了一次,所以导致回购率较低

四、小结

1、用户消费趋势(每月)方面,前3个月有大量新用户涌入,消费金额、消费订单数、产品购买量均达到高峰,后续每月较为稳定。前3个月消费次数都在10000笔左右,后续月份的平均2500;前3个月产品购买量达到20000甚至以上,后续月份平均7000;前3个月消费人数在8000-10000之间,后续月份平均2000不到。

2、用户个体消费方面,小部分用户购买了大量的CD,拉高了平均消费金额。用户消费金额集中在0-100元,有大约17000名用户。用户购买量集中在0-5元,有大约16000名用户。50%的用户仅贡献了15%的消费额度,15%的用户贡献了60%的消费额度。大致符合二八法则。

3、用户消费行为方面,首购和最后一次购买的时间,集中在前三个月,说明很多用户购买了一次后就不再进行购买。而且最后一次购买的用户数量也在随时间递增,消费呈现流失上升的状况。

4、从整体消费记录来看,有一半的用户,只消费了一次。从每月新用户占比来看,1997年1月新用户占比高达90%以上,后续有所下降,1997年4月到1998年6月维持在81%左右,1998年6月以后无新用户。

5、从RFM模型来看,在8种客户中,重要保持客户的消费频次和消费金额最高,人数排在第二位;而一般发展客户消费频次和消费金额排第二位,人数却是最多。

6、从用户分层情况来看,新用户从第4月份以后没有新增;活跃用户有所下降;回流用户数量趋于稳定,每月1000多。流失/不活跃用户,数量非常多,基本上每月都在20000以上。

7、用户购买周期方面,平均购买周期是68天,最小值0天,最大值533天。绝大部分用户的购买周期都低于100天。

8、用户生命周期方面,由于只购买一次的用户(生命周期为0天)占了接近一半,排除这部分用户的影响之后,用户平均生命周期276天,中位数302天。

9、复购率和回购率方面,复购率稳定在20%左右,回购率稳定在30%左右,前3个月因为有大量新用户涌入,而这批用户只购买了一次,所以导致复购率和回购率都比较低。

你可能感兴趣的:(用户消费行为分析-Python案例)