第一篇数据分析项目实战:用户消费行为分析本篇文章以模仿为主, 利用pandas进行数据处理,分析用户消费行为 。数据来源CDNow网站的用户购买明细 。一共有用户ID,购买日期,购买数量,购买金额四个字段 。
分析步骤
第一部分:数据类型的处理—字段的清洗
缺失值的处理、数据类型的转化
第二部分:按月数据分析
每月的消费总金额、每月的消费次数、每月的产品购买量、每月的消费人数
第三部分:用户个体消费数据分析
用户消费金额和消费次数的描述统计、用户消费金额和消费次数的散点图、用户消费金额的分布图(二八法则)、用户消费次数的分布图
、用户累计消费金额的占比
第四部分:用户消费行为分析
用户第一次消费时间、用户最后一次消费时间、新老客消费比、用户分层、用户购买周期、用户生命周期 。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
%matplotlib inline
plt.style.use('ggplot')
加载包和数据,文件是txt,用read_table方法打开,因为原始数据不包含表头 , 所以需要赋予 。字符串是空格分割,用\s 表示匹配任意空白符 。
一般csv的数据分隔是以逗号的形式,但是这份来源于网上的数据比价特殊,它是通过多个空格来进行分隔
columns = ['user_id','order_dt','order_products','order_amount']
df = pd.read_table("CDNOW_master.txt",names = columns,sep = '\s ')
列字段的含义:
user_id:用户ID
order_dt:购买日期
order_products:购买产品数
order_amount:购买金额
消费行业或者是电商行业一般是通过订单数 , 订单额 , 购买日期,用户ID这四个字段来分析的 。基本上这四个字段就可以进行很丰富的分析 。
观察数据,判断数据是否正常识别 。值得注意的是一个用户可能在一天内购买多次,用户ID为2的用户在1月12日买了两次,这个细节不要遗漏 。
查看数据类型、数据是否存在空值;原数据没有空值,很干净的数据 。接下来我们要将时间的数据类型转化 。
当利用pandas进行数据处理的时候,经常会遇见数据类型的问题,当拿到数据的时候,首先要确定拿到的是正确的数据类型,如果数据类型不正确需要进行数据类型的转化,再进行数据处理 。附: 常见pandas数据类型转化
用户平均每笔订单购买2.4个商品,标准差在2.3,稍稍具有波动性 。中位数在2个商品,75分位数在3个商品,说明绝大部分订单的购买量都不多 。最大值在99个,数字比较高 。购买金额的情况差不多,大部分订单都集中在小额 。
一般而言,消费类的数据分布,都是长尾形态 。大部分用户都是小额 , 然而小部分用户贡献了收入的大头 , 俗称二八 。
数据类型的转化
df['order_dt'] = pd.to_datetime(df.order_dt,format = '%Y%m%d') #Y四位数的日期部分 , y表示两位数的日期部分
df['month'] = df.order_dt.values.astype('datetime64[M]')
到目前为止 , 我们已经把数据类型处理成我们想要的类型了 。我们通过四个字段及衍生字段就可以进行后续的分析了 。
接下来我们用之前清洗好的字段进行数据分析 。从用户方向、订单方向、消费趋势等进行分析 。
1、消费趋势的分析
每月的消费总金额
每月的消费次数
每月的产品购买量
每月的消费人数
目的:了解这批数据的波动形式 。
01-每月消费总金额
grouped_month = df.groupby('month')
order_month_amount = grouped_month.order_amount.sum()
order_month_amount.head()
用groupby创建一个新的对象 。这里要观察消费总金额 , 需要将order_amount求和
按月统计每个月的CD消费总金额 。从图中可以看到,前几个月的销量非常高涨 。数据比较异常 。而后期的销量则很平稳 。
前三个月的消费订单数在10000笔左右 , 后续月份的消费人数则在2500人左右 。
每月的产品购买量一样呈现早期购买量多,后期平稳下降的趋势 。为什么会呈现这个原因呢?我们假设是用户身上出了问题,早期时间段的用户中有异常值,第二假设是各类促销营销 , 但这里只有消费数据,所以无法判断 。
04-每月的消费人数(去重)
方法一:df.groupby('month').user_id.apply(lambdax:len(x.drop_duplicates())).plot()
方法二:df.groupby('month').user_id.nunique().plot()
每月的消费人数小于每月的消费次数,但是区别不大 。前三个月每月的消费人数在8000—10000之间 , 后续月份,平均消费人数在2000不到 。一样是前期消费人数多,后期平稳下降的趋势 。
数据透视表是更简单的方法,有了这个之后大家用里面的数据进行作图也是OK的,而且更加的快捷,所以pandas到后面的话解决一个问题会想到两到三个方法 。具体看那个方便,那个简单 。
之前我们维度都是月,来看的是趋势 。有时候我们也需要看个体来看这个人的消费能力如何,这里划分了五个方向如下:
用户消费金额和消费次数的描述统计
用户消费金额和消费次数的散点图
用户消费金额的分布图(二八法则)
用户消费次数的分布图
用户累计消费金额的占比(百分之多少的用户占了百分之多少的消费额)
从用户角度看 , 每位用户平均购买7张CD,最多的用户购买了1033张 。用户的平均消费金额(客单价)100元,标准差是240 , 结合分位数和最大值看,平均值才和75分位接近,肯定存在小部分的高额消费用户 。
如果大家能够接触到消费、金融和钱相关的数据 , 基本上都符合二八法则,小部分的用户占了消费的大头
绘制用户的散点图,用户比较健康而且规律性很强 。因为这是CD网站的销售数据,商品比较单一,金额和商品量的关系也因此呈线性,没几个离群点 。
从上图直方图可知 , 大部分用户的消费能力确实不高,绝大部分呈现集中在很低的消费档次 。高消费用户在图上几乎看不到,这也确实符合消费行为的行业规律 。
虽然有极致干扰了我们的数据,但是大部分的用户还是集中在比较低的而消费档次 。
到目前为止关于用户的消费行为有一个大概的了解
按用户消费金额进行升序排序 , 由图可知50%的用户仅贡献了15%的销售额度 。而排名前5000的用户就贡献了60%的消费额 。也就是说我们只要维护了这5000个用户就可以把业绩KPI完成60%,如果能把5000个用户运营的更好就可以占比70%—80%之间 。
求月份的最小值,即用户消费行为中的第一次消费时间 。所有用户的第一次消费都集中在前三个月.
观察用户的最后一次消费时间 。用户最后一次消费比第一次消费分布广 , 大部分最后一次消费集中在前三个月,说明很多客户购买一次就不再进行购买 。随着时间的增长,最后一次购买数也在递增,消费呈现流失上升的情况 , 用户忠诚度在慢慢下降 。
user_id为1的用户第一次消费时间和最后一次消费时间为19970101 , 说明他只消费了一次
有一半的用户只消费了一次
order_products求的是消费产品数,把它替换成消费次数也是可以,但是因为我们这里消费次数是比较固定的,所以使用消费产品数的维度 。
R表示客户最近一次交易时间的间隔,客户在最近一段时间内交易的金额 。F表示客户在最近一段时间内交易的次数,F值越大,表示客户交易越频繁,反之则表示客户交易不够活跃 。M表示客户在最近一段时间内交易的金额 。M值越大 , 表示客户价值越高 , 反之则表示客户价值越低 。
用户分层 , 这里使用平均数
M不同层次客户的消费累计金额,重要保持客户的累计消费金额最高
不同层次用户的消费人数 , 之前重要保持客户的累计消费金额最高,这里重要保持客户的消费人数排名第二 , 但离一般挽留用户差距比较大,一般挽留用户有14074人,重要保持客户4554人
从RFM分层可知,大部分用户为重要保持客户,但是这是由于极致的影响,所以RFM的划分应该尽量以业务为准 。尽量用小部分的用户覆盖大部分的额度,不要为了数据好看划分等级 。
RFM是人工使用象限法把数据划分为几个立方体,立方体对应相应的标签,我们可以把标签运用到业务层面上 。比如重要保持客户贡献金额最多159203.62,我们如何与业务方配合把数据提高或者维护;而重要发展客户和重要挽留客户他们有一段时间没有消费了,我们如何把他们拉回来
用户每个月的消费次数,对于生命周期的划分只需要知道用户本月是否消费,消费次数在这里并不重要,需要将模型进行简化
使用数据透视表,需要明确获得什么结果 。有些用户在某月没有进行过消费,会用NaA表示,这里用filna填充 。
对于尾部数据 , user_id2W 的数据是有问题的,因为从实际的业务场景上说 , 他们一月和二月都没有注册三月份才是他们第一次消费 。透视会把他们一月和二月的数据补上为0 , 这里面需要进行判断将第一次消费作为生命周期的起始,不能从一月份开始就粗略的计算
主要分为两部分的判断 , 以本月是否消费为界 。本月没有消费,还要额外判断他是不是新客 , 因为部分用户是3月份才消费成为新客 , 那么在1、2月份他连新客都不是 , 用unreg表示 。如果是老客,则为unactive
本月若没有消费,需要判断是不是第一次消费 , 上一个时间窗口有没有消费 。可以多调试几次理顺里面的逻辑关系 , 对用户进行分层 。
《业内主流写法》
这里用户生命周期的状态变化是用数据透视表一次性做的 , 但在实际业务场景中我们可能用SQL把它作为中间表来处理 。我们有了明细表,会通过明细表来计算出状态表;也就是它的数据上个月是什么样的情况得出来,比如上个月是新用户或者回流用户,我们直接用上个月的状态left join本月的状态 。直接用SQL进行对比
可以用pandas将每个月的状态计算出来,不是逐行而是月份计算,先算出一月份哪些用户是新购买的 , 然后判断二月份是否购买 , 两者left join
由上表可知 , 每月用户的消费状态变化 。活跃用户、持续消费的用户对应的是消费运营质量 。回流用户,之前不消费本月才消费对应的是唤回运营 。不活跃的用户对应的是流失
这里可以针对业务模型下个定义:流失用户增加 , 回流用户正在减少
user_id 1为空值,表示该客户只购买过一个订单 。user_id为2 的用户第二笔订单与第二笔订单在同一天购买
订单周期呈指数分布 , 用户的平均购买周期是68天 , 绝大部分用户的购买周期都低于100天 。
数据偏移比较大,中位数是0天也就是超过50%的用户他的生命周期是0天只购买了一次,但是平均生命周期有134天,最大值是544天
用户的生命周期受只购买一次的用户影响比较厉害(可以排除),用户均消费134天,中位数仅0天
筛选出lifetime0,既排除了仅消费了一次那些人,有不少用户生命周期靠拢在0天,部分质量差的用户虽然消费了两次,但是任然无法持续,在用户首次消费30天内应该尽量引导 。少部分用户集中在50—300天,属于普通型的生命周期 。高质量用户的生命周期,集中在400天以后,这属于忠诚用户 。
applymap针对DataFrame里的所有数据 。用lambda进行判断,因为这里设计了多个结果,所以要两个if else
【用户消费数据php 用户消费行为分析报告】用sum和count相除即可计算出复购率 。因为这两个函数都会忽略NAN,而NAN是没有消费的用户,count不论是0还是1都会统计,所以是总的消费用户数,而sum求何计算了两次以上的消费用户 。这里用了比较巧妙的替代法计算复购率 , SQL中也可以用 。
图上可以看出复购率在早期,因为大量新用户加入的关系 , 新客的复购率并不高,譬如1月新客们的复购率只有6%左右 。而在后期,这时的用户都是大浪淘沙剩下的老客户,复购率比较稳定,在20%左右.
单看新客和老客,复购率有三倍左右的差距
接下来计算回购率 。回购率是某一个时间窗口内消费的用户,在下一个时间窗口人就消费的占比 。我1月消费用户1000,他们中有300个2月依然消费,回购率是30%
0代表当月消费过次月没有消费过,1代表当月消费过次月依然消费
新建一个判断函数 。data是输入数据 , 既用户在18个月内是否消费的记录 , status是空列表 , 后续用来保存用户是否回购的字段 。因为有18个月,所以每个月都要进行一次判断,需要用到循环 。if的主要逻辑是,如果用户本月进行过消费,且下月消费过 , 记为1,没有消费过是0.本月若没有进行过消费,为NAN,后续的统计中进行排除 。apply函数应用在所有行上,获得想要的结果 。
最后计算和复购率大同小异,用count和sum求出,从图中可以看出,用户的回购率高于复购,约在30%左右,和老客户差异不大 。从回购率和复购率综合分析可以得出,新客的整体质量低于老客 , 老客的忠诚度(回购率)表现较好,消费频次稍次 , 这是CDNow网站的用户消费特征 。
PHP MYSQL循环输出一个月的消费记录,并统计每一天的支出与收入总合//统计当天支出总额
$sql_out="select sum(cash) as cashout from my_money where time$dayend and time$daybegin and type=1 group by FROM_UNIXTIME(time,'%y-%m-%d')";
//统计当天收入总额
$sql_in="select sum(cash) as cashin from my_money where time$dayend and time$daybegin and type=2 group by FROM_UNIXTIME(time,'%y-%m-%d')";
电商用户消费行为数据分析对于初级阶段的新电商来说,积累数据,找准运营方向,关注流量,开源是重点;
对于中级阶段的电商,稳定客流,提高店铺销量是首要任务;
对于很有规模的电商 , 更侧重留存与活跃,提升整体运营水平 。
不同的阶段,对于数据分析指标的侧重点也不同 。
本篇以某电商用户订单记录为例,侧重用户消费整体趋势和用户消费行为,对用户规模和用户黏性中的几个核心数据点进行分析展示:
分析过程思维导图:
数据来源于一家电商网站用户订单记录
观察数据:
1、日期需要转换格式
2、大部分的订单购买商品数量较少,平均值在2个左右 , 极值99很大,存在干扰
3、用户消费金额稳定,同样也存在极值干扰
时间格式转换:需要按月分析数据,这里直接转为月份,忽略具体日期
1、每月销量和销售额分布情况
销量与销售额走势一致
2、用户数量、订单数量分布情况
订单量和用户数量线性分布图
3、用户数量分布情况
使用数据透视表,查看每月用户数量、销量和销售额
用户平均消费金额不稳定,此消彼长
用户平均消费次数在1-2次之间,1997-1998呈上涨趋势
1、用户消费次数与消费金额
用户消费金额、消费次数分布散点图
根据散点图分布 , 极值影响严重,根据切比雪夫定理,筛选数据
95%的数据集中在距离平均值5个标准差之内
去掉极值,重新调整后的分布图
图形大致呈现线性回归,说明客单价稳定
用户消费次数直方图:
大部分集中在10次以内,小部分数据造成了干扰
用户金额次数直方图
大部分集中在250元以下,绝大部分呈现集中趋势,小部分数据造成了干扰
2、用户累计消费额占比
按消费金额排序 , 使用累计加和函数 , 计算用户消费额占比
用户人数是23750 50%的人只占了15%的消费额 消费总金额前4000名贡献了60%的消费额度
也就是维护好这前4000名客户 , 可以完成KPI的60%
3、新老客消费比
每月新客趋势图
每月老客趋势图
4、单次用户消费数量
只消费了一次的客户占比51.14%,有一半客户只购买了一次
按月对比:
5、用户分层——rfm模型
使用数据透视表,提取出用户消费额、最后一次消费日期、消费数量数据
将最后一次消费日期转为最后一次消费日距今的天数
(由于数据是很早之前的 , 为了更好的展示数据,将对比标准改为所有用户最后一次消费的日期)
数据以平均值作为x、y、z轴标准值 , 编写python函数,将用户M、R、F数据,划分象限 , 使用0、1作为标准值上下象限之分,给用户分别贴上标签 。
8类标签分别是:重要保持客户、重要价值客户、重要发展客户、重要挽留客户、一般保持客户、一般价值客户、一般发展客户、一般挽留客户
统计各标签用户的总销售额、总的消费频率 , 和人数
一般挽留客户最多,重要保持客户第二,重要保持客户销售金额占比最高
rfm客户分层散点图:
从RFM分层可知,大部分用户为重要保持客户,但这是由于极值影响,拉高了平均值,用户划分不够准确
6、用户分层——新老用户、活跃、回流、流失用户
使用数据透视表,统计每月各用户消费情况,1表示当月购买过,0表示当月没有购买
使用python函数,根据用户每月消费情况 , 贴上标签
统计每月各类用户的数量
更直观的面积图:
计算回流率加入表中
7、用户生命周期
计算用户第一次购买和最后一次购买的时间差
平均生命周期为135天,最长544天
用户的生命周期受只购买过一次的用户影响比较厉害,可以剔除
剔除只购买一次的用户 , 可以看出,用户生命周期首位两端人数比较多 , 中间值相对少
8、用户购买周期
9、复购率
复购率指自然月内,购买多次的用户占比
使用applymap函数对用户购买各月购买次数进行标记
复购率线形图
复购率稳定在20%左右,前一个月因为有大量新用户,只购买了一次,拉低了复购率
10、回购率
回购率指曾经购买过且在某一时期内再次购买的用户占比
使用前面分好的购买标记
0为本月未购买,1为本月购买
编写python函数,对用户回购情况贴上标签
回购率线形图
PHP支付宝接口,付款成功后,返回成功,然后将消费记录插入到数据库 。插入数据库的代码写在哪个文件里?付款成功的逻辑处理在noticy文件里用户消费数据php , 这个文件不可见用户消费数据php,是支付宝付款成功后台调用通知你的页面
return这个文件是付款成功后用户跳回看到的页面,
官方的文档写的很清楚
关于用户消费数据php和用户消费行为分析报告的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 在电视叫什么名字,在电视里叫什么
- 体育游戏花儿朵朵目标,体育游戏花儿朵朵教案
- 在word里怎么画图,在word上如何画图
- 怎么用mysql查询书名 mysql查数据库名
- 蓝牙耳机游戏安卓手机,苹果蓝牙耳机怎么连接安卓手机
- 网站片头制作,自动生成片头的网站
- 佳美直播录屏怎么录屏有声音,录屏直播怎么开启麦克风
- 鸿蒙系统怎么显示行程,鸿蒙系统看不到火车行程
- jquery去除属性,jquery去除元素