目标:对给定的Excel数据表里的数据进行简单处理,解答相关问题。
源数据:朝阳医院2016年销售数据.xlsx
问题:根据表格数据得出
1.月均消费次数(注:同一天内,同一个人发生的所有消费算作一次消费 月消费次数=总消费次数/月数)
2.月均消费金额(注:同一天内,同一个人发生的所有消费算作一次消费 月消费金额=总消费金额/月数)
3.客单价(客单价=总消费金额/总消费次数)
4.消费趋势(周-消费金额曲线)
R的解决方案:
Step1:读取源数据
在RStudio中,可以采用多种方法导入源数据,在导入过程中,最值得注意的是“如何正确输入源数据路径”这一问题。我在具体实践中发现,由于原数据文件的命名为中文模式“朝阳医院2016年销售数据”,导入时系统总提示路径过长,于是将其重命名为长度较短的英文名称,例如“data”。果然顺利导入:
脚本中输入
Sell_data <- read_excel("C:/Users/Administrator/Desktop/data.xlsx")
View(Sell_data)
显示:
没有乱码,显示正常。
Step 2:数据预处理
数据预处理是一个重要的步骤,原始数据经过预处理(列名重命名、缺失数据剔除、日期处理、数据类型转换以及数据排序)才能更为有效地进行数据分析工作。
列名重命名 首先,为了编码的正常进行,对中文模式的项目名称进行英文重命名,即将表中的“购药时间、社保卡号、商品编码、商品名称、销售数量、应收金额以及实收金额”重命名为“"Time"、"Cardno"、DrugID"、"DrugName"、"SaleNumber"、"Virtualmoney"以及"Actualmoney"。
脚本编码如下:
#rename
names(Sell_data) <- c("Time","Cardno",
"DrugID","DrugName",
"SaleNumber","Virtualmoney",
"Actualmoney")
如图所示,命名成功:
缺失数据剔除 在药物销售表格中,最常见的缺失数据na(Not Available,不可用)是购药时间,合理运用逻辑运算符以及缺失数据函数na.omint()就可以删除所有含有缺失数据的行。
这里,我们选用“!”这一逻辑运算符,表示“非”的意思。再配合相应缺失值语句,写入脚本:
#删除缺失数据
Sell_data <- Sell_data[!is.na(Sell_data$Time),]
如图,6579行缺失数据被剔除成功
日期处理在“Time”项下,我们发现日期是以字符串的形式出现的(日期+星期),为了便于数据分析,需要将字符串拆分为相应的单列字符,这就需要R语言字符串处理包Stringr来帮忙。
输入脚本
#step3:处理日期
TimeSplit <- str_split_fixed(Sell_data$Time, " ",2)
Sell_data$Time <-TimeSplit[,1]
结果显示
这说明字符串处理包Stringr并未导入,此时,我尝试点击右下角目录框中R语言字符串处理包Stringr,
再运行,结果正常:
Time里的字符串被成功分成两列字符。
数据类型转换由于运算的需要,需将Time中的字符型向量由“character”转换为日期型Date"格式。
脚本输入:
#字符串转换为日期格式
Sell_data$Time <- as.Date(Sell_data$Time,
"%Y-%m-%d")
class(Sell_data$Time)
结果为:
同样地,像销售数量、应收金额以及实收金额("SaleNumber"、"Virtualmoney"以及"Actualmoney")这些数据也都可以转换为数值类型:
脚本输入:
#step4:数据类型转换
#销售数量
Sell_data$SaleNumber <- as.numeric(Sell_data$SaleNumber)
#应收金额(打折前的金额)
Sell_data$Virtualmoney <- as.numeric(Sell_data$Virtualmoney)
#实收金额(打折后的金额)
Sell_data$Actualmoney <- as.numeric(Sell_data$Actualmoney)
#查看类型
class(Sell_data$SaleNumber)
结果为:
转换成功!
数据排序最后,对销售数据按照时间升序进行排列
运行脚本后,结果如下:
排序没毛病~
总结:经过列名重命名、缺失数据剔除、日期处理、数据类型转换以及数据排序等五个步骤,数据处理完毕。
Step3:数据分析
有了符合要求的数据,才可以正常进行数据分析这个步骤。本次需要解答的问题是:
根据表格数据得出:
1.月均消费次数(注:同一天内,同一个人发生的所有消费算作一次消费 ;月消费次数=总消费次数/月数)
2.月均消费金额(注:同一天内,同一个人发生的所有消费算作一次消费; 月消费金额=总消费金额/月数)
3.客单价(客单价=总消费金额/总消费次数)
4.消费趋势(周-消费金额曲线)
答一:
思路:
根据公式:月消费次数=总消费次数/月数,所以只要获取总消费次数和月数即可。由于同一天内,同一个人发生的所有消费算作一次消费,所以得剔除其本人当天超过一次的消费记录。月数则根据30天为1个月进行粗略计算。
脚本:
# 业务指标1:月均消费次数
#-------------------------------------------------------
kpi1 <- Sell_data[!duplicated( Sell_data[,c("Time","Cardno")]),]#采用逻辑符号“!”以及"duplicated()"语句就能筛选出非重复的消费次数。
ConsumeNumber <- nrow(kpi1) #总消费次数相当于行数
运行得:
可得总消费次数为5394;
接着运行脚本,得出月数:
#月数根据时间范围计算
#最小的时间值
StartTime <- kpi1$Time[1]
#最大的时间值
EndTime <- kpi1$Time[nrow(kpi1)]
#天数
Day <- as.numeric(EndTime -StartTime)
#月数
Month <- Day %/% 30 #整除法得出月数为6
#月均消费次数
MonthConsume <- ConsumeNumber / Month
MonthConsume <- format(round(MonthConsume, 2), nsmall = 2)
最后得出月均消费次数为899次/月。
答二:
思路:
根据公式:月消费金额=总消费金额/月数,所以只要获取总消费金额和月数即可。本次计算中,总消费金额是实际消费金额的总和,月数则根据上次计算的6个月计算即可。
脚本:
TotalMoney <- sum(Sell_data$Actualmoney,na.rm=TRUE)#采用函数sum求和,并用na.rm剔除缺失值,最终为只对有效值进行求和。
MonthMoney <- TotalMoney / Month
最终求得月消费金额为50776.38元。
答三:
思路:根据公式,客单价=总消费金额/总消费次数
脚本:
# 业务指标3:客单价pct(per customer transaction)
pct <- TotalMoney / ConsumeNumber
pct <- format(round(pct, 2), nsmall = 2)#保留小数点后两位
结果得:
最终求得,客单价为56.48元/次
答四:
思路:绘制消费趋势曲线,可以以周为时间横轴,周累计消费金额为纵轴,绘制折线图的方式得出周-消费金额曲线。
脚本:
# 业务指标4:消费曲线图
#-------------------------------------------------------
week <- tapply(Sell_data$Actualmoney, format(Sell_data$Time, "%Y-%U"), sum)#据说利用tapply()函数进行数组分类,sum()函数分别求和。
week <- as.data.frame.table(week)
names(week) <- c("Time","Actualmoney")
week$Time <- as.character(week$Time)
week$TimeNumber <- c(1:nrow(week))
plot(week$TimeNumber, week$Actualmoney,
xlab="时间(第几周)",
ylab="消费总金额",
xaxt = "n",
main= "2016年朝阳医院消费趋势",
col="red",
type="b")
axis(1.5,at=week$timeNumber, labels=week$time, cex.axis = 1.5)
!!!目前对于tapply()函数进行数组分类,sum()函数分别求和这串神奇的组合表示有点懵!!!是不是先由format(时间,“%Y-%U”)这个函数把时间按周排序,然后再采用sum()求和,最后以分组的形式呈现????
这个得自己去查询了!!!
最后画出了消费趋势图:
从图中,就可以轻松得知2016年朝阳医院每周的消费总额以及消费高低等信息,从而获取消费趋势。
总结:
本次通过导入源数据、数据预处理以及数据分析三个步骤,解决了4个实际问题。从一张2016年朝阳医院药房销售数据excel表格,得出月均消费次数(899次/月)、月均消费金额(50776.38元/月)、客单价(56.48元/次)、消费趋势图。这几个数据可以大致反应2016年朝阳医院药房每月的消费人数、消费金额、人均消费水平,还可以分析药品销售的淡季旺季。同理,这种数据分析方式可应用到其它商品当中。
本次数据分析为较为基础的excel数据处理分析,具体应用到的语句、函数、运算符如下:
网友评论
问题:Error in `[.data.frame`(datatest, , c("time", "Cardno")) :
undefined columns selected
请问作者,这个要怎样处理。感谢