首先预习了《R语言实战》的第三章和第四章,第三章主要讲的是关于简单的绘图,对于R的绘图有了一定的了解。第四章是基本数据管理,讲了一些基本的操作,对变量的处理,对缺失值的处理,还有日期值是一个以前没有考虑过的概念,要很好的运用和处理恐怕还需要很多实践。类型转换和数据排列都是很实用的工具,但是距离我自己主动运用还有很长的路要走。
看完这两章的内容,并且听完了猴子老师的课,总共花了三天的时间。由于平时的工作中没有可以接触到的可用的表格数据,我决定把老师给的数据和指标按照自己的思路做一遍,看看不一样的地方在哪。
猴子老师这一课讲得较快,而且对于各种函数用法不熟悉的我来说,听完一遍,只是有个初步的印象。
自己凭着记忆,并且按照自己已知的去操作实践,实在不行的时候,再去翻翻ppt,直到最后第四个指标实在不知道怎么做的时候,再打开源代码看看,下面是我的实践记录:
首先整理一下思路:
1 目标是什么:
根据提供的销售数据表,得到:月均消费次数,月均消费金额,客单价,消费趋势。
2 打开数据表,看看有什么内容:
购药时间,社保卡号,商品编码,商品名称,销售数量,应收金额,实收金额。
注意到社保卡号有重复的,那就说明,同一个人会有多次购买的情况。
时间格式为“2016-01-01 星期五”这样的形式,但是顺序是混乱的。
商品编码和名称,有重复和混乱的情况,不过在这里不是重点。
销售数量,应收金额,实收金额等都是具体的数字。
3 如何获得分析结果:
a 月均消费次数,这个是比较简单的数学运算,总的消费次数/月份数,这里的月份数应该是这个表中所记录到的月份数,默认一年是12个月,但是我好想并没有看到11月和12月,这个可能是数据的缺失,但是不影响对于目标的分析。
b 月均消费金额,和上一个指标类似,总的消费次数/月份数。
c 客单价,就是每个人的平均消费金额,总的消费金额/人数,这个人数不应该是人次,因为有人多次购买,可以用社保卡号区分出来。
d 消费趋势,即每周的消费总额,这里需要按一个周的时间来统计消费金额,当然我想按月统计应该也是可以的。
4 具体的操作步骤:
一 数据处理:
a 如何用R导入excel数据表,这里用到openxlsx包,具体的函数为:read.xlsx(),返回的是一个数据框,如下图所示:
b 这个表的每一列名称都是中文,但是中文操作不那么方便,我们需要把它们重新命名为英文,即列表重命名。
重命名的函数有fix(),但是这个函数只能手动修改,不实用。
另一种方式是使用names()函数,返回的是每一列名称的向量,不仅可以读取名称,还可以修改,代码如下:
第三种方式是函数:rename(x, replace, warn_missing = TRUE, warn_duplicated = TRUE),注意要先安装plyr包,replace=c(),oldname(修改前的名称)不加双引号,新名称需要加双引号,这个好处在于不用考虑顺序。如图所示:
c 删除缺失数据:
关于缺失值处理的函数,参考《R语言实战》4.5。
函数is.na(),判断某个向量或数据框等中的元素是否为NA,返回false或者true。这里有个神奇的用法,值得学习:
即判断时间那一列,用!(非)来剔除NA行。
na.rm=true,用于sum函数加和,若是元素中有NA值,则会返回NA值,这条判断语句可以删除NA值,然后把剩下的数据相加。
na.omit(),删除含有缺失数据的行,返回删除这些行后的数据框。
d 处理日期
日期在R语言中处理的比较多,是一个重要的指标,关于日期的处理,可以参见《R语言实战》4.6 P76:
as.Date(x,"input_format"),以数值形式存储日期变量。
给的表中日期为“2016-01-01 星期五”,但是我们需要的是“2016-01-01”,日期值的默认输入格式为yyyy-mm-dd,代码如下:
另一种猴子老师给的方法是,安装stingr包,利用str_split_fixed()函数,将字符串分离,代码如下:
e 数据类型转换
需要将日期转换为date类型,才能进行相应的日期函数的处理。代码如下:
f 数据排序
用到order()函数,默认的排序是升序,代码如下:
结果如下:
若要降序,需要加入参数,decreasing=True,猴子的代码:
二 数据分析
a 月均消费次数
注意,同一天内,同一个人多次消费算一次。
这里用到函数duplicated() ,判断哪些元素是比它下标小的元素的复制,输出是一个逻辑值,而这个逻辑值可以用于筛选数据框的行和列,代码如下:
kpi1是一个新的向量,把和date&cardno都一样的“复制行”都给删了,而它的行数就是总的消费次数。
接下来是统计月份数,首先要知道总天数,有了总天数,除余30天,就可以得到有几个月。代码如下:
得到结果,899.67次,用函数format和round使其显示小数点后六位。
b 月均消费金额
首先要得到总的消费金额,再除以月份数即可。这里要用到sum()函数,代码如下:
得到结果,50771.71元每月。
猴子老师的代码如下:
c 客单价
首先要知道有多少客户,用总的消费金额除以客户数量即可。
这里的客户数量,我的理解有误,我认为是整个时间段内同一个客户多次购买行为只算一次,但其实猴子老师给的客户数量是同一天同一个客户的多次购买行为只算一次,于是我的代码如下:
得到结果,125.57元/客。
猴子老师的代码,这里的consumeNumber<-nrow(kpi1):
得到结果:56.43元/客。
d 消费趋势
消费趋势指的是每周的营业额的走势,需要绘制图形。
这里要用到分组函数tapply(),但是具体的用法不是很清楚,跟着猴子的代码打了一遍,如下:
得到结果如下:
关于绘图的操作可以看《R语言实战》第三章相关内容。
总结与疑问:
即使听课的时候听懂了,实际操作起来也是麻烦重重,正是“纸上得来终觉浅,绝知此事要躬行”。
我想主要的难点在于:
1 对于基本的数据分析“套路”还不清楚,思路比较混乱,甚至连一开始的思路都没有。
2 对于很多函数以及里面的参数不熟悉,不知道如何设置,不清楚如何使用。
自己磕磕碰碰地按照自己的思路“爬了一遍”,其中也出现了很多问题,大部分都通过Google,Rstudio中的帮助,以及自检解决了。有一点心得:处理数据时,少新造一些变量名,自己容易搞混,之后还会忘了使用。
还有一些疑问,记录下来:
1 rtools是干什么的,Google了一下并没有找到满意的答案?
2 我自己把excel表格中的某个数改为NA或者直接删掉,但是却无法用函数is.na()判断出来?
3 as.Date()并不能改变已有的日期字符串的年月日顺序,但是可以把后面的“星期五”给删除了,那么用什么函数可以改变日期的显示格式呢?
4 insatll.packages("stringr")和 insatll.packages('stringr'), 前者不行,后者成功?
5 关闭Rstudio之后,第二天打开,代码中的中文变成了乱码?
6 tapply() ,format() ,as.data.frame.table()用法不清楚?