(一)如何将导入的excel数据进行预处理实战:朝阳医院2016年销售数据收到了业务指标:(1)。月均消费次数(2)。月均消费金额(3)。客单价(4)。消费趋势打开excel数据,
(一)如何将导入的excel数据进行预处理
实战:
朝阳医院2016年销售数据
收到了业务指标:
(1)。月均消费次数
(2)。月均消费金额
(3)。客单价
(4)。消费趋势
打开excel数据,了解数据的特点,如观察有几个字段。
如何在R语言中分析出这些业务指标?
将excel数据读取到R的数据框中,最常用的就是工具包 XLConnect 和openxlsx
Import a big xlsx file into R? (XLConnect & openxlsx)
> install.packages("openxlsx")
> library(openxlsx)
> readFilePath<-"F:\朝阳医院2016年销售数据.xlsx"
Error: '\? is an unrecognized escape in character string starting ""F:\?
> readFilePath<-"F:/朝阳医院2016年销售数据.xlsx"
> excelData<-read.xlsx(readFilePath,"sheet1")
Error in read.xlsx.default(readFilePath, "sheet1") :
Cannot find sheet named "sheet1"
> excelData<-read.xlsx(readFilePath,"Sheet1")
注意上面的导入时候报错了,原因是我把Sheet1的首字母小写了,与excel的第一个表名不符。
在数据分析师的工作过程中,有多达60%的时间,都花在了数据分析前的数据准备过程中。
比如:处理缺失的数据,改变列名,处理时间格式的等等。
数据处理将数据处理了成我们后期预期的样子,以便我们后期处理。
1。由于各种原因而导致数据不完整
- R中,缺失值以符号NA(Not Available,不可用)表示。
- na.omit()删除所有含有缺失数据的行
- 函数is.na()允许你检测缺失值是否存在。
excelData<-excelData[!is.na(excelData$time),]
这一条代码,我们删除了time列的缺失值。
代码中将下标留空(,)表示默认选择所有列。
十个逻辑运算符
<小于
<= 小于或等于
> 大于
>= 大于或等于
== 严格等于
!= 不等于
!x 非x
x|y x或y
x&y x和y
isTRUE(x) 测试x是否为TRUE
我们将列名重命名。
&#8220;time&#8221;, &#8220;cardno&#8221;, &#8220;drugId&#8221;, &#8220;drugName&#8221;, &#8220;saleNumber&#8221;, &#8220;virtualmoney&#8221;, &#8220;actualmoney&#8221;
代码如下:
> names(excelData)<-c("time","cardno","drugId","drugName","saleNumber","virtualmoney","actualmoney")
>view(excelDate)
2。如何处理日期格式的数据
可以使用R语言中字符串处理包stringr
我们安装这个包
> install.packages("stringr")
> library(stringr)
> timeSplit<- str_split_fixed(excelData$time, " ",n=2) #将字符串拆分成我们想要的两列
> excelData$time<-timeSplit[,1] #将拆分的两列重新赋值给excelData
> excelData$time
[1] "2016-01-01 星期五" "2016-01-03 星期日" "2016-01-06 星期三" "2016-01-11 星期一"
[5] "2016-01-15 星期五" "2016-01-20 星期三" "2016-01-31 星期日" "2016-02-17 星期三"
class函数用于查看某一列数据是什么格式。
> class(excelData$time)
[1] "character"
> excelData$time<-as.Date(excelData$time,"%Y-%m-%d")
> class(excelData$time)
[1] "Date"
> excelData$time
[1] "2016-01-01" "2016-01-03" "2016-01-06" "2016-01-11" "2016-01-15" "2016-01-20"
[7] "2016-01-31" "2016-02-17" "2016-02-22" "2016-02-24" "2016-03-05" "2016-03-05"
我们看到class(excelData$time)之后,数据框是&#8221;character&#8221;格式,我们需要日期格式,那么我们来转化格式。转化后,我们看到变为了日期格式。
3。类型转换
记住一些类型转换函数。
is.numeric() 和 as.numeric()
is用于判断数据属于哪种类型,对于处理复杂的业务逻辑,例如销售金额,判断是否为数值。
as用于各个类型值直接的转换,转换成你想要的类型。
> excelData$saleNumber<-as.numeric(excelData$saleNumber)
> excelData$virtualmoney<-as.numeric(excelData$virtualmoney)
> excelData$actualmoney<-as.numeric(excelData$actualmoney)
excelData$saleNumber
[1] 1 1 1 1 2 1 1 1 2 1 2 1 1 5 6 2 2 5 6 1 6 6 1 6 1 2 6
[28] 2 6 6 5 2 1 1 1 2 1 1 1 1 1 1 1 1 1 6 1 1 1 1 1 1 2 1
我们使用as.numberc从销售数据里的字符串转换为数值类型。
4。数据排序
数据排序我们使用order()函数。
#按照销售时间对数据进行降序排列,看看一天内卖了哪些药物
> excelData<-excelData[order(excelData$time,decreasing = FALSE),]
我们的预处理需要5步,就可以完成大部分的预处理工作
step1.列名重命令;step2.删除缺失数据;step3.处理日期;step4.数据类型转换;step5.数据排序
(三)分析给出的业务指标
1。业务指标1:
约消费次数=总消费次数/月份数 (同一天内,同一个人发生的所有的消费算作一次消费)
duplicated()函数是从数据框中选出重复的数据。我们的需求是将重复的数据选出了删除,所以我们用了逻辑运算符!来去掉多余的数据。
我们用nrow获取多少条数据。
> kpi1<-excelData[!duplicated(excelData[,c("time","cardno")]),]
> consumeNumber<-nrow(kpi1)
> consumeNumber
[1] 5395
>veiw(kpi1)
我们可以看到之前总共有6437行的。现在去重后,变成了5395行。
[ reached getOption(&#8220;max.print&#8221;) &#8212; omitted 6437 rows ]
我们还需要求一个月份数,我们来获取时间范围:
> startTime<- kpi1$time[1] #最小的时间值
> endTime<- kpi1$time[nrow(kpi1)] #最大的时间值
> day<-endTime-startTime
> month <- as.numeric(day) %/% 30
> monthConsume<-consumeNumber/month
> monthConsume #月均消费次数
[1] 899
%/% 整数除法 :如果有余数,我们就将余数去掉,保留整数部分。
补充:
7个算术运算符
+ 加 &#8211; 减 * 乘 /除 ^或** 求幂
%/% 求余(x mod y) x%/%y 整数除法 如:5%/%2=2
2。业务指标2 :
月均消费金额=总消费金额/月份数
月均消费金额为 实收金额(actualmoney)
> totalMoney<-sum(excelData$actualmoney,na.rm = TRUE) #sum函数表示求和
> monthMoney<-totalMoney/month
> monthMoney
[1] 50776.38
na.rm表示移除缺失值 ,na代表缺失值,rm代表remove
在计算的时候,只计算有值的数据。
最终的月均消费金额为50776.38元
3。业务指标3:
客单价=总消费金额/总消费次数
客单价是指门店每一个顾客平均购买商品的金额,也就是平均交易金额。
> pct<-totalMoney/consumeNumber
> pct
[1] 56.48095
客单价为56.48元。(提高客单价,可以提高销售额)
4。业务指标4:消费趋势
我们可以画图,确立横坐标为周数,纵坐标为销售金额。
计算每周的销售金额。我们使用分组函数tapply()
当数据框需要按照其中的某一列来分组的时候,在组内对数据需要用指定的函数来运算。
#按销售时间来分组。将属于一周的销售时间归为一组,用sum函数
week<- tapply(excelData$actualmoney,format(excelData$time,"%Y-%U"),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()函数
plot(week$timeNumber,week$actualmoney,
xlab="时间(年份-第几周)", #x轴的标签
ylab="消费金额", #y轴的标签
xaxt="n", #禁用x轴
main="2016年朝阳医院消费曲线", #确定标题
col="blue", #绘图颜色为蓝色
type="b") #绘制对x,y轴的图形
axis(1,at=week$timeNumber,labels = week$time,cex.axis=1.5) #axis()用来绘制坐标轴
总结:
1.数据预处理总结:
(1)列名重命名;(2)删除缺失数据;(3)处理日期;(4)数据类型转换(5)数据排序
下面给出第三讲,简单数据处理,所有代码汇总:
library(openxlsx)
#导入excel数据
readFilePath<-"F:/朝阳医院2016年销售数据.xlsx"
excelData<-read.xlsx(readFilePath,"Sheet1")
#删除缺失数据
excelData<-excelData[!is.na(excelData$time),]
#列名重命名
names(excelData)<-c("time","cardno","drugId","drugName","saleNumber","virtualmoney","actualmoney")
library(stringr)
timeSplit<- str_split_fixed(excelData$time, " ",n=2)
excelData$time<-timeSplit[,1]
#处理日期
class(excelData$time)
excelData$time<-as.Date(excelData$time,"%Y-%m-%d")
class(excelData$time)
#数据类型转换
excelData$saleNumber<-as.numeric(excelData$saleNumber)
excelData$virtualmoney<-as.numeric(excelData$virtualmoney)
excelData$actualmoney<-as.numeric(excelData$actualmoney)
#对数据进行降序排列
excelData<-excelData[order(excelData$time,decreasing = FALSE),]
#计算月均消费次数
kpi1<-excelData[!duplicated(excelData[,c("time","cardno")]),]
consumeNumber<-nrow(kpi1)
consumeNumber
startTime<- kpi1$time[1]
endTime<- kpi1$time[nrow(kpi1)]
day<-endTime-startTime
month <- as.numeric(day) %/% 30
monthConsume<-consumeNumber/month
monthConsume
#计算月均消费金额
totalMoney<-sum(excelData$actualmoney,na.rm = TRUE)
monthMoney<-totalMoney/month
monthMoney
#计算客单价
pct<-totalMoney/consumeNumber
pct
#绘图看消费趋势
week<- tapply(excelData$actualmoney,format(excelData$time,"%Y-%U"),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="blue",
type="b")
axis(1,at=week$timeNumber,labels = week$time,cex.axis=1.5)