原文:
annas-archive.org/md5/c1775cf5add79c3a9b0f4e83a2b2229d
译者:飞龙
前言
统计学是数据科学领域任何任务的绝对必要先决条件,但对于进入数据科学领域的开发人员来说,可能也是最令人生畏的障碍。本书将带你踏上从几乎一无所知到能够熟练使用各种统计方法处理典型数据科学任务的统计之旅。
本书所需的内容
本书适合那些有数据开发背景的人员,他们有兴趣可能进入数据科学领域,并希望通过富有洞察力的程序和简单的解释获得关于统计学的简明信息。只需带上你的数据开发经验和开放的心态!
本书适用对象
本书适合那些有兴趣进入数据科学领域,并希望通过富有洞察力的程序和简单的解释获得关于统计学的简明信息的开发人员。
约定
在本书中,你会发现一些文本样式,用来区分不同类型的信息。以下是一些样式示例及其含义说明。
文本中的代码词、数据库表名、文件夹名称、文件名、文件扩展名、路径名、虚拟网址、用户输入以及 Twitter 用户名等如下所示:在统计学中,boxplot
是一种简单的方法,用于获取关于统计数据集的形状、变异性和中心(或中位数)信息,因此我们将使用 boxplot
来分析数据,以查看我们是否能识别出中位数 Coin-in
以及是否有任何离群值。
代码块设置如下:
MyFile <-"C:/GammingData/SlotsResults.csv"
MyData <- read.csv(file=MyFile, header=TRUE, sep=",")
新术语和重要词汇以粗体显示。
警告或重要提示如下所示。
提示和技巧如下所示。
读者反馈
我们始终欢迎读者的反馈。告诉我们你对这本书的看法——喜欢或不喜欢的部分。读者的反馈对我们非常重要,因为它帮助我们开发出你能够真正受益的书籍。如果你想给我们提供一般性反馈,只需发送电子邮件到feedback@packtpub.com
,并在邮件主题中提及书名。如果你在某个领域拥有专业知识,且有兴趣撰写或为书籍提供贡献,请查看我们的作者指南:www.packtpub.com/authors。
客户支持
现在你已经成为一本 Packt 书籍的骄傲拥有者,我们为你提供了一些帮助,以便你最大限度地利用你的购买。
下载示例代码
你可以从你的账户下载本书的示例代码文件:www.packtpub.com
。如果你是从其他地方购买了这本书,可以访问www.packtpub.com/support
,并注册以便将文件直接通过电子邮件发送给你。你可以按照以下步骤下载代码文件:
-
使用你的电子邮件地址和密码登录或注册我们的网站。
-
将鼠标指针悬停在顶部的 SUPPORT 标签上。
-
点击代码下载与勘误。
-
在搜索框中输入书名。
-
选择你要下载代码文件的书籍。
-
从下拉菜单中选择你购买这本书的地点。
-
点击代码下载。
下载文件后,请确保使用最新版本的工具解压或提取文件夹:
-
Windows 版 WinRAR / 7-Zip
-
Mac 版 Zipeg / iZip / UnRarX
-
Linux 版 7-Zip / PeaZip
本书的代码包也托管在 GitHub 上,网址为github.com/PacktPublishing/Statistics-for-Data-Science
。我们还提供了其他来自我们丰富书籍和视频目录的代码包,网址为github.com/PacktPublishing/
。赶紧去看看吧!
下载本书的彩色图片
我们还为你提供了一份 PDF 文件,其中包含本书中使用的屏幕截图/图表的彩色图片。这些彩色图片将帮助你更好地理解输出的变化。你可以从www.packtpub.com/sites/default/files/downloads/StatisticsforDataScience_ColorImages.pdf
下载该文件。
勘误
尽管我们已尽最大努力确保内容的准确性,但错误仍然可能发生。如果你在我们的书籍中发现错误——可能是文本或代码中的错误——我们非常感谢你向我们报告。通过这样做,你不仅能帮助其他读者避免困扰,还能帮助我们改进后续版本的书籍。如果你发现了勘误,请访问www.packtpub.com/submit-errata
报告,选择你的书籍,点击“勘误提交表单”链接,填写勘误详情。一旦勘误得到验证,你的提交将被接受,并且该勘误将被上传到我们的网站或加入该书名的现有勘误列表中。要查看之前提交的勘误,请访问www.packtpub.com/books/content/support
,并在搜索框中输入书名。所需的信息将显示在勘误部分。
盗版
互联网盗版一直是各类媒体中的一个持续性问题。我们在 Packt 非常重视保护我们的版权和许可证。如果你在互联网上发现任何形式的非法复制品,请立即提供相关网址或网站名称,以便我们采取相应措施。请通过copyright@packtpub.com
与我们联系,并附上涉嫌盗版材料的链接。感谢你在保护我们的作者以及我们为你提供有价值内容的能力方面的帮助。
问题
如果你在使用本书的过程中遇到任何问题,可以通过questions@packtpub.com
与我们联系,我们将尽力解决问题。
第一章:从数据开发者到数据科学家的过渡
在本章中(以及本书的所有章节中),我们将为你规划从像数据开发者一样思考到像数据科学家一样思考的过程。
我们将使用开发者术语和类比,讨论开发者的目标,典型的开发者思维方式,如何与数据科学家的思维方式有所不同,为什么两者之间会有重要的差异(以及相似之处),并建议如何过渡到像数据科学家一样思考。最后,我们将提出理解统计学和数据科学的某些优势,从数据的角度思考,以及简单地像数据科学家一样思考。
在本章中,我们将内容分为以下几个主题:
-
数据开发者角色的目标
-
数据开发者的思维方式
-
数据开发者与数据科学家的区别
-
像数据科学家一样思考的优势
-
向数据科学家思维方式过渡的步骤
那么,让我们开始吧!
数据开发者的思维方式
在担任数据开发者角色多年之后,首先从一些关于数据开发者的简短评论开始是很有道理的。
在一些领域,数据库开发者等同于数据开发者。但无论是数据还是数据库,两者通常都会被标记为信息技术(IT)专业人员。两者都花时间从事或与数据和数据库技术打交道。
我们可能会看到一些数据库(数据)开发者之间的分歧,那些更多关注支持和常规维护(如管理员)的与那些更关注改善、扩展以及开发数据访问的(如开发者)之间的差异。
典型的数据开发者主要参与的是创建和维护对数据的访问,而不是消费这些数据。他或她会参与或做出关于选择编程语言以访问或操作数据的决策。我们会确保新的数据项目符合关于数据库如何存储和处理数据的规则,并且我们将创建数据源之间的接口。
此外,一些数据开发者还会参与审查和调优他人编写的查询,因此,他们必须精通最新的调优技术、各种查询语言,如结构化查询语言(SQL),以及如何存储和结构化所访问的数据。
总结来说,至少从数据开发者的角度来看,重点在于获取有价值的数据资源,而非消费这些有价值的数据资源。
数据开发者的目标
每个角色、职位或工作岗位都有自己的一份目标、责任或计划。
因此,作为数据开发者,可能会承担以下一些责任:
-
维护数据库和基础设施的完整性
-
监控和优化以保持响应水平
-
确保数据资源的质量和完整性
-
为用户群体提供适当的支持
-
强制执行数据资源的安全策略
作为数据科学家,你会注意到一些略有不同的目标。这个角色通常会包括这里列出的一些目标:
-
从不同来源挖掘数据
-
识别模式或趋势
-
创建统计模型——建模
-
学习和评估
-
识别洞察并进行预测
你是否注意到这里开始有一个主题了?
注意以下关键词:
-
维护
-
监控
-
确保
-
提供
-
强制执行
这些术语表达的概念与那些更与数据科学家角色相关的术语有所不同,例如以下这些:
-
挖掘
-
趋势
-
建模
-
学习
-
预测
当然,也有一些活动看起来似乎同时与数据开发人员和数据科学家相关,并将在这里进行探讨。
查询或挖掘
作为数据开发人员,你几乎总是习惯于查询数据。实际上,数据科学家也会查询数据。那么,什么是数据挖掘呢?当人们查询数据时,通常会问一个具体的问题。例如,你可能会问,四月销售了多少水仙花?并期望得到一个已知的、相关的答案,例如四月水仙花总销量为 269 株。
在数据挖掘中,人们通常更专注于数据关系(或者数据点之间的潜在关系,有时称为变量)和认知分析。一个简单的例子可能是:在四月,月平均气温如何影响水仙花的总销量?
数据查询和数据挖掘之间的另一个重要区别在于,查询通常是历史性的,因为它们用于报告过去的结果(例如四月的总销售额),而数据挖掘技术则可以是前瞻性的,通过使用适当的统计方法,它们可以推测未来的结果或提供某个结果或事件发生的概率。例如,使用我们之前的例子,我们可能会预测,当销售区域的平均气温上升时,水仙花的销量会增加。
数据质量或数据清洗
你认为数据开发人员关心数据库中数据的质量吗?当然,数据开发人员需要关心他们支持或提供访问的数据的质量水平。对于数据开发人员而言,组织内的数据质量保证(DQA)过程更具机械性,例如确保数据是最新的、完整的,并且存储在正确的格式中。
通过数据清洗,你可以看到数据科学家更加注重统计数据质量的概念。这包括利用数据中发现的关系来提高数据质量水平。例如,一个九岁的个人不应被错误地标记为美国合法驾驶员群体的一部分。
你可能听说过**数据清洗(munging)**这个术语。数据清洗有时被定义为将未专门设计为互操作的系统和接口连接在一起的过程。数据清洗还可以定义为将原始数据处理或过滤为另一种形式,以便用于特定的需求或用途。
数据建模
数据开发人员通过与关键利益相关者密切合作,根据给定的需求(如能够快速输入销售交易到组织的在线订单输入系统)来为数据创建设计(或模型)。在模型设计过程中,数据开发人员必须熟悉三种数据模型——概念模型、逻辑模型和物理模型——它们彼此相对独立。
数据科学家创建模型的目的是通过训练数据样本或群体,识别先前未知的洞察或验证当前假设。
数据建模可能变得复杂,因此,通常会看到数据开发与数据建模角色之间的区别。在这些情况下,数据开发人员专注于评估数据本身,创建有意义的报告,而数据模型师则评估如何收集、维护和使用数据。
问题或洞察
数据开发人员可能会花费大量时间监控数据、用户和环境,寻找任何可能导致性能瓶颈或停机的潜在问题的迹象,如意外的使用量水平。其他常见的职责包括审计、应用程序集成、灾难规划与恢复、容量规划、变更管理、数据库软件版本更新、负载均衡等。
数据科学家将他们的时间用于评估和分析数据以及信息,以发现有价值的新洞察。希望一旦建立了洞察,它们可以用来做出更好的商业决策。
有一个相关的概念需要理解;通过使用分析工具,人们可以在数据中识别出模式和趋势,而洞察则是通过使用分析结果获得的价值。
思维过程
某人的心理过程或认知活动,基于解释、过去的经验、推理、问题解决、想象和决策等,构成了他们的思维方式或思维过程。
我们只能猜测某些人实际会怎么想,或者他们在某一特定时刻或活动中会有什么具体想法,或者他们会采用什么样的思维过程来完成目标,但一般来说,数据开发者可能更多地关注数据的便捷性(根据需求使数据可用),而数据科学家则更注重数据的消费(寻找新的方法利用数据以发现现有问题的洞察或新机会)。
为了更清晰地描绘这一点,你可以用汽车修理工和学校辅导员的类比来说明。
一位汽车修理工将利用他的技能和适当的工具,确保汽车能为车主提供使用并保持良好的运行状态,或者如果车辆出现问题,修理工会根据症状进行诊断并修复问题。这与数据开发者的工作非常相似。
对于辅导员来说,他或她可能会审查大量关于学生过去表现、个性特征以及经济统计数据的信息,以确定该学生未来可能存在的机会。此外,辅导员还可能研究多种情境,以预测基于该学生的资源,最佳的结果可能是什么。
显然,上述两类人都提供有价值的服务,但他们使用(可能是非常不同的)不同方法和个人思维过程来产生期望的结果。
尽管存在一定的重叠,当你是数据开发者时,你的思维通常围绕着如何保持对适当数据资源的便捷访问,而不是特别关注数据的本质。也就是说,你可能关心数据类型、数据量和访问路径,但不关心是否存在或存在何种认知关系,或者数据的潜在强大用途。
在下一节中,我们将通过一些简单的情况来展示数据开发者和数据科学家之间的各种对比。
开发者与科学家
为了更好地理解数据开发者和数据科学家之间的差异,让我们花一点时间来考虑一些假设性的(但仍然现实的)情况,这些情况可能会在你的一天中发生。
新数据,新来源
当新的数据或新的数据源可用或被呈现时,会发生什么?
在这里,新的数据通常意味着更多当前的或最新的数据已经可用。一个例子是,每天早上接收到最新的本月销售交易数据文件,这通常被称为实际更新。
在商业世界中,数据可以是真实的(实际的),例如经过认证的销售数据,或在订单处理系统中输入的销售交易数据;也可以是假设的,例如组织预测未来(尚未实际发生的)销售或交易。
你可能会定期收到来自在线交易处理系统的文件,这些文件提供从本月初到当前日期的日销售额或销售数据。你希望你的业务报告能够显示包括最新销售交易在内的总销售数字。
新数据源的概念有所不同。如果我们使用之前提到的类比,其中一个例子可能是来自一个母公司新收购的公司的销售交易文件。另一个例子可能是接收报告近期在线调查结果的数据。这些信息是为了特定目的而收集的,通常并非(但可能是)例行事件。
机器数据(以及其他数据)正在不断积累,即使在你阅读本文时,也在提供新的、有趣的数据源,创造了一个数据消费市场。一个有趣的例子可能是亚马逊网络服务(aws.amazon.com/datasets/
)。在这里,你可以找到大量的公共数据资源,包括1000 基因组计划(旨在建立最全面的人类基因信息数据库)以及 NASA 的地球卫星影像数据库。
在前面的情境中,数据开发人员最有可能(应该)预期更新文件,并且已经实现了提取、转换和加载(ETL)过程来自动处理数据,处理任何异常,并确保所有相关报告反映最新的、正确的信息。数据开发人员还将处理从新收购公司过渡过来的销售文件,但可能不会成为处理调查结果(或1000 基因组计划)的主要资源。
数据科学家并不参与日常数据处理(例如销售数据),但会直接负责调查结果项目。也就是说,数据科学家几乎总是亲自参与诸如研究和获取新信息源等与调查相关的项目。数据科学家很可能会在调查设计阶段提供意见,因为他们是那些将在分析中使用数据的人。
质量问题
假设有关于组织正在消费或即将消费的数据质量的担忧。正如我们在本章前面提到的那样,数据质量问题有多种类型,例如我们所称的机械问题以及统计问题(还有其他问题)。
当前最常见的统计质量问题的趋势例子包括重复条目和拼写错误、误分类和汇总,以及含义的变化。
如果管理层对日常报告中列出的总销售额的有效性产生质疑,或者因为大部分客户在美国法律上不能开车而不信任该数据,或者组织的回头客数量正在下降,那么你就面临了质量问题:
质量对数据开发人员和数据科学家来说都是一个关注点。数据开发人员更关注时间和格式(数据的机制),而数据科学家更关注数据的统计质量(优先考虑可能影响特定研究可靠性的数据问题)。
查询和数据挖掘
历史上,信息技术组或部门经常被各种业务用户请求生成并提供报告,展示数据库和系统中存储的感兴趣的信息。
这些临时报告请求已经发展成了对按需原始数据提取的请求(而不是格式化或漂亮的打印报告),以便业务用户可以将提取的数据导入如 MS Excel(或其他工具)中,在那里他们可以进行自己的格式化和报告,或进行进一步的分析和建模。在今天的世界中,业务用户要求更多的自助服务(甚至是移动端)功能,以满足组织(或个人)的分析和报告需求,期望能够直接或通过更小、更专注的数据池访问更新的原始数据存储。
如果业务应用程序无法提供必要的报告,业务用户通常会继续他们的自助服务之旅。
-Christina Wong (www.datainformed.com)
创建临时报告和根据特定的按需需求进行提取,或者提供自助数据访问,完全由组织的数据开发人员负责。然而,请注意,数据科学家通常会定期执行自己的查询和提取——通常是他们正在进行的项目的一部分。他们可能会使用这些查询结果来确定他们需要的数据的可行性和可用性,或者作为创建特定统计项目的样本或总体过程的一部分。这种查询形式可能被认为是一种数据挖掘方式,比普通查询更深入地探讨数据。这项工作通常由数据科学家而非数据开发人员来完成。
性能
你可以打赌,几乎每个人都在关心,或将来会关心,绩效的话题。某些形式(的绩效)可能更容易量化,例如一个临时查询或数据提取完成的可接受响应时间是多少?或者,输入一个销售订单需要的总鼠标点击或键盘操作数是多少?而其他问题可能会更难回答或解决,例如为什么似乎回头客数量呈下降趋势?
数据开发人员的责任是创建并支持数据设计(甚至参与基础设施配置选项),以确保持续产生快速的响应时间,并且易于理解和使用。
一个可能令人困惑的绩效责任领域是网站性能。例如,如果一个组织的网站表现不佳,是因为某些页面加载缓慢,或内容不吸引人,或与目标受众或客户无关吗?在这个例子中,数据开发人员和数据科学家可能都被指派解决问题。
这些人——数据开发人员——不会参与调查项目。另一方面,数据科学家将不参与日常的交易性(或类似)绩效问题,而是负责与组织的利益相关者合作,定义并领导一个统计项目,旨在回答类似于关于回头客数量的问题。
财务报告
在每个组织中,都需要定期生成财务报表(如损益表、资产负债表或现金流量表)。财务报告(或财务报表)旨在回答关于业务的关键问题,诸如以下问题:
-
我们是在盈利还是亏损?
-
资产与负债相比如何?
-
我们有多少自由现金或需要多少自由现金?
创建、更新和验证定期财务报表的过程是任何规模的企业——无论是营利性还是非营利性——无论是公立还是私营企业,的强制性任务。即使今天,许多组织仍未完全使用自动化报告解决方案。这意味着,即使是更新一份报表并添加最新数据,也可能是一项艰巨的任务。
财务报告是行业内职责相对明确的一个领域。数据开发人员负责创建和支持使数据可用的处理系统,确保数据的正确性,甚至在某些情况下,创建和分发报告。
全球超过 83%的企业使用 MS Excel 进行月末结账和报告 * -venasolutions.com/
*
通常,数据开发人员会提供并维护数据,以支持这些工作。
数据科学家通常不会支持一个组织的常规处理和(财务)报告工作。然而,数据科学家会对所产生的财务信息(及其支持数据)进行分析,制作报告和可视化,展示管理层在盈利能力、效率和风险等方面的洞察(仅举几例)。
统计学和数据科学中一个特别有趣的领域是,当数据科学家执行纵向分析以识别变量与组织财务报表中基本数额之间的关系时。
可视化
今天,生产仪表板格式的可视化已成为常见做法,它可以展示更新后的个别关键绩效指标(KPI)。此外,传达特定的观点或简化大量数据的复杂性并不一定需要使用数据可视化技术,但在某些情况下,今天的世界可能要求这样做。
大多数人可能会同意,扫描大量的工作表、电子表格或报告充其量是单调乏味的,而查看图表和图形(如可视化)通常更容易让眼睛感到舒适。基于这一点,数据开发人员和数据科学家都会参与设计、创建和使用数据可视化。不同之处在于所创建的可视化类型。数据开发人员通常专注于重复数据点的可视化(例如,预测与实际数据的对比),而数据科学家则将可视化用作统计项目中的一个重要环节来表达某个观点。
再次强调,数据开发人员很可能会利用可视化来展示或突出例如销售量的变化,例如按月展示全年数据,而数据科学家则可能会使用可视化来预测明年每月的潜在销售量,考虑到季节性(及其他)统计数据。
行业工具
个人访问和消费数据所使用的工具和技术会因多种因素而有所不同,以下是一些因素:
-
业务类型
-
业务问题(或机会)类型
-
安全性或法律要求
-
硬件和软件兼容性及/或前提条件
-
数据类型和用途
-
用户群体的具体情况
-
企业政策
-
价格
在不断变化的技术环境中,数据开发人员和数据科学家面临着越来越多的选择,甚至可能是压倒性的选择,其中包括非常可行的开源选项。
开源软件是由用户社区为用户开发的。好消息是,开源软件目前在全球大多数(即 78%)企业中得到应用——Vaughan-Nichols,www.zdnet.com/
。开源在数据科学中发挥着日益重要的作用。
当我们谈论工具和技术时,数据开发人员和数据科学家都将同等参与选择最符合他们个人喜好并满足项目或目标需求的正确工具或技术。
像数据科学家一样思考的优势
那么,为什么你作为一个数据开发人员,应该努力像(或更像)数据科学家一样思考呢?理解统计学的方式及其原理有什么意义?具体来说,像数据科学家一样思考可能会带来哪些优势?
以下是支持迈向数据科学努力的几个理念:
-
培养更好的数据理解方法
-
在程序或数据库设计过程中运用统计思维
-
增加个人工具箱
-
增强市场竞争力
-
持续学习
-
看见未来
培养更好的数据理解方法
无论你是数据开发人员、系统分析师、程序员/开发人员、数据科学家,还是其他商业或技术专业人员,你都需要能够与自己所使用或设计应用程序或数据库架构的数据建立全面的关系。
有些人可能依赖于作为整体项目计划或需求一部分提供给你的数据规范,仍然有些人(通常是那些更有经验的人)可能会通过在数据上执行一些常规查询来补充他们的理解,无论哪种方式,这通常都不足够。
事实上,在行业案例研究中,不清晰、误解或不完整的需求或规范经常位列导致项目失败或增加风险的前五名原因。
数据剖析是一个过程,数据科学的特点之一,旨在建立数据亲密关系(或更清晰、简洁地掌握数据及其内部关系)。数据剖析还建立了背景,其中有多个通用的上下文类别,可以用来增加或提升数据的价值和理解,以支持任何目的或项目。
这些类别包括以下内容:
-
定义和解释:这些有助于获得数据点的附加信息或属性
-
比较:这有助于为数据中的某个数据点增加可比性
-
对比:这有助于为数据点增加一个对立面,从而查看它是否可能提供不同的视角
-
趋势:这些是典型的数学计算、汇总或聚合
-
离散度:这包括描述数据集(或数据组)平均值的数学计算(或总结),如范围、方差和标准差。
将数据分析看作是你用来检查数据文件中数据的过程,并收集关于该数据的统计信息和信息。这些统计数据很可能驱动了程序中实现的逻辑,或你如何在数据库的表中关联数据。
在程序或数据库设计过程中使用统计思维
创建数据库设计的过程通常包括多个任务,这些任务将由数据库设计师(或数据开发人员)执行。通常,设计师会执行以下任务:
-
确定哪些数据将保存在数据库中。
-
确立不同数据点之间的关系。
-
创建基于第 1 步和第 2 步的逻辑数据结构。
即使在应用程序设计过程中,彻底了解数据的工作原理也是至关重要的。如果不了解平均值或默认值、数据点之间的关系和分组等,所创建的应用程序很可能会失败。
将统计思维应用于数据设计的一个思路是在数据有限的情况下。如果无法收集足够的数据,可以通过多种抽样方法,如概率抽样,来创建样本(测试)数据。
基于概率的样本是通过构建目标人群值的列表,称为样本框架,然后通过随机化过程从样本框架中选择记录,这一过程称为选择程序。可以把它看作是基于你对实际数据的知识以及一些统计逻辑生成样本数据记录的脚本,用于测试你的设计。
最后,采用科学或统计方法来处理任何问题,成功的概率会更高。
添加到你的个人工具箱中
根据我的经验,大多数数据开发人员倾向于基于多种因素(其中一些在本章前面提到过)固定在某项技术或工具上,逐渐熟悉并(希望)更精通该产品、工具或技术——甚至是不断发布的新版本。人们可能会猜测(而且很可能是对的)开发人员使用工具的时间越长,他们建立的技能水平就会越高。然而,数据科学家似乎更多地专注于方法论、实践或概念,而不是他们用来实现这些方法的实际工具和技术。
这种焦点转移(从工具到技术)改变了一个人的思维方式,使其从“这个工具如何服务我的目标”转变为“哪个工具最能服务我的目标”。
你接触的工具越多,你作为开发者或数据科学家的思维就会变得更加广阔。开源社区提供了出色的工具,供你下载、学习并自由使用。我们应该培养一种“下一个或新事物”的思维方式,即使这种思维只是为了将新工具的特性与功能与自己偏好的工具进行对比。我们将在本章的终身学习部分进一步讨论这一点。
一个目前流行的数据开发者或数据启用工具的激动人心的例子是MarkLogic(www.marklogic.com/
)。这是一款面向企业的操作性和事务性 NoSQL 数据库,旨在整合、存储、管理和搜索比以往更多的数据。MarkLogic 获得了 2017 年 DAVIES 最佳数据开发工具奖。R 和 Python 似乎是数据科学家的首选工具。
如果不提到 IBM Watson Analytics(www.ibm.com/watson/
),这部分就不完整,因为它正在改变行业对统计或认知思维的看法。
增强市场竞争力
数据科学显然是一个不断发展的领域,且受欢迎程度呈指数级增长。事实上,如果你问一打专业人士,你很可能会得到一打关于数据科学家定义的不同回答(以及他们在项目或组织中的角色),但大多数人可能会同意数据科学家的重要性,并且一致认为如今行业内外存在着大量的机会。
数据科学家面临前所未有的需求,需要更多的模型和更多的洞察……只有一个办法可以做到:他们必须大幅加快从洞察到行动的速度。在未来,数据科学家必须变得更加高效。这是他们从数据中获取更多价值的唯一方式。
-Gualtieri www.datanami.com/2015/09/18/the-future-of-data-science/
今天,数据科学家是相对难以找到的。如果你做一些研究,你会发现今天的数据科学家通常具有数学、编程、软件设计、实验设计、工程、沟通以及管理技能等多元化的背景。实际上,你会发现大多数数据科学家并不专注于某一方面,而是具有多个领域或背景的不同程度的熟练度。
数据科学家的角色自 1200 多年前统计学领域诞生以来,已经明确发生了变化。尽管这个术语自本世纪初才出现,但它已经被贴上了“21 世纪最性感的职业”的标签,这也让这一职位的求职者排成了长队。
-Pearson
https://www.linkedin.com/pulse/evolution-data-scientist-chris-pearson
目前,还没有正式的数据科学家职位描述(或者说,没有前提条件列表)。这给了你一个机会,去创造你自己的数据科学家类型,以新的方式为你的组织提供价值。
持续学习
持续评估或持续学习的理念是一个重要的统计学概念。可以将其理解为提升感知技能的常见定义。例如,在统计学中,我们可以提到交叉验证的概念。这是一种统计方法,用于衡量(评估)统计模型的表现。该方法包括确定一组验证值,并通过运行模型若干轮(持续地),使用样本数据集,并平均每轮的结果,最终查看模型(或方法)在解决特定问题或达成目标方面的表现如何。
这里的期望是,基于性能结果,可以做出调整来微调模型,以便在使用实际数据或完整数据集时提供识别洞察的能力。这个概念不仅是数据开发者在优化或微调数据设计或数据驱动的应用流程时应当采用的做法,而且这也是一种很好的生活建议,形式是:尝试、学习、调整并重复。
模型评估的概念并不是统计学独有的。数据开发者可能会认为这类似于预测 SQL 性能的行为,或者类似于应用程序演练的做法,在这种做法中,应用程序会根据其文档化需求中的意图和目的进行验证。
看见未来
预测建模利用数据科学的统计学来预测或预见结果(实际上是一个可能的结果)。这听起来像是在算命,但更重要的是运用认知推理来解读信息(从数据中提取的)并得出结论。就像科学家通常被描述为以系统的方法获取知识或学习一样,数据科学家也可以被视为尝试利用统计学和(机器)学习来做出预测。
当我们谈论预测结果时,实际上是在谈论看到某一结果的概率。概率是用来预测未来事件发生的可能性,而统计学则涉及分析过去事件发生的频率。
如果你是一名数据开发者,可能曾参与过为财务部门提供服务的项目,那么你可能理解为什么企业领导者会认为不仅仅是报告财务结果(即使最准确的结果也仍然是历史事件)是有价值的,还应当能够对未来的表现做出有根据的假设。
也许你可以理解,如果你有金融报告方面的背景并且负责此类工作,那么你现在可以迈出一步,开始为这些报告提供统计预测!
统计建模技术也可以应用于任何类型的未知事件,不论它发生在何时,例如在犯罪侦查和嫌疑人识别的情况下。
转型为数据科学家
让我们从这一部分开始,先花点时间阐明我认为的几条关于转型为数据科学家的普遍接受的事实。我们会在本书接下来的内容中不断重申这些观点:
-
学术背景:数据科学家并不全来自某一特定学术背景。他们并非全是计算机科学或统计学/数学专业毕业的,也并非所有人都拥有高级学位(事实上,你可以通过本科学位甚至更少的学历来使用统计学和数据科学)。
-
这不是基于魔法的:数据科学家可以使用机器学习和其他公认的统计方法从数据中识别洞察,而不是依赖魔法。
-
他们并不全是技术或计算机迷:你不需要多年编程经验或昂贵的统计软件就能有效工作。
-
你不需要有经验就能开始。你可以从今天、从现在就开始。(好吧,当你买了这本书的时候,其实你已经开始了!)
好的,在做了前述声明之后,让我们也保持现实。像往常一样,生活中的一切都有一个切入点,值得称赞的是,你能够开始时获取更多的证书通常会让你更有优势。不过,正如我们在本章后面看到的那样,完全没有合理的理由阻止你立即开始理解、使用并高效地应用数据科学和统计学。
像任何职业一样,证书和学位可能为你打开大门,而经验,像往常一样,可能被认为是最好的老师。然而,世界上没有伪数据科学家,只有那些当前比实际经验更渴望的人。
如果你不仅对理解统计学和数据科学感兴趣,而且最终希望成为一名全职数据科学家,你应该考虑以下常见主题(你很可能会在数据科学家的招聘信息中看到)作为关注的重点:
-
教育:常见的学习领域包括数学和统计学,其次是计算机科学和工程学(也包括经济学和运筹学)。再次强调,这里并没有严格要求必须拥有高级或相关学位。此外,通常,学位或等效经验的概念也适用于此。
-
技术:你会听到提到 SAS 和 R(实际上,你会听到很多关于 R 的内容),以及 Python、Hadoop 和 SQL,它们被认为是数据科学家应该熟悉的关键或首选工具,但工具和技术总是在不断变化,因此,正如本章中多次提到的那样,只要数据开发人员理解数据科学的目标和各种统计方法论,就可以立即开始高效工作,而无需学习新的工具或语言。
基本的商业技能,如 Omniture、Google Analytics、SPSS、Excel 或任何其他 Microsoft Office 工具,在各个地方几乎都是默认要求,并不算优势,但如果你有编程语言(如 Java、PERL 或 C++)或数据库(如 MySQL、NoSQL、Oracle 等)的经验,确实会有帮助!
- 数据:理解数据的能力,以及处理各种类型数据特有的挑战,如非结构化数据、机器生成数据和大数据(包括组织和结构化大型数据集)。
非结构化数据是统计学和数据科学家关注的一个关键领域。它通常被描述为没有为其定义重新定义的模型,或者没有以预定的方式进行组织。非结构化信息通常以文本为主,但也可能包含日期、数字和其他各种事实。
-
求知欲:我很喜欢这个。这或许可以定义为一种性格特征,对于想成为数据科学家的人来说,这是一项有用的(如果不是必要的话)品质。这意味着你持续有想要了解更多信息的需求,而不仅仅停留在基础知识上,或者想要超越某个主题的常识(你不需要在墙上挂一张学位证书!)。
-
商业敏锐度:要成为数据开发者或数据科学家,你需要对你所在行业有深入的理解,还需要知道你的组织需要解决哪些商业问题。在数据科学领域,除了识别新方式让企业利用数据外,能够分辨哪些问题是最重要的也至关重要。
-
沟通技巧:所有公司都在寻找能够清晰流利地将自己的发现传达给非技术团队(如市场或销售部门)的人。作为数据科学家,必须能够通过为企业提供量化的洞察,帮助他们做出决策,并且理解非技术同事的需求,从而增加价值并取得成功。
我们继续前进
那么,让我们以一些轻松的(即便不是常识性的)建议来结束本章,面向那些想学习统计学并过渡到数据科学领域的数据开发者。
以下是一些建议,你应该考虑作为熟悉统计学和数据科学主题的资源:
-
书籍:仍然是学习的最佳方式!你可以从书籍中获得非常实用和详细的信息(包括例子)以及建议。很高兴你从这本书开始,但实际上有大量(而且还在不断增加)等待你去阅读的资源。
-
Google:我非常喜欢做互联网研究。你会惊讶于可以找到的开源软件库、工具、模型、样本数据、白皮书、博客等的数量和质量。很多东西可以直接下载并用来教育自己,甚至作为实际项目或交付物的一部分。
-
LinkedIn:很大比例的企业和独立招聘人员使用社交媒体,其中大多数使用 LinkedIn。这是一个了解哪些职位需求较大,以及他们需要什么样的技能和经验的机会。当你看到一些你不熟悉的职位时,做一些研究来了解该主题。此外,LinkedIn 上有大量专注于统计学和数据科学的群组。加入所有群组!与成员们建立联系——甚至可以直接向他们提问。大多数情况下,社区成员都很乐意帮助你(即使只是展示他们知道多少)。
-
志愿者工作:一个很好的方式来提升技能,继续学习,并扩展你的统计学网络,就是做志愿者。查看 http://www.datakind.org/get-involved。如果你报名成为志愿者,他们会审查你的技能,并保持联系,介绍符合你背景或你感兴趣的项目。
-
实习:有经验的专业人士可以重新报名作为实习生,测试一个新职业或进入一个新行业(www.Wetfeet.com)。虽然这对除了刚毕业的大学生之外的人来说可能不太现实,但如果你能承担减少收入(甚至无薪)一段时间以获得统计学和数据科学的实际经验,实习是可以考虑的。更实际的做法是,在自己的公司内部做数据科学学徒角色的实习,时间可以短一些或针对某个特定项目。
-
副项目:这是我最喜欢的之一。在你的组织内寻找统计学可能正在使用的机会,并要求在空闲时间参加会议或电话。如果这不可能,寻找统计学和数据科学可能解决问题或应对挑战的场景,并将其作为一个业余项目在空闲时间进行。这类项目风险较低,因为没有截止日期,而且如果一开始没有成功,也不算世界末日。
-
数据:帮助你顺利过渡到统计学和数据科学的最简单方法之一,可能就是接触更多种类的数据,尤其是非结构化数据和大数据。此外,探索其他行业或应用的数据也是很有帮助的。
-
Coursera 和 Kaggle:Coursera 是一个在线网站,您可以在该网站上支付费用参加 大规模在线开放课程(MOOCs)并获得证书,而 Kaggle 举办数据科学竞赛,您不仅可以在与其他成员的竞争中评估自己的能力,还可以访问大量的、非结构化的大数据文件,这些文件可能更像您在实际统计项目中使用的文件。
-
多元化:为了增加您分析技能的可信度(因为许多公司每天都在采用各种新工具),例如 R、Python、SAS、Scala(当然还有)SQL 等,如果您花时间学习尽可能多的工具和技术,您将具有显著的优势。除了这些主流的数据科学工具外,您还可以研究一些新兴工具,如 Paxada、MatLab、Trifacta、Google Cloud Prediction API 或 Logical Glue。
-
询问招聘人员:在转型初期花时间与招聘人员建立关系将带来许多好处,信任的招聘人员可以传递目前需求技能的列表以及哪些统计实践最受欢迎。此外,随着您积累经验和信心,招聘人员可以帮助您专注或微调您的经验,向那些可能在远期出现的具体机会发展,这可能会使您在其他候选人中占据优势。
-
在线视频:查看 YouTube 上的网络研讨会和教程视频。无论何时您的时间允许,您都可以观看来自业余爱好者和专业人士的无数资源。
总结
在本章中,我们勾画了数据库(或数据)开发人员如何在日常工作中以解决问题为基础进行思考,比较了数据开发人员和数据科学家的思维方式,并通过各种实际例子进行了说明。
我们还列出了作为数据科学家的思维方式的一些优势,并最终讨论了您在理解统计学并进入数据科学领域时需要关注的常见主题。
在下一章中,我们将介绍并解释(再次从开发者的角度)数据科学统计学背后的基本目标,并向您介绍本书中使用的、带有易于理解的解释和示例的重要术语和关键概念。
第二章:声明目标
本章介绍并解释了(再次从开发者的角度)数据科学统计学的基本目标,并向读者介绍了书中使用的关键术语和概念(带有解释和示例)。
在本章中,我们将内容拆解为以下几个主题:
-
数据科学的关键目标入门
-
将统计学引入数据科学
-
统计学和数据科学中常用的术语
数据科学的关键目标
如第一章中所提到的,从数据开发者到数据科学家的过渡,数据科学如何定义是一个主观问题。
我个人喜欢的解释是,数据科学是思想或步骤的进程,甚至更好的是,它是一个演变过程,如下图所示:
这种数据科学的演变(如前图所示)由一系列步骤或阶段组成,数据科学家在其中跟踪进展,包括以下内容:
-
数据收集
-
数据处理
-
探索和可视化数据
-
数据分析和/或应用机器学习(于数据)
-
基于获得的见解做决策(或规划)
尽管“进展”或“演变”暗示了一个顺序性的旅程,但在实践中,这是一个非常流动的过程;每个阶段都可能激发数据科学家反向并重复一个或多个阶段,直到他们感到满意。换句话说,过程中的所有或部分阶段可能会被重复,直到数据科学家认为已达成期望的结果。
例如,在仔细审查生成的可视化图表后(在探索和可视化数据阶段),可能会发现需要对数据进行额外处理,或者在进行任何合理的分析或学习之前,需要收集更多的数据。
你可以大致将数据科学过程与敏捷软件开发方法论进行比较,在这种方法中,开发者执行各种任务,分析结果,继续工作,重新审视工作,直到获得期望的结果或成果。
让我们解释数据科学演变的每一个阶段。
数据收集
这一点应该是显而易见的——没有(至少一些)数据,我们无法执行任何后续步骤(尽管有人可能会争论推断问题,但那是不合适的。数据科学中没有魔法。我们,作为数据科学家,不是从任何东西中创造出东西。推断(我们将在本章稍后定义)至少需要一些数据作为起点。
收集数据的一些新概念包括数据可以来自各种来源,数据源的数量和类型每天都在增长。此外,数据的收集方式可能需要数据开发者一种全新的视角;数据科学中的数据并不总是来自关系型数据库,而是来自机器生成的日志文件、在线调查、性能统计等;再次强调,这个列表仍在不断发展。
另一个值得思考的点是,收集数据也涉及补充。例如,数据科学家可能会发现需要为先前收集、处理和审核过的特定应用数据池添加额外的群体统计数据。
处理数据
数据的处理(或转换)是数据科学家编程技能发挥作用的地方(尽管你通常可以看到数据科学家在其他步骤中执行某种形式的处理,例如收集、可视化或学习)。
请记住,数据科学中涉及的处理方面有很多。最常见的包括格式化(和重新格式化),其涉及的活动如机械地设置数据类型、汇总值、重新排序或删除列等;数据清理(或处理数据质量),解决诸如默认值或缺失值、不完整或不合适的值等问题;以及数据分析,生成统计性的数据理解,为数据提供背景信息。
对数据进行的处理可以是简单的(例如,可能是一个非常简单且手动的事件,需要对 MS Excel 工作表中的数据进行重复更新),也可以是复杂的(如使用 R 或 Python 等编程语言),甚至更复杂(例如,当处理逻辑被编写到程序中时,这些程序可以被调度,并在新的数据群体上自动重新运行)。
探索与可视化数据
在整体数据科学流程的这一阶段或步骤中,数据科学家将使用各种方法深入挖掘数据。通常,会创建几个图形化的表示(再次强调,这些可能是手动完成的,也可能是通过编程脚本或工具生成的),以强调或验证数据科学家的观察、某个特定的观点或信念。这是数据科学流程中的一个重要步骤,因为数据科学家可能会意识到数据需要进一步处理,或者需要收集更多的数据,亦或是原始理论似乎得到了验证。这些发现将促使数据科学家停下来,反思接下来的步骤。数据科学家是否应该继续正式的分析过程,或许是创建一个自动化学习的预测模型?还是应该回到之前的步骤,收集更多(或不同的)数据进行处理?
数据可视化是一项关键技术,它使数据科学家能够快速执行分析,识别关键趋势或事件,并做出更有信心的决策。
分析数据和/或将机器学习应用于数据
在这一阶段,数据科学家(受到强烈的科学好奇心和经验驱动)会进行大量分析,试图基于观察或对数据理解的解释,构建一个故事。数据科学家继续切分和分析数据,使用分析或商业智能工具(如 Tableau、Pentaho,或者使用开源解决方案如 R 或 Python),创建具体的数据故事线。再次根据这些分析结果,数据科学家可能会选择返回到先前的阶段,提取新数据,进行处理和再处理,并创建额外的可视化效果。到了某个阶段,当进展适当时,数据科学家可能会决定开始数据分析。机器学习(将在本章后续详细定义)随着时间的推移,已从最初的模式识别演变为现在使用选定的统计方法深入挖掘,利用数据及本阶段分析的结果进行学习并做出预测。
数据科学家通过机器学习从数据中提取定量结果,并将其以每个人(不仅仅是其他数据科学家)能够立即理解的方式表达出来,这是一个宝贵的技能,我们将在本书中进一步探讨这一点。
基于获得的洞察做决策(或规划)
在此步骤中,数据科学家希望通过努力获得价值,并以洞察的形式呈现出来。通过执行之前描述的阶段,获得对特定情况或现象的理解,从而得到这个洞察。这个洞察随后可以作为输入,用于做出更好的决策。
一个有趣的例子,展示了从数据中挖掘洞察并创造性使用的过程,就是由 IBM Watson 支持的(截至本文撰写时,仍为实验性)Roztayger 人格匹配过程。使用你的 Facebook 或 Twitter 动态(或者你也可以输入简短的个人简介),Watson 会即时对你的个性进行分析。结果既有趣又非常精准,这些洞察随后被用来推荐最适合你及你个人风格的设计师品牌。
你可以在roztayger.com/match
找到这个功能。个性洞察服务根据一个人的写作方式提取个性特征。你可以使用该服务将个体与其他个体、机会和产品进行匹配,或通过个性化信息和推荐来定制他们的体验。特征包括大五人格特质、价值观和需求。建议使用至少 1,200 个字的输入文本。
一旦(实时)数据科学分析完成,前述网站不仅提供建议,还分享其洞察背后的数据,以易于理解、条理清晰的表格视图展示结果,同时也提供引人注目的可视化效果,如下图所示:
这展示了数据科学进展阶段的另一个关键方面,也就是,一旦数据科学家识别出某个洞察,他们必须清晰地展示和传达这些数据洞察/发现。
像数据科学家一样思考
正如我们之前强调的,数据科学家的定义和职责的共识仍在逐步形成。数据科学领域的整体定义至多是粗略的。转型为数据科学家的过程,也许更像是寻找一个与自己技能匹配的组织或团队,而不仅仅是理解数据科学所涉及的技能和概念,并朝着这些技能努力。
就像数据开发人员保持对数据操作和访问趋势及工具的了解一样,未来的数据科学家也应该如此。
将统计学引入数据科学
根据你的来源和个人信念,你可能会说以下内容:
统计学就是数据科学,数据科学就是统计学。
为了澄清这一点,请注意有一种流行的观点认为,统计学可以被视为一个涵盖数据收集、分析、解释、展示和组织的研究或过程。正如你所看到的,这一定义与我们在本章上一节中描述的数据科学过程非常相似。
深入探讨这个话题,我们会发现统计学总是涉及(或包含)一些技术或方法,用于帮助分析和展示数据(同样,这种理解也可以用来描述数据科学)。
在一些圈子里,人们普遍认为数据科学和统计学是同义词。当然,数据科学家之间对术语和概念的统一仍在不断演进。
常见术语
根据个人经验、研究以及各行各业专家的建议,深入学习数据科学的人应该抓住每一个机会,理解并积累以下常见数据科学术语的经验和熟练度:
-
统计学总体
-
概率
-
假阳性
-
统计推断
-
回归
-
拟合
-
分类数据
-
分类
-
聚类
-
统计比较
-
编码
-
分布
-
数据挖掘
-
决策树
-
机器学习
-
数据清洗和整理
-
可视化
-
D3
-
正则化
-
评估
-
交叉验证
-
神经网络
-
提升
-
提升率
-
众数
-
异常值
-
预测建模
-
大数据
-
置信区间
-
写作
统计总体
你或许可以将统计总体看作一个记录集(或一组记录)。这组记录将包含一些类似的项目或事件,数据科学家对此感兴趣,用于某些实验。
对于数据开发人员来说,数据总体可能是某个月份的所有销售交易记录,而关注点可能是向公司高层报告哪些产品是最快的畅销产品,以及在一年中的哪个时间段。
对于数据科学家来说,总体可能是某个月所有急诊室入院的记录,而关注点可能是确定急诊室使用的统计人口特征。
通常,统计总体和统计模型这两个术语可以互换使用。再次强调,数据科学家们在使用这些常用术语时不断发展和统一。
另一个关于统计总体的关键点是,记录集可能是一个(实际上)存在的对象组,或者是一个假设的对象组。以之前的例子为例,实际对象可以是该月记录的实际销售交易,而假设对象则是预计、预测或假定(基于观察或经验假设或其他逻辑)将在一个月内发生的销售交易。
最后,通过使用统计推断(将在本章后面解释),数据科学家可以选择记录集(或总体)的一部分或子集,目的是使其代表某一特定领域的总总体。这个子集被称为统计样本。
如果准确地选择了一个总体样本,可以根据样本的相应特征估算整个总体(该样本所来自的总体)的特征。
概率
概率关注的是支配随机事件的法则。
-www.britannica.com
在思考概率时,你会想到可能发生的事件以及它们实际上发生的可能性。这与统计思维过程相比较,后者涉及分析过去事件的频率,以试图解释或理解观察到的现象。此外,数据科学家还会关联各种个体事件,研究这些事件之间的关系。这些不同事件之间的关系决定了我们在研究它们的概率时需要遵循的方法和规则。
概率分布是一个表格,用于显示样本总体或记录集中的各种结果的概率。
假阳性
假阳性的概念是一个非常重要的统计学(数据科学)概念。假阳性是一个错误或失误的结果。也就是说,这是一个场景,其中过程或实验的结果表明条件已满足或为真,但实际上该条件并不成立(未满足)。这种情况也被一些数据科学家称为假警报,最容易理解的是考虑记录集或统计总体的概念(我们在本节前面讨论过),它不仅由处理的准确性决定,还由所抽取样本总体的特征决定。换句话说,数据科学家在统计过程中犯了错误,或者记录集是一个没有适当样本(或特征)的总体,无法满足正在研究的条件。
统计推断
哪个开发者在职业生涯中某个时刻没有创建过样本或测试数据?例如,我常常会创建一个简单的脚本来生成一个随机数(基于可能的选项或选择的数量),然后将这个数字作为选中的选项(在我的测试记录集中)。这在数据开发中可能运作得很好,但在统计学和数据科学中,这是不够的。
为了创建样本数据(或样本总体),数据科学家将使用一个叫做统计推断的过程,这个过程通过分析你拥有或尝试生成的数据来推断潜在分布的选项。这个过程有时也称为推断统计分析,包括测试各种假设并得出估计值。
当数据科学家确定记录集(或总体)应比实际更大时,假设该记录集是来自更大总体的样本,数据科学家会利用统计推断来弥补差距。
正在使用的数据或记录集被数据科学家称为观测数据。推断统计学可以与描述性统计学进行对比,后者仅关注观测数据的属性,并不假设记录集来自更大的总体。
回归
回归是一个过程或方法(由数据科学家根据当前实验的需要选定为最佳拟合技术),用于确定变量之间的关系。如果你是程序员,你对变量有一定的理解,但在统计学中,我们对这个术语的使用有所不同。变量被判定为依赖变量或独立变量。
独立变量(也称为预测变量)是数据科学家操控的变量,目的是确定它与依赖变量的关系。依赖变量是数据科学家正在测量的变量。
在数据科学的进程或实验中,出现多个自变量并不罕见。
更准确地说,回归是一个帮助数据科学家理解当一个或多个自变量变化时,而其他自变量保持固定时,因变量(或标准变量)的典型值如何变化的过程。
拟合
拟合是衡量统计模型或过程如何描述数据科学家关于记录集或实验的观察结果的过程。这些度量将试图指出观察值和可能值之间的差异。模型或过程的可能值称为分布或概率分布。
因此,概率分布拟合(或分布拟合)是指数据科学家将概率分布拟合到关于变量现象重复测量的一系列数据上。
数据科学家进行分布拟合的目标是预测某一现象在特定时间间隔内发生的概率或预测其发生频率。
拟合的一个常见用途是测试两个样本是否来自相同的分布。
数据科学家可以选择的概率分布有很多种。一些分布比其他分布更适合观察到的数据频率。拟合得较好的分布应该能做出好的预测;因此,数据科学家需要选择适合数据的分布。
分类数据
之前,我们解释了数据中的变量可以是自变量或因变量。另一种变量定义是分类变量。这种变量是指可以取有限且通常固定的可能值之一,从而将每个个体分配到特定类别。
经常情况下,收集到的数据含义不明确。分类数据是数据科学家可以用来为数据赋予含义的一种方法。
例如,如果收集了一个数值变量(假设发现的值为 4、10 和 12),如果这些值被分类,变量的含义就会变得清晰。假设根据对数据收集方式的分析,我们可以通过指明这些数据描述的是大学生,并且以下是运动员的数量:
-
4 名网球运动员
-
10 名足球运动员
-
12 名足球运动员
现在,因为我们将数据分组为类别,含义变得清晰。
其他一些分类数据的例子可能是个人宠物偏好(按宠物类型分组),或汽车拥有情况(按所拥有的汽车类型分组)等等。
因此,分类数据,顾名思义,是将数据分组到某种类别或多个类别中。一些数据科学家将类别称为数据的子人群。
分类数据也可以是收集的是“是”或“否”的答案。例如,医院接纳数据可能表明患者是否吸烟。
分类
数据的统计分类是识别数据点、观测值或变量应归入哪个类别(在前一部分讨论过)的过程。执行分类过程的数据科学过程被称为分类器。
判断一本书是小说还是非小说是一个简单的分类例子。对餐馆数据的分析可能会将它们分类为多个类型。
聚类
聚类是将数据出现的实例划分为组或同质子集的过程,不同于分类(如前一部分所述)中预设的组,而是通过执行数据科学过程,基于它在实例中发现的相似性来识别的组。
位于同一组中的对象(该组也称为簇)被发现比与其他组中的对象(或其他簇中的对象)相比更为相似(在某种程度上)。聚类过程在探索性数据挖掘中非常常见,也是统计数据分析中的常用技术。
统计比较
简而言之,当你听到统计比较这个术语时,通常指的是数据科学家执行分析过程,以查看两个或多个组或种群(或记录集)之间的相似性或差异。
作为数据开发人员,可能熟悉各种工具,如 FC Compare、UltraCompare 或 WinDiff,它们旨在为开发人员提供两个或更多文件(甚至二进制文件)内容的逐行比较。
在统计学(数据科学)中,这一比较过程是一种统计技术,用于比较种群或记录集。在这种方法中,数据科学家将执行所谓的方差分析(ANOVA),比较分类变量(在记录集内)等。
ANOVA 是一种统计方法,用于分析组均值之间的差异及其相关过程(例如组间、组内或记录集之间的变异)。该方法最终演变为六西格玛数据集比较。
编码
编码或统计编码是数据科学家在准备数据进行分析时使用的过程。在这个过程中,定量数据值(如收入或教育年限)和定性数据(如种族或性别)都以一致的方式进行分类或编码。
数据科学家进行编码的原因有多种,具体如下:
-
更有效地运行统计模型
-
计算机理解变量
-
责任制——使数据科学家能够盲目地运行模型,或者在不知晓变量代表什么的情况下运行,以减少编程/作者偏见。
你可以将编码过程视为将数据转化为系统或应用所需形式的手段。
分布
统计记录集(或人口)的分布是一个可视化,展示数据的所有可能值(或有时称为区间)及其发生频率。当数据科学家创建分类数据的分布(我们在本章前面定义过的分类数据)时,试图展示每个组或类别中的个体数量或百分比。
将之前定义的术语与此术语“概率分布”联系起来,简单来说,概率分布可以被看作是一个可视化图,展示在实验中不同可能结果发生的概率。
数据挖掘
在第一章《从数据开发者到数据科学家》中,我们提到,数据挖掘通常更专注于数据关系(或数据点之间的潜在关系,有时称为变量)和认知分析。
为了进一步定义这一术语,我们可以提到,数据挖掘有时更简单地被称为知识发现,甚至仅称为发现,基于从新的或不同的视角处理或分析数据,并将其总结为可用于增加收入、削减成本或两者兼得的有价值的见解。
使用专门的用于数据挖掘的软件只是数据挖掘几种分析方法之一。尽管有专门的工具(如 IBM Cognos BI 和 Planning Analytics、Tableau、SAS 等),数据挖掘的核心是通过分析过程发现数据中的字段之间的相关性或模式,这可以通过 MS Excel 或其他许多开源技术有效完成。
数据挖掘的一种常见技术是通过使用如 R 或 Python 之类的工具创建自定义脚本。通过这种方式,数据科学家能够根据项目的具体需求定制逻辑和处理过程。
决策树
统计决策树使用一种看起来像树的图示结构。这种结构试图表示可选的决策路径以及每个选定路径的预测结果。数据科学家将使用决策树来支持、跟踪和建模决策制定及其可能的后果,包括偶然事件结果、资源成本和效用。这是一种常见的数据科学过程逻辑展示方式。
机器学习
机器学习是数据科学中最具吸引力和令人兴奋的领域之一。它唤起了与人工智能相关的各种形象,包括神经网络、支持向量机(SVM)等。
从根本上说,我们可以将机器学习这一术语描述为一种训练计算机的方法,通过数据或更具体地说,数据中的关系来做出或改善预测或行为。继续来说,机器学习是一个基于在数据中识别到的模式进行预测的过程,并且它具有从数据模式中持续学习的能力,因此能够不断做出更好的预测。
有人将机器学习的过程误认为数据挖掘并不罕见,但数据挖掘更多地侧重于探索性数据分析,并被称为无监督学习。
机器学习可以用来学习并建立各种实体的基线行为特征,然后寻找有意义的异常情况。
这里是激动人心的部分:机器学习的过程(使用数据关系做出预测)被称为预测分析。
预测分析使数据科学家能够通过从历史关系和数据中的趋势中学习,做出可靠的、可重复的决策和结果,并揭示隐藏的见解。
数据清洗和整理
数据清洗和数据整理这两个术语是时髦词或行话,旨在描述某人在某种程度上对数据、记录集或文件格式进行调整的努力,以便为后续的处理和/或评估做准备。
在数据开发中,您很可能已经熟悉了提取、转换和加载(ETL)的概念。在某种程度上,数据开发人员可能会在 ETL 过程中的转换步骤中对数据进行清洗或整理。
常见的数据清洗和整理可能包括去除标点符号或 HTML 标签、数据解析、过滤、各种转换、映射,以及将不专门设计为互操作的系统和接口结合起来。数据清洗还可以描述将原始数据处理或过滤成另一种形式,以便在其他地方更方便地使用。
数据清洗和整理可能在数据科学过程中多次执行,或者在不断发展的过程中不同的步骤中进行。有时,数据科学家使用数据清洗来包括各种数据可视化、数据聚合、训练统计模型以及其他许多潜在的工作。至此,数据清洗和整理可能遵循一个流程,从提取原始数据开始,使用各种逻辑进行数据清洗,最后将结果内容放入结构中以供使用。
虽然有许多有效的选项可以进行数据清洗和整理、预处理和操作,但目前许多数据科学家喜爱的工具是名为Trifecta的产品,它声称是许多行业中排名第一的数据整理解决方案。
Trifecta可以从www.trifacta.com/
下载进行个人评估。去看看吧!
可视化
使用数据可视化技术的主要目的是让复杂的内容看起来简单(尽管还有其他目标)。你可以把可视化看作是任何一种创建图形(或类似的方式)以传达信息的技术。
使用数据可视化的其他动机包括以下几点:
-
解释数据或将数据置于上下文中(即突出显示人口统计统计信息)
-
解决特定问题(例如,识别特定商业模型中的问题领域)
-
探索数据以更好地理解或增加清晰度(例如,这些数据跨越了哪些时间段?)
-
突出或说明那些无法直接看见的数据(例如,隔离数据中的异常值)
-
进行预测,例如潜在的销售量(可能基于季节性销售统计数据)
-
以及其他
统计可视化几乎应用于数据科学过程中的每一个步骤,包括显而易见的步骤如探索和可视化、分析和学习,但也可以在收集、处理以及使用识别出的洞察力的最终阶段发挥作用。
D3
D3 或D3.js
本质上是一个开源的 JavaScript 库,旨在使用现代网络标准可视化数据。D3 通过使用可缩放矢量图形(SVG)、Canvas 和标准 HTML 来帮助赋予数据生命。
D3 结合了强大的可视化和交互技术,并采用基于数据的 DOM 操作方法,为数据科学家提供了现代浏览器的全部功能,并且有自由设计出最佳视觉界面的能力,以最准确地展现目标或假设。
与许多其他库不同,D3.js
允许对数据可视化进行极高的控制。D3 嵌入在 HTML 网页中,并使用预构建的 JavaScript 函数选择元素、创建 SVG 对象、设置样式、或添加过渡、动态效果等。
正则化
正则化是数据科学家用来改善统计模型或数据科学过程生成的结果的一种可能方法,尤其是在处理统计学和数据科学中的过拟合问题时。
我们在本章之前定义了拟合(拟合描述了统计模型或过程如何很好地描述数据科学家对观察结果的解释)。过拟合是一种情况,在这种情况下,统计模型或过程似乎拟合得过于完美,或者看起来与实际数据过于接近。
过拟合通常发生在一个过于简单的模型中。这意味着你可能只有两个变量,并且根据这两个变量得出结论。例如,使用我们之前提到的水仙花销售的例子,可能会生成一个以温度为自变量,以销售为因变量的模型。你可能会看到该模型失败,因为简单地得出温暖的天气总是带来更多的销售并不成立。
在这个例子中,通常会通过向过程或模型中添加更多数据来希望获得更好的结果。这个想法听起来是合理的。例如,你有一些信息,如平均降水量、花粉计数、化肥销售量等;这些数据点可以作为解释变量添加进来吗?
解释变量是一种独立变量,但有着微妙的区别。当一个变量是独立的时,它完全不受任何其他变量的影响。当一个变量不完全独立时,它就是一个解释变量。
继续向模型中添加更多数据会产生一定效果,但可能会导致过拟合,导致预测结果不准确,因为它会与数据高度相似,而这些数据大多只是背景噪声。
为了克服这种情况,数据科学家可以使用正则化,引入一个调节参数(附加因素,如数据点的均值或最小/最大限制,使你能够改变模型的复杂度或平滑度),以解决不适定问题或防止过拟合。
评估
当数据科学家评估一个模型或数据科学过程的性能时,这被称为评估。性能可以通过多种方式定义,包括模型学习的增长,或模型通过额外经验(例如更多轮训练以及更多数据样本)来改进学习的能力(以获得更好的分数),或结果的准确性。
评估模型或过程性能的一个流行方法被称为自助法抽样。这种方法通过反复生成结果,来检查在特定数据子集上的表现,这些结果可以用来计算准确度(性能)的估算值。
自助法抽样方法(bootstrap sampling)从数据中随机抽取样本,将其分成三个文件——训练文件、测试文件和验证文件。模型或过程逻辑是基于训练文件中的数据开发的,然后使用测试文件进行评估(或测试)。这个“调优然后测试”的过程会重复进行,直到数据科学家对测试结果感到满意。到那时,模型或过程会再次进行测试,这次使用的是验证文件,结果应该能真实反映其表现如何。
你可以想象使用自助法抽样
方法通过分析测试数据来开发程序逻辑,确定逻辑流程,然后将你的逻辑与测试数据文件进行对比测试。一旦你确信你的逻辑处理了测试数据中的所有条件和异常,你可以对一个新的、未曾见过的数据文件进行最终验证测试。
交叉验证
交叉验证是一种评估数据科学过程性能的方法。主要用于预测建模,以估计模型在实际中的表现准确性,交叉验证通常用于检查模型如何潜在地进行泛化,换句话说,就是模型如何将从样本中推断出的信息应用到整个群体(或记录集)上。
在交叉验证中,你需要确定一个(已知的)数据集作为验证数据集,在这个数据集上进行训练,并使用一个未知数据集(或首次出现的数据)对模型进行测试(这就是你的测试数据集)。其目的是确保诸如过拟合(允许不完全的信息影响结果)等问题得到控制,同时提供有关模型如何在实际问题或实际数据文件上进行泛化的洞察。
交叉验证过程将包括将数据划分为相似子集的样本,对一个子集(称为训练集)进行分析,并在另一个子集(称为验证集或测试集)上验证分析结果。为了减少变异性,交叉验证会进行多次迭代(也称为折叠或轮次),使用不同的划分方式,验证结果会在多个轮次中求平均。通常,数据科学家会利用模型的稳定性来确定应执行多少轮交叉验证。
神经网络
神经网络也被称为人工神经网络(ANNs),其目标是以与人类大脑相同的方式解决问题。
Google 将在《神经网络入门:第一部分,Maureen Caudill,AI 专家,1989 年 2 月》中提供以下关于 ANN 的解释:
一个计算系统由多个简单且高度互联的处理元素组成,这些处理元素通过对外部输入的动态状态响应来处理信息。
为了简化神经网络的概念,可以回想一下软件封装的概念,考虑一个包含输入层、处理层和输出层的计算机程序。理解这一点后,你会明白,神经网络也组织成这些层的网络,通常不止一个处理层。
模式通过输入层呈现给网络,随后传递给一个或多个处理层(实际处理发生的地方)。处理层再与输出层相连接,结果在此呈现。
大多数神经网络还会包含某种形式的学习规则,通过该规则根据所呈现的输入模式修改连接的权重(换句话说,网络会学习哪些处理节点表现更好,并给予其更大的权重)。通过这种方式(从某种意义上说),神经网络像孩子通过接触猫的例子来学习识别猫一样,通过示例进行学习。
提升法
可以说,提升是数据科学中普遍接受的一种过程,用于提高弱学习数据科学过程的准确性。
被定义为弱学习者的数据科学过程是指那些产生的结果仅比随机猜测的结果略好。弱学习者基本上是阈值或单层决策树。
具体来说,提升的目标是在监督学习中减少偏差和方差。
我们所说的偏差和方差是什么意思?在进一步讨论提升之前,让我们先了解一下偏差和方差的含义。
数据科学家将偏差描述为在数据收集过程中存在的一种偏爱程度,导致结果不均衡、不真实,并且可能以多种不同的方式发生。如果一个采样
方法系统地偏向某些结果而非其他结果,则称该方法为有偏的。
方差可以简单地定义为一个变量均值的距离(或者结果距离平均值的远近)。
提升方法可以描述为数据科学家反复执行数据科学过程(该过程已被确定为弱学习过程),每次迭代都使用从原始总体记录集随机抽取的不同数据样本。每次运行产生的所有结果(或分类器或残差)随后会被合并为一个单一的合并结果(即梯度)。
每次迭代使用原始记录集的随机子集这一概念,源自于袋装法中的自助采样,并对合并模型具有类似的方差降低效果。
此外,一些数据科学家认为提升是将弱学习者转化为强学习者的一种方式;事实上,对于某些人来说,提升过程仅仅意味着将弱学习者转化为强学习者。
提升
在数据科学中,“提升”(lift)一词用于比较记录集或总体中观察到的模式的频率与通过随机或偶然方式在数据中出现该模式的预期频率。
如果提升值非常低,那么通常,数据科学家会认为识别出的模式很可能只是偶然发生的。提升值越大,模式越有可能是真实的。
众数
在统计学和数据科学中,当数据科学家使用“众数”一词时,他或她指的是在数据样本中出现频率最高的值。众数不是通过计算得到的,而是通过手动确定或通过处理数据来确定的。
异常值
异常值可以定义如下:
-
与其他数据点差异极大的数据点
-
那些不符合其他数据点的异常数据
-
一个非常高的值或非常低的值
-
数据中的异常观察
-
与其他所有数据点相距较远的观察点
预测建模
统计模型和/或数据科学过程的发展,旨在预测未来事件,称为预测建模。
大数据
再次提到,我们对于大数据的定义有所不同。大数据通常被定义为数据量庞大或复杂,以至于传统的数据处理应用无法胜任,并且涉及我们生活的各个方面。2001 年,时任 Gartner 分析师的 Doug Laney 提出了 3V 概念。
根据 Laney 的定义,3V 是体积、种类和速度。3V 构成了大数据的维度:体积(或数据的可衡量数量)、种类(即数据的类型数量)和速度(指处理或处理数据的速度)。
置信区间
置信区间是数据科学家在估算值周围指定的一系列值,用于表示他们的误差范围,并结合一个概率,表示某个值落入该范围的可能性。换句话说,置信区间是对未知总体参数的良好估计。
写作
尽管在展示数据科学过程或预测模型的输出或结果时,可视化通常更为引人注目,但写作技巧仍然是数据科学家交流的重要部分,而且仍然被认为是所有数据科学家成功的关键技能。
总结
在这一章中,我们提到,当前数据科学的定义是一个意见问题。一个实际的解释是,数据科学是思想的一种进展,甚至更好地说,是一种演变,包括收集、处理、探索和可视化数据,分析(数据)和/或应用机器学习(到数据中),然后基于获得的洞察做出决策(或规划)。
接着,为了让你像数据科学家一样思考,我们介绍并定义了一些数据科学家应该熟悉的常见术语和概念。
在下一章中,我们将介绍并解释数据开发人员如何使用几种常见的统计方法理解和处理数据清洗的主题。
第三章:开发人员如何处理数据清理
本章讨论了开发人员如何运用几种常见的统计方法理解并处理数据清理这一话题。
本章我们将内容分为以下几个话题:
-
理解基础数据清理
-
使用 R 检测和诊断常见的数据问题,例如缺失值、特殊值、离群值、不一致性和本地化问题
-
使用 R 解决高级统计问题,例如数据转换、推导修正和确定性填补
理解基础数据清理
在任何统计项目中,拥有干净(因此可靠)的数据至关重要。脏数据,即使在正确的统计实践下,也可能是不可靠的,可能导致得出错误的行动建议,甚至可能造成伤害或经济损失。曾有人指出,数据科学家几乎 90%的时间都花在清理数据上,只有 10%的时间用于实际建模和从数据中得出结果。
那么,数据清理到底是什么呢?
数据清理也称为数据清洗或数据去污,涉及到检测和解决数据集中的错误、遗漏和不一致性问题。
这可以通过数据整理工具进行交互式处理,或者通过脚本批量处理。本书将使用 R 语言,因为它非常适合数据科学,能够处理非常复杂的数据集,支持通过各种建模功能对数据进行处理,甚至可以通过几行代码生成可视化数据,来证明理论和假设。
在清理过程中,首先使用逻辑来检查和评估数据池,以建立数据的质量水平。数据质量的高低可以受到数据录入、存储和管理方式的影响。清理过程可能涉及纠正、替换或直接删除数据点或整个实际记录。
清理过程不应与验证过程混淆,它们是不同的。验证过程通常在数据捕获时(即录入时)进行,是一个通过或不通过的过程,而不是在数据处理后,为某个特定目的进行的操作。
作为数据开发人员,不应对数据清理的概念或提升数据质量的重要性感到陌生。数据开发人员还会同意,数据质量的处理过程需要定期的常规评审和评估,实际上,大多数组织都有企业级工具和/或流程(或者至少有相关政策)来定期预处理和清理企业数据。
如果你感兴趣的话,市面上有许多免费的和付费的工具可以尝试,包括 iManageData、Data Manager、DataPreparator(Trifecta)Wrangler 等。从统计学的角度来看,最受欢迎的选择包括 R、Python 和 Julia。
在你处理数据中的具体问题之前,你需要先检测到它们。检测这些问题要求你根据目标的背景,确定什么可以被视为问题或错误(后面这一节会有更多的内容)。
常见的数据问题
我们可以将数据难题分为几个组。最普遍接受的(数据问题)分类包括:
-
准确性:数据不准确有很多种类型,最常见的例子包括数学错误、超出范围的值、无效值、重复等。
-
完整性:数据源可能会缺少某些列的值,缺少整列数据,甚至缺少完整的交易。
-
更新状态:作为质量保证的一部分,你需要建立数据刷新或更新的节奏,并且能够判断数据最后一次保存或更新的时间。这也被称为延迟。
-
相关性:这涉及识别并消除在特定目标下不需要或不相关的信息。例如,如果你的研究目标是个人护理产品,那么去除关于腌黄瓜的销售交易就是一个例子。
-
一致性:通常需要交叉参考或转换数据源中的信息。例如,记录的病人调查反馈可能需要转换为一个一致的指标,以便以后简化处理或可视化。
-
可靠性:这主要关注确保数据收集方法能产生一致的结果。常见的数据保障流程包括建立基准线和范围,然后定期验证数据结果是否符合预期。例如,通常有混合的注册民主党和共和党选民的地区,如果数据突然变为 100%的单一党派,就需要进行调查。
-
适用性:当数据适合预定的用途时,就被认为是合适的;这可能是主观的。例如,假设假期交通影响了购买习惯(美国国旗在阵亡将士纪念日一周的销售量增加并不表示这是一个平均或预期的每周行为)。
-
可访问性:有趣的数据可能会被大量无关数据所淹没,从而降低了有趣数据的质量,因为它变得难以访问。这在大数据项目中尤其常见。此外,安全性也可能影响数据的质量。例如,某些计算机可能会被排除在捕获的日志文件之外,或某些与健康相关的信息可能被隐藏,未包含在共享的病人数据中。
上下文数据问题
很多前面提到的数据问题可以被自动检测到,甚至可以被修正。这些问题最初可能是由用户输入错误、传输或存储过程中的损坏,或者由不同数据源中相似实体的不同定义或理解所引起的。在数据科学中,还有更多需要考虑的事项。
在数据清洗过程中,数据科学家会尝试根据对数据背景及其预期用途的假设或假定,识别数据中的模式。换句话说,任何数据科学家认为明显与数据假设或目标无关,或明显不准确的数据都会被处理。这个过程依赖于数据科学家的判断力以及他或她确定哪些数据点有效,哪些无效的能力。
依赖人类判断时,总有可能忽视或错误处理那些没有充分考虑在数据科学家假设/假定中的有效数据点。因此,保持适当标签的清洗数据版本是一种常见的做法。
清洗技术
通常,数据清洗过程围绕识别那些异常数据点展开,或者识别那些由于不符合数据科学家所看到或感兴趣的数据模式而显得突出的数据点。
数据科学家使用各种方法或技术来识别数据中的异常值。一种方法是绘制数据点图,然后通过视觉检查结果图,找出那些远离整体分布的数据点。另一种技术是通过编程方式删除所有不符合数据科学家数学控制限制的数据点(这些限制基于统计项目的目标或意图)。
其他数据清洗技术包括:
-
有效性检查:有效性检查涉及应用规则来判断数据是否有效。这些规则可以是全局性的;例如,如果数据池中包含特定唯一键(例如社会安全号码不能重复),数据科学家可以进行唯一性检查;也可以是案例级的,例如当某些字段值的组合必须是特定值时。验证可以是严格的(例如删除缺失值的记录),也可以是模糊的(例如修正与现有已知值部分匹配的值)。
-
增强:这是一种通过添加相关信息使数据完整的技术。额外的信息可以通过使用数据文件中的现有值计算得出,也可以从其他来源添加。这些信息可以用于参考、比较、对比或展示趋势。
-
标准化:在数据标准化过程中,数据值会被转换或映射到其他更为理想的值。
-
标准化:这涉及将参考数据集转换为新的标准。例如,使用标准代码。
-
领域专业知识:这涉及根据数据科学家的经验或最佳判断,删除或修改数据文件中的数据值。
我们将在本章的接下来的部分中逐一讲解这些技术的例子。
R 与常见数据问题
让我们从一些关于 R 的背景知识开始。R 是一种易学的语言和环境,天生非常灵活,专注于统计计算,因而成为处理、清洗、汇总、生成概率统计等的绝佳选择。
此外,还有一些使用 R 进行数据清洗的其他原因:
-
它被大量数据科学家使用,所以它不会很快消失
-
R 是平台独立的,因此你所创建的内容几乎可以在任何地方运行
-
R 有非常棒的帮助资源——只需谷歌一下,你就能找到!
异常值
对异常值最简单的解释是,异常值就是那些与其他数据点不相符的数据点。观察时,任何特别高、特别低,或在你项目的上下文中显得特别不寻常的数据,都可以视为异常值。作为数据清洗的一部分,数据科学家通常会识别异常值,然后采用公认的方法来处理这些异常值:
-
删除异常值,甚至删除包含异常值的实际变量
-
转换值或变量本身
让我们来看一个使用 R 识别并解决数据异常值的真实世界例子。
在游戏世界中,老虎机(是一种通过将硬币插入插槽并拉动手柄来操作的赌博机器,手柄决定了支付的结果)非常受欢迎。如今大多数老虎机是电子的,因此它们被编程成可以持续追踪所有活动的方式。在我们的例子中,赌场的投资者希望利用这些数据(以及各种补充数据)来推动他们的盈利策略调整。换句话说,什么样的老虎机更能带来盈利?是机器的主题还是类型?新型机器比旧型或复古机器更有利可图吗?机器的物理位置如何?低面额的机器更有利可图吗?我们尝试通过异常值来寻找答案。
我们得到一组游戏数据(格式为逗号分隔或 CSV 文本文件),其中包括老虎机的位置、面额、月份、日期、年份、机器类型、机器年龄、促销活动、优惠券、天气和投币金额(即插入机器的总金额减去支付出的金额)。作为数据科学家的第一步,我们需要审查(有时称为分析)数据,查看是否存在异常值。第二步是处理这些异常值。
步骤 1 – 数据分析
R 使这一步变得非常简单。虽然有很多种方式可以编写解决方案,但我们尽量保持实际程序代码或脚本的行数最小。我们可以从在 R 会话中定义 CSV 文件作为一个变量(命名为 MyFile
)开始,然后将文件读取到 R 的 data.frame
(命名为 MyData
)中:
MyFile <-"C:/GammingData/SlotsResults.csv"
MyData <- read.csv(file=MyFile, header=TRUE, sep=",")
在统计学中,boxplot
是一种简单的方式,可以了解统计数据集的形状、变异性和中心(或中位数),因此我们将使用 boxplot
来查看我们的数据,看看能否识别出 Coin-in
的中位数,并确定是否存在离群值。为此,我们可以请求 R 绘制文件中每台老虎机的 Coin-in
值,使用 boxplot
函数:
boxplot(MyData[11],main='Gamming Data Review', ylab = "Coin-in")
Coin-in
是文件中的第 11 列,因此我在函数 boxplot
中明确将其作为参数。为了保持简洁,我还添加了可选的参数(继续简化代码),这些参数为可视化图形添加了标题。
执行之前的脚本后,我们得到了以下图形。注意中位数(通过 boxplot
中穿过盒子的线表示)以及四个离群值:
步骤 2 – 处理离群值
现在我们看到数据中确实存在离群值,我们可以处理它们,避免它们对我们的研究产生不利影响。首先,我们知道负的 Coin-in
值是不合逻辑的,因为机器不能发放超过已经投入的硬币。根据这一规则,我们可以简单地删除文件中所有 Coin-in
值为负的记录。再次地,R 使这变得很简单,我们将使用 subset
函数来创建一个新的 data.frame
,该数据框只包含那些 Coin-in
值非负的记录(或案例)。
我们将把这个 subset
数据框命名为 noNegs
:
noNegs <- subset(MyData, MyData[11]>0)
然后,我们将重新绘制图形,确保已经删除了负的离群值:
boxplot(noNegs[11],main='Gamming Data Review', ylab = "Coin-in")
这生成了一个新的 boxplot
,如下面的截图所示:
我们可以使用相同的方法来删除极端的正 Coin-in
值(大于 $1,500 的值),通过创建另一个 subset
,然后重新绘制:
noOutliers <-subset(noNegs, noNegs[11]<1500)
boxplot(noOutliers[11],main='Gamming Data Review', ylab = "Coin-in")
在处理数据的不同迭代过程中,建议你保存大部分(如果不是所有的话)版本的数据显示,特别是保存最重要的版本。你可以使用 R 的 write.csv
函数:
write.csv(noOutliers, file = "C:/GammingData/MyData_lessOutliers.csv")
大多数数据科学家采用统一的命名约定,贯穿整个项目(如果不是所有项目的话)。你的文件名应该尽可能明确,以便以后节省时间。此外,尤其是在处理大数据时,你还需要注意磁盘空间。
前面代码的输出结果如下:
领域专业知识
接下来,另一种数据清理技巧是基于领域知识进行数据清理。这并不复杂。这种技巧的关键是利用数据中没有的额外信息。例如,之前我们排除了具有负值的 Coin-in
数据,因为我们知道负的 Coin-in
数值是不可能的。另一个例子可能是当飓风桑迪袭击美国东北部时。在那段时间里,大多数机器的 Coin-in
数值非常低(如果不是零的话)。数据科学家可能会基于这些信息,移除特定时间段的数据。
有效性检查
正如我在本章之前提到的,交叉验证是指数据科学家对数据池中的数据应用规则。
有效性检查是最常见的统计数据清理形式,是数据开发人员和数据科学家最有可能(至少有些)熟悉的过程。
清理数据时可以使用任何数量的有效性规则,这些规则将依赖于数据科学家的预期目的或目标。这些规则的示例包括:数据类型(例如,一个字段必须是数值类型)、范围限制(数字或日期必须落在某个范围内)、必填(值不能为空或缺失)、唯一性(字段或字段组合必须在数据池内唯一)、集合成员(即值必须是某个离散列表的成员)、外键(某些值在某个案例中必须定义为某个规则的成员或符合该规则)、正则表达式匹配(即验证值是否符合预定的格式)、以及跨字段验证(即一个案例中的多个字段组合必须符合某个特定条件)。
让我们看一些前述的示例,首先从数据类型转换(也叫 强制转换)开始。R 提供了六个强制转换函数,方便使用:
-
as.numeric
-
as.integer
-
as.character
-
as.logical
-
as.factor
-
as.ordered
-
as.Date
这些函数,加上一点 R 知识,可以使得将数据池中的一个值转换变得相当简单。例如,使用之前的 GammingData 为例,我们可能会发现生成了一个新的游戏结果文件,且年龄值被保存为字符串(或文本值)。为了清理这些数据,我们需要将值转换为数值类型。我们可以使用以下一行 R 代码快速转换文件中的值:
noOutliers["Age"]<-as.numeric(noOutliers["Age"])
一点提示:使用这种简单的方法,如果任何值无法转换,它将被设置为 NA 值。在类型转换中,真正的工作是理解一个值需要转换成什么类型,当然,还有哪些数据类型是有效的;R 语言有多种数据类型,包括标量、向量(数值型、字符型、逻辑型)、矩阵、数据框和列表。
我们在这里查看的另一个数据清理领域是正则表达式模式的处理。在实际操作中,特别是当处理来自多个来源的数据时,数据科学家无疑会遇到一些字段,它们的格式不符合要求(例如目标任务的格式),或者字段值格式不一致(这可能会导致错误的结果)。一些例子包括日期、社会保障号码和电话号码。对于日期,视来源而定,你可能需要重新输入(如前所述),但通常情况下,你还需要将这些值重新格式化成一个可用的格式,符合你的目标。
重新输入日期是很重要的,这样 R 才知道使用该值作为实际日期,并且你可以正确地使用各种 R 数据函数。
一个常见的例子是,当数据包含日期字段,格式可能是YYYY/MM/DD
,你想进行时间序列分析,展示每周的总和,或者进行其他操作,这些操作需要使用日期值,但可能需要重新格式化日期,或者你仅仅需要它作为一个真正的 R 日期对象类型。假设我们有一个新的 Gamming 文件——这个文件只有两列数据:Date
和 Coinin
。这个文件是一个收集的 Coinin
值的转储,针对一个老虎机的每一天数据。
我们新文件中的记录(或案例)看起来像以下截图:
数据科学家可以使用多种清理方法。首先,验证这些数据点的每种数据类型。我们可以使用 R 函数 class
来验证文件的数据类型。首先(正如我们在前面的例子中做的),我们将 CSV 文件读入一个 R 数据框对象中:
MyFile <-"C:/GammingData/SlotsByMachine.csv"
MyData <- read.csv(file=MyFile, header=TRUE, sep=",")
接下来,我们可以使用 class
函数, 如下截图所示:
在前面的截图中,你可以看到我们使用了 class
来显示我们的数据类型。
MyData
是我们的数据框,包含我们的游戏数据,Date
是 factor
类型,Coinin
是 integer
类型。所以,数据框和整数类型对你来说应该是清晰的,但请注意,R 会将日期设置为所谓的 factor
类型。因子(factor)是分类变量,在总结统计、绘图和回归分析中非常有用,但作为日期值并不适合。为了修正这个问题,我们可以使用 R 函数 substr
和 paste
,如下面所示:
MyData$Date<-paste(substr(MyData$Date,6,7), substr(MyData$Date,9,10), substr(MyData$Date,1,4),sep="/")
通过这行简单的脚本,我们可以将所有记录中 Data
字段的值重新格式化。它将字段拆分成三个部分(即月、日和年),然后按照我们想要的顺序将这些部分重新拼接起来(使用 /
作为分隔符 (sep
)),如下所示的截图:
我们发现,这行脚本将我们的 Data
字段转换为 character
类型,最后我们可以使用 as.Date
函数将我们的值重新转为 R 中的 Date
类型:
通过一些反复试验,你可以将字符串或字符数据点格式化成你想要的样子。
增强数据
通过增强进行数据清洗是另一种常见的技术,它通过添加相关的信息、事实和/或数据,使数据变得完整(也许更有价值)。这些附加数据的来源可以是使用数据中已有信息的计算,或者是从另一个来源添加的数据。数据科学家可能会花时间增强数据的原因有很多种。
根据手头的目的或目标,数据科学家添加的信息可能用于参考、比较、对比或展示趋势。典型的使用场景包括:
-
派生事实计算
-
指明使用日历年与财政年度
-
转换时区
-
货币转换
-
添加当前与上一时期的指标
-
计算每天运送的总单位数
-
维护缓慢变化的维度
作为数据科学家,你应始终使用脚本来增强数据,因为这种方法比直接编辑数据文件要好得多,因为它更不容易出错,并且能保持原始文件的完整性。此外,创建脚本还允许你将增强功能应用于多个文件和/或新版本的文件,而无需重新做同样的工作。
作为一个工作示例,让我们再次回到我们的GammingData
。假设我们正在接收每台老虎机的Coinin
金额文件,并且我们的博彩公司现在在美国本土以外的地方运营赌场。这些地点向我们发送文件,以便将其纳入我们的统计分析,并且我们现在发现这些国际文件提供的Coinin
金额是以当地货币表示的。为了能够正确地建模数据,我们需要将这些金额转换为美元。以下是这个场景:
文件来源:英国
使用的货币:GBP 或英镑
将我们的 GBP 值转换为美元的公式很简单,就是将金额乘以汇率。因此,在 R 语言中:
MyData$Coinin<-MyData$Coinin * 1.4
上一行代码将完成我们想要的操作;然而,数据科学家需要决定需要转换哪种货币(GBP)以及使用的汇率是多少。虽然这不是一个大问题,但可能有人想尝试创建一个用户定义的函数来确定要使用的汇率,如下所示:
getRate <- function(arg){
if(arg=="GPB") {
myRate <- 1.4
}
if(arg=="CAD") {
myRate <- 1.34
}
return(myRate)
}
尽管前面的代码片段相当简单,但它说明了创建我们可以稍后重复使用的逻辑这一点:
最后,为了进一步改善,保存你的函数(在 R 文件中),这样它可以随时使用:
source("C:/GammingData/CurerncyLogic.R")
然后:
MyFile <-"C:/GammingData/SlotsByMachine.csv"
MyData <- read.csv(file=MyFile, header=TRUE, sep=",")
MyData$Coin <- MyData$Coinin * getRate("CAD")
当然,在最理想的情况下,我们可能会修改该函数,通过查找表格或文件中的汇率来获取汇率,基于国家代码,这样汇率就可以反映最新的值,并将数据与程序代码解耦。
协同化
在数据统一化过程中,数据科学家会根据分析目标或目的,将数据值转换、翻译或映射到其他更理想的值。最常见的例子是性别或国家代码。例如,如果你的文件中性别编码为1
和0
,或者M
和F
,你可能想将数据点统一编码为MALE
或FEMALE
。
使用国家代码时,数据科学家可能希望按区域绘制汇总数据:北美、南美和欧洲,而不是单独显示 USA、CA、MX、BR、CH、GB、FR 和 DE。在这种情况下,他或她会创建汇总值:
北美 = 美国 + 加拿大 + 墨西哥
南美 = 巴西 + 瑞士
欧洲 = 英国 + 法国 + 德国
举个例子,也许数据科学家将多个调查文件拼接在一起,这些文件都包含性别信息,文件名为gender.txt
,但性别使用了不同的编码(1
、0
、M
、F
、Male
和Female
)。如果我们尝试使用 R 函数table
,我们会看到以下不希望出现的结果:
如果我们带着最好的期待来可视化这个过程:
lbs = c("Male", "Female")
pie(table(MyData), main="Gambling by Gender")
我们看到以下截图:
再次,为了解决数据点性别编码不一致的问题,我借用了上一节中的示例概念,并创建了一个简单的函数来帮助我们重新编码:
setGender <- function(arg){
if(substr(arg,1,1)=="0" | toupper(substr(arg,1,1))=="M") { Gender <- "MALE" }
if(substr(arg,1,1)=="1" | toupper(substr(arg,1,1))=="F") { Gender <- "FEMALE" }
return(Gender)
}
这次,我添加了toupper
函数,以便我们不必担心字母大小写,同时使用substr
处理长度超过一个字符的值。
我假设参数值将是0
、1
、m
、M
、f
、F
、Male
或Female
,否则将会出现错误。
由于 R 将Gender
值归类为数据类型factor
,我发现很难轻松使用简单的函数,因此我决定创建一个新的 R 数据框对象来存储我们的统一数据。我还决定使用循环过程,逐一读取文件中的每个记录,并将其转换为Male
或Female
:
MyFile <-"C:/GammingData/Gender.txt"
MyData <- read.csv(file=MyFile, header=TRUE, sep=",")
GenderData <-data.frame(nrow(MyData))
for(i in 2:nrow(MyData))
{
x<-as.character(MyData[i,1])
GenderData[i,1] <-setGender(x)
}
现在我们可以通过编写代码来享受更合适的可视化效果:
lbls = c("Male", "Female")
pie(table(GenderData), labels=lbls, main="Gambling by Gender")
上述代码的输出如下:
标准化
大多数主流数据科学家已注意到,在开始统计研究或分析项目之前,标准化数据变量(将参考数据更改为标准数据)是数据清理过程中的一个重要步骤。这很重要,因为如果没有标准化,使用不同尺度测量的数据点很可能不会对分析贡献相同。
如果你考虑到一个在 0 到 100 范围内的数据点会比一个在 0 到 1 范围内的变量具有更大的权重,那么你可以理解数据标准化的重要性。没有标准化地使用这些变量,实际上会让范围更大的变量在分析中占据更大的权重。为了解决这个问题并使变量平衡,数据科学家会尝试将数据转换成一个可比的尺度。
居中(数据点)是数据标准化最常见的示例(当然,还有其他很多例子)。为了居中一个数据点,数据科学家会将所有数据点的均值从文件中的每个数据点中减去。
R 语言提供了scale
函数,省去了手动计算的麻烦。这是一个默认方法可以在一行代码中完成列的居中和/或缩放的函数。让我们看一个简单的例子。
回到我们的老虎机!在我们的游戏文件中,你可能记得有一个名为Coinin
的字段,其中包含一个数值,表示投放到机器中的总金额。这被视为机器盈利能力的衡量标准。这个数据点看起来是我们盈利分析中一个显而易见的选项。然而,这些金额可能具有误导性,因为存在不同面额的机器(换句话说,有些机器接受五分镍币,而有些则接受十分硬币或美元)。或许机器面额的不同造成了不平等的尺度。我们可以使用scale
函数来解决这个问题。首先,我们可以在下图中看到Coin.in
的值:
我们可以写出以下代码来居中我们的Coin.in
数据点:
scale(MyData[11], center = TRUE, scale = TRUE)
center
的值决定了如何执行列的居中。使用TRUE
值时,居中是通过从相应列中减去Coin.in
的列均值(忽略 NA 值)来完成的。scale
的值决定了如何执行列的缩放(在居中之后)。如果scale
为TRUE
,则通过将(已居中的)Coin.in
列除以它们的标准差来进行缩放,如果center
为TRUE
,否则除以均方根。
我们可以在下图中看到差异:
转换
一种引人深思的数据清理类型,可能对数据开发者来说是一个新概念,那就是数据转换。数据转换是一个过程,其中数据科学家通过一些数学操作实际改变你可能认为是有效数据值的内容。
数据转换的执行是将数据从原始格式映射到适当应用所期望的格式,或更适合特定假设或目的的格式。这包括值转换或翻译函数,以及将数值标准化以符合最小和最大值。
正如我们在本章前面使用 R 的示例一样,我们可以看到这个过程的一个非常简单的例子,语法也非常简单。例如,数据科学家可能决定将一个给定值转换为该值的平方根:
data.dat$trans_Y <-sqrt(data.dat$Y)
上面的代码示例告诉 R 创建一个新的变量(或 data.dat
数据集中的一列)trans_Y
,该变量等于原始响应变量 Y
的平方根。
虽然 R 可以支持几乎所有你能想到或需要的数学运算,但其语法并不总是直观的。R 甚至提供了通用函数 transform
**,**但截至本文写作时,它仅适用于数据框。transform.default
将其第一个参数转换为数据框,然后调用 transform.data.frame
。
那么,为什么要这么做呢?一个原因是像这样的关系可能不太奏效。例如,如果你正在处理数量级差异很大的值,那么处理这些值会变得困难。在实际应用中,比如比较不同物种的体重或各种声音频率及其对大气的影响。这些例子中,使用对数变换使得数据科学家能够以一种方式绘制值的图表,从而能看到在较小值之间的数据点差异。
另一个例子是对测试成绩的变换(将成绩转换为距离均值的差值)。
最后,许多广泛使用的统计方法假设数据服从正态分布或呈正态分布形态。在数据科学家观察到的数据与正常分布不符的情况下,可以使用数据变换。数据变换如对数、指数或幂变换通常用于尝试使非正态形态的分布数据变得更接近正态分布。这些数据变换也有助于数据科学家将极端离群值拉近与其他数据值的距离,从而减少离群值对总结统计量(如样本均值或相关性)的影响。
演绎推理
在演绎推理中,人们使用已知的信息、假设或普遍接受的规则来得出结论。在统计学中,数据科学家使用这一概念(尝试)修复数据集中存在的不一致性和/或缺失值。
对于数据开发人员,推理修正的例子包括将字符串或文本值转换为数值数据类型,或将符号从负数翻转为正数(或反之)。这些情况的实际例子包括克服存储限制,例如,当调查信息总是以文本形式捕获并存储,或会计需要将数值的美元金额表示为支出。在这些情况下,可能会进行数据审查(以推断需要执行哪些修正——也称为统计数据编辑——),或者该过程可以自动化,以影响来自特定数据源的所有传入数据。
数据科学家常规执行的其他推理修正包括输入打字错误、四舍五入误差、符号错误和数值交换错误的修正。
有一些 R 语言包和库可用,例如deducorrect
包,专注于修正四舍五入、打字和符号错误,并包括三种数据清洗算法(correctRounding
、correctTypos
和correctSigns
)。然而,数据科学家通常希望为当前项目特别定制编写解决方案。
确定性填充
我们一直在讨论数据科学家推导或确定如何处理或修正脏数据问题的主题,例如数据池中的缺失、错误、不完整或不一致的值。
当数据池中的数据缺失(或错误、不完整、不一致)时,会使处理和分析变得困难,并且可能引入偏差,影响对数据进行的分析结果。这就引出了填充方法。
在数据统计中,填充是指通过数据清洗过程,数据科学家用其他值替换缺失(或以其他方式指定的)数据。
由于缺失数据可能在分析数据时产生问题,填充被视为避免仅仅丢弃或完全删除缺失值案例所带来的风险的方式。实际上,一些统计软件包默认丢弃任何具有缺失值的案例,这可能引入偏差或影响结果的代表性。填充通过基于其他可用信息估算的值来替换缺失数据,从而保留数据池中的所有案例。
确定性填充是数据科学家在为缺失、无效或不一致的数据分配替换值时使用的过程,这些数据在编辑过程中未通过。换句话说,在特定情况下,当所有其他字段的具体值已知且有效时,如果只有一个(缺失)值会使记录或案例满足或通过所有数据科学家的编辑,那么该值将被填充。确定性填充是一种保守的填充理论,它针对的是那些简单可识别的情况(如前所述),并且可能是自动化编辑和填充数据时考虑的首要情况。
目前,在数据科学领域,填补理论正在获得越来越多的关注,并且持续发展,因此需要持续关注该领域的新信息。
其他一些著名的缺失数据填补理论包括热补法和冷补法;完全删除和配对删除;均值填补;回归填补;最后观察值前移法;随机填补;以及多重填补。
总结
在本章中,我们概述了不同类型或种类的统计数据清洗的基本原理。然后,使用 R 编程语言,我们展示了各种实际示例,说明了每种最佳或常用的数据清洗技术。
我们还介绍了数据转换、推理修正和确定性填补的概念。
在下一章,我们将深入探讨数据挖掘是什么以及为什么它很重要,并使用 R 进行最常见的统计数据挖掘方法:降维、频繁模式和序列。
第四章:数据挖掘与数据库开发者
本章向数据开发者介绍数据挖掘(与查询不同),并帮助理解什么是数据挖掘以及它为何是数据科学的核心组成部分。
我们将提供工作示例,帮助读者熟悉使用 R 进行最常见的统计数据挖掘方法:维度约简、频繁模式和序列挖掘。
在本章中,我们将内容分为以下主题:
-
数据挖掘的定义与目的
-
为数据挖掘而非数据查询准备开发者
-
使用 R 进行维度约简、频繁模式和序列挖掘
数据挖掘
通常,在解释事物时,从高层次的定义开始是明智的。
数据挖掘可以简单地解释为将有关特定主题或信念的信息整理成一种可理解(且可进一步使用)的格式。然而,需要记住的是,整理的信息并非数据本身(如数据查询),而是来自数据的信息(本章后面会详细讨论)。
数据挖掘也不应与分析、信息提取或数据分析混淆。此外,它可以是手动的、半自动的或自动化的过程。在处理新数据时,通常是由数据科学家手动进行的过程。后来,在处理相同数据(来源)的新版本时,可能会在某种程度上实现自动化。
数据挖掘是数据科学家进行的一种探测,目的是在数据中发现以前未知的信息,例如:
-
模式,如一组数据记录,被称为簇
-
不寻常的记录,被称为异常值
-
依赖关系,如关联规则或序列模式
这些新信息(或洞察)可以看作是一种数据总结,并可用于进一步分析,或例如在机器学习和预测分析中使用。例如,通过数据挖掘,数据科学家可能会识别出不同的组群,这些组群可以在决策支持系统中用于获得更准确的预测结果。
数据开发者可以将从数据挖掘中得到的洞察类比为描述性或结构性元数据,这在行业中被理解为定义数据的数据。
一旦探测完成,数据科学家已经挖掘出信息,这些信息必须根据工作目标转化为可理解且可用的结构。
数据收集、数据准备、解释和可视化的结果以及报告不属于数据挖掘的范畴。
常见技术
以下小节解释了一些最常见且被广泛接受和使用的数据挖掘(统计)分析方法。
可视化
平均值、变异度量、计数、百分比、交叉表格和简单相关性可帮助数据科学家理解数据结构。这也被称为数据概况分析。
区域、时间、 多维和层次化是常见且易于理解的数据可视化格式。
聚类分析
聚类分析被数据科学家用来将数据变量归入定义好的集合(即聚类),作为数据总结的一种方式。聚类应该在内部是同质的(变量之间相似),而在外部是异质的(变量与其他聚类中的成员不同)。
层次聚合法、划分法和基于模型的方法是常见的聚类分析方法。
相关分析
相关分析是一种方法,数据科学家通过该方法衡量两个数据变量之间的关系。由此得出的结果被称为相关系数,它展示了一个变量(自变量)的变化是否会导致另一个变量(因变量)的变化。
常见的相关性分析方法包括正相关/负相关、线性相关和非线性相关。
判别分析
判别分析用于在没有明显自然排序的群体情况下,判断数据变量是否属于某一类。使用这种方法时,预先设定好一些带有特定评分或度量的群体,并将其用于数据变量分类或分组过程中。
线性判别分析(LDA)是最常见的判别分析方法之一,数据科学家尝试找到特征的线性组合,用于表征或区分数据变量(分成不同组)。
因子分析
因子分析有助于理解数据变量之间关联的原因。其主要目标是减少变量的数量,并在它们之间的关系中检测结构(该方法也有助于整体数据的降维)。
数据科学家使用的因子分析类型包括主成分分析、公共因子分析、图像因子分析、阿尔法因子分析和因子回归分析。
回归分析
回归分析通过研究两个或多个定量变量之间的关系,使得可以根据其他变量(自变量)预测某个变量(因变量)的值。
回归分析有很多种类型,包括简单线性回归、多元线性回归、曲线回归和多重曲线回归,以及逻辑回归模型。
逻辑回归分析
逻辑回归分析是一种用于响应变量是二元或定性的情况,旨在通过最大似然法找到一个最佳拟合方程,以最大化在已拟合回归系数的条件下得到观测结果的概率。
逻辑回归的常见类型包括简单逻辑回归、多重逻辑回归、多类别逻辑回归和泊松逻辑回归模型。
目的
通过数据挖掘的实践,数据科学家可以实现(前述)从大量信息或数据中提取可操作信息的目标。
有人曾说数据挖掘的目标是发现无结构数据中的结构。例如,你可以使用数据挖掘来识别客户群体,以设计针对高价值客户的促销活动,或设计一个库存控制计划,以确保短期产品保质期。
有人可能会混淆数据查询与数据挖掘。但如果我们考虑为新开设的家居改善商店生成库存控制计划的例子,仅通过查询销售交易记录来确定过去几个月(来自其他商店)的最畅销产品,可能不会成功。而挖掘人口统计信息可能会得出更好的结果,因为我们可能会识别出有效的新颖、潜在有用的可理解的关联和模式,这些模式可以用于预测当地消费者的购买行为。换句话说,数据挖掘的目标或目的不是报告,而是发现。
在接下来的章节中,我们将更深入地探讨数据挖掘与数据查询之间的区别。
挖掘与查询
数据查询是提出具体、结构化问题来寻找特定答案的过程,而数据挖掘则是通过统计算法筛选数据,以识别模式和关系的过程。
以下矩阵可以帮助数据开发人员理解数据查询与数据挖掘之间的区别:
示例 | 数据查询或挖掘 |
---|---|
上个月全球销售的技术书籍总数是多少? | 数据查询 |
上个月影响全球销售的技术书籍类型的因素有哪些? | 数据挖掘 |
上个季度售出了多少种不同技术的技术书籍? | 数据查询 |
哪些技术是作为一套书籍购买的? | 数据挖掘 |
一项技术是倾向于购买纸质版还是电子版? | 数据挖掘 |
哪些技术书籍有重复购买的客户? | 数据挖掘 |
哪本技术书籍是总体销售量最高的? | 数据查询 |
再次强调,数据查询是报告事件结果,而数据挖掘则是识别可能有助于理解哪些因素影响了这些事件结果的关系的过程,或者这些关系可以用于预测类似事件的未来结果。
选择 R 进行数据挖掘
虽然有很多不错的选择,R 是一种学习曲线较短、非常灵活、且专注于统计计算的语言和环境,非常适合用于数据操作、清洗、总结、生成概率统计等(以及使用数据实际创建可视化);因此,它是进行数据挖掘练习的极佳选择。
此外,这里还有一些学习和使用 R 进行数据挖掘项目的更多理由:
-
R 被大量学术统计学家使用,所以它是一个不会消失的工具。
-
R 几乎是平台独立的;你开发的内容几乎可以在任何地方运行。
-
R 有很棒的帮助资源,只需谷歌一下,你就能看到!
为了说明,我们将在本章的其余部分探索几个使用 R 编程语言的实际数据挖掘例子。
可视化
首先,让我们来看一下如何使用 R 创建一个简单的数据可视化。在这个使用场景中,我们有来自理论医院的数据,患者在入院时通过在线调查收集病史信息,并在治疗过程中将信息添加到患者档案中。文件包括许多字段,其中包括:
-
患者的基本描述数据,例如性别、出生日期、身高、体重、血型等。
-
生命体征,例如血压、心率等。
-
病史,如住院次数、手术、重大疾病或病情、是否在医生治疗下等。
-
人口统计学统计数据,例如职业、家乡、教育背景等。
-
文件中还收集了一些额外的信息,用于开发患者的特点和习惯,例如患者每周饮食中牛肉、猪肉和家禽的摄入次数,是否通常使用黄油替代品等。
假设我们没有得到关于数据的更多信息(除了简要的字段名称列表以及数据是由医院人员在患者入院时采集的),接下来的步骤是进行一些数据挖掘,即识别或分组数据,并可能查找变量之间的关系。
要开始,我们可以将医院调查数据读入 R 数据框架,然后使用两个可用的 R 函数来揭示文件中的信息:
这里显示的代码将我们的文本文件(名为Chapter4.txt
)读取到 R 数据框架中(也名为chapter4
),然后使用dim
和names
函数。dim
函数展示了文件的数据结构(此文件中有5994
条记录或案例,以及107
个数据点或变量,如我们刚才看到的截图所示)。names
函数则列出了文件中所有字段或变量的名称(部分名称在我们刚才看到的截图中显示)。
R 函数属性和str
也是一些非常有用的 R 数据挖掘函数,值得读者花时间深入研究并进行实验。
最初,数据科学家可能会通过查看字段名称来寻找一些初步的思路;例如,常见的分组项,如性别、年龄和州(如今“是否投保”也是一个非常有趣的属性!)。
当前吸烟者
通常,数据科学家在进行数据挖掘时会有一个目标。在这个例子中,假设我们有兴趣将吸烟患者分成不同的年龄组。使用current_smoker
变量,我们可以使用 R 的 table 函数并运行以下代码:
table(chapter4["current_smoker"])
这将生成以下信息:
从这里显示的结果来看,似乎我们有更多的非吸烟者(5466
)而不是吸烟者(528
),至少在这个文件或人群中是这样。
接下来,我们想看到的(即可视化)是将我们人群中的吸烟患者按年龄组进行组织。为此,数据科学家的下一步逻辑应该是了解age
变量中的range
值。换句话说,我们的数据挖掘工作的一部分将是查看我们人群中最年轻患者的年龄以及最年长患者的年龄。我们不需要通过切片和筛选数据来查找这些信息,可以使用 R 的 range 函数,如下所示:
从这些结果中,数据科学家现在可以看到我们有患者年龄从 1 岁到 99 岁的病例!另一个好主意是可视化我们患者年龄的频率。数据科学家可能希望再次使用 R 的 table 函数来创建一个直方图:
hist(table(Chapter4["age"]))
上述代码的输出结果是:
这段 R 代码将生成以下可视化图表,进一步展示我们患者的年龄分布:
另一个有趣的信息是密度估计。通过不太复杂的操作,我们可以将三个 R 函数plot
、density
和table
嵌套在一起,创建另一个患者年龄的可视化图表。
我们可以运行以下代码:
这将生成以下可视化图表:
鉴于所有这些新获得的知识,也许数据科学家会想继续将我们的病例分成六个不同的年龄组:
-
22 岁以下
-
22 到 34 岁
-
35 到 44 岁
-
45 到 54 岁
-
55 到 64 岁
-
65 岁及以上
为了开始使用数据科学家的术语,数据开发者应该开始使用“病例”而不是“记录”(在文件中),使用“人群”而不是“文件”。
以下 R 程序代码根据记录的年龄将我们的病例按当前吸烟者进行分组,并创建一个简单的饼图来可视化结果:
# -- read our data into a data frame object
Chapter4<-read.csv('c:/chapter4/Chapter4.txt')
# -- initialize holders for counting cases
a1 <-0;a2 <-0;a3 <-0;a4 <-0;a5 <-0;a6 <-0
# -- read through the cases and count smokers by age group
for(i in 2:nrow(Chapter4))
{
if (as.numeric(Chapter4[i,"age"]) < 22 & Chapter4[i,"current_smoker"]=="Yes") {a1 <- a1 + 1}
if (as.numeric(Chapter4[i,"age"]) > 21 & as.numeric(Chapter4[i,"age"]) < 35 & Chapter4[i,"current_smoker"]=="Yes") {a2 <- a2 + 1}
if (as.numeric(Chapter4[i,"age"]) > 34 & as.numeric(Chapter4[i,"age"]) < 45 & Chapter4[i,"current_smoker"]=="Yes") {a3 <- a3 + 1}
if (as.numeric(Chapter4[i,"age"]) > 44 & as.numeric(Chapter4[i,"age"]) < 55 & Chapter4[i,"current_smoker"]=="Yes") {a4 <- a4 + 1}
if (as.numeric(Chapter4[i,"age"]) > 54 & as.numeric(Chapter4[i,"age"]) < 65 & Chapter4[i,"current_smoker"]=="Yes") {a5 <- a5 + 1}
if (as.numeric(Chapter4[i,"age"]) > 64) {a6 <- a6 + 1}
}
# -- build a pie chart
slices <- c(a1, a2, a3, a4, a5, a6)
lbls <- c("under 21", "22-34","35-44","45-54","55-64", "65 & over")
# -- create the actual visualization
pie(slices, labels = lbls, main="Smokers by Age Range")
以下是我们使用 R pie
函数生成的简单饼图:
缺失值
任何分析结果的关键是数据的可用性。
假设在我们的数据集中有一些案例缺少值。你可能希望在分析中忽略(或省略)这些案例。与其花时间编写代码来处理这些案例,不如使用 R 的通用函数na
。na.omit
函数会评估文件中的每个案例,如果某个案例在任何变量上都有缺失值,它会自动删除该案例。
以下示例展示了 R 函数na.omit
和nrow
在一个包含缺失值的文件上的使用:
请注意使用na.omit
前后行(案例)数量的变化(删除了五条记录)。
我已经用更新的文件覆盖了对象Chapter4
;实际上,养成创建新对象的好习惯是很有益的,这样在任何处理前后都能保留数据的审计记录。
聚类分析
在下一个示例中,数据科学家希望更仔细地查看我们的案例,但只关注那些吸烟者。所以,我们在 R 中首先创建一个原始案例的子集,只包含那些当前吸烟的案例。和之前的例子一样,在创建子集(命名为mysub
)后,我们将使用 R 的nrow
函数验证我们新数据集中的记录数,以便了解新数据集中的案例数量:
# --- create a subset of smokers only cases
mysub <- subset(Chapter4,Chapter4["current_smoker"]=="Yes")
# --- confirm the row count
nrow(mysub)
上述代码的输出是:
根据我们刚刚看到的输出,我们的新数据集仍然有超过 500 个案例。因此,作为数据科学家,我们决定从我们的案例中随机抽取一部分样本(我们将对其进行聚类分析),然后再次验证我们最新数据集中的记录数。
我们可以使用 R 的sample
命令来创建仅包含 30 个案例的样本:
# --- create a random sample of 30 smokers
mysample <- mysub[sample(1:nrow(mysub), 30,
replace=FALSE),]
# --- confirm the row count in our random case sample
nrow(mysample)
上述代码的输出是:
最后,我们的数据科学家觉得现在他已经有了足够小的样本,足以进行处理,所以我们继续用这个样本进行聚类分析。如本章前面提到的,层次聚合聚类是最流行的聚类分析技术之一,因此我们将使用它来处理我们随机抽样的案例。
我们可以使用 R 的dist
和hclust
函数组合对我们随机抽样的案例进行层次聚合聚类分析。dist
函数计算数据集的距离矩阵,给出任意两条观察值之间的欧几里得距离。hclust
函数则在该距离矩阵上执行层次聚类。
总结来说,回顾和理解层次聚类分析结果的最简单方式是通过结果的可视化。这个可视化通常被称为树状图(一种常用于说明聚类安排的树形图),所以我们也会添加这段代码:
# -- perform the hierarchical cluster analysis
smokerclust<-hclust(dist(mysample))
# -- create results in a dendrogram
plot(smokerclust)
上述代码的输出是:
这段代码示例创建了以下可视化:
R 提供了一个长长的选项列表,可以根据数据和统计信息创建丰富的可视化图表。对数据科学家来说,熟悉这些选项非常重要,也许更重要的是理解哪种可视化图表最适合分析的目标。
降维
聚类是旨在基于对属性值的观察,将相关的数据变量分组。然而,考虑到有大量属性的场景,数据科学家会发现,一些属性通常对某个特定的聚类来说没有意义。在我们之前本章中使用的示例(处理病人病例)中,可能会遇到这种情况。回想一下,我们对吸烟者进行了层次聚类分析。那些案例包括许多属性,如性别、年龄、体重、身高、就诊次数、心率、州、关系、保险、血型、血压、教育、出生日期、是否为当前饮酒者、是否正在服药、已知过敏症、是否正在接受医生照护、是否曾做过手术、职业、心脏病发作、风湿热、心脏杂音、动脉疾病等。
作为数据科学家,你可以使用 R 函数names
,就像我们在本章前面所做的那样,查看所有属性的完整列表。
降维是一个过程,数据科学家尝试减少或限制一个案例中的属性(或维度)数量。这被称为减少考虑中的随机变量数量,但实际上就是根据科学理论,从数据文件中移除某些列。
当前接受和常用的去除维度的方法包括:
-
缺失数据:如果某个变量(列)有很多没有值的案例(记录),它不会增加太多的价值;因此,该列可以被删除。
-
记住,在本章前面,我们使用了 R 函数
na.omit
。这个函数在删除整个案例时非常有用;然而,使用降维时,我们想要为所有案例删除整个变量。 -
小方差:像变量有大量缺失值一样,方差小的变量没有增加价值,也可以被删除。
-
高度相关性:具有相似趋势的数据列也可能携带非常相似的信息。在这种情况下,只需要其中一个。
-
决策树:这是一种可能需要更多工作的方法。它是一种降维技术,数据科学家通过针对目标属性生成一组决策树,然后利用每个属性的使用统计数据,找出最有信息量的特征(或列)。使用统计数据最少的列可以被删除。
-
主成分分析(PCA):它是一个过程,将数据集中的变量转换为一组新的变量,称为主成分。这些成分按变量的可能方差排序,只有那些方差最高的成分才会被保留。
-
后向消除法和前向构造法:这些技术涉及集中关注一个或多个变量,并按顺序一个一个地去除或添加额外的变量并观察其效果。后向消除法通过可接受的误差率来衡量效果,而前向构造法则通过对性能的影响来衡量效果。
计算统计显著性
现在让我们来看一个简单的例子,使用数据变量计算出的方差来决定它是否应该从分析中移除。
再次使用我们在本章中一直使用的患者案例例子,我们可以使用 R 函数var
来确定我们人群中变量的统计显著性。
R 函数var
仅适用于数值型数据。
在下面的代码中,我们使用 R 函数var
来计算名为的变量的方差:
"no_servings_per_week_skim_milk".
我们可以看到,它有一个较低的方差百分比(它变化不频繁,或者在不同的案例中没有很多不同的值):
如果我们看另一个变量的计算方差百分比,名为:No_servings_per_week_regular_or_diet_soda
,我们会发现它的计算方差(比前一个变量)更高:
最后,如果我们看一个第三个变量,名为No_servings_per_week_water
,我们得到第三个计算出的方差:
从这些单独的方差计算中,我们可以看到每个变量在我们案例分析中的统计显著性:
数据变量 | 计算出的方差 |
---|---|
No_servings_per_week_skim_milk | .003160316 |
No_servings_per_week_regular_or_diet_soda | 8.505655 |
No_servings_per_week_water | 24.10477 |
名为No_servings_per_week_skim_milk
的数据变量可以肯定地从分析中剔除,并且根据我们的数据科学家容忍度,名为No_servings_per_week_regular_or_diet_soda
的数据变量也可能会被从分析中剔除。
使用简单的 R 函数,我们可以可视化我们计算出的方差数据,以便更好地理解:
因此,我们生成以下可视化:
当我们去除一个变量时,它会从我们所有的案例中被移除。
高频模式
为了理解统计模式,让我们首先思考一下当城市地区受到严重天气和潜在危险的旅行威胁时会发生什么——所有本地商店都抢购面包、牛奶和鸡蛋!
模式挖掘(数据挖掘的一个子领域)是通过查看数据来识别以前未知但可能有用的模式的过程,这些模式通常由频繁同时发生的事件(例如暴风雨天气触发面包、牛奶和鸡蛋的销售)或对象(例如面包、牛奶和鸡蛋通常一起购买或在同一个购物车中捆绑在一起)组成。
模式挖掘是指使用或开发自定义模式挖掘逻辑的过程。该逻辑可能应用于各种类型的数据源(如交易和序列数据库、流数据、字符串、空间数据、图形等),以便查找各种类型的模式。
在更高层次上,数据科学家寻找:
-
有趣的模式
-
频繁模式
-
稀有模式
-
高置信度模式
-
顶级模式,以及其他模式
一些可能存在于数据中的更具体的模式类型包括:
-
子图:在图或一组图中发现一个有趣的图形
-
直接和间接关联:识别对象或事件之间的耦合或依赖关系;可以是隐式或显式定义的
-
趋势:这也有时称为趋势分析,是收集看似无关的信息并尝试找出模式的实践
-
周期性模式:定义为元素在一个周期或组中,特征的变化或趋势
-
序列规则:这是对序列模式挖掘的扩展,考虑了一个已识别模式被跟随的概率
-
格:一个部分有序的集合,其中每两个元素都有一个唯一的最小上界和唯一的最大下界
-
序列模式:出现在多个数据序列中的子序列
-
高效模式:高效模式是指那些已被确定为具有较高、较大或等于阈值的模式
频繁项集
在前一节(寻找频繁模式)的基础上,频繁项集是一个扩展概念。对于数据开发者来说,最适用的模式概念是频繁项集或查找经常作为一组或集合成员出现的项。
以我们前面章节中的暴风雨天气为例,可以设想通过查找销售交易文件或数据库中的过程,寻找那些在一次销售中(或一组产品中)一起购买牛奶、面包和鸡蛋的情形(即事件)。
频繁项集还涉及确定在分析中使用的最小支持度(minsup)阈值。这意味着数据科学家将确定构成一个集的项的最小出现次数。
再次回到我们暴风雨天气的例子,如果数据科学家设置最小支持度为 2,那么仅有两个成员商品的销售将被视为一个集合或模式。
让我们考虑以下销售交易:
销售 ID | 购买商品 | 是否符合(作为频繁项集) |
---|---|---|
销售 1 | 牛奶,面包,鸡蛋 | 是 |
销售 2 | 牛奶,土豆 | 否 |
销售 3 | 面包,鸡蛋,茶 | 是 |
销售 4 | 鸡蛋,橙汁 | 否 |
最著名的模式挖掘算法无疑是 Apriori,它旨在应用于事务数据库,用于发现客户在商店中进行交易时的模式。该算法以用户设置的最小支持度(minsup)阈值和包含一组事务的事务数据库作为输入,并输出所有频繁项集。
序列挖掘
序列挖掘进一步发展了前述概念。这是一个过程,数据科学家用它来发现一组在对象之间共享的模式,并且这些模式之间有特定的顺序。
在序列挖掘中,我们认识到有与已识别序列相关的序列规则。这些规则定义了模式的对象和顺序。一个序列可以有多个规则。序列规则的支持度可以通过数据科学家计算,方法是将包含该规则的序列数量除以总序列数。序列规则的置信度则是将包含该规则的序列数除以包含其前提的序列数。
总体而言,序列规则挖掘的目标是发现所有支持度和置信度都不低于用户指定的最小支持度(minsup)和最小置信度(minconf)阈值的序列规则。
总结
在本章中,我们提供了数据挖掘的通用定义,列出了数据科学家最常用的技术,并说明了这些工作的整体目标。数据挖掘还与数据查询进行了比较,并通过 R 语言提供了各种工作示例,以说明某些关键技术。最后,探讨了降维、频繁模式挖掘和序列挖掘的概念。
下一章将通过数据开发者的视角,手把手介绍数据的统计分析,提供描述数据特征、探索数据中呈现的关系、从数据中创建总结模型、验证数据模型有效性以及在数据开发模型上进行预测分析的指导。
第五章:数据库开发者的统计分析
本章将数据开发者引入统计分析的实践。
作为数据开发者,数据分析的概念或过程可能在你脑海中已经很清晰。然而,尽管数据分析和统计分析之间存在相似之处,但也有一些重要的差异需要理解。
本章旨在指出分析类型之间的相似性和差异,帮助读者理解数据、总结和统计分析过程中的基本原则,这些过程描述了成功的统计分析工作中所涉及的关键因素或特征,并提供每个步骤的工作示例,帮助读者掌握如何成功地进行数据统计分析。
在本章中,我们将内容分为以下主题:
-
什么是数据分析、统计分析和总结?
-
成功的统计分析步骤
-
使用 R 进行数据的统计分析
-
示例–总结模型
数据分析
我们首先来看看所谓的数据分析。这被定义为通过分析和逻辑推理对数据进行评估的结构化过程。进行数据分析时,需要花时间收集所有要分析的数据,将数据(现在视为数据源)分解为可以审查的块或组件,然后根据数据中看到或发现的内容得出结论。通常,这样做的目的是确定某个数据源是否适用于完成声明的项目交付目标。
数据分析方法有很多种,其中包括数据挖掘(在第四章中讨论过,数据挖掘与数据库开发者)、文本分析、商业智能和数据可视化(仅举几个例子)。
对于数据开发者而言,数据分析涉及以某个目的为导向,检查数据源的各个部分。
例如,假设我们有一些来自自行车制造组织的交易数据,想要用它来生成销售绩效报告。通常这类项目,我们可以假设我们获得了从数据库中提取的 CSV 格式数据。
现在,使用 R 命令,我们可以识别数据中的字段或列,并查看数据的总结。以下 R 代码使用read.csv
将我们的数据文件加载到 R 数据框对象中,然后使用命令colnames
列出文件中的字段或列名;最后,我们使用 R 命令 summary 来指示 R 为我们提供一些关于数据的统计信息。
以下截图展示了运行 R 命令(colnames
和summary
)的输出结果:
更进一步的观察
一旦我们确认数据中包含了产品标识符(编号和名称)、交易数量、销售日期、退货日期、销售区域信息等内容,我们将希望对数据中的各个组成部分进行一些探索(分析)。也许我们可以通过使用 R 命令nrow
来计算文件中的总记录数,然后使用 R 命令list
和unique
列出数据中出现的唯一零件或产品编号,如下所示的代码和部分输出所示:
进一步的数据分析任务包括检查数据中每个组成部分的内容,例如:
-
sales_date
和return_date
(字段)的日期值格式是什么? -
这些字段中的日期范围是什么?
-
我们的数据文件中包含多少个唯一的产品和销售区域?
请记住,日期总是一个难点,因此确定日期格式和范围始终是进行包含日期或时间值的数据分析时的一个有价值的分析任务。
为了说明这一点,我们可以使用几个简单的 R 命令,创建一个包含我们数据中年份和月份的列表。
以下是用于完成此统计分析任务的 R 代码:
# --- read our data file into "x"
x <-read.table("c:/Worker/23SamplesSalesTrans.csv", sep=",", header = FALSE, skip = 1)
# --- convert "x" into a data frame object, then set the data frame to
# --- hold only the sales_date
data.df <- data.frame(x)
data.df <- data.df[,4]
# --- use the R commands substr and regexpr to strip out just the year and # --- month from the sales date field
YearsInData = substr(substr(data.df[],(regexpr('/',data.df[])+1),11),( regexpr('/',substr(data.df[],(regexpr('/',data.df[])+1),11))+1),11)
MonthsInData = substr(data.df[],(regexpr('/',data.df[])-1),1)
# --- use sort and unique functions to list our year(s) and month(s)
sort(unique(YearsInData))
sort(unique(MonthsInData))
以下截图显示了运行前述命令后的输出:
我们可以看到,数据中只包含了 2013 年日历年第一季度的数据,即月份1
、2
和3
。现在我们已经确定了数据的时间序列。虽然还有许多数据分析工作可以继续进行,但关键在于我们正在进行旨在建立结构的分析练习,以便实现最初的销售业绩报告目标,而不是进行机器学习。
有了这个前提,假设我们希望检查按月的交易量。为此,我们可以使用 R 计算这些每月的总额,代码如下:
# --- read data
data.df<-data.frame(x)
# --- initialize counters
JanuarySales <-0
FebruarySales <-0
MarchSales <-0
# --- loop and count
for(i in 1:nrow(data.df))
{
MonthInData = substr(data.df[i,4],(regexpr('/',data.df[i,4])-1),1)
if (MonthInData == '1') {JanuarySales <- JanuarySales + data.df[i,3]}
if (MonthInData == '2') {FebruarySales <- FebruarySales + + data.df[i,3]}
if (MonthInData == '3') {MarchSales <- MarchSales + + data.df[i,3]}
}
一旦我们计算出每月的交易总额(使用前面的命令),我们就可以报告这些结果。这可以通过创建一个简单的条形图可视化来完成。
我们可以在以下代码中使用 R 的barplot
函数:
barplot(c(JanuarySales, FebruarySales, MarchSales), main="Sales Qty by Month", border = "dark blue", legend.text = c("Jan", "Feb", "Mar"), col = c("lightblue", "mistyrose","lightcyan"), sub = "Sales Transactions from File")
上述命令生成了以下可视化结果:
这些描述的数据分析任务示例只是进行特定目标数据分析时通常完成的众多步骤中的一部分,例如生成业绩报告。
总结来说,数据分析就是回顾数据,确定其是否可以作为创建特定结果的有效来源,并且如果可以,如何使用它。
接下来,让我们继续进行下一节的统计分析。
统计分析
一些统计学研究者有时将统计分析描述为统计项目的一部分,涉及收集和审查数据源,以努力识别数据中的趋势。
在数据分析中,目标是验证数据是否适合某种需求,而在统计分析中,目标是理解数据并从中得出一些推论。
有许多可能的统计分析技术或方法可以考虑。
总结
让我们回到我们的自行车零部件制造组织示例。假设我们有一个新的交易文件,这次我们有更多的数据,我们的工作重点将是进行统计分析,目的是识别可能影响销售表现的具体因素,作为前面活动的一部分。
第一步是对数据进行总结。前一部分已经展示了一些分组:产品和时间段。利用这些组件,我们能够讲述组织销售表现的故事。
数据中可能还包含哪些其他分组或类别?
例如,如果我们假设销售表现依赖于时间段,那么首先要做的可能是将数据按时间段分组。标准的时间段当然是月份、季度和年份(我们在之前的部分已经做了这个),但从统计学角度来看,数据越多越好,因此一个更好的时间分组方式可能是十年或五年的区间。
总结过程中常用的做法是可视化,通常使用条形图,这些图表按顺序显示每个数据点,或使用直方图,它是按更广泛的类别分组的条形图。在这一部分中,我们将牢记这一点,并使用 R 创建各种可视化,以展示我们数据总结的结果。
比较分组
让我们继续进行(像本章前面一样)使用 R 命令colnames
和summary
;这次应用于我们的新数据文件:
如图所示,我们的文件中有一个额外的字段(或组件)sale_type
,执行总结命令后,得到了以下统计数据,其中包括销售类型的细分:
下一步将取决于你的假设。例如,如果你认为销售类型(sale_type
)对整体销售表现有影响,那么你需要为每个(销售类型)组生成summary
数据,通常包括均值、中位数和/或标准差(之前的summary
命令是一个很好的开始)。让我们来看一些使用 R 来创建这些summary
信息的例子。
和往常一样,我们可以首先将数据读取到 R 中,然后明确地将其移动到 R 数据框对象中。以下代码适用于此步骤:
# --- read in the data in
sales <- read.csv("c:/Worker/SamplesSalesTrans_2.csv")
# --- just moving our original data to a data frame object
# --- preserving the original
data.df<-data.frame(sales.new)
使用 R 语言时,有许多不同的方法或方法可以完成相同的任务,但在这个示例中,我们将使用最直接、最简单的方法——通过循环遍历数据,创建每种销售类型的汇总总量。
以下是我们使用的循环代码:
# --- looping through the data and counting quantities
# --- type
for(i in 1:nrow(data.df))
{
if (data.df[i,2] == 'Online')
{Online <- Online + data.df[i,1]
OnlineC <- OnlineC +1}
if (data.df[i,2] == 'Television')
{Television <- Television + data.df[i,1]
TelevisionC <- TelevisionC +1}
if (data.df[i,2] == 'New Customer')
{NewCustomer <- NewCustomer + data.df[i,1]
NewCustomerC <- NewCustomerC +1}
if (data.df[i,2] == 'Retailer')
{Retailer <- Retailer + data.df[i,1]
RetailerC <- RetailerC +1}
if (data.df[i,2] == 'Club')
{Club <- Club + data.df[i,1]
ClubC <- ClubC +1}
if (data.df[i,2] == 'Discounted')
{Discounted <- Discounted + data.df[i,1]
DiscountedC <- DiscountedC +1}
if (data.df[i,2] == 'Repeat')
{Repeat <- Repeat + data.df[i,1]
RepeatC <- RepeatC +1}
if (data.df[i,2] == 'Vendor')
{Vendor <- Vendor + data.df[i,1]
VendorC <- VendorC +1}
}
也许,更高效的方法是根据 sale_type
来创建数据子集。这可以通过使用以下 R 命令来实现:
# --- create average or mean for all Online sales quantities
# --- by first creating a subset of only quanities of that sale
# --- type
OnlineSales.new <-data.df[data.df$sale_type == "Online",]
OnlineSalesMean <-mean(OnlineSales.new$quantity)
# --- using the summary totals, you could do the math to calculate # --- the average or mean:
OnlineMean <- Online/OnlineC
此外,我们还可以使用 R 函数 mean、median 和标准分布来计算数据的统计summary
信息,具体如下所示的 R 命令:
# --- calculate the mean for all sale types:
MeanAll <-mean(data.df [["quantity"]])
# --- calculate the standard deviation for all sales types:
StdDAll<-sd(data.df[["quantity"]])
# --- calculate the median for all sales types:
MeanAll <-mean(data.df [["quantity"]])
下图展示了运行前述命令的结果:
一旦我们计算出一些summary
信息,下一步就是利用这些信息创建一个或多个可视化图表,便于我们更轻松地观察和研究。
直方图是实现此目标的一个不错的可视化选项。在执行几个数据操作后,我们可以使用 R 函数hist
,如下所示的 R 代码:
# --- using the calculated average/mean for each sale type
temp<-c(Online, Television, NewCustomer, Retailer, Club, Discounted, Repeat, Vendor)
# --- create the histogram
hist(temp, breaks=8, freq=TRUE, main="Quantity by Sales Type", border="black", col = "gray", xlab="Types: Online, Televsion, New Customer, Retailer, Club, Discounted, Repeat, Vendor")
abline(v=ref,col="red")
以下图示展示了由前述 R 命令创建的直方图可视化图:
为了决定是否存在任何观察组之间的实际差异,大多数情况下,你会首先建立一个参考值或参考分布,用于衡量每个组的值(在本例中是每个sales type
组)。
最常见的参考标准是标准分布。标准分布衡量的是数据的变异性,或者说一组数值有多么不同和/或分散;在这个示例中,我们讨论的是sales quantities
。就像我们在本节前面所做的,我们可以使用 R 命令sd
来建立数据源中所有产品的标准分布,使用以下 R 命令:
# -- calculate standard distribution of all product quantities
sd(data.df[["quantity"]])
接下来,我们可以快速地通过可视化,比较每个sales type
组的summary
数据与我们的标准分布。
以下 R 命令可用于计算每个组的标准分布总量:
# --- create a subset of only online sale type quantities
quantity.new <- data.df[data.df$sale_type == "Online",]
# --- calculate this subsets standard distribution
StdDOnline<-sd(quantity.new$quantity)
# --- repeated for each sales type group!
然后,我们可以使用以下 R 命令绘制标准分布总量,进行可视化比较:
# --- after computing each type, calculate the standard
# --- distribution for all sales quantities:
StdDVendor<-sd(quantity.new$quantity)
# --- combine the totals into "Temp"
Temp<-c(StdDOnline, StdDTelevision, StdDNewCustomer, StdDRetailer, StdDClub, StdDDiscounted, StdDRepeat, StdDVendor)
# --- create a simple Line Chart
plot(Temp, type="o", col="blue", axes=FALSE, ann=FALSE)
axis(1, at=1:8, lab=c("Online", "TV","New", "Retail","Club","Disc","Rep","Ven"))
title(ylab="STD DIST", col.lab=rgb(0,0.5,0))
box()
随后,使用前述命令生成的线形图可视化图,显示了每种sales type
的标准分布:
在这个可视化图中,我们忘记绘制的是所有sales types
的标准分布。通过之前的计算和 R 的abline
函数,我们可以使用以下 R 命令更新我们的可视化图:
abline(h=sd(data.df[["quantity"]]), col="green")
以下是我们更新的可视化图,增加了水平线(绿色水平线)或水印,显示了所有sales types
的标准分布:
上图现在让我们了解了每种销售类型与标准分布总量的对比情况。
样本
通常,你会希望将分布与样本进行比较(而不是所有量的总和),因此我们可以使用 R 语言的样本函数从我们的数据中创建一个样本:
# --- use sample to create a random sampling of data
mysample.df <- data.df[sample(1:nrow(data.df), 100, replace=FALSE),]
然后,我们可以重新创建之前的可视化图(使用plot
,axis
,title
和box
),其中横线或水印表示(随机)样本的标准分布:
# --- original visualization
plot(Temp, type="o", col="blue", axes=FALSE, ann=FALSE)
axis(1, at=1:8, lab=c("Online", "TV", "New", "Retail","Club","Disc","Rep","Ven"))
title(ylab="STD DIST", col.lab=rgb(0,0.5,0))
box()
# --- create a sample population
mysample.df <- data.df[sample(1:nrow(data.df), 100, replace=FALSE),]
# --- draw a water mark from the
$ --- samples standard distribution
abline(h=sd(mysample.df[["quantity"]]), col="green")
运行前面的 R 代码会生成以下可视化图:
其他比较群体的方法包括平均值,特别是均值、中位数和众数。
另一个关键比较是衡量数据的分散程度,即数据在整个可能测量范围内的分布广度。通常,我们通过计算方差来执行此分析。同样,R 使这一任务变得简单,只需使用var
函数。
以下命令计算我们样本的方差,以及整个群体的方差:
# --- calculate our samples variance
var(mysample.df[["quantity"]])
# --- calculate total variance
var(data.df[["quantity"]])
群体比较结论
在继续之前,我们需要指出的是,你在进行群体的统计分析时,需要小心得出结论。在前面的例子中,我们集中于比较分布。使用单一的比较点可能导致你做出不准确的假设,例如:
-
群体是不同的,但你得出结论它们并不不同
-
群体是相同的或非常相似,但你得出结论它们是不同的
为了避免这些错误,明智的做法是计算并观察数据中的多个总结点。为此,你可以创建一个总结模型,这也是我们下一节的主题。
总结建模
常见的做法是通过开发总结模型来建立多个总结点。简而言之,从数据中创建总结模型,就是创建一个表格或数据框,表格的行包含均值、标准分布、中位数、最小值、最大值,以及每个数据组件的总和(或者至少是你感兴趣的每个数据组件)。
让我们使用之前的数据示例,在其中我们根据各个销售类型
组别检查了销售数量。幸运的是,R 提供了简单的函数来计算我们的比较点:最大值、均值、标准分布、中位数、最小值和总和。
我们可以利用它们单独计算每个群体的比较点,如下所示:
# --- create subset of Online quantities
quantity.new <- data.df[data.df$sale_type == "Online",]
# --- calculate each comparison point
max(quantity.new[["quantity"]])
mean(quantity.new[["quantity"]])
sd(quantity.new[["quantity"]])
median(quantity.new[["quantity"]])
min(quantity.new[["quantity"]])
sum(quantity.new[["quantity"]])
接下来,我们创建一个 R 的data frame
(df
)对象来保存我们的总结数据,然后将所有的比较点加载到数据框中。以下是相应的 R 代码:
# --- create a data frame object for summarization
df<-data.frame(8,7)
# --- create our subset of data - this is online sales
quantity.new <- data.df[data.df$sale_type == "Online",]
# --- calculate comparison points based upon
# --- our current subset dropping each in a temp
# --- variable for now (a, b, c, d, e and f)
a<-max(quantity.new[["quantity"]])
b<-mean(quantity.new[["quantity"]])
c<-sd(quantity.new[["quantity"]])
d<-median(quantity.new[["quantity"]])
e<-min(quantity.new[["quantity"]])
f<-sum(quantity.new[["quantity"]])
# --- load our calculations into the data frame object
# --- just using "i" as an index to the data frame
i<-1
df[i,1]<-"Online"
df[i,2]<-a
df[i,3]<-b
df[i,4]<-c
df[i,5]<-d
df[i,6]<-e
df[i,7]<-f
# --- add headings/column names to our data frame object
names(df)<-c("group", "max", "mean", "sd", "median", "min", "sum")
# --- note: repeat the section of code here that creates a
# --- subset and calculates its points for all sale types
# --- display out finished summation model
df
以下是我们的总结模型数据框对象示例:
一个总结表格,例如我们之前创建的那种,通常无法回答你所有关于数据的问题,但实际上,它会提出更多的问题和假设供你进一步探究。统计分析的核心是提出下一个要问的问题。
汇总表帮助我们确定:
-
这数据中真的有任何重要的信息吗?
-
这个数据源可靠吗?
-
如果这些数据似乎支持我的假设,那么整体证据有多强?
-
这些信息(如总结的)真的对我的当前假设有意义吗?
-
这些数字意味着什么(暗示可能需要更多的分析和汇总)?
-
接下来可以采取什么行动?
-
数据的性质是什么?(将在下一节讨论。)
有多种 R 包(例如gridExtra
包)可供下载并安装,用于将格式化良好的数据框打印到纸上。读者值得花时间探索这些选项。
确定数据的性质
当谈到统计分析的目标时,人们通常会提到描述或确定数据源性质的过程。
确定某事的性质意味着对其进行理解。这个理解可以是简单的,也可以是复杂的。例如,我们能否确定数据源中每个变量或组件的类型?它们是定量的、比较性的,还是定性的?
使用本章前面提到的交易数据源,我们可以按类型识别一些变量,如下所示:
-
定量:数量
-
比较性:
sale_type
-
定性:
sales_region
-
分类:
product_name
更高级的统计分析旨在识别数据中的模式;例如,是否存在变量之间的关系,或者某些群体是否比其他群体更可能表现出某些特征。
探索数据中呈现的关系可能类似于在关系数据库中识别外键的想法,但在统计学中,组件或变量之间的关系基于相关性和因果关系。
此外,确定数据源的性质实际上也是对该数据源进行建模的过程。在建模过程中,通常会涉及提问,如下所示(旨在确立数据的性质):
-
什么?一些常见的示例(什么)包括收入、支出、运输、医院就诊、网站点击等。在本章使用的示例中,我们正在测量数量,即被移动的产品数量(销售)。
-
为什么?(为什么)通常取决于你项目的具体目标,这些目标可能会有很大差异。例如,我们可能想要追踪一个业务的增长、网站上的活动,或是某个选定产品或市场兴趣的演变。同样,在我们当前的交易数据示例中,我们可能希望识别表现过高或过低的
销售类型
,并确定新客户或回头客是否贡献更多或更少的销售? -
怎么做?通常会在一段时间内(也许是一年、一个月、一周等)并且通过其他相关测量,如产品、州、地区、经销商等,来进行。在我们的交易数据示例中,我们专注于按销售类型观察数量。
在本章关于数据分析的讨论开始时,我们创建了一个可视化,显示了前面提到的模型,即按月份的数量。接下来是该可视化:
通常,建模过程将包括多次迭代:观察、提出新问题、操作数据、创建新的可视化,并观察这些可视化结果,每次迭代都由前一次迭代的结果驱动。
例如,在查看之前的可视化(按月销售数量)之后,可能会出现新的问题,比如销售区域的总销售数量是多少。
可以使用类似 R 命令逻辑(如barplot
函数)来操作我们的数据并展示这些信息,如下所示:
# --- load our data into a data frame object
data.df<-data.frame(x)
# --- initialize some counters one for each sales region ID
R1<-0
R2<-0
R3<-0
R4<-0
R5<-0
# --- loop through the data and accumulate sale quantities
# --- for each sales region
for(i in 1:nrow(data.df))
{
MonthInData <-data.df[i,6]
if (MonthInData == '1') {R1 <- R1 + data.df[i,3]}
if (MonthInData == '2') {R2 <- R2 + data.df[i,3]}
if (MonthInData == '3') {R3 <- R3 + data.df[i,3]}
if (MonthInData == '4') {R4 <- R4 + data.df[i,3]}
if (MonthInData == '5') {R5 <- R5 + data.df[i,3]}
}
# --- generate our barplot from accumulated data
# --- in R1 through R5
barplot(c(R1, R2, R3, R4, R5), main="Sales Qty by Region", border = "dark blue", legend.text = c("1","2","3", "4", "5"), col = c("lightblue", "mistyrose","lightcyan", "Green", "grey"))
生成的可视化如下所示:
根据以前的可视化,当然可以提出更多问题并进行可视化:
-
按销售区域按月份或季度的数量分布如何?
-
按产品的总数量是多少?
-
按月、季度、产品等总返回量是多少?
-
等等!
描述数据性质的另一种方式是为其添加上下文或进行概述。无论如何,目标是通过可视化使数据使用者更好地理解数据。
另一个添加上下文或者建立数据性质的动机可能是为了从数据中获得新的视角。例如,我们可以添加比较,比如我们之前的销售类型
示例。
成功的统计分析
值得一提的是,在这一部分处理确保成功(或至少是有成效的)统计分析工作的关键点。
你可能会发现这些大多数都是常识性的概念,但也许有些不是。
-
尽快确定您的目标或目的。您需要知道胜利是什么,即驱动分析工作的问题或想法是什么。此外,您需要确保无论分析的驱动力是什么,都必须以某种方式可测量。必须早期确定这个度量或绩效指标。
-
确定关键的杠杆。这意味着一旦确定了您的目标及衡量达到这些目标的绩效方式,您还需要找出影响每个目标达成绩效的因素。
-
进行彻底的数据收集。通常情况下,数据越多越好,但在数量不足的情况下,始终要追求质量。
-
清理你的数据。确保你的数据以一致的方式进行清理,这样数据问题不会影响你的结论。
-
建模,建模和再建模你的数据。正如我们在前一节中提到的,建模推动建模。你对数据进行的建模越多,你就会提出和回答更多问题,并获得更好的结果。
-
花时间提升你的统计分析技能。持续演进你的经验和统计分析风格总是个好主意。改进的方式就是去做。另一种方法是重新调整手头可能有的数据,以磨练你的技能。
-
优化并重复。一如既往,你需要花时间进行标准化,遵循成熟的实践,使用模板,并测试和记录你的脚本和模型,这样你就可以一遍又一遍地重复使用你最好的努力。你会发现这段时间花得很值,即使是你更好的努力也会因使用而改善。最后,与他人分享你的工作!眼界越广,产品就会越好。
关于确保统计项目成功的一些有趣建议包括以下引用:
建议建立一个团队,使得那些拥有统计学高级学位的人专注于数据建模和预测,而团队中的其他成员-合格的基础设施工程师、软件开发人员和 ETL 专家-构建必要的数据收集基础设施、数据管道和数据产品,使得数据通过模型流动,并以报告和仪表板的形式向业务展示结果。 - G Shapira, 2017*
R 与统计分析
关于使用 R 进行统计分析、数据概要和为数据添加视角(建立上下文)的一点说明。
R 是一种易学、非常灵活,并且非常专注于统计计算的语言和环境,使其非常适合操纵、清洗、总结和生成概率统计(以及实际上使用数据创建可视化),因此它是进行概要、建立上下文和识别额外视角所需的练习的绝佳选择。
此外,以下是使用 R 进行任何类型数据或统计分析时的几个更多原因:
-
R 被大量学术统计学家使用,因此它不会被淘汰。
-
R 几乎是平台无关的;你开发的内容几乎可以在任何地方运行。
-
R 拥有出色的帮助资源。只需 Google 一下,你就会看到!
总结
在本章中,我们详细探讨了统计分析的目的和过程(数据分析的差异),创建了一个总结模型,并列出了成功进行统计分析的步骤。最后,我们强调了选择 R 作为首选统计分析工具的原因。
下一章将重点解释统计回归及其在数据科学中的重要性。我们将介绍在日常数据项目中使用各种统计回归方法,并概述开发人员如何在典型的数据开发项目中使用回归进行简单的预测和预报。
第六章:数据库的回归进展
在这一章中,我们将通过提供(数据)统计回归的定义来开始,然后继续讨论回归概念,并概述开发人员如何在典型的数据开发项目中使用最常见的回归技术进行预测和预报。
在本章中,我们将信息组织成以下几个领域:
-
统计回归简介
-
识别回归使用机会的方法(在数据项目中)
-
R 与统计回归
-
一个工作示例
引入统计回归
如承诺所说,让我们从这一章开始,提供一个关于统计回归的清晰解释。
初步了解,统计回归也常常被称为回归分析,它是估计变量之间关系的一个过程**。** 这个过程包含了多种用于建模和分析变量的技术,重点是因变量与一个(或多个)自变量(或预测变量)之间的关系。
具体来说,回归分析是指通过识别和理解一个因变量(依赖于其他因素的变量)如何随着任何一个自变量(独立于其他变量且不受其影响的变量)的变化而变化的工作,前提是其他自变量保持不变。
一个简单的例子可能是,营销总支出(一个自变量示例)如何影响一段时间内的总销售额(一个因变量示例)(真的是越多的营销就等于更高的销售额吗?),或者也许存在一个关联,即总的营销支出(自变量),产品价格的折扣(另一个自变量),以及销售额(因变量)之间?
记住这个关键点,回归分析用于理解在所有自变量中,哪些与因变量有关,而不仅仅是这些变量之间的关系。此外,推断因果关系(自变量与因变量之间)是一个重要目标。然而,这可能导致错觉或虚假的关系,因此建议小心!
总的来说,回归分析可以被视为在观察自变量的条件下,估计因变量的期望值,也就是说,尝试预测当自变量设置为某些特定值时,因变量的平均值。我称之为杠杆效应——这意味着当一个组件的值增加或减少时,它会直接影响至少一个其他(变量)的值。
回归分析的另一个目标是建立位置参数或分布的分位数。换句话说,这个思想是确定可能作为临界值的值,用于划分概率分布值的范围。
你会发现回归分析是一个非常有用的预测和预测工具(不仅仅是复杂的机器学习应用)。稍后我们会探索一些现实世界的例子,但现在让我们先看一下这个过程的一些技术。
回归的技术与方法
你会发现,已经开发并接受了多种进行回归分析的技术。
一些研究可能会展示以下几种顶级技术:
-
线性
-
逻辑回归
-
多项式
-
步骤法
-
岭
-
套索回归
以下是每种方法的简短介绍:
-
线性回归:线性回归是最基本的回归类型,通常用于预测分析项目。事实上,当你使用单一预测变量时,我们称之为简单线性回归;如果有多个预测变量,我们称之为多重线性回归。简而言之,线性回归使用线性预测函数,其值是从模型中的数据估算出来的。
-
逻辑回归:逻辑回归是一种回归模型,其中因变量是分类变量。这意味着该变量只有两个可能的值,例如通过/不通过、胜/败、生死、健康/生病。如果因变量有两个以上的可能值,可以使用各种修改版的逻辑回归技术,例如多项式逻辑回归、有序逻辑回归等。
-
多项式回归:当我们谈到多项式回归时,这项技术的重点是将自变量与因变量之间的关系建模为 n^(次)方多项式。
- 多项式回归被认为是多重线性回归的一个特例。通过对基线预测变量进行多项式展开得到的预测变量被称为交互特征。
-
逐步回归:逐步回归是一种技术,它使用某种自动化程序不断执行一步逻辑,即在每一步中,根据预先指定的标准,考虑将某个变量添加到或从自变量集中去除。
-
岭回归:通常,预测变量被认为是相互关联的。当这种情况发生时,某个变量的回归系数取决于其他哪些预测变量被包括在模型中,哪些被排除在外。岭回归是一种技术,通过向所选变量添加一个小的偏差因子来改善这种情况。因此,岭回归实际上被认为是一种缓解预测变量之间多重共线性的补救措施。
-
Lasso 回归:Lasso(最小绝对收缩和选择算子)回归是一种既进行预测变量选择,又进行正则化的技术,目的是提高预测准确性和结果的可解释性。
选择你的技术
除了上述回归技术外,还有许多其他方法需要考虑,未来可能还会有更多新的方法。面对这么多选项,选择适合你数据和项目的技术非常重要。
选择回归方法不仅仅是选择正确的回归方法,更重要的是选择最有效的回归方法。
通常,你会使用数据来确定将使用的回归方法。首先,你需要为你的数据建立统计资料或特征。在这个过程中,你需要识别并理解不同变量的重要性,它们之间的关系、系数符号**,**以及它们的影响。
总的来说,以下是一些关于选择合适回归方法的一般性建议:
-
模仿他人已经成功使用的方法。做足研究。将其他项目的成果融入到你的项目中。不要重新发明轮子。而且,即使观察到的方法并不完全适用,也许通过一些简单的调整,它会成为一个不错的选择。
-
尽量保持方法简单。许多研究表明,简单的模型通常会产生更好的预测结果。从简单开始,只有在必要时才让模型变得更加复杂。你使模型更复杂的可能性越大,就越有可能是将模型专门调整为适应你的数据集,这会导致模型的泛化能力下降。
-
检查你的工作。当你评估方法时,检查残差图(本章接下来的部分会讲到更多内容),因为它们可以帮助你避免不充分的模型,并调整模型以获得更好的结果。
-
利用你的领域专业知识。没有任何统计方法能像你一样理解底层过程或领域知识。你的知识是关键部分,也是最可靠的确定最佳回归方法的方式。
它是否拟合?
在选择了一个你认为适合你数据的模型(也就是确定该方法最适合)之后,你需要验证你的选择,也就是确定其拟合效果。
拟合良好的回归模型会使预测值接近观察到的数据值。
如果没有信息丰富的预测变量,通常会使用均值模型(该模型对每个预测值使用均值)。因此,拟合的回归模型应该比均值模型的拟合效果更好。
作为数据科学家,你需要仔细审视决定系数,测量估计的标准误差,分析回归参数的显著性和置信区间(稍后在本章中会详细讨论这些内容)。
记住,回归模型拟合得越好,结果的精度通常就越高,或者说结果就越好。
已经证明,简单模型能够产生更精确的结果!在选择方法或技术时,始终记住这一点,甚至在问题可能很复杂时,也不一定非得采用复杂的回归方法。
确定统计回归的机会
典型的统计分析工作,通常会成为正式的统计项目,首先从确定一个目标开始,最终确定达到目标的正确方法。
流行的数据科学观点认为,确定一个目标即是确立统计分析的目的,然后将目的分为三个领域:
-
总结数据(也叫构建数据概况)
-
揭示并探索数据中变量之间的关系
-
测试差异的显著性(在数据中的变量或组之间)
总结数据
如果你的统计目标是总结数据,你将生成描述性统计量,如均值、标准差、方差等。
探索关系
如果你的统计目标是寻找并了解数据中的关系,首先要检查数据是否具有某种形式,换句话说,问问自己:你的数据是围绕频率还是测量展开的?从那里开始,预测变量的数量将告诉你应该使用哪种回归(或其他)方法来进行项目分析。
测试差异的显著性
如果你的统计目标涉及测试数据中发现的差异(组之间),你首先需要确定这些组以及组的数量。数据分析涉及单一组(感兴趣的)的数据,通过与均值比较来加以利用,而多组数据则可以使用组的数量来确定应考虑哪种预测方法。
项目盈利能力
作为一个实际例子,假设有一个咨询服务组织,它收集了关于其项目工作的时间数据。该组织可能被雇佣来领导各种规模和努力水平的技术或商业相关项目。每个项目都有费用和收入。有些项目是盈利的,有些则不是。公司希望识别哪些变量(如果有的话)可以预测项目的盈利能力,换句话说,哪些变量(特别是哪些)是因变量(在此案例中为盈利能力)的显著预测因子?
检查数据时,我们会看到一份良好的变量和测量的列表,其中一些如下所示:
-
分配给项目的顾问人数 全职 (FT)
-
分配给项目的顾问人数 兼职 (PT)
-
分配给项目的分包商人数(全职或兼职)
-
分配给项目全职的客户资源人数
-
分配给项目的客户资源数量(兼职)
-
与项目核心技术的经验年数
-
总项目管理小时数
-
总开发小时数
-
每小时计费率
-
总计费小时数
-
项目中使用的技术数量
-
项目类型(时间与材料,限制不超过或人员增补)等等
一般而言,当数据科学家使用回归分析时,他或她希望回答以下三个问题:
-
一组预测变量能否很好地预测结果变量?在我们项目盈利性的例子中,分配给项目的全职顾问人数是否能够很好地预测盈利能力?
-
哪些变量(特别是)是因变量的重要预测因子?再以我们项目盈利性的例子来看,我们能否通过全职顾问分配到项目中的人数,或许是总项目管理小时数,来确定一个显著的预测因子?
-
回归方程是什么(即某些变量对其他变量的估计关系或影响),它展示了如何使用一组预测变量来预测结果?在我们项目盈利性的例子中,回归方程是这样的么?
我们的项目盈利性示例看起来可以成为回归分析的合理候选者。
在本章的下一个部分,我们将尝试为项目数据建立一个概况,并使用合适的回归技术来建立它。然后,检查变量之间的关系,并希望基于选定的预测变量预测项目的盈利能力。
R 和统计回归
在我们直接进入建模之前,让我们先花点时间验证 R 作为我们的统计建模工具的使用。
R 是一个开源的统计环境和强大的编程语言,继续成为统计建模最受欢迎的选择之一。R 是在 S 和 S-Plus 的基础上开发的,它有着不断增长的广泛受众,并由 R 核心开发团队(一个由志愿开发者组成的国际团队)良好维护。
R 和许多相关资源可以很容易地在线找到,并且有详细的说明,指导如何下载软件、附带的包以及其他文档来源。此外,世界各地的人们为 R 编写了大量专门的例程,并作为 R 包免费提供。
由于 R 是一种编程语言,它为你的项目带来了编程的强大功能,但它确实需要一定的工具使用经验。幸运的是,它提供了一个图形用户界面(GUI),使操作更加简便,并允许你从其他来源和项目中复制粘贴。
一个实际的例子
现在让我们回到项目盈利性的现实例子!
我们知道,我们的咨询服务组织的项目结果数据描述了所有项目工作的结果。这些数据中有 100 个项目(或观察值),包含了两个变量:账单小时数和利润。第一个变量不言自明:它是该项目向客户收取的总小时数。第二个是一个美元金额,表示从客户收取的收入,扣除所有费用(与项目相关的费用)后的净收入。
我们知道,每个项目都有费用和收入,而一些项目是盈利的,另一些则不是。此外,即使是盈利的项目,其盈利水平也差异巨大。再次强调,公司希望识别哪些变量(如果有的话)可能用于预测项目的盈利能力。
让我们开始我们的统计分析吧!
确定数据特征
在尝试使用我们的项目结果数据建立回归模型之前,通常会先分析数据,识别关键变量。通常,你会通过创建各种数据可视化图表(我们将在本节后续部分逐步演示)来理解数据中变量或群体之间的因果关系。
在统计学中,这些任务通常被称为执行图形分析和相关性研究。
图形分析
在我们的统计分析示例中,我们希望构建一个简单的回归模型,通过建立与账单小时(向客户收取的小时数)(hours billed)之间的统计显著线性关系,来预测项目的盈利能力(利润)。因此,我们可以通过多种方式绘制数据,开始我们的图形分析。
通常,对于每个自变量(预测变量),应绘制以下图表以可视化以下行为:
-
散点图:用于可视化预测变量与响应变量之间的线性关系。
-
箱线图:用于识别变量中的任何异常值。预测变量中的异常值可能会极大地影响预测,因为它们可以轻易地改变最佳拟合线的方向/斜率。
-
密度图:用于查看预测变量的分布。理想情况下,最好接近正态分布(钟形曲线),而不是向左或向右偏斜。
散点图可以帮助可视化因变量(响应变量)与自变量(预测变量)之间的任何线性关系。
理想情况下,如果你观察多个预测变量,则应为每个预测变量与响应变量之间绘制散点图。
以下是使用我们项目结果数据中的HoursBilled
和Profit
变量,创建散点图可视化的简单 R 命令:
# --- load our project results data
MyData <- read.csv(file="c:/Worker/HoursBilledProfit.csv", header=TRUE, sep=",")
# --- build our scatter plot on the relationship between our
# --- variables
scatter.smooth(x=MyData$HoursBilled, y=MyData$Profit, main="Hours Billed vs. Profit") # scatterplot
以下是我们生成的散点图:
小时计费与利润的散点图以及前述图表中的平滑线表明,项目的总小时计费与利润变量之间最初是线性增加后再减少的关系。
请注意,线性回归的一个基本假设是响应变量与预测变量之间的关系是线性和加性的,因此这些数据最初看起来符合这一假设。
我们的下一步是查看数据中是否存在任何离群值。位于 1.5 * 四分位距(1.5 * IQR)之外的数据点被视为离群值,其中 IQR 是计算为该变量第 25 百分位和第 75 百分位值之间的距离。
在数据的统计分析中,箱线图通常用于通过四分位数图形化地表示一组数值数据。这些可视化图形可能还会有从箱体延伸出的垂直线(一些数据科学家称这些线为“胡须”),表示上下四分位数之外的变异性。箱线图非常适合用于识别离群值。
以下 R 命令用于生成箱线图:
# --- load our project results data
MyData <- read.csv(file="c:/Worker/HoursBilledProfit.csv", header=TRUE, sep=",")
par(mfrow=c(1, 2)) # divide graph area in 2 columns
# --- box plot for hours billed
boxplot(MyData$HoursBilled, main="Hours Billed", sub=paste("Outlier rows: ", boxplot.stats(MyData$HoursBilled)$out))
# --- box plot for Profit
boxplot(MyData$Profit, main="Profit", sub=paste("Outlier rows: ", boxplot.stats(MyData$Profit)$out))
以下是从我们项目结果数据生成的离群值箱线图:
你可以注意到在利润变量中识别出的离群值(位于前述图形的右侧)。离群值行:3648270对应于我们文件中的一个数据点:
最后,可以创建一个密度图来查看我们的响应变量(ProjectID
,HoursBilled
和Profit
)与正态分布的接近程度。为此,我们可以使用以下 R 命令:
# --- load our project results data
MyData <- read.csv(file="c:/Worker/HoursBilledProfit.csv", header=TRUE, sep=",")
library(e1071)
# --- divide graph area in 2 columns
par(mfrow=c(1, 2))
# --- density plot for profit
plot(density(MyData$Profit), main="Density Plot: Profit", ylab="Frequency", sub=paste("Skewness:", round(e1071::skewness(MyData$Profit), 2)))
polygon(density(MyData$Profit), col="red")
# --- density plot for hours billed
plot(density(MyData$HoursBilled), main="Density Plot: Hours Billed", ylab="Frequency", sub=paste("Skewness:", round(e1071::skewness(MyData$HoursBilled), 2)))
polygon(density(MyData$HoursBilled), col="red")
以下是密度图:
那么,我们是否能看到项目的小时计费和项目利润之间的相关关系呢?
我们确认这一点的一种方法是建立变量之间的相关性。相关性表示成对出现的两个变量之间的线性依赖程度,就像我们认为小时计费和(项目)利润之间的关系一样。
如果数据科学家发现利润随着每个项目小时计费的增加而增加,那么这两个变量之间会有很高的正相关性,因此,它们之间的相关性会接近 1。相反,对于反向关系,相关性将接近-1。
值越接近 0,表示变量之间的关系越弱。低相关性(-0.2 < x < 0.2)可能表明响应变量(Y)的变化大部分无法通过预测变量(X)来解释,在这种情况下,我们可能需要寻找更好的解释变量。
R 编程语言再次为我们提供了一种简便的方法来实现这一点:cor
函数,它可以确定我们两个变量之间的相关性:
根据前面的输出,我们可以确定实际上没有理由相信,随着项目的账单小时数的增加,盈利能力也会增加。鉴于此,我们应当考虑其他可能的预测变量。
为了节省时间(我们想继续进行回归模型的构建),我们不打算重新开始,而是根据经验猜测,或许总项目管理小时数是一个良好的项目盈利预测变量。让我们尝试使用这个变量运行相同的cor
函数:
正如前面计算出的相关性所示(通过使用 R 函数cor
生成),变量ProjectManagement
似乎与项目盈利能力具有更高的正相关性(相比账单小时数)。
通常,我们会花时间重新构建我们在本节中使用此数据所创建的可视化图形(例如以下的散点图),但为了节省时间,我们将继续前进:
从我们的散点图中可以看出:利润管理与利润之间存在平滑的线性回归关系。随着项目管理时间的增加,项目的整体盈利能力也随之提高!
继续吧!
现在,我们已经通过散点图(以及前一节中的其他示例)等可视化图表建立了(看似)良好的线性关系,并通过计算出正相关性(使用 R 函数cor
),我们可以尝试构建实际的线性回归模型。
再次,R 为我们提供了一个相关函数——lm()
。lm()
函数有两个主要参数:
-
公式(一个公式类的对象)
-
数据(通常是一个
data.frame
)
以下是我们可以用来生成 R 回归模型的 R 命令:
# --- build linear regression model on all of our
# --- project results data
alinearMod <- lm(ProjectManagement ~ Profit, data=MyData)
print(alinearMod)
以下是构建我们模型的结果:
使用之前的 R 命令构建线性模型后,我们已经建立了预测变量(项目管理小时数)与响应变量(项目的盈利能力)之间的数学公式关系,其中项目管理(ProjectManagement)是Profit
的函数。
我们可以使用前面输出中的系数(Intercept: 6.180
和 Profit: 1.629
)来创建公式:
projectmanagement = −6.180 + 1.629 * profit
利用我们的线性模型和公式,如果知道对应的项目管理总小时数,我们就可以预测项目的盈利值。令人兴奋!
尽管我们已经建立了预测(项目盈利性)的手段,但请记住,在使用任何回归模型之前,必须确保其具有统计学显著性。
使用我们的线性模型进行预测
我们刚刚使用 R 命令创建了一个线性回归模型,并使用了所有的项目结果数据。在实际应用中,人们通常会使用所谓的80:20 样本法则来分割数据。这意味着 80%的数据将用于训练模型,而剩下的 20%可以用于测试和验证。
现在让我们来经历这个过程。
第 1 步:分割数据
我们可以读取项目结果数据,然后使用 R 的 sample 函数将数据分割成两个部分(分别为trainingData
和testData
),如下所示的 R 命令:
# --- first load our project results data
# --- from our CSV file into the object MyData
MyData <- read.csv(file="c:/Worker/ProjectManagementProfit.csv", header=TRUE, sep=",")
# --- next we are setting the ""sample seed""
# --- to reproduce results of random sampling
set.seed(100)
trainingRowIndex <- sample(1:nrow(MyData), 0.8*nrow(MyData))
# --- create our ""chunk"" of
# --- model training data
trainingData <- MyData [trainingRowIndex,]
# --- create our ""chunk of
# --- test data
testData <- MyData [-trainingRowIndex,]
第 2 步:在训练数据上创建模型
就像我们在本章前面所做的那样,我们可以使用 R 函数 lm 来使用trainingData
数据块创建回归模型**:**
# --- Build the model on training data
lmMod <- lm(ProjectManagement ~ Profit, data=trainingData)
第 3 步:预测测试数据的预期利润
然后,我们使用 R 函数 predict 来生成项目预测,如下所示的 R 命令:
# --- predict project profitability
ProfitPred <- predict(lmMod, testData)
以下是前面 R 命令生成的输出:
第 4 步:回顾模型
也许我们过程中的最后一步是对模型进行总结并审查其统计显著性。
我们可以使用 R 函数 summary:
# --- generate the summary of the model
summary (lmMod)
这将生成以下输出:
从之前生成的输出中,我们可以看到我们的模型预测器的p
值在视觉上被解读为显著,通过行末的显著性星号(已标出)可以看到,因此我们知道我们的模型是统计显著的。
第 4 步:准确性与误差
我们可以通过实际值(实际项目利润总额)与模型预测值(利润值)之间的简单关联来测试我们项目利润预测的准确性。
如下所示,以下 R 命令再次使用了 R 函数cor
:
高度的相关性精度意味着实际值和预测值具有相似的方向性变化,即当实际值增加时,预测值也会增加,反之亦然;或者可以假设当一个项目的总项目管理时间增加或减少时,项目的盈利性也会以相同的方式增加或减少!
摘要
在本章中,我们介绍了统计回归,概述了最常见的回归方法,并提供了在特定统计项目中选择校正方法的一些建议。此外,我们还提到了如何识别使用统计回归的机会,并讨论了数据总结、探索关系以及检验差异的显著性。
最后,我们通过一个实际的线性回归模型示例,展示了如何预测项目盈利能力。
下一章将向开发者介绍统计正则化的概念,帮助理解统计正则化是什么以及它的重要性,并使开发者对各种统计正则化方法感到熟悉。