本篇文章从用户分层,生命周期,回购率,复购率,留存率等指标观察用户的消费行为,最后通过RFM模型对客户进行分类。
主要从以下几个角度,对CD数据集进行了分析
1.用户维度分析
2.订单维度分析
3.时间维度分析
4.用户的消费行为分析
回购率、复购率、客户分层分析、客户质量分析、客户的生命周期、客户的留存率、RFM模型
注:在RFM模型中,本文处理的与其他博客中的不一致,其差异主要是计算时间差时的是否添加负号,本文没有添加,理由如下:
R = 每一位客户的最后一次消费日期-‘今天’
'今天'指的是数据集中最大的日期
其R值为负数,其值越大表示最近一次消费时间越近,该客户的价值越大,与F,M的趋势是一样的,F:表示消费商品数量,其F越大,该客户的价值越大,同理,M(消费金额)越大,客户价值越大。
当然了,是否添加负号,其最后的结果肯定不一致。
import pandas as pd
import numpy as np
import datetime
import matplotlib.pyplot as plt
import seaborn as sns
plt.style.use('ggplot')
data = pd.read_csv('/Users/llh/Desktop/CDNOW_master.txt',sep='s+',
names=['user_id','order_dt','product_num','order_amount'])
data.head()
1.数据集中字段比较少,用户Id,订单日期,购买产品数量,订单金额
2.注意到一个用户在一天内可能发生多次购买,比如用户2
data.info()
1.数据集共有69659条数据,并没有缺失值 2.日期列需转化为日期格式
data.describe()
由上得出:
0.共有23570个客户的数据
1.用户平均购买商品数量为2.4件,75分位数为3,最大值为99,说明绝大部分客户的订单数量都小于3件
2.用户平均消费金额为35.89,75分位数为43.7,最大值为1286,说明绝大部分的订单金额都是小金额
3.订单金额的最小值为0,这个是否为异常数据,是不是赠送商品或者虚拟商品?
一般来说,消费类型的数据都是长尾形态,20%的客户贡献了80%的消费金额
到目前为止,对整个数据有了基本的认识,接下来进行日期转换和排查异常数据
时间序列转换
data['order_dt'] = pd.to_datetime(data.order_dt,format='%Y%m%d')
data['month'] = data.order_dt.astype('datetime64[M]')
# data['year'] = pd.order_dt.map(lambda x: x.year)
# #提取月份
# data['month'] = pd.order_dt.map(lambda x: x.month)
# #提取day
# data['day'] = pd.order_dt.map(lambda x: x.day)
data.head()
#data = data.drop(data[data.order_amount==0].index,axis=0)
数据分析
1.用户维度分析
2.订单维度分析
3.时间维度分析
4.用户的消费行为分析
回购率、复购率、客户分层分析、客户质量分析、客户的生命周期、客户的留存率
用户维度分析
user_product = data.groupby('user_id').sum()
user_product.describe()
1.可以看到每位用户的平均购买商品数量为7件左右,最大值为1033件,该客户应该属于狂热客户
2.每位用户的平均消费金额和75分位数很接近,最大消费金额为13990左右,肯定存在少量高消费客户
用户散点图
user = pd.pivot_table(data,values=['product_num','order_amount'],index='user_id',aggfunc='sum')
user.head()
plt.scatter('product_num','order_amount',data=user)
plt.xlabel('用户商品数量')
plt.ylabel('用户的消费金额')
用户消费行为比较健康而且规律性很强。
因为这是CD网站的销售数据,商品单一,金额和商品量的关系也因此呈线性,没几个离群点
消费能力特别强的客户有但是量很少
plt.figure(figsize=(13,4))
plt.subplot(121)
sns.distplot(user.order_amount)
plt.title('用户订单金额的频次图')
plt.subplot(122)
sns.distplot(user.product_num)
plt.title('用户订单数量的频次图')
从直方图可以看到,大部分用户的消费能力确实不高,高消费用户在图上几乎看不到。这也确实符合消费行为的行业规律
订单维度分析
绘制每笔订单的散点图
plt.figure(figsize=(13,4))
plt.scatter('product_num','order_amount',data=data)
plt.xlabel('商品数量')
plt.ylabel('订单金额')
plt.title('商品数量与订单金额的关系(每笔订单)')