热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

(一)如何将导入的excel数据进行预处理实战:朝阳医院2016年销售数据收到了业务指标:(1)。月均消费次数(2)。月均消费金额(3)。客单价(4)。消费趋势打开excel数据,

(一)如何将导入的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语言实战之简单的数据处理(实践)》

&#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)

《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)之后,数据框是&#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)

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

我们可以看到之前总共有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

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

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

补充:

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

《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)

推荐阅读
  • 本教程详细介绍了如何使用 TensorFlow 2.0 构建和训练多层感知机(MLP)网络,涵盖回归和分类任务。通过具体示例和代码实现,帮助初学者快速掌握 TensorFlow 的核心概念和操作。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 本文介绍了如何利用Python进行批量图片尺寸调整,包括放大和等比例缩放。文中提供了详细的代码示例,并解释了每个步骤的具体实现方法。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • Java 实现二维极点算法
    本文介绍了一种使用 Java 编程语言实现的二维极点算法。该算法用于从一组二维坐标中筛选出极点,适用于需要处理几何图形和空间数据的应用场景。文章不仅详细解释了算法的工作原理,还提供了完整的代码示例。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • Python实现斐波那契数列的方法与优化
    本文详细介绍了如何在Python中编写斐波那契数列,并探讨了不同的实现方法及其性能优化。通过递归、迭代和公式法,读者可以了解每种方法的优缺点,并选择最适合自己的实现方式。 ... [详细]
  • 二维几何变换矩阵解析
    本文详细介绍了二维平面上的三种常见几何变换:平移、缩放和旋转。通过引入齐次坐标系,使得这些变换可以通过统一的矩阵乘法实现,从而简化了计算过程。文中不仅提供了理论推导,还附有Python代码示例,帮助读者更好地理解这些概念。 ... [详细]
  • 社交网络中的级联行为 ... [详细]
  • 基于Node.js、Express、MongoDB和Socket.io的实时聊天应用开发
    本文详细介绍了使用Node.js、Express、MongoDB和Socket.io构建的实时聊天应用程序。涵盖项目结构、技术栈选择及关键依赖项的配置。 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • 本文介绍如何利用栈数据结构在C++中判断字符串中的括号是否匹配。通过顺序栈和链栈两种方式实现,并详细解释了算法的核心思想和具体实现步骤。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
author-avatar
荡平三界_713
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有