(本科)第18章-数据科学的R语言.pdf
《(本科)第18章-数据科学的R语言.pdf》由会员分享,可在线阅读,更多相关《(本科)第18章-数据科学的R语言.pdf(98页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、(c) 2020,陈强,机器学习及 R 应用,高等教育出版社 1 第第 18 章章 数据科学的数据科学的 R 语言语言 机器学习在数据科学领域也有着广泛的应用。 本章着重介绍在数据科学方面常用的两个超级 R 包,即 tidyverse 与 caret,更为贴近业界的数据科学实践。 18.1 何为数据科学何为数据科学 数据科学(data science)是从数据中发现模式、规律,得到洞见(insight),从而为业界创造商业价值的一套科学方法)。 数据科学的主旨是,从数据中挖掘有用信息,产生新知识(knowledge generation),并为业界创造商业价值。 (c) 2020,陈强,机器学
2、习及 R 应用,高等教育出版社 2 通俗地说, 数据科学就是 “数据科学家” (data scientist)所做的那些事情,即 所 谓 的 “ 数 据 科 学 项 目 ” (data science project) 。 Wickham and Grolemund(2016)对数据科学项目的流程作了总结,参见图 18.1。 图 18.1 数据科学项目的流程 (c) 2020,陈强,机器学习及 R 应用,高等教育出版社 3 (1) 一个典型的数据科学项目始于 “输入” (import)数据到软件, 比如 R。如果没有数据,则巧妇难为无米之炊,无法进行数据科学项目。 (2) 将数据导入软件后,一
3、般需要先进行“数据清理”(data cleaning),使其变得“整洁”(tidy)。需要将数据整理为内部自洽的“一致结构”(consistent structure),通常表现为“矩形数据”(rectangular data),即以行表示个体(观测值),而以列表示变量。 (3) 完成数据清理之后, 一般须进一步对数据进行变换(transform), 包括将变量标准化(standardization),根据原有变量定义新的特征变量,选择原样本的某些子集, 合并数据集, 以及计算统计指标等。 这些变换也称为 “预处理”(pre-processing)。 (c) 2020,陈强,机器学习及 R 应
4、用,高等教育出版社 4 (4) 在数据清理与预处理之后,即可开始从数据中“创造知识”(knowledge generation)的过程,包括“可视化”(visualization)与“建模”(modeling)。 可视化能让你看到数据中意想不到的现象,或提出新问题。 建模则通过数学模型与算法,找到数据之间的内在联系与规律。无论可视化,还是建模,都可加深我们对于数据的理解(understand)。 (5) 数据科学项目的最后一步为 “交流” (communicate), 即向有关领导、部门或用户汇报你的研究结果与发现。 (c) 2020,陈强,机器学习及 R 应用,高等教育出版社 5 围绕以上数
5、据科学项目全过程的则是“编程”(programming)。 从输入数据、数据清理、数据变换,到可视化、建模,乃至交流,都离不开编程。 一个优秀的数据科学家需要具备三方面的知识与技能,即数理知识(例如机器学习)、 编程能力(例如R语言编程)与专业知识(熟悉所在行业业务)。 为便于执行数据科学项目, RStudio 首席科学家 Hadley Wickham 推出了超级 R 包 tidyverse,包含一系列内在自洽的 R 包;并因此获得国际统计学会的 COPSS 奖。 下面,安装并载入 R 包 tidyverse: (c) 2020,陈强,机器学习及 R 应用,高等教育出版社 6 install.
6、packages(tidyverse) library(tidyverse) Attaching packages tidyverse 1.3.0 ggplot2 3.2.1 purrr 0.3.3 tibble 2.1.3 dplyr 0.8.4 tidyr 1.0.2 stringr 1.4.0 readr 1.3.1 forcats 0.4.0 Conflicts tidyverse_conflicts() x dplyr:filter() masks stats:filter() x dplyr:lag() masks stats:lag() (c) 2020,陈强,机器学习及 R 应
7、用,高等教育出版社 7 结果表明, 载入R包tidyverse后, 自动加载了8个R包, 即ggplot2,tibble, tidyr, readr, purrr, dplyr, stringr, 以及 forcats(将在下文介绍其中最重要的几个包)。 结果还显示,R 包 dplyr 中的 filter()函数与 lag()函数分别“掩盖”(mask)了同名的 R 基础函数。 如果你想调用 R 基础函数 filter()或 lag(),则须使用它们的全称stats:filter()或 stats:lag(), 从 R 的基础包 stats 调用这两个函数。 (c) 2020,陈强,机器学习及
8、 R 应用,高等教育出版社 8 18.2 管道算子管道算子 作为函数式语言(functional language),每个 R 命令都是一个函数。 出于编程的需要,经常会使用“复合函数”(composite function),即一个函数套着一个函数,再套一个函数,例如( )f g h x,以此类推。 (c) 2020,陈强,机器学习及 R 应用,高等教育出版社 9 如果复合函数有太多层,则使得 R 代码变得不易阅读,例如: x y y 1 8.43 其中,对向量 x 先取对数,然后开根号,再求正弦,之后求和,最后保留小数点后两位数。 这里使用了多重的复合函数,有很多括号,看得有些眼花缭乱。
9、(c) 2020,陈强,机器学习及 R 应用,高等教育出版社 10 一种解决方法为,引入一些中间环节,例如 x z w y y 1 8.43 以上代码中的“中间对象”(intermediate objects)z 与 w 可能并没有什么意义,而且多用了两行代码。 为此, 可使用管道算子(pipe operator) “%” 来精简代码, 提高可读性。(c) 2020,陈强,机器学习及 R 应用,高等教育出版社 11 管道算子最初来自 R 包 magrittr,也为 R 包 tidyverse 所采用。 只要载入 R 包 tidyverse,就自动加载了管道算子,不必再单独载入R 包 magri
10、ttr。 如果你只需管道算子,而不用 tidyverse,则可用命令“library(magrittr)”载入。 使用管道算子,可将以上代码改为 (c) 2020,陈强,机器学习及 R 应用,高等教育出版社 12 library(tidyverse) x y % log % sqrt % sin % sum % round(2) y 1 8.43 其中,管道算子“%”可读为“然后”(then)。 比如,“x % log” 把 x 作为参数传给函数 log(), 故等价于 log(x)。 管道算子的优势在于, 可将一系列管道连在一起, 构成一个较长的管道。 (c) 2020,陈强,机器学习及 R
11、 应用,高等教育出版社 13 比如, “x % log % sqrt”等价于“sqrt(log(x)” ,以此类推。 在 RStudio 中, 可用快捷键 “Ctrl + Shift + M” 来输入管道算子 “%” 。 管道算子的基本用法可总结如下: (1) “x % f”等价于“f(x)” (2) “x % f(y)”等价于“f(x, y)” (3) “x % f % g”等价于“g(f(x)” (c) 2020,陈强,机器学习及 R 应用,高等教育出版社 14 在以上规则(2)中,如何得到函数 f(y,x)?此时,需要使用“参数占位符”(argument placeholder),例如
12、(4) “x % f(y, .)”等价于“f(y, x)” (5) “x % f(y, z = .)”等价于“f(y, z = x)” 其中, “.”即为参数占位符,用于指示从左边传入的参数 x 在函数 f()中应占据的位置。 (c) 2020,陈强,机器学习及 R 应用,高等教育出版社 15 并非在所有情况下,都应使用管道算子。 如果管道太长(比如超过 10 步),可考虑通过分拆的多个命令来实现,这样更便于纠错(debug)。 如果函数的输入值或输出值较多(multiple inputs or outputs), 则使用管道算子也不方便。 何时使用管道算子,可能是个人编程的风格。 但即使你不
13、用管道算子, 学习它依然有益, 至少可让你看懂别人的代码。 (c) 2020,陈强,机器学习及 R 应用,高等教育出版社 16 18.3 输入数据输入数据 R 包 tidyverse 的 readr 包用于读入数据。 R 语言的基础函数 read.csv()与 read.table()已可读取数据,为何还要 readr? 因为 readr 读取数据的速度比 read.table()能快几倍;而业界数据通常样本容量很大。 以第 11 章曾使用过的葡萄牙银行数据为例。这次使用更为完整的数据集 bank-additional-full.csv,可从本书网站下载,并放入工作路径。 (c) 2020,陈
14、强,机器学习及 R 应用,高等教育出版社 17 首先,以基础函数 read.csv()读入数据,并命名为 bank: bank dim(bank) 1 41188 21 使用函数 system.time()考察运行此命令的时间: system.time(read.csv(bank-additional-full.csv, header = TRUE,sep=;) 用户 系统 流逝 0.43 0.00 0.44 (c) 2020,陈强,机器学习及 R 应用,高等教育出版社 18 下面使用 R 包 readr 的 read_csv()系列函数来读取数据。由于此文件以分号“;”分割,故使用其 rea
15、d_delim()函数: library(tidyverse) bank system.time(read_delim(bank-additional-full.csv, col_names = TRUE,delim = ;) 用户 系统 流逝 0.12 0.00 0.13 (c) 2020,陈强,机器学习及 R 应用,高等教育出版社 19 R 包 readr 除了可提升读取速度,还会输出一种称为“tibble”的特殊数据框: bank # A tibble: 41,188 x 21 age job marital education default housing loan contact
16、month 1 56 hous married basic.4y no no no teleph may 2 57 serv married high.sch unknown no no teleph may 3 37 serv married high.sch no yes no teleph may 4 40 admi married basic.6y no no no teleph may 5 56 serv married high.sch no no yes teleph may 6 45 serv married basic.9y unknown no no teleph may
17、(c) 2020,陈强,机器学习及 R 应用,高等教育出版社 20 7 59 admi married professi no no no teleph may 8 41 blue married unknown unknown no no teleph may 9 24 tech single professi no yes no teleph may 10 25 serv single high.sch no yes no teleph may # with 41,178 more rows, and 12 more variables: day_of_week , # duration
18、, campaign , pdays , previous , # poutcome , emp.var.rate , cons.price.idx , # cons.conf.idx , euribor3m , nr.employed , y tibble 仍是数据框, 与传统 data.frame 的主要区别在于打印结果。 tibble 仅打印前 10 行数据与能在屏幕排下的所有变量。 (c) 2020,陈强,机器学习及 R 应用,高等教育出版社 21 在变量名之下, 还显示每个变量的类型, 比如表示 “double” (即double precision,以双精度表示实数),而表示“ch
19、aracter”(字符型)。 另外,也汇报省略的行数与变量名。 这种排列方式对于大型数据较为方便, 不致于在打印数据时淹没整个屏幕。 如果需要把数据框、矩阵或列表转为 tibble,可使以函数as_tibble()。 R 包 readr 中还有 write_csv()函数,可将数据存为 CSV 文件。 (c) 2020,陈强,机器学习及 R 应用,高等教育出版社 22 如果样本容量特别大(比如大数据),建议使用 R 包 data.table 的fread()函数,进一步提升数据读取速度: install.packages(data.table) library(data.table) syst
20、em.time(fread(bank-additional-full.csv) 用户 系统 流逝 0.01 0.00 0.02 (c) 2020,陈强,机器学习及 R 应用,高等教育出版社 23 18.4 数据清理数据清理 数据科学家可能要花大量时间清洗数据,把数据整理为可用的格式。 R 包 tidyverse 的 tidyr 包使得数据清理变得简单。 “整洁数据”(tidy data)有以下三个简单标准: (1) 每个变量都占一列; (2) 每个观测值都占一行; (3) 每个观测值的每个变量取值都占一格。 (c) 2020,陈强,机器学习及 R 应用,高等教育出版社 24 以 R 包 tid
21、yverse 的自带数据 table1 为例: library(tidyverse) table1 # A tibble: 6 x 4 country year cases population 1 Afghanistan 1999 745 19987071 2 Afghanistan 2000 2666 20595360 3 Brazil 1999 37737 172006362 4 Brazil 2000 80488 174504898 5 China 1999 212258 1272915272 6 China 2000 213766 1280428583 (c) 2020,陈强,机器学
22、习及 R 应用,高等教育出版社 25 table1 是“面板数据”(panel data),其每位个体(Afghanistan、Brazil 与 China)均出现两次(1999、 2000), 共有 4 个变量(country、year、cases、population)。 table1 已经是整洁数据。但在数据被清理之前,同样信息可能以table4a 与 table4b 的不整洁形式存在: (c) 2020,陈强,机器学习及 R 应用,高等教育出版社 26 table4a # A tibble: 3 x 3 country 1999 2000 * 1 Afghanistan 745 266
23、6 2 Brazil 37737 80488 3 China 212258 213766 其中, 由于 “1999” 与 “2000” 一般不宜作为变量名, 故用反撇号(backtick)“”将其括起来。 (c) 2020,陈强,机器学习及 R 应用,高等教育出版社 27 table4b # A tibble: 3 x 3 country 1999 2000 * 1 Afghanistan 19987071 20595360 2 Brazil 172006362 174504898 3 China 1272915272 1280428583 其中,table4a 包含 table1 中变量 c
24、ases 的信息,而 table4b 包含table1 中变量 population 的信息,但变量 year 的两个取值被作为变量1999与2000使用。 (c) 2020,陈强,机器学习及 R 应用,高等教育出版社 28 为进行数据清理, 首先使用 tidyr 包中的 gather()函数将 table4a中的两列数据“聚集”(gather)为一个变量 cases。 使用管道算子“%” ,此命令可写为 tidy4a % gather(1999, 2000, key = year, value = cases) (c) 2020,陈强,机器学习及 R 应用,高等教育出版社 29 tidy4a
25、 # A tibble: 6 x 3 country year cases 1 Afghanistan 1999 745 2 Brazil 1999 37737 3 China 1999 212258 4 Afghanistan 2000 2666 5 Brazil 2000 80488 6 China 2000 213766 结果显示, 生成了两列新变量 year 与 cases。 类似地, 对于 table4b可进行同样的聚集操作: (c) 2020,陈强,机器学习及 R 应用,高等教育出版社 30 tidy4b % gather(1999, 2000, key = year, value
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 本科 18 数据 科学 语言
限制150内