用户消费行为的分析报告
想必大家对于CD用户消费者行为的分析已经见得多了,这里就不再一一叙述,这里主要是作为我的一个小练习,来提高自己处理业务的能力。
项目需求如下:
(1)用户消费趋势分析
- 每月的消费总金额
- 每月的消费次数
- 每月的产品购买量
- 每月的消费人数
(2)用户个体消费行为分析
- 用户消费金额和消费总数的描述统计
- 用户消费金额和消费总数的散点图
- 用户消费金额和消费总数的分布图
- 用户累计消费金额的占比
(3)用户消费行为分析
- 用户第一次消费时间(用户首次购买产品的时间)
- 用户最后一次消费时间
- 新老客消费占比
- 用户分层(RFM模型)
获取数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%matplotlib inline
columns = ['user_id','order_dt','order_products','order_amount']
CDNOW = pd.read_table('./CDNOW_master.txt',sep='\s+',names=columns) # \s+多个空格进行分割,+是空格匹配
CDNOW.head()
user_id | order_dt | order_products | 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 |
数据来源CDNow网站的用户购买明细,主要包括以下几个字段:
- user_id 用户ID
- order_dt 购买日期
- order_products 购买产品数
- order_amount 购买金额
数据处理
- 检查数据是否有空值
# CDNOW.info()
CDNOW.isnull().any()
user_id False
order_dt False
order_products False
order_amount False
dtype: bool
用CDNOW.info()可以发现order_dt的类型为int型,需要转换为日期类型
CDNOW['order_dt'] = pd.to_datetime(CDNOW['order_dt'],format='%Y%m%d')
添加一列month,方便后面进行分析
CDNOW['month'] = CDNOW['order_dt'].values.astype('datetime64[M]')
CDNOW.head()
user_id | order_dt | order_products | order_amount | month | |
---|---|---|---|---|---|
0 | 14048 | 1997-02-24 | 1 | 11.77 | 1997-03-01 |
查看数据描述
print(CDNOW.mode())
CDNOW.describe()
user_id order_dt order_products order_amount month
0 14048 1997-02-24 1 11.77 1997-03-01
user_id | order_products | 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.4个商品,标准差在2.3左右,证明有一定的偏差,而中位数为2,3/4分位数为3,说明了大多数的订单量都不多,购买商品的最大值为99。(中位数<均值,结合众数可以发现,用户购买的商品数分布是属于右偏分布的,均值>中位数>众数)。
- 从用户购买的金额来看,每个用户贡献的金额为36,而最大值达到了1286,证明用户的购买金额也是服从长尾分布的,符合二八原则,即20%的用户贡献了80%的交易额。
数据分析
进行用户消费趋势的分析(按月)
该部分内容主要是从用户每月的消费总金额、每月的消费次数、每月的产品购买量以及每月的消费人数进行分析。
每月的消费总金额
按月分组后,对order_amount进行求和,可以得到每月的消费总金额
group_month = CDNOW.groupby('month') # 按月分组
group_month_amount = group_month['order_amount'].sum()
plt.style.use('ggplot')
group_month_amount.plot()
plt.xlabel('月份')
plt.ylabel('消费金额')
plt.title('每月的消费金额折线图')
从上图可以看出,消费金额在1997年的前三个月达到了高峰。其中在3月份,销售额达到了最大值,为393155.27元,之后消费金额呈下降趋势,并不断趋于平稳的状态。
每月的消费次数
按月分组后,对order_product进行计数,可以得到每月的商品消费次数
group_month_order = group_month['order_products'].count()
group_month_count.plot(color='yellow')
plt.xlabel('月份')
plt.ylabel('消费次数')