项目:CDNow网站的用户消费行为分析

使用工具和数据:jupyter notebook, CDNOW_master

导入pandas和numpy

可视化需要matplotlib 软件包的 pyplot 子模块的 plot() 函数绘图,所以还要导入Matplotlib绘图库,具体详见https://www.runoob.com/numpy/numpy-matplotlib.html

观察数据,共有4列:用户ID、购买日期、购买产品数、购买金额

更改后的df数据如下:因为后续会按月进行分析,所以新增个month列,当列名是全新的则在最右变自动加上新的一列

一、通过month分组数据,按月分析用户行为

1.每月的订单总金额

做出折线图如下,发现1~3月份订单金额增长较快3月达到最大值,随后急速下降,可能是前3个月有某些活动吸引了用户下单。

2.每月用户消费的总产品数

3.每月用户消费的订单数

4.每月的用户数:

一个用户ID在当月可能消费不止一个订单,也就是说用户ID会有重复,去掉重复的用户ID就得到每月的用户总数。去重用drop_duplicates()

更简单的方法可以使用数据透视表pivot_table,按月计算以月为索引,要计算的值是总金额,产品数和订单数,对这三列分别指定函数,注意 'user_id':'count' 是对用户ID计数

5.每月用户平均消费金额:

每月用户消费的总金额 / 该月的用户数

6.每月用户平均消费次数

每月的订单数 / 该月的用户数

二、用户个体消费数据分析,通过用户ID分组数据

1.消费金额、消费产品数的描述统计:

可知:用户平均消费了7张CD,中位数却是3,同理订单金额平均是106,中位数是43,说明少量的用户消费了大量的产品,这也遵循二八法则。

2.消费金额、产品数的散点图:

观察散点图,右上角极个别的点拉大了图表,其实就是极值的影响,我们可以加个过滤条件,减少极值的影响。query()过滤出订单金额在4000以内的:

3.消费金额、消费产品数做直方图:

bins=20等距划分成20份

数据较集中,可以使用切比雪夫定理过滤掉异常值,即95%的数据集中在’平均值加5个标准差‘。根据上面的描述统计,产品数的mean+5*std在100附近,所以我们选择产品数在100以内的数据:

4.用户累计消费金额占比:百分之多少的用户占了百分之多少的销售额

按用户消费金额进行升序排列,cumsum累计相加,除以消费总额即得到累计消费金额占比

重置索引,对order_mount切片选取这一列作图:

由图可知:20000个用户消费占比是40%,而剩下的3570个用户即贡献60%的销售额。

三、用户消费行为

1.第一次购买的用户分布(新用户):

我们对用户分组的数据求最小值,选取order_dt这一列,最小的日期就是距离现在最远,即第一次购买的日期。对首购的用户进行计数,绘出折线图显示97年2月初新客最多。

2.最后一次购买的用户分布:

再对用户分组的数据求最大值,选取order_dt这一列,最大的日期就是距离现在最近,即最后一次购买的日期。发现最后一次购买的用户在97年2月份出现的次数最多,结合首购用户也是在2月份最多,我们推测可能是2月份有某些优惠活动,吸引了一部分用户消费。

3.新老用户分布

使用一个聚合函数算出每个用户首购和最后一次购买的时间,判断这两个时间是否相等,相等则返回Ture说明该用户仅消费了一次,不相等返回False。

一半用户只消费了一次

4.用户分层

4.1 RFM用户分层:

Recently最后一次消费距今的时间,Frequently消费次数,消费金额。

以用户ID为索引,计算消费总金额、消费次数和最后一次消费时间,生成数据透视表:

消费总金额就是M,消费次数是F(频率),下面将最后一次消费时间转化成R:

数据表中的最后时间大约在1998年7月也就是order_dt.max()  和用户最后一次购买时间相减就知道购买了多少天(R),最后再把order_dt更改数据类型为日期格式。

和平均消费相比,比如用户1的R>0说明最后一次购买距今的天数超过平均值,F<0说明购买次数低于平均值,M<0说明购买金额也低于平均值,这类用户就是最不活跃的,可划分为一般挽留用户。类似的,我们可以将RFM与0比较对用户进行分层。

我们按照用户类型分组,对每种类型的客户进行求和统计

可视化:

4.2 新客,活跃,回流,流失用户分层

以user_id为索引,月为列创建数据透视,对每个用户在每月的购买日期计数,空值用0填充,就可以知道每个用户在每个月消费了几次。

简化一下表格,买了记为1,没买记为0:

函数返回以每月为索引的状态,创建函数前先定义好columns_month,他是数据按月分组求和后,重置一下索引,再切取month列:

将创建好的函数应用到df_purchase的每一行,可以看出每个用户在每个月的活跃状态

将其中未注册(unreg)的用户填充空值,计算每种类型的用户在每月的个数如下:

转置一下:

5、用户购买周期:用户的订单之间间隔时间是多少天

用户购买周期分析,按订单算用户购买平均的时间间隔是多少,也就是用户隔多少天下一次单

shift是下移一个位,错位相减得到不同用户自己内部的订单间隔时间。比如用户1 只有一个订单,下移之后该订单日期无法相减所以是空。用户2有两个订单,第二个订单减第一个订单日期为0天说明这两个是同一天下单。

把日期的单位去掉,绘制直方图:

6、用户生命周期分析,最后一次下单和第一次下单

最后一次下单就是最大的日期,第一次下单就是最小的日期,这里用之前新老用户分布的得到的user_life

我们想把购买过1次及以上的用户提取出来

复购率:自然月内,购买多次的用户占比

回购率:当月消费过的在次月仍旧消费

0:当月消费,次月没消费(没回购)

1:当月消费,次月也消费(回购)

NaN:当月都没消费

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。