一、本关目标
对“朝阳医院2016年销售数据.xlsx"中的数据进行处理和分析,并完成4个指标:1.月均消费次数;2.月均消费金额;3.客单价;4.消费趋势。
二、数据清洗
1、读取文件
# 将Excel数据变为csv格式后导入
exceldata<-read.table(file.choose(),header = TRUE,
sep=",",stringsAsFactors = FALSE)
2、列重命名
# 对列名进行重命名,可使用names()函数或者交互式编辑器fix()
names(exceldata) <- c("time","cardno","drugID","drugName",
"saleNumber","virtualmoney","actualmoney")
3、处理缺失值
exceldata<- exceldata[!is.na(exceldata$time),]
# na.omit()删除所有含缺失数据的行,适用于只有少数缺失值或缺失值集中在一小部分观测中
4、处理日期值
# 用stringr包中的字符串匹配函数:str_split_fixed()
library(stringr)
timesplit <- str_split_fixed(exceldata$time," ",n=2)
exceldata$time <- timesplit[,1]
str_split () 与str_split_fixed ():字符串分割函数
str_split(string, pattern, n = Inf, simplify = FALSE)
str_split_fixed(string, pattern, n)
参数列表:
string: 字符串,字符串向量。
pattern: 匹配的字符
n: 分割个数(最后一组不会被分割)。
- str_split()与str_split_fixed()的区别在于前者返回列表格式,后者返回矩阵格式。
- 当str_split()中simplify = TRUE时,返回矩阵格式。
5、类型转换
为了指标的计算,需要将数据进行类型转换:
# 购药时间
exceldata$time <- as.Date(exceldata$time,"%Y-%m-%d")
# 销售数量
exceldata$saleNumber <- as.numeric(exceldata$saleNumber)
# 应收金额
exceldata$virtualmoney <- as.numeric(exceldata$virtualmoney)
# 实收金额
exceldata$actualmoney <- as.numeric(exceldata$actualmoney)
6、数据排序
# 按照购药时间对数据进行升序排列
exceldata <- exceldata[order(exceldata$time,decreasing = FALSE),]
# order()默认decreasing = FALSE,升序排列
三、指标计算
1、月均销费次数=总消费次数(去重)/月份数
# 总消费次数(去重):5398
kpi1 <- exceldata[!duplicated(exceldata[,c(1,2)],fromLast = FALSE ),]
consumeNumber <- nrow(kpi1)
# duplicated()默认fromLast=FALSE,即若样本点重复出现,则取首次出现的;去掉重复样本值之后的行名
数据去重参考: http://blog.csdn.net/qq_35242986/article/details/68927909
# 月份数:6
starttime <- kpi1$time[1]
endtime <- kpi1$time[nrow(kpi1)]
days <- endtime-starttime
months <- as.numeric(days)%/%30
# days为日期值,不能直接用除法,需要转换类型
得到月均消费次数:899
# 月均消费次数
monthconsume <- consumeNumber/months
2、月均销费金额=总消费金额/月份数
# 总消费金额:304630.3
totalmoney <- sum(exceldata$actualmoney,na.rm = TRUE)
得到月份消费金额:50771.71
monthmoney <- round(totalmoney/months,2)
3、客单价=总消费金额/总消费次数(去重)
# 客单价:56.43
pct <- totalmoney/consumeNumber
4、消费趋势
# 使用分组计算函数tapply(),以周的形式对实收金额进行分组计算
week <- tapply(exceldata$actualmoney,
format(as.Date(exceldata$time),"%Y-%W"),sum)
%W从周一到周日计算,%U从周一到周六计算,貌似%W更符合中国人的统计习惯。
关于更多日期格式,请参考:https://www.douban.com/note/347509632/
# 把数组形式的week转换成数据框形式
week <- as.data.frame.table(week)
# 对数据框week的观测进行重命名
names(week) <- c("time","actualmoney")
# 转换变量类型
week$time <- as.character(week$time)
# 在week数据框中增加一列变量
week$timenumber <- c(1:nrow(week))
# 绘制图表
plot(week$timenumber,week$actualmoney,
xlab = "时间(年份-第几周)",
ylab = "消费金额",
xaxt = "n",
main = "2016年朝阳医院消费曲线",
col = "blue",
type ="b")
axis(1,at=week$timenumber,labels = week$time,cex.axis=1.5)
# 去除x轴上的刻度线
# cex.axis 坐标轴刻度文字的缩放倍数
R语言plot函数参数合集:http://www.cnblogs.com/wutongyuhou/p/5873056.html
四、问题
1 、对于基本的数据分析“套路”还不清楚,只是跟着操作。
2、 对于很多函数以及里面的参数设置不熟悉,不清楚如何使用。
跟着老师的操作进行了练习,其中出现了很多问题,大部分都能够自己解决。为了更清晰的理解和记忆,还需要找一些数据试着操作一下,发现问题,解决问题,才是学习的最佳途径。