书名:R数据挖掘实战
ISBN:978-7-115-61645-6
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 [意]安德烈亚·奇里洛(Andrea Cirillo)
译 王 燕 王存珉
责任编辑 佘 洁
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
Copyright ©2017 Packt Publishing. First published in the English language under the title R Data Mining.
All rights reserved.
本书由英国Packt Publishing公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。
版权所有,侵权必究。
R语言数据挖掘被广泛应用于不同领域,包括金融、医学、科学研究等。本书通过具体实例和真实的数据集来实现数据挖掘,首先讲解了数据挖掘的基本概念和R语言的基础知识,随后介绍了R语言中与数据挖掘相关的各种扩展功能包的使用,并通过多个实际的例子,教会读者整理数据、分析数据的方法。
本书适合想通过R语言快速了解数据挖掘、预测分析、商业分析等领域的数据科学家和数据分析员阅读,也适合高等院校数据挖掘相关专业师生和对数据挖掘感兴趣的技术人员参考。
安德烈亚•奇里洛(Andrea Cirillo)目前就职于意大利联合圣保罗银行,担任审计量化分析师。在此之前,他曾在德勤会计师事务所从事财务和外部审计相关工作,以及在FNM(一家意大利上市公司)从事内部审计相关工作。他目前的主要工作职责是围绕“巴塞尔协议Ⅲ”进行信用风险管理模型的评估及改进。他与Francesca结婚,并共同养育4个子女,他们的名字分别是Tommaso、Gianna、Zaccaria和Filippo。安德烈亚曾编写并贡献了一些有用的R语言程序包,包括updateR、ramazon和paletteR。此外,他会定期分享一些关于R语言编程的深刻见解和教程。他的研究工作主要聚焦于通过建模定制算法以及开发交互式应用程序,实现R语言在风险管理和欺诈检测领域的应用。
安德烈亚曾著有图书RStudio for R Statistical Computing Cookbook(Packt Publishing)。
“致我的家人:Francesca、Tommaso、Gianna、Zaccaria和Filippo。”
恩里科•佩戈拉罗(Enrico Pegoraro)毕业于意大利帕多瓦大学统计学专业。关于自身的经历,他描述为:“见证了快速发展的计算机科学和统计领域。”他从事过的项目涉及数据库、软件开发、编程语言、数据集成、Linux、Windows和云计算。目前,他是一名统计学家和数据科学家(自由职业者)。
恩里科拥有10年以上的R语言和其他统计相关软件培训与咨询活动方面的经验,尤其在六西格玛过程、行业统计分析和企业培训课程方面具有丰富的经验。同时,他也是意大利米兰R语言社区主要支持性公司的合伙人,担任公司特约首席数据科学家(非全职)以及R语言培训课程(统计模型和数据挖掘)讲师。
恩里科曾与意大利医疗机构合作,向一些区域性项目、刊物提供医院内感染方面的文章。他的主要专长包括为统计建模、数据挖掘、数据科学、医疗统计、预测模型、统计过程控制(SPC)和工业统计提供咨询与教学。
读者可以通过电子邮箱(pego.enrico@tiscalil.it)联系恩里科。
“感谢所有为我以及我的项目提供支持的人,尤其是我的伙伴Sonja以及她的儿子Gianluca。”
道格•奥尔蒂斯(Doug Ortiz)作为企业云、大数据、数据分析以及解决方案架构师,他的职业生涯始终围绕企业解决方案的架构、设计、开发以及集成。借助他掌握的技术栈,企业能够通过现有的、新兴的技术(例如Amazon Web Services、Microsoft Azure、Google Cloud、Microsoft BI 堆栈、Hadoop、Spark、NoSQL数据库和SharePoint)以及相关的工具集,重新开发和应用企业内尚未被充分使用的数据。
此外,他也是Illustris有限责任公司的创始人。读者可以通过电子邮箱(dougortiz@ illustris.org)联系他。
有关其专业能力的总结性介绍如下:
● 具有集成多种平台和多种产品的经验;
● 具有大数据、数据科学、R语言和Python语言认证;
● 可帮助企业更加深入地了解企业当前数据和现有资源的投资价值,并将其转化为对企业有用的信息来源;
● 利用独特而创新的技术改进、挽救和构建项目;
● 定期对有关Amazon Web Services、数据科学、机器学习、R语言和云技术方面的图书做出评论。
业余爱好:瑜伽和潜水。
“感谢我的妻子Mila给予我的所有帮助和支持,感谢Maria、Nikolay以及我出色的孩子们。”
拉多万•卡维奇(Radovan Kavicky) 斯洛伐克布拉迪斯拉发市GapData研究所的一名首席数据科学家,并兼任该所总裁一职。该所借助数据能量和经济学智慧为公共事业提供支持。拉多万具有较强的数学和分析技能,他既是一名接受过专业教育的宏观经济学家,也是一名具备多年职业经验(具有8年以上为公共事业和私营部门客户提供服务的经验)的顾问和分析师。拉多万能够提供顶级的研究和分析服务,其工作期间所使用的工具从之前的MATLAB、SAS和Stata软件,更新换代到当下的Python语言、R语言和Tableau软件。
拉多万是开放数据的布道者,同时是斯洛伐克经济协会(SEA)、开放预算促进会(Open Budget Initiative)、开放政府合作伙伴(Open Government Partnership)以及全球性Tableau#DataLeader网络(2017年)的成员。他曾在TechSummit(布拉迪斯拉发,2017年)和PyData(柏林,2017年)峰会上发表演讲。目前,他是PyData Bratislava、R <- Slovakia和SK/CZ Tableau用户组(skczTUG)的创始人。
奥列格•奥肯(Oleg Okun)一位多产的机器学习专家,完成了4本图书的编著,发表过多篇期刊文章以及大量会议论文。在长达25年的职业生涯中,奥列格一直活跃在其祖国(白俄罗斯)和境外(芬兰、瑞典和德国)的学术界和工业界。奥列格的工作经验涉及文档图像分析、指纹识别、生物信息学、在线/离线营销分析、信用评分分析和文本分析。
奥列格对分布式机器学习和物联网抱有极大的兴趣。目前,他在德国汉堡工作,并生活在那里。
“对我的父母为我所做的一切,我想表达最深切的感谢。”
你可能听说过,R语言在数据分析师和数据科学家中非常受欢迎,它以能够交付非常灵活和专业的数据结果,以及惊艳的数据可视化能力而闻名。既然R语言有如此强大的功能,我们要如何学习使用R语言来做数据挖掘呢?本书将从最基础的知识开始,带领你开启学习之旅,除了好奇心之外你什么都不用准备,我们会在旅途中发现需要的所有知识。
在本书中我们会同时使用基础和高级的数据挖掘技术来解决一个影响商业公司的真实欺诈犯罪案件,通过解决这个案件来提升你的数据挖掘技能。
在我们R语言旅程的最后,你将能够识别需要进行数据挖掘的问题,分析这些问题,然后使用主流的数据挖掘技术来解决它们,并发布完善的总结报告来传达和表述从数据中发现的信息和内幕。
第1章:为何选择R语言,讲述了R语言的历史、优势和缺点,以及如何在计算机上安装R语言并运行简单的程序。
第2章:数据挖掘入门—银行账户数据分析,在数据分析中应用R语言。
第3章:数据挖掘进阶—CRISP-DM方法论,教会你如何使用CRISP-DM方法组织和运行数据挖掘项目。
第4章:保持室内整洁—数据挖掘架构,定义了数据挖掘项目的基础结构。
第5章:如何解决数据挖掘问题—数据清洗和验证,介绍了区分数据质量等级的度量标准,以及一系列用于评估数据质量的检测方法。
第6章:观察数据—探索性数据分析,讲解了探索性数据分析的概念及其在数据分析过程中的应用。
第7章:最初的猜想—线性回归,我们将设计一个简单的线性回归模型并检验它是否满足我们的要求。
第8章:浅谈模型性能评估,涵盖定义和衡量数据挖掘模型性能的工具。
第9章:不要放弃—继续学习包括多元变量的回归,探索多变量情况下的输出结果预测。
第10章:关于分类模型问题的不同展望,探讨了分类模型的需求和使用。
第11章:最后冲刺—随机森林和集成学习,在这一章中,我们将学习如何用集成学习来评估分类模型。
第12章:寻找罪魁祸首—使用R语言执行文本数据挖掘,介绍了如何为文本挖掘项目准备数据帧、删除无关单词以及将其从句子列表转换成词列表。同时,你也会学习基于文本挖掘的情感分析、词云开发,以及N元模型分析。
第13章:借助R Markdown分享公司现状,本章使用了RStudio生态系统中两个强大的组件(R Markdown和Shiny)。
第14章:结语,通过独特的背景故事,使得读者对数据挖掘的学习非常有参与感。
附录:日期、相对路径和函数处理,包含了R程序运行的一些其他相关信息。
在UNIX或者Windows系统上使用R语言,能够让你更轻松地学习本书的各个章节。本书使用的R语言版本为3.4.0。
如果你是一位刚入行的数据科学家或者数据分析员,有一些基础的R语言知识,想通过实践进阶更复杂的数据挖掘,那么本书就是为你准备的。
你可以从GitHub上找到本书的相关代码,地址为https://github.com/PacktPublishing/ R-Data-Mining。
你可以通过如下地址下载本书彩图:https://www.packtpub.com/sites/default/files/ downloads/RDataMining_ColorImages.pdf。
开启R语言学习之旅之前,读者必须掌握该旅程中会用到的所有工具和概念。作为读者的你,或许已是一名R语言爱好者并且想了解有关R语言的更多知识,但对于是否要学习它持不确定态度;或许你不了解R语言的优缺点,因而无法确定是否值得花时间去学习它;更为关键的一点是,你并不知道从何处着手,以及如何开始该语言的学习之旅。本书将为读者解答上述所有困惑。
通过本章的学习,读者将得到以下收获。
● 通过学习R语言的历史,了解它是如何发展的。
● 通过分析R语言的优势,理解为什么学习这门编程语言是明智的。
● 学习如何在计算机上安装R语言,以及如何编写和运行R语言代码。
● 理解R语言和编写R语言脚本所需的基本概念。
● 理解R语言的劣势,并掌握应对方法。
在完成本章的学习之后,读者将会掌握有关R语言的“十八般武艺”,来应对第一个真正的数据挖掘问题。
让我们从头开始,首先考虑一下:“什么是R语言?”通过一些数据分析或数据科学博客和网站,读者可能会了解到很多关于R语言的知识,不过,也许仍然很难在脑海中建立起关于该语言的完整概念。R语言是一种高级编程语言。也就是说,通过在计算机上执行即将通过本书学习到的R语言脚本,读者能够让计算机执行一些自己所期望的计算和操作,并按照预先定义好的格式输出结果。
跟其他编程语言一样,R语言也是由一系列计算机能够理解并响应的预定义好的指令组成的。读者可能已经注意到了,本书将R语言称为一种高级编程语言。那么,该如何理解这里所提到的“高级”呢?其中一种理解方法就是,用典型的公司组织架构来理解该语言。在公司里,按照自上而下的层级排序,通常有首席执行官(CEO)、高级经理、部门主管……直到基层员工。
公司内的这些层级之间有着什么区别呢?CEO的职责是做出主要战略决策、制定核心战略规划,而无须考虑战术和操作活动。越往下(即层级越低的岗位)则越需要关注战术和操作活动。对于基层员工而言,他们的主要职责就是执行最基础的操作活动,如拧螺丝、锤击等。
编程语言分级也是这样的。
● 高级编程语言就像CEO,它们将操作细节抽象化,即形成高级编程语言语句,并将这些语句交由低级编程语言来翻译成计算机可以识别的指令。
● 低级编程语言就像部门主管以及基层员工,它们将高级编程语言语句翻译成计算机执行所需要的大量指令,输出高级编程语言所期望的结果。
确切地说,读者也可以直接用低级编程语言来编写代码,不过这种做法往往会导致代码变得复杂而冗长。因此,久而久之,这种编写代码的方式已不再流行。
既然已经弄清楚了什么是R语言,就继续学习下面的内容,了解一些关于R语言的发源地及其发起时间的知识吧!
罗斯·伊哈卡(Ross Ihaka)和罗伯特·金特尔曼(Robert Gentleman)于1996年发布了R:A Language for Data Analysis and Graphics一书,当时的他们,可能根本想象不到如今R语言可以取得如此大的成功。20世纪90年代早期,R语言诞生于奥克兰大学。最初因其用户界面友好的特性,学生们将该数据分析工具应用于学术研究。出乎意料的是,凭借着它的一些优势,R语言在研究人员和数据分析人员群体中快速、广泛地流行起来,最终于近几年渗透进入商业领域,被一些主流的金融机构所采用。下面会陆续介绍该语言的优势。
当前R语言的开发是由R核心团队主导的,该团队会定期地发布R语言基础版本的更新包。有关R语言的信息,读者可以通过访问R语言的官方网站来获取。
R语言既不是唯一的数据分析语言,也不是出现最早的数据分析语言,为何如此受欢迎呢?
如果仔细分析,就会发现其包含以下3个优势。
● 开源。
● 插件就绪。
● 数据可视化友好。
R语言被广泛采用的一个主要原因就是它的开源性,任何人都可以下载、修改并再次分享(只能通过开源的方式)R语言的二进制代码。从技术上讲,R语言是通过GNU通用公共许可证来发布的。这意味着,用户可以基于任何目的来使用R语言,但同样该用户也必须使用GNU通用公共许可证来分享其所有的R语言衍生品。
作为一门统计分析语言,R由于具有以上特性,因此非常适合以下目标用户使用。
● 学术用户:在学术环境中,知识共享是一个必需条件。通过R语言,学术圈可以共享工作成果,无须担心版权和许可证问题,因而该语言在学术研究中非常实用。
● 商业用户:企业总是因为预算限制而烦恼,拥有一款免费而又专业的统计分析软件,正是它们的梦想。
● 个人用户:这类用户兼具上述两类用户的需求特点。这类用户会发现,拥有一款可以用来学习统计分析并分享相应成果的免费工具真是太棒了。
读者可以把R语言想象成一个可扩展的棋盘游戏,类似于《七大奇迹》和《卡卡颂》。这些游戏会提供一些基础的角色和地形以及更多可选的角色和地形来供玩家选择。当选择范围扩大后,玩家从中可以获得极大乐趣。读者可以将R语言视为这类可扩展的游戏。
R语言基础版本包含一组默认程序包,程序包会随着标准软件包一起发布(读者可以跳转到本书的1.4节,了解关于如何获取和安装默认包的更多知识)。R语言基础版本所提供的功能主要涉及文件系统操作、统计分析以及数据可视化。
虽然R语言基础版本通常是由该语言的核心团队来维护和更新的,但是实际上每一个R语言用户都可以给默认程序包添加新功能,并在此基础上开发和分享R语言定制程序包。
下面是R语言用户开发和分享R语言定制程序包的基本流程。
1)R语言用户开发新的程序包。例如基于最新学术论文中所发表的一个新型机器学习算法,R语言用户可以开发实现这个算法的一个程序包。
2)R语言用户将程序包上传到综合R档案网络(CRAN)存储库或其他类似的存储库。其中,CRAN是R语言相关文档和程序包的官方存储库。
3)每一个R语言用户都可以把任何一个特定的程序包安装并加载到R语言的运行环境中,以便获取程序包中的额外特性。如果程序包已被提交到CRAN,那么读者只需运行下面所示的两行R语言代码便可以安装和加载该程序包了(在诸如Bioconductor的其他可选存储库中,也有相似的命令)。
install.packages("ggplot2")
library(ggplot2)
如读者所见,上述流程能够非常方便而有效地扩展R语言的功能。很快,读者就会了解到,R语言用户开发的额外程序包所提供的功能是多么丰富。
在CRAN上,共有超过9000个可供使用的程序包,并且数量还在不断增加,它们为R语言社区带来了越来越多的额外功能特性。
作为一门学科,数据可视化涵盖了用来有效显示一组数据中所包含的信息的原理和技术。
在信息密集的时代,具备通过数据可视化简洁、清晰且有效地传达复杂信息的能力,已成为任何专业人员的核心竞争力。R语言的数据可视化功能将该语言推到了学术领域和专业领域的前沿位置,这就是R语言能取得极大成功的原因所在。
从一开始,R语言就因其优异的数据可视化功能而备受关注。当其他高级编程语言还在建立基于x轴、y轴的二维的聚合+符号图像时,R语言已经能够展示绚丽的3D图像了。然而,对于R语言的数据可视化技术而言,它的一次质的飞跃归功于奥克兰大学的哈德利·威克姆(Hadley Wickham)。哈德利·威克姆基于图形语法(The Grammar of Graphics)开发了ggplot2程序包,为R语言引入了一个处理数据可视化任务的结构化框架(见图1-1)。
图1-1
单独通过ggplot2程序包,R语言社区用户就可以高度灵活地生成以及可视化几乎任何类型的数据。同时为了可以快速添加新出现的数据可视化技术,该程序包还被设计成了一个可扩展的工具。此外,通过ggplot2程序包,读者可以高度自由地自定义自己的图表,给图表添加各种图形或文本注释。
如今,诸如Meta、Google等顶尖的科技公司,都在使用R语言;诸如《经济学人》《纽约时报》等著名的出版物,也在使用R语言向它们的读者展示数据以及输送信息。
综上所述,读者是否应该把宝贵的时间用于学习R语言呢?如果读者是一名专业人士或者学生,需要使用前沿技术来高效地控制、建模和展现数据以体现自己的优势,那答案就是肯定的:读者一定要学习R语言,并且应该将学习R语言当作一项长期投资。原因是R语言的优势,决定了它会在未来的几年里,继续在每个行业和学术领域进一步拓展其影响力。
既然已经明白了R这门数据分析语言是值得学习的,那么让我们一起来看看如何安装R语言、编写R语言代码并运行它吧!首先,需要说明的是,安装R语言和安装一个可用于编写并运行R语言代码的集成开发环境(IDE)并不是同一回事。在本节中,这两部分的内容都会有所涉及,并且会让读者了解它们之间的区别。
“安装R语言”指的是:在计算机上安装R语言解释器。通过该解释器,读者的计算机可以执行R命令、运行以“.R”作为文件扩展名的R脚本。可以通过R语言项目的官方服务器网站找到R语言的最新版本。
浏览上述网站,读者可以找到适用于不同操作系统的R语言程序包的下载链接,具体包括以下3种选择。
● 应用于Windows的R语言程序包。
● 应用于macOS 的R语言程序包。
● 应用于Linux的R语言程序包。
在Windows平台和macOS平台上安装R语言程序包,步骤都是相似的,具体如下。
1)在对应平台的R语言下载页面中下载相关文件包(见图1-2)。
2)在下载的文件包中找到适当的安装文件。
● 应用于Windows平台的安装文件有如下类似名称:R-3.3.2-win.exe。
● 应用于macOS平台的安装文件有如下类似名称:R-3.3.2.pkg。
3)运行安装文件,并等待安装程序执行完毕。
图1-2
一旦完成上述步骤,便完成了R语言程序包在所选定系统平台上的安装,并且可以使用它了。不过,对于Linux平台用户而言,其所需的安装步骤会有些不同。
在Linux平台上安装R语言,最简洁而直接的方法就是使用命令行。安装步骤很简单,只需打开终端,并执行下面的命令:
sudo apt-get update
sudo apt-get install r-base
在此期间,终端可能会提示读者输入管理员密码,从而以超级用户身份执行命令(sudo命令表示以超级用户身份执行命令)。
在完成R语言程序包的安装之后,读者或许会问:到底安装了什么?马上解答这个问题。首先,R语言基础版本的软件包会携带一个适用的最新版本的R语言解释器。正如在1.1节中所提到的,安装R语言程序包之后,相应的计算机就能够读取、解析R代码,并执行由解析后的代码所组成的指令。读者可以在操作系统的命令行中使用如下代码来体验一下(读者需要根据自己的系统平台做出恰当选择)。
● 在Windows平台上(使用PowerShell):
echo "print('hello world')" >> new_script.R
Rscript.exe new_script.R
● 在macOS平台或者Linux平台上:
R
print('hello world')
上述两段命令都会在屏幕上输出“大名鼎鼎”的“hello world”(你好,世界)。
除了解释器之外,R语言基础版本还自带了一个非常基础的平台,用于开发和执行R语言代码。该基础平台主要由以下部分(见图1-3)组成。
● R语言控制台:用来执行R语言代码并显示执行结果。
● R语言脚本编辑器:用来编写R语言代码并将代码保存为单独的R脚本(使用“.R”扩展名)。
● 附加组件:提供一些功能,如数据导入、其他程序包安装、控制台历史操作导航等。
图1-3
在之前的很长一段时间里,R语言社区中的绝大部分人都是利用R语言基础版本自带的平台来编写和使用R代码的。如今,尽管该平台仍然能够很好地运行并且会得到定期更新,但跟很多更优秀的替代工具平台相比,该基础版已经有点儿落后了。有关这些替代工具平台的内容,将在1.4.5节中讲解。
在前文中,介绍了两种运行R语言代码的方式。
● 使用操作系统终端。
● 使用R语言基础版本中的开发环境。
对于有经验的R语言用户来说,第一种方式非常方便,尤其在执行明确的分析任务时颇具优势。这类任务的特点如下。
● 按一定顺序执行不同语言的脚本。
● 执行文件系统相关的操作。
对于第二种方式,前面已经介绍过,R语言存在着很多更优秀的替代工具平台。因此,在开始编写更多R语言代码之前,读者有必要仔细地了解一下这些替代工具平台。
首先,需要说明两点。
● 替代工具平台并非文本编辑器类的应用程序,而是具有R语言控制台和额外的代码执行工具的程序。与文本编辑器类的应用程序不同,替代工具平台更倾向于一个IDE,因为它能够给一门新语言的学习者带来更好、更全面的用户体验。
● 这里不会列举所有的工具平台,只列举出在R语言社区的讨论和实践中被提及非常多的一些工具平台。当然,也许存在着更好的工具平台,但可能尚未流行起来。
在这里,要列举和介绍的工具平台如下。
● RStudio。
● Jupyter Notebook。
● Visual Studio。
RStudio是在R语言社区中非常受欢迎的一个IDE。RStudio之所以受欢迎是因为该平台的R语言专属性(这使其有别于本书即将介绍到的另外两个工具平台),及其与R语言社区中的一些热门程序包的完美集成。
RStudio除了涵盖在探讨安装R语言基础版本开发环境时所涉及的所有基本功能,还附带很多用于辅助编码和最大化提高开发效率的其他有帮助的组件。下面仅列出其中的部分组件。
● 文件系统浏览器:用于浏览当前的工作目录并与之进行交互。
● 文件导入向导:用于方便、快速地导入数据集。
● 绘图面板:用于显示和操纵代码运行所生成的数据可视化绘图。
● 变量资源管理器:用于显示和操纵代码运行所生成的值与数据。
● 类似电子表格的数据查看器:用于显示代码运行所生成的数据集。
RStudio还包括很多增强的特性,包括代码自动补全、内置函数帮助及支持多重窗口监视的可拆分窗口等,具体如图1-4所示。
图1-4
最后必须提到的就是RStudio对于其他热门R语言程序包的集成。RStudio通过附加控件或预定义的快捷方式来集成这些热门R语言程序包,举例如下。
● Markdown程序包:用于集成R语言代码(更多内容请见第13章)。
● dplyrfor程序包:用于进行数据操作(更多内容请见第2章)。
● Shiny程序包:用于R语言的Web应用开发(更多内容请见第13章)。
Jupyter Notebook原本是针对Python的一个扩展,被用于实现交互式数据分析和可复用的工作流。其工作原理是将代码和代码的输出结果(包括图形和表格)放到同一份文件中,以便开发人员和其他后续读者(例如客户)按照代码中数据分析的逻辑和过程,逐步得出结果。
不同于RStudio,Jupyter Notebook没有文件系统浏览器,也没有变量资源管理器。不过它仍然是一个不错的选择,尤其是在需要将分析工作过程分享出去的时候。
由于Jupyter Notebook最初是Python语言的一个扩展,因此它实际是用Python语言开发的。这意味着,除了安装R语言之外,还需要安装Python语言才能运行Jupyter Notebook工具。欲查找Jupyter Notebook的安装说明,可以查看Jupyter Notebook的在线文档。
在完成Jupyter Notebook的安装之后,还需要安装R语言内核组件,然后才能够在Jupyter Notebook上运行R语言代码。安装R语言内核的方法可参考该组件主页。
Visual Studio是一个非常流行的开发工具,主要用于进行Visual Basic和C++开发。由于微软公司近几年对R语言的兴趣浓厚,这款IDE(指Visual Studio)通过使用R语言扩展工具也实现了R语言开发支持,如图1-5所示。
该扩展工具能够将R语言常用的一些特性添加到非常成熟的开发平台(例如Visual Studio)中。目前,该IDE的主要局限在于:它只能用于Windows系统。
此外,Visual Studio是免费的(至少社区版是免费的)。详细的安装指南可参见其官网。
图1-5
既然读者已经安装了R语言并且选择了自己喜爱的R语言开发环境,接下来是时候体验一下,并获得R语言的一些基础知识了。本节将介绍R语言的主要构建模块,这些构建模块会应用于本书的所有数据挖掘算法之中。更具体地说,通过在交互式控制台上执行基本操作并保存第一个R语言脚本,读者将学会如何创建和操作以下构建模块(见图1-6)。
● 向量(Vector):用于存储有序的一个或多个值。
● 列表(List):一种数据集合,用于存储向量或者R语言中其他类型的对象。
● 数据帧(Dataframe,也称数据框):可被看作由很多向量组成的二维列表,数据帧中所有向量内元素的数量是相同的。
● 函数(Function):一组作用于向量、列表和数据帧的指令集合,通过操作这些对象来生成新的结果。
图1-6
接下来,讲解如何使用自定义函数以及如何安装扩展包来使用R语言的更多功能。如果上述所提及的概念让读者感到不知所措,不必担心,通过后续的学习,读者一定能对以上构建模块及其概念达到非常熟悉的程度。
在了解R这门强大语言的入门知识之前,先来看看R语言的基本操作,具体如下。
● 在R语言控制台上执行一些基本操作。
● 创建并保存R语言脚本。
● 在R语言控制台执行R语言脚本。
打开你最喜欢的IDE(本书使用RStudio),通过闪烁的光标,能够找到交互式控制台。在找到控制台之后,输入如下字符并按“Enter”键,即可向控制台提交命令:
2+2
提交的命令的执行结果会在下一行自动输出:
4
上述命令及输出只是一个简单的例子,后续将讨论更加复杂的数学运算。
读者虽然在控制台上可以很方便地、交互式地测试小代码块,但需要注意的是,一旦终止了R语言会话(如关闭IDE),控制台上执行的所有操作都会丢失。虽然一些IDE(如RStudio)会记录控制台历史操作,但它只是追溯历史操作的一个线索,而不是一种有效地存储代码的方式(见图1-7)。
图1-7
后面将介绍存储控制台命令历史记录的正确方法。同时,为了完整性考虑,在这里说明一下:R语言可以执行所有基本的数学运算,可以使用的运算符包括+、−、*、/、^(幂运算)。
R语言脚本是存储或多或少的R语言代码的一种文件,其优点是可以存储和显示可重复执行,或在脚本外部调用执行的一组结构化的指令(更多详情见后文)。在IDE中,可以找到用于新建脚本的控件或者按钮;单击该控件或按钮,可生成一个以.R为扩展名的文件;打开该文件,就可以开始编写R语言代码了。如果没有找到类似的控件或按钮,那么读者可能需要考虑更换一款IDE,或者尝试在R语言控制台上运行以下命令:
file.create("my_first_script.R")
现在就开始在文件中编写一些代码,按照惯例,使用“大名鼎鼎”的句子“hello world”(你好,世界)来测试脚本吧。如何才能输出这两个神奇的单词呢?读者只需告诉R语言执行输出即可,如图1-8所示,具体如下:
print("hello world")
图1-8
再重复一遍,当前这行代码只是“热身”,后续会介绍更多复杂的场景,所以读者不必担心本书内容过于浅显。
在往下阅读之前,请读者在文件中再添加一行内容,这次要添加的不是代码,而是注释:
# my dear interpreter, please do not execute this line, it is just a comment
实际上,注释与软件开发是紧密联系的。读者可能很轻易地猜到,这样的注释语句是不会被解释器执行的,因为解释器会忽略所有“#”之后的内容。虽然注释会被解释器忽略,但它对程序员来说却非常宝贵,尤其对于写完脚本之后一个月,再回头来看脚本的程序员而言。注释一般用于标注代码的基本原理、条件和目标,以便于程序员理解代码的作用范围是什么、为什么执行某些操作,以及必须满足哪些条件才能让代码正常运行。
请注意,注释可以和代码写在同一行,如下面的例子所示:
print("hello world") # dear interpreter, please do not execute this comment
在IDE上找到“保存”按钮,单击该按钮就可以保存脚本文件了。保存脚本文件时需要输入文件名,可以将名字设置为“my_first_script.R”,因为在接下来的内容里会用到它。
随着编码能力的逐步提升,读者就更有可能逐步地将数据分析的不同部分存储到不同的脚本中,并从终端或者一个主脚本中按顺序调用它们。因此,从一开始就正确地掌握脚本文件的存储操作是至关重要的。而且完整地执行脚本是检查代码错误(即bug)的好方法。将数据分析过程存储在脚本中,能够方便其他感兴趣的用户复用代码,从而验证读者的分析结果的正确性——这是非常理想的一大特性。
现在,请读者尝试执行之前所创建的脚本。在R语言环境下,通过调用source()函数来执行一个R语言脚本。正如在本书后面部分会更深入介绍的那样,函数是一组指令的集合,它通常接收一个或多个输入,并产生一个输出。函数的输入被称为参数,函数的输出被称为值。在当前的例子中,将指定一个唯一的参数,即脚本文件参数。当前的例子使用之前保存的文件名作为参数,执行如下命令:
source("my_first_script.R")
执行这个命令的过程是怎样的呢?可以想象解释器一边读取每行代码,一边说:“来看看这个‘my_first_script’文件中的内容。好的,这里面有一条R命令——print("hello world"),执行它看看会发生什么。”虽然上述引用的这些言语是虚构的,但解释器确实就是这样运行的。解释器会查找指定的文件,读取文件内容,并执行存储在其中的R语言命令。当前的例子会在控制台上产生如下输出:
hello world
现在是时候开始真正学习R语言入门知识了,让我们先从向量开始吧!
什么是向量?哪里会使用到向量?“向量”这个术语来自代数领域,但在R语言的世界里,向量并没有那么复杂,读者可以简单地将它看成由同一种数据类型的值所组成的有序序列。不同顺序的序列是不同的对象,如图1-9所示。
图1-9
如何在R语言中创建一个向量呢?答案是可以通过c()函数来创建,具体如下面的语句所示:
c(100,20,40,15,90)
上述语句创建的是常规的向量,只要在R语言控制台输出之后,它就失效了。如果想让该向量在R语言环境中保存下来,需要创建一个变量。可以简单地通过赋值操作来完成:
vector <- c(100,20,40,15,90)
只要执行这个命令,R语言环境中就会增加一个新的、类型为向量的对象。向量实际上有什么用途呢?作为使用R语言进行开发的基础,其每一个输入以及R语言产生的每一个输出都可以被简化成一个向量。例如,本书会将数据统计分析的结果存储在向量中,也会用向量来表示模型所遵循的概率分布。
需要注意的是,到目前为止,虽然读者在本书中只看到了一个数值向量,但实际上,读者可以定义包含表1-1所示的所有类型数据的向量。
表1-1
类型 |
示例 |
---|---|
数值 |
1 |
逻辑/布尔 |
TRUE |
字符 |
"text here" |
甚至还可以定义混合类型的向量:
mixed_vector <- c(1, TRUE, "text here")
确切地说,混合类型的向量最终会被强制转换成能包含所有其他类型的向量类型,就像刚刚例子中会全部转换为字符类型的向量。有关细节不在这里多加讨论,以免读者混淆。
现在,读者已经知道如何创建一个向量并保存该向量了。那么,如何调用并显示该向量所存储的内容呢?一般来说,调用一个对象只需要使用它的名字即可。可以在控制台上输入刚刚创建的向量的名字“mixed_vector”并按“Enter”键提交,结果如下:
[1] "1" "TRUE" "text here"
既然读者已经知道了“什么是向量”,就很容易理解列表了,它是包含对象的容器。列表容器内的对象可以是其他列表,甚至可以是数据帧。在R语言环境中,用列表来存储对象很方便。例如,很多统计函数用列表来存储运行结果。
请读者看看如何使用列表,代码如下:
regression_results <- lm(formula = Sepal.Length ~ Species, data = iris)
IRIS数据集是非常有名的R语言预加载数据集,它包含在每个R语言基础版本中。上面这行命令表示基于IRIS数据集拟合一个回归模型(后文会详细讲解回归模型的细节),该模型试图解释特定种类的鸢尾花的萼片长度规律。
现在来看看 regression_results对象,正如之前说过的,它存储了回归模型拟合的结果。如果要查看指定对象的类型,可以使用mode()函数,该函数将对象名称作为参数x的值,如下所示:
mode(x = regression_results)
运行结果如下:
list
请读者查看之前的代码,看看通常都是如何创建列表的呢?在创建列表时,读者总是会用到赋值运算符“<-”,该运算符在创建向量时也会用到。两者之间的区别是,创建列表时使用的函数不同。创建列表时不是使用c()函数,而是使用list()函数。如下面例子所示,请读者尝试创建两个向量,然后将它们合并到一个列表中:
first_vector <- c("a","b","c")
second_vector <- c(1,2,3)
vector_list <- list(first_vector, second_vector)
如果读者想定位列表中的特定对象,应该怎么做呢?这时需要使用[[]]运算符,用来指定要获取对象的层级。例如,想获取vector_list列表中的第二个向量,可以使用如下代码:
vector_list[[2]]
输入上述代码并按“Enter”键提交,会返回如下结果:
[1] 1 2 3
读者也许会想,能否获取列表中的单个对象的单个元素呢?答案是肯定的。例如,想要获取second_vector中的第三个元素,只需要再使用一次[[]]运算符即可,代码如下:
vector_list[[2]][[3]]
输入上述代码并按“Enter”键提交,会返回如下结果:
[1] 3
如果满足下面的规则,数据帧可被简单地看成列表。
● 所有组件都是向量,无论是逻辑向量、数值向量,还是字符向量(甚至可以是混合向量)。
● 所有向量的长度都相同。
根据上述规则,我们可以得出这样的推断,即可以将数据帧想象成一个表,该表一般有一定数量的列(以组成这些列的向量来表示)和一定数量的行(行的数量与向量的长度一致),如图1-10所示。虽然要遵守上述两条规则,但是规则中并没有对列的类型做出限制,即数据帧中多个列的类型可以是不同的,例如数据帧中可以存在数值类型和布尔类型的列。
图1-10
可以想象,数据帧是一种非常方便的数据存储方式,特别适用于存储结构化的数据集,如实验观察数据或金融交易数据。数据帧允许在每一行中存储观察数据,并在每一列中存储给定观察数据的属性。在后文中,读者将会更深入地理解数据帧。
虽然数据帧是列表的逻辑子集,但是它具有创建和处理数据帧的整套专用函数。
创建一个数据帧类似于创建一个列表,只不过使用的函数有所不同。同样,创建数据帧的函数被简单地命名为data.frame(),示例如下:
a_data_frame <- data.frame(first_attribute =c("alpha","beta","
gamma"),second_attribute = c(14,20,11))
请注意:对于每一个向量(即每一列),将运算符“=”之前的字符作为列的名称。另外,还需要注意以下两点。
● 如果不给向量指定名称,那么向量就会被随机地赋予一个难记且非常不友好的名称,在上述示例中,第一个向量会被命名为“c..alpha....beta....gamma..”,而第二个向量会被命名为“c.14..20..11..”。所以,强烈建议读者在创建数据帧时,给向量指定名称。
● 可以指定包含空格的列名,如将第一个向量的名称改为“first attribute”(取代原来的first_attribute),这时只需要在名称上添加双引号即可,示例如下:
a_data_frame <- data.frame("first attribute" ...)
实际上,并不推荐第二种指定包含空格的列名的做法,因为在后续的代码中再次使用这个向量时,该做法会让事情变得复杂,从而引发很多令人烦恼的后果。
那么,如何选择并展示数据帧的一列呢?答案是使用符号“$”,具体如下:
a_data_frame$second_attribute
[1] 14 20 11
可以用类似的方法向数据帧中添加一列:
a_data_frame$third_attribute <- c(TRUE,FALSE,FALSE)
简单来说,函数是用来操作和处理向量、列表或数据帧的方法。这个定义也许不够严谨,但它突出了一个重点,即函数会接收一些输入参数,这些参数可以是向量(甚至只包含一个元素)、列表或数据帧,然后该函数会输出一个结果,通常也是向量、列表或数据帧。
执行文件系统操作及其他特定任务的函数则是例外,在其他语言中,这些例外通常会被称为过程。例如1.5.1节中遇到过的file.create()函数。
R语言最受赞赏的特性之一就是可以很容易地查看其所有可用函数的定义,只需要使用函数的唯一名称作为命令提交即可,无须输入括号。现在,请读者尝试查看mode()函数的定义,代码如下:
mode
function (x)
{
if (is.expression(x))
return("expression")
if (is.call(x))
return(switch(deparse(x[[1L]])[1L], `(` = "(", "call"))
if (is.name(x))
"name"
else switch(tx <- typeof(x), double = , integer = "numeric",
closure = , builtin = , special = "function", tx)
}
<bytecode: 0x102264c98>
<environment: namespace:base>
本书不打算深入探讨mode()函数的细节内容,但需要读者注意函数定义的一些结构元素。
● 这里的function()表示mode()函数本身。
● 对mode()函数的唯一参数x进行了明确说明。
● 在function()调用之后的所有内容都用花括号括起来,花括号里面的内容是函数体,它包含对输入参数的所有计算和操作。
在R语言中,上述函数定义的结构元素是定义一个函数所需要的最少元素,可简化表示如下:
function_name <- function(arguments){
[function body]
}
既然已经知道了函数定义的原理,现在就定义一个简单的函数,即给任意输入的数字加上2:
adding_two <- function(the_number){
the_number + 2
}
这个函数可行吗?当然可行。 为了测试这个函数,必须先执行声明函数定义的两行代码,然后就可以使用读者的自定义函数了:
adding_two( the_number = 4)
[1] 6
继续介绍更加复杂但与函数更相关的概念——函数内的赋值。设想读者正在编写一个函数,并将函数结果存储在一个名为“function_result”的向量中,读者编写的代码可能如下所示:
my_func <- function(x){
function_result <- x / 2
}
假如x的参数值为4,当执行这个函数时,函数的输出应该是一个值为2、名称为“function_result”的对象。
现在请读者根据前面的知识,尝试输出这个对象:
function_result
执行结果为:
Error: object function_result not found
为什么会这样呢?上述错误输出是由函数内赋值的规则所控制的,规则的具体内容如下。
● 函数内部能够查看并使用函数外部定义的变量。
● 函数内部定义的变量只能在函数内部使用。
那么,如何将function_result对象从函数内部输出呢?通常有以下两种方式。
● 使用<<-
运算符——通常称之为超赋值运算符。
● 使用assign()函数。
使用超赋值运算符来重新编写上述函数,具体如下:
my_func <- function(x){
function_result <<- x / 2
}
如果试着运行它,会发现function_result对象出现在IDE的变量资源管理器中。需要说明的是,从函数内导出对象和将对象作为函数的返回结果是不一样的,如下面的函数所示:
my_func <- function(x){
function_result <- x / 2
function_result
}
如果再次尝试运行my_func(4),控制台会输出如下结果:
[1] 2
但在IDE的变量资源管理器中却找不到function_result对象,这是为什么呢?原因是,在上面的函数中,function_result对象的值成了函数的返回值。不管怎样,与上述第一个超赋值运算符的例子类似,这个对象现在是通过标准赋值运算符定义的。
在与经验丰富的技术人员讨论R语言时,技术人员通常会指出该语言存在的两大劣势。
● 陡峭的学习曲线。
● 难以处理大型数据集。
上述两个劣势确实是这门语言的两大缺点。本书作者不会刻意地美化R语言,而是给出克服这些劣势的方法。事实上,可以认为第一大劣势是暂时性的,至少针对不同个体是这样的。因为读者一旦迈过了R语言学习的“绝望谷”,就再也不会被这一劣势所困扰。什么是绝望谷呢?此处用图1-11来进行说明。
图1-11
众所周知,个体在学习全新且足够复杂的事物的过程中,都会经历3个阶段。
● 蜜月期:在这个阶段,学习者会喜欢上这样的新事物,并且非常有信心能够掌握它。
● 绝望谷:在这个阶段,所有事情都变得困难重重,让人陷入绝望。
● 接下来的阶段:学习者开始对新事物有更深入的理解,对它的掌控能力提高,自信心也越来越强。
在谈到第二大劣势时,不得不说,R语言在处理大型数据集方面存在的困难实际上是这门语言本身具有的结构性问题。因此需要在结构上对其做出一些改变,需要将其与其他工具进行战略性合作。在1.6.1节和1.6.2节中,将针对这两大劣势进行更加详细的讨论。
首先,R语言为什么会被视为一门很难学的语言呢?对于这个问题,没有一个普遍统一的答案,不过可以尝试推理一下其中的原因。R语言通常是进行数据分析的首选语言,它是从事数据统计的人员为他们自己,尤其是学习数据统计的学生创建的一门语言。这就决定了这门语言的两大特点。
● R语言没有很好地考虑编程体验。
● R语言具有其他语言所没有的统计技术,并且具有前所未有的创新的交互方式。
大家可以找到R语言学习曲线陡峭的原因,具体归纳如下。首先,相较于Julia和Swift这样的语言,R语言并不是一个对程序员友好的语言。正如1.2节所提到的,R语言是诞生于学术领域的一种工具。其创造者可能也没有想到,如今R语言可以被用于开发网站(更多内容请见第13章,看一看这个令人眼前一亮的应用)。
其次,学习过其他统计语言的人学习R语言时,会有一种晕头转向的感觉。在R语言中应用数据模型时,会体验到一种令人惊艳的交互过程:读者将数据输入模型,得到结果,并对结果进行分析判断;然后迭代执行上述过程,或者进行交叉验证。在该过程中,所有的操作都具有非常高的灵活性。这完全不是统计分析系统(SAS)和统计分析软件(SPSS)的用户所能够体验到的。在SAS及SPSS中,用户只能将数据提交给执行函数,然后得到一个大而全的结果集。
这就是最终结论了?难道只能被动接受历史原因所导致的陡峭的R语言学习曲线吗?当然不是。实际上,R语言社区一直在积极地参与平缓这条曲线的工作,主要的工作内容有以下两点。
● 改善R语言的编程体验。
● 编写高质量的学习资料。
现如今在谈论R语言的时候,一定会提到tidyverse程序包,因为tidyverse程序包在R社区中非常流行。tidyverse是由哈德利·威克姆开发的一个框架,该框架包含很多概念和函数。由于tidyverse程序包的存在,使用R语言的编程体验更加贴近现代的编程体验。有关tidyverse程序包的介绍已经超出了本书的范围,但是本书作者还是想简单地介绍一下这个框架的组成部分,它通常至少包含以下4个程序包。
● reader:用于数据导入。
● dplyr:用于数据操作。
● tidyr:用于数据清洗。
● ggplot2:用于数据可视化。
tidyverse取得了很大的成功,因此出现了很多关于tidyverse主题的学习资料。在后文中,将介绍这些学习资料。
R语言最令人欣赏的特点之一就是它拥有一个生机勃勃的社区。起初,R语言社区主要由在其研究过程中偶遇R语言这一强大工具的统计人员和学术研究人员组成。如今,除了统计人员和学术研究人员,其他领域的专业人士也纷纷加入了R语言社区,包括金融学、化学及遗传学等领域。对于每个初学者来说,R语言社区都是一笔巨大的“财富”,社区中的人都非常友好且乐于帮助初学者迈出学习这门语言的第一步。但是读者可能会感到疑惑,要如何利用R语言社区呢?答案是,首先要找到这个社区并体验它;接下来要做的就是,看看如何利用社区主导的内容来切实可行地学习R语言。
(1)如何找到R语言社区
R语言社区存在很多种交流方式(包括各种线上和线下方式),要与R语言社区进行交流,可以通过其中的任意一种方式。下面列出的是部分线上和线下方式。
线上方式:
● R-bloggers。
● Twitter主题标签#rstats。
● Google+社区。
● Stack Overflow上被标记了R的问题。
● R-help邮件列表。
线下方式:
● R语言年度研讨会。
● RStudio开发者大会。
● R线下聚会。
(2)通过与R语言社区互动来学习R语言
既然已经知道如何找到R语言社区,那么接下来就看看如何利用社区进行学习。通常有3种可选的方式(非单选)。
● 查阅社区主导的学习资料。
● 向社区寻求帮助。
● 及时跟进R语言的最新进展。
查阅社区主导的学习资料:学习资料主要有以下两种。
● 论文、手册和图书。
● 在线交互式课程。
论文、手册和图书:虽然这种学习资料是比较传统的,但读者不应因此而忽视它们,因为这些学习资料总是能够让读者对所探讨的问题获得更加结构性而且系统性的理解。读者也可以在网络上找到论文、手册和图书形式的资料。
向读者推荐以下比较有帮助的期刊和图书。
● Advanced R。
● R for Data Science。
● An Introduction to Statistical Learning。
● OpenIntro Statistics。
● The R Journal。
在线交互式课程:这类课程应该是当前非常常见的学习资料了。在很多不同的平台上都能找到非常不错的R语言学习资料,其中知名的可能是DataCamp、Udemy和Packt。这些平台上分享的是一种实用的交互方式,读者可以通过练习和实践,直接掌握相关的主题知识,而不是被动地看着别人解释复杂的理论。
向社区寻求帮助:当开始编写第一行R语言代码时(甚至在编写代码之前),读者可能会遇到一些与编码工作相关的问题。在这种情况下,最好的方法就是向社区求助,在社区的帮助下解决这些问题。读者很可能并不是第一个提出相关问题的人。所以,在提出问题之前,可以先在网上寻找一下之前是否有人提出过类似的问题,并查看问题答案。
应该在哪里寻找答案呢?在大部分情况下,读者可以通过以下几处找到答案(按可能找到答案的概率先后列出)。
● Stack Overflow。
● R-help邮件列表。
● R程序包的文档。
但是,不建议读者在社交网络或者其他类似网站上寻找答案,因为它们并不是专注于处理这类问题的网站。在这些网站上,答案没有经过任何专业的审核,因此,在这类网站上查找到的答案可能是过时的,或者根本就是不正确的。
如果读者提出的是一个从未有人问到过的新问题,那么读者可以在前面寻找问题答案的地方进行提问。
及时跟进R语言的最新进展:由于存在很多热心用户的贡献,R语言的世界才得以不断更新、不断进步。如何紧跟这些变化呢?社交网络可以派上用场。通过关注社交网络或者类似网站的#rstats主题标签,读者就可以不断地了解R语言的动态。另外,还可以在R-bloggers上订阅每日新闻,这些新闻是由前一天发布的与R语言相关的博客文章组成的,都很实用。最后,读者可以通过R语言年度研讨会或者类似会议接触到著名的R专家,听取他们的独特见解,以及他们关于R语言未来发展的演讲。
前面提到,R语言的第二大劣势与大型数据集的处理有关。那么,这个劣势来自哪里呢?实际上,这个劣势与R语言的核心机制有关,R语言是一个内存软件。也就是说,在R语言脚本中创建和管理的每一个对象都存储在计算机的RAM中。这意味着数据的总大小不能超过RAM的总大小(前提是其他软件没有占用RAM,但这是不切实际的)。那么,如何克服这个劣势呢?答案实际上超出了本书所要讲解的范围。尽管如此,作者在此简单地总结出3种应对策略。
● 优化代码,使用profvis等程序包对代码进行分析,并遵循R语言编程最佳实践。
● 使用外部数据存储和整理工具,如Spark、MongoDB和Hadoop。在后文中,会对此做进一步介绍。
● 使用ff、filehash、R.huge或者bigmemory等程序包来改变R语言内存处理行为,以尽量避免内存过载。
作为作者,我想要强调的是,这个劣势实际上是可以克服的。对于刚刚开始R语言学习之旅的初学者,在遇到这个劣势时不必担心。
最后补充说明:随着获取计算能力的成本越来越低,与大型数据集处理相关的问题就会显得越来越微不足道。
● 关于R语言的论文。
● 采访R语言创作者Ross Ihaka的文章。
● GNU通用公共许可证。
● 网络文档《R语言概论》。
● 网络文档《编写R语言扩展》。
● tidyverse包。
在本章,我们以较好的方式开启了R语言的学习之旅。
通过学习本章内容,读者能了解R语言这个强大的工具,包括它的起源、它具有哪些能力,以及R语言的主要优势。读者开始学习如何使用R语言,理解R语言的安装过程及其基本构建模块,如向量、列表、数据帧和函数。最后了解了R语言的主要劣势以及如何克服的方法。
在第2章,我会教授读者将R语言应用到真实的数据上,特别是读者自己的银行数据。由于接下来在第2章的学习中会涉及第1章的知识点,因此在开始第2章的学习前,请读者再花一点儿时间回顾一下本章所学到的内容。