新兴大数据分析榆中百合
大数据流程
从流程角度上看,整个大数据处理可分成4个主要步骤。
处理流程图
分为三层(数据采集层,数据存储与计算处理层,数据可视化):
表2-1 系统环境
系统 | 版本 |
Windows 10 | 专业版(建议) |
Linux | CentOS 6.8 or CentOS 7.2(1611内核) |
表2-2 开发工具
工具 | 版本 |
idea Maven Jdk | 2017.2.5 旗舰版 3.3.9 1.8+ |
表2-3 集群环境(CDH版)
框架 | 版本 |
Hadoop | Cdh5.3.6-2.5.0 |
Zookeeper | Cdh5.3.6-3.4.5 |
Hbase | Cdh5.3.6-0.98 |
Hive | Cdh5.3.6-0.13.1 |
Flume | Cdh5.3.6-1.5.0(学习使用版本 1.7.0) |
Kafka | Kafka_2.10-0.8.2.1(学习使用版本 2.11-0.11.0.2) |
表2-4 硬件环境
硬件 | Hadoop 102 | Hadoop 103 | Hadoop104 |
内存 | 4G | 2G | 2G |
CPU | 2核 | 1核 | 1核 |
硬盘 | 50G | 50G | 50G |
数据生产
对于该模块的业务,即数据生产过程,一般并不会让你来进行操作,数据生产是一套完整且严密的体系,这样可以保证数据的鲁棒性。但是如果涉及到项目的一体化方案的设计(数据的产生、存储、分析、展示),则必须清楚每一个环节是如何处理的,包括其中每个环境可能隐藏的问题;数据结构,数据内容可能出现的问题。
本系统使用有一个基于数据分析消费者的可视化系统,该系统需要通过大量数据分析出榆中百合的销售渠道以及消费量,可以详细的掌握到榆中百合的销售情况,以便于后期将他们作为主要的消费群体来推广。数据包括用户ID,购买日期,购买数量,购买金额四个字段。
用到的工具:pycharm,python3.7
1、项目的总体内容包以下几个部分
(1)数据清洗:处理缺失值,数据类型转化,按照需要将数据整理好
(2)按月对数据进行分析:每月用户消费次数,每月用户的购买量,每月用户的购买总金额以及每月用户数量对比这些图标分析数据是否存在误差
(3)用户个体消费数据分析:用户个体消费金额与消费次数的统计描述,用户消费金额和消费次数的散点图,用户消费金额的分布图(符合二八法则),用户消费次数的分布图,用户累计消费金额的占比。
(4)用户消费行为分析:用户第一次消费时间,用户最后一次消费时间,用户分层,新老客消费比,用户购买周期,用户生命周期。
a.数据清洗
拿到数据使用pandas的read_table读出txt文件,列名为'user_id','order_dt','order_products','order_amount',由于这里的txt文件不是逗号分割的,所以sep = ‘\s+’。
数据读出无误时要检查数据中是否存在空值,并检查数据的数据类型。发现数据中并不存在空值,很干净的数据。那接下来既然我们需要每月这个数据,就要给order_dt这一列的数据进行适当的转换一下,转化成通常的时间格式,Y(年)m(月)D(日)。下面那句代码的意思是:在df里新增加一列列名是mounth,取出这一列的日期order_dt然后调取这一列的值把值转换成以月为单位的,例如6月1号到30号统统属于6月1号即是六月。
这时候可以对数据进行简单初步分析,用df.describe()。产品购买数量均值在2.4,中位数是2,其分位数是3,说明用户购买量大部分都不多,少部分购买量大的,最高购买量是99,其中存在一定的极致干扰。用户的订单金额比较稳定,人均购买CD金额在35,中位数在25元,存在极致干扰,很多销售行业都是类似这种分布,小额比较多,大额的较少,收入来源很大一部分是来自大额。
到这里数据都准备好了进行下一步分析。
b.按月分析数据趋势:
在这里用到了一个groupby,一个在数据分析中非常好用的函数,这一节是要按月分析用户行为,用groupby对用户按照月分分组。
分组完成之后得到一个新的dataframe叫group_month,然后直接取出组里的order_amount并求和可得到每个月份的销售总额,并且画出折线图。
c.用户个体消费数据分析:
之前的都是看趋势,现在看个体的消费水平如何
主要分析的对象是:
用户消费金额和消费次数的统计以及散点图来观察用户的平均消费水平
用户消费金额的分布图(二八原则)
用户消费次数的分布图
用户累计消费金额的占比(百分之多的用户占了百分之多少的消费额)
以user_id为索引进行分组但是分组之后可能会发现打印出来的是对象,因为需要对分组完的数据进行进一步操作,例如求和求均值等等。然后再这里用到的是对数据进行求和,然后调用quary方法规定x轴坐标order_amunt的值小于3000,调用plot里的scatter散点图,画出散点图。
求出用户的累计消费金额占比,cumsum方法是滚动求和,对求完占比之后的dataframe进行重置 索引,重置索引之后的索引是按照升序排列好的,所以画出的图横坐标就是索引,纵坐标就是消费额所占比例,可以反映出百分之多少的用户占了消费额的百分之多少。
图3-1 用户消费额占比
从消费额占比中看得出百分之五十的用户才占了百分之二十不到的消费额,排名前五百的用户占有了快百分之五十的消费额,消费还是主要集中在一些大客户上。
d.用户消费行为分析:
用户第一次消费&用户最后一次消费
新老客消费比(多少客户仅消费一次,每月新客占比)
用户分层(RFM,新,老,活跃,流失)
用户消费周期
用户生命周期
首购都在一月到三月份,最后一次购买也基本集中在一月到三月份,长期活跃的客户不是很多,大部分用户是购买一次之后不在购买,随着时间的增长,最后一次购买的用户量也在不断增加
第一次消费时间等于最后一次消费时间的数量占到了一半,说明很多顾客仅消费一次不再消费。
接下来对用户进行分层:
将用户分成:
111':'重要价值客户',
'011':'重要保持客户',
'101':'重要挽留客户',
'001':'重要发展客户',
'110':'一般价值客户',
'010':'一般保持客户',
'100':'一般挽留客户',
'000':'一般发展客户'
至于前面数字的意义等下会解释。到这里就开始使用一个新的函数,及python的透视函数,point_table此函数功能跟excel的透视表一样,但是比透视表更加灵活,pd.point_table(index = [],columns = [],values = [],aggfunc = [])这几个参数等会要用到
RFM是人工使用象限法把数据划分为几个立方体,立方体对应相应的标签,我们可以把标签运用到业务层面上。比如重要保持客户贡献金额最多159203.62,我们如何与业务方配合把数据提高或者维护;而重要发展客户和重要挽留客户他们有一段时间没有消费了,我们如何把他们拉回来
首先对于参数data,data是单独的一行,也即是secris类型的数据apply方法默认取出的数据是一列,但是在后面直接明确了取数据的方式axis=1,代表每次取一行,一行进行函数中间的逻辑运算。既然是一行数据了,一行里有十八种类型,则需要遍历循环十八次,所以for i in range(18):默认从0到十八,但是包括0不包括十八(python的半包)。先定义一个空数组status,然后开始讨论本月是否有消费,假设本月没有消费,那么data[i]==0,判断status里是否有值即判断data[i-1],如果status里有值,看他里边的值是什么状态,如果说值等于unreg那本月依然是未注册。就往status里加入“unreg”,如果上个月是不活跃或者回流,这个月不消费依然是不活跃,status加入“unactive”。其他如果本身status里都没有值,这个月又不消费那么就是还没开始注册。假设本月已经消费那么data[i-1]==1,看一下status的状态,如果len(status)>0即是status里有值就要判断一下这里边值的状态了,如果这里边data[i-1]==‘unreg’就是说上个月就没注册,这个月突然消费了,那他就是新客啦!如果上个月是不活跃那这个月就是回流用户了,其他情况都是活跃用户。这一块代码有点多,不过逻辑上还是很清晰的
接下来就来看一下每个月的新用户,未注册用户,活跃用户回流用户有多少,由于没注册的用户在数据里是干扰项,则直接让没注册的用户为NaN,这样的话看起来应该会好看一些。用replace函数,用np.NaN进行替代apply在这里默认每次取出一列进行逻辑运算,用到lambda匿名函数,以及panads的计数函数
每月用户的消费状态变化。活跃用户、持续消费的用户对应的是消费运营质量。回流用户,之前不消费本月才消费对应的是唤回运营。不活跃的用户对应的是流失,这里可以针对业务模型下个定义:流失用户增加,回流用户正在减少
再来看一下用户的生命周期:也就是用户的最后一笔订单时间减去第一笔订单时间就是用户的生命周期。
新建一个判断函数。data是输入数据,既用户在18个月内是否消费的记录,status是空列表,后续用来保存用户是否回购的字段。因为有18个月,所以每个月都要进行一次判断,需要用到循环。if的主要逻辑是,如果用户本月进行过消费,且下月消费过,记为1,没有消费过是0.本月若没有进行过消费,为NAN,后续的统计中进行排除。apply函数应用在所有行上,获得想要的结果。
最后计算和复购率大同小异,用count和sum求出,从图中可以看出,用户的回购率高于复购,约在30%左右,和老客户差异不大。从回购率和复购率综合分析可以得出,新客的整体质量低于老客,老客的忠诚度(回购率)表现较好,消费频次稍次,这是CDNow网站的用户消费特征。