《从零学会数据分析:简单数据處理》学习笔记
使用openxlsx比较适合于读取Excel数据量比较大的情况如果使用XLConnect可能会出现内存溢出(指程序在申请内存时,没有足够的内存空间供其使用out of memory)的情况。
以课程中提供的数据“朝阳医院2016年销售数据”为例首先安装openxlsx包。
其次载入openxlsx包并设置读取路径,将Excel“朝阳医院2016年销售数据”中待读取的工作表sheet1导入R语言并存储为数据框据说,数据分析师多达60%的工作时间都用在实际开始之前的数据准备工作中比如处悝缺失的数据、改变列名、处理时间格式的数据等,即数据预处理
数据预处理的目标是把原始数据改变成自己便于处理的格式,或者说使原始数据符合自己接下来进行数据分析的需求类似于发朋友圈之前用修图软件PS原始照片。
原来Excel表格读取到R语言之后的列名仍然为为中攵如下图
为了便于之后使用R语言处理数据(编程语言是英文),需要将数据框中的中文列名全部转换为英文即对列名重新命名。
一般使用函数names()重命名列名代码如下
任何原始数据都有可能因为各种情况造成某些字段的数据不完整,所以在实际工作中需要删除不完整的数據在R语言中缺失值用NA表示。
之前载入的“朝阳医院2016年销售数据”购药时间为空是无法接受的,可以通过逻辑运算符、函数is.na()删除数据中為空的行
函数is.na()表示为空的数据,逻辑运算符!表示“非”的含义$Time表示仅选取Time这一列中非空的数据。为了跟原有数据框区分这里将选取嘚数据全部存到新的数据框salesdata中(直接覆盖原有数据框exceldata也可以)。代码如下:
此外还可以用函数na.omit()删除所有包含缺失数据的行。
关于逻辑运算符、函数is.na()和函数na.omit()更详尽的用法和实例可参考中有关缺失值的相关内容
数据框中Time这一列的数据类型是字符串,包含的内容是日期+空格+星期几而实际上只需要提取日期,所以问题便转化为如何将字符串的数据分拆出数据处理所需要的部分字符串即只保留原字符串的一部汾内容,即日期具体方法如下:
课程中提到分拆字符串可以利用stringr包,首先来安装
3、实现“拆分数据框salesdata中Time这一列的数据以空格未拆分标准,拆汾成两列”的代码如下:
运行代码后得到包含两列的数据框timesplit
4、将数据框timesplit中的第一列全部赋值给数据框salesdata中Time这一列,代码如下:运行代码嘚到只保留日期的数据框salesdata
四、类型判断和转换函数
数据类型的判断和转换,在中提到过:is开头表示判断as开头表示转换。
1、字符串格式转換为日期格式
函数class()查看数据格式
character表示为字符串格式利用函数as.Date()将字符串格式转换为日期格式(具体方法可在文章中查看)。2、字符串格式轉换为数值格式
数值格式适用于之后的数据分析中相关计算利用函数as.numeric()转换。
数据排序能让数据分析人员发现更多有价值的信息利用函數order()来实现,详见
如果按照销售时间升序排列,可输入以下代码
#销售时间升序排列方法一
#销售时间升序排列,方法二
六、数据预处理步驟总结
第一步重命名列明,便于之后写代码;
第二步删除缺失数据,保证数据完整性;
第三步处理日期,拆分字符串;
第四步数據类型转换,便于之后分析计算;
第五步数据排序,发现可能更多有价值的信息
原始数据经过预处理之后就可以根据业务需要进行业務指标分析了。
月均消费次数=总消费次数/月份数
其中根据业务部门提供的信息,总消费次数的含义是同一天内同一个人发生的所有消費算作一次消费。因此在数据框salesdata中Time(销售时间)和CardNum(社保卡号)完全相同的数据只需要保留一条。
利用函数duplicated()根据帮助文件可知该函数昰一个可以用来解决向量或者数据框重复值的函数,会返回一个TRUE和FALSE的向量以标注该索引所对应的值是否是前面数据所重复的值。即如果囿重复的值返回TRUE如果没有重复的值返回FALSE。
函数duplicated()能够从数据框中选择出重复的数据而分析目标是将重复的数据删除,只保留不重复的数據因此,结合逻辑运算符“!”即可删除重复数据。具体看以下代码:
#利用函数duplicated将数据框中重复的数据标记为TRUE不重复的数据标记为FALSE #在函数duplicated前加逻辑运算符!将数据框中不重复数据的标记转换为TRUE #以此建立一个是否重复的索引index_KPI1 #依据索引index_KPI1删除数据框中重复的数据,并将结果赋值給变量KPI_1 #将以上步骤合起来代码如下
那么总消费次数就是数据框KPI_1的总观测数(行数),代码如下
首先确定数据框KPI_1中的时间范围由于之前巳经按照销售时间升序排列,所以最早时间是Time这一列中的第一条数据最晚时间是该列最后一条数据。总天数就是最晚时间减去最早时间总月数用逻辑运算符整数除法(%/%)可得。
运行代码后最后一句报錯
需要转变总天数格式为数值,利用函数as.numeric()转换格式修改后代码如下#总月数,逻辑运算符%/%表示整数除法
运行后没问题于是月均消费次数=總消费次数/月份数
关于数据运算符更详细的内容,可以参考文章
月均消费金额=总消费金额/月份数
月份数之前已经算出来了,接下来只需偠计算总消费金额使用函数sum()。
函数sum()比较简单其中第二个参数为na.rm,默认为FALSE设置为TRUE时表示移除缺失值(只计算有值的数据)。计算总消費金额的实质是计算实收金额(Proceeds)这一列的总和所以月均消费金额就是总消费金额除以月份数,具体代码如下#总消费金额为实收金额總和
#月均消费金额=总消费金额/月份数
客单价=总消费金额/总消费次数
客单价(Per Customer Transaction,PCT)就是每个人消费的单价总消费金额和总消费次数已经得箌,直接计算即可
消费趋势是指消费金额随着时间变化而变化的趋势,时间能够以年、月、周、日、小时等时间段来划分实际中主要昰根据业务部门的需要确定,这里按照每周为时间间隔所呈现的消费趋势为例
目前数据框中的数据是每天的消费金额,按周呈现消费趋勢就必须计算出每周的消费金额因此,任务目标被分解为:第一把原始数据按照“周”分组;第二,计算按“周”分组之后的每周的消费金额;第三根据新分组生成的数据画图得出消费趋势。