单车网站用户消费行为分析
① 背景介绍
数据来源于互联网,是用户在一家单车网站上的消费记录
② 分析目标
主要根据用户的消费记录,通过建立RFM模型,分析复购率、回购率等关键指标,来对用户的消费行为进行分析,以给网站运营和决策提供数据支撑。
③ 分析过程
- 准备工作(数据集观察与数据清洗)
- 用户消费趋势分析(按月)——每月消费总金额、消费次数、产品购买量、消费人数、用户平均消费金额、用户平均消费次数
- 用户个体消费分析——用户消费金额、产品购买量的描述性统计、用户消费金额和产品购买量分布、用户累计消费金额占比
- 用户消费行为分析——用户第一次消费(首购)时间分布、用户最后一次消费时间分布、新老用户占比、用户分层RFM模型、各类用户(新用户、活跃用户、流失用户、回流用户)数量和占比、用户购买周期、用户生命周期
- 用户复购率和回购率分析——复购率、回购率
1、准备工作(数据集观察与数据清洗)
import pandas as pd
import numpy as np
columns = ['user_id','order_dt','order_products','order_amount']
df = pd.read_table('F:\\Jupyter\\单车案例_AndyWu\\bicycle_master.txt',names=columns,sep='\s+')
- user_id: 用户ID
- order_dt: 购买日期
- order_products: 购买产品数
- order_amount: 购买金额
对时间进行解析,一开始默认的格式是 int64的,可以用 df.info() 来查看,默认会是 datetime64[ns] 类型,后面中括号表示 时间间隔是 ns
df.info()
df.head()
df.describe()
- 大部分订单只消费了少量商品(平均购买产品数 = 2.41),有一定极值的干扰
- 用户的消费金额比较稳定,平均消费35.9元,中位数在26元,有一定极值的干扰
下面是对 order_dt 列(取values),转换类型为datetime64[M],默认就会是每月的第一天了,同理设置为[Y]就是每年的1月1日,然后生成新的一列 month
df['order_dt'] = pd.to_datetime(df.order_dt,format='%Y%m%d')
df.head()
df['month'] = df.order_dt.values.astype('datetime64[M]')
df.head()
2、进行用户消费趋势的分析
- 每月的消费总金额
- 每月的消费次数
- 每月的产品购买量
- 每月的消费人数
- 每月用户平均消费金额
- 每月用户平均消费次数
# 计算每月的消费总金额
grouped_month = df.groupby('month')
order_month_amount = grouped_month.order_amount.sum()
order_month_amount.head()
# 计算用户每月的消费总金额、消费次数、产品购买量
grouped_month_info = grouped_month[['order_amount','user_id','order_products']].agg({'order_amount':sum, 'user_id':'count', 'order_products':sum})
grouped_month_info
grouped_month_info.rename(columns = {'order_amount':'消费金额', 'user_id': '消费次数', 'order_products': '产品购买量'}, inplace=True)
grouped_month_info
# 计算每月的消费人次
# 这里的map(len)也可以写成agg(len)
grouped_month_info['消费人次'] = grouped_month['user_id'].unique().map(len)
grouped_month_info
grouped_month_info = grouped_month_info.reset_index()
grouped_month_info.info()
# 把month字段的类型转换为str类型,只有这样,PoweiBI才能调用
grouped_month_info['month'] = grouped_month_info['month'].astype(str)
grouped_month_info.info()
grouped_month_info.to_excel(r'.\临时表\月销售额、销售次数、产品购买量、消费人数.xlsx')
这里导出为excel表,然后使用PowerBI导入excel表数据,并在PBI中作图,然后截图过来,下同。(个人认为PBI中作图比matplotlib作图效果更好)
由上图可知,消费金额在前三个月达到最高峰,后续消费趋于稳定,但是有轻微下降趋势
由上图可知,月产品购买量在前三个月达到最高峰,后续较为稳定,但有轻微下降趋势
- 前三个月消费订单人数在10000笔左右,后续月份的平均消费人数则在2500人
- 每月消费人数低于每月消费次数,但差异不大
- 前三个月每月的消费人数在8000-10000之间,后续月份,平均消费人数在2000不到
去重的方法有多种,这里也可以使用数据库思想,df.groupby([‘month’,‘user_id’]).count().reset_index()
# 上面进行的汇总分析,其实也可以用数据透视的方法更快实现,一次性求出结果,但是个人认为.agg方法写起来稍微简单一些
df.pivot_table(index='month',
values=['order_products','order_amount','user_id'],
aggfunc={'order_products':'sum',
'order_amount':'sum',
'user_id':'count'}).head()
# 计算用户每月平均消费金额
amount=grouped_month.order_amount.sum()
num=df.groupby('month').user_id.apply(lambda x:len(x.drop_duplicates()))
avg_amount=amount/num
avg_amount.plot()
可知,用户每月用户平均消费金额都在37.5元以上