【数据分析】用户消费行为数据分析

本文通过导入和处理CDNOW_master.txt数据,对用户消费行为进行深入分析,包括整体消费趋势、用户个体消费特征、RFM模型应用以及用户分层,为企业优化营销策略提供依据,主要关注领域为电子商务和零售业。
摘要由CSDN通过智能技术生成

用户消费行为分析的意义在于帮助企业更深入地了解用户需求和行为特征,从而优化营销策略、产品设计和客户关系管理,而应用场景涵盖电子商务、零售业、金融服务、餐饮业、旅游酒店、游戏行业、健康医疗等多个领域。

在这里插入图片描述数据表:user_id : 用户ID, order_dt : 购买时间, order_products : 购买产品数据,order_amount : 购买金额数据时间: 1997年1月~1998年6月用户行为数据,约6万条。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from datime import datetime
%matplootlib inline # 行内显示
plt.style.use('ggplot') # 更改风格,选择的是R语言绘图库的风格
plt.rcParams['font.sans-serif'] = ['SimHei']

0. 导入数据

#因为没有表头,自制表头
columns = ['user_id','order_id','order_products','order_amount']
df = pd.read_table('CDNOW_master.txt',names=columns,sep='\s+')
#sep='\s+'匹配任意空格
df.head()

通过观察发现数据中:
① 日期格式需要转换
② 存在同一个用户一天内购买多次的行为

df.describe()

用户平均订单购买2.4个商品,标准差2.3,稍微有点波动,属于正常。然而,75%分位数的时候,绝大数订单的购买量都是不多的,围绕在2~3个左右。

购买金额,反映出大部分订单消费金额集中在中小额,30~45左右。

df.info()#查看数据类型

1. 数据预处理

# 转化成时间格式'%Y%m%d'年-月-日
df['order_date'] = pd.to_datetime(df['order_dt'], fotmat='%Y%m%d')
df.info()

format参数:按照指定的格式去匹配要转换的数据列
%Y:四位的年份1994
%m: 两位月05
%d:两位日期31
%y: 两位年份94
%h:两位小时
%M:两位分钟
%s:两位秒

将order_date转化成精度为月份的数据列

df['month'] = df['order_date'].astype('datetime64['M']')
 #[M]:控制转换后的精度
data.info()

2.数据分析

2.1 用户整体消费趋势分析(按月份)

按月份统计产品购买数量、消费金额、消费次数、消费人数

我们需要画子图

plt.figure(figsize=(20,15)) #单位英寸
#每月的产品购买数量
plt.subplot(221) #两行两列,占据第一个位置
df.groupby(by='month')['order_product'].sum().plot() # 默认折线图
plt.title('每月的产品购买数量')

#每月的消费金额
plt.subplot(222) #两行两列,占据第二个位置
df.groupby(by='month')['order_amount'].sum().plot()
plt.title('每月的产品购买金额')

#每月的消费次数
plt.subplot(223)#两行两列,占据第三个位置
df.groupby(by='month')['user_id'].count().plot()
plt.title('每月的消费次数')

#每月的消费人数(根据user_id经过去重处理)
plt.subplot(224)#两行两列,占据第四个位置
df.groupby(by='month')['user_id'].apply(lambda x: len(x.drop_duplicates)) .plot()
plot.title('每月的消费人数')

分析结果:
① 图一可以看出前三个月销量非常高,而以后销量较为稳定,并且稍微有些下降的趋势
② 图二可以看出,依然是前三个月消费金额较高,与消费数量成正比例关系,三月份过后下降严重,并呈现下降趋势,思考原因?
(1)在我国1、2、3月份处于春季前后
(2)公司在1、2、3月份的时段是否出现了营销手段
③ 图三可以看出,前三个月订单数在10000左右,而后续月份平均在2500左右
④ 图四可以看出,前三个月消费人数在8000~10000左右,后续平均消费人数在2000不到的样子。

总结:所有数据显示,97年前三个月消费事态异常,后续处于常态化

2.2 用户个体消费分析

2.2.1 用户消费金额、消费次数(产品数量)描述统计

user_grouped = df.groupby('user_id').sum()
print(user_grouped.describe())
print('用户数量:', len(user_grouped))

从用户的角度,用户数量23570个,每个用户平均购买了7个CD,但是中位数只有3,并且最大的购买量为1033,平均值大于中位数,属于典型的右偏分布(替购买量<7的用户背锅了)。

从消费金额角度,平均用户消费106,中位数,并且存在土豪用户13990,结合分位数和最大值来看,平均数75% 分位数几乎相等,属于典型的右偏分布,说明存在小部分用户(后面的25%)高额消费(这些用户需要给消费金额<106的用户背锅,只有这样才能使平均数维持在106)。

绘制每个用户的产品的购买数量与消费金额散点图

df.plot(kind='scater',x='order_products',y='order_amount')

从图中可知,用户的消费金额与购买量呈现线性趋势,每个商品均价在15块钱左右。

另外,订单的极值点比较少(消费金额大于1000,或者购买量大于60点的,称为极值点),对于样本来说影响不大,可以忽略不记。

2.2.2 用户消费分布图

plt.figure(figuresize=(12,4))
#画1行两列的图
plt.subplot(121)
plt.xlabel('每个订单的消费金额')
df['order_amount'].plot(kind='hist',bins=50)

直方图中bins是区间大小,影响柱子的宽度,bins值越大柱子越细,宽度=(列最大值-列最小值)/bins 。

从图一可知,消费金额在100以内的订单占据了绝大多数。

plt,subplot(122)
plt.xlabel('每个uid的购买数量')
df.groupby(by='user_id')['order_products'].sum().plot(kind='hist',bins=50)

从图二可知,每个用户的购买数量非常小,集中在50以内。

两幅图得知,我们的用户主要是消费金额低,并且购买量小于50的用户人数占据大多数。(在电商领域是非常正常的现象)

2.2.3 用户累计消费金额占比分析(用户的贡献度)

进行用户分组,取出每个用户的消费金额,进行求和汇总,排序,重置索引

user_cumsum = df.groupby(by='user_id')['order_amount'].sum().sort_values().reset_index()
# 记得重置索引!!!

每个用户消费金额累加,使用累加求和函数 np.cumsum

#举例
a = [1,2,3,4,5,6,7]
print(np.cumsum(a))# [1 3 6 10 15 21 28 ]
user_cumsum['amount_cumsum'] = user_cumsum['order_amount']cumsum()
user_cumsum.tail #看后五条
# 消费金额总值
amount_total = user_cumsum['amount_cumsum'].max()
#计算贡献度
user_cumsum['prop'] = user_cumsum.apply(lambda x: x['amount_cumsum']/amount_total,axis=1)
user_sumsum.tail()
# 绘制图形
user.sumsum['prop'].plot()

由图分析可知,前20000名用户贡献总金额的40%,剩余3500名用户贡献了60%。(2/8原则)

2.2.4 用户首购时间和最后一次购买时间

首购时间:用户分组,取时间的最小值,即为首购时间
A 1997-1-1
B 1997-1-1
1997-1-1 有几个? 2个

# 首购时间的频数统计,value是首购时间
df.groupby(by = 'user_id')['order_date'].min().value_counts().plot()

由图可知,首次购买的用户是在1月1日~2月10号呈明显的上升趋势,后续逐步下降。猜测:有可能是公司产品的推广力度或者价格的调整所致。

最后一次购买时间,可判断客户是否忠诚客户。

df.groupby(by='user_id')['order_date'].max().value_counts().plot()

大多数用户最后一次购买时间集中在前三个月,说明缺少忠诚客户。但是随着时间的推移,最后一次购买商品的用户量呈现上升趋势。猜测:这份数据选择的是前三个月消费的用户在后面18个月的跟踪记录。

2.3 用户分层

2.3.1 构建RFM模型

为了精细化运营,可以利用RFM 模型对用户价值指数(衡量历史到当前用户贡献的收益)进行计算,其中

  • R : (Recency,最近一次消费): R值越大,表示客户交易发生的日期越久,反之则交易发生的日期较近。
  • F: (Frequency, 消费频率) ,F值越大,表示客户交易越频繁,反之则表示客户交易不够活跃(此处我们选择购买产品数量作F)。
  • M: (Money, 消费金额),M越大,表示客户价值越高,反之则表示客户价值越低 。

根据上述三个维度,对客户作细分
在这里插入图片描述

2.3.2 透视表

透视表是一种可以对数据动态排布并且分类汇总的表格格式。或许大多数人都在Excel使用过数据透视表,也体会到它的强大功能,而在pandas中它被称为pivot_table。

为什么要使用pivot_table?

  • 灵活性高,可以随意定制你的分析计算需求
  • 脉络清洗易于理解数据
  • 操作性强,报表神器

透视表的使用(index:相当于groupyby,values:取出的数据列,aggfunc:key值必须存在values列中,并且跟随有效的聚合函数)

rfm = df.pivot_table(index = 'user_id',
					values = ['order_products','order_amount','order_date'],
					aggfunc = {
					'order_date': 'max', # 最后一次购买
					'order_products':'sum', # 购买产品的数量
					'order_amount':'sum' #消费总净额
					})
rfm.head()					

用每个用户的最后一次购买时间 - 日期列中的最大值,最后再转成天数,小数保留一位。

rfm['R'] = -(rfm['order_date']-rfm['order_date'].max())/np.timedelat64(1,'D')
#取相差的天数,保留一位小数
rfm.rename(columns={'order_products','F','order_amount','M'}, inplace = True)#更改列名
rfm.head()

RFM计算方式:每一列数据减去数据所在列的平均值,有正有负,根据结果值与1 作比较,如果>=1设置为1,否则为0

def rfm_fun(x):#x:分别代表每一列的数据
	level = x.apply(lambda x: '1' if x>=1 else '0')
	label = level['R'] + level['F'] + level['M'] #举例:100 001
	d = {
		'111':'重要价值客户',
		'011':'重要保持客户',
		'101': '重要发展客户',
		'001':'重要挽留客户',
		'110':'一般价值客户',
		'010':'一般保持客户',
		'100':'一般发展客户',
		'000':'一般挽留客户'
		}
	result = d[label]
	return result
#rfm['R'] - rfm['R'].mean()
rfm['label'] = rfm[['R','F','M']].apply(lambda x: x-x.mean()).apply(rfm_func,axis=1)
rfm.head()

客户分层可视化

for label, grouped in rfm.ggroupby(by='label'):
	print(label,grouped)
  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值