R语言实战之简单的数据处理(实践)

(一)如何将导入的excel数据进行预处理

实战:

朝阳医院2016年销售数据

收到了业务指标:

(1)。月均消费次数

(2)。月均消费金额

(3)。客单价

(4)。消费趋势

打开excel数据,了解数据的特点,如观察有几个字段。

《R语言实战之简单的数据处理(实践)》
《R语言实战之简单的数据处理(实践)》

如何在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

我们将列名重命名。

《R语言实战之简单的数据处理(实践)》
《R语言实战之简单的数据处理(实践)》

“time”, “cardno”, “drugId”, “drugName”, “saleNumber”, “virtualmoney”, “actualmoney”

代码如下:

> names(excelData)<-c("time","cardno","drugId","drugName","saleNumber","virtualmoney","actualmoney")
>view(excelDate)

《R语言实战之简单的数据处理(实践)》
《R语言实战之简单的数据处理(实践)》

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)之后,数据框是”character”格式,我们需要日期格式,那么我们来转化格式。转化后,我们看到变为了日期格式。

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)

《R语言实战之简单的数据处理(实践)》
《R语言实战之简单的数据处理(实践)》

我们可以看到之前总共有6437行的。现在去重后,变成了5395行。

[ reached getOption(“max.print”) — 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

《R语言实战之简单的数据处理(实践)》
《R语言实战之简单的数据处理(实践)》

%/% 整数除法 :如果有余数,我们就将余数去掉,保留整数部分。

补充:

7个算术运算符

+ 加 – 减 * 乘 /除 ^或** 求幂

%/% 求余(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()用来绘制坐标轴

《R语言实战之简单的数据处理(实践)》
《R语言实战之简单的数据处理(实践)》

总结:

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)
    原文作者:凌岸
    原文地址: https://zhuanlan.zhihu.com/p/25150573
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞