数据分析利器之dplyr、ggplot2包



前言

正如前文提到的,数据分析有一半以上的时间会花在对原始数据的整理及变换上,包括选取特定的分析变量、汇总并筛选满足条件的数据、排序、加工处理原始变量并生成新的变量、以及分组汇总数据等等。这一点,我想大部分使用EXCEL的童鞋都深有体会,写论文时,这么多的数据进行处理,手动汇总、筛选、变换,工作量实在是太大。而本文介绍的dplyr包简直就是Hadley Wickham (ggplot2包的作者,被称作“一个改变R的人”)大神为我们提供的“数据再加工”神器啊。

正文

本文试图通过一个案例,对神奇的dplyr包的一些常用功能做简要介绍。在此抛砖引玉,欢迎广大盆友拍砖。先放上实践课的一个问题:航行距离与到达延误时间有什么关系?? 带着这个问题,我们将首先使用dplyr包对给出的航班数据进行处理。

1.dplyr包的安装加载与示例数据准备

1.1 安装dplyr包

脚本输入代码:

install.packages("dplyr") #加载dplyr包

library(dplyr)

1.2安装 nycflights13包,该软件包中的飞机航班数据将用于本文中dplyr包相关函数的演示。

脚本输入代码:

install.packages("nyclights13") #加载nyclights13

library(nyclights13)

flights #查看数据表

dim(flights) #查看变量的维数

输出结果如下:

如图可知,nycflights13是一个data.frame类型的对象,包含336776条数据记录、19个变量。

在处理数据之前,让我们再来回顾一下数据处理的一般步骤:

选择子集、列名重命名、删除缺失数据、处理日期、数据类型转换、数据排序

接下来,就可以进行数据处理了:

2.数据处理

2.1 选择子集

所谓选择子集,就是选择出能够实现分析目标的变量,本次数据分析的目标是得出航行距离与延误时间的关系,因此,相应的子集就是以下几个字段:

year 航班日期-年

month 航班日期-月

day 航班日期-月

dep_delay 起飞延迟时间(分)

arr_delay 到达延迟时间(分)

distance 航行里程(英里)

dest 目的地

为此,我们首先使用dpylr包里的select函数,进行变量筛选:

脚本输入代码:

myFlights <- select(flights, year,month, day,dep_delay,arr_delay,distance,dest) #筛选变量列

myFlights #查看数据表

如图,子集选择完毕。

2.2 列名重命名

为了让列名简单易懂,可以使用rename函数,进行列名重命名。

脚本输入代码:

myFlights <- rename(myFlights, destination = dest)

myFlights

重命名完毕。

2.3 删除缺失数据

我们采用dplyr包中的filter()函数,进行缺失数据的删除。脚本输入代码:

myFlights <- filter(myFlights,!is.na(dep_delay),!is.na(arr_delay))

myFlights

由图可知,我们首先采用is.na()函数找出缺失值,再采用逻辑运算符“!X”将限定有效数据,最后用filter()函数“过滤”得到有效数据,成功地删除了缺失数据(由原先的336,776个数据变为327,346个数据)。

2.4 数据排序

为了数据的整齐性,我们可以选择相应的变量进行排序。这里要穿插一个排序函数arrange(),默认情况下,为升序排列,也可以对列名加desc()进行降序排序。脚本输入代码:

myFlights <- arrange(myFlights, desc(arr_delay))

myFlights

如图所示,数据按照变量arr_delay(到达延迟时间(分))进行降序排列。

3.数据计算

数据处理之后,就进入计算分析步骤啦。在这个环节,主要历经三个过程:

数据分组(Split):可以指定目标变量,将数据进行分组。由于本次分析的目标是找出航行距离与到达延误时间的关系,所以我们得根据到达目的地对数据进行分组,从而计算出不同目的地的平行航行距离以及平均延误时间;

应用函数(Apply):对不同组的数据,应用相应函数获取所需统计指标。比如本次不同目的地的平行航行距离以及平均延误时间;

组合结果(Combine):将计算后的统计指标值与第一步当中对应的分组进行组合。

3.1 数据分组

dplyr包里的分组是由group_by()函数实现的,脚本输入代码:

by_dest <- group_by(myFlights, destination)

class(by_dest)

by_dest

由图可知,经分组后,一共有104组数据,即本次分析的目的地有104个。

3.2 应用函数及组合结果

我们使用dplyr包中的summarize()函数,进行数据统计指标的获取及组合。计算出不同目的地的平行航行距离以及平均延误时间。脚本输入代码:

delay_sum <- summarise(by_dest, count = n(),#统计各分组目的地的航班数

dist = mean(distance, na.rm = TRUE),

delay = mean(arr_delay, na.rm = TRUE))

delay_sum <- arrange(delay_sum, desc(count)) #按照航班数降序排列

delay_sum

从上图可得知104个目的地的航班数排序。为了统计的科学合理性,需要对数据量太少的组别进行剔除,即剔除噪音数据,再次使用filter()函数剔除,剔除限度设为count>20。脚本输入代码:

delay_sum <- arrange(delay_sum, desc(count))

delay_sum <- filter(delay_sum , count > 20)

如上图可知,剩余97组数据,即本次参与统计的目的地有97个。

PS.这里穿插一个好用的工具,“管道”,即通过使用操作符把数据集名作为开头, 然后依次对此数据进行多步操作。这种运算符的编写方式使得编程者可以按数据处理时的思路写代码, 一步一步操作不断叠加,在程序上就可以非常清晰的体现数据处理的步骤与背后的逻辑。

通过管道的连接方式,让数据或表达式的传递更高效,使用向右操作符%>%,可以直接把数据传递给下一个函数调用或表达式。(%>%是最常用的一个操作符,就是把左侧准备的数据或表达式,传递给右侧的函数调用或表达式进行运行,可以连续操作就像一个链条一样。)拿上述的代码进行举例,在没用管道之前,代码是这样的:

by_dest <- group_by(myFlights, destination)#按目的地分组

delay_sum <- summarise(by_dest, count = n(),#统计各分组目的地的航班数

dist = mean(distance, na.rm = TRUE),#计算平均航行距离

delay = mean(arr_delay, na.rm = TRUE))#计算平均延误时间

delay_sum <- arrange(delay_sum, desc(count)) #按照航班数降序排列

delay_sum <- filter(delay_sum , count > 20)#剔除噪音数据

delay_sum#显示列表

用了管道“%>%”,代码是这样的:

delay_sum <- myFlights %>% #将右侧航行数据赋值给左侧delay_sum

group_by(destination) %>% #对delay_sum进行分组

summarise( count = n(),

dist = mean(distance, na.rm = TRUE),

delay = mean(arr_delay, na.rm = TRUE)

) %>% #对分组后的delay_sum进行计算统计

filter(count > 20)#对统计结果进行噪音剔除

delay_sum#显示列表

果然简洁了很多!

4.数据显示

所谓一图胜千言啊,在大数据可视化普及的今天更是这样。本次同样使用Hadley Wickham 大神(ggplot2包的作者)贡献的ggplot2包进行绘图。调用ggplot()函数进行绘图,脚本输入代码:

ggplot(data = delay_sum) +

geom_point(mapping = aes(x = dist, y = delay)) +#绘制平均航程(dist)和平均延误时间(delay)的散点图

geom_smooth(mapping = aes(x = dist, y = delay))#拟合一条平滑曲线(注意,连接符号+不可省略)

所得结果如下所示:

由上图,我们就可以初步分析航程和延误时间并非线性关系,至于这种非线性关系该怎么解释,仍需进一步统计调查分析。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容