CD案例分析
本文对CD案例进行了一个分析总结,主要是根据用户消费记录,分析用户消费行为,统计电商领域的一些关键性指标。
项目背景
CDNOW 是一个主打线上销售的CD品牌,通过 1.5年 的用户消费记录,针对这1.5年时间里的销售数据对用户消费行为进行分析,并针对分析结果对后续的营销策略及用户管理提出合理的建议。
分析目标
根据CDNOW一年半时间里的线上消费数据,分析用户消费行为,建立RFM模型并对用户进行分层,统计用户生命周期,复购率及回购率等关键性指标。
分析过程
- 数据准备
- 消费趋势分析
- 用户个体消费分析
- 用户消费行为分析
- 用户生命周期分析
1.数据准备
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
import numpy as np
import pandas as pd
数据集没有列名,为新建表格创建列名
- user_id:用户ID
- order_dt:购买日期
- order_product:购买产品的数量
- order_amount:购买金额
数据列间使用空格间隔,分割使用正则进行匹配,\s 表示匹配任何空白字符
columns=['user_id','order_dt','order_product','order_amount']
data = pd.read_csv('./data/CDNOW_master.txt',sep='\s+',names=columns)
data.head()
user_id | order_dt | order_product | order_amount | |
---|---|---|---|---|
0 | 1 | 19970101 | 1 | 11.77 |
1 | 2 | 19970112 | 1 | 12.00 |
2 | 2 | 19970112 | 5 | 77.00 |
3 | 3 | 19970102 | 2 | 20.76 |
4 | 3 | 19970330 | 2 | 20.76 |
观察数据,查看数据类型,是否存在缺失值
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 69659 entries, 0 to 69658
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 user_id 69659 non-null int64
1 order_dt 69659 non-null int64
2 order_product 69659 non-null int64
3 order_amount 69659 non-null float64
dtypes: float64(1), int64(3)
memory usage: 2.1 MB
数据集不存在缺失值,不需要进行处理
order_dt 为int类型,将其转换为日期类型
data['order_dt'] = pd.to_datetime(data['order_dt'],format='%Y%m%d')
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 69659 entries, 0 to 69658
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 user_id 69659 non-null int64
1 order_dt 69659 non-null datetime64[ns]
2 order_product 69659 non-null int64
3 order_amount 69659 non-null float64
dtypes: datetime64[ns](1), float64(1), int64(2)
memory usage: 2.1 MB
后面会使用月份衡量数据指标,新增一列月份month字段,order_dt转换后的数据类型为datetime64,从其中截取月份数据,即datetime64[M]
data['month'] = data['order_dt'].values.astype('datetime64[M]')
data.head()
user_id | order_dt | order_product | order_amount | month | |
---|---|---|---|---|---|
0 | 1 | 1997-01-01 | 1 | 11.77 | 1997-01-01 |
1 | 2 | 1997-01-12 | 1 | 12.00 | 1997-01-01 |
2 | 2 | 1997-01-12 | 5 | 77.00 | 1997-01-01 |
3 | 3 | 1997-01-02 | 2 | 20.76 | 1997-01-01 |
4 | 3 | 1997-03-30 | 2 | 20.76 | 1997-03-01 |
订单平均消费商品数为2.4,平均消费金额为35.9,存在一定的偏差,但是影响较小。
中位数分别为2.0和26.0,均小于平均值,说明用户消费整体水平偏低于平均值。
最小值和最大值相差巨大,说明很有必要对用户进行分类管理。
data.describe()
user_id | order_product | order_amount | |
---|---|---|---|
count | 69659.000000 | 69659.000000 | 69659.000000 |
mean | 11470.854592 | 2.410040 | 35.893648 |
std | 6819.904848 | 2.333924 | 36.281942 |
min | 1.000000 | 1.000000 | 0.000000 |
25% | 5506.000000 | 1.000000 | 14.490000 |
50% | 11410.000000 | 2.000000 | 25.980000 |
75% | 17273.000000 | 3.000000 | 43.700000 |
max | 23570.000000 | 99.000000 | 1286.010000 |
2.月消费趋势
data.groupby('month')['order_amount'].sum().plot()
由上图可知,前三个月每月花费总金额呈上升趋势并达到峰值,1997年4月急剧下降,后面趋于稳定有轻微下降趋势。
data.groupby('month')['order_product'].sum().plot()
由上图可知,前三个月产品购买量最大,峰值大于25000,后续月份产品购买量小幅波动,但都在10000以下。
data.groupby('month')['order_dt'].count().plot(
由上图可知,前三个月消费次数最多,峰值大于10000,1997年4月急剧下降至稳定波动,后续月份购买均次数小于4000.
data.groupby('month')['user_id'].apply(lambda x : len(x.drop_duplicates())).plot()
# data.groupby('month')['user_id'].nunique() 也可进行去重统计
由上图可知,前三个月每月消费人数在8000以上,后续月份平均每月消费人数小于2000,且每月消费人数小于每月消费次数。
amount_month = data.groupby('month')['order_amount'].sum()
num_month = data.groupby('month')['user_id'].apply(lambda x : len(x.drop_duplicates()))
avg_amount = amount_month/num_month
avg_amount.plot()
# 用户月均消费金额统计性描述
avg_amount.describe()
count 18.000000
mean 48.411269
std 4.994027
min 38.116259
25% 46.538143
50% 49.264167
75% 50.592662
max 56.927337
dtype: float64
由上图可知,用户每月平均消费金额为48.4元以,1997年11月最高,消费金额约为57元。
times_month = data.groupby('month')['order_dt'].count()
avg_times = times_month/num_month
avg_times.plot()
由上图可知,用户每月平均消费次数均不足2次但均在1次以上,1997年1月最低,1997年10月平均消费次数最高。
通过透视表快速统计出每个月的消费总金额、产品购买数量及总购买次数,能详细的了解每个月的整体销售情况。
data.pivot_table(
index='month',
aggfunc={
'order_amount':'sum',
'order_product':'sum',
'user_id':'count'}
)
order_amount | order_product | user_id | |
---|---|---|---|
month | |||
1997-01-01 | 299060.17 | 1 |