简单数据分析和处理实践(R语言)

本次实践方案:通过分析朝阳医院2016年销售数据,并通过R语言的处理,最终输出朝阳医院“月均消费次数”、“月均消费金额”、“客单价”、“消费趋势”等结果和可视化图形。

第一步、读取数据

导入 Excel 数据。使用函数read.xlsx() 导入一个工作表到一个数据框中。一般格式为 read.xlsx(file, n)。具体代码如下:

library(xlsx)
readFilepPath<-"E:/猴子大数据分析课程/朝阳医院2016年销售数据.xlsx"
excelData<-read.xlsx(readFilepPath,"Sheet1",encoding="UTF-8")
excelData

又或者

library(openxlsx)
readFilepPath<-"E:/猴子大数据分析课程/朝阳医院2016年销售数据.xlsx"
excelData<-read.xlsx(readFilepPath,"Sheet1")
excelData

注意事项:一是确保安装了最新的java,并且进行了必要的配置。

[win10环境下如何配置java环境变量]( http://jingyan.baidu.com/article/02027811629b941bcc9ce521.html

二是确保已经安装了“xlsx”包或者“openxlsx”包。使用第一种方式时,若是没有encoding="UTF-8"可能会出现乱码。"Sheet1"也可以用1代替。
三是确保读取路径的正确,并且是使用正斜杠“/”,而不是反斜杠“\”。



第二步,对数据进行预处理

删除所有含有缺失数据的行。
第四章4.5.2中讲到如何在分析中排除缺失值的方法。使用na.omit()函数可以删除所有含有缺失数据的行。本例采用的是!is.na来进行保留未缺失数据的行。代码如下:

excelData<-excelData[!is.na(excelData$购药时间),] #保留未缺失时间的数据
excelData #输出结果

逻辑运算符



第三步、进行列名重命名工作

使用fix(excelData)调出交互式编辑器进行修改名称即可。


fix(exceldata)

或者使用names()函数来重命名变量。

names(excelData)<-c("time","carNo","drugID","drugName","saleNmuber",
"virtualMoney","actualMoney") #对原数据标题行进行重命名
excelData #输出重命名后的数据

重命名后



第四步、处理日期列

  • 1.目的是把年月日和星期分开,并删除星期,只保留日期即可,便于进行样本分析。
    采用R语言中的字符串处理包stringr中的str_split_fixed()来实现。
library(stringr)  #载入字符串处理包
timeSplit<-str_split_fixed(excelData$time," ",n=2)  #将time列分成两列日期和星期
excelData$time<-timeSplit[,1]  #time列选取第一列即日期列
excelData   #输出最新的数据
时间的处理分成两列并输出一列
  • 2.然后将time数据从字符类型转换为时间格式数据。
class(excelData$time) #输出对象的类别
is.character(excelData$time) #判断是否为字符型
excelData$time<-as.Date(excelData$time,"%Y-%m-%d")  #转换为日期格式
is.character(excelData$time) #判断是否为字符型
class(excelData$time) #输出对象的类别
excelData$time #输出日期

转换日期格式后的结果





第五步、对saleNumber、virtualMoney、actualMoney进行类型转换。

# 销售数量
excelData$saleNmuber<-as.numeric(excelData$saleNmuber)
# 应收金额
excelData$virtualMoney<-as.numeric(excelData$virtualMoney)
# 实收金额
excelData$actualMoney<-as.numeric(excelData$actualMoney)



第六步、排序
可以使用order()函数对一个数据框进行排序,按照销售时间对数据进行降序排序。

# 按照销售时间降序进行排序
excelData<-excelData[order(excelData$time,decreasing = FALSE),]
excelData
销售时间降序排序

或者这样处理也是可以的

attach(excelData)#excelData作为一个数据框进行处理,先进行绑定
excelData<-excelData[order(excelData$time,decreasing = FALSE),]#按照时间进行降序排列
detach(excelData)#解除绑定
excelData#输出降序排序后的数据



第七步、计算消费次数和月份数
同一天内同一个人发生的所有消费计算为一次消费行为,剔除重复的日期和医保卡号。

#运用逻辑运算符把time、cardNo中重复的次数剔除
kpi1<-excelData[!duplicated(excelData[,c("time","cardNo")]),]
#总消费次数等于列值
consumeNumber<-nrow(kpi1)

duplicated()函数作用是返回重复的元素和向量。

计算出消费的总次数
# 最小的时间值
startTime<-kpi1$time[1]
# 最大的时间值
endTime<-kpi1$time[nrow(kpi1)]
# 天数
day<-endTime-startTime
# 月份数
month<-as.numeric(day)%/%30  #注意的是把day的格式转换为数字格式才可以进行整数除法。
X%/%Y表示X除以Y取整。
month #输出月份数

计算月份数



第八步、数据目标处理

  • 业务指标1
    计算月均消费次数=总消费次数/月份数。

月均消费次数

monthconsume<-consumeNumber/month
monthconsume
[1] 899.6667
monthconsume<-consumeNumber%/%month
monthconsume
[1] 899
class(consumeNumber)
[1] "integer"
class(day)
[1] "difftime"
class(month)
[1] "numeric"


![月均消费次数](http://upload-images.jianshu.io/upload_images/4165809-980322a329ab5548.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- **业务指标2**
月均消费金额=总金额/月均消费次数

totalmoney<-sum(excelData$actualMoney,na.rm = TRUE)
monthmoney<-totalmoney/month
monthmoney
[1] 50771.71
(原结果为50776.38),尝试了两次结果都不对,还是要仔细仔细,少了28元。

- **业务指标3**
客单价=总消费金额/总消费次数,直接计算就可

pct<-totalmoney / consumeNumber
pct
[1] 56.43391

- **业务指标4**
消费趋势,计算每周消费金额。用到**tapply()**函数。
>tapply(X, INDEX, FUN = NULL, ...,),其中X一般为向量,INDEX为一个或多个因子的列表,每个因子的长度与X相同,FUN = NULL表示tapply返回一个向量,simplify = TRUE表示如果FUN总是返回一个标量,tapply返回一个具有标量模式的数组。

计算每周的消费金额

weekconsume<-tapply(excelData$actualMoney,format(excelData$time,"%Y-%U"),sum)

选择数据中的actualMoney列。其次用format()函数指定日期的格式(年-周数),

最后sum()函数进行求和。最后tapply返回一个数组。

weekconsume
2016-00 2016-01 2016-02 2016-03 2016-04 2016-05 2016-06 2016-07 2016-08
1972.80 9679.64 10979.01 8719.73 15662.30 18758.82 3665.70 8441.51 8453.57
2016-09 2016-10 2016-11 2016-12 2016-13 2016-14 2016-15 2016-16 2016-17
9988.98 8500.78 9869.16 10135.23 8426.46 11400.66 14408.21 10385.33 10265.98
2016-18 2016-19 2016-20 2016-21 2016-22 2016-23 2016-24 2016-25 2016-26
9496.06 9728.40 11794.11 11497.20 9530.38 10806.71 11877.43 14077.38 10894.90
2016-27 2016-28 2016-29
8386.97 13372.67 3454.18


![每周消费金额](http://upload-images.jianshu.io/upload_images/4165809-0b60b3c4acc5fbdd.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

上文中%U是用十进制表示一年当中的周数(week of the year as decimal number),using the first Sunday as day 1 of week 1。使用规则是用第一个星期天作为第一周的第一天(00-53)。感谢**小熊猫**的数据分析学习笔记。

<br>
**第九步、结果的输出和展示**
使用plot()函数进行绘图。

将数据存储到数据框中

weekconsume<-as.data.frame.table(weekconsume)
weekconsume
Var1 Freq
1 2016-00 1972.80
2 2016-01 9679.64
3 2016-02 10979.01
4 2016-03 8719.73
5 2016-04 15662.30
6 2016-05 18758.82
7 2016-06 3665.70
8 2016-07 8441.51
9 2016-08 8453.57
10 2016-09 9988.98
11 2016-10 8500.78
12 2016-11 9869.16
13 2016-12 10135.23
14 2016-13 8426.46
15 2016-14 11400.66
16 2016-15 14408.21
17 2016-16 10385.33
......

进行重命名

names(weekconsume)<-c("time","actualmoney")
weekconsume
time actualmoney
1 2016-00 1972.80
2 2016-01 9679.64
3 2016-02 10979.01
4 2016-03 8719.73
5 2016-04 15662.30
6 2016-05 18758.82
7 2016-06 3665.70
8 2016-07 8441.51
9 2016-08 8453.57
10 2016-09 9988.98
......

转换为字符型

weekconsume$time<-as.character(weekconsume$time)
class(weekconsume$time)

计算时间个数

weekconsume$timenumber<-c(1:nrow(weekconsume))
weekconsume$timenumber

绘制图形

plot(weekconsume$timenumber,weekconsume$actualmoney,
xlab ="时间(年份-第几周)",
ylab ="消费金额",
xaxt="n",
main="2016年朝阳医院消费曲线",
col="blue",
type="b")

定义坐标轴显示

axis(1,at=weekconsume$timenumber,labels = weekconsume$time,cex.axis=1.5)

 
![2016年朝阳医院消费曲线](http://upload-images.jianshu.io/upload_images/4165809-7588d055e16b5451.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)




<br>
####总结一下
通过学习R语言实战前四章,结合猴子的课程第三讲,并参考部分学员笔记,完成了整个分析的过程。**读取数据、数据预处理、数据的分析和数据结果输出和展示**。其中用到了xlsx/openxlsx(两个会相互影响),is.na(),stringr,order(),duplicated(),class()和plot()函数等,进行了数据重命名、拆分、数据格式转换、排序,以及求和、绘图显示等操作,过程中多处出现错误和不理解,经过多次的反复回头看,但依然存在不明白的地方,需要进一步的去学习和实践。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容

  • 目标:对给定的Excel数据表里的数据进行简单处理,解答相关问题。 源数据:朝阳医院2016年销售数据.xlsx ...
    胡阿白阅读 890评论 3 3
  • 实践目的:用R语言对数据进行简单处理操作,包括处理缺失数据,数据类型转换等,以及根据源数据作出对应的消费趋势图。 ...
    希日晞阅读 826评论 1 1
  • 你的泪珠成了我的夜空中不灭的繁星
    空心人乙阅读 108评论 0 0
  • 通常人们把一个做了一丁点坏事的好人归为坏人 人们热爱你的软脾气 却不屑走进你 你只是在做你自己而已 生活中 太多现...
    那难得阅读 211评论 0 0
  • 人的生命只有一次,生命对每一个人来说,生命都是珍贵无比的重要!生命是什么?他不是一场雨,也不是一棵小草。生命是...
    徐雨恒阅读 207评论 0 0