轻松学数据分析-全-
轻松学数据分析(全)
原文:
annas-archive.org/md5/3274833fb18d92bf583cc3cb9a8936c2译者:飞龙
序言
现在,数据分析是一个热门话题。机器学习、数据可视化和讲故事等技能在几乎所有的专业领域中都变得至关重要。掌握数据流畅性不再是数据科学家和分析师的专利:它正成为几乎每个人的职业发展目标,无论其教育背景、经验、业务职能或职位级别如何。这是一种普遍的需求。
对于大多数有意从事分析的人来说,学习如何编程是一道令人畏惧的障碍——遗憾的是,这也是放弃意图的首要原因。因此,本书利用了低代码分析工具。通过这种方式,我们将有效利用数据分析的目标(这是本书的主要关注点)与学习编程的要求(它实际上是扩展和提升分析角色的附加技能)分开。
本指南为您提供了一次便捷的旅程,带您深入了解数据分析的最有价值技术,使您能够在低代码环境中迅速从理论走向实践。虽然大部分内容与具体应用无关,可以在您或您的公司选择的任何软件中使用,但本书的教程基于 KNIME 和 Power BI。
选择 KNIME 和 Power BI 是因为它们是数据分析旅程中最好的“旅行伙伴”。根据 Gartner 的说法,KNIME 是分析平台中的“瑞士军刀”。其图形化界面使每个人——无论是经理、分析师还是学生——都能在无需编写任何代码的情况下自动化数据管道并使用机器学习算法。一个需要记住的积极方面是,像 KNIME 这样的可视化分析工具并非简单的“简化版”或“削弱版”的“真实工具”。使用 KNIME,你可以进行完整的数据科学工作,包括复杂的数据处理和严肃的 AI 应用,例如创建深度神经网络。微软 Power BI 不需要过多介绍:它是最流行的数据可视化和仪表板工具之一。它提供了一个全面的环境,帮助构建自助式商业智能界面,广泛支持决策制定。Power BI 和 KNIME 都提供完整的主要功能访问,而无需任何资本投资。你可以免费下载它们,立即将所学应用到实践中。KNIME 作为后端、Power BI(或本书介绍的 Tableau)作为前端的组合,既多功能又强大,能够帮助组织覆盖从描述性分析到预测性和规范性分析的所有数据能力。本书的逐步教程——基于真实的商业案例和数据——将通过实践为你提供信心,使你成为这一强大软件组合的独立用户。接下来的实践之旅充满雄心:让数据分析成为你日常工作的可靠伙伴。
这本书适合谁阅读
本书所提供的学习路径是根据三种类型的读者设计的:
-
所有背景、级别和职能专长的知识工作者,他们利用数据来促进基于数据的决策,或通过报告、可视化和临时分析向他人传达业务现状。他们希望现代化并扩展自己的数据能力,以简化日常数据相关工作并增强业务影响力。如今,他们主要使用 Excel 来管理数据和报告:他们理解需要升级到更强大的工具,但不知道从哪里开始,也没有编程经验。即使精通 Excel,他们也感觉需要自动化工作流程来提高个人生产力。他们还希望构建专业的自助式仪表板,并尽可能自动化更新过程,以便专注于解释数据并超越单纯的数字。本书将为他们提供实现这些目标的工具和技术。
-
各功能领域的商业经理——包括市场营销、销售、财务、IT 和人力资源——希望通过亲身体验数据分析,理解并释放数据在自己职责领域中的真正潜力。他们没有技术专长,也不打算成为专家,但希望理解数据分析的可能性,并引导团队完成必要的转型。他们希望成为帮助者,而不是负担,并且准备好卷起袖子进行学习。今天,许多高级领导者欣赏分析的潜在价值,但不知道如何在组织中实现这一点。这本书将帮助他们亲自触及价值创造的机会,并与团队适当调整他们的期望。我们中有多少人梦想着拥有知道自己在要求什么的老板?这本书让经理们在设定商业数据分析期望时变得更加明智、理性和自信。
-
商业和数据科学专业的学生以及已经具备理论和学术知识但几乎没有商业经验的初级从业者。他们希望看到自己的知识如何在公司中实践应用,以便在第一份工作中实现垂直的启动。在经历了那么多的理论之后,这些理论分散在不同的学科(计算机科学、数据科学、统计学和商业)中,他们渴望亲身体验从原始数据到可操作的商业决策的完整过程。他们在寻找一本充满真实世界案例的书:这正是他们在这里将要得到的。
这些类型的读者不需要任何先前的知识。书中涉及的少量数学总是以非常温和的方式介绍,保持在足以“运用”分析的水平,让读者根据个人兴趣深入探讨。我写这本书的目的是让数据分析对任何想要投资时间自我发展的读者都变得可接近。我很高兴你是其中的一员。
本书涵盖内容
我为你准备的路径交替进行两种类型的内容。一些章节将为你提供数据分析的不可或缺的基础——例如统计学习基础、模型验证和数据可视化原则。其他章节则提供了关于如何在计算机上完成任务的实用指南——比如在 Power BI 中构建仪表盘的逐步教程或使用 KNIME 自动化数据处理。两种类型的内容是互补的,并按照以下结构进行组织:
第一章,什么是数据分析?,为我们共同的旅程铺平道路。本章将为你提供适当的术语,并提供一些框架(如三种分析类型、数据技术栈、数据职位角色与技能矩阵以及从数据到价值的路径),让你从更广阔的视角理解数据和算法的真正商业潜力。
第二章,KNIME 入门,引导你了解 KNIME,并通过几个实际案例展示如何进行可视化编程。本章包括本书的第一个教程,你将创建一个自动清理一些消费者生成数据的例程。
第三章,数据转换,介绍了数据模型的概念,并向你展示如何对数据集应用系统化转换,使其完全可用于分析。你将学习如何合并表格、聚合值、应用循环和使用变量。在教程中,你将从原始交易数据开始,构建一个简单的自动化财务报告工作流。
第四章,什么是机器学习?,分辨出智能机器能够从数据中自主学习的神话与现实。本章为你提供机器学习的基础(如现有算法的分类、如何验证模型以及如何评估模型的准确性),并让你开始识别 AI 如何影响你实际工作的方式。
第五章,在工作中应用机器学习,将实践你在前一章中学到的内容。它的三个实用教程将让你体验到真实世界中机器学习的全部内容。你将感受到预测罗马房地产租金价格、预测消费者在银行营销活动前的反应以及细分在线零售商客户的兴奋。通过跟随这些教程,你将构建自己的预测机器“模板”,然后根据需要将其调整以适应具体的业务需求。
第六章,Power BI 入门,为你准备面对一个永恒且核心的需求:构建有效的仪表板,"让数据和洞察"普及"。在本教程中,你将构建一个完全操作的 Power BI 管理仪表板,包括准备基础数据模型以及在图表间创建链接以驱动互动。
第七章,有效地可视化数据,解释了如何构建专业的数据显示,传递商业洞察。该章将为你提供一个框架,帮助你根据业务需求选择正确的图表类型,并提供一套视觉设计指南,确保你的商业信息清晰、响亮且明了。
第八章,用数据讲故事,训练你系统地准备并传达数据故事,以推动商业行动。从说服的基本原则开始,本章将教授你几种技巧,使你的数据驱动论点尽可能具有吸引力。本章将为你提供一个结构化的模板(数据故事画布),你可以将其放在桌面上,随时使用。
第九章,扩展你的工具箱,让你初步了解超越前几章所包含工具和技术的内容,以便你能够为下一步的发展规划做好准备。本章包含了 Tableau、Python(包括其与 KNIME 的集成)以及 H2O.ai 自动化机器学习的动手实践和指导示范。阅读这最后一章将证明通过完成这段学习旅程,你将获得的一系列技能的普遍价值。
为了最大限度地利用本书
让我分享一些建议,帮助你开始即将踏上的学习之路:
-
本书配有多个循序渐进的动手教程,这些教程是我为你设计的开发路径的重要组成部分。数据分析中一些最微妙且最引人入胜的方面(比如需要与业务伙伴互动并在设置过程中反复交流)只能通过真实示例来理解:教程很好地解释了这些内容。我强烈建议你为每个教程安排一些高质量的时间来完成。完成一个教程的整个过程大约需要两小时:确保你有一台可以安装所有必需软件的计算机。
-
在书的最后,你将找到按章节组织的一系列有用资源。这些资源提供了一个机会,让你通过选定的附加阅读来补充学习体验。所以,完成每一章后别忘了浏览一下它们,看看其中是否有任何内容引起你的兴趣。
-
根据你的背景,书中的某些部分可能对你来说不太“自然”。这是正常的。如果书中的某个部分不太清楚,别灰心:各章之间紧密相连,你可能会在后续的页面中找到疑问的答案,所以继续读下去,直到最后。
-
使用本书的 GitHub 和 KNIME Hub 页面下载完成教程所需的所有数据。在那里,你还将找到每个教程的最终结果(如完整的 KNIME 工作流或结果 Power BI 仪表盘)。如果你感到迷茫,可以参考它们以找到前进的方向。
-
软件在不断改进和更新。本书依赖于在发布时最新版本的 KNIME 和 Power BI(具体来说是:KNIME 4.4 和 Power BI 2.93)。虽然大部分内容会在一段时间内保持有效,但有些教程中的步骤可能会有所变化,导致图中的界面与实际使用时的界面有所不同。这是不可避免的,并不会影响你的学习。请关注本书的网页,查看我发布的任何勘误或补充说明,以防由于软件版本更新而出现重大差异。如果需要,你也可以使用“现在怎么样?”部分中的联系方式与我取得联系。
-
本书的目标是数据分析的“商业应用”。因此,每当我必须在严谨的数学论文和实用且直观的分析方法解释之间做出选择时,我都会选择后者。原因是,您总是有时间学习如何使统计学习更加精确,并深入了解您将学习的算法背后的数学。因此,本书的重点将始终放在帮助您在工作中更好地使用分析工具,而不是提供每个数学概念背后的正式描述。
下载数据文件
本书中展示的所有数据和相关教程文件也托管在 GitHub 上,网址为github.com/PacktPublishing/Data-Analytics-Made-Easy。数据和已完成的 KNIME 工作流也可以在 KNIME Hub 上找到,地址为tiny.cc/knimehub。
我们还提供了来自我们丰富图书和视频目录的其他代码包,您可以在github.com/PacktPublishing/找到。快去看看吧!
下载彩色图像
我们还提供了一份 PDF 文件,其中包含本书中使用的截图/图表的彩色图像。您可以在这里下载:static.packt-cdn.com/downloads/9781801074155_ColorImages.pdf。
约定使用
本书中使用了若干文本约定。
CodeInText:表示用户输入、文本中的代码词汇、代码中的突出显示关键词、路径和文件名。例如:“在配置窗口中,输入表达式$Quantity$*$Price$来计算收入。”在本书中,您将在第九章《扩展您的工具箱》中找到少量示例代码块。它们将像这样:
predictions = model.predict(test_set)
print('R2 score is',r2_score(test_set.Rent,predictions))
print('Root Mean Squared Error is', \
np.sqrt(mean_squared_error(test_set.Rent,predictions)))
粗体:表示新术语、重要词汇、KNIME 节点或您在屏幕上看到的词汇,比如在菜单或对话框中。例如:“点击确定关闭窗口并执行 CSV Reader 节点。”
斜体:用于强调句子中的特定词汇,以及引用数据集中的列,例如:“Neighborhood(邻里)是预测租金时最有用的单一列,其次是Surface(房产面积)。”
警告、重要提示或有趣的事实会以这种方式显示。
提示和技巧如下所示。
联系我们
我们始终欢迎读者的反馈。
一般反馈:请通过电子邮件feedback@packtpub.com联系我们,并在邮件主题中提及书名。如果您对本书的任何部分有疑问,请通过questions@packtpub.com与我们联系。
勘误:尽管我们已尽一切努力确保内容的准确性,但错误是难以避免的。如果你在本书中发现错误,我们将非常感激你向我们报告。请访问www.packtpub.com/submit-errata,选择你的书籍,点击“勘误提交表格”链接,并填写相关细节。
盗版:如果你在互联网上发现我们的作品以任何形式的非法副本,我们将感激你提供其位置地址或网站名称。请通过copyright@packtpub.com与我们联系,并附上该材料的链接。
如果你有兴趣成为作者:如果你在某个领域有专业知识,并且有兴趣撰写或参与撰写一本书,请访问authors.packtpub.com。
分享你的想法
一旦你阅读了《数据分析简明指南》,我们很想听听你的想法!请点击这里直接前往本书的亚马逊评论页面并分享你的反馈。
你的评价对我们和技术社区都非常重要,并将帮助我们确保提供优质的内容。
第一章:什么是数据分析?
在我们开始穿越这片广阔而令人兴奋的数据分析领域之前,明智的做法是准备一张最新的地图,帮助我们找到正确的道路。在本章中,你将学习所有这些基础概念,帮助你清晰地理解数据分析在公司中的作用。这将使你能够发现利用数据的机会,并决定如何从中提取商业价值。你还希望对该领域采用的命名约定充满信心,以避免任何混淆,并能果断地与他人交流。鉴于当前数据分析的快速发展,在开始深入涉及表格和算法之前,建立坚实的基础概念是一个明智的选择。
具体而言,在本章中,你将找到以下问题的答案:
-
在公司中我们可以找到哪些类型的分析?
-
谁应该设计、维护并使用它们?
-
数据分析需要什么技术才能工作?
-
数据分析工具箱是什么,它包含了什么?
-
数据如何转化为商业价值?
尽管本书的这一部分比其他部分更偏理论,但我向你保证:你遇到的所有概念都是为了帮助你更好地理解你在成为数据分析实践者的过程中将会遇到的内容。现在我们已经准备好出发了;让我们开始吧!
三种类型的数据分析
数据分析一词通常指用于从数据中提取某种价值的过程和技术。有时,这个词也指实际用于实现这种转化的工具。无论如何,数据分析代表了我们如何将原始数据转化为更具可操作性和价值的东西。我们可以识别出三种不同类型的数据分析,每种类型都有其独特的特点和可能的应用:描述性分析、预测性分析和规范性分析。
描述性分析
描述性分析是任何分析工作中不可或缺的“基础内容”。这些方法专注于描述过去的数据,使其易于理解并根据业务需求加以利用。它们通过利用总结性统计数据(如平均值、中位数和方差)以及简单的转换和聚合(如指数、计数和总和)来回答通用问题“发生了什么?”,最终通过表格和可视化方式展示结果。描述性分析领域中最具代表性(也是最基础)的交付物是独立报告:这可以是以便携格式(PDF 文档和 Excel 工作表最为常见)的文件,定期通过电子邮件分发或发布在共享库中。大多数经理都喜欢报告,因为他们可以在不费吹灰之力的情况下找到所有感兴趣的关键绩效指标(KPIs)。实际上,他们不需要“去找”任何东西:数据会自动以他们需要的格式呈现出来。描述性分析中的更复杂交付物是互动仪表板:在这种情况下,用户通过基于 Web 的界面访问,他们可以在界面中查看感兴趣的数据。可视化和表格将展示最相关的业务方面,而过滤器、选择器和按钮则提供了用户定制数据浏览路径的可能性,让他们深入探索最感兴趣的部分。有时,仪表板会专门设计以取悦高层管理人员,仅关注最重要的 KPIs:这种仪表板被赋予更具画面感的名称——管理驾驶舱。如果独立报告为你提供了预设的引导式路线,互动仪表板则让你自己掌控数据的探索过程,允许你走一些不寻常的路径。尽管后者在揭示有价值洞察方面显然具有更大的潜力,但一些不太冒险的经理仍然更喜欢直接将独立报告发送到他们的收件箱。为了同时取悦这两类需求,仪表板可以设置为提供订阅服务:在这种情况下,用户可以注册定期通过电子邮件接收来自仪表板的可视化或表格,或者在数据发生变化时立即收到更新。订阅是一项有前景的功能,因为它避免了更新仪表板和传播报告时的重复劳动。
预测分析
预测性分析的重点是回答你在了解过去发生了什么之后自然会提出的后续问题,例如:“为什么会发生这种情况?”和“接下来会发生什么?”这些方法论利用了更加复杂的技术,包括人工智能,超越了单纯描述历史事实的层面。通过使用这些方法,我们可以理解数据背后的因果关系,并对其进行外推,展示未来最有可能的样子。预测性分析的最简单示例是诊断工具:它们通过基于模型的推理,丰富了传统的描述性报告,揭示了我们在数据中看到现象背后的可能原因。通过使用基本的方法,如相关分析、控制图和统计显著性检验,这些工具能够突出有趣的模式,揭示出商业运行的某些方向。下一层次的复杂性由业务警报带来:在这种情况下,诊断检查会自动进行,当某些对业务有影响的情况(例如,某个品牌的市场份额跌破某个阈值)出现时,用户会收到通知。同样,在异常检测的情况下,算法会持续检查数据,寻找任何模式中的不一致之处,并将其标记出来,以便进行相应的管理:例如,生产线传感器生成的数据可以用于及早发现故障并触发所需的维护。预测性分析还包括一些方法,这些方法通过生成预测,例如销售额、价格、市场规模和风险水平,来预测未来的情况,所有这些都能帮助管理者做出更好的决策,为即将到来的事情做好准备。此外,像消费者和竞争对手等个体的行为也可以被预测出来,从而提供竞争优势,并提高未来活动的投资回报率(ROI)。在倾向模型的案例中,人工智能被用于预测客户对商业报价的喜好程度,或者他们离开我们商店或服务的可能性(流失),这使我们能够调整客户保持活动。预测性分析的另一个例子是,当我们利用数据和算法对业务进行智能细分时,例如将相似的客户、商店或产品分组。通过量身定制我们的管理方式,我们可以提高运营效率,让客户体验更加个性化和互动性更强。
处方性分析
规范性分析通过回答每个业务经理心中的终极问题:“应该做什么?”将数据转化为建议的行动方案。如果描述性和预测性分析为我们提供了洞察并告知我们业务的情况,那么规范性分析无疑更为果断和直接:它告诉我们该做什么。例如,它可以模拟一组大量的备选方案,并在其中实施系统优化:其输出将是“最佳方案”,旨在最大化利润或最小化成本,基于当前的条件。其他规范性分析的例子包括所谓的推荐系统:本质上,它们为用户提供产品推荐。这些算法几乎无处不在,成为我们日常数字体验的一部分。当我们在亚马逊上购物,或在 Netflix 上犹豫该追哪部电视剧时,我们将看到某些推荐系统的输出,向我们提供一系列我们可能喜欢的有限选项。规范性分析的最终高度是在于不仅仅是推荐该做什么,而且还负责执行这些操作!事实上,当这些系统实时运行时,可能没有任何人能够完全控制或明确批准机器所做出的每一个决策或推荐。在某些情况下,算法被设计成像自主代理一样:它们负责通过反复试错的过程来学习。它们会不断地在现实世界中测试自己的策略,并根据需要进行调整,其最终目标是长期内最大化回报。这在自动化交易(FinTech 中的一个新兴趋势)和程序化广告(即通过自动竞价实时购买数字媒体)中便是如此。
在你的阅读中,你会发现,作为一种命名约定,描述性分析通常与商业智能(Business Intelligence)这一术语相关,而预测性和规范性分析则被称为高级分析(Advanced Analytics)。由于这些领域之间没有明确的界限,有时可能会感到困惑——别担心,这是正常的。
在本书的过程中,你将遇到所有类型的数据分析,并将学习如何在你的业务中实现它们。图 1.1展示了这些不同类型分析之间潜在价值和复杂性之间的权衡:

图 1.1:数据分析类型——你希望解锁多少价值?
数据分析的实践
现在,我们已经掌握了描述性、预测性和规范性分析的基础知识,接下来是看看它们如何在实践中应用。Katia 是一家跨国酒店连锁的首席数据官(CDO)。让我们看看她是如何总结她们在过去几年中整理的一系列数据分析能力的:
-
董事会成员每月通过电子邮件收到一份 5 页的报告。报告包括分析师准备的简短执行摘要,突出关键要点,并附有按国家、品牌和酒店类型分类的标准表格和 KPI 趋势图表。
-
所有经理都可以访问每周更新的在线仪表板,仪表板上展示了最重要的措施,并且可以深入查看非常详细的数据,比如个别酒店的最新入住率或当前的房价。
-
区域经理订阅了一个警报工具,当某些设施未能按计划达到月度目标时,系统会通知他们。当月度预测低于预期目标的某个阈值时,会自动发送电子邮件。
-
房价由一个名为AutoPrice的中央系统动态管理。该系统根据季节性、趋势和网络用户的兴趣,模拟各设施的不同入住率。AutoPrice 可以每日调整房价,以最大化利润,前提是预计的销售和成本。
-
参加奖励计划的客户偶尔会收到房间升级或奢华酒店周末度假等特别优惠。一个倾向性模型根据客户的需求调整优惠(控制折扣力度),以最大化奖励兑换和预期利润。
-
每月新闻通讯的订阅者根据他们的社会人口特征和兴趣,被分为四个同质化的群体(商务、家庭、优惠猎人和高端用户)。每期新闻通讯的内容根据不同群体有所不同。每个新订阅者在注册时会自动分配到一个群体。
-
当 COVID-19 大流行爆发时,分析师建立了一个统计模型,以预测各国即将对销售产生的影响,并构建了不同的演变情景。基于此工作,公司制定了一个成功的应对计划,包括临时关闭和裁员、将餐厅改为外卖服务,以及与当地政府合作,将房间转为低护理感染患者使用。
-
在法国推出竞争性连锁酒店后,数字营销团队与数据科学家合作,建立了一个数据驱动的应对计划,旨在加强在风险较大地区的沟通活动,以防流失客户。此外,他们还建立了一个流失模型,向那些最可能转向新竞争对手的会员发送个性化的保留优惠。
我们现在必须停止 Katia,否则她会继续讲下去,甚至还会再写好几页!所有这些例子展示了数据分析在企业中的广泛应用和多样性。它们还给我们提供了机会,观察一些普遍模式,这些模式的价值超出了酒店连锁的案例:
-
三种数据分析类型并不一定是彼此替代的。实际上,它们通常在公司中共存——你不需要“选择”其中之一。例如,尽管你可能已经掌握了一些前瞻性的高级分析技巧,但你仍然会需要持续的描述性分析,比如管理报告或仪表盘。你不能只是“忽略”基础知识,否则你将无法获得其他方面的支持。
-
同一业务的不同方面可能会从三种不同类型的分析中获益。例如,在酒店定价的案例中,你可以报告平均房价(描述性分析),也可以基于不同价格预测情景(预测性分析),或是自动设置最佳房价(规范性分析)。每个业务方面都有机会应用不同类型的分析。
-
不同类型的分析可以部分重叠并交叉丰富。例如,在管理仪表盘(描述性分析)中,我们可能会根据酒店是否能达到年度目标的可能性(预测性分析)添加不同的颜色编码。
-
通过数据分析创造价值的一些机会是临时性的,依赖于特定的偶发情况:例如 COVID-19 模型和对竞争性举措的响应。其他则是持续性和系统性的,例如定期的报告和仪表盘更新,或实时的价格优化。数据分析既能为临时情况带来价值,也能为持续性的情况提供帮助。
借助这个例子,我们现在更加清楚地了解了三种不同级别分析的具体样貌。在继续讨论下一个话题之前,值得思考一下商业智能(描述性分析)与高级分析(预测性和规范性分析)在业务影响上的差异,如表 1.1所总结的:
| 方面 | 描述性分析(商业智能) | 预测性/规范性分析(高级分析) |
|---|---|---|
| 用户群体 | 广泛 | 限定 |
| 实施复杂度 | 低 | 高 |
| 管理层所需信任度 | 低 | 高 |
| 潜在价值 | 低 | 高 |
表 1.1:不同分析方法的业务影响
描述性分析往往有广泛的潜在用户群体。相同的仪表板和报告可以对公司内不同级别的同事、业务部门和职能单位都有用。实际上,公司中普遍的一个感觉是“数据在那儿,但不知道在哪里”:数据可以通过强大的商业智能产品进行民主化,能够释放其更多的价值。考虑到这些能力潜在的用户群体广度,值得为“普遍”部署活动做好规划,以便每个人都有机会成为用户,并最大化该能力对业务的影响。通常,仪表板在长时间内未被充分利用,或者干脆被遗忘,因为人们不知道如何使用它们:定期培训的一个更大原因就是确保它们对每个人都能保持可访问,包括新员工。
毫无疑问,设计和实施预测性与规范性分析的复杂度高于描述性分析。你将需要熟练的业务分析师和数据科学家(我们将在接下来的几页中讨论角色),原型设计、部署和扩展所需的时间通常也更多。因此,采用敏捷和迭代的方式是值得的,这样可以逐步释放增量价值,并避免失去势头和利益相关者的热情。
高级分析在公司内部更难被接受,需要高级管理层的更有决断力的支持才能顺利进行。想想看:描述性分析通过告知人们发生了什么,帮助做出更好的决策。另一方面,规范性分析则直接告诉你可以做出的最佳决策,这可能会限制管理者凭直觉指导业务的能力。那些“掌控”决策的算法需要比普通报告更高的信任才能被接受。你越是向高级分析进展,就越需要涉及高层管理并让他们支持这一转型。这将抵消人们天生的“保护”自己角色和权力的倾向,抵御所有威胁,包括那些自信地规范决策的算法。
就像生活中的大多数事情一样,你得到的就是你付出的。高级分析更复杂,需要更多的管理关注,但它所能释放的潜在价值要高于描述性分析。我的建议是寻找机会,逐步提升分析的角色,把你的能力发展方向推向分析阶梯的高级端。同时,你也不想“忘记”赋能更多同事通过描述性分析实现更智能的业务管理,借助数据的民主化访问。
谁参与数据分析?
本节标题的简短回答也是最明显的:每个人在数据分析中都有一份职责——没有人被排除在外!事实上,所有的知识工作者无疑都会在工作中处理数据:他们以某种方式与数据分析互动,可能仅仅作为被动用户,也可能是参与的另一端,作为数据能力的主要创造者和拥有者。我们可以将与数据分析相关的角色分为四个类别:业务用户、业务分析师、数据科学家和数据工程师。让我们深入了解每个角色的含义以及它所需要的能力:
| 角色 | 垂直业务知识 | 数据分析与讲故事 | 机器学习算法 | 编程 | 数据架构 |
|---|---|---|---|---|---|
| 业务用户 | ★``★``★ |
★ |
★ |
||
| 业务分析师 | ★``★ |
★``★``★ |
★``★ |
★ |
|
| 数据科学家 | ★ |
★``★``★ |
★ ★ ★ |
★ |
|
| 数据工程师 | ★``★ |
★ ★ |
★``★``★ |
表 1.2:不同用户的能力
-
业务用户无论职能和级别如何,包括高级经理,肯定都会在某种程度上与数据分析互动。尽管他们的主要角色是作为用户,他们将极大受益于对数据分析和讲故事技巧的基本理解。这些技能将帮助业务用户最大化地利用数据,将其与自己的业务知识结合,正确解读数据,并通过有效的可视化和讲故事来传达洞察。此外,了解如何使用 Excel 中的宏或稍后我们会学习的 KNIME 中的工作流来自动化日常“数据处理”工作,也会积极影响他们的个人生产力。最后,他们应该对高级分析能为他们做什么有基本的理解,并掌握机器学习及其算法的基本概念。他们显然不需要成为专家。然而,直到他们看到“可能性”,否则他们就无法预见到如何利用数据来影响业务的机会。
-
业务分析师(或数据分析师)在将看似脱节的业务和数据两个领域连接起来方面发挥着根本作用。他们对业务动态(市场、客户和竞争格局)有着非常扎实的理解,因为他们与来自各个职能部门(销售、营销、财务等)的合作伙伴保持着密切联系。凭借强大的业务背景,他们能够主动捕捉分析机会,为业务带来改变,并将业务需求“转化”为下一步数据能力所需的技术要求。业务分析师精通数据分析(因为他们需要不断“剥洋葱”并从大量数据中提取业务相关的洞察)和故事讲述(因为他们希望他们的数据发现能够产生强烈的影响并推动行动)。与此同时,他们熟悉机器学习概念:他们将直接使用这些概念来解决业务需求,同时也会在将这些能力交给数据科学家进行扩展之前,进行高级分析能力的原型设计。尽管这不是他们工作中的严格要求,也不是重点,但具备基本的编程能力可以帮助他们构建数据提取查询并解开更繁琐的数据转换步骤。
-
数据科学家专注于设计和扩展高级分析能力。他们是公认的机器学习算法专家,能够从头开始实施预测性和指引性分析,或在现有原型基础上进行构建。他们与业务分析师紧密合作,通过业务分析师保持与“最新”业务需求的联系,并与数据工程师合作,这是确保数据能力可持续性和扩展性的主要伙伴。数据科学家精通编程,尤其擅长对数据应用高级转换,并利用最先进的机器学习库。
数据科学是一个跨学科领域,涉及数学、统计学和计算机科学,研究如何系统地从数据中提取价值。每个人——不仅仅是数据科学家——都能从使用数据科学的某些方面中受益。
- 数据工程师(以及相关岗位,如系统工程师和数据架构师)通过处理底层数据基础设施的技术复杂性,确保分析系统的正常运行。数据工程师的工作对构建稳定的数据管道并维护其持续可用至关重要。他们与数据科学家合作——以适当配置存储和计算资源,并设计合适的数据架构——并与其他信息技术(IT)职能部门合作,确保跨企业系统的兼容性,并确保信息安全达到可接受的标准。
这四个角色,每个都有自己特定的任务,将共同覆盖公司中与数据分析的大多数交互。无论你与哪一角色更为接近,你肯定有一个在从数据中提取价值的角色。在下一部分,你将了解一些能够帮助你发挥最佳表现的工具。
数据分析技术
赋能公司数据分析的技术并不是一个单一的整体。实际上,涉及了多个硬件和软件系统。为了简化,你可以将它们看作是分为三层:这些层次彼此堆叠,形成了所谓的技术栈。每一层都依赖于下面的层次才能正常工作。让我们从下往上以“直升机视角”了解每一层的基本特点:
-
底层是物理基础设施。这部分是你可以触摸到的东西。它由存储和处理数据的服务器或大型主机计算机组成。公司可以选择自己构建并维护一套物理基础设施(通常保存在企业的数据中心),或者依赖于云服务提供商,从他们那里租赁所需的资源。
-
中间层是数据平台。该层的技术实现了存储在基础设施中的数据(数据架构)和可用计算能力的逻辑组织。即使数据存储在不同的数据库中,在平台层,它会被虚拟地统一,呈现出一个更简洁、更和谐的视图。
-
最上层由应用程序组成。此处是数据分析方法被实现到用户界面应用中的地方。应用程序利用有序的数据和底层平台提供的计算能力,以不同方式服务用户。有些应用程序将为用户提供探索数据、理解数据和识别洞察的接口(商业智能);其他应用程序将使专家用户能够将其推向更高层次,构建预测或建议(高级分析)。
这个三层栈模型无疑是对现实世界数据基础设施的多面性简化。然而,它给我们带来了一个好处,即能够一次性地展现数据可能具有的不同抽象层次,并引入了随之而来的若干挑战:

图 1.2:支持数据分析的技术栈。箭头说明了哪些角色与技术栈的哪些层进行交互
我们之前看到的四个角色将在技术堆栈的不同层次上“操作”。数据工程师将处理数据基础设施的复杂性及其在平台中的组织方式。数据科学家通常会利用先进分析应用来构建模型,有时会直接在平台层级访问数据,以享受最大灵活性。商业分析师将轻松使用高级分析工具和商业智能应用,这些工具也可以用来为他人设计可操作的数据探索路径。商业用户则只与易于使用的商业智能界面互动:与数据存储及其在平台中的组织相关的所有复杂性将被巧妙地远离他们的视野。
数据分析工具箱
在所有与数据分析相关的技术中,本书将重点关注应用层。这是“魔法”发生的地方:分析应用能够将数据转化为实际的商业价值,在接下来的章节中,你将学习如何实现这一点。
市面上有许多数据分析应用可供使用。每个应用都有其优点和特点。尽管有些应用非常多功能,但没有任何一个应用可以满足我们在工作中可能遇到的所有分析需求。因此,我们应该挑选一系列工具,它们将共同覆盖一个可接受的需求范围:这些工具构成了我们的数据分析工具箱。通过学习如何使用和有效结合我们放入工具箱中的少数工具,我们可以成为自主的数据分析实践者。就像管道工对使用的工具有个人偏好一样,你也会有自己的喜好,并且可以根据个人口味定制你的工具箱。你只需确保挑选出合适的工具组合,以便随时获得广泛的功能。
让我们逐一了解哪些工具符合添加到工具箱中的条件:
-
电子表格:尽管它们的分析能力相当有限,但由于其易用性和广泛的可移植性,电子表格应用几乎无处不在,便于与同事共享数据。几乎每个人都能够打开一个Microsoft Excel 文件(或其开源替代品 OpenOffice Calc,或基于云的服务如 Google Sheets),并添加简单的公式计算。它们在创建简单的、一次性的数据显示时也非常有帮助:其图形定制化的程度足够应对许多日常数据呈现需求。另一方面,电子表格软件不足以创建强大和自动化的数据工作流:即使是一个简单的 Excel 报告,刷新也需要手动步骤,并容易出现人为错误。
-
商业智能:这些工具最适合用于创建高级数据可视化和交互式仪表盘。像Microsoft Power BI、QlikView/Qlik Sense、Tableau 和 TIBCO Spotfire 这样的工具可以帮助你实现用户友好的数据应用,目的是让数据民主化并使其为大众所用。它们提供了丰富的可视化选项,并可以将图表关联起来,从而实现引导式的数据探索体验。尽管其中一些工具已经实现了算法,但高级分析并不是它们的强项:它们更适合用于大规模实施描述性分析:
![]()
图 1.3:使用 Qlik Sense 构建的仪表盘 – 左侧的导航窗格引导你通过不同的可视化方面
- 低代码分析:这些工具使你能够在不编写代码的情况下快速构建高级分析工作流。它们的“秘诀”是基于工作流的用户界面:通过构建由逐步数据转换步骤和可定制建模模块组成的流程图,你可以在创纪录的时间内构建一个完全可操作的分析应用程序。由于其直观的界面和不需要编码的特点,像KNIME、RapidMiner 和 Alteryx Designer 这样的工具可以被专家数据专业人士(如数据科学家和业务分析师,用于快速原型化高级功能)以及非数据专业的知识工作者(寻求自动化其繁琐、定期的数据报告活动)使用:
![]()
图 1.4:Alteryx Designer 的用户界面 – 每个图标都是数据流中的一个转换步骤
- 基于代码的分析:最传统的高级分析方法是使用数据科学友好的编程语言(如 Python、R 和 Scala)编写代码。考虑到这些语言中有大量的机器学习库,数据科学家可以利用它们构建高度定制化和高效的分析解决方案。这些解决方案可以嵌入实时应用中,并根据需要在公司范围内扩展。为了实现这一点,数据专业人士会使用集成开发环境(IDEs),如 R 的 RStudio 和 Python 的 Jupyter Notebook、Visual Studio 或 PyCharm:
![]()
图 1.5:Jupyter Notebook 的截图 – 你可以通过 Web 界面运行 Python 代码
你不应该把这四种类型的分析看作是互相排斥的选择。实际上,正好相反——它们各自有互补的优点和缺点,并能优雅地融合在一起。让我们来看一个例子:Laura 是一个为汽车制造商工作的供应链数据分析师。她需要迅速构建一个能够预测生产线级别零部件未来需求的能力,并将结果提供给全球的多个采购分析师和工厂经理。Laura 决定在 KNIME 中构建一个工作流,该工作流从几个企业数据库中提取历史需求数据,并将其与库存实际情况结合。在初步探索阶段之后,Laura 使用 KNIME 的本地功能构建了一个需求预测模型,随后通过向 KNIME 中直接添加一些自定义的 Python 代码来优化该模型。之后,Laura 完成了工作流的最后清理步骤,并将预测结果直接导出到 Power BI 数据集中。最后,Laura 在 Power BI 中构建了一个简单的仪表盘,里面包含几个表格和简单的折线图,使最终用户能够探索数据、根据他们的兴趣区域进行筛选,并将数据导出到一个方便的 Excel 文件中,以便进一步分析和共享。
Laura 能够迅速完成这项伟大的工作,因为她使用了整个分析工具箱,其中包括 KNIME、Power BI 和一点 Python。她通过发挥这些工具的优势,巧妙地选择了合适的工具来满足她的特定需求。如果没有一个多功能的工具箱,Laura 很难满足她业务案例所要求的严格时间要求。
Laura 的故事生动地证明了建立一个多功能数据分析工具箱的必要性:无论你的角色是什么,拥有一套互补的工具来转换、丰富、建模和可视化数据,都会在日常的数据需求中给你带来优势。
在本书的其余部分,我将为你提供一个预构建的“工具包”,其中包含一组选用的工具,它们能够很好地协同工作:KNIME 和 Power BI。这些工具有多个优点。首先,它们可以免费下载并安装到你的计算机上。虽然两者都提供付费版本,但你会发现免费版本提供的功能已足够满足大多数日常需求。另一个优点是,它们都不需要严格的编程技能。这意味着,你可以充分利用这个工具包,而不必成为熟练的 Python 或 R 程序员,这使得它成为适用于所有使用数据的专业人士的工具包,而不仅仅是专家级的数据科学家。对于那些懂得编程的人来说,可以通过集成代码片段进一步扩展这个工具包,就像 Laura 在她的项目中做的那样。最后,KNIME 和 Power BI 特别适合相互配合使用。如果你查看图 1.6,它们共同覆盖了你可能遇到的大部分需求,从数据自动化和高级机器学习到专业的数据可视化和仪表盘:

图 1.6:多个数据分析工具的比较——一刀切的方式并不适用
在我们开始构建数据分析工具箱之前,让我们先了解一下如何从中创造实际价值的各种方式。
从数据到商业价值
数据本身没有价值,除非它能够转化为价值。无论我们的模型多么复杂和准确,无论我们揭示了多少深刻的见解,数据只有在最终推动一些能够积极影响业务的行动时,才能产生真正的影响。坏消息是,推动行动可能相当复杂,往往比构建强大的数据能力更具挑战性。好消息是,我们不仅有一种,而是有多种方法可以通过分析影响业务:我们称之为数据到价值的路径。在我们开始处理数据之前,明确这些路径非常重要,这样我们从一开始就能最大化我们所构建的内容对业务的相关性。你在商业中最常遇到的三种数据到价值的路径是:
-
临时分析:在这种情况下,你利用数据来影响特定决策,或揭示一个独特的机会或威胁。这是最耗时的路径,因为它肯定需要大量的人际互动,但也可能带来极大的回报。通过数据探索,并在必要时利用一些预测算法,你的起点是从数据中发现隐藏的洞察力。为了最大化其影响机会,你会构建一个引人入胜的故事,使决策者愿意与你一起做出正确决策,进而付诸实践。只有当(如果)这个决策付诸实践并转化为行动时,你才能凭借数据分析主张经济价值。许多有价值的数据发现从未得到实现,因为沿途的一些步骤失败了。有时,故事没有准备好或没有有效传递,使得一个好的建议无人问津。其他情况下,基于数据的计划没有得到执行,因为它们没有被充分解释或跟踪。在本书的剩余部分,你将学到如何最大化你的临时分析转化为实际价值的机会。
-
持续商业智能:当你走这条路径时,你的目标是系统性地为管理者提供相关信息,帮助他们更好地完成工作,从而最大化他们工作的价值。通过描述性分析,并在必要时使用一些诊断算法,你通过可视化和警报使数据“清晰响亮”地表达出来。通过数据分析为他人提供帮助,你能推动更好的行动,从而为企业创造增量价值。这条数据到价值的路径可能不如其他路径复杂,但它具备巨大的价值创造潜力,因为它能够持续影响许多人的工作。书中的后续部分,你将学习如何最大化数据能力,以支持持续的商业智能。
-
自动优化:当你走这条路径时,你使用规范性分析来获得一项行动计划,并自动执行。此时,数据和算法并不是在为他人提供信息或推荐行动方案,而是被放在驾驶席上,能够掌控业务流程的执行。其潜在收益巨大,因为算法可以不断优化公司运营的表现,且无需人工干预,或者仅需一些适度的监督:
![]()
图 1.7:数据到价值的三条最常见路径——你将首先选择哪一条?
在每个案例中,识别我们要追求的数据到价值路径将是至关重要的。根据我们选择的路线,可能需要实施某种类型的数据分析,并从我们的工具箱中选择特定的工具。无论如何,明确我们希望如何为企业创造价值,将最大化成功的机会。
概述
本章为你提供了开始数据分析实践所需的所有背景知识。我们了解了三种分析类型(描述性分析、预测性分析和规范性分析)之间的差异,并认识到每种分析背后潜在的价值。我们意识到几乎公司中的每个人都能从使用数据分析中受益,并熟悉了商业用户、分析师、数据科学家和工程师所需的不同角色和技能。我们窥见了实现数据分析所需的完整技术栈的复杂性:特别是,我们了解了数据分析从业人员应该随时在工具箱中准备的工具,突出了 KNIME/Power BI 的组合价值。最后,我们区分了数据转化为实际商业价值的几种路径。
我希望最后几页的内容进一步让你相信数据中隐藏的巨大商业潜力。现在是时候亲自动手了,在下一章中,我们将遇到我们的宝贵旅行伙伴——KNIME,带你穿越分析的土地。
第二章:开始使用 KNIME
现在是时候亲自接触数据了,让我们揭开 KNIME 的面纱,这是我们数据分析工具包中的第一个工具。本章将向你介绍任何低代码分析平台的基础功能,并帮助你开始进行每个数据分析项目初期的普遍需求:加载和清洗数据。
让我们来看看本章旨在回答的问题:
-
什么是 KNIME,我在哪里可以下载它?
-
什么是节点,它们是如何工作的?
-
数据工作流是什么样的?
-
如何在 KNIME 中加载数据并清洗它?
这将是一次非常实践性的入门,帮助你了解数据分析的日常操作。由于我们会花一些时间使用 KNIME,因此首先了解一些它的基础知识是值得的。
KNIME(/na�m/)的发音类似于单词knife,不过结尾是m而不是f。
KNIME 简介
KNIME 是一个低代码数据分析平台,以其易用性和多功能性著称。让我们一起来看看它最突出的特点:
-
KNIME 允许可视化设计数据分析:这意味着你可以通过简单的绘制来构建数据转换和建模步骤。就像你用铅笔和纸画出流程图来描述一个过程一样,使用 KNIME 时,你将用鼠标和键盘来描绘你想对数据做什么。这与基于代码的分析环境的做法有本质的区别:使用像 KNIME 这样的工具意味着你不需要写一行代码,除非你愿意。可视化的方法还让你清晰地看到数据在每一步操作中的变化。这使得即使是复杂的过程也变得直观易懂,并且更容易构建。对于像数据科学家这样的高级数据从业者来说,这意味着节省了大量调试原型的时间,因为他们可以轻松发现问题所在。对于需要进行数据分析的业务用户,KNIME 提供了一个非常友好的环境,适合任何想要从零开始学习的人。
-
它是开源的,且免费使用:你可以免费下载完整版本并安装到你的电脑上,不需要任何费用。与其他产品的试用版不同,它提供了完整的数据分析功能集,没有任何限制或时间约束。为了完整性说明:KNIME 还提供了商业产品(称为KNIME Server),它可以实现工作流的全面操作化,将其转化为实时应用和服务,但在我们的学习过程中不需要使用这些功能。
-
它提供了丰富的附加包库,用于扩展其基础功能。这些扩展包大多数情况下是免费的。某些扩展包允许你将 KNIME 与云平台(如 Amazon Web Services 或 Microsoft Azure)连接,访问其他应用(如 Twitter 或 Google Analytics 等),或者执行特定类型的高级分析(如文本挖掘或深度学习)。某些包甚至允许你在 KNIME 中添加 Python 或 R 代码,以便你可以实现它们广泛库中提供的最具体和最复杂的功能。这意味着,如果你会编程,你可以在 KNIME 中利用这项技能。好消息是——在绝大多数情况下——你根本不需要这样做!
-
最后,全球有一个广泛而不断壮大的社区,由 KNIME 的用户组成。这使得你更容易找到充满示例的博客和论坛(如 KNIME 官方论坛,forum.knime.com)、教程以及对你可能遇到的常见问题的答案。慷慨的 KNIME 用户还可以与其他社区成员分享一些现成的模块,以便其他人复制它们:这进一步丰富了在需要时可用的功能。
所有这些功能使得 KNIME 成为一款包罗万象的工具,以至于有些人将其称为数据分析的瑞士军刀。无论我们给它什么绰号,KNIME 都非常适合用于学习和实践日常分析,绝对是一款值得加入我们工具箱的工具。
现在是时候让 KNIME 在你的计算机上运行起来了:你可以从官网www.knime.com下载它。只需进入下载页面,开始为你的操作系统安装(KNIME 支持 Windows、Unix 和 Mac)。安装完成后,打开应用程序。在首次运行时,你可能需要确认工作区的位置;这将是你所有项目保存的文件夹。在确认工作区文件夹后(你可以选择任何你喜欢的位置),你就可以开始使用了:KNIME 的界面将欢迎你。
在 KNIME 中移动
当我们进入 KNIME 的世界时,熟悉我们将最常用的两个关键词是很有意义的:节点和工作流:
-
节点是 KNIME 中进行任何数据操作的基本构建块。你对数据进行的每一个操作——例如加载文件、过滤行、应用公式或构建机器学习模型——在 KNIME 中都用一个方形图标表示,称为节点。
-
工作流是描述你希望对数据进行操作的完整节点序列,从开始到结束。要在 KNIME 中构建数据处理过程,你需要选择所需的节点,并按所需的顺序连接它们,设计适合你的工作流:
![]()
图 2.1:KNIME 用户界面:你构建分析的工作台
KNIME 的用户界面包含了构建你所需工作流所需的所有节点,你可以根据需要自由组合。让我们一起了解一下启动应用程序时界面中的六个基本元素:
-
资源管理器。这里是你工作流的存放位置,保持它们的整洁有序。在这里你会找到:LOCAL工作区,包含存储在你本地计算机上的文件夹;KNIME 公共服务器,存储了许多按主题分类的示例,你可以用来获取灵感和复制;My-KNIME-Hub空间,它与你在 KNIME Hub 云上的账户相关联,你可以与他人分享私人和公共的工作流及可重用模块——这些模块在 KNIME 中称为组件(你可以通过在hub.knime.com注册,免费创建自己的空间)。
-
节点仓库。在这个空间里,你可以找到所有可用的节点,随时准备拖放到你的工作流中。节点按照层级分类:如果你点击每个标题左侧的>符号,你将进入下一级。例如,第一个分类是IO(输入/输出),其中包含多个子类别,如读取、写入和连接器。你可以通过在右上角的文本框中输入关键词来搜索所需的节点。试着在搜索框中输入
Excel,你会获得所有允许你导入和导出 Microsoft 电子表格格式数据的节点。就像画家在调色板中找到所有可用的颜色一样,仓库将为你提供所有可用的节点,供你在工作流中使用:![]()
图 2.2:节点仓库列出了所有可供你选择的节点
-
工作流编辑器。这里是魔法发生的地方:在这里你将组合所需的节点,按需连接它们,并看到你的工作流开始运作。沿用我们之前提到的调色板的类比,工作流编辑器就是你用来绘制数据杰作的白色画布。
-
节点描述。这是一个始终开启的参考指南,适用于每个节点。当你点击任何一个节点——无论它位于仓库中还是工作流编辑器中——这个窗口都会更新,显示你需要了解的所有关于该节点的信息。节点的典型描述包括三部分内容:它的功能和工作原理的总结、我们可以应用的各种配置步骤列表(对话框选项),以及节点的输入输出端口描述(端口)。
-
大纲。你的工作流可能会变得很大,你可能无法在工作流编辑器中完全查看它:大纲提供了工作流的全貌,并显示你当前在工作流编辑器中查看的部分。如果你拖动蓝色矩形框,你可以轻松跳转到你感兴趣的工作流部分。
-
控制台和节点监控器。在这个部分,你会找到几个有用的诊断和调试工具。控制台将显示最新的警告和错误的完整描述,而节点监控器则显示当前选中节点输出端口上的数据摘要。
你可以通过从视图菜单中添加和删除元素,来个性化用户界面的外观和感觉。如果你想恢复到原始设置,如上图所示,只需点击视图 | 重置视角...。
虽然这六个部分涵盖了所有基本需求,但 KNIME 用户界面还提供了更多可能会引起你好奇的部分。例如,在左侧,你可以看到工作流教练,它会根据其他用户的操作,建议你下一个最可能添加到工作流中的节点。最后,在节点描述的同一窗口中,你会找到一个附加面板(在顶部查找其标题),名为 KNIME Hub:在这里,你可以搜索示例、附加包和模块,这些可以直接拖放到你的工作流中,方式和从节点库中拖放一样。
节点
节点是 KNIME 的核心,我们需要对它们有完全的信心:让我们来了解它们是如何工作的,以及有哪些类型的节点可用:

图 2.3:KNIME 节点的构成:交通信号灯告诉我们当前的状态
正如上图所示,节点看起来像是带有一些文本和形状的方形图标。更具体地说:
-
在节点的顶部,你会看到它的名称,以粗体显示。该名称简要地告诉你该类型的节点执行什么操作。例如,要重命名表中的某些列,我们使用的节点叫做列重命名。
-
在方框的底部,你会看到一个注释。这是一个标签,用于说明该节点在你的工作流中的具体作用。默认情况下,KNIME 会为每个新添加到工作流中的节点应用一个计数器,如节点 1、节点 2 等。你可以通过双击注释来修改它。
我强烈建议你在工作流中的每个节点上添加简短的注释,解释该节点的作用。当工作流变得复杂时,你很快就会忘记每个节点的具体功能。相信我:这是一个值得投入时间的事情!
-
节点通过端口连接,这些端口位于方框的左右两侧。按照惯例,左侧的端口是输入端口,它们将数据引入节点,而右侧的端口是输出端口,承载节点执行的结果。端口的形状和颜色可能不同,这取决于它们承载的内容:大多数端口是三角形的,因为它们传递数据表,但也可能是方形(模型、连接、图像等)或圆形(变量)。
-
在每个节点的底部,您会看到一个交通信号灯,显示节点当前的状态。如果红灯亮起,说明节点尚未准备好执行任务:可能是某些必需的数据尚未作为输入提供,或者需要进行一些配置步骤。当信号灯呈琥珀色时,说明节点已经具备所需的一切,准备在您的命令下执行。绿灯表示好消息:意味着节点已成功执行,结果可以在输出端口获得。如果出现某些图标说明有问题:黄色三角形带感叹号表示警告,而红色圆圈带叉表示错误。在这种情况下,您可以将鼠标悬停在图标上几秒钟(会显示一个标签)或通过查看控制台来了解问题所在。
正如我们在 Node Repository 中已经看到的,KNIME 提供了几种类型的节点,每种节点都可以满足不同类别的数据分析需求。以下是最常见的几类:
-
输入与输出:这些节点负责将数据导入和导出 KNIME。通常,输入节点位于工作流的开始部分:它们可以打开不同格式的文件(如 CSV、Excel、图像、网页等),或连接到远程数据库并提取所需数据。正如您在图 2.4中看到的,输入节点仅在右侧有输出端口,左侧没有任何输入端口(除非需要与数据库建立连接)。这很有意义,因为它们的作用是通过从某处读取数据后将其导入工作流来启动工作流。相反,输出节点通常在工作流的末尾使用,因为它们可以将数据保存到文件或云端位置。它们很少有输出端口,因为它们结束了我们的操作链。
-
数据处理:这些节点能够处理数据表并根据我们的需求对其进行转换。它们可以应用聚合、合并、排序、筛选和重塑表格的步骤,还能处理缺失值、数据标准化以及数据类型转换。这些节点与前述节点一起,几乎在任何数据分析工作流中都是必不可少的:它们可以共同清理数据并将其准备成任何后续步骤所需的格式,例如创建模型、报告或图表。这些节点可以有一个或多个输入端口和一个或多个输出端口,因为它们能够合并和拆分表格。
-
分析:这些是最聪明的节点,能够构建统计模型并支持人工智能算法的实现。在专门讲解机器学习的章节中,我们将学习如何使用这些节点。现在,最重要的是要有一个安慰人心的想法,那就是即使是复杂的人工智能过程(比如创建深度神经网络)也可以通过明智地组合我们节点库中的正确建模节点来实现。正如你在图 2.4中看到的,某些端口是方形的,它们代表的是统计模型而非数据表。
-
流程控制:有时,我们的工作流需要超越简单的单分支结构,其中数据只流动一次,并遵循一条单一的节点链。这些节点可以在各个分支之间创建循环,这样我们就可以通过循环重复多个步骤,就像程序员使用流程控制语句一样(对于会编程的人来说,想想
while或for语句)。我们还可以通过变量控制节点的配置,动态地改变节点的行为。这些节点更加高级,尽管我们大多数时候不需要它们,但当遇到困难时,它们是一个有用的资源。 -
其他所有:除了上面提到的节点外,KNIME 还提供了许多其他类型的节点,可以帮助我们满足更具体的需求。某些节点让我们通过称为应用程序编程接口(APIs)的接口与第三方应用程序系统地交互:例如,一个名为 KNIME Twitter Connectors 的扩展让你搜索推文或批量下载公开用户信息,以便进行分析。其他扩展则让你将 KNIME 与 Python 和 R 等编程语言结合使用,这样你就可以在 KNIME 中运行代码片段,或者从其他环境中执行 KNIME 工作流。你还会有运行统计测试、构建可视化或生成完整报告的节点。
当你在 KNIME 中寻找高级功能时,可以访问 KNIME Hub 或在 nodepit.com 上进行搜索,这是一个用于搜索 KNIME 工作流、组件和节点的搜索引擎。

图 2.4:按类型选择的 KNIME 节点:这些是你数据分析流程的 LEGO® 积木
我希望了解可以通过节点完成的各种任务能激起你更大的兴趣。现在是时候看看节点的实际应用,并构建一个简单的 KNIME 工作流了。
在 KNIME 中的 Hello World
当你创建第一个工作流时,你将学习如何与 KNIME 的用户界面进行交互,连接、配置和执行节点:这就是任何 KNIME 用户的核心,你即将成为其中的一员。
本节的标题是为技术爱好者准备的:事实上,当你学习一门新的编程语言时,"Hello, World!" 是你编写的第一个程序。它非常简单,旨在展示一种语言的基本语法。
假设我们有一个简单且重复的数据操作需要定期执行:每天我们都会收到一个逗号分隔值(CSV)格式的文本文件,该文件报告了按国家分列的年初至今的累计销售额。原始文件有一些不必要的列,且行的顺序是随机的。我们需要执行一些基本的转换步骤,以便最终得到一个简单的表格,显示两个列:一个是国家名称,另一个是生成的销售额。我们还希望按降序对行进行排序。最后,我们需要将文件转换为 Excel 格式,因为这是一个更容易被同事读取的格式。我们可以构建一个 KNIME 工作流来完成这一任务,从而避免每天手动重复这项繁琐的工作。现在让我们打开 KNIME Analytics Platform 并构建我们的省时工作流。
为了保持工作流的整洁,我们可以将其分层组织到文件夹中:在 KNIME 中,文件夹被称为工作流组。因此,我们首先创建一个工作流组来存放我们的第一个工作:
-
右键单击 KNIME Explorer 部分(左上角)的LOCAL条目,然后在弹出菜单中点击新建工作流组...。
-
输入新文件夹的名称(您可以将其命名为
Chapter 2),然后点击完成:![图形用户界面,文本,应用程序 描述自动生成]()
图 2.5:在 KNIME 中创建工作流组:通过将工作组织到文件夹中保持工作整洁
您会看到新文件夹已出现在本地工作区。现在我们可以在此组内创建一个新的工作流。类似于您在创建组时所做的,您只需再执行几步:
-
右键单击新创建的工作流组,然后选择新建 KNIME 工作流...。
-
输入新工作流的名称(怎么样,
Hello World?),然后点击完成。您的工作流将出现在编辑器中,此时看起来像是一张方格纸。 -
现在是时候将我们的 CSV 文件加载到 KNIME 中了,使用适当的输入节点。最快的方法是直接将文件拖放到工作流编辑器中:只需从文件所在的文件夹中获取名为
raw_sales_country.csv的文件,然后将其拖放到编辑器的空白处。KNIME 会自动识别文件类型,并为其实现正确的读取节点:在这种情况下,是 CSV 读取器。当您拖放文件时,它的配置对话框将会弹出。如果您在任何时候需要修改配置,只需双击节点即可重新打开相同的对话框。就像我们在旅途中遇到每个新的 KNIME 节点时所做的那样,让我们快速了解它是如何工作的,以及如何配置它。
CSV 读取器
该节点(在IO > Reader路径下的库中提供)从存储在 CSV 格式的文本文件中读取数据,并将其作为表格提供给 KNIME。这个节点非常方便:它会尝试检测文件的格式,并识别每列存储的数据类型,如果需要,你可以手动更改它。它还允许你实时进行一些基本的格式调整,比如更改列名。如图 2.6所示,其配置窗口显示了多个标签,标签头出现在顶部。第一个标签(设置)让你设置基本参数:
-
在顶部的第一部分,你可以指定要读取的文件路径:只需点击浏览...按钮并选择文件。如果你已经将文件拖放到工作流编辑器中,字段会自动填充。该节点还允许你通过选择文件夹中的文件模式来读取文件夹中具有相同格式的多个文件。
-
在中间部分,你可以指定文件的格式,例如用来分隔行和列的字符,以及是否有列标题。当加载新文件时,节点会自动猜测这些参数(你可以点击自动检测格式来强制重新尝试)。一个有用的选项是支持短数据行:如果选中此框,即使某些行的数据点不完整,节点仍会继续工作。好消息是,在大多数情况下,你不需要手动更改这些参数,因为自动检测功能非常强大。
-
在标签的底部,你可以看到文件中读取表格的预览。这让你可以检查格式是否正确确定。

图 2.6:CSV Reader 节点的配置对话框:你可以指定要读取的文件及其读取方式
如果你切换到窗口的第二个标签页(称为转换),你将有机会在加载表格时应用一些简单的格式调整。例如,你可以:更改列名(只需在新名称列中输入新的名称)、删除不需要的列(取消勾选其名称左侧的框)、更改列的顺序(使用鼠标拖放),以及更改其数据类型(例如,从文本更改为数字)。
KNIME 表格中的每一列都有一个与之相关的数据类型,该类型通过列名旁边的方形字母表示。最常见的数据类型有字符串(用字母S表示,表示文本字符集合)、十进制数(字母D)、整数(I)、长整数(L,与整数类似,但可以存储更多位数的数字)和布尔值(B,只能是FALSE或TRUE)。
你可以在底部的预览部分检查转换结果。为了更清楚,你也可以在工作流后续步骤中进行这些转换(你有专门的 KNIME 节点来重命名列、改变列的顺序等),但直接在这里使用一个节点进行这些更改可能会更快更简便。
如果 CSV 读取器节点未能按照要求读取数据,可以尝试另一个叫做文件读取器(File Reader)的节点。尤其是对于格式不正确的文件,后者比 CSV 读取器更稳定,尽管它无法动态转换表格结构。

图 2.7:CSV 读取器节点的转换标签:动态重新格式化你的表格
-
查看设置标签中的表格预览,节点似乎已经很好地解释了文件的格式。我们注意到有些列是不需要的,可以删除(具体来说是
country_CODE和population_2020),另外,我们也可以通过重命名简化一些列名。要做到这一点,我们需要转到转换标签:只需点击窗口顶部的标签名称。 -
首先,通过取消选中不需要的列旁边的框来删除不需要的列,如图 2.7所示。
-
让我们也为另外两列指定更友好的标题,通过在新名称部分输入:将
country_name重命名为Country,将sales_USD重命名为Sales。 -
经过转换后的表格预览看起来正如我们所希望的那样;这意味着我们已经完成了该节点的配置,可以通过点击确定按钮关闭它。
-
为了让自己和他人更清楚明了,我们希望对每个节点进行注释。我们从第一个节点开始。如果我们双击下面的标签(默认情况下会显示Node 1),我们可以将其更改为更有意义的内容,如
读取原始数据。从现在起,我不会每次都提到需要注释每个节点——只需养成这个习惯即可。 -
我们的节点显示了一个鼓舞人心的黄色交通灯:这意味着它已经具备完成任务所需的一切——我们只需要发出执行指令。要执行 KNIME 中的节点,我们可以选择该节点并按键盘上的 F7,或右键点击节点以显示弹出菜单,如图 2.8所示。当菜单出现时,点击执行:
![图形用户界面,应用程序 自动生成的描述]()
图 2.8:工作流编辑器中的弹出菜单:右键点击任何节点以显示菜单
-
交通信号灯变绿是一个好兆头:我们的节点已成功执行。KNIME 的一个有用功能是,你可以轻松检查每个流程步骤中发生的情况,通过查看每个节点的输出端口上可用的数据。在右键点击节点后弹出的菜单中,你会找到一个或多个显示放大镜的图标(通常每个输出端口会有一个)。点击这些图标,你会打开一个窗口,查看你需要的数据。现在让我们这么做:右键点击弹出菜单,然后点击菜单底部的文件表(或者你可以查看节点监视器,或使用快捷键打开节点的第一个输出视图,快捷键是 Shift + F6)。不出所料,我们获得了在预览步骤中看到的相同表格。到目前为止,一切似乎都在正常工作。我们可以点击确定并继续。
-
下一步是按销售额从高到低排序行。我们可以使用一个专门用来做这件事的节点:排序器。让我们将排序器节点添加到工作流中,从左下角的节点库中拖动它。你可以通过在搜索框中输入
Sorter来查找它,或者通过依次点击操作、行和转换来在层级结构中找到它。当你看到排序器节点时,使用鼠标拖动并将其放置在 CSV 读取节点的右侧。 -
现在你的节点孤零零地放置在工作流中,但我们希望它能与其他节点协作。事实上,我们需要它来对 CSV 读取器的表格输出进行排序,所以我们需要在两个节点之间建立连接。在 KNIME 中,我们只需用鼠标绘制连接即可。点击 CSV 读取器的输出端口(其右侧的小箭头),并保持按住鼠标按钮,拖动到排序器节点的输入端口。当你松开按钮时,你会看到节点之间出现连接。这正是我们想要的,CSV 读取器的输出表格现在成为了排序器的输入。
我们现在已经准备好配置排序器:让我们来了解一下我们的新节点。
排序器
这个节点(在操作 > 行 > 转换的节点库中可用)可以根据用户定义的一组标准对表格的行进行排序。它的配置非常直观:从下拉菜单中选择你希望排序的列。右侧的单选按钮让你选择排序是按升序(A 到 Z 或 1 到 9)还是降序(相反的顺序)。你还可以在其他列上添加附加规则,以便在多个行在某一列中具有相同值时,打破平局。只需点击添加规则按钮,你就会看到更多的下拉菜单出现。你可以通过使用↑和↓箭头来更改多个规则的优先顺序:

图 2.9:节点排序器的配置窗口:定义你所需的行顺序
-
要打开排序器的配置窗口,你可以双击节点,或右键点击它然后按配置...。你也可以在选择节点后直接按 F6 键。
-
根据我们的需求,节点的配置非常简单:只需在下拉菜单中选择
Sales,然后点击第二个单选按钮以应用降序排序。按确定关闭窗口。 -
排序器节点现在已经清楚了要使用的输入表格以及我们希望排序的方式:一切准备就绪。让我们执行它(按 F7 或右键点击选择执行),并打开显示其输出的视图(按 Shift + F6 或右键点击选择已排序表格,最后一个带放大镜图标):
![表格 自动生成的描述]()
图 2.10:排序器节点的输出:我们的国家现在按销售额降序排列
KNIME 表格中的每一行都与一个独特的标签相关联,称为行 ID。当表格创建时,行 ID 通常以计数器的形式生成(Row0、Row1、Row2等),并在整个工作流中保持一致。这就是为什么在排序器节点的输出中,你仍然可以通过查看左侧的行 ID 来找到原始的行位置。
看起来我们的国家已经按正确的顺序排序,现在可以进行最后一步:将表格导出为 Excel 文件。
Excel 写入器
这个节点(在库中的IO > Write下可用)将数据保存为 Excel 工作表。配置对话框首先让你选择要创建的文件格式(旧版 .xls 或最新的 .xlsx 格式),并选择保存路径(点击浏览...按钮选择路径)。通过选择如果存在单选按钮,你可以指定如果目标文件夹已有同名文件时该如何处理:你可以覆盖旧数据、将新数据作为附加行追加,或保留原文件。一个重要的选项是写入列标题:选中此项时,你的表格列名将作为标题添加到 Excel 文件的第一行。
虽然现在不需要做这个操作,但值得知道的是,一些 KNIME 节点也可以将文件保存到基于云的文件系统中,比如 Google Drive 或 Microsoft Sharepoint。这就是为什么当你点击节点左下角的三个点(...)时,会看到添加端口 | 文件系统连接选项。这个节点的另一个有用功能是,它可以管理多个输入表格并将它们作为不同的工作表保存在同一个 Excel 文件中。为此,你需要点击节点上的三个点,然后点击添加端口 > 工作表输入端口。你可以通过在配置窗口的工作表部分输入不同的名称来为各个工作表命名。

图 2.11:Excel Writer 配置窗口:选择保存输出文件的位置
-
让我们将 Excel Writer 节点添加到工作流中,从节点库中拖动它,然后在排序器的输出端口和 Excel Writer 的输入节点之间创建连接。
-
打开 Excel Writer 的配置窗口(双击它)。在这种情况下,我们需要添加的唯一配置是输出文件的位置和名称(点击 浏览... 按钮,进入所需文件夹并输入新文件的名称),由于我们可能需要定期重复此过程,所以请选择下方的 覆盖 选项单选按钮。
-
是时候运行节点了(F7 或右键点击并选择 执行),然后在 Excel 中打开新文件。你会高兴地看到新文件正如我们所期望的那样。
恭喜你创建了第一个 KNIME 工作流!通过组合三个节点并适当配置它们,你实现了一个简单的数据转换流程,现在你可以在需要时只需几秒钟就重复执行。更重要的是,我们通过这个第一课熟悉了构建任何工作流所需的基本操作,例如拉取合适的节点、配置和执行它们,并检查一切是否按预期运行:

图 2.12:Hello World:你的第一个 KNIME 工作流
现在,我们拥有了构建更复杂数据操作所需的一切,接下来我们将探索其他 KNIME 节点的功能,这正是我们接下来几页要做的事情。为了不丢失我们宝贵的 Hello World 工作流,最好将其保存:只需按下键盘上的 Ctrl + S 或点击屏幕左上方的磁盘图标。如果你想与其他人分享工作流,首先需要将其导出为独立文件。为此,右键点击 KNIME Explorer 面板左侧工作流的名称,然后选择 导出 KNIME 工作流...:

图 2.13:如何导出 KNIME 工作流:然后你可以与任何人分享它
在弹出的窗口中,您需要通过点击 浏览... 按钮来指定工作流文件的位置和名称。如果勾选了 在导出前重置工作流 选项,KNIME 只会导出工作流的定义(节点结构及其配置),不包含任何数据。如果取消勾选,它将导出每个执行节点中存储的数据(使您的导出文件更大)。现在,您可以通过电子邮件发送生成的文件(扩展名为 .KNWF),或者将其保存在安全的位置。接收此文件的人可以通过点击 文件 | 导入 KNIME 工作流... 并选择导入文件的位置以及工作流的目标位置,将其导入到他们的 KNIME 安装中。
清理数据
在处理真实世界的数据分析时,我们经常会面临一个既令人恼火又普遍存在的现实:数据可能是脏的。文本和数字的格式、行和列的顺序、不需要的数据点的存在以及缺少一些预期值,都是可能的故障,它们会拖慢甚至危及从数据中创造价值的过程。实际上,输入数据的质量越低,结果输出的价值就越小。这个不便的事实通常用缩写 GIGO 来总结:Garbage In, Garbage Out(垃圾进,垃圾出)。因此,数据分析工作流的一个初步阶段是 数据清理,即系统地识别和修正不准确或损坏的数据点的过程。让我们通过一个实际的例子来学习如何在 KNIME 中构建完整的数据清理步骤。
在本教程中,我们将清理一个捕获电子商务网站用户信息的表格,例如姓名、年龄、电子邮件地址、可用信用等。这个表格是通过直接从 Web 服务器提取所有可用的原始数据生成的。我们的最终目标是创建一个干净的可联系用户列表,利用它作为邮件列表发送电子邮件通讯。由于用户列表不断变化(每天都有一些人订阅或注销),我们希望建立一个 KNIME 工作流,每次我们想更新邮件列表时,能够系统地清理最新数据:

图 2.14:原始数据:我们确实面临一些清理任务
正如从 图 2.14 中可以看到的那样,初步查看原始表格揭示了一系列需要处理的数据质量问题。例如:
-
一些行似乎是重复的。
-
姓名的大小写不一致,并且存在一些不必要的空白字符。此外,当前表格没有单独的姓名字段,我们希望有一个包含每个人全名的单列(目前缺失)。
-
一些电子邮件地址格式错误(缺少
@符号或完整的域名),使得相应的用户无法联系。 -
各种值缺失,导致单元格为空。
在 KNIME 中,缺失值通过红色问号符号
?来表示。作为参考,在计算机科学中,缺失值通常用NULL来表示。 -
一些信用值为负数。根据公司政策,我们知道这些用户应该被视为不活跃用户,因此不应与他们联系,我们可以从列表中将其删除。
-
有些列是不需要的。在这种情况下,我们可以删除包含用户 IP 地址的列,因为它无法用于发送通讯或个性化内容。
我们有一个 Excel 文件(DirtyData.xlsx),其中包含原始数据的摘录,展示了上述所有问题的样本。通过使用该文件作为基础,我们可以构建一个 KNIME 工作流,清理数据并导出一个美观且可用的邮件列表。我们一步步来:
-
首先,我们需要创建一个空白工作流(你可以按前面的示例操作,或者——也可以——转到 文件 | 新建...,然后选择 新建 KNIME 工作流):我们可以将其命名为
清理数据。 -
要加载数据,我们可以将源文件拖放到工作流编辑器中,或从仓库中抓取 Excel Reader 节点并将其放置在空白的编辑空间中。
Excel Reader
该节点(IO > 读取)打开 Excel 文件,读取指定工作表的内容,并将其作为表格提供给输出端口。在配置对话框的主标签页中,指明要打开的文件或文件夹(点击 浏览... 可以更改),然后可以指定(工作表选择)要考虑的工作表:默认情况下,节点会读取工作簿中的第一个工作表,但你可以指定某个特定工作表的名称或位置。如果你的工作表包含列标题,可以让 KNIME 将它们作为结果表中的列名:在 列标题 部分,你可以选择包含列标题的行。你还可以通过指定要读取的列和行的范围,在 工作表区域 部分限制读取的范围。你可以通过查看窗口底部的预览,检查节点是否已正确配置,预览中显示了 KNIME 从文件中读取的内容:

图 2.15:Excel Reader 节点的配置:选择文件、工作表和读取区域
如果你想在读取数据时应用一些转换(例如重命名列、重新排序列等),你可以使用 转换 标签页,这个功能与我们之前遇到的 CSV Reader 节点相同。
-
在我们的案例中,配置这个节点会非常简单:我们只需选择要打开的文件,保持其他所有参数不变,因为默认选择对我们来说是合适的。我们可以使用转换选项卡做一些格式调整,但我们稍后会通过适当的节点来完成,因此现在可以先保持简单。
要移除重复的行,我们可以使用一个新节点,它正是做这件事的:它的名称是“重复行过滤器”。
重复行过滤器
这个节点(Manipulation > Row > Filter)识别在选定列中具有相同值的行,并相应地进行处理。在配置窗口的第一个选项卡中,您可以选择哪些列应被考虑用于重复项搜索。
如果选择了多个列,节点将仅将完全相同的列值视为重复行。在许多 KNIME 节点的配置中,我们需要选择列的子集,因此花些时间熟悉界面是很有意义的:
-
右侧面板(有绿色边框)包含您选择的列,而左侧面板(红色边框)则显示排除的列。
-
通过双击列名或使用中间的四个箭头按钮,您可以在面板之间转移列。
-
如果您有很多列,可以使用每个面板顶部的过滤器文本框按名称查找它们。
-
如果您想按名称模式(例如以
A开头的列)或按类型(整数、小数、字符串等)选择列,可以选择顶部的单选框中其他可用的选项(通配符/正则表达式选择或类型选择)。
配置窗口中的第二个选项卡(标题为高级)让您决定一旦识别出重复行后要如何处理(默认情况下,重复行会被移除,但您也可以选择保留它们,并添加一个额外的列来指明它们是否为重复行),以及在重复项中应保留哪些行(默认情况下,保留第一行并移除其余行,但也有其他策略可供选择):

图 2.16:重复行过滤器的配置:选择用于检测重复行的列
-
让我们实现重复行过滤器节点,并将其与 Excel 阅读器的输出端口连接。新节点现在将显示一个琥珀色的状态灯,表明它可以使用默认行为运行,尽管我们首先希望进行一些配置。
-
双击节点进入其配置窗口。由于我们不希望给同一个用户发送多封邮件,我们应该保持每个邮箱地址只出现一次,删除所有重复地址的行。因此,在配置窗口中,我们将所有列移到左侧,并且只保留
__Email_Entered在右侧。然后点击“确定”并运行节点(F7)。 -
我们的好奇心让我们无法抑制查看该节点是否正常工作的冲动。因此,我们查看其输出端口的数据(右键点击,并点击最后一个带放大镜的图标或Shift + F6),并注意到一些重复的邮箱地址行被成功移除,正如预期。
现在我们可以继续修正姓名和姓氏的格式了。为此,我们将开始使用一个非常多功能的节点来处理文本数据,叫做字符串操作。
字符串操作
这个节点(操作 > 列 > 转换与替换)应用于字符串的转换,使得能够根据需要重新格式化文本数据。该节点包括一组预先构建好的文本操作函数,例如替换、大写化和连接等:

图 2.17:字符串操作:通过选择要使用的功能和列来构建文本转换
配置窗口提供了几个面板:
-
表达式框用于指定执行所需转换的整体公式。在大多数情况下,你可以通过使用鼠标来构建表达式,点击你需要使用的功能和应用的列。
-
功能列表包含所有可用的转换功能。例如,
upperCase()函数将把字符串转换为全大写字母。当你在这里双击一个功能时,它会被添加到你的表达式中。 -
描述框是一个方便的帮助来源,当你从列表中选择一个可用功能时,它会立即显示该功能的描述和一些示例。
-
列列表将显示表格中所有可用的列。双击它们,你可以将它们添加到表达式中:它们会显示为带有美元符号(
$)的列。 -
在底部,你可以找到一个单选按钮来决定将结果存储在哪里。你可以选择将其附加为新列,或者替换现有列。
表 2.1 总结了此节点中最有用的功能。
| 功能 | 描述 | 示例 | 结果 |
|---|---|---|---|
| strip(x) | 删除字符串开头和结尾的任何空白字符。 | strip(" Hi! ") |
"Hi!" |
| upperCase(x),lowerCase(x) | 将所有字符转换为大写或小写。 | upperCase("Leonardo") |
"LEONARDO" |
| capitalize(x) | 将字符串中所有单词的首字母转换为大写。 | capitalize("bill kiddo") |
"Bill Kiddo" |
| compare(x,y) | 比较两个字符串,如果相等返回 0,如果不同则返回-1 或 1,具体取决于它们的字母排序。 | compare("Budd","Budd") |
0 |
| replace(x,y,z) | 将字符串 x 中所有子串 y 替换为 z。 | replace("cool goose","oo","u") |
"cul guse" |
| removeChars(x,y) | 从字符串 x 中删除 y 中包含的所有字符。 | removeChars("No vowels!","aeiou") |
"N wwls!" |
| join(x,y,...) | 将多个字符串连接成一个字符串。 | join("Hi ","the","re") |
"Hi there" |
| length(x) | 计算字符串中的字符数。 | length("Analytics is for everyone!") |
26 |
表 2.1:字符串操作中的有用函数
这个节点非常适合我们的需求,因为我们有一些字符串需要处理。我们需要修正名字和姓氏的大小写,去除那些看起来不太美观的空格,并创建一个包含全名的新列:
-
让我们实现字符串操作节点,将其从库中拖动并连接上一个节点的输出和新节点的输入。双击节点后,配置对话框会出现。我们从
First name列开始。我们希望每个单词的开头都是大写字母,同时要求去除字符串两端的空格。我们可以通过先双击Function框中的capitalize()和strip(),然后再点击Column list中的First name,来构建表达式。按照这个顺序操作,我们应该得到capitalize(strip($First name$)),这正是我们需要的。在这种情况下,我们希望将原始版本的名字替换为该表达式的结果,因此我们需要选择Replace column,然后选择First name。设置完成后,点击OK即可关闭窗口。 -
现在我们希望对姓氏做相同的处理。我们将使用另一个字符串操作节点来实现。为了加快速度,我们还可以从工作流编辑器中复制并粘贴节点图标,使用常规的Ctrl + C 和 Ctrl + V快捷键。我们需要重复前一步骤中描述的配置:唯一的不同之处是,这次我们将其应用于
Surname列,而不是First name列。只需确保这次表达式和Replace column设置都指向Surname列即可。 -
现在名字的两个部分看起来很好,因为它们没有额外的空格,并且大小写格式也很漂亮。根据我们的业务需求,我们需要创建一个新列,包含每个用户的全名,将名字和姓氏合并在一起。我们可以再次使用字符串操作节点来实现这一点:在工作流编辑器中再添加一个该节点,建立连接并打开配置页面。这次,我们需要连接两个字符串,因此可以使用
join()函数。首先双击Function框中的join(),然后双击Column list中的First name。因为我们希望名字和姓氏之间有一个空格,所以需要在表达式中添加这个字符,方法是在$First name$后输入," ",。最后,通过双击列Surname来完成表达式。整体表达式应该是:join($First name$," ",$Surname$)。关闭之前,我们需要决定将结果存储在哪里。这次我们希望创建一个新列,所以选择Append,然后输入新列的名称,例如 Full name。点击OK并检查结果。由于最终我们只会保留
Full name列,因此可以将最后三个节点合并为一个。实际上,可以使用表达式join(capitalize(strip($First name$))," ",capitalize(strip($Surname$)))一次性创建Full name。我们选择了较长的路线来练习节点。决定在工作流中保留哪个版本由你决定。
所有名字修正后,我们可以继续处理下一个问题,去除格式错误的电子邮件地址。是时候引入一个将在未来 KNIME 工作流中随处可见的新节点:行过滤器(Row Filter)。
行过滤器(Row Filter)
该节点(Manipulation > Row > Filter)根据你指定的条件对行进行过滤。此类条件可以基于特定列的值进行测试(例如所有以 A 开头的字符串或所有大于 5.2 的数字),也可以基于表中行的位置进行设置(例如仅前 20 行)。要配置此节点,你需要首先使用左侧的选择器指定希望应用的条件类型。你还需要指定那些符合条件的行是否应保留在工作流中(Include rows...),或者应该被丢弃,保留所有其他行(Exclude rows...)。你有多种方式来指定过滤背后的条件:
-
根据属性值过滤:在这种情况下,右侧会显示可用列的完整列表,你可以选择要用于过滤的列(Column to test)。选择列后,你需要在下面的框中描述选择逻辑(Matching criteria)。你有三个选项:
-
第一个选项(使用模式匹配)将检查值(视为字符串)是否符合你在文本框中指定的模式。你可以输入一个特定的值,比如
maria:这将匹配类似于“MARIA”或“Maria”的行,除非你勾选区分大小写匹配选项,这样会将大小写视为不同的字符。另一个选项是使用通配符进行搜索(记得勾选包含通配符):在这种情况下,星号字符"*"代表任意字符序列(所以"M*"会选择所有以"M"开头的名字,如“Mary”和“Mario”),而问号字符"?"则匹配任何单一字符("H?"表示以“H”开头的两个字符的字符串,因此它会匹配“Hi”,但不包括“Hello”)。如果你需要实现更复杂的搜索,也可以使用强大的正则表达式(RegEx),它在设置条件方面提供了极大的灵活性。 -
第二个选项(使用范围检查)对于数字非常有用,因为它允许你设置任何类型的区间:你可以指定一个下界(包括所有大于或等于该值的数字),或者上界(小于或等于该值),或者两个(使其成为闭区间)。
记住,边界总是被视为包含在区间内。如果你想排除区间的端点,你需要反转过滤的逻辑。例如,如果你想包括所有非零正数,你需要选择按属性值排除行选项,并将0设置为上限。
-
第三个选项是仅匹配在测试列中有缺失值的行。
-
按行号过滤:这样你可以指定匹配的第一行和最后一行,考虑到当前表格的排序顺序。所以,如果你在第一行号选择器中输入
1,然后在最后一行号中输入1,你只会匹配表格中的前 10 行。如果你只想匹配从某个特定位置开始的行,例如从第 100 行开始,你可以在第一个选择器中设置阈值(100),并勾选下方的复选框(直到表格结束)。 -
按行 ID过滤:你也可以使用正则表达式测试行 ID,尽管这种方法较少使用:
![图形用户界面,文本,应用程序,电子邮件 描述自动生成]()
图 2.18:行过滤器的配置对话框:指定要保留或移除的行
如果你的过滤标准需要测试多个列,你可以在一系列中使用多个该节点实例,每次查看不同的列。另一种选择是使用一种叫做基于规则的行过滤器的不同节点,它允许你一次定义多个过滤规则。如果需要,其他节点,如行过滤器(实验室)和基于规则的行过滤器(字典),可以进行更复杂的过滤。如果你需要,可以查看它们。
让我们立刻看到新节点的效果,过滤掉所有看起来不合法的电子邮件地址:
-
实现 行过滤器 节点,将其连接到下游,并通过双击它打开配置对话框。由于我们只想保留符合某些列条件的行,所以我们选择左侧单选按钮中的第一个选项(按属性值包含行),然后在右侧选择包含电子邮件地址的列
__Email_Entered。检查电子邮件地址有效性的一个简单模式是通配符表达式*@*.*。它将检查所有包含至少一个@符号并且后面跟着一个点 . 和一些文本的字符串。虽然这并不是最彻底的电子邮件地址有效性检查,但它肯定能找出明显不正常的地址,并且在这个阶段对我们来说已经足够了。记得勾选 包含通配符 复选框,然后点击 确定 继续。 -
我们还需要进行更多的过滤。我们想删除所有显示负信用的行:这些用户处于非活跃状态,应该从我们的邮件列表中删除。让我们再添加一个行过滤器节点,将其放置在前一个节点旁边,确保正确连接各个端口。我们仍然使用 按属性值包含行 选项,但匹配条件将设置为范围检查(右侧第二个单选按钮)。通过将
0设置为 下限,我们可以保证所有负值都会被过滤掉。点击 确定 后,我们可以继续处理下一个任务。此时,我们需要处理表格中时不时出现的小红色问号,标示某些值缺失。此外,在这种情况下,KNIME 提供了一个强大的节点,可以通过点击几下快速处理这种情况。
缺失值
该节点(操作 > 列 > 转换)处理表格中的缺失值(NULLs),提供多种方法来填补最佳可用的替代值。在配置窗口的第一个选项卡(默认)中,你可以通过在下拉菜单中选择数据类型(字符串、整数、双精度),为所有列定义默认处理选项。第二个选项卡(列设置)允许你通过双击左侧列表中的列名称并通过弹出的菜单设置每个列的特定策略。
除非你有大量的列需要使用相同的缺失值处理策略,否则最好明确指定并使用第二个选项卡。这样你只会对指定的精确列进行缺失值插补。
你有一个庞大的列表,可以选择不同的方法来处理缺失值。最常用的方法包括:
-
删除行:如果值缺失,则完全删除该行。
-
固定值:用你在下方框中输入的特定值替代 NULL。所有缺失值的行将会使用相同的固定替代值。
-
最小值/最大值/均值/中位数/众数:计算列中所有现有值的分布的汇总统计量,并将其作为固定的替代值。
如果你用数值列的中位数替代缺失值,那么你填充的值将会“位于”现有分布的“中间”,使得推断结果不那么具有干扰性且更具鲁棒性。当然,这取决于你的业务案例和数据的实际分布,但值得尝试这种方法。
-
前一个/后一个:用列中前一个或后一个非缺失值替代缺失值,使用表格中当前的行顺序。
-
线性插值:用列中前一个和下一个非缺失值之间的线性插值替代缺失值。如果你的列表示随时间变化的值(我们称之为时间序列),那么这种处理器可能提供一种平滑的方式来填补空缺。
-
移动平均:用计算自缺失值前后的若干个非缺失值的移动平均来替代缺失值(回溯窗口或前瞻窗口)。例如,如果某列有一系列值如[2, 3, 4, NULL],并且你应用一个大小为 2 的回溯窗口,那么 NULL 值将被替代为 3.5,这是 3 和 4 的平均值。对于这一点以及前面提到的处理器,你需要确保你的表格已正确排序(比如,在时间序列中,按时间递增排序)。
![图形用户界面 自动生成的描述]()
图 2.19:缺失值配置:决定如何管理表格中的空白位置
回到我们的例子,我们注意到有两列显示了一些问号。让我们通过利用“缺失值”节点适当管理它们:
-
将“缺失值”节点拖到工作流中并正确连接。我们直接跳到配置窗口的第二个标签页(列设置),因为我们希望控制针对每个需要处理的列采用哪种处理策略。对于列
年龄(从左侧列表中双击它),我们可以选择中位数:这样,我们将为那些缺少年龄的用户分配一个年龄,这个年龄不会“偏离”大多数用户的年龄。当涉及到用户登录次数(登录次数列)时,我们假设缺失值意味着用户尚未登录。因此,选择的最佳策略是固定值,将 0 作为所有缺失值的默认值。我们可以点击“确定”并关闭此对话框。 -
让我们检查一下目前转换链的效果。如果我们点击最后一个节点,执行它(F7),然后查看其输出端口视图(Shift + F6),我们可以松一口气:没有缺失值,没有负信用分,并且姓名和电子邮件地址看起来格式合理。
接下来我们只需要进行一些美学方面的调整:我们希望删除不需要的列,排序剩余的列,并为它们命名更直观的名称,最后保存输出文件。为了完成最后这一步,我们需要一些额外的节点。
列过滤
该节点(操作 > 列 > 过滤)用于删除表格中不需要的列。配置此节点时唯一需要的步骤是选择在输出端口(右侧绿色框)中保留哪些列,过滤掉哪些列(左侧红色框):

图 2.20:列过滤配置:您希望保留哪些列?
- 将列过滤节点添加到工作流中,并通过将不再需要的列(
First Name,Surname,和IP_Address)移到左侧面板,来排除它们。
列重命名
该节点允许您更改列的名称和数据类型。要进行配置,双击您想编辑的列(左侧会列出所有列),然后勾选更改框:接着您可以在旁边的框中输入新名称。若要更改列的数据类型并转换所有值,您可以使用右侧的下拉菜单。该菜单会预先填充一个每列可以安全转换为的可能数据类型列表:

图 2.21:列重命名配置:为您的列选择最佳名称
- 现在我们可以使用列重命名节点来更改表格中的表头。需要调整的只有
__Email_Entered,它可以简化为Email,以及_Credit,它可以重命名为Credit。
列重排序器
该节点(在操作 > 列 > 转换中可用)用于改变表格中列的顺序。在配置窗口中,您会看到左侧显示所有可用的输入端口列,右侧则是一些按钮,用来移动列的位置。选择您希望移动的列,然后点击不同的按钮以将列上移或下移,或将列放在表格的最前面或最后面,或者按字母顺序对列进行排序。如果输入端口中出现了不同的列(比如您的源文件带有一些新列),这些新列会被放置在<任何未知新列>占位符的位置:

图 2.22:列排序器配置:将列重新排列成所需顺序
- 最后一个所需的转换是稍微调整表格中的列顺序。实际上,全名列在之前的流程中已经添加,但最终出现在了最后一列,而我们希望它排在第一列。只需选择该列并点击移到最前即可按需要调整。
CSV Writer
该节点 (IO > Write) 将输入的数据表保存为本地磁盘或远程位置的 CSV 文件。唯一需要配置的步骤是指定要创建的文件的完整路径:你可以点击浏览...按钮来选择所需的文件夹。其他配置步骤(非必需)允许你:更改生成的 CSV 文件的格式,例如列分隔符(格式部分),保留或删除作为第一行的表头(写入列标题),以及将新生成的文件压缩为 .gzip 格式以节省磁盘空间(这项设置请前往高级设置标签页):

图 2.23:CSV 写入器配置:将表格保存为文本文件
- 我们流程的最后一步是将我们漂亮的表格保存为 CSV 文件。我们实现 CSV 写入节点,连接它,并进行唯一的必要配置,即指定新文件的保存位置和命名方式。点击确定以关闭窗口,并执行节点,最终将文件写入磁盘。
恭喜你完成了第二个数据工作流!从杂乱的原始数据集构建一个干净的邮件列表的过程需要十几个节点和一些时间,但这个努力绝对是值得的。现在我们可以随时通过重新运行相同的工作流来清理任何数量的记录,只需确保输入文件的名称和路径保持不变。为此,你只需:重置工作流(右键点击左侧资源管理器中的工作流名称,然后点击重置,或者在选中第一个节点后按 F8 重置它),然后重新执行它(最简单的方式是按 Shift + F7 键,或者右键点击最后一个节点并选择执行):

图 2.24:完整的数据清理工作流:十二个节点让我们的用户数据一尘不染
总结
本章介绍了 KNIME,它是我们数据分析工具箱中的新成员。我们简要了解了 KNIME 的概况,并开始使用它的用户界面,这使我们能够快速、灵活地将简单的计算单元(节点)组合成更复杂的分析流程(工作流),而无需编写大量代码。我们从任何数据工作中的常见预备步骤开始:加载和清理数据,使其可用于分析。我们熟悉了 KNIME 中的十二个基础节点,这些节点使我们能够创建可重复的工作流程,包括:以不同格式打开文件、按照某些逻辑对数据进行排序和过滤、操作字符串,以及管理缺失值和重复行。仅仅第二章就做到这些,已经相当不错了!
在基础知识已经清楚地讲解之后,我们现在可以大胆地进一步探讨 KNIME。在接下来的章节中,第三章,数据转换,我们将学习如何处理多个数据表,并构建更复杂的数据工作流,以分析实际的实时数据流。
第三章:数据转换
现在我们已经掌握了 KNIME 的基础知识,可以进入下一个层次。在本章中,我们将学习如何系统地转换数据,以充分利用它。接下来的页面将展示如何处理多个表,汇总数据点,应用表达式,并通过工作流进行迭代,从而实现它们的自动执行。这些新技能将使你在处理现实世界数据时,成为 KNIME 的独立用户。
本章将回答以下问题:
-
什么是数据模型,我该如何可视化它?
-
我该如何合并多个数据表?
-
我该如何汇总数据点并计算公式?
-
如何让 KNIME 自动化生成汇总报告?
-
在 KNIME 中,变量和循环是什么样子的?
本章将以一个基于真实数据和非常实际的商业案例的完整教程作为结束:这将是一个实践你迄今为止学到的所有 KNIME 知识的机会,同时面对你工作中将遇到的数据复杂性。在深入探讨数据转换的具体方法之前,让我们先花几分钟了解关系型数据库和数据模型的基础知识。
数据建模
当数据表分散开时,它们几乎没有什么用处。实际上,通过将它们组织到一个数据库中,我们可以通过揭示数据点之间的模式和联系来放大它们的整体价值。这就是为什么数据通常存储在一个由多个互相连接的表组成的集合中,虚拟地形成一个叫做数据模型的整体。当你处理多个表时,"可视化"底层数据模型是什么样的非常有帮助:这使你能够预测如何利用数据并正确解读它。
我们将通过一个商业案例来生动地呈现数据模型的概念。假设我们拥有一家销售乐器的小商店。我们的商业模式非常简单:我们从制造商那里订购乐器并将它们存放在仓库中。顾客会来到我们的商店,并有机会在决定是否购买之前试用一些乐器。我们最忠实的顾客会注册并获得会员卡:偶尔,他们会收到一封包含新到货和特别优惠的通讯。
为了管理我们商店的活动,我们使用一个简单的信息系统,用于追踪产品、销售、库存和客户。数据被组织在一个由四个不同表组成的简单数据库中,每个表都有多个列,且列名—幸运的是—是自解释的:
-
产品主数据:这存储了我们买卖的产品清单。对于每个产品,我们都有一个唯一的Product_ID,一个类别(比如吉他、小提琴和钢琴),一个简短的描述(包括乐器的型号),品牌,以及列表价格。
-
销售交易:这记录所有销售情况。每一行包括购买日期、收据 _ID(统计每一天生成的收据数量)、产品 _ID、数量(购买的商品数量)、应用的折扣率(如果有的话)、总金额以及——如果顾客是我们忠诚卡计划的会员——他们的顾客 _ID。
-
顾客主数据:这包含与我们忠诚卡会员相关的偏好和联系信息。包括独特的顾客 _ID、全名、住址的邮政编码、电子邮箱地址、电话号码以及他们的主要工具。
-
库存交易:这记录了我们仓库中所有产品的移动情况,例如商品到货时的装载以及将其转移到店铺的过程。其列包括日期(记录发生时间)、产品 _ID和数量(当商品进入仓库时为正值,离开仓库时为负值)。
通过这个简单的例子,我们可以观察到一些值得进一步阐述的特性,这些特性适用于我们在工作中可能遇到的大多数数据库:
-
我们可以看到两种不同类型的表格,分别满足两种不同的需求:主数据表和事务性表。主数据表旨在描述具有业务相关性的实体,例如产品、客户、供应商、员工等。在这些表格中,每一行代表实体的一个实例(例如,特定的产品或单独的客户),而每一列描述实体的不同方面(比如名称或描述)。另一方面,事务性表记录特定时间点发生的事件(例如,货币交易、销售、订单)。每一行对应一个事件,而列描述事件的特征和参与其中的实体。主数据和事务性数据通常以不同的方式进行更新和使用:主数据表的更新频率比事务性表低。试想一下,新增一个产品到目录或雇佣一个员工的频率:这些事件发生的频率远低于常规销售或库存变动。
-
表之间显然是互相关联的。事实上,它们的许多列代表的是相同的事物。例如,已售商品的Product_ID与我们在产品主数据中找到的Product_ID相同。这两个表是相关的,实际上,这类数据库——在企业中无处不在——被称为关系数据库。用于连接多个表的列被称为键:当两个表的行在其键中具有匹配的值时,表示这些行是连接的,指代同一事件或实体。这意味着,在销售事务表中,所有Product_ID列具有特定值(假设为PS012)的行,都指代同一产品的销售。通过表之间发生的关系,您可以通过查找产品主数据中的Product_ID值来找到该产品的描述(在这里,您会发现PS012指的是——在这个案例中——一架斯坦威钢琴)。
描述关系数据库底层数据模型的一个简单有效的方法是通过实体关系(ER)图。ER 图看起来像是一系列互相连接的框:每个框代表一个表,并展示其列,而连接则显示跨键的现有关系。图 3.1展示了我们音乐商店数据库的简化 ER 图:键以粗体字和小图标突出显示:

图 3.1:音乐商店数据库的实体关系图
本书中我们会遇到这种类型的图表。我建议您尽力绘制您在工作中最常使用的表的 ER 图,因为这将简化您对如何最好利用它们的思考。事实上,映射企业中各种系统中所有可用的数据是一个艰难但值得的练习。
保持这一映射的最新状态——以及通常来说——在公司中管理数据资产需要一定的纪律性和一套正式的角色、流程和标准,这些被称为数据治理。一个好的(而且经常被低估的)数据治理实践,实际上是创建一个数据清单:这是一份公司所有信息资产的系统性描述。当您建立数据清单时,您必须正确地映射主数据和事务表,发现重复项和缺失的键。
数据清单包括有关存储在表中的数据的信息,如内容、来源、所有者和许可:这些都是元数据的例子,这个词字面意思是“关于数据的数据”。
合并表
数据模型向我们展示了不同表格中的数据点如何在逻辑上相互关联。在数据分析实践中,我们经常需要通过利用数据模型描述的逻辑关系将数据合并在一起。将两张表格合并成第三张表格的最常见操作称为连接。通过合并两张表格,我们可以交叉丰富它们,因为我们合并了关于特定事件或实体的所有信息。连接操作将两张表格中的行进行匹配,前提是我们指定的列中有相同的值(匹配列)。让我们假设有以下两张表格,分别表示销售交易和产品主数据:
| 销售 |
|---|
| 产品 |
| Gibson Explorer B-2 |
| Squier Affinity |
| Yamaha YDP-164 |
| Squier Affinity |
表 3.1:销售表
| 产品 |
|---|
| 产品 |
| Gibson Explorer B-2 |
| Squier Affinity |
| Yamaha YDP-164 |
表 3.2:产品表
如果我们需要计算每个产品类别的总销售额怎么办?第一张表告诉我们每笔交易的销售额,但缺少类别信息,因此我们无法相应地汇总这些销售额。第二张表有类别信息,但没有提供任何关于销售的信息。每张表都有缺失的内容,所以我们需要通过连接将它们合并起来。好消息是,这两张表共享一个列(产品),可以用作匹配。我们将使用产品作为匹配列将它们连接在一起:
| 上述两张表的连接 |
|---|
| 产品 |
| Gibson Explorer B-2 |
| Squier Affinity |
| Yamaha YDP-164 |
| Squier Affinity |
表 3.3:连接“产品”表和“销售”表
看看会发生什么?通过连接这两张表,我们得到一个第三张输出表格,其中每个交易不仅包含产品名称、日期和金额(这些信息仅出现在第一张表格中),还包括每个产品的类别(这些信息仅出现在第二张表格中)。现在,这张表格可以用来计算每个产品类别产生的销售额,只需要进行正确的聚合操作(我们将在接下来的几页中学习如何操作)。
为了完整介绍连接,我们再考虑一个最后的方面。即使两个表有一些公共列(可以用于匹配),它们也不一定每一行都有与另一表中对应行的匹配。在前面的例子中,我们可能会有一些交易,涉及到未包含在产品主数据中的乐器(可能是新到货的商品,尚未分类),或者反过来(主数据中的产品尚未售出)。如果我们在没有完美匹配行的情况下合并表格,输出可能会包含一些空白(就是我们在上一章中遇到的著名 NULL 值),因为我们没有相应的值可以使用。根据我们管理这些缺失匹配(以及输出中不完整行的结果)的策略,我们可以实现不同类型的连接。假设我们想连接以下两个表(按惯例,在连接操作中合并的两个表分别称为左表和右表,因此以下表格中的标题名称):
| 左表:销售 |
|---|
| 产品 |
| Gibson Explorer B-2 |
| Squier Affinity |
| Korg B2 |
| Yamaha YDP-164 |
| Squier Affinity |
| Didgeridoo Black 2 |
表 3.4:左表
| 右表:产品 |
|---|
| 产品 |
| Gibson Explorer B-2 |
| Squier Affinity |
| Yamaha YDP-164 |
| Korg B2 |
| Steinway B-211 |
| American Jazz-5 |
表 3.5:右表
请注意,某些产品在另一表中没有相应的匹配项,正如以下文氏图直观地展示的那样:

图 3.2:销售表和产品表的文氏图:并非所有乐器都出现在两个表中
根据我们希望如何管理结果输出表中“未匹配”行的方式,我们有四种不同类型的连接:
-
内连接:在这种情况下,我们只保留在两个表中都有匹配的行。我们关注的是两个列中键的交集。通过这样做,我们避免了由于键不匹配而生成任何 NULL 值。另一方面,我们可能会忽略一些行——即使它们不完整——也包含一些有价值的信息,例如尚未分类的产品销售。
-
左外连接:这种连接方式会保留左表中所有现有的行,即使它们在右表中没有匹配项。通过这种方式,我们可能会在输出中遇到一些 NULL 值,但我们“保留”了左表中的信息。
-
右外连接:这种连接方式与前一种相反,保留右表中所有的行,包括那些在左表中没有匹配项的行。
-
完全外连接:当我们不能承受丢失任何数据时,我们选择这个选项!即使没有匹配的行,两个表中的所有行也会保留下来。这是一个可能会产生最多 NULL 值的选项:这是为了保留所有数据的代价。
![]()
图 3.3:四种连接类型:决定要保留哪些行
在表 3.6中,您将看到应用四种连接类型的结果:NULL 值显示为问号,正如您在 KNIME 中看到的那样。内连接没有 NULL 值,正如预期的那样:
| 内连接 |
|---|
| 产品 |
| Gibson Explorer B-2 |
| Squier Affinity |
| Korg B2 |
| Yamaha YDP-164 |
| Squier Affinity |
表 3.6:内连接
在左外连接中,即使某些产品尚未分类,我们仍然会有一行记录与迪吉里杜管的销售相关。这个特殊的土著乐器可能是因为它是一个新到的亮眼商品,吸引了顾客的注意,而我们还没来得及通过更新产品主表来添加它:
| 左外连接 |
|---|
| 产品 |
| Gibson Explorer B-2 |
| Squier Affinity |
| Korg B2 |
| Yamaha YDP-164 |
| Squier Affinity |
| Didgeridoo Black 2 |
表 3.7:左外连接
在右外连接中,我们也强制为那些因为价格原因尚未销售的乐器创建一行记录。这个视图可以帮助我们发现可能需要在下一期新闻简报中做更多广告的产品:
| 右外连接 |
|---|
| 产品 |
| Gibson Explorer B-2 |
| Squier Affinity |
| Korg B2 |
| Yamaha YDP-164 |
| Squier Affinity |
| Steinway B-211 |
| American Jazz-5 |
表 3.8:右外连接
完全外连接不仅会包含那些从未销售过的产品,还包括那些尚未分类的产品。创建这样的表格可以帮助我们按类别汇总销售情况,并一目了然地发现那些未分类和未售出的产品:
| 完全外连接 |
|---|
| 产品 |
| Gibson Explorer B-2 |
| Squier Affinity |
| Korg B2 |
| Yamaha YDP-164 |
| Squier Affinity |
| Didgeridoo Black 2 |
| Steinway B-211 |
| American Jazz-5 |
表 3.9:完全外连接
正如这个简单示例所揭示的那样,任何类型的连接都有其价值。作为数据工作者,我们希望了解我们有哪些可用的选项,以便根据我们所面临的业务场景来选择使用哪一种。
在 KNIME 中执行连接操作时,我们可以利用一个非常有用的节点,这个节点被称为——我们不得不承认——Joiner。
Joiner
这个节点(位于 Manipulation > Column > Split & Combine)会根据用户提供的匹配标准将连接在其输入端口的两个表连接起来。要配置它(图 3.4),你首先需要通过选择两个相关并应当匹配的列,来指定连接的标准。要添加第一对列,点击标有 Add matching criterion 的按钮。你将看到两个下拉菜单,分别显示连接到上方和下方输入端口的表中的可用列(按照惯例,分别指代连接操作的 左 表和 右 表)。你可以通过点击右侧的 + 和 - 按钮来添加或移除要匹配的列。默认情况下,所有在此输入的列对需要具有匹配的值,才能使行匹配。它们也需要是相同的类型(例如,整数与整数匹配,字符串与字符串匹配,等等)。
为了解决不匹配的数据类型,节点允许你在评估匹配标准之前转换列的数据类型。例如,在标有 Compare value in join columns by 的选择器中,你可以选择 string representation,将所有值转换为字符串后再检查它们是否匹配。
在明确匹配标准后,你需要决定希望执行哪种类型的连接操作(Inner、Left outer、Right outer 或 Full outer)。为此,可以参考 图 3.3 中的维恩图。如果你想要内连接,仅需要选择 Matching rows 选项框。对于左外连接或右外连接,你还需要分别勾选 Left unmatched rows 或 Right unmatched rows。对于全外连接,所有框都应选中。如你从其图标中所见,节点有三个输出端口。顶部的第一个输出端口承载连接结果。你还可以选择查看那些未在另一个表中找到匹配的行,并将它们放入第二和第三个输出端口。如果你也有兴趣查看未匹配的行(有时这有助于理解为何并非所有行都能匹配),你需要勾选 Route unmatched rows to separate ports 选项框:这将激活第二和第三个端口,否则它们将保持不活动并标记为红叉。
最后一种在大多数情况下选择的选项是合并连接列:这样做,你只保留一对用于评估匹配的列“副本”。如果你不选中该选项,你将保留来自左侧和右侧输入表的两列:在大多数情况下,你不希望这样,因此此框应始终被选中。

图 3.4:连接器的配置对话框:选择哪些列应匹配
在配置对话框的第二个标签页(列选择)中,你可以指定哪些来自连接操作的列应保留在节点的输出端口。这在你知道在后续的工作流步骤中不需要某些列时非常有用:在这种情况下,只需浏览右侧框中的列,并双击那些需要移除的列:

图 3.5:连接器的配置对话框:选择哪些列应匹配
对于使用 Microsoft Excel 的用户,你会注意到你可以通过 vlookup() 等函数在 Excel 中实现左外连接。通过使用 KNIME 代替 Excel,你可以执行所有类型的连接(不仅仅是左外连接),并且可以轻松地在多个列上定义匹配标准(在 Excel 中这需要一些变通方法)。
为了完整性,除了连接操作符之外,还有一些其他方法可以将表格合并。如果你不需要考虑任何匹配标准,并且只想将具有相同维度大小的表格“拼接在一起”,你可以:
-
将两个具有相同行数的表格的列追加在一起。你将获得第一张表的列,紧跟着第二张表的列,顺序保持原表中的排列。你可以通过使用 KNIME 中的列追加器节点来实现。
-
将两张具有相同列的表格的行连接起来,将第一张表的行放在第二张表的行上方。这个节点叫做连接。
图 3.6 展示了这两个节点是如何工作的:

图 3.6:无匹配标准的表格合并:你可以使用这两个节点追加列或连接行
现在我们已经明确了有许多方法可以将多个表格合并为一个。接下来,我们来看看另一个无处不在的数据转换需求:聚合值以创建表格的摘要视图。
聚合值
原始数据表中包含的信息分散在所有行中。通常,我们需要将大表压缩为更小、更易读的表格,其中的值按照给定的逻辑进行聚合或总结。例如,如果我们有一张包含去年所有接收订单的表格,并且想要理解销售额随时间的变化,我们可能更喜欢计算一个简单的表格,显示每个月生成的订单总数,而不是长长的表格,其中的行数与订单数一样多,我们更倾向于通过聚合显示只有十二行的表格,每月一行。
汇总数据的简单方法是使用一种非常流行的数据库操作,称为Group By:它将各个组中的行合并并在每个组内聚合它们的值。要执行 Group By,您需要决定两件事:
-
首先,您必须声明哪些列定义了一个组。在定义组的列中显示相同值的所有行将在输出中合并成一行。让我们以表 3.6为例。如果您使用列类别定义我们的组,那么 Group By 的结果将只有两行:一个是吉他的总销售额,另一个是钢琴的总销售额。您可以通过多个列定义组:在这种情况下,您将为每个组列唯一值的每种组合获得一个汇总行。例如,如果您选择日期和类别作为组定义,那么每个类别将为不同销售日期的每一天获得多个输出行。
-
其次,您需要决定如何跨行汇总,即使用哪种聚合函数。例如,您可以简单地计算出在一组中出现的所有行数,将它们的值相加或计算它们的平均值。在销售汇总表格中,我们决定计算销售交易的数量,但我们也可以使用求和作为聚合函数来计算每个月产生的总收入。
现在是时候在我们的音乐店示例中看到 Group By 操作的实际效果了。让我们使用内连接结果作为输入,在表 3.6中。我们希望通过产品类别总结我们的销售,计算每个类别生成的收入以及总销售的数量:
| 按类别分组的销售 |
|---|
| 类别 |
| 吉他 |
| 钢琴 |
表 3.10:按类别汇总的销售摘要
正如我们所预期的那样,生成的表格只有两行,分别对应原始表格中的每个类别。让我们来看看 KNIME 中能够执行这种聚合的节点。
按组
此节点(操作 > 行 > 转换)按组对表格的行进行聚合,组的定义是通过一组列的子集来实现的。其基本配置需要两个步骤。在分组面板中,你需要选择哪些列定义了分组,并将它们移到右侧的列表中,右侧列表用绿色边框标出。你可以选择多列:输出表格将为每个指定列中不同值的唯一组合生成一行。如果你不选择任何列,则会将输入中的所有行汇总成一行总计数据输出:

图 3.7:按组设置:决定哪些列定义一个组
第二步是声明哪些列应该被汇总,以及使用哪个聚合函数。你可以通过双击左侧列表中的列名来定义要聚合的列。然后,你可以从下拉菜单中的聚合选项选择聚合函数。你可以多次选择相同的列,并使用不同的函数进行聚合。在底部的下拉菜单(列命名)中,你可以指定用于聚合列的命名约定。默认选项是聚合方法(列名),这将创建类似于Sum(Quantity)的列标题:

图 3.8:按组聚合设置:决定如何在每个组内汇总你的行
在表 3.11中,你可以找到用于汇总每组内行的最常用函数。对于这些函数中的一些,比如计数或首个,你需要决定是否将 NULL 值视为与其他值一样的值,还是忽略它们。如果你希望忽略 NULL 值(仅对实际值进行聚合),请勾选右侧的缺失复选框:
| 聚合函数 | 描述 |
|---|---|
| 求和 | 对一组中的所有值进行求和,返回总和。 |
| 计数/唯一计数 | 计算每组内的所有行。唯一计数忽略重复值,只计算不同的值。 |
| 平均值/中位数 | 计算每个组内的平均值和中位数值。 |
| 众数 | 获取每个组中出现次数最多的值。 |
| 首个/最后一个 | 获取每组中的第一个/最后一个值,取决于输入时的排序。确保在此之前先对行进行排序。 |
| 最小值/最大值 | 获取每个组内的最小值和最大值。 |
| 连接/唯一连接 | 将所有值连接成一个字符串,使用文本框底部指定的分隔符。唯一连接会忽略重复值。 |
| 相关性 | 计算与另一个列的相关性(你可以通过点击编辑按钮选择该列),在每个组的元素中计算。 |
表 3.11:汇总函数
聚合数据的另一种方式是使用Pivot操作。与“Group By”操作将数据分组为输出表格的行不同,使用该操作我们可以“旋转”一些分组(我们称之为枢轴)使其垂直显示,作为列出现在输出表格中。你可以把枢轴看作一个二维矩阵,显示跨水平分组(最终会显示为枢轴的行)和旋转的垂直分组(作为输出矩阵的列)的聚合结果。
让我们看看在音乐商店示例中如何使用 Pivot 操作。再次从内连接结果开始,我们希望通过一个单独的表格总结我们的销售数据,显示每种类别(水平分组)和日期(垂直分组或枢轴)的每个组合的总和:
| 销售额,按类别和日期旋转 |
|---|
| 日期 |
| 类别 |
| 吉他 |
| 钢琴 |
表 3.12:按类别和日期的销售枢轴
生成的枢轴表格有两行,每个类别对应一行(与 Group By 类似),并且有多列,显示每个可用日期的聚合结果。在 KNIME 中,我们可以使用Pivoting节点来创建这样的汇总。
Pivoting
此节点(Manipulation > Row > Transform)通过创建枢轴表格来聚合值。它的配置对话框与GroupBy类似,但包含一个额外的Pivots面板,如下所示:
-
在Groups面板中,您指定定义水平分组的输入列,这些分组将在输出的枢轴表格中显示为行。
-
在Pivots面板中,您指定用于创建垂直分组的输入列,这些分组会作为列出现在结果表格中。
-
最后,在Aggregation面板中,您可以选择要汇总的输入列和使用的聚合方法。
与我们在GroupBy节点中看到的类似,底部的两个下拉菜单(列名和聚合名)可以用来指定生成的枢轴列的命名约定。默认情况下,您会看到列头将每个枢轴的名称与聚合方法连接在一起,比如 21-Dec+Sum(Amount):

图 3.9:枢轴设置:选择用于垂直分组(枢轴)的列
Pivoting节点不仅有一个输出端口,而是有三个:您可以通过右键点击节点后,在弹出菜单底部选择最后三个放大镜图标之一来查看它们。第一个输出是枢轴矩阵(大多数情况下,您只需要这个),第二个输出是仅对水平分组的总聚合(忽略枢轴),第三个输出是所有枢轴行的总和(忽略分组)。
数据透视表的概念已被微软 Excel 普及。现在你已经知道如何在 KNIME 中构建数据透视表,你可以访问更广泛的聚合方法,并能够将数据透视操作纳入更广泛的自动化工作流程中,消除所有手动干预,如刷新和复制/粘贴。
在某些情况下,你可能需要进行反向操作,称为反透视:这将把表格中的列转换为在输出表格中显示为多行。如果你想在 KNIME 中执行这个转换,查看反透视节点。
在图 3.10中,你可以看到我们已经讨论过的三种表格聚合和拆解方法的总结:

图 3.10:通过聚合和拆解转换表格:最有用操作的总结
合并表格和聚合值是你可以进行的基本数据转换。让我们在一个完整的教程中看看这些操作的实际应用,这将是学习 KNIME 更多技巧的机会,比如计算公式、可视化数据以及使用循环和变量。
教程:销售报告自动化
在本教程中,你将扮演一位为一家总部位于英国的在线零售商工作的商业分析师,销售各种场合的礼品。你对数据分析充满兴趣,并且正在阅读一些关于其潜力的(优秀)书籍。你为自己设定了一个目标:通过利用你的新技能,逐步增强公司内数据分析的作用。你决定从一些相对简单的事情入手:自动化并改进销售数据的报告。通过这样做,你希望能够快速且显著地产生影响,激发同事和经理们对更高级数据分析的兴趣,从而解锁他们的兴趣和投资。
你所在的公司发展迅速,但没有机会采用可持续的商业智能解决方案。定期报告是通过手动操作 Excel 来管理的。负责此项工作的财务分析师每周五从公司网站提取数据,并经过几个小时枯燥的手动操作后,发送带有最新状态的电子邮件。由于这项活动的手动性质,报告容易出现人为错误,几乎每周都会引发几封来回的电子邮件,导致没有时间识别数据中的商业模式和创造实际价值。你非常理解财务分析师的处境,决定抽出几小时,利用 KNIME 自动化整个报告过程。
首先,你成功地提取了人们关于销售演变的最重要商业问题清单。这个初步清单将成为你初步努力的良好基础:
-
我们的产品系列中,哪些是销售量最大、最具影响力的前十个产品?
-
每个子类别中排名前三的产品是什么?
-
我们卖得最多的是哪个国家?
-
截至当前日历年, 每个产品类别产生了多少收入?
-
相较于当前年度的总产品组合,每个类别的相对占比是多少?
-
我们应该在哪些月份预计季节性类别的销售达到峰值?
你决定,第一份自动化报告应包括一个表格视图,回答上述前五个商业问题。对于最后一个问题,由于业务的季节性行为不会在每周变化太大,构建一张展示月度销售模式的图表即可,作为一次性工作。定义了你的工作应涵盖的最小交付集后,你准备进入下一步,评估需要哪些数据来实现这些目标。
进行任何数据工作时,首先要明确你所追求的商业问题。许多分析项目失败,原因在于缺乏对最终目标的理解。确保你始终“可视化”你想从数据分析中获得的结果,以及你期望它如何实际影响你的业务。如果可能,将其写下来,就像我们刚才列出的六个问题一样。
在财务分析师(他已经为你的项目感到非常兴奋)的帮助下,你提取了定期销售报告所需的最新数据,并发现这些数据分散在三个不同的表格中。
-
产品主数据:包括一个唯一的字母数字代码(StockCode列),作为产品 ID,一个简短的描述,以及两个列用于定位每个商品在公司所使用的两级产品层级中的位置,即Category和Subcategory。例如,在“文具”类别下,我们有“笔记本”和“贴纸”子类别,而在“家居”类别下,我们有“时钟”和“家具”子类别。
-
客户主数据:对于每个已在网站上注册的客户,包括一个标识符(Customer_ID)和Country(居住国家)。
-
销售交易:这是最大的表格,因为它记录了所有销售。对于每个发票(通过Invoice_ID列标识),该表格可以包含多行,每行代表一个交易中的产品(通过其StockCode描述)。每一行还包括购买的商品数量(Quantity)、单价(Price)、Customer_ID(如果客户未注册,则可能为空)以及描述购买日期和时间的字符串(Invoice_time)。
产品和客户主数据表格存储在两个文本文件中(分别命名为productMD.csv和customerMD.csv),这些文件来自订单管理系统。交易数据则分别存储在两个 Excel 文件中(TransactionL3M.xlsx和TransactionsHistory.xlsx):第一个文件仅包含最近三个月的销售记录,而第二个文件则包含其余的交易历史记录:

图 3.11:在线零售商数据库的实体-关系图
现在我们已经具备了足够的知识来开始:如果我们意识到需要更多关于数据和业务需求的信息,我们可以随时回去向我们的财务分析师寻求额外帮助。通过查看业务问题清单,我们注意到我们需要使用不同主数据表中的字段(例如类别、国家)对事务进行汇总,因此我们需要加载所有这些表并将它们合并。让我们打开 KNIME,创建一个新工作流(文件 | 新建... 和 新建 KNIME 工作流),并开始构建它。
-
第一阶段,我们加载包含在两个独立 Excel 文件中的交易数据。我们从历史数据开始,拖动
TransactionsHistory.xlsx到空白工作流,或实现Excel Reader节点。在配置窗口中,我们注意到预览中包括了我们预计会出现的所有列,因此我们可以关闭它,保持选项不变。我们对另一个文件(TransactionsL3M.xlsx)重复相同的操作,然后运行这两个节点。我们目前加载的两个表都涉及事务,并且共享完全相同的列。我们可以通过使用Concatenate节点将它们合并并将一个叠加在另一个上。
Concatenate
该节点(操作 > 行 > 转换)通过将第二个表的行添加到第一个表的底部来连接两个表。如果列具有相同的标题,节点将合并这些列。您可以使用其配置窗口来决定如何处理在两个输入表中未出现的列。默认情况下,所有列都会保留(列处理部分的使用列的并集选项):这意味着如果某个列仅存在于一个表中,它将在输出中以 NULL 值显示于来自另一个表的所有行。如果选择另一个选项(使用列的交集),所有不匹配的列将在输出中被丢弃:

图 3.12:连接节点的配置窗口:选择如何处理重复和不匹配的列
-
我们可以将两个事务表合并,并将两个Excel Reader节点的输出连接作为Concatenate节点的输入。由于这两个输入表的列完全相同(列名相同),我们不需要关注节点的配置,可以使用其默认行为。运行该节点后,输出结果将是包含超过 60 万行的完整销售事务表。
-
现在让我们加载存储在
customerMD.csv文件中的客户主数据表。我们可以通过将文件拖放到编辑器中,或者实现一个CSV 读取器节点并通过指定文件路径来配置它。请在配置窗口中仔细检查该节点是否正确识别了列分隔符(在本例中是分号):你也可以随时点击自动检测格式,让 KNIME 猜测格式。 -
现在我们可以将销售表与客户主数据表合并,以便为每个交易提供生成该交易的国家信息。我们将连接节点和CSV 读取器节点的输出连接到一个连接器节点。双击该节点后,我们可以进行配置。首先,我们需要设置匹配行的条件。我们点击添加匹配标准按钮,并从两个表中选择Customer_ID。第二步是指定连接的类型。我们希望保留所有交易(左表),即使它们在客户主数据(右表)中没有对应的匹配项,因此我们选择进行左外连接。事实上,我们的同事(他开始钦佩我们在 KNIME 中的敏捷操作)确认,尽管并非所有客户都包含在客户主数据中,但我们应该考虑所有产品销售的交易。为了获得左外连接,我们需要勾选匹配的行和左侧未匹配的行。白色和黄色的维恩图顶部的左外连接标题确认了我们的操作是正确的。最后一步是选择合并连接列选项,以避免携带两份Customer_ID列。
当我们关闭配置窗口并运行节点时,我们注意到没有任何行被匹配:实际上,输出表中的所有行都包含了空值('?'单元格)。通过重新打开连接器的配置窗口(图 3.13),我们意识到发生了什么:我们正在连接的两个表中的Customer_ID列指向相同的属性,但数据类型不同(交易表中是字符串,客户主数据表中是整数)。这种情况是常见的:由于承载表格的文件格式不同,数据类型可能被不同地解释。

图 3.13:不匹配的连接列:相同的内容但不同的数据类型
数字转文本
该节点(操作 > 列 > 转换 & 替换)将数值列(如整数和小数)转换为文本字符串。它的配置非常简单:你只需要选择哪些数值列需要被转换,方法是从右侧的选择面板中保留或移除它们:

图 3.14:数字转文本配置:你希望将哪些数字转换为文本?
-
为了将主数据中的Customer_ID列转换为字符串,我们在CSV 读取器和连接器之间添加了一个数字转字符串节点。最快的方法是将节点从资源库拖到现有连接上,然后按住鼠标按钮放开(选中时连接会变红)。现在我们可以执行连接器节点,并注意到在其输出端(按Shift+F6打开视图)我们不再看到任何 NULL 值。相反,我们可以看到所有交易,右侧增加了一列国家,这正是我们所期望的。
-
现在是时候通过常规的 CSV 读取器节点加载产品主数据表格了,我们将通过加载
productMD.csv文件来实现。 -
我们现在可以在下游添加一个额外的连接器:第一个输入端口应该与前一个连接器节点的第一个输出端口连接,而第二个端口则应接收来自最新CSV 读取器的产品主数据。在其配置中,我们首先选择StockCode作为左表和右表的匹配列:数据类型完全匹配,因此无需转换。这次我们希望执行内连接,因为我们不希望携带不包含在产品主数据中的产品的销售记录,因为这些产品不属于任何产品类别,会使报表变得不易读。因此,在连接器的配置窗口中,我们只选中匹配的行框。最后,勾选合并连接列框,以避免重复显示StockCode列。当我们执行该节点时,得到一个表格,表明每一行所售产品的描述及其在层级中的分类。
所有数据现在已经加载并合并成一个表格:我们可以继续准备这个表格,生成所需的报表。我们注意到所有业务问题都需要按生成的收入对销售进行汇总,而我们的表格中为每个发票项显示的是数量和价格。为了计算每笔交易所产生的收入,我们需要实现一个简单的数学公式,这正是下一个节点的用途。
数学公式
这个节点(操作 > 列 > 转换和替换)会对每一行表格评估一个表达式,并将其结果返回到指定的列中。配置对话框看起来非常熟悉:实际上,它与我们在第二章《KNIME 入门》中遇到的字符串操作节点的结构相同。唯一的区别是,在这里,你可以使用处理数字的函数,如ceil()或floor(),将小数数值四舍五入到最接近的整数,或者使用sqrt()来计算平方根。所有可用的函数都列在中间,通过选择它们,你可以在右侧的文本框中查看其描述和示例。
构建表达式的最简单方法是双击右侧可用的列(只有数字列会显示),并使用中央文本框创建您的表达式。在这里,您可以添加所有需要的数学运算符,如+、-、*、/和括号。每行表达式的结果将保存在一个新列中(Append Column),或者将替换现有列的内容(Replace Column),您可以在底部的单选按钮中进行选择:

图 3.15:Math Formula 对话框:通过组合您需要的列构建数值表达式
-
要计算每笔交易产生的收入,我们实现一个数学公式,并将其与前一个节点(Joiner's的上部输出端口)连接起来。在配置窗口中,我们构建表达式:
$Quantity$*$Price$,选择Append Column选项并将其命名为Sales。通过查看生成的表格,我们观察到几个清理的机会。首先,我们注意到Country列有一些缺失值,因为一些客户在主数据中缺失。我们应该用默认值替换它,当国家缺失时我们使用的默认值是
Unspecified字符串。其次,我们发现类别"Others"并不指代实际的产品销售,因为它描述了额外的费用(如邮费和银行佣金)以及手动调整。财务分析师确认,所有在"Others"类别下生成的销售应从任何报告中排除。 -
要管理缺失的国家,请添加Missing Value节点,并使用其第二个选项卡(Column Settings)进行配置。双击左侧找到的Country列,在出现的下拉菜单中选择Fix Value。然后,在文本框中输入
Unspecified,然后单击OK关闭窗口。 -
要删除与"Others"类别相关的行,我们可以使用Row Filter节点。要配置它,请在右侧选择Exclude rows by attribute value,然后在Column to test选择器中选择Category,最后在use pattern matching下拉菜单中选择"Others":
![图形用户界面,应用程序 自动生成的描述]()
图 3.16:Row Filter 对话框:排除具有给定列中特定值的行
当表格清理完毕(您现在应该在最后一个节点的输出端口处有 672,104 行和 11 列),我们最终能够生成回答我们每个业务问题的表格。第一个问题要求列出产生最大销售额的产品。此时,与产品相关的销售分散在多个行中,每个包含该产品的发票都有一行。因此,我们需要按产品聚合销售额。
-
为了获取每个产品产生的总销售额,我们实现了一个GroupBy节点。在配置窗口中,我们选择定义输出中唯一分组的列。由于我们希望每个产品都有一行,并且希望报告中包含描述它的列,在Groups标签页中,我们选择了StockCode、Description、Category和Subcategory列,并确保它们最终都出现在右侧绿色边框的列表中。GroupBy节点将为每组列中每个值的组合创建一行,但由于我们知道对于每个StockCode,都有一个唯一的Description、Category和Subcategory,我们可以安全地将它们都保留在分组描述中,以便将它们保留在输出表格中,这将使得结果更加信息丰富。在Manual Aggregation标签页中,我们双击Sales和Quantity列,并为这两列都指定Sum作为Aggregation function。为了使报告更易读并避免列名过长,我们在底部的Column naming下拉框中选择Keep original name(s)。然后,我们可以点击OK并进入下一步。
-
由于我们只想显示产生最大销售额的产品,因此我们需要使用Sorter节点按降序排列表格中的Sales。在实现该节点并与前一个节点建立连接后,我们可以在下拉菜单中选择Sales并选择Descending排序。
-
解答这个业务问题的最后一步是将我们排名前十的产品列表限制为前十项。使用Row Filter节点,我们在左侧选择按编号包含行,然后输入
1作为First row number,并输入10作为Last row number。
执行最后一个节点并检查结果表格后,我们感到非常满意,因为屏幕上显示了销售额最高的十个产品。这个积极的中间结果鼓励我们继续推进挑战:

图 3.17: 按销售额排名前十的产品:谁会想到一个蛋糕架能赚这么多钱?
下一个问题要求我们报告每个子类别中最畅销的产品。类似于我们之前为前一个问题所做的,我们对产品列表应用过滤,只保留在排序列表顶部的产品。然而,这次我们需要重复过滤操作多次,每个子类别一次。
在 KNIME 中,你可以通过创建循环来重复执行工作流中的某一部分。实现循环在 KNIME 中非常简单:你有一组起始和结束循环节点(可以在工作流控制 > 循环支持中找到它们),你可以用这些节点来定义需要重复的工作流部分(循环主体)。根据你选择的循环起始节点的类型,你可以决定重复执行的逻辑。一旦循环执行完毕,你将在循环结束节点的输出端口找到拼接后的结果,并且会有一个额外的列标明每一行对应的循环编号。看起来很简单,实际上也是如此!
下面你将看到最常用的循环节点的图形总结。更具体地说:
-
计数循环起始:如果你希望重复执行工作流的某一部分一定次数(你可以在配置对话框中指定次数),可以使用此节点。
-
块循环起始:该循环会针对输入表中每一个固定大小的连续行块重复执行。你可以决定总循环次数或每次循环的块大小。如果选择块大小为 1,那么你将对输入表中的每一行分别重复执行工作流的某一部分。
-
组循环起始:该循环将针对每一组行重复执行,组是通过你选择的列中每个唯一值的组合来定义的。还记得分组节点吗?在那时,你为每个组获得了一个聚合后的行;在这里,你将针对每个组重复执行工作流的某一部分。我们很快会使用这个节点,这将使它的行为更加清晰。
还有其他一些节点用于启动和结束循环,这些节点能扩展你在工作流中重复执行某些操作集的灵活性。请查看递归循环节点:使用这些节点,你可以将 t循环的输出带回到起始节点,从而在同一行上重复执行。
图 3.18 显示了你的工作流中可能的循环设置摘要。记住:在同一个循环主体上,你只能有一个循环起始和一个循环结束节点协同工作。图中的虚线展示了三种可行的循环起始节点选项:

图 3.18:KNIME 中的循环节点:根据需要重复工作流的某一部分
在简短介绍了如何在 KNIME 中创建循环后,我们回到我们的业务案例。我们希望对每个子类别重复筛选出最畅销的产品,因此我们应该实现一个组循环,其中“组”由列子类别简单定义。下面是组循环起始节点的工作方式。
组循环起始
这个节点(在工作流控制 > 循环支持中提供)标志着每个组将要重复执行的工作流部分的起点。所有在定义组的列中具有相同值的输入行将一次性返回到下游循环进行执行。其配置要求你指定定义每个组的列。使用此节点时,需要实现循环结束节点,这将标志着需要重复执行的节点段的结束:

图 3.19:分组循环开始节点的配置窗口:决定定义你希望迭代的组的列
让我们在 KNIME 中创建第一个循环,以回答当前的业务问题。
-
我们可以重用之前为上一个问题创建的排序产品列表,作为我们分组过滤的基础。拖动并连接分组循环开始节点,并将其下游连接到排序器节点。在其配置窗口中,只选择子类别,使其出现在右侧的包含面板中。
-
循环将只需选择每组中的前三个产品。为此,我们可以复制之前为整体顶级产品列表所做的操作。让我们实现一个行过滤器节点,选择按数量包含行,然后输入
1作为首行号,并在此情况下输入3作为尾行号。要在工作流中结束一个循环,我们需要使用适当的节点来指示其结束点。
循环结束
这个节点(工作流控制 > 循环支持)标志着工作流循环的结束。在每次执行循环时,它通过存储到达输入端口的行来收集中间结果。在最后一次循环执行结束时,它将返回中间结果的完整连接。在其配置窗口中,你可以决定是否添加一个额外的列来统计每个中间行生成时所处的循环次数(添加迭代列)。在此节点的弹出菜单中(实现节点后右键点击),你将找到执行它的其他选项。如果点击单步执行循环,你将要求 KNIME 仅运行循环的一次迭代,以便检查中间结果:
你们中的程序员会意识到,这一步执行充当了一个断点,可以用来调查和调试循环的工作方式。你还可以在循环的任何点设置单独的断点:可以查看断点节点来实现这一点。

图 3.20:循环结束节点对话框:你是否要添加一个迭代列?
有时,您需要为每次循环收集多个表格(具有不同的列)。在这种情况下,您可以使用循环结束节点的两端版本,您可以在同一存储库文件夹中找到。
-
让我们实现一个循环结束节点,在行过滤器后取消选中添加迭代列选项:我们不需要它,因为我们保持子类别的名称以指示我们所指的内容。节点的输出显示每个子类别三行,这正是我们需要回答业务问题的内容:
![表 自动生成描述]()
图 3.21:每个子类别的顶级产品:每次循环返回三行,这些行已被循环结束节点拼接在同一张表中显示
下一个问题要求我们按国家报告销售情况,识别我们发货最多的国家。我们只需再次聚合销售表,这次按国家分组,而不是按产品分组,我们可以重复使用行过滤器的输出(排除了“其他”类别)作为工作流程的新分支的起点。
-
我们需要实施一个新的分组节点,其配置与我们早期用于按产品聚合的第一个分组节点类似,但组的定义不同。时间就是金钱,所以让我们复制并粘贴之前的分组节点,并将其连接到第一个行过滤器,如上所述。在其配置中,让我们只处理组面板:这次,我们希望国家是唯一定义组的列。我们可以保持手动 聚合选项卡不变,因为我们仍然希望对收入和数量进行求和。
-
为了使我们的输出更清晰,让我们使用排序器节点按照销售额降序排列行,类似于我们在早期分支中所做的操作。
如图 3.22所示,我们可以确定大多数销售额来自于英国客户,考虑到我们在讨论一个英国公司,这是合理的。
![表 自动生成描述]()
图 3.22:每个子类别的顶级产品:每次循环返回三行,这些行已被循环结束节点拼接在同一张表中显示
当我们进入下一个业务问题时,我们注意到它们都涉及到一个我们至今忽略的维度——时间。为了继续生成我们的报告,我们需要按日期筛选(有两个问题要求我们聚焦于当前日历年的时间范围)并按月份重新聚合(以便发现季节性模式)。在 KNIME 中管理与时间相关的数据相对简单,因为有一组专门为此设计的节点。我们有可以将文本转换为 Date&Time 数据类型的节点(String to Date&Time),可以从 Date&Time 数据点中提取特定元素(如小时、月份或星期几)的节点(Extract Date&Time Fields),以及根据某些时间逻辑筛选行的节点(Date&Time-based Row Filter)。在接下来的几页中,我们将逐一学习如何使用这些便捷的节点。
String to Date&Time
这个节点(其他数据类型 > 时间序列 > 转换)将文本列转换为 Date&Time 值,以便可以在与时间相关的节点中使用。该节点会尝试自动识别字符串中 Date&Time 字段的格式,用户也可以手动输入文本字段的预期格式。在其配置窗口中,您可以首先指定哪些字符串列应该被转换(确保右侧仅包含包含 Date&Time 的列)。
在替换/追加选择面板中,您可以决定是替换列为其转换后的版本,还是添加列,并在其标题中添加固定后缀。在最后一个面板中,您可以输入一个字符串来说明期望的日期格式:例如,字符串如 16/02/2023 会使用格式字符串 dd/MM/yyyy 正确解析。点击猜测数据类型和格式按钮,KNIME 会尝试通过分析第一个单元格的内容来识别格式,您可以在下面的标签中查看该内容。如果自动猜测无法工作,您可以使用像 d、M、y、h、m 和 s 这样的字符手动输入自己的字符串,这些字符分别代表天、月、年、小时、分钟和秒(查看节点描述以获取完整的格式占位符列表)。您还可以选择一个区域设置(称为区域,如en-US 或 it-CH),以确定预计的语言,用于像月份或星期几名称这样的字段:

图 3.23:String to Date&Time 配置窗口:将文本字符串转换为 Date&Time 值
-
让我们实现一个字符串 到 日期和时间的节点,并将第一个行过滤器的输出连接进去(我们仍然可以重用它,因为它携带了已清理版本的表格)。在右侧选择面板中仅保留Invoice_time列,并点击猜测数据类型和格式,让 KNIME 找出一种方法来解释该字符串。我们得到的格式字符串是
'D'dd/M/yy'T'HH:mm:ss,它完美匹配我们表格中第一个值的内容(D01/12/17T07:45:00)。运行该节点后,我们注意到输出表中,Invoice_time列顶部的图标不再是“S”字母,而是一个日历图标:KNIME 现在将把该列视为日期和时间字段,我们可以使用所有其他与时间相关的节点对其进行处理。由于业务问题聚焦于当前的日历年份,我们需要找到一种方法根据日期过滤行,这正是我们下一个节点的专长。
基于日期和时间的行过滤器
该节点(其他数据类型 > 时间序列 > 转换)根据指定的时间范围应用行级过滤。要配置它,首先需要选择用于过滤的列(该列必须为日期和时间类型)。然后,你可以声明要保留的行的区间:你可以指定一个下限(包括所有晚于你在开始面板中声明的时间点的值),上限(保留所有在结束面板中声明的时间点之前发生的内容),或两者(使其成为一个闭区间)。上限可以通过输入一个特定的时间点(选项日期和时间),从开始时间起的复合区间(选项持续时间,例如2y 1M,表示从开始起的两年零一个月),或者从开始起的特定时间段数(选项数字,例如从开始起加或减 10 小时)来定义。通过选中包含复选框,所有等于开始(或结束)日期的值都会保留在输出中:

图 3.24:基于日期和时间的行过滤器节点配置:仅保留与特定时间范围相关的行
-
由于业务问题仅涉及最新的日历年(在我们的数据集中是 2019 年),我们需要实现一个基于日期和时间的行过滤器节点来移除所有早期的行。在其配置中,我们可以取消选中结束框(我们知道日期不会超过 2019 年),并在开始框中输入
2019-01-01作为日期,00:00:00作为时间。 -
由于问题要求我们计算每个产品类别产生的收入,因此我们只需要按类别对结果行(现在仅指 2019 年的数据)进行分组。实现一个分组节点,在分组定义中仅保留类别,并在手动聚合面板中保留销售额和数量的常规求和。同时,这一次,我们希望保持命名简洁,选择保留原始名称在底部下拉框中:
![]()
图 3.25:2019 年按类别销售情况
又一个问题得到了解答!我们成功地将销售限制在了感兴趣的时间范围内,并按我们需要的粒度汇总了销售数据。接下来的问题稍微复杂一些:我们需要计算每个类别的相对足迹,占总收入的比例。这意味着我们应该将各个类别产生的销售额除以总销售额。我们可以使用数学公式节点来实现这个除法运算:除法的分子很容易获取(它是销售额列,这是我们之前通过分组汇总节点得到的结果)。然而,分母需要单独计算并以某种方式包含在公式中。这就是变量派上用场的地方。虽然并不是每个用户都需要在 KNIME 中使用变量,但让我们了解一下基础知识。你可以将接下来几页内容视为成为独立 KNIME 用户的可选学习内容。
KNIME 中的变量可以用来动态控制任何节点的配置。到目前为止,我们一直通过手动操作节点的配置窗口来定制节点的行为。在大多数情况下,这已经足够了。然而,有时我们希望通过一个变量来配置节点的参数,而这个变量可能是某个在另一个节点中执行的计算结果。例如,在我们的销售足迹计算中,我们希望使用总销售额的汇总作为公式中的变量。
一般来说,节点的任何配置参数都可以通过变量进行控制。如果你打开任何节点的配置窗口并进入名为流程变量的标签页(我们到目前为止还没有使用过),你会看到该节点所需参数的列表,并且可以选择哪些变量(如果在工作流的这一点有可用的变量)应当用于控制它们。
要使变量可用,你需要将它们注入到工作流中。最简单的方法是使用一个特殊的节点——表格行到变量,将数据表中的值转换为变量。
表格行到变量
这个节点(工作流控制 > 变量)将输入表格的第一行中的所有值转换为独立的变量,每个变量的名称与对应的输入列相同。它的配置窗口让你选择哪些列的第一行值应该被转换成变量:

图 3.26:表行到变量节点的配置:选择要转换为变量的值
该节点的输出端口是一个红色圆圈,表示流变量。你只需将这个输出端口与接收节点的主体连接,就可以将变量注入到任何节点。
KNIME 中的每个节点都有可用的流变量端口。默认情况下,它们是隐藏的。要显示它们,只需右键点击节点,然后点击显示流变量端口。
需要澄清的是,这个节点仅会将表格中第一行的值转换为变量。如果你需要遍历不同的值,可以使用表行到变量循环开始节点。使用这个节点(例如,与循环结束节点一起使用,你已经见过它),你可以创建一个循环,在每次迭代时,变量的值会赋予每一行输入中的值。
现在我们知道如何在 KNIME 中实现变量了,我们可以创建一个包含销售总聚合的变量,然后在数学公式节点中使用该变量,计算销售足迹。让我们使用分组来聚合总销售额,然后使用表行到变量节点将该数字转换为变量。
-
我们需要将 2019 年发生的所有销售合并成一行,保存生成的总收入。让我们实现分组并将其连接到日期和时间基础的行筛选器节点的输出端口。由于我们只需要一行包含总额的数据,因此可以将分组面板留空:这会在我们的节点上生成一个警告,但我们知道这么做的原因,因此可以忽略它。在手动聚合面板中,我们添加常见的销售列,并通过求和函数进行聚合。为了避免与变量名称混淆,这次我们选择聚合方法(列名)作为命名约定(底部菜单)。一旦我们运行节点,就会得到一个简单的输出,这正是我们想要的:一个包含 2019 年总销售额的单行单列表格。
-
我们现在准备通过在分组后实现表行到变量节点,将这个值转换为变量。此节点无需配置,因为我们可以将所有列(在我们的案例中只有一列)转换为变量。
-
现在终于到了进行足迹计算的时候。让我们实现一个数学公式节点,并建立我们需要的两个连接。首先,这个节点应该接收作为输入的表格,即我们在几步之前用来按类别计算总销售额的分组结果。其次,我们应该通过创建一个连接,将表行到变量节点的红色端口与数学公式节点连接,从而注入包含总销售额的变量。为此,你可以点击红色圆圈,按住按钮,并将其释放到数学公式节点图标上。
虽然这不是必需的,但如果你想查看任何节点的变量端口,只需打开弹出菜单(右键点击节点),然后点击显示流变量端口。
节点配置对话框现在允许我们使用刚刚注入的流变量。你会注意到该变量(名为Sum(Sales)))出现在右侧的流变量列表中。我们可以通过使用鼠标和键盘计算足迹,并获得表达式:
$Sales$/$${DSum(Sales)}$$*100。我们可以附加结果列,并将其命名为Footprint,为了简便起见,通过勾选底部的最后一个复选框将其转换为整数:![]()
图 3.27:足迹计算的数学公式节点配置:我们可以看到左侧的列和变量,准备在表达式中使用
此外,这个商业问题现在已经得到了适当的答案:数学公式的输出包括每个类别的足迹和其总销售额,一次性解答了两个问题。我们还剩下最后一个问题需要解决,这将需要生成一个图表。对于之前的所有问题,我们已经生成了一些表格:把所有这些表格汇总到一个包含多个标签的 Excel 文件中,以便我们能够轻松地传播报告并以紧凑的形式呈现,这将是非常不错的。
-
让我们实现一个Excel Writer节点。由于这次我们需要将四个不同的表格保存到一个 Excel 文件中,我们需要为节点添加三个输入端口。为此,点击节点图标左下角出现的三个点,然后选择添加端口 | 表单输入端口。再重复这一操作两次,总共获得四个输入端口。将提供回答我们目前已处理的五个问题的节点的输出端口连接到这些输入端口(包括整体前十名产品、按子类别的前三名、按国家的销售额以及最后一个数学公式的输出,其中包含 2019 年按类别计算的足迹和销售额)。在Excel Writer的配置中,这次我们会看到Sheets面板中有四个文本框:我们可以使用它们为每个表格分配一个有意义的名称,帮助阅读报告的人理解。声明输出文件的完整路径和名称(点击浏览...按钮选择),然后我们就准备好关闭配置并执行该节点了:
![图形用户界面,文本,应用程序,电子邮件 自动生成的描述]()
图 3.28:Excel Writer 的配置:你可以为每个工作表命名
最终生成的 Excel 文件正如我们预期的那样:我们有四个标签,每个标签关注我们业务的不同方面,直接回答了我们曾经提出的常见问题。

图 3.29:Excel 中的输出文件包含四个工作表,解答了五个商业问题
现在是时候进入最后一个业务问题了,那就是关于我们季节性子类别(“圣诞节”、“夏季”和“复活节”)的月度销售峰值。为了展示全年的季节性模式,我们决定按月份/子类别组合汇总销售额。透视表将实现这种二维聚合,便于在折线图上显示。唯一需要解决的复杂问题是与按月份聚合相关的问题。实际上,到目前为止,我们并没有将月份单独列出,因此无法直接进行聚合。幸运的是,有一个节点可以从日期和时间列中提取任何时间字段。
提取日期和时间字段
该节点(其他数据类型 > 时间序列 > 转换)会为每个日期或时间字段(如年份、月份、星期几、小时、分钟等)创建一个单独的列,从给定的日期和时间输入列中提取。其配置要求我们选择日期和时间源列,然后勾选要提取的字段。由于某些字段可能会受到地区和语言差异的影响,你可以指定你希望使用的区域设置。例如,如果你提取 12 月的月份名称,并使用es-ES区域设置(西班牙语),你将得到diciembre:
![图形用户界面,应用程序]
描述自动生成
图 3.30:提取日期和时间字段节点的配置:选择你希望作为单独列显示的字段
-
现在让我们实现一个提取日期和时间字段节点,并将字符串到日期和时间的输出端口连接到它(我们希望考虑整个数据集——不仅仅是 2019 年——因此我们希望构建一个单独的分支)。配置很简单:输入表中只有一个日期和时间字段,所以它已经在顶部的下拉菜单中被选中。我们只需要提取月份(数字),所以这将是唯一需要勾选的框。
-
现在我们可以按月份和子类别总结销售情况:添加一个透视节点,并配置它,使得分组由新创建的列(Month (number))定义,透视由列Subcategory定义,手动聚合设置为销售额的总和。为了保持标题整洁,我们可以在底部的下拉菜单中选择透视名称作为列名称,并将保持原始名称作为聚合名称。
季节性可以通过一个漂亮的图表来更好地展示,而不是使用表格。要在 KNIME 中构建图表,你可以使用其中一个可视化节点(在视图 > JavaScript的库中查看),就像我们将用于折线图的节点。
折线图
此节点(查看 > JavaScript)根据输入端口给定的数据生成一条折线图。在配置节点时,您需要指定用于横轴(x 轴)的列,以及用于可视化为独立线条的列(y 轴)。此外,您还可以在节点的输出端口生成静态矢量图像(SVG 格式):要启用此功能,请勾选顶部的在输出端口创建图像框:

图 3.31:折线图节点配置:选择在图表的横轴和纵轴上使用哪些列
在轴配置面板中,您可以指定横轴和纵轴的标题,而在常规图表选项中,您可以设置图表 标题、图表 副标题以及输出图像的大小。
-
让我们实现一个折线图(从节点库中选择 JavaScript 版本),并将透视节点的第一个输出连接到它。在配置时,选择月份(数字)作为x 轴,并选择与季节性子类别(圣诞节、复活节、花园)相关的列作为y 轴。我们还将勾选第一个选项框,以便在输出端口生成矢量图像。为了使图表更易读,我们还可以使用轴配置面板添加轴的名称(
销售和月份即可)。要执行该节点并立即打开其输出,右键单击该节点,然后选择执行并打开视图(或Shift + F10):![]()
图 3.32:折线图节点输出:我们的季节性子类别显示出不出奇的月度模式
图表的输出向我们确认了我们期望从子类别中得到的季节性模式:线条的形状可以帮助我们为未来几年可能遇到的需求做好规划。将此图表导出为矢量文件以便在精美的展示中使用会非常不错——最重要的是,正如我们将要学习的那样,利用这个图表构建一个引人入胜的故事!
图像写入器(端口)
此节点(IO > 写入)将图像保存为单独的文件。唯一需要配置的项是指定输出 位置。您可以通过点击浏览...按钮在文件系统中选择它:

图 3.33:图像写入器(端口)节点配置:您希望将图像文件保存在哪里?
- 让我们实现图像 写入器 (端口)节点;将折线图节点的输出连接到该节点(绿色方形连接器表示我们在此传输图像),并通过指定输出文件的保存位置来配置它(确保您指定完整的文件名,包括
.svg扩展名)。
你做到了!虽然花了一些时间,但这笔投资是完全值得的:现在你的工作流可以在几秒钟内生成一个多页报告(并且在需要时,提供季节性模式的可视化证明)。每当有新数据可用时,整个工作流可以通过重置(选择初始节点并按F8)并只执行最终节点(或按Shift + F7一次执行所有节点)来重新运行:不再有人工错误或繁琐的 Excel 手动步骤。财务分析师非常感激,因为她现在可以将每周五用于整理报告的时间,重新投入到更具价值的工作中,例如深入分析数字,提供数据证据的相关解释,并为改善未来的业务成果提供一些建议。

图 3.34:看起来像一条鱼,但它是一个自动化销售报告的工作流
在看到你实际操作后,她现在对 KNIME 产生了浓厚的兴趣,并希望将来能自己学习如何自动化她的数据工作。你已经成功地在工作场所种下了数据分析的热情种子,而且看起来这种热情正在有感染力地传播开来。
总结
完成本章后,你在成为数据分析的自信用户方面已取得决定性进展。你已经学会了通过创建简单的实体-关系模型,为数据库提供一定的逻辑结构。你还体验了转换数据资产的基本操作,如按需合并表格和聚合值。你的分析工具箱变得更加丰富:有了十四个额外的 KNIME 节点,你现在可以构建一些简单的描述性分析工作流,并通过循环和变量自动化它们的执行。完整的教程让你积累了构建一个能够为反复出现的问题提供系统性答案的机器的第一手经验,从一组业务问题出发,并交付一个可重复的流程来回答它们。
在下一章,我们将通过引入人工智能的基本概念将这一切提升到一个新的水平:我们将很快发现如何构建能够从数据中自主学习并支持我们工作的机器。
第四章:什么是机器学习?
自动驾驶汽车、超精确的机器人外科医生、无可挑剔的虚拟助手、全自动化的金融交易员:一些最具前景的人工智能应用似乎更像是科幻小说中的素材,而非即将成为现实的前景。我们可以仅仅通过收集和呈现算法奇迹的轰动故事来填满整本书。如果我们能够——相反——牢牢站稳当下的基础,并认识到智能算法已经能够支持我们日常工作需求,那么我们就开始为我们和我们的业务解锁实际价值。这正是本章的核心内容:通过亲自了解主要的机器学习算法和技术,剥去神话,面对现实。最终目标是让我们将它们视为日常伴侣,而不是遥不可及、未来的可能性。
在本章中,我们将找到以下问题的答案:
-
什么是人工智能和机器学习?
-
什么是解决商业问题的“机器学习方法”?这种方法与传统方法有什么区别?
-
机器是如何学习的?有哪些算法可以实现这一目标?它们是如何工作的?
-
在选择适合我的商业需求的模型时,我需要考虑哪些权衡?
-
我如何评估机器学习解决方案的表现?
尽管本章是全书中最“分析性”的章节,你将只会遇到少量的数学公式。关键是帮助你直观地理解机器学习是如何工作的,而不是提供背后的完整理论背景。
想一想:你不需要成为数学家才能使用数学,也不需要成为计算机科学家或专家程序员才能使用计算机!同样,接下来的几页不会让你从零开始重建完整的建模流程:它将向你展示如何利用那些——剧透一下——已经方便地在像 KNIME 这样的软件平台中实现的流程。在本章中,我们将学习成为机器学习用户所需的基本知识,而在接下来的章节中,我们将通过完整的教程实践这些知识。你可能急于跳入实践,但我强烈建议你先完成本章,确保自己掌握了基础知识后再继续前进。系好安全带:让我们谈谈人工智能!
介绍人工智能和机器学习
机器能思考吗? 这是英国博学者、战时破译员艾伦·图灵在他 1950 年发表的开创性论文中提出的问题,这篇论文为人工智能的基础奠定了基础。虽然图灵并没有使用“人工智能”这一术语(它作为一个研究领域在六年后才被提出),但他坚信机器最终会在所有纯粹的智力领域与人类竞争。
使用科技设备来扩展并部分替代人类智力并不是一项新探索。早在 17 世纪,法国数学家和哲学家布莱兹·帕斯卡尔发明了帕斯卡计算机(图 4.1),这是一台完全可工作的机械计算机,能够通过旋转刻度盘进行加法和减法运算。

图 4.1:帕斯卡的算术机,又称帕斯卡计算机。从左上角顺时针方向:1652 年建造的原始设备;底层齿轮系统的视图;用于加法进位的巧妙机制——sautoir 的详细设计图。照片由 Rama 拍摄,来自 Wikimedia Commons,Cc-by-sa-2.0-fr。
计算数学运算是一项非常具体的智力任务。然而,帕斯卡计算机早期证明了技术可以复制并放大人类进行脑力劳动的能力,而不仅仅是物理活动。这就是人工智能的核心:人工智能(AI)被定义为机器执行显示某种形式的人类智能的能力,例如解决逻辑问题、使用语言进行沟通、识别视觉和听觉模式、理解环境或协调身体动作。在人工智能的更广泛领域中,机器学习(ML)专注于人工复制人类智能的特定方面:学习的能力。
当学习能力应用于任何业务时,具有巨大的潜在价值。如果一台机器能够自动从数据中学习,那么我们就可以利用它持续增长对客户、竞争对手和自身运营的知识。我们可以通过更好的决策减少成本、简化流程、增加收入、积极应对未来,甚至改善客户体验——进而提升客户忠诚度。机器学习算法是推动我们业务增长的 tireless 合作伙伴:它们能够扩展我们团队的整体智慧,利用数字技术的强大计算能力(这种能力随着时间的推移越来越便宜)以及本应闲置在公司数据库中的大量数据。自主学习的强大潜力解释了为什么在过去几年里,机器学习在流行度上迅速超越了它的概念母体——人工智能,成为每个人口中最流行的技术现象。如今,人工智能和机器学习常常被视为同义词,在本书的其余部分,我们将主要提到后者。为了避免你在进一步阅读时的困惑,只需记住:人工智能关注人类智能的整体范围,机器学习则专注于自动学习这一部分。
算法是解决问题的程序,换句话说,是一系列可以遵循的预定义步骤,用以解决特定任务。机器用来乘法两个数字,或者根据以往的数值做出预测的步骤,都是算法的例子。计算机通常能够解决复杂的问题,前提是人类为它们提供了正确的算法来执行。
关于我们可以用人工智能解决的任务性质及由此产生的分类,需要做一个重要的澄清。事实上,研究人员假设存在两种类型的人工智能:强人工智能和弱人工智能:
-
强人工智能(或AGI,人工通用智能)是指机器有可能理解并执行任何智力任务的假设能力。强人工智能会自主地“理解需要做什么”,然后“去做”,甚至表现出那些使我们成为人类的特征,比如意识、自我意识、创造力、意图性和感知能力。尽管强人工智能的概念既令人着迷又让人害怕,但今天它仍主要属于理论推测或虚构探索的领域。许多研究人员认为,AGI 还需要几十年才能实现,而有些人则认为它永远不会成为现实。无论如何,我们在本书中不会进一步探讨这一话题:相反,我们将专注于另一种类型的人工智能,它无疑更接近实现。
-
弱人工智能指的是机器解决预定和特定任务的能力,比如预测未来的销售额、预测用户在特定情况下的行为,或者揭示优化某一特定业务流程的方法。要实现弱人工智能,始终需要人为操作员在设置过程中扮演一个基础性角色:算法需要被引导到待解决的问题,并且最初需要进行调整,以便能够以最佳状态运行。在本书的下一部分,我们将学习如何做到这一点:通过正确的方式设置合适的算法,使其在我们的日常工作中驱动价值,从而使它们以最佳方式为我们带来好处。
由于强人工智能离我们还很远,而弱人工智能显然依赖于正确设置它的人类操作员,因此有一件事是明确的:人类与机器之间并不处于冲突中,不是在为工作场所的主导地位而争斗,保护自己的工作。事实上,情况恰恰相反:当人类与机器协作,通过“正确指导”它们的学习过程时,奇迹就发生了。当这种情况发生时,智能机器展现出它们的全部价值,最终使得它们的人工伙伴受益。考虑到这一点,我们开始学习如何正确地指导人工智能,识别在商业场合中,合适的算法能够带来不同的影响。
机器学习的方法
具有讽刺意味的是,阻碍机器学习在商业中应用的主要障碍既不是算法的实现,也不是数据的获取(如何):最困难的部分是识别出正确的时机来使用它(为什么)!我们需要在复杂的商业流程图中(即公司的运营模式)识别出那些如果采用算法可以带来实际价值的具体步骤。如果我们培养出识别这些杠杆点的敏感度,那么我们将能够在工作中找到将机器学习付诸实践的首个机会。
有一种机器学习的方法(我们可以称之为机器学习方式)来运营商业流程。让我们通过三个示例场景来区分传统方式和机器学习方式在数据创造价值上的不同。
场景 #1:预测市场价格
你在一家专注于多品牌二手车的汽车经销商工作。你注意到一些汽车因为最初定价过高而比其他汽车更难出售,这使得它们的销售周期更长。为了改善这种情况,你希望实施一种基于数据的技术解决方案来指导定价过程:目标是预测每辆车的实际市场价格,从而保持库存控制,同时最大化收入。
这里有两种可能的解决方法:
-
传统的方法是制定一套规则,定义汽车的各项特征如何影响市场价格,并构建一个实现这些规则的“计算器”。该计算器将利用一系列可用的数据点(如不同品牌和车型的新车起始价格,或配件成本)以及一些通过常识和有经验的业内人士定义的经验法则。例如,一些规则可能是:汽车在第一年贬值 20%,然后每过一年再贬值 15%,或者每年行驶超过 10,000 英里的汽车属于高里程车,其价值进一步降低 15%,等等。为了构建这个计算器,你需要使用编程语言实现这些“如果-那么”规则,这意味着你还需要一个程序员来开发和维护代码。
-
机器学习方法是让算法分析与先前销售相关的所有数据,并自主“学习”将汽车特征(如里程、年龄、品牌、型号、配件等)与实际销售价格之间的联系。算法可以识别一些反复出现的模式,这些模式部分验证了我们已经有的规则(也许为这些大致的经验法则增加了一个更精确的层次),部分则发现了新的和意外的关联,这些是人类未能识别并总结成简单规则的(例如,X 型号在配备这种稀有选装件时贬值速度比其他车型慢 37%)。使用这种方法,机器可以随着时间推移不断学习:定价背后的规则将随着新的销售发生和新车型进入市场而自动更新。
主要的区别在于,传统方法中的定价预测将依赖于现有的人工知识(如果得到适当的文档化和编码化),而机器学习方法则提供了让机器从数据中自主学习这些知识(以及可能更多的知识)的可能。
场景 #2:客户细分
你在一家本地超市连锁的市场营销团队工作。你负责准备一份每周的电子新闻稿,发送给那些注册了忠诚计划并选择接收你邮件的客户。你不打算发送统一的新闻稿给所有人,而是希望制作合理数量的不同版本,并根据不同的群体进行分发。通过选择更贴近各个群体需求的关键信息和特别优惠,你的目标是最大化客户群体的参与度和忠诚度。
至少有两种方法可以创建这样的群体:
-
传统的方式是运用常识和你现有的知识来选择能够合理区分不同类型客户的特征,每种类型的客户有着更具体的需求。例如,你可以决定使用家庭成员的年龄和平均收入水平来定义不同的群体:你可能会得到像是富裕家庭有孩子(你可以向他们推荐优质的儿童产品)和低收入的 60 岁以上空巢老人(他们更关注高性价比的优惠)。这种传统方法假设每个群体内部的需求——在此案例中仅通过年龄和收入来定义——是同质的:我们可能会忽略其他维度上存在的一些有意义的差异。
-
机器学习(ML)方式是让算法帮助我们识别出一批在购物行为上表现出相似性的客户群体。由于不受人类认知能力的限制(人类很难同时考虑数十个变量)以及个人偏见的影响(由个体的经历驱动),算法可以识别出那些更加具体并且与每个客户实际偏好紧密相关的群体,比如周末购物的美食爱好者(我们可以每周六早晨向他们发送一些精美的食谱)和高收入宠物主(他们想要照顾自己心爱的毛茸茸伙伴)。
传统方式通常通过考虑显而易见的——有时甚至是幼稚的——差异来区分行为,而机器学习方式则直接切入核心,识别出那些最能描述我们客户群体多样性的同质群体,确保每个人都被包含并参与其中。
场景 #3:寻找最佳广告策略
你在一家中型公司负责数字营销工作,公司的主营业务是在线照片打印服务。你的职责是定义并执行数字广告活动,最终目标是最大化广告的回报。与你只使用同一内容进行单一广告活动不同,你希望通过测试不同的数字资产并观察哪些最有效来优化你的策略。例如,你可以制作展示不同产品的横幅(比如照片书和印有肖像的有趣杯子)、不同颜色和字体,或者广告语文本的不同版本。你可以在社交媒体和搜索引擎上发布广告,并且能够控制每次测试的预算和持续时间。
在这种情况下,我们可以识别出两种可能的方式来实现这一目标:
-
传统方式是进行所谓的 A/B/n 测试:你定义几种不同的执行方案(例如,三则相似的广告,使用相同的图形,但有三种不同的号召性用语,如立即购买、查看此处,或点击了解更多),然后分别执行每一个——假设我们执行每种广告 10,000 次,并通过计算每种执行带来的订单数量来评估它们的个别回报。你还需要重复进行测试,检查其是否依然有效。如果你希望优化其他维度(例如广告展示的时间,用户所在的地理位置等等),你将最终需要测试更多的组合(并且实验的成本也会增加)。
-
机器学习的方式是让算法动态决定测试和方式,逐步朝着通向最佳变量组合路径前进。一开始,算法会像 A/B/n 测试一样开始,尝试一些随机组合:这足以掌握一些最有前途的方向上的初步知识。随着时间的推移,算法将越来越多地将注意力(和预算)集中在表现最佳的少数路径上,并用越来越多的因素进行调优和丰富。最终,算法可能会做出一些非常具体的选择,比如使用粉色字体并为通过笔记本连接的 50 多岁人群展示一张照片杯。
在两种方法中,我们都使用了测试来了解最佳广告策略是什么。然而,在传统的 A/B/n 测试方法中,我们不得不基于先前的知识和常识来定义测试设置。在机器学习方式中,我们让机器坐在驾驶座上,并让它与环境互动,逐步学习,并动态调整测试策略,以最小化成本并获得更高的回报。
学习机器的业务价值
这三种情景揭示了传统方式和机器学习方式在运营业务流程中的一些重要差异。让我们来看看我们从机器学习中获得的逐步好处:
-
两种方法都依赖于技术和数据,但机器学习方式更广泛地利用它们。假设你允许算法探索大型数据库的全部信息内容。在这种情况下,您利用了数字技术的强大能力,并避免了人类认知能力的瓶颈。使用机器学习,将一次考虑更多的数据(想想要分割的客户的许多属性或区分数字广告的因素),这可能会导致更好的业务结果。换句话说,机器学习方式往往比传统方法更准确和有效,从而为依赖它的公司带来经济优势。
-
一旦正确设置,机器学习方式可以独立操作,并在其人类伴侣的最少监督下运行。这意味着驱动智力任务的自动化,从而为业务带来逐步的效率和生产力增长。由于这种自动化,机器学习算法可以始终保持运行,并在 24/7 的时间表上不断学习。这意味着随着更多数据的涌入,它们将越来越擅长于所做的工作,而不一定需要投资于进一步的升级或人类改进。想想市场上出现的新车型或数字广告服务的客户的不断变化的偏好:算法将警惕地观察现实,发现趋势突破者,并相应地做出反应以维持业务的运转。
-
传统方法依赖于先前的人类知识,而机器学习方法则生成额外的知识。这是机器学习一个具有颠覆性和吸引力的优势,叫做知识发现:学习算法能够提供对现实的更好甚至富有洞察力的理解(想一想解释汽车价格形成的微妙规则,或者将消费者归为同质群体的意外关联),这些是通过单纯查看数据无法察觉的。它是通过在事物运作方式中找到意外模式,从而破解现实的能力。如果学习算法能够将其结果呈现为人类可理解的形式(而很多算法确实如此),那么这些知识将成为组织在客户理解、市场动态、运营模式等方面的整体智慧积累:如果用得当,这些知识的价值堪比黄金!
通过提高流程的效率和效果,同时系统地获取对业务的额外理解,这些好处本身足以解释为什么机器学习目前在现代商业中爆炸式增长,并成为一种任何人都不愿冒失去风险的竞争优势。现在,让我们了解那些能够实现这一切的算法类型。
三种学习算法
我们在前一部分看到的场景并不是随意选择的。它们符合机器学习(ML)算法的标准分类,主要包括三种基本类型:监督学习、无监督学习和强化学习。当我们想要应用机器学习方法时,我们需要选择这三条路线中的其中一条:我们的选择将取决于我们需要解决的问题的性质。现在,让我们逐一了解每个类别,以理解它们的组成以及它们所能完成的任务。
监督学习
在监督学习中,你的目标是通过从一些“已知”信息中学习,来预测某些“未知”的内容。理解监督学习方法的最简单方式是思考它与传统编程的不同。在图 4.2中,你会看到左边的设置非常熟悉。在传统计算机编程中,我们需要一些输入数据、一个程序和一个计算机来生成一些结果。程序是一系列指令——以机器可理解的语言描述,称为编程语言——计算机会根据这些指令对输入数据进行处理,最终返回所需的结果作为输出。在监督学习中,我们保持这四个元素(数据、程序、计算机和结果),但改变其中两个的顺序。如你所见,在图 4.2的右侧,在监督学习中,你将数据和结果作为输入提供给计算机,计算机则会返回一个程序作为输出,这个程序将“连接”数据和结果。

图 4.2:传统编程与监督学习方法的对比。要素相同,但顺序不同。
使计算机能够实现这种“魔法”的是监督学习算法:这是一系列步骤,可以找到一组变换(数学上称为统计模型),你可以将其应用于某些输入数据,从而获得接近所需结果的输出。得益于这些算法,计算机可以通过“学习”过去的数据(我们已知结果)来揭示连接输入数据与未知结果之间的大致机制。
如果将其应用于《机器学习方法》章节中介绍的场景 #1:汽车价格预测,情况会变得更加清晰。在这种情况下,我们的输入数据是已售汽车的已知特征。我们想要得到的结果是这些汽车的价格。如果我们采用监督学习方法,我们可以利用已知的过去数据(已售汽车的特征)和过去的结果(先前的销售价格),推断出这样的转化步骤(程序或模型),一旦应用于未来数据(即将售出的汽车特征),就能返回未来结果(预测价格)。在这种设置中(见图 4.3),机器学习算法被实现于学习器模块中。预测器模块则只是“执行”来自学习器模块提供的程序,处理新的数据点。

图 4.3:监督学习的实际应用:通过学习已售汽车的数据,理解汽车特征如何决定其价格的潜规则
得益于监督学习算法,它使学习者得以发现价格形成的“隐性规则”。法拉利的起始价会高得多,且随着时间的推移价格下降的趋势与菲亚特 500 完全不同:算法将发现这些规则。
需要注意的是,在监督学习中,你总是有一个特定的待预测度量:这被称为目标(或因变量)。在前面的例子中,汽车价格是我们学习的目标变量。所有其他用于预测目标值的变量被称为特征(或自变量)。图 4.3 中的模型和汽车的年龄是用于学习的两个特征。
当输入数据被“结果”(也称为标签)丰富时,称之为有标签数据。为了简单起见,可以这样理解:一个有标签的数据表通常会有多个包含特征的列,以及一个特定的包含目标的列。有标签数据是监督学习中不可或缺的成分。
根据目标变量的性质,可以识别出两种学习场景,这些场景需要在监督学习家族中使用不同的学习算法:
-
当目标变量是一个数值型指标(如5.21 或 $23,000)时,就需要使用回归算法。线性回归是最简单且最常见的能够预测数字的算法。
-
当目标变量是分类度量(如指示元素属于哪个类别或类的文本字符串)时,你需要一个分类算法。类别的例子有红色、蓝色和绿色,或者二分类类别如真和假,或者标识特定行为的标签,如会购买此产品和不会购买此产品。决策树、随机森林和支持向量机只是你想预测表中元素属于哪些类时可以使用的许多算法之一。你将在下一章学习如何使用其中的一些。
一些有监督的算法可以同时用于回归和分类。神经网络就是一个例子,它可以预测数字或类别。
逻辑回归算法(线性回归的一个变种)可以预测属于二元类别的可能性。因此,尽管它的名字容易让人混淆,逻辑回归实际上是一个分类算法。
在继续下一个类型的学习算法之前,值得思考一下为什么这个学习方法被称为有监督学习。我们可以做一个类比,想象有一个老师通过提供多个示例来讲解某个概念,老师希望学生通过注意到其中的联系来理解这个概念。在分享各种概念的例子(即标记数据)时,老师在监督学生的学习。如果没有那些已知结果(目标变量)的示例,老师将无法指导学生。这就是有监督学习的原因,你总是有一个目标变量,并且总是需要从一些标记数据开始。
让我们继续看下一个类型的机器学习算法,在这里,你不需要任何标记数据就可以开始学习。
无监督学习
在这种情况下,你的目标不是做出预测,而是揭示数据中隐藏的某些结构。无监督机器学习算法能够探索你的数据表,找出行和列之间关联的有趣模式。
无监督学习在许多使用场景中可以发挥巨大价值:
- 最简单的情况是聚类。这涉及到将数据点聚集在一起,形成同质的组,称为簇。每个组将包含“相似”的数据点。这正是我们在场景 #2中需要做的,在那个场景中,我们需要将类似的超市顾客分成不同的组,并向每个顾客发送有意义且个性化的新闻简报。像 K-means 和层次聚类这样的算法是无监督机器学习算法的好例子,专门用于识别簇。
在文本挖掘领域,聚类的一个有趣扩展是主题建模,即在文本文件中识别主题(概念相关词语的组)。一种最流行的主题建模算法是潜在狄利克雷分配(LDA)。
-
寻找关联规则是无监督学习覆盖的另一个常见需求。假设你有一个庞大的数据库,包含了超市中所有收据的描述。有些产品可能经常出现在同一张收据上:比如牛奶和咖啡,或者意大利面和番茄酱。像 Apriori 和 FP-Growth 这样的算法会寻找一些有意义且统计显著的规则,比如购买意大利面的顾客很可能也会购买番茄酱。这些规则可以为优化商店商品组合或定义哪些产品应当放在相邻的货架上(市场篮分析)提供有价值的信息。
-
无监督学习的另一个典型应用叫做降维。如果你有一个包含多个列的表格,其中某些列可能相互相关:因此,你的表格可能会出现冗余,因为某一列所包含的信息可能在其他列中已经出现。为了避免冗余带来的种种不利影响(如性能下降和准确性损失),值得在不丢失表格整体信息的前提下,减少表格中的列数。专门用于降维的算法,如主成分分析(PCA),可以探索表格的结构,并生成其“更精简”的版本(即列数更少,维度更低),但依然保留相似的信息内容。
现在让我们将这种无监督学习方法与我们之前讨论的有监督学习方法进行比较。关键的区别在于,无监督学习中,我们并不关心特征与目标之间的关系:实际上,最开始我们就没有目标列!事实上,无监督算法的输入数据是无标签的:不需要目标变量,也不需要标签。根据前面的类比,学生在这里不需要老师基于以前的例子进行任何“监督”。学习通过探索原始数据进行,寻找数据本身固有的模式(例如项目的聚类或元素之间的关联)。
在有监督学习中,我们可以轻松判断一个预测是否稳健(通过将其与“真实”值进行比较),而在无监督学习中,评估算法效果的难度要大得多。换句话说,无监督学习中没有明确的正确或错误答案,只有更多或更少有价值的结构被揭示。我们需要通过观察其是否契合我们最初的目标来衡量其有效性。稍后我们将更深入地探讨这一复杂性。
现在让我们继续讨论第三类也是最后一类的机器学习算法。
强化学习
在采用强化学习方法时,你通过反复与环境进行“试错”方式的互动来学习。与早期的学习方法的根本区别在于,在这种情况下,算法充当一个自主的智能体:根据当前的状态,它会决定采取什么行动,并在真实世界或模拟的环境中执行,然后——根据其行动的结果——更新策略,以最大化总体的奖励。正如你在图 4.4中所看到的,这些步骤通过一个不断改进策略的循环,遵循一个简单的常识性逻辑:如果我的行动所带来的状态带来了正向奖励,那么导致该行动的行为会得到正向强化(因此得名)。如果相反,这个行动带来了负向奖励,那么该行为应该受到惩罚,以防它再次发生。

图 4.4:强化学习:一个自主智能体自由地与环境互动,并随着学习的进行不断改进。
我们可以识别出两种使用强化学习的场景:
-
你可以让智能体直接与外部环境互动,就像场景 #3中的例子,照片打印公司数字广告策略。通过一系列的迭代(测试不同类型的广告)并沿着一个逐渐增加奖励的路径(更高的媒体投资回报率)前进,最终我们将拥有一个坚实的策略,可以在我们的广告活动中采用。互动也可以发生在物理的、现实的环境中:例如,一个机器人手臂可以通过其相机传感器捕获的状态学习如何最好地移动一些包裹,并不断改进其引擎对这一目标的响应。像 Q-learning 这样的强化学习算法非常适合最大化这类系统的总奖励。
-
另一种方法是为一个或多个代理提供模拟环境,使它们能够虚拟地互动,并逐步从发生的事情中学习。这就是像蒙特卡罗树搜索(MCTS)及其最著名的实现——谷歌 AlphaZero——的算法的应用案例,它们证明能够从零开始学习,并通过“自我对弈”成为几乎任何游戏中的冠军。该算法开始时唯一需要的外部输入是游戏的正式规则列表:然后,它会像一个真正的自我学习者一样,只与自己对弈,并在需要时交换棋盘一方。以国际象棋为例:起初,代理将进行一些非常傻的游戏,这些游戏的动作是随机的(但形式上是正确的)。然后,逐渐地,它会学习到,通过做一些聪明的开局和防守棋盘上的一些关键位置,获胜的机会会增加。经过几个小时的学习(以及数百万局对弈),代理将微调其最有利的棋步策略,并成为任何人类国际象棋大师都无法战胜的存在。
强化学习的一个巨大优势是它不需要任何标签数据即可开始:代理会自主决定采取哪条实验路线并进行实验,在每个步骤中积累新的数据点。尽管强化学习具有很大的潜力,但由于实施中的实际挑战,例如建立与现实世界的有效“接口”或满足所有安全约束——比如确保代理在学习过程中不会造成任何“损害”——它仍然没有在商业应用中广泛使用。因此,在本书的其余部分,我们将重点介绍监督学习和无监督学习算法:它们可以帮助你在工作中快速创造价值,然后再转向更复杂的任务。
选择正确的学习算法
在过去的几页中,我们听到了几个不同算法的名称:这让我们对可用于“走机器学习之路”来解决问题的机器学习算法的广泛(并不断增长的)选择有了初步的了解。图 4.5展示了按学习类型(监督学习、无监督学习和强化学习)以及目标组织的机器学习算法目录。对于每种场景,我们都有多个可供选择的替代算法:图 4.5的右侧列出了最常用的算法:

图 4.5:机器学习算法目录:根据你的需求,你可以选择不同的路线
作为机器学习的用户,你需要决定在众多备选算法中,哪些最适合你想完成的任务。每个算法都有其自身的逻辑,具备特定的优缺点:在选择它们时,你需要在它们的特性之间做出良好的权衡。例如,一个优秀的算法可能非常准确,但运行起来极其缓慢且昂贵,而另一个则正好相反:哪个最适合你呢?让我们开始熟悉定义各种算法的最基本属性:
-
性能。可能是最需要考虑的一个,它告诉我们“算法完成任务的表现如何”和我们期望它在未来“多么强健”。例如,在监督学习的情况下,我们会衡量我们的预测有多准确,或者换句话说,它们与现实“有多接近”。这是一个复杂的问题:稍后我们将深入探讨可以用来评估算法准确性和健壮性的多种衡量标准。
-
速度。根据执行完整过程所需的“迭代”次数,算法可能是慢且占用资源的,或者是快速且轻便的。
-
可解释性。一些算法提供人类容易理解的输出:当你想从数据中发现新知识并将其传递给他人,或者当你想给出一个充分的解释说明为何算法做出某个建议时,这是严格要求的。在其他情况下,我们不需要理解算法如何运作,且可以接受复杂(但准确)的黑箱输出,这些输出人类认知难以穿透。
-
所需数据量。一些算法只有在有大量历史数据点作为起点时才能表现良好。其他算法即使只有几十行数据也能保持健壮,并且不需要大数据就能工作。
-
所需先验知识。在某些情况下,算法要求你对预期的数据或所处的环境做出假设。其他方法则对其应用领域更为宽容,不要求任何先验知识。
这五个要点只是选择合适算法时可以考虑的众多属性中的一部分。好消息是,这些算法已经方便地在数据分析软件平台中实现,例如,作为 KNIME 节点或 Python 中的库。它们的现成可用让你可以“尝试一些”,然后做出相应的决策。
在某些情况下,你可以将不同的算法组合在一起,形成一个单一的学习过程。通过这种方式,你将同时利用两者的优势,集体平滑它们各自行为的边界:这被称为堆叠。
有一点是明确的:并没有一种“通用”的机器学习方法,你需要熟悉一系列替代的程序。这些算法就像是你背包中的工具,你可以根据需要使用它们。通过了解多种算法,你可以自由地在它们各自的特性之间做出合适的权衡,并尽力解决你在工作中遇到的大部分业务案例。
由于性能衡量是非常重要的,接下来我们将深入探讨如何评估机器学习算法的性能。
评估性能
衡量一个算法是否有效并不总是容易的任务。以无监督学习为例:我们期望一个优秀的无监督算法能够从数据中揭示最有趣和最有用的结构。然而,评估这些结构为何有趣或有用,将取决于你的具体目标,并且通常需要一些人工判断。在强化学习中,一个优秀的算法能够带回相当大的总奖励,解锁持续与环境互动并最大化回报的机会。在这种情况下,奖励的概念将依赖于具体的价值定义,这个定义由我们所解决的案例决定。
如果我们留在监督学习的领域,性能评估就更加直接了:因为我们的目标是预测某些内容(数字或类别),我们可以通过衡量预测样本和已知样本之间的差异来评估性能。这个预测与实际值之间的比较结果可以浓缩成总结性的评分。让我们了解回归和分类的这些评分。
回归
由于回归问题本质上是预测数值,评估其性能意味着衡量预测结果与我们试图预测的实际值之间的总体距离:距离越小,误差越小,误差越小,效果越好。在图 4.6所示的简单线性回归中,我们仅基于汽车的年龄(我们唯一的自变量)来预测二手车的价格(目标变量)。虚线显示了我们模型的结果,它给出了根据年龄预测价格的值:显然,随着年龄的增加,价格会下降。因此,我们的线随着向右移动而下降。圆圈表示汽车的实际价格,所以我们在预测中所犯的误差就是每个圆圈与虚线之间的距离:这个与实际情况的“差距”叫做残差。通过正确地聚合残差,我们可以获得任何回归模型的单一性能指标。

图 4.6:评估回归性能:我们在预测中犯了多少错误?
一种方法是将它们取平均值。然而,我们应当考虑到残差可能是正数或负数,这取决于预测值是否高于或低于实际值(见 图 4.6 中的两种情况)。为了避免负残差抵消(进而“掩盖”)正残差,我们可以计算它们的平方,取平均值,然后再对其开平方,从而将该度量转换为与预测量(如车辆价格)相同的单位。这就是我们得到回归分析中最常用的评分度量之一:它被称为 均方根误差,或 RMSE。其公式是:

其中 a[i] 是第 i^(个) 实际值,p[i] 是其对应的预测值,N 就是——简单来说——数据集中总的数据点数量。RMSE 给我们一个直接的指示,告诉我们可以和预测值一起使用的置信区间。根据它的公式,RMSE 也是残差的标准差:因此,我们可以将其解释为在 68% 的预测中可能出现的最大误差。为了更安全起见,我们可以将 RMSE 乘以 2,得到更广泛的区间和更高的置信水平:我们可以假设我们的误差将在 95% 的情况下小于两倍的 RMSE。假设我们通过回归模型预测一辆车的价格为 $16,000,RMSE 为 $1,200:我们可以说我们有 95% 的信心,这辆车的实际价格会在 $13,600 和 $18,400 之间,即 $16,000 ± $2,400(两倍的 RMSE)。当然,RMSE 越低,模型越好,因为我们可以为预测提供更窄的置信区间。
使用 RMSE 来建立置信区间并不总是数学上正确的。实际上,这只在残差服从正态分布(典型的高斯钟形曲线)这一假设下成立,而这种情况并非总是存在。然而,它是一个方便的经验法则,我建议在评估回归模型时记住它。
评估回归模型性能的另一种总结性指标是 决定系数,R²。它可以使用以下公式计算:

在我们上面遇到的度量基础上,我们还会看到
,它是实际值的平均值。看看公式中的分数:我们正在比较模型的平方误差(即我们在 RMSE 中找到的数量)与 baseline 模型的平方误差,后者会天真地将观察值的平均数作为常量预测。如果我们的模型与这个基准模型相似,那么 R² 将接近于零,表示我们的模型几乎没有用。如果相反,我们的模型产生的误差比基准模型小得多,那么我们会得到接近 1 的 R²。在这种情况下,R² 越高越好。
解释决定系数的一种直观方法是将其视为目标变量中观察到的变化量的比例,而这个比例实际上是由模型解释的。如果在我们的汽车价格预测中,得到R²=0.75;我们可以说我们的模型仅仅基于汽车的年龄,解释了汽车价格波动的 75%,剩余的 25%没有被解释。如果我们建立一个更准确的模型,或者增加一些额外的特征,比如里程和配件,可能就能解释更大比例的价格波动,且我们的R²值会更接近 1。
没有特定的R²参考阈值能够始终告诉我们一个模型是“好”还是“坏”。试想一个看似混乱的信号,比如货币汇率的波动。如果我们建立了一个回归模型,仅解释了未来汇率变动的 25%,我们也能从中赚很多钱!最好不要固定R²的静态阈值。
与 RMSE 不同,R²是一个无量纲的指标。这意味着即使预测值位于不同的尺度上,我们也可以比较回归模型的优劣。例如,我们可以通过比较R²值来对比一个预测房价(范围在十几万美元)的模型和另一个预测摩托车价格(通常便宜得多)的模型:R²越高,模型越好。
分类
分类算法的任务是将数据集中的每一项分配到一个类别,预测目标变量的具体值。在所有可能的类别中,只有一个是正确的,并且与现实相符。因此,衡量分类器性能的简单方法就是“计算”算法在所有预测中正确的次数。然而,这个简单的性能评分可能并不能告诉我们全部情况。让我们通过一个例子来更好地理解这个概念。
你想评估一个图像分类模型的性能:尽管这个任务看起来可能随机(并且——公平地说——确实如此),但你的二分类器的工作是为图像内容分配一个标签,将狗和松饼区分开来。当涉及到吉娃娃和蓝莓松饼时,你的分类器有点挣扎,预测的内容如图 4.7所示:

图 4.7:这是吉娃娃还是蓝莓松饼?这个分类器在 16 次预测中正确预测了 10 次。
你在图 4.7的左下方看到的表格叫做混淆矩阵:它的优点在于可以全面展示分类结果,突出显示分类器“困惑”的情况,即将错误标签分配给图片的次数。混淆矩阵统计了任何预测类别值(列)与实际类别(行)之间的所有组合。主对角线上的单元格会告诉我们分类器准确分类的次数,而其他所有单元格则计数错误。在这种情况下,看起来我们的模型表现有些“失衡”,因为它在识别狗时较为困难,而在识别松饼时稍微表现得更稳定。就奇瓦瓦犬和蓝莓松饼的情况来说,我们不太担心这种不对称;然而在其他情况下,这可能是一个大问题,导致截然不同的结果。
让我们转到一个更严重的情况:一个分类器通过分析血液检测的各项特征,预测病人是否感染了传染性病毒。在这种情况下,也有两个类别:正类和负类,我们可以犯两种不同的分类错误。一个是将一个实际上健康的病人分类为正类,这被称为假阳性。这种错误的后果是我们将结果告诉病人,病人会立即开始隔离,并进行一些更精确的测试以确认我们的发现。我们可能犯的另一个错误是将一个实际上感染了病毒的病人分类为负类,这被称为假阴性。当然,这种错误的后果比前一种更加严重:我们会让病人回家,导致病毒传播给其他人,并未开始对病人进行任何早期治疗。总结一下:在分类问题中,并非所有错误都是相同的。因此,单一的数字可能不足以全面解释整个情况。这就是为什么计算混淆矩阵并从多个指标中选择最合适的指标来满足需求是明智的。根据你解决的问题,你应该选择图 4.8右侧显示的总结性指标中的一个作为评估性能时最重要的指标。接下来我们将逐一介绍这些指标:
-
准确率是告诉你正确预测的比例与总预测数之间的关系。当错误类型不重要时,你可以使用这种“平衡”指标来解释分类器的整体表现。
-
精确度将告诉你当分类器将某个案例标记为正类时,它的信心有多大。你可以在需要避免所有情况下,正类被预测为正时,结果却是负类的情况。若一个非常精确的分类器告诉你某个案例是正类,那么它很可能是对的。
-
灵敏度告诉你分类器有多自信地排除一个正例没有被正确分类的可能性。当你想避免假阴性时,需要使用这个度量。如果一个非常灵敏的分类器告诉你某个案例是负例,那它很可能是正确的。医学中的诊断分类器通常被构建为在任何情况下都最大化灵敏度,因为你希望确保只有真正是负例的病人才会被无治愈送回家。
类别名称正类和负类仅仅是约定俗成的。根据你的情况,你可以决定哪个类是正类,并相应地计算所有评分指标。在有多个类别的情况下,它的计算方法是:选择一个正类,然后根据将其他类别视为负类来计算指标。这仅仅是一个约定。

图 4.8:评估分类性能:选择最符合你情况的度量标准
通过这些方法,我们已经看到了评估监督学习预测器性能的最常用方法。在构建我们的第一个机器学习模型之前,我们需要了解一个最后的基本概念,并学习如何管理它:过拟合。
欠拟合与过拟合
美国数学家约翰·纳什因其在博弈论领域的开创性工作,获得了 1994 年诺贝尔经济学奖。他的“纳什均衡”已成为经济学家预测非合作战略互动结果的基础。约翰·纳什的故事通过奥斯卡获奖电影美丽心灵而广为人知,拉塞尔·克劳饰演纳什。在电影中,约翰·纳什被描绘为与偏执型精神分裂症斗争一生:他的病情让他相信自己在普通杂志文章的文字中找到了“隐藏的秘密信息”,这些信息据说是由苏联间谍为了进行秘密通讯而添加的。看到无关事物之间有意义的联系是早期妄想思维的典型表现,精神科医生称之为错觉联想。现在,想一想:当你有(大量)数据和(强大的)计算能力时,很容易陷入认为自己找到了某些普遍有效的有趣模式的陷阱。实际上,你可能只是发现了一个虚假的、随机的联系,这只是由于资源的广泛可用性而产生的结果。
通过一个例子,这一点会更加清晰:假设我们有一个大型数据库,包含全国年度彩票的所有票务信息。我们有过去两年的历史数据,并希望通过识别重复出现的特征,利用过去两位中奖者的信息来预测未来的中奖者。我们决定使用监督式机器学习算法来完成这个任务。经过一些复杂的计算,算法得出了一系列复杂的“中奖”规则,这些规则只被过去两届的幸运中奖者共享。
这些规则类似于:他们电话号码的第 4 位数字是 7,他们的票号包含恰好 3 个奇数数字,他们出生在星期二,以及许多其他规则。显然,这些规则无法预测任何有意义的内容:它们只是通过一系列毫无意义的因素,偶然地将两个特定点“连接”在一起,这些因素恰好是赢家之间的共同点。正如例子所示,当干草堆足够大时,很容易找到与针非常相似的东西!同样,当你拥有大量数据时,如果足够仔细地观察,你可以找到任何关联,尽管这并不意味着它有任何实际意义。这与我们在约翰·纳什的故事中遇到的“假象”情况类似。我们需要不惜一切代价避免陷入这种“分析谬误”的陷阱:这只是由于我们希望不惜一切代价找到关联的欲望,哪怕这些关联实际上并不存在,而使用了人为过于复杂的模型所造成的欺骗。这种情况叫做过拟合,它是尝试任何预测时可能出现的一个问题。因此,在构建生成预测的监督式机器学习模型时,我们需要系统地避免它。
让我们通过汽车价格的例子来看过拟合的实际表现。图 4.9展示了不同次数的多项式回归,参数N表示不同的多项式次数。

图 4.9:使用不同多项式次数 N 预测汽车价格的回归模型。你会选择哪个?
随着N从 1 增加到 5,拟合曲线变得更加复杂:这表明底层模型变得更加复杂。通过观察这三条曲线,我们可以注意到以下几点:
-
当N = 1(虚线)时,我们的模型与之前遇到的简单线性回归模型完全相同。虽然这是一个很好的起点,但它看起来有点过于“简单”,因为它没有考虑到汽车价格在头几个月内的强烈贬值。
-
当N = 3(虚线)时,我们得到了一条更有鼓舞性的拟合曲线,因为我们清晰地看到汽车早期的价格贬值更为明显,之后曲线逐渐趋于平稳。这看起来很稳固,因为它符合我们的商业理解。
-
当N = 5(实线)时,我们几乎完全拟合了现有的数据点。然而,这听起来“好得令人难以置信”,实际上,曲线的形状是人为地构建的,以便符合这些数据点,而没有对价格随年龄变化的演变提供坚实的建模。比如在大约 1.5 岁时,价格竟然不合常理地高于新车的价格。这看起来像是我们只是“强行”让曲线触碰到这几个“过去”的数据点,而这只是一个目光短浅的目标。相反,我们真正的目的是找到一个稳健的模型,能够预测“下一个”即将上市的汽车价格。
从这个示例中,我们可以开始看到,监督模型的复杂度需要一些微调:如果模型过于简单,它的预测表现必然会很差。另一方面,如果模型过于复杂,我们可能只是“连接了之前的点”:我们最终陷入了将巧合拼凑成一个看似普遍规律的幻觉状态。
我们可以在这个概念的基础上增加一个额外的监督学习示例:这次,我们处理的是分类问题。正如在图 4.10中所见,你有一些位于板子上的元素,它们可能是点或者叉。你希望根据它们的位置来预测它们的类别(是点还是叉),方法是通过绘制一条连续的线,区分不同的元素,使得点位于板子的右上角,叉位于左下角。通过应用非线性支持向量机(SVM)学习算法,你将获得三条复杂度逐渐增加的曲线。

图 4.10:我们希望绘制一条能够区分点(右上角)和叉(左下角)的线。被误分类的元素显示为较深的灰色。哪条线更有可能在处理未来的元素时表现更好?
让我们看看这三种情况:
-
左边的模型是一条直线,看起来像是一种非常初步的方式来区分点和叉。我们似乎在图表的中间区域始终遗漏了一些点,而这些点恰好位于它们应该出现的区域之外。总体来说,我们的准确率接近 75%,因为我们犯了 12 个误分类。
-
中间的模型比之前的模型稍微复杂一些,但也更加准确(这次只有六个错误)。我们现在在这条线上所呈现的曲率很好地解释了之前一直漏掉的点。直觉上,我们犯的六个误分类(它们在图中显示为较深的灰色)看起来更像是“例外”:这条曲线似乎接近一个普遍规则,可能会在未来新的元素出现在板子上时重复。
-
右边的模型显然是最好的:它正确分类了板子上的所有元素,达到了 100%的准确率。然而,这个复杂模型不太可能具有普遍有效性:曲线在当前元素之间呈锯齿状,以避免任何误分类,但我们可以预期,如果新的元素出现,它们可能会由于这些人工弯曲而被误分类。
这些示例展示了监督学习的一个重要特性:如果我们希望构建能够在预测“未来”案例中表现良好的模型,我们需要在学习时找到复杂度的正确平衡。我们可以识别出三种情况,如表 4.1中所总结的。让我们从极端情况开始,逐一讨论:
-
欠拟合模型。就像在N = 1的多项式回归和分类的第一层面一样,欠拟合模型根本不足以做出任何预测。这个简单的模型即使要求它拟合已知数据点,也会产生较大的误差(更高的残差或许多错误分类)。因此,作为一个逻辑结果,我们不能指望同一个模型在未来的案例中神奇地开始表现良好:这使得欠拟合模型在做出任何预测时显得非常无用。
-
过拟合模型。这些模型位于欠拟合模型的极端,和前者一样糟糕。模型的数学复杂性使其能够很好地适应已知的数据点,引入了一些不现实的元素,比如回归中的许多波动(当N = 5时)或分类中的锯齿状路径。我们“相信”自己已经达到了高准确率,但这仅仅是自我催生的幻觉:每当新的数据点到来时,我们的准确率将因这些人为的复杂性而急剧下降。
-
良好拟合模型。就像生活中的许多事情一样:美德在于中庸。良好拟合的模型在拟合数据点时准确性不如过拟合模型。然而,考虑到它们在捕捉现象复杂性方面的局限性,它们会倾向于集中于最重要的(较少的)连接,忽略过拟合模型所使用的过于复杂的路径。良好拟合的模型最适合预测“未知”,这正是我们构建监督模型的目的所在。
| 欠拟合 | 良好拟合 | 过拟合 | |
|---|---|---|---|
| 模型复杂性 | 低 | 中 | 高 |
| 过去案例的表现 | 低 | 中 | 高 |
| 未来案例的表现 | 低 | 中 | 低 |
| 描述 | 模型过于简单,产生的预测不准确。它无法很好地描述所建模的现象。 | 模型平衡得当。它掌握了具有普遍有效性的模式,这些模式很可能在未来的案例中重复。 | 模型复杂,仅在用于学习的非常具体的点上表现良好。它无法预测未来案例的结果。 |
表 4.1:欠拟合、良好拟合和过拟合模型的典型特征。
好消息是,机器学习模型可以通过改变一组值来“调节”其复杂性,这些值被称为超参数,它们调节模型的学习行为。例如,在多项式回归中,N不过是模型的一个超参数:通过让N从 1 变化到 5(或更多),我们可以控制模型的复杂性,并通过多次尝试找到适合的拟合程度。我们将在本书稍后的部分讨论具体学习算法时,进一步学习超参数。
降低模型复杂性的另一种方法是减少特征数量。特征越少,模型越简单,过拟合的可能性越低。这也是进行降维的另一个动机,这是我们之前介绍的无监督学习场景之一。
现在我们清楚了过拟合模型的病态情况:是时候继续讨论如何诊断它以及可能的解决方案是什么了。
验证模型
再次查看表 4.1,特别是它的第三行,我们发现,判断一个模型是否拟合良好的唯一方法是评估其在“未见过”样本上的表现。无论是过拟合模型还是欠拟合模型,在未来样本的准确性上都会逊色于拟合良好的模型。但是,如果我们还没有未来样本来进行评估该怎么办呢?
在监督学习中,我们使用的一个基本“技巧”是将已知样本的数据集随机分割成两个子集:一个训练集,通常覆盖原始数据的 70%到 80%,另一个是测试集,包含剩余的数据。图 4.11展示了这个操作,称为划分。然后,我们仅使用训练集进行实际的学习,这样就会生成模型。最后,我们将评估模型在测试集上的表现:这是算法在学习时未曾见过的数据。这意味着,如果模型通过创建许多波动和弯曲来过度适应训练集,我们将在测试集上得到低性能评分。换句话说,如果模型对训练集过拟合,那么它在测试集上的表现会非常差。通过这个技巧,我们在不进行时间旅行的情况下评估了“未来”样本的准确性!

图 4.11:将完整数据集划分为训练集和测试集。行按所需比例随机抽样并分配到两个子集。
图 4.12显示了通过增加复杂性,训练集和测试集中的预测误差预期量。通过在模型的超参数上进行调整以增加其复杂性,可以逐步降低训练集中样本的误差。例如,在多项式回归的情况下,从左到右,我们增加了N的值:在高复杂度模型下(N = 5,我们位于最右边),训练线的误差几乎为零。如果你查看测试集的误差(U 形曲线),你会发现现实情况,并认识到模型的真实预测能力要低得多:只有拟合良好的模型才能确保在“未见过”数据点上的良好表现。

图 4.12:随着复杂度的增加,监督学习模型产生的误差量:对于测试集,呈 U 形曲线
综合总结
我们终于拥有了构建和验证拟合良好的监督式机器学习模型所需的所有要素。现在让我们看看这道“菜谱”长什么样子。我们可以将其可视化为由四个基本模块组成的一个递归“结构”,这些模块共同定义了我们的监督学习基本流程:
-
数据划分。为了避免过拟合,我们需要利用一种验证机制,防止在学习过程中使用相同的数据进行评分。因此,我们在监督式学习中总是首先做的步骤是对完整的标记数据集进行划分,以获得训练数据集和测试数据集。在大多数情况下,划分通过随机抽样进行。
-
学习者。训练数据集可以用来通过学习算法训练模型。此操作的输出将是统计模型(通过一组参数定义),该模型可以应用于不同的数据,从而获得预测。
-
预测器。现在我们可以“运行”在前一步中学习的模型,应用到测试集上,测试集已被从训练过程中排除。预测器的输出将是一个附加了额外列的测试集:每行的目标预测值。
-
评分器。预测器的输出包含实际目标(我们旨在预测的实际值)及其模型生成的预测值。通过比较这两列的值,我们可以评估预测的表现。计算一个或多个总结性度量得分就足够了,比如我们几页前介绍过的 RMSE、R²、灵敏度或完整的混淆矩阵。
就是这样!通过遵循在图 4.13中描述的逻辑流程,您可以构建一个监督式模型并评估其真实表现,避免过拟合的风险。

图 4.13:验证监督式机器学习模型的典型流程。为了防止过拟合,您需要对数据进行划分,在训练部分进行学习,最后只在测试部分进行预测和评分。
当然,一旦您有了一个经过验证的模型,您可以放心地将其应用于所有“未来”数据点,最终释放机器学习预测的真正价值。让我们以二手车价格预测为例:您使用包含历史销售的完整数据库来构建和验证模型。一旦您有了经过验证的模型,并且确定它不会过拟合,您就准备好进入实际应用:每次需要估计一辆车的价格时,您可以通过车辆的特征执行该模型并获得预测价格。当然,这一次,您将没有“真实值”可以进行比较,但您可以使用预测的置信区间(例如回归的 RMSE)来预估您将得到的误差范围。
值得花些时间思考一下图 4.13所展示的流程:这是你在构建和验证有监督的机器学习模型时可以采用的“基础”过程。许多改进可以逐步应用,以使你的模型越来越好。为了让你对我们可以做出的众多改进有所了解,下面列出一些通过迭代来改善过程的添加方法:
-
划分技巧有一些局限性:例如,如果你从一个相对较小的数据集开始,并且将 30%的数据从学习中保留,你可能会得到不充分的验证,因为模型从中学习的点太少。一个替代方法叫做k 折交叉验证,它将整个数据集分成 k 个部分(通常是 5 个或 10 个),并多次迭代,每次使用其中一个部分作为测试集,其他部分用作训练集。最终,你会得到 k 个不同的模型和得分。通过对它们进行平均,你将获得比单次划分更稳健的验证。
-
正如我们之前看到的,你可以“调优”模型的超参数,以最大化在测试集上获得的性能得分(这将反过来确保未来预测的最大准确性,并证明模型的普遍有效性)。你可以循环不同的超参数,将它们作为变量进行管理,并找到使你处于我们在图 4.12中看到的 U 形曲线底部的那组值。这一过程叫做超参数优化,可以通过使用循环和变量来实现。
-
如前所述,如果数据集中有不具信息量或冗余的特征,你的模型会变得不必要地复杂。有许多技术可以用于识别用于学习的最佳特征子集,它们统称为特征选择。一种简单的选择特征的迭代技术叫做后向消除法:你从选择所有特征开始。然后,在每次迭代时,你移除一个特征——就是那个如果从集合中移除后,性能下降最小(或增加最大)的特征。经过若干次迭代,你将“尝试”多个特征组合,并可以选择一个最大化整体预测性能的组合。
这些只是你可以使用并创造性结合的一些技术,以提高建模的质量。希望这能给你一些关于你即将进入的世界的启示:机器学习的实践是一种艺术与科学的结合,你总能找到更巧妙的方法,从数据和算法中挤出增量价值。
总结
在这一章中,我们介绍了能够从数据中学习的机器背后的基本概念。在剥去人工智能的未来感光环后,我们通过了一系列实际的商业场景,看到智能算法的实际应用。这些例子向我们展示了,如果我们细心观察,往往能够发现借助机器完成智力工作的机会。我们看到,与传统的操作模式不同,机器学习(ML)提供了一种新的方式来完成任务:无论是预测价格、细分消费者,还是优化数字广告策略,学习算法都可以成为我们不知疲倦的伙伴。如果我们好好训练它们,它们可以扩展人类智能,并为我们的业务提供坚实的竞争优势。我们探讨了三种学习算法(监督学习、无监督学习和强化学习)之间的差异,并理解了选择算法时需要考虑的基本驱动因素。接着,我们学习了构建稳健的预测模型并正确评估其性能所需要的步骤,同时避免过拟合的困扰。这是一次在迷人的统计学习世界中的长途旅行,但正如我们所承诺的那样,我们并不需要通过大量的公式或复杂的数学推导。这一章帮助你掌握了机器学习的关键概念的直觉,使你能够快速进入实践并在实践中不断学习。
现在是时候回到 KNIME,基于现实世界的数据构建(并验证)一些机器学习模型了:准备好迎接下一章的内容吧。
第五章:在工作中应用机器学习
你已经听说过如何通过智能算法创造商业价值:现在是时候大显身手了。在本章中,我们将通过几个逐步教程,亲身体验将机器学习应用于具体案例的过程。我们的伙伴 KNIME 回到了舞台上:我们将学习如何构建工作流来使用实际数据实施机器学习模型。我们将接触几个特定的算法,了解它们背后直观的工作原理。我们将窥视它们的数学模型,重点理解基本原理,以便理解它们的结果并在工作中加以利用。
本实用章节将回答几个问题,包括:
-
我如何使用 KNIME 中的监督式机器学习算法进行预测?
-
我如何检查模型是否表现良好?
-
我们如何避免过拟合的风险?
-
我可以使用什么技巧来提高模型的性能?
-
我如何使用聚类算法将相似的元素分组?
本章中的教程涵盖了你可以在工作中依赖机器学习的三种最常见情况:预测数字、分类实体和分组元素。你可以把它们看作是“模板”,在你翻到本章最后一页后,可以广泛地重新应用,并且你很可能会继续将其作为参考。教程的步骤也按它们在日常实践中展开的顺序进行组织,包括为了提高模型性能所需的“反复迭代”。这将帮助你准备面对实际的机器学习应用,现实中机器学习往往需要经历一条曲折的试错路线。
在每个教程中,你将遇到一两个机器学习算法(具体来说,第一个是线性回归,第二个是决策树和随机森林,第三个是K-means),这些算法将在实际应用之前进行介绍和解释。让我们从一些初步的预测开始吧!
通过回归预测数字
在本教程中,你将假设自己扮演的是一名位于意大利罗马的房地产经纪人的—有点—令人羡慕的角色。你所在的公司拥有多家专注于出租位于永恒之城更广泛都市区的物业的代理机构。你对数据分析的热情引起了首席执行官的注意:她要求你找到一种方法,帮助代理商根据物业的特点客观评估合理的月租。她注意到,当物业的租金与市场不符时,业务将受到严重影响。事实上,如果租金过低,代理费(这是约定租金的固定百分比)最终会低于本应有的水平,导致利润流失。另一方面,如果租金过高,代理机构的收入将需要更长时间才能显现,影响现金流。为新物业设定月租的传统方法是房东与代理商之间的“谈判”,代理商会利用他们对市场的了解(有时还会参考类似物业的基准)来说服房东设定合适的租金。
你确信机器学习有潜力带来改变,并决心找到一种机器学习的方法来改善这一业务流程。你想到的一个方法是使用以前租赁物业的月租数据库(这些物业有完整的描述)来预测未来物业的合理月租,基于其客观特征。这样一种数据驱动的方法,如果传达得当,可以简化定价过程,带来各方的共同利益:房东和代理机构能够迅速达成有利可图的交易,租客则能够获得公正的租金。
能够预测租金价格的机器的前景令人兴奋,让人迫不及待地想开始。你设法获取了最近签署的 4,000 份租赁协议的提取数据(RomeHousing-History.xlsx)。表格包含了每个物业的以下信息:
-
House_ID: 物业的唯一标识符。
-
Neighborhood: 物业所在区域的名称,从
PiazzaNavona周围的豪华区域到宁静的湖畔小镇CastelliRomani。图 5.1展示了罗马地区的地图,标出了这些社区的一部分。 -
Property_type: 一个字符串,说明物业是
flat(公寓)、house(房屋)、villa(别墅)还是penthouse(顶层公寓)。 -
Rooms: 物业中可用房间的数量,包括浴室。
-
Surface: 物业的可用楼面面积,单位为平方米。
-
Elevator: 一个二元类别,表示物业是否有电梯(
1表示有,0表示没有)。 -
Floor_type: 一个类别,显示物业所在的楼层是
Mezzanine(夹层)、Ground(底层)还是Upper(上层)。 -
Floor_number:物业所在的楼层,按照欧洲惯例(
0表示底层,0.5表示夹层,1表示地面以上的第一层,依此类推)。 -
Rent:最终租赁协议中的所有包括项,即月租金,以欧元计算。[地图图像]
自动生成的描述
图 5.1:我们的房地产覆盖的罗马邻里。你去过这些地方吗?
在构建模型之前,你明智地停下来,认真思考一旦模型完成后,如何实际运用它。你意识到,完成这一工作潜在的商业价值有两个方面:
-
首先,通过解读模型如何运作,你可以发现一些关于市场价格形成机制的深刻证据。你可能能够找到以下问题的答案:哪些特征在定价中真正起到了决定性作用?、楼层数是否对价值有很大影响?以及在其他特征相同的情况下,哪些邻里最为昂贵?其中一些答案将强化你所在机构已有的市场理解,同时增加将这些知识明确化并正式描述的好处。更有趣的是,其他发现可能是完全意外的,并揭示出你之前未曾了解的原始动态。
-
其次,你的模型可以用来生成基于数据的租金建议,当新物业进入市场并加入机构的投资组合时。为了让这方面的事情更加有趣,业主向你分享了一份名为(
RomeHousing-NewProperties.xlsx)的列表,里面列出了 10 个尚未确定租金的即将上市的物业,这些物业使用与历史数据库中相同的特征(如Neighborhood、Property_type等)。一旦模型完成,你将运用它来对这些样本物业进行示范,展示它的工作原理。
现在你已经清楚了业务需求,最终可以将其转化为具体的机器学习术语,基于我们在上一章学到的内容。你需要建立一个通过学习一些“已知”示例来预测“未知”租金价格的机器:以前租赁过的物业数据库就是你的标签化数据集,因为它包含了目标变量的示例,在本案例中,即Rent。浏览机器学习算法的目录(图 4.5),你意识到我们显然处于监督式机器学习的范畴。更具体地说,你需要预测数值(欧元租金),因此你确实需要利用一个进行回归的算法。
现在,解决这个商业机会的机器学习方法已经清晰地出现在你面前:你终于可以启动 KNIME 并创建一个新的工作流(文件 | 新建... | 新建 KNIME 工作流):
-
作为第一步,你通过将文件(
RomeHousing-History.xlsx)拖放到空白工作流中,或者通过使用Excel Reader节点来加载带标签的数据集。在这两种情况下,KNIME 都会识别文件的结构,你只需接受其默认配置。运行节点后,你将获得如图 5.2所示的数据集,其中包含你预期的九列:![]()
图 5.2:加载到 KNIME 中的历史租赁数据:4,000 个房产供学习使用
当你构建机器学习模型时,你将以各种方式与数据表中的列进行交互。通过在一开始就探索这些列,了解你将要处理的数据是非常明智的。幸运的是,统计节点可以帮助你,它会立即显示你需要了解的列的最重要信息。
统计
这个节点(分析 > 统计)计算输入表中每一列的摘要统计信息。其配置对话框顶部出现的复选框(图 5.3)让你决定是否计算数值列的中位数值:对于大数据集来说,这个计算可能会很耗费计算资源,因此只有在必要时才勾选。中间的列选择器让你决定哪些列应该被视为名义型。对于这些列,节点会计算每个唯一值的实例数:这对于分类列非常有用,当你想快速评估表格中每个类别的相对分布时。节点计算的主要摘要指标包括最小值(Min)、平均值(Mean)、中位数、最大值(Max)、标准差(Std. Dev.)、偏度、峰度、非数值数据(如缺失值)的计数(No. Missing),以及正负无穷大(No. +∞、No. –∞)。节点还会输出显示值分布的直方图,并且对于名义型列,会列出数据集中最常见和最少见的类别:
偏度和峰度无疑是上述摘要统计中最不为人知的。然而,它们对于迅速告诉你分布的形状与纯高斯分布的典型钟形曲线有多大不同非常有用。偏度告诉你分布的对称性:如果它的值为正,则表示分布左偏;如果值为负,则表示分布右偏。峰度告诉你分布的平坦程度:如果为负值,则分布比钟形曲线更平坦;如果为正值,则分布的峰值更尖锐。

图 5.3:统计配置:通过其摘要统计探索数据
-
实现Statistics节点并将其与之前的节点连接。当配置时,勾选第一个框,以便我们可以查看数值列的中位数值。在名义值的选择器中,仅保留字符串类型的列(Neighborhood,Property_type,和Floor_type)以及Elevator。尽管这个列在形式上是数值型的,但它将我们的样本分为两类:配备电梯的房产和没有电梯的房产:读取每个类别中有多少房产将会很有意思,因此我们将把这个列视为名义列。如果你运行节点并显示其主要输出(只需按Shift + 10,或者在执行节点后,右击它并选择查看:统计视图),你将获得一个包含三个有用标签的窗口。第一个标签(图 5.4)展示了数值列的所有重点:我们了解到,数据库中房产的平均租金略高于€1,000,中位数的楼层面积约为 70 平方米。我们还了解到没有缺失值:这对我们来说是好消息,因为我们无需进行清理工作:
![A picture containing table 自动生成的描述]()
图 5.4:统计输出中的数值面板:我的数值特征如何分布?
第二和第三个(图 5.5)标签向你展示了名义列:我们了解到,某些社区(如
Magliana和Portuense)在我们的数据集中比其他社区的表示要少得多。通过查看Property_type列的值,我们还了解到,我们租赁的绝大多数房产都是公寓:![]()
图 5.5:统计输出中的顶部/底部面板:检查你的类别列的值
现在我们已经浏览了数据集,并了解了各列的主要特征,我们可以继续进行有趣的部分,设计我们的模型。为了构建一个强健的监督学习模型,我们需要依赖上一章中遇到的典型流程。让我们在这一关键点上刷新记忆:为了避免过拟合的陷阱,我们需要将标记数据随机划分为训练集和测试集,在训练集上学习,在测试集上预测,并最终通过评分预测值来评估模型的预期性能。你可以回到第四章,什么是机器学习?,查看图 4.13,再次了解完整的过程:在实现一个能够预测有用内容的机器时,我们总是需要遵循这一方法。因此,第一步是将所有标记数据行随机划分为两个独立的子集。这正是我们下一个节点的“专长”:Partitioning。
划分
这个节点(Manipulation > Row > Transform)执行输入表格的按行拆分,将其拆分为两个表格,分别对应上(第一部分)和下(第二部分)输出端口。其配置窗口顶部的选择器(图 5.6)允许你设置第一部分(上输出端口)的大小。你可以指定要包含的行数(绝对值),或者指定该部分的相对大小(以百分比表示,相对[%])。第二个选择器指定了将行拆分成两个部分时所使用的方法:
-
从顶部取:如果选择此选项,拆分将按照当前排序顺序进行。输入表格的顶部行将进入第一部分,而所有其他行在超过某个阈值后将进入第二部分。阈值的位置取决于你在上面已决定的部分大小。
-
线性抽样:在这种情况下,输入表格行的顺序得以保持:每隔 n^(行)将会进入一个输出端口,两个部分交替分配。如果,举例来说,你进行线性抽样,目的是创建两个大小相等的部分(每部分包含原始行数的一半),那么你将会得到所有奇数行在一个部分,所有偶数行在另一个部分。如果拆分是三分之一和三分之二,那么第一部分会有每三行中的一行,第二部分则包含所有其他行。如果你的数据集是时间序列,并且记录按时间顺序排列,这种方法特别有用。
-
随机抽取:如果选择此选项,你将获得一个随机抽样。唯一可以确保的是,第一部分中的行数将恰好是你在第一个选择器中设置的行数。
-
分层抽样:在这种情况下,你同样执行随机抽样,但你强制保持一个名义列的分布在两个输出部分中。例如:如果你有一个描述 1,000 名患者的输入表格,其中 90%标记为
negative(阴性),10%标记为positive(阳性),你可以使用分层抽样来保持每个拆分部分中阳性与阴性患者的比例不变。在这种情况下,如果你希望将 700 行分配到第一部分,你将得到恰好 630 个阴性患者和 70 个阳性患者:比例保持不变。
如果你选择了基于随机选择的拆分方法(上面列表中的最后两个选项),你可以通过勾选使用随机种子选框来保护工作流的可重现性。当你指定一个常数值来初始化随机抽样时,你是在“固定”随机行为:结果是每次执行节点时,你都会得到相同的拆分。这在你希望在构建工作流时保持拆分一致,或者希望其他人在他们的机器上得到相同拆分时非常方便:

图 5.6:分割配置对话框:你希望如何分割数据集?
计算机真正难以应对的一件事是表现得随机并执行任何“意外”的操作,因为它们是根据一套确定性的步骤来构建和编程的。因此,计算机利用特殊算法生成伪随机数序列,这些序列“看起来”就像是真正的随机数。值得注意的是,这些序列的起始点(随机种子)可以决定数字的完整进程。必要时,计算机仍然可以通过查看快速变化的状态(如从上次启动以来 CPU 时钟周期的数量)或通过测量一些微观物理量(如端口上的电压),这些量受到不可控现象的影响,如热噪声和其他量子效应,从而生成随机种子。很有趣的是,计算机在处理这些任务时会遇到我们只需抛个硬币就能完成的事情!
让我们开始典型的监督学习流程,并将完整的房屋数据集分割为训练集和测试集:
- 让我们实现分割节点,并将其与Excel 阅读器的输出连接(你可以保持统计节点未连接,因为我们不需要使用它的输出)。在配置对话框中,我们确保选择相对[%]选项,值为
70。这意味着,在输入的 4,000 个属性中,将有 70%的数据用于训练(这是合理的做法,因为如第四章中所述,什么是机器学习?,训练集通常应涵盖总数据集的 70%到 80%)。我们希望分割是随机进行的。在上一步中,我们注意到一些名义列(如Neighborhood)在其值的分布上存在不平衡。这意味着,我们有可能在一个较小的邻里(如与Magliana相关的 26 行数据)中仅仅获得少量的属性,进而仅将这些数据分配到一个分区。虽然这并非严格要求,但我们最好避免任何可能影响学习的不平衡,因此在对话框中选择分层抽样,并对Neighborhood进行处理。你也可以勾选下方的复选框,并在右侧输入一个随机种子,如12345,这样你就可以确保每次都得到相同的分区。当你运行节点时,你会发现,在上方的输出端口(右键点击节点并选择第一个分区)中,你将找到 2,800 行数据,正好是原始数据集的 70%。这是一个好兆头,我们可以继续进行学习步骤。
此时,我们需要添加实现特定机器学习算法的节点(包括学习器和预测器)。预测数字的最简单算法是线性回归,这也是我们在本教程中使用的算法。值得先介绍一下其基础数学模型,以便我们为理解其结果做好准备。
线性回归算法
线性回归模型是我们在第四章《什么是机器学习?》中用来预测二手车价格的简单回归的推广。在那种情况下,我们将价格建模为一条直线,遵循简单的方程:

其中,y 是因变量,因此是我们预测的目标(汽车的价格),x 是唯一的自变量(在那个例子中是汽车的年龄,单位为年),而
和
是模型的参数,分别定义了直线的高度(也称为偏移量或截距)和斜率:

图 5.7:汽车价格的线性回归:随着年龄变化,直线显示了预测值
具体来说,正如你在图 5.7中看到的那样,我们有
(它是模型线与纵轴相交的地方)和
,因此汽车的价格可以通过这个简单模型预测:

一辆 2 年车龄的汽车的价格将被估计为 $12,600,因为:

简单线性回归的学习器算法的目的是找到正确的参数(
和
),以最小化预测误差,而预测器算法则会将模型应用于新的数据,就像我们在得出 2 年车龄汽车估计价格时所做的那样。
线性回归是我们刚刚看到的简单模型的推广。其基础数学描述为:

其中,y 仍然是我们试图预测的(单一的)目标变量,各种 x[i] 值代表对应我们所拥有的特征的(多个)自变量,
值是定义模型“形状”的参数。由于这次我们有多个自变量(因此我们称之为多变量模型),我们无法再通过简单的二维图表中的直线进行“可视化”。尽管如此,它的基础数学模型仍然相当简单,因为它假设每个特征与目标变量之间是“线性”关联的。好了,你刚刚遇到了多变量线性回归模型。
如果我们将这个模型应用于租金预测,我们的目标变量是Rent列,而特征(自变量)则是所有其他列,如Rooms、Surface等。多变量线性回归模型将会是:

并且实现此模型的学习算法的目标是找到“最佳”值,如
、
、
等,这些值能够最小化在训练集上产生的误差。
通过一组给定的公式(并不复杂),我们可以分析性地找到能够最小化线性回归模型误差的参数集
。最简单的方法称为普通最小二乘法(OLS):它最小化线性回归的平方误差和。你还记得在第四章中介绍的均方根误差(RMSE)指标吗?通过使用普通最小二乘法程序,我们将最小化 RMSE,这正是我们在这里需要做的。
上面的模型期望每个自变量都是一个数值。那么,我们如何处理数据集中像Floor_type这样的名义特征呢?我们可以通过机器学习中的一个常用技巧来解决这个显而易见的限制:创建所谓的虚拟变量。这个想法非常简单:我们将每个名义变量转换为多个数值变量。以Floor_type为例:这是一个类别变量,其值可以是Upper、Mezzanine或Ground floor。在这种情况下,我们将通过创建三个数值虚拟变量来替换这个类别变量:Floor_type=Upper、Floor_type=Mezzanine和Floor_type=Ground。虚拟变量的值可以是1或0,取决于类别:对于某一行数据,只有一个虚拟变量的值为1,其余的都为0。例如,如果某一行数据指的是Upper楼层的房产,那么虚拟变量Floor_type=Upper的值将为1,其他两个将为0。
得益于这个技巧,我们可以将线性回归模型应用于任何类别变量;我们只需要将它们“转换”成多个额外的虚拟变量。
我们已经准备好通过引入实现其学习算法的 KNIME 节点,来尝试线性回归模型。
线性回归学习器
这个节点(分析 > 挖掘 > 线性/多项式回归)训练一个多变量线性回归模型,用于预测一个数值量。对于其配置(见图 5.8),你需要在顶部的目标下拉菜单中选择要预测的数值列:

图 5.8:线性回归学习器的配置对话框:选择要预测的内容和要使用的特征
然后,在中央框中,您可以选择哪些列应作为特征使用:只有右侧绿色框中出现的列才会被视为模型中的自变量。名义列,如字符串,将自动由节点转换为虚拟变量。
如果一个名义列(如类型)具有N个唯一值(如A、B和C),那么该节点实际上会创建 N-1 个虚拟变量(Type=A 和 Type=B)。实际上,名义值中的一个可以通过所有零的组合来表示:在我们的例子中,如果类型是C,那么Type=A和Type=B都会是零,意味着该行唯一可能的值是C。这样,我们使模型变得更简单,并避免了所谓的虚拟变量陷阱,这可能导致我们的模型参数无法计算。该节点会自动处理这一点,因此您不必担心:只需要在阅读与虚拟变量相关的模型参数时记住这一点。
通过点击预定义偏移值复选框,您可以“强制”将线性回归模型的偏移值(我们之前也叫它
或截距)设置为某个值,或者通过将其设置为零来移除它。这会减少模型最小化误差的“灵活性”,因此会降低其准确性。然而,当您试图降低模型复杂度并提高模型的可解释性时,这个技巧可能会有所帮助,因为我们少了一个参数需要解释。默认情况下,如果输入数据中存在缺失值,此节点将无法执行。为了处理这个问题,您可以提前在工作流中管理它们,使用缺失值节点,或者选择配置对话框左下角的忽略缺失值的行选项。
执行后,节点将在其第一个输出端口返回回归模型,然后可以通过预测节点用于预测。第二个输出是一个表格(图 5.9),其中包含回归模型参数的摘要视图,对于每个变量(包括虚拟变量),您可以找到:
-
Coeff.:这是变量的参数(也叫系数)。这是我们在回归模型公式中看到的
参数。 -
标准误差:这是该参数的误差标准差。如果将其与参数值进行比较,你可以大致了解该参数的估计值有多“精确”。你还可以用它来大致获取该参数的置信区间,正如我们在第四章《什么是机器学习?》中讨论 RMSE 时所做的那样。在汽车价格回归的例子中,如果年龄变量的参数是-1.7,标准误差是 0.1,你可以说,95%的情况下,汽车的价格每年下降$M 1.7 ± 0.2(2 倍标准误差)。
-
t 值和P>|t|:这两个统计值(t 值和p 值)是通过应用学生 t 检验生成的,用于说明某个变量对于模型的重要性。p 值越小,你越能有信心拒绝该参数仅仅是“偶然”显著的可能性(这被称为零假设)。作为一个通用规则,当 p 值(该表格的最后一列)大于 0.05 时,你应该从模型中删除该变量,因为它可能是不显著的:![表格 自动生成的描述 图 5.9:线性回归学习节点的摘要输出:找出回归的参数,并确定它们是否显著如果在节点执行后右键点击,可以打开一个额外的图形视图(选择视图:线性回归散点图视图),在这里你可以直观地比较各个特征与目标之间的关系,寻找陡峭的斜率和其他模式。现在让我们用我们的罗马房产数据来实际操作这个节点,看看它能带来什么:1. 实现线性回归学习者节点,并将其与分区节点的上输出端口连接,该输出端口是训练集(来自历史租金数据库的 70%随机样本)。在配置窗口中,再次检查租金是否被设置为顶部的目标变量。就特征而言,此时我们可以保留所有特征,看看哪些是显著的。然而,我们可以删除其中一个,房屋 ID,因为我们已经知道不希望使用它。我们不希望用房产的唯一标识符来推断租金。该编号是在房产加入数据库时人为分配的,并且与房产本身的特征无关,因此我们不希望在预测模型中考虑它。运行模型并打开第二个输出端口以获取模型参数的摘要视图。这个总结视图将类似于图 5.9中显示的内容,尽管数字可能不同,因为随机划分可能在你的案例中生成了不同的划分:欢迎来到概率模型的世界!然而,我们已经注意到,一些参数的 p 值(表格的最后一列,P>|t|)高于 0.05。这意味着我们可以稍后返回此步骤,进行清理并提高模型的性能。目前,让我们继续进行预测并评估模型。##
回归预测器
这个节点(分析 > 挖掘 > 线性/多项式回归)应用回归模型(作为输入给出的第一个蓝色端口)到数据集(第二个端口),并返回每个输入行的预测结果。该节点不需要任何配置,可以与线性回归学习器节点或多项式回归 学习器节点一起使用:如果你想像我们在第四章《什么是机器学习?》中那样在不同多项式度数下构建线性回归,可以自行查看该节点(参见图 4.9)。
-
让我们将回归预测器节点添加到工作流中并建立连接:将线性回归学习器的蓝色方形输出连接到预测器的上输入端口,并将划分(测试集)的底部输出端口连接到第二个输入端口。无需配置,因此你可以执行节点并查看输出,输出结果与图 5.10中的类似:
![表格 自动生成的描述]()
图 5.10:回归预测器节点的输出:我们最终得到了租金价格的预测。
你可以自豪地查看右侧的最后一列,称为预测(租金):对于测试集中的每一行(学习器节点未“见过”的行),该节点生成了租金的预测。这个预测是通过将回归模型的参数直接“应用”到测试集中的每一行的值上获得的。让我们通过一个例子来看这个是如何工作的:考虑图 5.9中的参数。在这种情况下,截距(最后一行)为 569.9,房间数的参数约为 25.8,面积的参数为 9.6,与Collatino社区相关的虚拟变量(Neighborhood=Collatino)的参数为-561.9,依此类推。当预测器需要为测试集中的第一行(见图 5.10中的第一行)生成预测时,它只需将学习器找到的回归模型公式应用到该属性(具有 3 个房间,80 平方米,位于Collatino等)中。因此,回归预测器节点的结果计算如下:

在这种特定情况下,如果加上所有未在前述公式中报告的其他特征,我们得出的最终预测为€896.4,与实际租金价格€950 相比,误差约为€50:对我们的第一个预测来说,这并不差!要完整了解当前模型的性能,我们需要检查测试集中所有行的预测和实际租金之间的差异,使用数值评分器节点。
数值评分器
此节点(分析 > 挖掘 > 评分)通过比较两个数值列来计算回归的摘要性能指标。它唯一需要的配置(图 5.11)是选择要比较的两列:您可以在参考列下拉菜单中选择回归的目标列,其中包含实际值,然后在下一个标记为预测列的列中选择预测值。如果您还想将性能评分作为流变量输出(在进行超参数优化时很有用),则需要勾选底部的将分数作为流变量输出框。该节点输出回归的最流行评分指标,包括确定系数、R² 和 RMSE:

图 5.11:数值评分器节点的配置对话框:选择要比较的列。
-
实现数值评分器节点(注意:不要与用于分类的评分器节点混淆),并将回归预测器的输出连接到其输入端口。在其配置中,请仔细检查顶部下拉菜单中是否包含租金和预测(租金),然后运行节点。其输出(图 5.12)非常令人鼓舞(当然,您可能会得到与这些图中稍有不同的结果,这是正常的):
![表 描述自动生成]()
图 5.12:作为数值评分器节点返回的性能指标:作为您的第一个回归不错
我们得到了一个 R²值为 0.92,这意味着我们当前的模型解释了罗马租金价格的大约 92%的完全变异性。考虑到样本有限和可用特征较少,这看起来已经相当不错了。此外,RMSE 为€110,这意味着我们将在 68%的时间内(一个标准偏差)做出预测误差,绝对值低于€110,而在 95%的时间内,我们的误差将低于€220(RMSE 的两倍)。最后一个性能指标,平均绝对百分比误差(MAPE),告诉我们,我们的预测租金与实际租金的平均差异约为 10%:再次非常不错。
但我们依然追求最优,并不断质疑自己是否能做些什么来改进模型。最简单的方法是考虑是否可以改善特征的选择。让我们回顾一下回归分析得到的参数(图 5.9),看看是否能移除一些不必要(或有害)的特征。当我们从模型中移除多余的特征时,至少会带来两个好处:首先,我们让模型更简洁,便于其他人理解,因为我们需要解释的参数变少了。其次,我们减少了模型在训练集上的过拟合可能性,从而增强了模型的泛化能力。
移除特征的另一个原因是避免多重共线性的风险,这种情况发生在特征之间相互关联时。相关的特征是冗余的:它们会降低模型的预测性能,应当被移除。线性相关性节点可以帮助你计算表格中所有数字列对之间的相关性。作为替代方案,你可以使用 KNIME Hub 中的方差膨胀因子滤波器(VIF)组件:根据经验法则,所有 VIF 值大于 5 的变量应该被移除。
我们来看看 p 值(表格的最后一列),看看是否能揭示一些机会。记住,p 值越高,相关特征的意义就越小。我们可以明显看到特征Elevator应该被移除:它的 p 值远高于 0.05 的规则阈值,因此我们可以直接将其移除。同时,变量Property_type也应该被移除:它的虚拟变量的 p 值较高,唯一例外是Property_type=Penthouse(表明Penthouse是唯一一个似乎对租金有显著影响的类型)。不过,考虑到数据集中顶层公寓的数量非常少,还是值得移除这个特征,进一步简化模型。让我们尝试一下这种简化,看看会发生什么:
-
打开线性回归学习器节点的配置对话框,将Elevator和Property_type移到列选择器的左侧框中,以便将它们移除作为模型的特征。
-
现在我们来运行完整模型,看看是否有变化。为此,只需执行Numeric Scorer节点:之前的所有节点将被强制一起运行。
通过移除这两个特征(见图 5.13中的更新结果),我们成功保持了相同的性能水平,证明它们是不必要的。实际上,性能略微提高了(注意到 RMSE 更低),这可能表明由于这些无信息的变量,我们稍微出现了过拟合现象。此外,我们简化了模型,使得模型更容易解释。现在,只需要知道一个房产在罗马的所在区域、房间数、面积和楼层(编号及类型),就能预测它的租金。
![图形用户界面,表格 自动生成的描述]()
图 5.13:移除两个特征后的更新参数和性能评分:每一点改进都很有帮助
这最后的两步展示了我们明智选择特征的价值。正如第四章《什么是机器学习?》中所预测的那样,特征选择在机器学习中是一个重要的实践,的确如此。
在这种情况下,我们是“手动”进行特征选择的,通过手动检查参数并选择最不重要的那些。实际上,还有一些系统化和半自动化的技术来找出最适合用于机器学习模型的特征子集。如果你感兴趣,可以查看 KNIME 中的特征选择节点,并查看 KNIME Hub 上名为执行前向特征选择的示例工作流。
在结束之前,我们需要做最后一件事:是时候将我们的模型应用于 10 个尚未提供租金价格的待租房产了。这将是向公司所有者展示我们发现的一个方式,也为我们提供了一个机会来理解在构建完模型后,如何在实际生活中使用预测模型。事实上,一旦模型构建完成(并且经过过拟合验证,如我们通过在训练集和测试集上进行划分所做的那样),它们会被投入使用,以便在需要进行预测时,可以将其应用于未来的样本(在本例中,即 10 个新房产)。让我们通过这些房产来看一下实际操作:
-
通过拖拽或实现一个Excel 读取器节点,加载包含新房产的 Excel 文件(
RomeHousing-NewProperties.xlsx)。执行后,你会看到一个简短的表格,其列与历史数据库完全相同,但——当然——缺少租金值。 -
实现一个新的回归预测器节点(或者复制/粘贴现有的节点),并按照图 5.14中的显示方式连接它。你应该将线性回归学习器的输出(是的,我们将重用之前学到的模型)连接到预测器的第一个输入。然后,将Excel 读取器的输出(10 个新房产)连接到预测器的第二个输入。现在,你可以执行该节点并查看输出:
![]()
图 5.14:罗马租金预测的完整工作流
现在,你已经具备了所有必要的条件,可以将输出表格(格式与图 5.15中类似)带回给房地产所有者,并焦急地等待她的反应,结果反应非常积极!她很喜欢,因为她发现这些估算结果至少从表面看起来非常有道理:

图 5.15:新房产的预测租金:你喜欢在这个价格下租一套位于纳沃纳广场附近的 145 平方米公寓吗?
初步的紧张感很快转变为一种广泛的热情。你创建的模型回应了最初的商业目标。事实上:
-
模型参数的解释告诉我们一些关于价格形成机制的非常有用的信息。例如,你发现电梯的存在和公寓的类型并不像面积、房间数量、楼层以及非常重要的,物业所属的邻里那样重要。通过查看邻里虚拟变量的参数(图 5.13),你可以发现每个邻里所带来的额外价值(当然,这些价值需要加到回归模型的其他组成部分上)。例如,纳沃纳广场是迄今为止最贵的地区,而卡斯特尔利·罗马尼则似乎提供(在相同特征下)最具可及性的租金。
-
此外,你现在有了一个简单的方法,可以快速生成一个公平租金的推荐,这可能成为与潜在房东讨论租金时的基础。通过拥有一个基于数据的起始数字,代理商可以更顺利地进行谈判,最终更有可能实现需求和供应在住房市场上更快、更有利的匹配。
恭喜你完成了第一个回归模型!现在是时候向前迈进,挑战自己去做一个不同的任务:预测消费者行为。
使用分类预测偏好
在本教程中,你将扮演一位中型全国性消费者银行的市场分析师,负责为大约 30 万名客户提供账户、个人贷款和抵押贷款等服务。该银行目前正在尝试推出一种新的低成本储蓄账户,提供基本服务并配备可以完全在线管理的预付卡。这个新账户的产品经理对目前的情况并不满意,并邀请你参加一次评审会议。从他紧张的表现来看,显然他对试点电话营销活动的结果并不满意。作为这个试点的一部分,从整个银行客户群中随机选取了 1 万名客户,并通过外呼中心进行了电话联系。结果似乎还不错:1,870 名被联系的客户(占总数的 19%)签约开设了新账户。然而,投资回报率(ROI)的计算让全场观众回到了令人不安的现实。通过呼叫中心联系客户的平均成本为每人 15 美元,而确认销售所带来的增量收入平均为 60 美元。算式很简单:试点电话营销活动花费了 15 万美元,产生的收入仅为 112,200 美元,意味着净损失 37,800 美元。现在大家都明白为什么产品经理看起来失望:如果再对更多客户重复这个活动,结果将是财务上的灾难。
你腼腆地举手问是否可以使用试点电话营销的结果来重新思考活动目标,并提高市场营销工作的投资回报率(ROI)。你解释说,一些机器学习算法可能能够通过学习之前的案例预测客户是否愿意购买产品。像往常一样,你立即获得了尝试你所建议的机会,经理要求你提出一个支持新储蓄账户推出的机器学习方案。
你对刚才发生的事情感到复杂的心情:一方面,你在想自己是不是分享想法有点太急了;另一方面,你也很兴奋,因为你将有机会尝试利用算法来影响这样一个重要的商业案例。你迫不及待想要开始,并请求所有与参与试点的客户相关的信息。你收到的文件(BankTelemarketing.csv)包含以下几列:
-
Age:客户的年龄。
-
Job:描述客户工作类别的字符串,例如
蓝领、管理、学生、失业和退休。 -
Marital:婚姻状况,可以是
已婚、单身、离婚或未知。 -
Education:客户目前达到的最高教育水平,范围从
文盲和基础教育 4 年(总共 4 年基础教育)到大学学位。 -
违约:这告诉我们客户是否因为长期未支付款项而违约。只有少数客户最终会被标记为违约(
yes):大多数客户要么有良好的信用记录(no),要么没有足够的历史记录,无法归类为某个类别(unknown)。 -
抵押贷款 和 贷款:分别告诉我们用户是否曾申请过住房抵押贷款或个人贷款。
-
联系方式:指示提供的首选联系电话是
固定电话还是手机。 -
结果:记录试点活动中呼叫中心联系结果的字符串。它可以是
yes或no,具体取决于客户是否开设了新储蓄账户,或者是否决定拒绝此项优惠。
在开始之前,你需要和产品经理进行一次沟通,以明确在当前情况下,什么样的输出对业务最有价值:
-
首先,了解并记录哪些特征使得客户最有可能购买新银行产品是非常有用的。鉴于该产品的创新性,目前还不清楚哪些人群会特别看中它的提议。了解更多关于这一点的线索有助于构建更具针对性的营销活动,个性化其内容,并且——通过这样做——将呼叫中心试点的经验教训转移到其他媒体接触点。
-
考虑到试点只覆盖了一个相对较小的客户子集——约占总数的 3%——识别“其他”97%的客户进行联系,以最大化营销投资回报率是非常有用的。事实上,我们可以假设,在我们的试点数据集中找到的相同特征——例如年龄、职业、婚姻状况等——也适用于整个客户数据库。如果我们能够根据客户购买产品的倾向为剩余客户进行
评分,那么我们就能将精力集中在最有可能的客户身上,从而大大提高营销活动的效果。换句话说,我们应该建立一个倾向模型,对当前(以及未来)客户进行评分,以便更好地进行市场营销定位。我们将使用倾向得分来“限制”下一步营销活动的范围,选择出新产品的客户比例高于 19%的客户子集(就像我们的试点一样):通过这样做,我们可以提高营销工作的投资回报率。
从机器学习的角度来看,在拨打电话之前,你需要创建一个能预测消费者是否会购买或是否会开设储蓄账户的机器。这仍然是一个典型的监督学习案例,因为你是基于先前的示例(试点电话)来预测某些内容。与罗马房地产案例不同,后者是用回归算法预测一个数字(租金价格),在这里,我们需要预测分类列Outcome的值。因此,我们需要实现分类算法,如决策树和随机森林,我们将很快遇到这些方法。我们已经清楚了业务需求、可用数据以及我们希望采取的机器学习路线:我们具备了开始认真对待这个挑战的所有条件。在 KNIME 中创建一个新的工作流后,我们将数据加载进去:
-
将文件
BankTelemarketing.csv拖放到空白工作流中。弹出CSV Reader节点对话框后,我们可以快速检查一切正常,然后通过点击OK按钮关闭窗口。执行后,节点的输出(图 5.16)确认我们的数据集已经准备好:![表格 自动生成的描述]()
图 5.16:试点活动数据:10,000 个客户通过 8 个特征,且我们知道他们与呼叫中心联系的结果
-
按惯例,我们实现了统计节点,来探索数据集的特征。确认其默认配置后,我们检查其主视图的Top/bottom选项卡(按F10或右键点击选择视图:统计视图以打开)。似乎没有缺失值,所有数据都符合我们对试点活动的预期:Outcome列显示 1,870 行标注为
yes,这正是产品经理在其演示中展示的内容。我们还注意到,Default列仅有一行表示一个违约客户。这个列仍然可能有用,因为它区分了从未违约的客户和我们不确定的客户,所以我们决定保留它并继续:![文本 自动生成的描述]()
图 5.17:统计节点的 Top/bottom 输出:该样本中仅有一个人违约——对大家有利!
-
由于我们处于监督学习场景中,我们需要实现通常的分割/学习/预测/评分结构,以便验证是否存在过拟合的风险。我们首先添加Partitioning节点,并将其下游连接到CSV Reader节点。在其配置对话框中,我们将训练集的相对大小设置为 70%,并选择保护目标变量Outcome在两个分区中的分布,勾选分层抽样选项。此外,我们在随机种子框中填写一个静态数字(如图 5.18所示,你可以填写
12345),并勾选旁边的复选框:作为一般规则,在分类的目标变量上始终执行分层抽样。这将减少学习和验证模型时类不平衡的影响。在恢复类分布平衡的其他方法中,可以通过对多数类进行欠采样或对少数类进行过采样来实现。一个有趣的方法是使用诸如合成少数过采样技术(SMOTE)这样的算法创建合成(和真实的)额外样本:了解更多信息,请查看SMOTE节点。
![图形用户界面、文本、应用 自动生成描述]()
图 5.18:使用分区节点执行分层抽样:这样可以确保每个分区中都有足够的是和否客户
现在我们已经有了一个训练和测试数据集,可以继续实施我们的第一个分类算法:决策树。让我们先了解一下它是如何工作的。
决策树算法
决策树是描述决策过程的简单模型。看一下图 5.19中显示的树,以了解它们的工作原理。它们的分层结构类似于倒置的树。顶部的根对应于第一个问题:根据可能的答案,会在两个或更多的分支之间进行分割。每个分支可以通向额外的问题(及相应的更多分支),也可以终止在叶子上,指示决策的结果:

图 5.19:明天你会如何去上班?决策树可以帮助你做出决定。
决策树可用于描述将实体分配给类别的过程:在这种情况下,我们称之为分类树。想象一张表,其中每个实体(对应一行)由多个特征(列)描述,并被分配到一种特定的类别中,其中有多种替代方案。例如,将消费者分配到多个类别的分类树将回答消费者属于哪个类别的问题:每个分支对应于对特征进行测试的不同结果(例如消费者的年龄是否大于 35 岁?或这个人是否已婚?),而每个终端叶子将是可能的类别之一。一旦定义了决策树,就可以将其应用于所有消费者(当前和未来)。对于表中的每个消费者,都要按照决策树进行操作:消费者的特征将决定跟随哪条具体路径,并导致一个单一叶子被分配为消费者的类别。
有许多基于树的学习算法可用于分类。这些算法能够通过从标记的示例中学习来“绘制”决策树。它们可以找出正确的分裂和路径,最终生成一个能够预测新标签数据类别的决策模型。最简单的决策树学习算法会通过迭代进行,从树的根节点开始,检查“最佳的”下一个分裂点,以便以最不模糊的方式区分类别。通过一个实际示例,这个概念将变得清晰。假设我们想构建一个决策树,以预测快餐顾客将会点哪种饮料(可选饮料有汽水、葡萄酒或啤酒),根据他们选择的食物菜单(美味的选择包括比萨、汉堡或沙拉)和桌面构成(是否是孩子、情侣或成人团体)。我们将要学习的数据集将像图 5.20所示:我们有 36 行数据,每行代表一个先前的顾客,三列数据分别对应特征(菜单和类型)和目标类别(最爱饮料)。

图 5.20:36 位快餐顾客的饮料偏好:你能根据他们的食物菜单和类型预测他们的饮料偏好吗?
由于我们只有两个特征,因此生成的决策树只能有两个层级,导致有两种可能的分裂方式:要么第一次分裂是按菜单,第二次分裂(在下一级)是按类型,要么反过来。学习算法会通过查看每个分支中项目的数量,并检查哪些分裂在类别之间做出“最清晰的区分”,来选择最合适的分裂。
在这种特定情况下,第一次分裂的备选选择就是图 5.21中绘制的分裂方式:你可以看到每个分支中顾客的数量,并按不同饮料类别(啤酒、汽水或葡萄酒)进行区分。看看这些数字,问问自己:在左侧按菜单进行的分裂和右侧按类型进行的分裂之间,哪一个在三种类别中做出了“最纯粹”的区分?

图 5.21:这两种分裂方式中,哪一种能在预测饮料选择上提供更多帮助?
在这种情况下,右侧按类型划分似乎是显而易见的:孩子们一致选择苏打水(除了 2 个顾客——希望——他们得到的是无酒精啤酒),团体更喜欢啤酒,而情侣则主要选择葡萄酒。另一种选择(按菜单划分)则复杂一些:对于吃沙拉和在某种程度上吃汉堡的人来说,饮料的选择没有这么明确。我们选择右侧选项的偏好是基于人类的直觉:对于算法来说,我们需要一个更具确定性的方法来做出决策。实际上,决策树学习算法使用度量标准来决定哪些划分是最合适的。这些度量标准之一叫做基尼指数,或者不纯度指数。它的公式非常简单:

其中,f[i]是第i-n^(th)类的相对频率(它位于图 5.21中的%列),在M个可能的类别中。算法会计算每个可能划分的I[G],并对结果进行平均。基尼指数最低的选项(意味着“最纯”的划分)将胜出。在我们的快餐案例中,左侧选项的总体基尼指数将是以下内容的平均值:



通过对它们进行平均,我们发现左侧选项的基尼指数为 0.60,而右侧选项的基尼指数为 0.38。这些度量标准验证了我们的直觉:右侧选项(按类型划分)更“纯净”,因为其基尼指数较低。现在你已经具备了所有元素,能够理解决策树学习算法是如何工作的:它将迭代计算所有可能划分的平均I[G](至少对每个可用特征有一个),选择基尼指数最低的一个,并在下一级的所有可能分支中重复同样的过程,直到无法进一步划分。最后,叶子节点将根据已知示例的大多数归属情况进行分配。例如,看看图 5.21中的右侧分支:如果这是树的最后一层,孩子们将被分类为选择苏打水,情侣选择葡萄酒,团体选择啤酒。在图 5.22中,你可以看到使用我们上面介绍的快餐数据得到的完整决策树:

图 5.22:根据顾客最喜欢的饮料分类的快餐顾客决策树。你通常会在哪条路径上?
通过查看得到的决策树,你会注意到并非所有顶层的分支都会在下面的层级继续分裂。以左上方的Type=Kids分支为例:绝大多数孩子(12 个中有 10 个)选择了Soda。剩余的样本不足以通过Menu做出有意义的进一步分裂,因此树就停在了这里。除了这个基本的停止标准之外,你还可以实现其他(更严格的)条件,通过移除不太有意义的分支来限制树的生长:这些被称为——我必须说,这个名字非常恰当——修剪机制。通过修剪决策树,你最终得到的是一个更简单的模型:当你想避免模型过拟合时,这非常有用。想一想:如果你有很多特征和样本,树可能会极其庞大。
每一种值的组合理论上都可能产生一个非常特定的路径。很有可能这些小分支覆盖的只是训练集中偶然出现的一个无关紧要的案例,而这个案例没有普遍价值:这是典型的过拟合问题,我们希望尽可能避免。这就是为什么,正如你很快在 KNIME 中看到的那样,你可能需要激活一些修剪机制,以避免在生长树时过拟合。
让我们再考虑一下与决策树中数值特征相关的问题。在快餐示例中,我们只有名义特征,这使得每一次分裂都很容易想象:每个底层分支涵盖了类别列的一个可能值。如果你有一个数值列需要考虑,算法会检查如果使用数值阈值来划分样本时,基尼指数会是什么。算法会尝试多个阈值,并选择最佳的分裂方式来最小化杂质。假设在我们的示例中,我们有一个额外的特征,叫做Size,它统计了每张桌子上坐着的人数。算法会测试多个阈值,并检查如果根据这些条件划分样本时基尼指数会是什么,这些条件包括像“Size > 3?”、“Size > 5?”和“Size > 7?”。如果这些条件中的一个有意义,那么分裂会根据数值变量来进行:所有Size低于阈值的样本将进入左分支,其他样本进入右分支。来自所有数值特征的基尼指数将与我们之前看到的所有来自类别变量的指数进行比较:在每一步中,最纯净的分裂会胜出,不管它是什么类型。这就是决策树在分类样本时如何巧妙地混合各种特征类型的方式。
决策树模型可以扩展为预测数字,从而成为回归树。在这些树中,每个叶子节点标注了目标变量的不同值。通常,叶子的值只是所有进入该叶子节点的样本的平均值,这些样本经过类似分类树构建机制的过程(使用基尼指数等)。你也可以在 KNIME 中构建回归树:请查看存储库中的简单回归树节点。
现在我们知道了决策树是什么,让我们生长一棵树,用它来根据电话营销活动的结果对我们的银行客户进行分类。我们将使用一个新的节点:决策树学习器。
决策树学习器
该节点(分析 > 挖掘 > 决策树)训练一个决策树模型,用于预测名义变量(分类)。在其配置对话框中(见图 5.23)需要设置的最重要字段是:
-
类别列:你需要指定你要预测的名义目标变量。
-
质量度量:这是用来决定如何进行分裂的度量标准。默认值是我们上面遇到的基尼指数。你也可以选择增益比的信息,这通常会创建更多且更小的分支。没有“好”与“不好”的选择,在大多数情况下,两种度量都会生成非常相似的树:你可以尝试它们两者,看看哪个能产生更好的结果。
-
剪枝方法:你可以使用此选择器来激活一种强大的剪枝技术,称为MDL(最小描述长度),它去除不太重要的分支并生成一个平衡的树。
-
每个节点的最小记录数:你可以通过设置允许进一步分裂的最小样本数来控制树的生长停止标准。默认情况下,此超参数设置为
2:这意味着没有分支会生成少于 2 个样本的节点。随着这个数字的增加,你将剪去更多的分支,并得到越来越小的树:这是调整树复杂度并获得最佳拟合模型的有效方法。通过在之前的选择器中激活 MDL 技术,你走的是“捷径”,因为它会自动推测正确的剪枝水平。![]()
图 5.23:决策树学习器节点的配置窗口:今天要剪枝吗?
节点的输出是树模型的定义,可以通过打开其主视图来探索(右键单击节点,选择View: Decision Tree View)。在图 5.24中,您将找到我们之前获取的快餐分类树的 KNIME 输出(可参见比较图 5.22和5.21):在树的每个节点处,您会发现落入每个类值的训练样本数。您可以通过单击每个分割点处显示的带有圆形 + 和 – 标志来展开和折叠分支:

图 5.24:快餐分类树,由 KNIME 中的 Decision Tree Learner 节点输出。灰色行对应于主要类别
-
从存储库中拖放Decision Tree Learner节点,并将其连接到Partitioning node的上输出(训练集)。暂时保留其配置的所有默认值(稍后我们将有机会进行一些修剪):唯一需要双重检查的选择器是设置Class column的选择器,在我们的案例中为Outcome。如果您运行节点并打开其决策树视图(选择节点并按 F10),您将会看到刚刚生成的树:
![]()
图 5.25:首个根据 Outcome 对银行客户进行分类的树:这只是可用的许多级别和分支的部分视图
当您展开某些分支时,您会意识到树非常宽和深:图 5.25展示了树可能的部分外观(根据随机分区,您可能会得到不同的树,这是正常的)。在这种情况下,我们注意到顶部分割将客户分为移动用户和固定电话用户。事情是这样的:对所有特征计算了基尼指数,并且在Contact方面得分最低,使其成为区分客户Outcome最重要的变量。让我们看看这棵树是否足够好并预测测试集中的结果。
Decision Tree Predictor
这个(Analytics > Mining > Decision tree)应用决策树模型(作为第一个端口的输入)到数据集(第二个端口),并返回每个输入行的预测结果。这个节点不需要任何配置,并且将生成与输入中提供的表格类似的表格,其中包含一个额外的列,包含分类结果。
- 让我们实施Decision Tree Predictor节点,并将其连接到如下所示的方式:该节点获取由Decision Tree Learner节点输出的树模型以及Partitioning节点的第二输出端口,即我们的测试集。当您执行该节点时,您将找到一个输出,其中包含名为Prediction (Outcome)的宝贵附加列。
此时,我们可以通过计算用于分类的指标来评估模型的性能。你还记得在“小狗与松饼”示例中我们获得的准确度、精确度、敏感性和混淆矩阵吗?现在是使用正确的节点:评分器来计算这些指标的时候了。
评分器
该节点(分析 > 数据挖掘 > 评分)通过比较两个名义列来计算分类的总体性能评分。其配置步骤(图 5.26)非常简单,只需选择要比较的列:你应该在第一列下拉框中选择包含观察到的(实际)值的列,而预测值则选择在第二列下拉框中。该节点输出评估分类性能的最重要指标,即:混淆矩阵,作为表格显示在第一个输出中(列表示预测值,而行表示实际值),以及总结性指标,如准确率、精确度和敏感性,你可以在节点的第二个输出中找到这些指标。
一些分类的性能指标将取决于你决定将哪个类别视为正类:可以查看上一章的图 4.8来复习。在评分器节点的第二个输出中,你将看到每个可能类别的一行:每一行包含假设某一特定类别被标记为正类,而其他所有类别为负类时计算的指标。

图 5.26:评分器节点的配置窗口:只需选择要比较的列
-
现在我们可以将评分器节点添加到工作流中(确保不要选错,选择了只能用于回归的数值评分器节点)。然后将它连接到下游的决策树预测器。在配置窗口中,我们可以保持默认设置,只需确保第一列是结果,第二列是预测(结果)。执行该节点并打开其主视图(F10 或右键点击并选择查看:混淆矩阵)。
评分器节点的输出(图 5.27)告诉我们,模型的准确率为 78.3%:在 100 个预测中,有 78 个是正确的。混淆矩阵帮助我们理解模型是否能为我们的业务场景带来价值:
![]()
图 5.27:第一次分类后评分器节点的输出:78%的准确率作为起点并不差
在图 5.27所示的情况下,我们在测试集中有 450 名客户(180 + 270),被预测为对账户感兴趣(预测(结果) = yes)。其中只有 180 人(40%,即我们的模型的精度)被正确预测,这意味着这些客户最终购买了产品。这个数字看起来很低,但已经是一个鼓舞人心的结果:算法能够帮助找到更有可能购买产品的客户子集。如果我们不加区分地对所有客户进行预测——正如我们从试点中所知道的那样——我们会获得 19% 的成功率,而通过集中关注算法识别为潜在客户的(较少的)客户(预测(结果) = yes),成功率将翻倍,达到 40%。
现在让我们思考如何改进建模结果。我们记得我们的决策树既深又宽:一些分支指向了非常“具体”的案例,这些案例只对训练集中的少数几个示例感兴趣。这看起来不太对:一棵过度适应训练集的决策树可能会在未来的案例中产生高误差,因为它无法理解具有普遍有效性的基本模式。我们可能在过拟合!让我们准备好一把修剪剪刀:我们可以通过减少树的复杂性来修正过拟合,在某些地方做出明智的修剪:
有时,决策树预测节点会生成空预测(在 KNIME 表格中显示为红色?,这就是你在图 5.27顶部看到的警告信息)。这表明树可能存在过拟合问题:其路径过于“具体”,无法涵盖需要预测的值集合(这种“病态”被称为没有真实子节点)。除了处理过拟合问题外,解决缺失值的一个技巧是打开PMML 设置面板(决策树学习器配置中的第二个选项卡),并将无真实子节点策略设置为返回最后的预测。
-
打开决策树学习器的配置对话框,并选择MDL作为修剪方法。这是修剪我们树的最简单和最快的方法:我们也可以尝试增加每个节点的最小记录数(可以试试看它的效果),但 MDL 是一种安全的方法,可以快速获得改进。
-
让我们看看是否有效。我们不需要改变其他内容,所以只需执行评分器节点并打开其主视图查看发生了什么。
当你看到结果时(图 5.28),你会感到一阵兴奋:情况变得更好。准确率提高到了 83%,最重要的是,模型的精度大大提升。在测试集中 175 名现在被预测为Outcome=
yes的客户中,117 人最终会真正购买产品。如果我们遵循模型的推荐(我们可以假设它在我们尚未联系的客户群体中也会保持类似的预测效果——即剩余的 97%客户群体),那么我们的营销活动的成功率将提升至 67%,这比最初的 19%基准提高了三倍多!![]()
图 5.28:树修剪后节点评分器的输出:精度
模型之前存在过拟合问题,一些修剪明显有所帮助。如果你现在打开决策树学习器节点的树状视图,你会发现一个更简单的模型,它可以被探索并最终进行解释。你可以通过选择根节点(只需左键点击它),然后点击顶部菜单中的树 | 展开选定分支来一次性展开所有分支。通过查看这棵树(可能类似于图 5.29所示),我们最终可以尝试对模型进行一些解释。观察每个节点中yes类别的不同百分比:我们发现一些客户群体对我们的产品表现出不成比例的兴趣:

图 5.29:决策树摘录,按结果分类的银行客户:学生、退休人员和使用固定电话的 60 岁以上客户表现出对我们新储蓄账户的最大兴趣
例如,我们发现这三个细分市场的客户群体:
-
移动设备用户中的学生
-
移动设备用户中退休的人群
-
使用固定电话的 60 岁以上用户
相较于其他所有样本,我们的试点活动受到了更多的响应,超过 50%的样本最终成功开设了新的储蓄账户。我们和产品经理快速聊了一下,并向他展示了这些结果。他对这些发现感到非常兴奋,经过一番思考后,他确认算法所发现的内容在商业上完全有意义。新类型的账户比其他账户具有更低的固定成本,这也解释了为什么它的提案对低收入客户(如学生和退休人员)更具吸引力。此外,这种账户包括一张免费的预付卡,这是一个很棒的工具,既适合学生逐步充值,也适合那些尚未完全信任传统信用卡的年长客户,他们更倾向于控制欺诈风险。账户经理对你分享的信息非常满意,不停地感谢你:通过基于数据的证据,了解到哪些特征使得客户更可能购买他的新品,他现在可以精细调整营销概念,突出利益并强化向潜在客户传递的信息。
你刚刚收到的积极反馈让你精神焕发,接下来你想迅速进入挑战的第二部分:构建一个能够为97%尚未联系的客户“评分”的倾向模型。为此,我们首先需要引入另一种特别适合预测倾向的分类算法:随机森林。
随机森林算法
在机器学习中,为了获得更好的性能,一种常用的方法是集成学习。其背后的理念非常简单:不是构建一个单一的模型,而是将多个基础模型结合起来,得到一个集成模型,集体上比任何单一模型都能产生更强的结果。如果我们将这个概念应用到决策树上,我们将并行构建多个模型,得到一个……森林。然而,如果我们对相同的数据集多次运行前面提到的决策树算法,我们只会得到“复制”的相同树。想想看:我们之前描述的过程(计算基尼指数并构建后续分支)是完全确定性的,当输入相同的时候,始终会产生相同的输出。为了促使基础模型之间的“多样性”,我们需要在输入数据中强制引入一些变化:一种方法是随机抽取输入数据集中的行列子集,并将它们作为不同的训练集提供给独立生长的基础模型。然后,我们只需将多个基础模型的结果聚合成一个单一的集成模型。这被称为Bagging,即Bootstrap 聚合,它是我们将从决策树过渡到随机森林的秘密武器。
为了理解它是如何工作的,让我们通过一个实际例子来可视化:图 5.30 展示了一个简单的决策树和一个基于我们的银行电话营销案例构建的随机森林(由四棵树组成)。

图 5.30:决策树与随机森林对比:使用森林模型可以得到倾向得分和更高的准确性
通过对行和列进行随机抽样,我们成功地从相同的初始数据集中生成了四棵不同的树。看看图中左下角的树(标记为 #1):它只有 Mortgage 和 Contact 列可以学习,因为它们是该树在其情况下随机抽取的列。考虑到它所提供的行子集(这些行也是通过引导过程随机抽取的),模型应用决策树算法,生成了一棵与其他所有基础模型不同的树(你可以检查底部的四棵树——它们都不同)。考虑到构成我们森林的四棵树,让我们假设我们想预测一个 63 岁退休客户的结果,该客户有房贷并通过固定电话被联系。相同的客户将遵循四条不同的路径(每棵树一条),最终会导致不同的结果。在这种情况下,4 棵树中有 3 棵一致认为预测结果应该是yes。最终的集成预测将通过投票的方式民主产生。由于大多数树认为该客户是yes,因此最终的结果将是yes,倾向得分为 0.75(3 除以 4)。
我们做出的假设是:越多的树一致认为某个客户被分类为 yes,那么该客户“越接近”购买我们的产品。当然,我们通常会建立比四棵树更多的树:每棵树在不同的分支上展示的多样性将使我们的集成模型更“敏感”于特征组合中的微小差异,这些差异能够告诉我们关于客户倾向的有用信息。每棵树都会提供一个稍微“不同”的视角来对客户进行分类:通过将所有这些贡献汇集起来——在一种类似决策众包的方式中——我们获得了更强大的集体预测:这又是多样性在生活中普遍价值的另一个证明!
尽管倾向得分与分类正确的概率相关,但它们并不是同一个概念。我们仍然处于不确定的概率模型世界中:即使 100%的树对某一特定分类达成一致,也不能 100%确信该分类是正确的。
让我们认识一下可以生成森林的 KNIME 节点:见 随机森林学习器 节点。
随机森林学习器
这个节点(分析 > 挖掘 > 决策树集成 > 随机森林 > 分类)训练一个用于分类的随机森林模型。在其配置窗口的顶部(图 5.31),你可以选择用作分类目标的名义列(目标列)。然后,在中间的列选择器中,你可以选择哪些列作为特征(在右侧包括框中显示的列):所有其他列将被学习算法忽略。选项保存目标分布…将记录每个叶节点中样本的数量:尽管这会消耗大量内存,但它可以帮助通过软投票技术生成更准确的倾向得分,关于这一点我们稍后会讨论。
在窗口底部,你还会看到一个框,让你选择想要生成的树木数量(模型数量)。最后,你可以决定勾选一个复选框(标记为使用静态随机种子),它类似于你在分区节点中找到的内容,让你“固定”用于随机抽取行和列的伪随机数生成器的初始化种子:在这种情况下,输入和配置参数相同的情况下,你将始终获得相同的森林:

图 5.31:随机森林学习器节点的配置窗口:你想在森林中看到多少棵树?
- 让我们实现随机森林学习器节点,并将训练集(分区节点的第一个输出端口)连接到它的输入:重新使用决策树学习器使用的相同训练和测试集是没有问题的。如果我们执行该节点并打开其主视图(F10或右键点击然后选择视图:树视图),我们将看到类似树形结构的输出,就像决策树的情况一样:然而,这次,我们在顶部有一个小的选择器,允许我们滚动查看森林中的 100 棵树。
随机森林是黑箱模型,因为它们难以解释:浏览 100 棵不同的树并不能提供关于如何做出预测的线索。然而,有一种简单的方法可以检查哪些特征最为重要。打开随机森林学习器节点的第二个输出端口(右键点击并选择属性统计)。第一列——称为#划分(级别 0)——告诉你该特征作为树的顶部划分被选择了多少次。这个数字越高,说明该特征在模型的学习过程中越有用。
随机森林预测器
该节点(分析 > 数据挖掘 > 决策树集成 > 随机森林 > 分类)应用随机森林模型(需要在第一个灰色输入端口提供)到一个数据集(第二个端口),并返回每一行输入的集成预测。作为其配置的一部分,您可以决定是否要输出每个单独类的倾向分数(附加个别类概率)。如果勾选使用软投票框,您可以启用更准确的倾向估计:在这种情况下,每棵树的投票将根据学习过程中每个叶子中包含的样本数量进行加权。一个叶子“看到”的样本越多,我们就越能相信它的估计。要使用此功能,您必须在上游的随机森林学习节点中选择保存目标分布…选项。

图 5.32:随机森林学习器节点的配置对话框。您可以决定是否查看倾向分数。
-
将随机森林预测器节点拖放到工作流中,并将其输入与由随机森林学习器输出的森林模型和训练集连接,即划分节点的底部输出端口。配置节点时,取消选中附加整体预测置信度框,勾选附加个别类概率(我们需要的是倾向分数)和使用软投票框。执行后,您将在其输出中找到已被预测、预测(结果)以及按类划分的倾向分数的测试集。具体来说,顾客对我们产品感兴趣的倾向是P(结果=是)。
-
实现一个新的Scorer节点(为了简便,您可以复制/粘贴您为决策树使用的那个),并将其连接到随机森林预测器的下游。对于它的配置,只需确保在前两个下拉菜单中选择结果和预测(结果)。执行后,打开其主输出视图(F10)。
Scorer的结果(图 5.33)证实,至少在这个案例中,集成模型的性能指标更好。准确度提高了几个小数点,最重要的是(因为它直接影响我们营销活动的投资回报率),精确度达到了 72%(可以打开准确度统计输出端口查看,或者从混淆矩阵中轻松计算出来):
![]()
图 5.33:我们随机森林的Scorer节点输出。与决策树相比,准确度和精确度都有所提高:多样性有所帮助。
既然我们已经确认建立了一个强健的模型,让我们集中精力在计算出的倾向分数上,看看我们可以用它做什么。
打开随机森林预测器节点的输出,并按倾向值从高到低对行进行排序(点击P(Outcome=yes)列的标题,然后点击降序排序):你将获得类似于图 5.34所示的视图:

图 5.34:随机森林生成的按倾向值降序排列的预测,P(Outcome=yes):我们在列表中往下翻时,会发现越来越多的不感兴趣的客户(Outcome 列中显示 no)
在列表顶部,我们有测试集中的客户,这些客户是大多数决策树认为感兴趣的。事实上,如果你查看Outcome列,会发现大多数行显示yes,证明这些客户确实对产品非常感兴趣(当联系他们时,他们同意开设储蓄账户)。如果你向下滚动列表,倾向值会逐渐降低,你会开始在Outcome列中看到越来越多的no值。现在,让我们再次思考这个商业案例:既然我们有一个能够预测倾向水平的模型,那么我们可以在没有参与试点的其他 97%的客户身上运行它。如果我们按照倾向值的降序排列客户名单(就像我们在测试集上做的那样),我们将获得一份优先的客户呼叫名单。我们预计,最初的电话(打给倾向性最强的人)会有很高的成功率(就像我们在测试集中看到的那样)。
然后,随着时间的推移,成功率会逐渐下降:越来越多的人会开始说no,并且在某一时刻,打电话就会变得没有意义。那么,关键问题是:我们应该在什么时刻“停止”以获得该行动的最大投资回报率?我们应该打多少电话?什么是最小的倾向水平,低于这个水平我们应该避免尝试销售?倾向建模的一个令人兴奋的地方在于,你可以在打任何电话之前就找到这些问题的答案!
事实上,如果我们假设参与试点的客户是整个客户群的一个公平样本,那么我们可以将测试集(它没有被训练算法“看到”,因此不存在过拟合的风险)作为基础,模拟通过按照倾向值降序呼叫客户的营销活动的 ROI。这正是我们现在要做的:我们需要先按倾向值降序对测试集进行排序(之前进行的临时排序不会影响底层表中行的永久顺序);然后,我们计算通过“遍历名单”所能获得的累计利润,使用产品经理提供的成本和收入估算数据。我们检查在哪个倾向水平下,我们的利润最大化,从而能准确估算出优化 ROI 所需打的电话数量。开始吧!
-
实现一个排序器节点,并将其连接到随机森林预测器节点的输出端。我们希望按倾向性降序对测试集中的客户进行排序,因此选择列P (Outcome=yes)并选择降序选项。
-
实现一个规则引擎节点来计算我们在每个客户身上赚取的边际利润。我们知道每次通话都会花费我们 15 美元,无论结果如何。我们还知道每个账户开通都会带来 60 美元的增量收入。因此,每个最终购买产品的客户(Outcome=
Yes)带来的利润是 45 美元,而其他所有客户的损失是-15 美元。我们来创建一个列(可以称之为Profit),来实现这个简单的逻辑,如图 5.35所示:![图形用户界面,文本,应用程序 自动生成的描述]()
图 5.35:用于计算每个客户边际利润的规则引擎节点
为了计算累计利润,我们需要使用一个新的节点,叫做移动聚合。
移动聚合
顾名思义,这个节点(其他数据类型 > 时间序列 > 平滑)会在移动窗口上聚合值并计算累计汇总。要使用移动窗口,你需要声明窗口长度(即要考虑的行数)和窗口类型(即窗口在表格中的移动方向)。例如,如果选择3作为长度,向后作为类型,则会将前 3 行聚合在一起。如果你想通过从第一行到最后一行累积值进行聚合,则需要勾选累计计算框。与“分组”节点类似,聚合设置标签会让你选择要聚合的列以及使用的聚合方法:

图 5.36:移动聚合节点的配置对话框:你可以通过移动窗口或逐步累积的方式进行聚合。
-
实现移动聚合节点,并将其连接到规则引擎的下游。勾选累计计算框,双击左侧的Profit列,选择求和作为聚合方法。执行节点并打开其输出视图。
移动聚合节点已经累积了每个客户产生的边际利润。如果我们滚动列表(类似于图 5.37中显示的列表),并且注意到最后一列Sum(Profit),我们会发现当我们略低于完整列表的前三分之一时,利润达到峰值。当P (Outcome=yes)的倾向性接近 0.23 时,我们获得大约 8,200 美元的利润。这意味着,通过只联系倾向性高于这一水平的人(即分界点),我们最大化了我们活动的投资回报率(ROI)。
![]()
图 5.37:移动聚合节点的输出:似乎当我们呼叫倾向得分大约为 0.23 的人时,我们达到了最大利润。
为了让这个概念更清晰,我们通过使用线图来可视化变化的利润。
线图(本地)
此节点(视图 > 本地(Swing))生成一个线图。唯一可能需要配置的选项是标记为显示行数的框,您可以使用它来扩展用于创建图表的行数限制。
- 实现一个线图(本地)节点,将显示的行数扩展到至少 3,000 行(测试集的大小),执行它,并立刻打开其视图(Shift + F10)。在列选择标签中,仅保留右侧的Sum(Profit),并移除其他所有列。
图表的输出(如图 5.38所示)证实了我们在表格中注意到的内容,并使其更加明显:如果我们使用倾向得分来决定客户的呼叫顺序,我们的利润将跟随图中的曲线形状。我们会从利润的急剧增加开始(见左侧的第一段),因为我们打电话给的第一批人(这些人是潜在客户,因为他们的倾向得分很高)实际上会购买产品。接下来,大约在列表的三分之一处(当我们知道倾向得分接近 0.23 时),我们达到了最大可能的利润。之后,随着我们遇到越来越少的感兴趣的客户,利润将迅速下降。如果我们打完列表上的所有人,我们将遭遇显著的损失,这也是我们在试点活动中痛苦学到的经验:

图 5.38:我们机器学习辅助的电话营销活动的累积利润曲线:我们在按倾向排序的列表的三分之一处最大化了投资回报率
通过这次模拟,我们发现,如果将活动限定在倾向得分高于 0.23 的客户(大约占总人口的三分之一),我们将最大化利润。通过计算所需的比例(我们的模拟仅涵盖了测试集,总共有 3,000 名客户),我们可以估算如果将我们的倾向模型应用到整个银行数据库,我们将获得多少利润。在这种情况下,我们将使用这些得分来决定在剩余 97% 的客户群中呼叫谁。进行大规模电话营销活动的整体“奖池”将带来约 80 万美元的利润,如果我们呼叫三分之一的银行客户。考虑到打这么多电话可能不可行,我们可能会在列表的前面停下来:无论如何,按照我们随机森林现在可以生成的列表进行操作,我们将获得可观的利润。我们刚刚进行的模拟可以作为计划营销支出和确定正确投资水平的工具。产品经理和你的老板对你所做的出色工作感到满意。你无疑证明了识别(并遵循)机器学习方法能够为业务带来可观的价值:在这个案例中,你完全扭转了营销活动的潜在结果。由于数据、算法,以及最重要的,你在利用这些技术方面的专业知识,原本在试点中的巨大损失现在可以转化为有意义的价值。这是一个了不起的结果,而这一切只用了 12 个 KNIME 节点(图 5.39)就完成了!

图 5.39:银行电话营销优化的完整工作流程
使用聚类对消费者进行细分
在本教程中,你将再次扮演我们在第三章《数据转化》中遇到的在线零售商的业务分析师。这一次,你不再是自动化创建一组财务报告,而是追求一个看起来更具吸引力的目标。客户关系管理(CRM)团队正在寻找一种更智能的方式,与那些选择接收定期新闻通讯的客户进行沟通。与其发送一封统一的每周电子邮件,CRM 经理要求你找到一种基于数据的方法来创建几个有意义的消费者细分。一旦定义了细分,CRM 团队可以为每个细分创建多个消息。通过这样做,他们将为整个客户群提供更加个性化(且更具吸引力)的体验,最终影响客户忠诚度并推动可持续的收入增长。
无监督学习提供了一种经过验证的方法论,可以满足这一业务需求:通过使用聚类算法,我们可以根据客户的特征(如年龄、家庭组成和收入水平)以及他们通过先前购买所表现出的消费模式(例如他们选择的产品的平均价格、总花费金额或订单频率)将客户划分为几个“相似”的群体。这就是机器学习帮助业务的方式:使用聚类对消费者进行适当的细分。
CRM 经理已经开始收集一些基本的消费者级别数据,并获得了一个 CSV 文件(eCommerce-CRM.csv),该文件有 4,157 行——每一行代表一个客户——以及四列数据:
-
Customer_ID:客户的唯一标识符。
-
Average Price:每个客户所有购买商品的平均单价。它为我们提供了客户过去购物选择的“高端性”方向性视图。
-
Basket Size:客户在每次下单中购买的平均商品数量。这个指标显示了他们是否更倾向于进行“大宗”购物,即购买大量商品,还是偏好小规模的、基于需求的购物行为。
-
Unique Products:客户每次购物时购买的不同商品的平均数量。这个指标显示了每个客户“尝试”的商品种类的广度。它为我们提供了客户是否愿意探索新产品,还是更倾向于“一直购买”相同商品的一个线索。
在我们与 CRM 经理讨论这个数据集时,她确认了我们已经注意到的一个问题:数据中包含的三个消费指标(最后三列)远未能为我们提供每个客户偏好的全面图景。如果我们愿意的话,可以通过汇总交易历史生成更多列:比如按客户计算的购买总数、产生的总价值、购买类别和子类别的“组合”、每个类别和子类别内购买产品的高端程度,还有客户的一些特征,比如他们的年龄、居住区的平均收入等。然而,我们决定继续使用机器学习的力量来处理这个第一个数据集:如果以后需要,我们总可以提高模型的复杂度。现在,重要的是要“开始行动”,并务实地证明从这种新的运营方式中能提取出一些初步的业务价值。在交付物方面,你与业务伙伴达成一致,决定将每个客户分配到少数几个簇中,并整理一些可视化图表来解释簇与簇之间的差异。
现在是时候启动 KNIME,创建一个新的工作流,并将我们的 CRM 提取数据加载到其中:
-
将文件
eCommerce-CRM.csv加载到工作流编辑器中。当CSV Reader节点对话框弹出时,我们可以检查预览中是否显示了所有四列,然后点击OK确认默认设置。执行节点后,我们可以查看输出视图(图 5.40)并继续进行下一步:![Table 描述自动生成]()
图 5.40:加载后的 CRM 提取数据:对于每个客户,我们有三个指标,每个指标都能给我们一些关于其购物习惯的线索
创建同质的元素组,例如我们案例中的客户,需要使用聚类算法。让我们认识一下今天可能最流行的聚类算法——k-均值算法。
K-均值算法
k-均值算法可能是最简单(也是最常用)的一种聚类方法。它的核心思想非常简单,可以用两行话总结:数据集中的每个元素都被分配到最接近的聚类中。在每一步中,聚类的位置都会被更新,因此它们会变得越来越紧凑。
假设我们想要对一个二维散点图上显示的点集进行聚类。每个点由两个数字描述,分别代表水平和垂直坐标。两点之间的距离可以通过毕达哥拉斯定理轻松计算(是的,就是那个用来计算直角三角形边长的定理——有关细节,请参见图 5.41):

图 5.41:使用毕达哥拉斯定理计算两点之间的距离:你需要计算每个坐标差的平方和的平方根
k-均值算法的目标是创建指定数量(k)的同质组,这些组由彼此相对接近的点组成。像许多其他机器学习算法一样,k-均值采用迭代方法:每次迭代时,它根据点与称为质心的特殊点的接近程度进行分组。每个点都与其最近的质心关联。然后,算法通过迭代更新质心的位置:在每次迭代中,聚类将趋向于越来越同质化,这意味着这些聚类中的点将逐渐越来越接近。
让我们详细看看 k-均值算法的步骤:
-
初始化:算法的第一步是选择初始质心,每个聚类一个质心。选择方法有很多种。最简单的方式是从我们的数据集中随机选择k个点。
-
分组:算法现在计算每个点到每个质心的距离(使用勾股定理),然后每个点都会与其最近的质心匹配(即距离最小的质心)。通过这种方式,靠近一个质心的所有点将被分在一起,因为它们属于同一个簇。
-
更新:算法现在重新计算每个簇的质心,通过对属于该簇的所有点的坐标进行平均来完成。基本上,质心会更新,以便它与新形成的组的质心一致。
在这个过程的这一阶段,我们返回到步骤 b 开始新的迭代,并在可能改善质心的情况下重复步骤 b 和 c。每次迭代时,簇会收敛,意味着它们会变得越来越有意义。当更新步骤不再改变点与簇的分配时,我们就停止。此时,算法终止:一个稳定的解决方案已经找到,当前的簇定义将作为结果输出。如果收敛没有发生,算法无论如何都会在达到预设的最大迭代次数时停止。
这个过程看起来可能仍然比较复杂,但让我强调一下其背后数学的简单性:随机抽样、平均值、平方和勾股定理中的平方根就是我们实现 k-means 算法所需的全部数学。
为了更好地理解算法是如何工作的,我们通过一个具体的例子来讲解,并使用一些图表直观展示不同迭代的演变。为了简化起见,我们将使用一个仅包含两列的简单数据集:通过仅使用两列数据,我们可以在二维散点图(笛卡尔坐标图)上可视化不同点之间的距离。
当我们处理包含多于两列的数据集时(通常情况就是如此),距离的概念变得更加难以在人类的思维中可视化。虽然在三列数据时,我们仍然能想象算法在三维空间中工作,但在四列、五列或十列数据时,我们就必须将任务交给机器了。幸运的是,它们在多维空间中比人类更得心应手。好消息是,计算距离的基本公式(你在 图 5.41 中找到的勾股定理)保持不变:你只需要计算 所有 维度的距离的平方——无论维度有多少——并对它们进行求和。
回到房地产领域,我们假设有一个数据集,描述了 16 个物业的每平方米价格和年龄(见左侧的图 5.42)。我们希望将这些物业聚类为三个同质聚类。我们想要创建这种聚类的商业理由是显而易见的:如果客户对其中任何一处物业表现出兴趣,我们希望立即推荐考虑同一聚类中的所有其他物业,因为它们应该具有相似的特征。这个例子在 16 个物业中看起来很简单:对于这么少的数据,我们不需要 k-means 来识别相似性。然而,k-means 的美妙之处在于它可以轻松扩展到许多维度和物业,而我们的大脑在面对更多数据点时就会开始挣扎:

图 5.42:启动 k-means:从 16 个具有不同价格和年龄的物业中(左),随机选择三处并选为初始质心(右)
第一步是初始化:算法将随机选择三处物业,因为请求的聚类数量是三(k=3)。算法随机选取了物业C、G和I,如图 5.42右侧所示。在第一次迭代中,算法将进行分组步骤:首先,它将使用毕达哥拉斯定理计算每处物业与每个质心之间的距离,并将每处物业与最接近的质心进行关联。让我们通过图形来跟踪 k-means 在每次迭代中的进展。正如你在图 5.43左侧所看到的,分组步骤创建了三个初步的聚类,每个聚类由不同的颜色表示。蓝色的物业(C、A、B和D)是最接近蓝色质心的,它与物业C重合。属于红色聚类的物业(G、E、F和H)则最接近红色质心G。最后,绿色聚类由物业(I、L、M、N、O、P、Q和R)组成,它们的最近质心是I。接下来的步骤是更新质心:考虑到每个聚类中的点,只需通过计算属于该聚类的物业的价格和年龄的平均值,就能得出聚类的实际质心。例如,我们来看绿色聚类:形成这个聚类的物业往往较老,这使得新的质心出现在散点图的右侧。红色聚类中的质心则向上移动:事实上,与这个聚类相关的物业普遍具有比C(旧质心)更高的价格:

图 5.43:k-means 算法的第一次完整迭代:更新步骤后,质心发生了移动
现在我们终于可以开始第二次迭代(图 5.44)。我们再次从利用刚刚重新计算的质心对点进行分组开始。由于质心发生了变化,簇的组成发生了变化,一些属性的颜色也发生了变化:例如,属性 E 以前是红色的,现在变成了蓝色,因为它最近的质心变成了蓝色的,而不再是红色的。I 和 L 点也是如此,它们曾是绿色的,现在变成了红色的。看起来我们的算法已经走上了正确的道路,因为它正在趋向一个有意义的解决方案:经过这次迭代后,簇的组成发生了变化,使得它们的元素更加接近。第二步迭代中,算法将再次更新质心,考虑到簇的新组成。最显著的变化是红色簇的质心,它已向底部移动(价格较低的地方),这是由于属性 I 和 L 被添加到该组:

图 5.44:k-means 算法的第二次迭代:分组变得越来越有意义
在第三次迭代(图 5.45)中,算法重复了分组步骤,其他属性的颜色发生了变化(例如,M 从绿色变为红色,F 变为蓝色)。然而,发生了一些新的变化:尽管质心已经更新,但簇的组成并没有发生任何变化。这是我们的算法已找到一个稳定解并可以终止的标志,返回最终的簇组成:

图 5.45:k-means 算法的第三次也是最后一次迭代:无法再进行更新,算法收敛
这个最终的簇组成看起来非常合理。通过观察散点图,我们还可以对每个簇进行商业解读:
-
蓝色属性(A、B、C、D、E 和 F)位于图表的左上角。它们都是最近建造的,作为新建属性,它们的价格通常高于其他属性。
-
红色属性(G、H、I、L 和 M)位于图表的底部中央部分,代表的是七十年代建造的建筑,这些建筑使用了较低质量的材料,因此它们的价格更为亲民。
-
最后,绿色点(N、O、P、Q 和 R)与老旧建筑相关,这些建筑通常更具声望,且价格较高。
我们通过 k-means 算法仅经过几次迭代获得的簇,肯定能帮助房地产经纪人向潜在买家展示令人信服的选择。对于一个仅重复一组简单数学步骤的算法来说,表现相当不错。
使用 k-means 时,自然会有一个问题浮现:k的正确值是多少,或者换句话说,我应该创建多少个聚类?尽管有一些数值技术(例如肘部法则)可以推断出k的最佳值,但机器学习的商业实践要求我们采取另一种不那么数学化的方法。在选择聚类数量时,建议后退一步,考虑聚类定义的实际商业用途。需要问的正确问题是:我应该创建多少个聚类,以便结果可以在我的商业案例中实际应用?以消费者细分和个性化沟通为例,如果我最多只能制作三种版本的新闻通讯,那么创建 100 个消费者聚类是否合理?我们通常会根据商业约束来决定k的合理范围,然后选择最易解释的那个值。这段话的寓意是:数据分析既是艺术也是科学,通常需要人类判断来引导算法走上正确的道路。
在回到我们的教程流程之前,先考虑几个关于使用基于距离的方法(如 k-means)时“可能出错”的问题,以及如何避免这些问题:
-
离群值会破坏游戏规则。如果数据集中某些数据点存在极端值,它们自然会“与其他点分开”,从而使得聚类过程失去意义。例如,想象一下在我们的房地产案例中,有一套房产的价格是其他房产的十倍:这套特殊房产可能会单独形成一个聚类。大多数情况下,我们不希望发生这种情况,因此我们会在一开始就去除离群值。数值离群值节点将为我们完成这项工作。
-
极端的数值范围差异会导致距离计算不平衡。这一点通过一个例子很容易理解。再看看图 5.41中用于计算距离的公式:在房地产示例中,它会利用房价差异(单位是几千美元)和房龄差异(单位通常是几十年)。当你对这两个数量级差异进行平方计算时,差距会变得更加显著,如公式所示。这意味着房价在计算中会占据不成比例的比重,而房龄的影响几乎可以忽略不计。为了解决这个数值上的劣势,我们需要对在 k-means 中使用的所有度量进行标准化,并将它们的范围缩小到一个共同的范围(通常是从零到一),同时保持数据点之间的差异。这就是标准化器节点(以及它的逆节点反标准化器节点)在 KNIME 中为我们做的事情。
为了避免这些问题,请记住以下通用建议:在应用 k-means 之前,始终删除离群值并规范化数据。通过更多的实践和专业知识,你可能能够“弯曲”这些规则,以最佳方式满足你特定的业务需求,但在大多数情况下,这两个步骤只能改善你的聚类结果,因此它们是显而易见的。现在,让我们看看如何在 KNIME 中应用它们。
Numeric Outliers
这个节点 (Analytics > Statistics) 在数据表中识别离群值,并根据需要管理它们。在其配置窗口的顶部 (图 5.46),你可以选择考虑哪些列来进行离群值检测:

图 5.46:Numeric Outliers 节点的配置窗口:你希望如何处理极端值?
在右下角的 Outlier Treatment 面板中,你可以决定如何处理检测到的离群值。特别地,Treatment option 下拉菜单让你选择是要 删除离群值行(以便在其余工作流程中忽略这些行)、删除非离群值行(以便只保留 离群值 并进一步研究它们),还是 替换离群值(通过将它们设为缺失值状态,或将其替换为允许范围内的最接近值——你可以在 Replacement strategy 菜单中指定偏好)。
设置离群值检测灵敏度的关键参数是 四分位距倍数 (k),你可以在配置窗口的左下角进行设置。要理解它是如何工作的,看看 图 5.47 中的 箱型图:

图 5.47:如何解读箱线图:中间的盒子覆盖了分布中的 50% 的数据点。超出“胡须”的部分是离群值。
箱型图让我们一眼看出数字分布的关键特征:四分位数值(见图中的 Q1、Q2,即 中位数,和 Q3)告诉我们如何“切割”排序后的数字群体,从而使每一段中包含 25% 的值。现在,看看中间的盒子,其长度被称为 四分位距(IQR):在这个范围内,我们将找到几乎 50% 的值——这是我们分布的 核心。牢记这一点,离群值可以定义为远离这个核心的值。通常,位于第三四分位数以上 1.5 倍四分位距或第一四分位数以下 1.5 倍四分位距之外的值被视为 轻微离群值。
它们在图 5.47中表示为圆形,而轻微离群值的界限则由你在中央框的上下方看到的虚线“胡须”表示(这也是箱线图又被称为箱形图和胡须图的原因)。如果你将四分位数范围的乘数增加到 3.0,你会发现极端离群值,它们在图中显示为十字形。通过在配置对话框中编辑四分位数范围乘数参数,你可以告诉节点它在检测离群值时应该有多“激进”。
让我们立即在 CRM 数据集上利用我们新的节点:
-
实现一个Numeric Outliers节点,并将其与 CSV 读取器的输出端口连接。在它的配置窗口中,取消选择Customer_ID列,因为我们不想在聚类中使用它。由于我们关注的是极端离群值,将
3.0设置为四分位数范围乘数 (k),并选择删除离群值行作为处理选项。最后,执行该节点并查看它的输出端口。第一个输出(处理后的表格)是已清理的表格版本,显示只有 3,772 行:这意味着我们删除了 10% 的行,因为它们根据某些列被认为是离群值。我们本可以调整 IQR 乘数值,将其增加到 5.0 或更高,以便关注更极端的值并删除更少的行,但为了本练习的方便,我们可以继续使用当前的设置。该节点的第二个输出(总结,如图 5.48所示)告诉我们根据每个单独的列被认为是离群值的行数(Basket Size似乎是显示出更多极端值的列):
![图形用户界面,表格 自动生成的描述]()
图 5.48:Numeric Outliers 节点的总结输出视图:哪些列引起了最多的离群值?
在应用 k-means 之前,让我们进行第二步准备:通过Normalizer节点将数据标准化到一个特定的范围。
Normalizer
该节点(在节点库中为操作 > 列 > 转换(Manipulation > Column > Transform))将归一化选定数据集中所有数值列的值。在其配置窗口中(图 5.49),首先选择要归一化的列,然后选择归一化方法。最有用的归一化方法(特别适合与基于距离的算法如 k-means 聚类结合使用)是最小-最大归一化(Min-Max Normalization),它将原始范围线性映射到预定义的范围(通常为 0 到 1,但你可以手动编辑文本框中的边界)。使用这种归一化方法,原始的最小值被转换为 0,最大值转换为 1,中间的所有值按比例分配到 0 到 1 范围内。另一种常见的归一化方法是Z-分数归一化(高斯标准化),也叫做标准化(Standardization)。使用这种方法,每个值都转化为其相对于总体平均值的标准差数。例如,Z 分数为 -3 表示该值低于总体平均值三个标准差。当你想评估数据点与均值的偏离程度时,这非常有用:
![图形用户界面,应用程序]
描述自动生成
图 5.49:归一化节点的配置窗口:选择要归一化的列和应用的方法
该节点有两个输出:上方的输出端口返回归一化值的表格,下方(青色方块)保存归一化模型。此类模型可以使用反归一化器(Denormalizer)节点重新表达原始值,我们将在几页后遇到该节点。
现在我们已经具备了继续进行归一化的所有条件,数据中已没有异常值,CRM 数据准备就绪。
-
从库中选择归一化器(Normalizer)节点,并将其输入连接到数值异常值(Numeric Outliers)的第一个输出。节点配置非常简单:通过双击Customer_ID列并确保它出现在右侧的红框中,来排除该列参与归一化过程。归一化方法的默认设置适合我们:事实上,最小-最大归一化(Min-Max Normalization),其范围在 0 和 1 之间,特别适合使用 k-means 等算法计算距离。最后,点击确定并执行节点。
如果你查看归一化器(Normalizer)节点的第一个输出,你会注意到受影响列的值现在都落在了所需的范围内,这正是我们所需要的。现在,所有列在计算基于勾股定理的距离时将具有相同的权重。我们终于可以继续并介绍工作流中的关键节点,这将帮助我们对客户进行聚类:k-Means。
![图示]
描述自动生成 k-Means
这个节点(Analytics > Mining > Clustering)使用 k-means 算法对输入表格的行进行聚类。作为其配置的一部分,第一个需要设置的参数(图 5.50)是簇的数量,可以通过在顶部的文本框中输入整数来选择。然后,你可以选择中心初始化的方法,默认情况下是通过随机抽取(你仍然可以设置一个静态随机种子,使过程可重复),以及强制终止时使用的最大迭代次数(默认设置为 99,通常情况下,这已经足够,因为 k-means 通常在更少的迭代中就会收敛)。最后的配置步骤是选择在聚类时要考虑的数字列,可以通过底部的列选择面板完成:

图 5.50:k-Means 节点的配置窗口:选择要标准化的列以及应用的方法
让我们将新的节点应用到标准化的数据上,看看会发生什么。
-
实现k-Means节点并将其连接到Normalizer节点的第一个输出端口。我们可以保持其配置简单,确保簇的数量设置为 3,并从列表中取消选择Customer_ID,因为我们不想在聚类操作中考虑此列。点击确定,然后执行节点并打开其主视图(Shift + F10,或右键点击然后选择执行并打开视图...)。
k-Means节点的主视图(右键点击节点然后选择视图:簇视图,如果需要可以让它显示)将类似于你在图 5.51中看到的内容
![图形用户界面,文本,应用程序,电子邮件 描述自动生成]()
图 5.51:k-Means 节点的摘要视图:我们可以开始看到三个簇的样子
这个摘要视图已经给我们提供了很多信息:k-means 将我们的客户群体分成了三组,分别是 830、1,126 和 1,816 个客户(参见图中的覆盖率标签)。如果你展开不同的簇(点击左侧的+按钮),你会看到三个中心点的数字描述。例如,参考图 5.51,第一个簇(KNIME 通常称之为cluster_0)显示出三者中最小的购物篮大小和最高的独特产品。如果你打开节点的第一个输出端口(右键点击节点然后选择标记输入),你将看到每一行已经被分配到三个簇中的一个,正如附加的簇列所示(参见图 5.52):
![表格 描述自动生成]()
图 5.52:k-Means 节点的输出:每个客户—无论他们是否喜欢—都会被分配到一个簇
与我们的业务合作伙伴——CRM 经理达成一致后,我们需要迈出一步,构建几个可视化图表,以简化解释我们聚类结果的过程。
在执行此操作之前,我们意识到我们的数值仍然被标准化并强制限制在 0 到 1 范围内。为了让我们的可视化更容易解读,我们更愿意恢复到原始的尺度。为此,我们可以通过利用去标准化器节点来撤销标准化。
去标准化器
该节点(操作 > 列 > 转换)将数据集中的值恢复到其原始范围。它需要两个输入连接:第一个输入是由之前的标准化器节点生成的模型,包含标准化方法和参数的描述。第二个输入是需要去标准化的标准化表。该节点不需要任何配置。
- 实现去标准化器节点并设置连接。标准化器节点的青色输出应连接到去标准化器节点的第一个输入端口。k-Means节点的第一个输出应连接到去标准化器节点的第二个输入端口。您可以在图 5.57中预览最终的工作流,查看如何正确连接。执行节点后,您可以看到值已恢复到原始范围。
为了构建可视化,我们需要另外三个节点。第一个(颜色管理器)用于根据数据集的不同行(根据簇)分配颜色,而其他两个(散点矩阵(局部)和条件箱线图)将生成几个漂亮的图表。
颜色管理器
该节点(视图 > 属性)为数据集的每一行分配颜色。其配置窗口(图 5.53)要求您选择两项内容。首先,您需要指定用于评估分配颜色的标称列:与该列相关的每个可能值都将对应一个特定颜色。其次,您需要选择要采用的颜色集。在三个默认颜色集的基础上,您还可以手动定义为标称列的每个可能值分配哪种颜色。为此,您必须在调色板选项卡中选择自定义,然后使用右侧的选项卡(如色板、RGB和CMYK)手动选择每个标称值的正确颜色:

图 5.53:颜色管理器节点的配置:您可以选择为标称列的每个值分配哪种颜色
-
添加一个颜色管理器节点,并将其连接到反规范化器的输出。确认顶部下拉菜单中的集群列,然后选择你想要的颜色集。在图 5.53的具体示例中,已手动创建一个自定义调色板,以便将蓝色、橙色和绿色分别分配给三个集群。
现在颜色已设置好,是时候借助新节点汇总第一个图表了。
散点矩阵(本地)
该节点(视图 > 本地(Swing))生成一个散点图矩阵,在单一视图中展示多个变量组合。该节点无需配置,但你可以选择性地增加最大绘图点数。
-
在颜色管理器之后实施散点矩阵(本地)节点。执行并打开其主视图(选择节点后按F10)。在底部的列选择标签页中,你可以选择显示哪些变量。在我们的例子中,确保在右侧只选择了平均价格、购物篮大小和独特产品:你将得到一个类似于图 5.54的视觉效果:
![图形用户界面,应用程序 描述自动生成]()
图 5.54:散点矩阵(本地)节点的输出视图:你的客户变成了彩色点。通过观察点云的分布,你可以解读每个集群的含义
我们刚刚获得的散点矩阵以更人性化的方式呈现了聚类的结果。当我们与 CRM 经理一起查看时,我们注意到一些初步的清晰模式。例如,看看图 5.54右上角的图表,该图表显示了平均价格(纵轴)和独特产品(横轴)。蓝色集群(cluster_0)明显占据图表的右侧,确认这是一个倾向于尝试更多样化产品(高值的独特产品)的消费者群体。与此同时,橙色集群(cluster_1)的客户似乎偏好较少独特的产品和较低的价格。相反,绿色集群(cluster_2)包括那些在我们网站购物时愿意支付更高价格的消费者。这一切开始变得有意义,视觉效果已经在帮助我们理解聚类结果方面发挥了巨大作用。
让我们再添加一个视觉元素,以进一步阐明我们片段的组成:请见条件箱型图节点。
条件箱型图
该节点(视图 > JavaScript)生成一个交互式视图,其中包含多个箱形图,每个箱形图代表给定类别列中的一个值。这样的视图可以并行比较各分布。其配置窗口(图 5.55)要求选择用于区分并行箱形图的类别列,并选择要可视化分布的数字列:

图 5.55:条件箱形图节点的配置对话框:您有兴趣比较哪些分布?
- 拖放条件箱形图节点到工作流编辑器,并将其连接到去归一化器节点的输出端口。选择Cluster作为类别列,确保只有平均价格、购物篮大小和独特产品出现在对话框中部的列选择器右侧。点击确定,然后按Shift + F10来执行并打开其主视图。在弹出的交互式窗口中,您可以通过操作选择的列下拉菜单来切换可视化的分布:您可以通过点击交互式窗口右上角的图标找到此选择器。
条件箱形图节点的输出视图(图 5.56)更清晰地阐明了每个集群的关键特征。k-means 算法能够生成三个具有独特和区分特征的均匀集群。箱形图非常适合显示这些差异。举个例子,取图中的第三个图,它涉及到独特产品。在这个度量方面,蓝色集群占主导地位:属于该细分的客户购买的独特产品的中位数为 32,而其他集群的中位数接近 10。蓝色箱形图与其他两个箱形图在高度上没有视觉重叠,意味着这种差异是有意义的。另一方面,橙色和绿色集群在独特产品方面似乎相似,因为它们的箱形图几乎重合:

图 5.56:条件箱形图节点的输出:您可以轻松地欣赏各集群间分布的差异
现在我们可以与 CRM 经理一起坐下来,手头有散点矩阵和条件箱形图,我们终于可以描述每个客户细分,并为其含义提供面向业务的解释:
-
蓝色集群包括那些好奇的客户,他们愿意尝试不同的产品。在与这个细分群体的沟通中,我们可以为“新到货”产品提供更多空间,并通过提供他们尚未尝试过的丰富产品选择来吸引他们。
-
橙色聚类可能包括小型零售商,他们从我们的网站大量购买商品以转售给自己的商店。他们通常购买的产品种类较少,但数量较大。我们可以向他们提供批量折扣,并定期沟通畅销产品列表, 希望能够促使他们将我们的畅销商品纳入他们的商品组合,以实现双方的业务增长。
-
绿色聚类由我们的高价值客户组成,他们在购物选择中系统性地将质量置于价格之上。因此,与他们沟通时,我们应该宣传产品组合的高端部分,专注于产品质量和安全性等话题,降低价格折扣和其他促销手段的优先级。
通过仅使用 8 个 KNIME 节点(请参见图 5.57中的完整工作流),我们提出了一种简单的客户细分方法,并初步提出了如何在个性化体验中驱动最大价值的建议。通过将我们的合作伙伴(在本例中是 CRM 管理员)的业务专业知识与数据和算法的力量(如 K-均值)结合起来,我们能够实现这种神奇的效果!

图 5.57:使用聚类进行消费者细分的完整工作流
总结
在本章中,你亲自触摸到了数据分析和机器学习背后巨大的潜力。你通过让数据和算法发挥作用,解决了三个现实世界中的问题。
在第一个教程中,你成功地预测了房地产租赁价格,准确度相当不错,并在此过程中收集到了一些关于房地产价格形成的有趣见解。你现在已经掌握了一种经过验证的方法论,基于线性回归模型,可以在许多商业案例中复制应用,尤其是在需要预测数值量的场景中。
在第二个教程中,你进入了分类和倾向建模的迷人世界,亲身体验了数据分析在营销中的变革性作用。你能够组建几个分类模型,满足多个业务需求。首先,你通过构建和解释决策树模型,揭示了使产品对客户普遍具有吸引力的“潜规则”。然后,你构建了一个随机森林模型,有效预测了个别银行客户的倾向水平。最后,你成功估算了进一步营销活动的可能 ROI,为企业创造了巨大的价值机会。同样,在此过程中,你还掌握了一系列通用技术,可以在每次需要预测与业务相关的任何内容时轻松重新应用。通过完成这个教程,你还体验到了调整机器学习模型以适应业务需求所需的“反复迭代”过程。
在我们的第三个教程中,你体验了无监督学习的强大功能。你能够组建一个有意义且简洁的客户细分模型,这可以用来设计个性化的沟通策略,并最大化整体客户价值。有了这个新的算法 k-means 在你的“背包”中,你可以潜在地对任何事物进行聚类:商店、产品、合同、缺陷、事件,几乎任何可以从聚类算法带来的整洁性中受益的业务实体。想一想,通过将这一新概念应用到你日常处理的工作项目中,你能创造出什么样的价值。在学习 k-means 的过程中,我们还接触到了异常值这一基本统计概念,并且看到了如何系统地识别和处理异常值。
现在让我们继续前进,学习如何通过自助式仪表板将我们的数据呈现给业务伙伴。是时候认识我们在数据分析旅程中的下一个“旅行伙伴”:Power BI。
第六章:开始使用 Power BI
将数据可视化以理解业务中“发生了什么”:这是组织在利用数据时最初且始终存在的需求。毫不奇怪,商业智能应用程序是公司最早采用的工具,它们往往比“更炫酷”的高级分析工具提前数月(甚至数年)出现。尽管我们可以—可以理解地—对由机器学习算法驱动的预测和指导能力感到兴奋和迫不及待,但一个简单的在线仪表板,展示关键业务指标的演变,往往能在短期内占据主导地位。让更多员工接触到数据将增加识别商业机会的概率,并促使业务经理做出更为有意识和有效的基于数据的决策。这个场景太具吸引力,无法被忽视,现在是时候为我们的数据分析工具箱增加一款能释放描述性分析潜力的工具了:Power BI。
本章将回答以下问题:
-
什么是 Power BI,我该如何开始使用?
-
如何加载、转换和组织数据?
-
如何创建能够互相交互的数据可视化?
-
Power BI 仪表板是什么样的,我该如何创建一个?
在熟悉 Power BI Desktop 用户界面后,我们将一步步构建一个完整的仪表板。最终目标是让你在读完最后一页时,具备创建自己仪表板的所有能力。本章的重点是 Power BI 以及你开始使用它所需的基础内容。接下来的两章将帮助你提升数据可视化和讲故事的能力,让你能够制作出能够有效说服他人的数据图表。一件事一件事地来:现在让我们认识一下我们在数据分析探索中的新英雄。
Power BI 简介
Power BI是微软提供的一项商业智能服务,允许创建在线数据仪表板。让我们来看看它的最基本功能:
-
Power BI 附带一款传统的应用软件,叫做Power BI Desktop,你可以免费下载并安装到你的计算机上。Power BI Desktop 提供了 Power BI 的完整设计功能:你可以使用这款软件创建仪表板,保存为本地文件(.pbix 格式),然后与其他用户分享,后者也可以查看和编辑你的仪表板。为了完成本章内容,你只需要使用 Power BI Desktop 应用程序。
-
需要知道的是,Power BI 主要作为云服务提供。如果您决定在公司大规模使用 Power BI,以利用企业数据源并通过浏览器或移动应用程序在线提供仪表板(无需所有用户安装 Power BI Desktop 并通过电子邮件打开共享的文件),那么您可以通过购买 Pro 或 Premium 许可证来实现。这样,您的仪表板将依赖于 Microsoft 云平台 Azure 来托管、处理并将数据提供给最终用户。
如果您的公司使用 Microsoft 365 云服务,您可能已经拥有 Power BI Pro 许可证:值得检查一下这一点。
-
Power BI 利用一个用户友好的 可视化界面,让您无需编写任何代码即可设计仪表板。不过,如果您想指定高级查询,可以使用一种编程语言 DAX,即 数据分析表达式(Data Analysis eXpressions)的缩写。本书中不会涉及 DAX,但了解如果需要,您可以利用它来扩展 Power BI 的功能。
-
Power BI 提供的功能远不止简单的数据可视化。它允许您从不同的来源提取数据,转换并统一表格,应用一些逻辑和算法,并通过互动图表或其他非传统方式使数据变得可访问。例如,Power BI 的一个显著功能是让用户可以通过用简洁的英语输入问题来获取数据,比如 X 品牌在过去两年的利润变化是什么? 在这种情况下,您作为设计师的角色将是“教” Power BI 如何理解同事们的问题,例如决定哪些词可以作为同义词来描述相同的实体(例如,文章、SKU 和 产品)。
-
Power BI 可以通过额外的功能和可视化效果来扩展。您可以访问 Microsoft 应用商店 AppSource(appsource.microsoft.com),在这里您可以免费下载额外的自定义可视化效果。扩展 Power BI 功能的另一种方式是添加 Python 或 R 代码片段,以便实现专业图表或增加机器学习功能。
总的来说,Power BI 承诺成为一个强大且全面的工具,通过易于访问的仪表板帮助公司实现数据民主化:这正是我们所需要的,可以完成我们的数据分析工具箱,并为我们的业务释放可观的价值。在探索其用户界面并熟悉命名约定之前,让我们先在你的计算机上启动 Power BI Desktop。你可以从下载页面 (powerbi.microsoft.com/en-us/downloads) 获取并安装它,或者在 Windows 的 Microsoft Store 应用中查找它。虽然本章并不要求,但你也可以注册一个免费的 Power BI 许可证。这将使你能够访问基于云的服务,并将报告保存在云端(与他人共享则需要购买付费许可证)。
走进 Power BI
在 Power BI 中构建一个可用的仪表板需要经过四个基本步骤:加载数据、转换数据、定义数据模型,以及利用数据模型创建数据可视化。如图 6.1所示,这四个步骤交替进行,形成一个循环——你的仪表板可能需要几次迭代才能准备好投入使用:

图 6.1:典型的 Power BI 设计流程:加载数据并转换数据,定义模型,构建可视化,并进行迭代
这个过程的每个步骤都依赖于应用程序中的某些特定视图或对话框。通过仅使用少量视图,你就能访问构建仪表板所需的所有功能。图 6.2展示了一个简单的“地图”,标明了在哪里可以找到最有用的 Power BI 视图和窗口,以确保你在过程中不会迷失方向:

图 6.2:感觉迷失了吗?这里是你在 Power BI 中找到最有价值视图的地方
在接下来的几页中,我们将带你完成创建仪表板的完整过程,并探索那些在过程中将帮助我们的关键 Power BI 功能。
加载数据
不出所料,您在 Power BI 中需要做的第一件事就是加载一些数据。如果您直接点击欢迎屏幕上的获取数据,或者点击顶部主页功能区中的图标,您将进入获取数据窗口,如图 6.3所示。这个窗口展示了多种可能的数据连接器,并按左侧显示的类别组织(文件、数据库、在线服务等)。第一类也是最常用的类别是文件:在这里,您不仅可以导入 Excel 或 CSV 单个文件,还可以导入整个文件夹,甚至可以从 PDF 报告中提取数据。从数据库类别中,您可以连接到许多类型的数据库,并指定 SQL 查询来获取所需数据。在这里,您还可以连接到基于云的平台,如 Amazon Web Services(Redshift)、Google Cloud Platform(BigQuery)以及当然的 Microsoft Azure。在线服务类别让您可以连接到其他外部服务,比如 Google Analytics、Salesforce 报告和 Sharepoint 列表。也可以查看其他类别:名为Web的源让您可以从网页抓取数据,并下载感兴趣的表格或其他网页元素。

图 6.3:Power BI 中的获取数据窗口:定义如何获取所需的数据
通过设置数据连接器,您定义了一个可重复的流程的第一步,用于获取和转换您感兴趣的数据:在 Power BI 中,这样的流程被称为查询。定义查询是一种强有力的方式,可以确保您的仪表板能够持续更新。每次刷新报告时,查询都会连接到各个数据源,并拉取最新版本的可用数据。
转换数据
对于每个查询,您可以关联一系列的数据转换步骤,这些步骤将在每次新数据到达时应用。在 Power BI 中,您可以通过一种名为Power Query 编辑器的工具以可视化方式完成此操作,无需编写任何代码,如图 6.4所示。在查询编辑器的左侧,您会看到一个名为查询的面板,您可以从中选择要设置转换步骤的查询:只需点击您希望处理的查询名称即可。
你会看到一个类似 Excel 的电子表格视图,位于窗口中间,显示了你转换后的查询的预览。单元格的值是只读的:你无法逐个更改它们,实际上,你在这里的目的是为整张表定义可重复的转换步骤,而不是进行单元格级别的更改。你可以使用电子表格的表头来应用一些转换,例如筛选和排序,类似于你在 Excel 中的操作。在右侧,你会看到一个名为 应用步骤 的面板,其中列出了至今为止应用的转换步骤的有序列表。第一步很可能是 来源,它指示了你加载的原始数据来源的定义。一些转换步骤的右侧会有一个齿轮图标:点击它,你可以编辑该转换步骤的参数。例如,如果查询从 Excel 文件中提取数据,你可以通过点击 来源 步骤旁边的齿轮图标来编辑文件路径。
当你选择一个特定的步骤时,电子表格视图会相应更新,显示执行该特定步骤后的查询预览:这在你想要检查每个步骤中发生了什么时非常有用:

图 6.4:Power BI 中的 Power Query 编辑器窗口:设计应用于每个查询的转换步骤
通过浏览 Power Query 编辑器 窗口顶部的前三个功能区选项卡,即 主页、转换 和 添加列,你可以找到一个包含众多可用转换步骤的菜单。这些转换步骤中的许多与我们在 第二章 和 第三章 中通过 KNIME 使用节点应用的步骤相同。我们来看一下其中最常用的几个。

图 6.5:Power Query 编辑器窗口中的主页功能区选项卡
-
从 主页 选项卡 (图 6.5) 开始,你可以找到 选择列 和 删除列 图标,它们让你筛选列,只保留你真正需要的列。
-
同样,保留行 和 删除行 使你能够减少行数:例如,你可以只保留前 10 行,或删除重复的行。
如果你想根据行的值来筛选行,则需要点击预览电子表格中每列表头右侧出现的箭头。在这里,你还可以使用你喜欢的顺序来排序行。
-
拆分列 图标允许你通过使用分隔符(例如,你可以设置
-为分隔符,将JUN-22拆分为JUN和22)或按字符数拆分字符串,将其分为多个列。 -
分组功能会根据给定的分组定义和汇总逻辑(如求和、平均值或计数)聚合所有行。如果你使用此转换步骤,那么在你的仪表板中将无法使用表格的非聚合版本,因此请谨慎使用此功能。你始终可以通过直接在构建可视化时定义聚合来动态地聚合表格,这是我们大多数时候的做法。
-
合并查询允许你通过应用一次性连接操作来合并查询。在这里,我们会看到在第三章《数据转换》中介绍过的相同连接类型,如内部连接、左外连接、右外连接、全外连接,以及更多类型,如左反连接(这意味着仅保留左侧表中在右侧没有匹配的行)。你可以创建一个新的查询,包含连接的结果,或者用它替代当前查询。
需要注意的是,合并查询功能并不是在 Power BI 中连接具有匹配键的两个表的唯一方式。正如我们将在接下来的几页中学习的,当我们构建数据模型时,我们可以在不静态地一次性连接它们的情况下指定表之间的关系。这意味着只有当你想要运行两个表的最终合并,并接受需要额外空间来保持静态合并版本时,才应使用合并查询。
-
使用附加查询图标,你可以通过将一个表的行添加到另一个表的行底部来连接两个具有相同列的表。
![]()
图 6.6:Power Query 编辑器窗口中的转换标签页
-
转到转换标签页(图 6.6),我们可以看到数据类型下拉菜单,它允许我们选择与列相关联的类型,并尝试进行转换。例如,我们可以使用此功能将包含日期的字符串转换为日期和时间字段。
-
使用替换值,你可以将所有具有某个特定值的单元格替换为指定的新值。你也可以用它来将固定值应用于某一列中的所有空单元格。为此,只需使用
null字符串来指定你想要处理空单元格。 -
填充图标让你可以用表格中上方或下方的值替换所有空单元格。当你有一些按时间排序的值,并且你希望填补空白以填充最近的可用值时,这非常有用。
-
顾名思义,通过使用数据透视列,你可以创建数据透视表,其中列中的值会作为独立列进行汇总。你可能还会发现其反向功能取消透视列有用,它会将表格中的列转换为多行显示。
-
格式图标允许你操作字符串:例如,你可以将字符串首字母大写(将
tessa变成Tessa)或将其转换为全大写格式(TESSA)。 -
使用四舍五入功能,你可以指定小数数字的四舍五入逻辑,按你的喜好设置小数位数。
-
在日期和时间列部分,你可以提取特定的日期和时间字段,如年份、月份、小时和秒。如果你想提取多个字段,可以首先复制该列(右键点击列标题,然后选择复制列),然后根据需要创建多个副本,再将它们替换为所需的字段。
![]()
图 6.7:Power Query 编辑器窗口中的“添加列”标签页
-
在添加列标签页中(图 6.7),你可以通过应用一些逻辑来创建计算列。例如,使用自定义列图标,你可以应用数学公式,如
[价格]*[折扣率],并将其他列中的值作为变量使用。 -
条件列允许你基于对其他列的逻辑条件进行评估,生成一个新的列,这与我们在 KNIME 中使用规则引擎节点的做法类似。例如,你可以为所有价格列大于 2.5 的行创建一个值为
Expensive的新列,为其他行创建一个值为Cheap的列。
当你完成所有必要的转换步骤后,查询将生成恰好符合你需要的形状和格式的表格。完成后,你可以保存查询(点击关闭并应用图标,位于首页标签页),并进入下一个步骤:定义数据模型。
定义数据模型
在这个过程中,你需要定义由查询生成的表格之间的逻辑关系。为此,只需声明表格之间匹配列的关系,即可以在需要时用于合并表格的列。完成这个简单的步骤后,你将定义一个单一的数据模型,随后可以在仪表板可视化中自由使用它。我们这样做是因为一个直接且重要的原因:通过连接匹配键,你可以在同一可视化中使用存储在不同表格中的数据——就像所有表格都已连接,并且可以随时使用,这非常方便。定义清晰的数据模型的一个结果是,你可以通过过滤或选择在图表之间启用交互。例如,假设一个可视化展示了按类别生成的总销售额:点击某个类别名称后,你可以看到另一个可视化展示该类别内最活跃的客户名称,而这些信息存储在不同的表格中。通过知道类别、销售和客户之间的匹配列,Power BI 能够展示用户所需要的数据,并启用深入分析和其他形式的交互。
在 Power BI 中构建数据模型非常轻松。你还记得我们在第三章《数据转换》中介绍过的实体-关系(ER)图吗?(请参考图 3.10复习一下)。Power BI 让你通过使用可用的表格,绘制 ER 图的方式来直观地构建模型。
如你在图 6.8中看到的,模型视图显示了表格(每个表格都来自于查询中声明的完整转换步骤)作为框体:表格名称以粗体显示在框体的顶部,而列则列在框体内。表格通过线条连接,表示它们之间的关系:

图 6.8:Power BI 中的模型视图:连接表格并构建你的 ER 图
通过使用模型视图,你可以轻松地在匹配的列之间声明关系。例如,要在两个不同表格的匹配列之间绘制关系,只需拖放一个列到另一个匹配的列上即可。例如,在图 6.8中,你可以看到如何通过公共列StockCode来建立高亮显示的关系(在 ProductMD 和 Transactions 表格之间)。连接上的箭头表示交叉筛选方向:在这种情况下,对 ProductMD 项目应用的筛选也会筛选 Transactions 中的行,而反之则不会发生。连接器末端显示的1和符号明确了关系的预期基数:图中显示的都是一对多(1-to-)关系,意味着我们期望 ProductMD 中的一行对应 Transactions 中的多行。关系基数的其他可能类型是一对一(1-to-1)和多对多(-to-**)。
当我们完整地进行教程时,数据模型的作用将更加明显。目前需要记住的是,通过定义关系及其基数和交叉筛选方向(所有这些在模型视图中以可视化的方式显示),我们可以确保即使在仪表板中同时使用多个表格时,Power BI 的行为也不会含糊不清。
构建好数据模型后,我们可以进入仪表板创建的最后一个也是最激动人心的部分:设计数据可视化。
构建可视化
Power BI 中的仪表板按一组页面组织,每个页面包含多个互相关联的可视化元素,如表格、折线图、散点图、文本标签和按钮。当你执行这一步时,你需要像设计师一样思考,既要保证结构和视觉效果,又要将业务理解和创造力相结合。这项工作既能充满乐趣,又可能非常耗时:但当你最终拥有一个功能完善、价值高的仪表板,供人们用来发现商业机会并做出优越决策时,它肯定会带来回报。当你打开报告视图(如图 6.9所示)时,你会发现所有需要的工具,来将可视化元素组合在一起,并将它们与底层数据模型中的表格链接起来:

图 6.9:Power BI 中的报告视图:连接表格并构建你的 ER 图
让我们逐一了解报告视图中的每个组件,并学习它们的作用:
-
报告页面:这看起来像一张空白纸,你可以在上面绘制你美丽的仪表板。通过使用鼠标,你可以根据需要放置、调整大小和重新定位可视化元素。在报告页面下方,你会找到一组标签,每个标签对应仪表板的一个独立页面。
根据 Power BI 的官方命名规范,我们在本章中构建的是报告,而不是仪表板:后者是对选定可视化元素的单页汇总聚合功能,仅在 Power BI 服务中可用。为了简便起见,我将在这里继续使用仪表板和报告这两个词来指代我们的最终结果:一组供最终用户交互的连接可视化元素。
-
筛选器:在此部分,你可以通过设置筛选器来决定每个可视化元素显示的数据范围。例如,你可以通过将“类别”列从字段面板拖放到筛选器面板上的一个框中来设置筛选器。你可以使用筛选器仅显示你选择的数据部分,或者实现某些逻辑,比如只显示列表中销售前五的产品。筛选器部分有三个不同的面板,分别对应你希望筛选器操作的级别:有些筛选器仅限于特定可视化元素,而其他筛选器则会应用于页面上所有可视化元素,甚至是整个仪表板中任何可视化元素。
-
可视化元素:这一部分是最有趣的,因为它列出了你可以添加到仪表板中的所有可视化类型。正如你从图 6.10中看到的那样,安装 Power BI 后,你可以使用超过 30 种不同的可视化类型:
![图形用户界面,图表 描述自动生成]()
图 6.10:Power BI 中可用的可视化类型:哪种图表最能让你的数据“发声”?
你还可以通过启用某些测试版功能的预览(前往文件 | 选项和设置 | 选项 | 预览功能进行激活)或从 AppSource 下载它们来添加额外的可视化类型(点击最后一个可视化...图标进行下载,登录 Power BI 后即可访问 AppSource,即使是免费账户也可以)。你可以在图 6.11中看到从那里获取的额外可用可视化类型的预览:
![图形用户界面,应用程序 自动生成的描述]()
图 6.11:创意枯竭了?你可以查看 AppSource 获取更多的可视化类型,并将其添加到你的 Power BI 中。
-
属性:在这一部分,你可以配置你的可视化效果应如何表现和呈现。正如你在图 6.12中看到的,这一部分有三个可用的选项卡,分别是字段、格式和分析。字段选项卡是首先要处理的部分:通过将数据模型中可用的列拖放到该选项卡中的各个元素中,你可以决定哪些数据应当被可视化。根据你使用的可视化类型,你需要配置的元素会有所不同。例如,图 6.12中的示例是一个折线图,其中列Invoice_time控制着横轴的内容,而通过折线展示的数值则由列Quantity控制。在格式选项卡中,你可以使用多个选择器来控制可视化的“外观和感觉”。你可以调节多个可视化属性,从标题到显示在顶部的颜色和线条粗细。最后,在分析选项卡中,你可以启用一些基础的建模功能,比如趋势线(基本上是简单线性回归模型或时间序列预测的结果):
![]()
图 6.12:可视化属性部分:将数据列连接到图表,并决定其显示方式。
-
字段:这个部分位于报告视图的右侧,执行了一个简单但至关重要的功能。它列出了数据模型中不同表格中所有可用的列,使你可以轻松地将这些列拖放到过滤器或属性部分。当你点击任何列时,列工具功能区会出现在窗口顶部。你可以使用它来更改列的数据类型,或设置其默认的聚合方法(如求和、计数或平均值):当你希望在使用这些列进行可视化时,精细调整它们的行为时,这个功能非常有用。
我们做到了!我们已经完成了在 Power BI 中构建仪表板所需的四个基本步骤,并借此机会简要了解了该软件的主要功能。
让我们总结一下我们刚刚看到的内容:一切始于将一些原始数据加载到 Power BI 中,选择并配置获取数据窗口中提供的正确连接器。利用Power Query Editor的丰富功能集,我们将原始数据提升到了一个新的水平,并应用了一系列有序的转换步骤,这使我们得到了多个形状和格式正确的表格(可以随时通过类似电子表格的数据视图预览)。此时,我们使用模型视图将所有这些表格连接在一起,定义匹配列之间的关系,构建了一个统一的数据模型。最后,我们打开了报告视图,在这里我们找到了构建仪表板所需的所有元素(表格和可视化)。现在是时候在接下来的教程中,看看这个过程如何通过从零开始构建一个完整的 Power BI 仪表板来实际操作了。
教程:销售仪表板
本教程将带我们回到一个熟悉的业务,这个业务我们已经变得非常熟悉并且喜爱:这是一家位于英国的在线零售商,销售各种场合的礼物。通过使用 KNIME 自动化每周的 Excel 报告(我们在第三章,数据转换中做过的事),我们获得了相当的声誉,这也把我们再次推到了聚光灯下。随着业务的不断增长,对使更多员工能够使用描述性分析的需求也在扩大。更新一些回答固定问题的 Excel 报告已不再足够。我们希望能够提供机会,让同事们深入了解按季度、国家和产品层级的详细信息,以便他们能够“探索”数据并发现有趣的洞察。
在财务分析师的帮助下(他仍然对我们充满感激)并且在采访了一些经理,了解他们最常见的需求后,我们已经准备好总结出每个用户组的需求,具体如下:
-
所有经理应能够一目了然地看到各类别和子类别在总收入中的相对权重,并看到每个产品组随时间变化的销售演变情况。
-
市场经理应该能够分别查看国内(英国生成的)和国际销售数据,能够按国家和类别深入分析,并相应地规划针对特定国家的数字营销活动。
-
类别经理应有机会按类别深入分析,识别出每个季度和每个国家销售最多的商品。
数据遵循我们在图 3.10中遇到的相同模型,并通过三个独立的文件提供给我们:SalesDashboard-CustomerMD.csv和SalesDashboard-ProductMD.csv分别包含客户和产品的主数据表,而SalesDashboard-Transactions.xlsx则包含最新的交易数据(这次,所有数据都包含在一个文件中)。
现在是时候启动 Power BI Desktop 并在我们的计算机上运行,开始创建任何仪表板的第一阶段:加载所需数据:
-
首先,我们加载存储在文本文件中的客户主数据,该文件为逗号分隔值文件。为此,点击获取数据图标,该图标位于主页功能区选项卡上,然后选择文本/CSV作为数据源类型,再点击连接。此时,您将看到一个对话框,您可以选择用于作为数据源的文件,在我们的例子中是
SalesDashboard-CustomerMD.csv。此时,您将看到文件中记录的表格的预览(图 6.13)。Power BI 已正确识别其格式:有两列,列标题以粗体显示在顶部。看起来一切正常,不需要更改任何设置(例如,您可以看到逗号正确地用作列分隔符),所以我们可以点击加载以完成此步骤:![]()
图 6.13:客户主数据源的预览。您可以从窗口中的菜单中修改导入设置。
-
我们可以重复相同的过程(获取数据然后选择文本/CSV)来加载产品主数据表。这一次,预览窗口(图 6.14)显示列名未被正确识别,而是被分配了一些默认标识符(Column1,Column2,等等)。这需要进行一些小的转换,才能在我们的数据模型中使用此表格。因此,这次我们点击底部的第二个按钮,转换数据:
![图形用户界面,文本 自动生成的描述]()
图 6.14:产品主数据表的预览:列标题未被识别
-
点击转换数据后,我们要求 Power BI 为查询添加一些转换步骤,以注入产品主数据表:这是Power Query 编辑器的工作,它的窗口将会出现。在这种情况下,唯一需要的更改是将 CSV 文件中读取的第一行提升为表格的列标题。为此,点击将第一行用作标题按钮,该按钮可以在主页功能区菜单中找到(请参见图 6.15中的箭头作为指南)。完成后,右侧的应用的步骤列表将增加一个提升标题步骤:这意味着每次加载新数据时,Power BI 都会作为查询的一部分执行此步骤。我们可以点击左上角的关闭并应用图标,继续下一步:
![]()
图 6.15:产品主数据表的 Power Query 编辑器。我们需要将第一行用作标题
-
包含交易的表格存储在 Excel 文件中。要加载它,您可以点击常规的 获取数据,然后选择 Excel,或者直接点击 首页 功能区菜单中出现的 Excel 图标。随后,您将看到一个对话框,您可以预览 Excel 文件中各个工作表包含的表格(图 6.16):
![]()
图 6.16:Excel 预览对话框:选择您要从 Excel 文件导入的表格
此外,在这种情况下,我们需要向查询中添加一些转换,因此勾选左侧的
Transactions复选框,然后点击 转换数据,这将打开 Power Query 编辑器。当我们查看“交易”表的预览时,我们注意到至少需要进行两次转换才能使其可用。首先,Invoice_time 列看起来不对,因为它没有被识别为日期和时间字段。其次,由于我们的业务需求大部分要求分析收入,而我们每个交易只有单价 Price 和 Quantity 两列,因此我们需要实施一个简单的数学公式,通过乘这两列来获得收入。让我们看看 Power Query 编辑器 如何帮助我们解决这两个问题。
-
如果您查看电子表格视图的标题,您会注意到在每个列标题的左侧,可以找到一个图标,表示其数据类型。例如,靠近 StockCode 的 ABC 图标告诉我们它是文本字符串,而靠近 Price 的 1.2 图标表示它是一个十进制数字。如果您点击这些图标中的任何一个,您将看到一个弹出菜单(图 6.17),在这里您可以强制转换为不同的数据类型。Power BI 将尝试将其转换为您所希望的类型。让我们对 Invoice_time 列进行操作:点击其左侧的类型图标并选择 日期/时间(如果弹出窗口询问是否替换当前查询步骤或添加新步骤,选择第一个选项)。您会注意到电子表格视图现在显示了日期和时间,这正是我们想要的:
![图形用户界面,应用程序,表格 描述自动生成]()
图 6.17:Power Query 编辑器中的列类型选择:通过做出正确选择转换列
-
下一步是添加一个新列,包含每笔交易产生的收入。为此,进入 添加列 功能区菜单,然后点击 自定义列 图标。您将看到如 图 6.18 所示的窗口,在这里您可以定义表达式,类似于我们在 KNIME 中使用 数学公式 节点的操作。可用的列显示在右侧:双击 数量 使其出现在 自定义列公式 框中,然后在键盘上输入
*,最后—双击右侧的 价格 列。这样,您将得到表达式[数量]*[价格],这正是我们计算销售额所需要的。现在,您可以通过在顶部的 新列名称 框中输入销售额来指定列名,然后点击 确定 按钮:![]()
图 6.18:在 Power BI 中添加自定义列:使用列作为变量定义数学公式
您会自豪地发现,新计算出的列 销售额 出现在电子表格视图的右侧。然而,它的数据类型仍未定义,您会在标题的左侧看到一个模糊的 ABC123 图标。您可以通过点击该图标并选择 小数 快速解决此问题。
始终声明列的数据类型。这样,列可以在您的仪表板可视化中得到最优化使用,并且也能得到适当的聚合。数值列默认在 Power BI 中通过求和聚合,但您可以随时更改每列的聚合函数。为此,进入 数据 视图(请参见 图 6.2 查找它),选择一列,并使用 汇总 下拉菜单,该菜单位于 列工具 功能区(对于数值列,您可以选择 求和、平均值、最小值、最大值、计数 和 唯一计数)。
完成此步骤后,您将看到,在 Power Query 编辑器的帮助下,您创建了一个包含七列的表格,如 图 6.19 所示。在右侧的 已应用步骤 面板中,您可以找到所有需要进行的转换的排序列表(例如获取存储在 Excel 中的数据、添加列、修改其类型等),以生成您想在仪表板中使用的表格。您可以点击每个步骤以“回到”转换流程的那个阶段。您还可以删除任何步骤(点击当选择特定步骤时出现的左侧 X 图标)或编辑它:例如,您可以通过点击 已添加自定义 步骤右侧的齿轮图标来更改我们添加的自定义公式定义:
![表格 描述自动生成]()
图 6.19:您的交易表的完整查询定义:Power Query 编辑器是您在 Power BI 中进行可重复数据转换的得力助手
尽管大多数转换通常是在添加新数据源时定义的,但您可以稍后通过重新打开 Power Query 编辑器视图来编辑查询(点击转换数据图标,位于主页功能区菜单中)。
要继续操作,请点击左上角的关闭并应用图标,我们就可以进入仪表板创建过程的下一个阶段:定义数据模型。
-
如果您进入模型视图(点击 Power BI 主窗口左侧工具栏中的第三个图标),您会看到一个熟悉的界面:由我们三张表组成的数据库的 ER 模型(请回到前几页,查看图 6.8,它展示了数据模型视图的截图)。Power BI 自动识别了表之间的关系并建立了连接,无需我们的干预。当然,在这个案例中比较简单,因为匹配的列正好具有相同的名称和类型。无论如何,我们可以通过使用模型视图手动声明或编辑表之间的任何关系。我们可以通过“拖放”一个表中的列到另一个表中的列来创建新的关系。要编辑现有连接,您可以双击连接两张表的线条。点击产品主数据与交易表之间的关系:您将看到编辑关系视图,如图 6.20所示。下拉菜单让您选择要连接的两张表,而您可以通过点击中间显示的预览表来指定匹配的列。在我们的案例中,我们注意到两个表中的StockCode列都被高亮显示,这正是我们想要的。左下角的基数下拉菜单让您选择关系的类型(多对一、一对一、一对多或多对多):通过这样做,您是在告诉 Power BI 第一张表中的多少行应与第二张表中的多少行匹配。在这个案例中,我们选择多对一,因为多个交易(第一张表)可以对应同一个产品,因此对应到产品主数据表(第二张表)中的一行。您可以将交叉过滤方向下拉菜单保持在默认值(单向,这是推荐的设置,因为大多数情况下,性能更佳)。由于所有默认选项在此案例中都能很好地工作,因此我们无需做任何更改:点击确定并继续:
![]()
图 6.20:在数据模型中管理表之间的关系:哪些列应该匹配?
在 Power BI 中,两个表之间的活动关系只能通过一对匹配的列来定义。如果你希望在两个表之间匹配多个列,你需要进行一个简单的变通方法:进入Power Query 编辑器(点击常规的转换数据图标),选择你想要作为单一键值使用的两个或多个列,然后从转换菜单中点击合并列。在另一个表上也进行此操作,之后你就可以在合并的列之间创建关系了。
-
双击连接事务表和客户主数据表的关系线,检查这两个表之间的其他关系。确保匹配的列是Customer_ID,基数是多对一,并且交叉过滤方向是单向。然后点击确定,你的数据模型就准备好了!
此时,我们已经准备好进入最后一个阶段,对一些人来说,这是最令人兴奋的部分:通过一步步构建可视化内容来设计你的仪表盘。许多人在第一次创建数据仪表盘时常犯的一个错误是,在没有明确目标的情况下,直接跳入制作五彩斑斓的图表。我的建议是,始终花一些时间后退一步,思考你具体的业务需求,并简单地勾画出仪表盘的样子。考虑你的最终用户可能提出的问题,并思考如何有效地引导他们找到所需的答案。如果有机会,可以将你的草图(或用你熟悉的任何软件制作的数字原型)展示给一些最终用户,听取他们的初步反应。你会发现,早期在仪表盘规划上的投入(此时不需要细节,简单的内容概览就足够了)会在后期避免一些昂贵(且令人沮丧)的返工,从而带来回报。
当你从事大型描述性分析项目时(比如从零开始构建公司的商业智能应用层),规划阶段变得尤为关键。在这种情况下的建议是,保持敏捷思维,并在小规模(但总是经过良好规划的)迭代中工作,每一步都逐渐添加功能。另一个建议是,确保及早与业务伙伴(代表仪表盘的最终用户)合作,共同设计功能,而不是等到完成后才展示最终产品。
对于我们的销售仪表板,我们需要制作一个概览页面,其中必须包含按类别和子类别划分的销售情况。条形图和树图可以很好地展示每个产品元素的相对大小(此时不用担心可视化类型;我们将在下一章学习如何选择最佳的图表类型)。折线图将有助于展示随时间变化的趋势,同时,将销售分布可视化到世界地图上,可以揭示任何地区性模式。最后,用户需要能够选择特定的年份范围,并选择是否只查看国内销售(在英国生成的),或者国际销售,或两者都有:需要添加一些筛选器,提供简单的方式来过滤感兴趣的数据。考虑到最终用户的需求,我们设计了你在图 6.21中看到的草图:在这一阶段,我们有意远离完美,但至少我们可以自信地继续构建可视化,知道我们正在为之努力的目标是什么:
![]()
图 6.21:销售概览仪表板页面的粗略草图:在创建任何图表之前,最好先决定你需要可视化的数据,以满足你的业务需求
-
转到报告视图(主窗口左侧垂直栏上的第一个图标)。在右侧的可视化面板中(显示不同图表类型的所有图标),点击带有水平条形图的图标(其工具提示标签,在鼠标停留一秒钟后显示,标注为堆积条形图)。此时报告页面上会弹出一个空框:这是我们条形图的占位符。现在我们需要告诉 Power BI,想让这个条形图展示哪些数据。正如图 6.22中的箭头所示,我们需要将数据模型中可用的列(在右侧的字段面板中列出)拖放到可视化的属性面板中。更具体地说,类别列(在“产品主数据”组中找到)应该被放入属性面板中的轴框中,而销售列(在“交易”表中)应该被放入值框中。一旦这样做,条形图会神奇地出现在左侧,你的第一个 Power BI 可视化就完成了!我们可以通过格式面板(带有油漆滚轮图标)来改变新创建的可视化的外观与感觉(更改颜色、标题、字体、标签等),但目前我们专注于构建仪表板的其余部分,接下来我们将继续制作以下图表:
![]()
图 6.22:在 Power BI 中构建条形图:选择用于轴类别和条形高度的列
-
按照草图的要求,我们现在添加一个树状图:它将显示每个类别/子类别组合在销售方面的相对大小。在报表页面中点击一个空白区域,然后点击树状图可视化图标。为了构建这个可视化,拖动并将感兴趣的字段放入右侧的属性框中(图 6.23):Category 应放入Group,Subcategory 放入Details,Sales 放入Values。到目前为止,你应该已经掌握了在 Power BI 中构建图表的精髓:我们决定需要哪种类型的可视化,然后将数据列与该类型图表可用的不同属性字段连接:
![图表,树状图 描述自动生成]()
图 6.23:树状图可视化:显示每个组和子组的相对大小
你会注意到每个图表的边缘和角落都有一些灰色的控制手柄。利用它们调整图表大小,必要时移动图表,以便将其放置在你喜欢的位置。根据草图的指引,开始将可视化放置到合适的位置。
-
接下来要添加的可视化是一个折线图,显示随时间变化的销售情况。在报表空间中点击一个空白区域,然后点击折线图图标。你可以使用Invoice_time作为控制图表轴的列,而Sales则决定要可视化的数值。Power BI 默认只使用时间层次结构的顶级:这意味着一开始,图表将显示按年份汇总的销售数据,只显示 2017-2019 范围内每年的三个值。由于我们想按月显示销售演变,因此需要通过点击可视化右上角的分支箭头,展开时间层次结构的下级(参考图 6.24)。下一级显示按年份/季度的拆分,但这还不够,因为我们想进一步细化到年份/月,因此你需要再次点击图标:此时,图表的标题将变为按年、季度和月份的销售情况,这表明我们已经得到了所需的结果:
![]()
图 6.24:构建折线图显示随时间演变:你可以根据需要点击图表右上角的箭头图标,以在年份/季度/月/天的层次结构中导航
-
我们销售概览页面中的下一个图表是世界地图,显示各国的销售情况。好消息是,Power BI 会自动识别表格中的地理名称,简化了创建地图图表的过程。点击报告中的空白区域,然后点击地图可视化(图标看起来像一个地球仪;不要和填充地图混淆,后者显示的是美国的简图)。如图 6.25所示,将国家列(来自客户主数据表)拖到位置框中,然后使用销售额来控制气泡的大小。现在,你可以看到一张世界地图,展示收入的来源地:不出所料,最大的气泡出现在英国,考虑到本地客户的普遍存在。
描述自动生成](https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_25.png)
图 6.25:完整的地图图表:Power BI 能识别国家、州和城市等位置,使得构建数据丰富的地图变得简单。
在地图可视化中(与 Power BI 中的任何其他图表一样),当你将鼠标悬停在可视化元素上(在这种情况下,是地图上的气泡)时,默认会显示一个工具提示标签,提供该特定元素的精确值(例如,某个国家的总销售额)。许多图表类型允许你通过将字段添加到工具提示框中来控制在工具提示中显示的内容。
-
现在是时候添加一些切片器,让用户选择要在页面上显示的内容。第一个切片器将控制时间维度:我们希望允许用户将销售概览页面上的所有可视化内容限制在特定的时间范围内,以便他们能够在给定的时间段内按类别、子类别或国家评估销售情况。为此,只需要添加一个切片器可视化,并将发票时间列拖到字段框中,如图 6.26所示。切片器在 Power BI 中非常受欢迎:你可以根据需要添加多个切片器,并将多个字段组合成一个切片器,以便进行多层次的选择。例如,我们可以将类别和子类别结合起来,这样用户就可以在选择关注的内容时浏览整个产品层级。
描述自动生成](https://github.com/OpenDocCN/freelearn-ds-zh/raw/master/docs/da-md-ez/img/B17125_06_26.png)
图 6.26:Power BI 中的切片器:可视化过滤你的数据,以便集中关注最重要的内容。
-
根据我们的草图,我们的第二个切片器应该区分国内销售和国际销售。由于我们没有一个指定客户所属组别的列,因此我们需要添加一个新的列来满足这一需求。Power BI 提供了条件列:这些是计算列,通过应用一组逻辑规则(比如一组if-then 语句)来确定每一行的值。你会注意到,这与我们在 KNIME 中使用的规则引擎节点非常相似。要在 Power BI 中添加条件列,我们需要通过点击首页功能区上的转换数据图标返回到 Power Query 编辑器窗口。在左侧的列表中选择客户主数据查询后,我们可以通过进入添加列功能区并点击条件列来添加列。系统会弹出一个类似于图 6.27所示的窗口:在顶部的文本框中选择新列的名称后,我们可以定义一个或多个if-then 语句,利用如等于、大于、包含等操作符。通过点击添加语句按钮,你可以附加其他条件,并且还可以指定当没有条件满足时使用的默认值(底部的Else框)。在我们的案例中,我们只希望新列(我们可以将其命名为Type)在Country为
United Kingdom时显示Domestic,在其他任何情况下显示International:![Graphical user interface, text 自动生成的描述]()
图 6.27:添加条件列:定义一组逻辑语句来控制列的值
-
现在我们有了新的列Type,我们可以按照我们为时间切片器所采用的相同步骤,添加一个新的切片器,并将新的条件列拖到字段框中。
-
现在,我们可以通过进入插入功能区并点击文本框图标来给页面添加标题。我们可以输入任何文本(在这个例子中,我们输入页面标题
Sales Overview),并调整字体大小和样式来使其看起来更好。通过拖动所有可视化图表并根据我们的原始草图重新排列它们,我们获得了图 6.28所示的页面:![]()
图 6.28:销售概览页面:对于我们的第一个 Power BI 创建作品,表现得相当不错!
该页面在其简洁性上已经足够吸引人:它包含了几个可视化图表,展示了我们在线零售业务中的关键维度。切片器允许用户在特定的时间框架或国家范围内筛选分析数据。非常重要的是,这些可视化图表彼此互联:用户可以与某个可视化元素互动,导致其他可视化图表重新排列其范围。例如,尝试点击第一个类别柱状图中的任意一条柱子:折线图将显示该特定类别的销售演变,世界地图会重新排列气泡的大小,只考虑该特定国家的收入。如果我们从右上角的树状图中选择一个子类别,同样的事情会发生,所有其他可视化图表将显示该子类别的详细信息。这非常强大,因为我们让用户自主发现数据,根据自己的需求定制视图,而不是直接提供现成的数据分析体验。
在 Power BI 中,你可以通过按住CTRL键一次选择多个元素。尝试按住CTRL键并点击柱状图中的两个不同类别:这两个类别的销售数据将在折线图中聚合在一起。你还可以使用此功能在不同的可视化图表之间切片数据。例如,点击地图图表中的一个气泡,并且在按住CTRL键的同时,点击树状图中的一个子类别:折线图将显示你从世界地图中选择的特定国家/地区的该子类别的销售时间演变。
由于各个图表之间是互动的,我们可能需要微调和修改它们的动态行为。例如,如果你点击柱状图中的任何一个类别,树状图会高亮你的选择,意味着其他所有类别的颜色将会变淡。如果我们希望树状图有不同的反应呢?我们想要它不是高亮柱状图中选择的类别,而是仅显示那个类别并过滤掉其他所有类别吗?让我们把这个挑战当作一个机会,来看看如何在 Power BI 中改变不同可视化图表之间的交互行为。
-
转到格式功能区菜单(当你选择任何图表时会出现),然后点击左侧的编辑交互图标。通过点击可选择控制其他可视化的图表(我们可以称之为前置图表)。在我们的案例中,点击显示按类别分销销售的条形图。这样,树形图图标的右上方将出现三个图标(确保调整图标大小,以便看到这三个图标)。点击这些图标(见图 6.29),你将决定当选择前置图表时,树形图如何响应:筛选图标将使该可视化筛选掉其他数据并“聚焦”于选择;高亮图标(默认行为)将使该可视化通过不同的颜色强调前置图表上应用的选择;无图标将断开连接,使树形图完全“独立”于条形图的任何选择。在我们的案例中,我们点击筛选图标(这是我们想要的行为),然后再次点击编辑交互图标返回到正常编辑模式:
![]()
图 6.29:更改可视化交互行为的三个步骤:点击“编辑交互”,选择前置图表,然后点击随后的所有可视化上的行为图标(筛选、高亮或不做任何操作)
并非所有的可视化类型都允许我们在本示例中看到的三种交互方式。例如,折线图只允许筛选和无交互。
通过查看原始需求集,我们意识到需要更多的可视化来完成我们的目标。市场营销和类别经理需要超越现有的可视化概览,访问一些更详细的表格展示。我们决定通过添加一页名为“销售详情”的页面来完成仪表板,并配备符合我们剩余需求的一些表格。
-
点击报告视图底部的+符号:这将向你的仪表板添加一个空白的新页面。你可以通过右键点击页面标签并选择重命名页面来重命名每个页面。
-
让我们在新页面上添加一个矩阵可视化(不要与我们稍后使用的表格可视化混淆)。现在,将以下字段添加到各个框中:先将类别放入行框,然后在其下方放入子类别。接下来,将发票时间拖到列框中,最后,将销售额放入值框中。
-
此时,表格仅显示产品和时间层级的顶层(如图 6.30所示),因为这是其默认行为。为了使其对我们的业务用户更有用,我们需要通过点击可视化右上角的分支箭头来扩展这些层级(参见图 6.30中的步骤 2)。完成行的扩展后,使用钻取下拉菜单选择列(参见图 6.30中的步骤 3),然后再次点击分支箭头(就像我们之前对行所做的那样)。现在,你已经获得了一个相当丰富的表格,显示了按类别和子类别分的季度销售情况:
![]()
图 6.30:构建矩阵可视化:选择要使用的字段,并决定行和列的聚合级别
-
为了使矩阵图表更易于访问,我们可以微调一些设置,移除一些不必要的数字。进入格式面板(带有油漆滚筒图标的面板),在选项列表中向下滚动,打开小计视图,并关闭列小计,因为我们不需要年度总和(参见图 6.31中的步骤 1)。然后向下滚动,打开字段格式视图:在这里,将值的小数位数设置为
0,这样我们就去除了所有不必要的小数值,这些值只会增加杂乱(参见图 6.31中的步骤 2):![图形用户界面,应用程序 自动生成的描述]()
图 6.31:移除矩阵可视化中的杂乱:停用列小计并移除小数位
-
让我们添加一个新可视化,以便用户根据需要专注于国内或国际销售。这一次,添加一个圆环图,并按如下方式设置其字段(我们无需查看截图,因为这个过程现在应该已经非常熟悉):将列类型设置为图例,将销售设置为值。
-
为了完成我们的详细视图,我们将显示按国家和商品汇总的销售情况。首先,从国家开始:添加一个表格可视化,并将国家和销售列直接拖放到其中(只需确保按照指定顺序,先国家,再销售)。通过点击新表格可视化中的销售标题,按销售额降序排列国家销售,这是我们想要的结果。
-
为了添加商品详情,让我们再实现一个表格可视化,然后按照以下顺序拖放以下列:描述、数量和销售。同样,像之前做的那样,点击表格可视化中的销售标题,将畅销商品排在列表顶部。为了避免杂乱,请移除这里和前一个表格中的小数位,使用字段格式 | 值的小数位数选择器,就像我们对矩阵视图所做的那样。
-
我们也应该给这个页面加个标题。去插入功能区菜单,点击文本框图标并写入
销售详情。为了保持一致性,尽量使用和第一页相同的字体大小和类型:![]()
图 6.32:销售详情页面:我们的 Power BI 仪表板现在已经完善,可以查看到更精细的国家和产品详情
我们终于完成了:你刚刚整理出来的第二页(见图 6.32)很完美地填补了我们之前的空白。用户现在可以深入查看子类别/季度/国家组合(只需点击表格标题,按住CTRL键过滤到所需的组合),并检索到各个业务细分中的畅销商品。
当你在 Power BI 服务中发布你的新仪表板(如果你有账户,即便是免费账户,去主页功能区菜单,点击发布图标试试看),并将其 URL 分享给同事时,你会突然成为他们的英雄!他们现在可以通过任何浏览器访问所需的数据(见图 6.33),并自主深入到他们最感兴趣的业务部分:

图 6.33:在 Power BI 服务上发布后的销售概览页面的浏览器视图:我们的仪表板在云端看起来很棒
在旅行中,我们的同事甚至可以在路上查看销售结果:你可以在图 6.34看到我们仪表板在智能手机上 Power BI 应用中的样子:

图 6.34:通过 iPhone 上的 Power BI 应用访问的销售详情页面:你几乎可以在任何地方访问你的数据
仪表板的维护相对轻便,因为所有可视化的更新现在可以轻松地每天进行。我们定义的各种查询知道从哪里获取数据以及需要哪些转换步骤。当有新数据出现时,只需点击刷新图标(位于主页功能区菜单上),刷新仪表板,整个仪表板就能保持最新状态。
你不仅通过一个可持续的、现在可以轻松重复的过程,最终让公司内销售数据的访问实现了民主化,而且你还为财务分析师节省了很多宝贵的时间。她不再需要回答那些她以前经常收到的“临时”问题,这些问题迫使她每次都要进行繁琐的手动数据提取。由于数据现在随时可用,人员可以更快、更方便地自己去获取所需的信息,从而将更多的时间交还给我们的财务分析师,让她可以进行更高级的分析。这是一个真正的双赢,你应该为能够促成这一切感到非常自豪。
总结
完成本章后,你已经为你的数据分析师背包中添加了另一个宝贵的工具:Power BI。你已经学习了如何加载数据,并建立一套数据清洗和转换的常规步骤,使这些数据变得有用。你已经看到了如何定义连接所有表格的关系,从而形成一个统一且连贯的数据模型。你还了解到如何构建互联的可视化图表,允许用户进行交互。你已经创建了一个仪表板,使得业务用户能够在需要时探索他们所需的数据,捕捞洞察力并揭示商业机会,完全独立。
现在,想想公司数据库中(甚至是存储在个人笔记本上的 Excel 文件中)那些大部分未被利用且无法访问的数据。通过一个简单的仪表板将这些数据以可视化方式呈现出来,待解锁的商业机会是巨大的,并且在很多情况下,通过像 Power BI 这样的工具,可以轻松实现:你在本章中所学到的知识可以让你成为许多人心中的英雄。
在下一章中,我们将学习一些实用的指南,以提升我们的数据可视化技能:目标是让我们从现在开始,充分利用每一个图表。
第七章:有效地可视化数据
一图胜千言,这句古老的格言常被引用。视觉表达通常是传达数字信息的首选方式。正如你从自己的经验中可以验证的那样,数据图表在商业备忘录、演示文稿、报纸文章和科学论文中无处不在。然而,从表格中的数据转化为图形表达(这一过程称为数据可视化)远非简单且无风险。尽管许多软件(包括 Power BI、Excel、KNIME 等)提供了快速创建图表的方式,但制作有效且具有专业外观的视觉效果远非易事:它需要结构化的规划和有纪律的执行。
本章将为你提供一套实用的指导方针,确保通过有效的数据可视化过程清晰地传达商业信息。具体来说,我们将探讨以下问题:
-
有哪些类型的图表可供选择,它们各自有什么特点?
-
根据我想要传达的具体信息,应该使用哪种图表?
-
我如何确保视觉效果直接且不易产生误解?
-
在可视化数据时需要避免的常见陷阱是什么?
在上一章我们聚焦于 Power BI,而在本章中,我们将学习一些适用于任何能够生成视觉效果的软件的技巧:实际上,把数据可视化看作一种工具无关的技能,是你在数据分析师工具包中必须具备的能力。
本章的流程涵盖了数据可视化的两个基本阶段。第一步是规划我们的图表,考虑我们想要表达的具体观点,以及哪些图表类型最适合我们的需求。然后,我们进入构建图表的阶段,包括微调视觉属性、打磨各个图形元素,并避免常见的错误:这一部分将总结为一份实际的数据可视化质量规则清单。在进入规划阶段之前,我们快速框定一下数据可视化的普遍需求。
什么是数据可视化?
虽然数据可视化的基本概念很简单,但我们还是需要花些时间来合理地设定场景。数据可视化的核心目标是将基于数据的信息传递给另一个人。有效进行这一沟通过程意味着接收者能够理解原始的基于数据的信息,并通过认知“理解”它。图 7.1 展示了一个传递数据消息失败的图示:将所有数据按原始格式呈现。
![文本]
图像描述自动生成
图 7.1:以原始格式呈现数据:如你所见,决策者明显感到不知所措,并且大多数数据被忽视了。
这里的决策者显然被如此大量的原始数据所压倒。这是可以理解的:每个人的认知能力都是有限的,我们的大脑一次只能处理一定量的信息。如果我们试图同时呈现过多数据,便会超出接收者的认知极限,导致他们得到的只是原始信息的部分或扭曲版本。结果,我们的初衷要么被忽视,要么——更糟糕——被误解。坏消息是,无论我们面对的是谁,无论他们有多聪明,能理解的有效信息总是有限的:其余的将被简单地忽略。
另一个坏消息是,如果有几个人在查看相同的数据,他们的“收获”将会有所不同,因为他们各自的敏感性会让他们关注原始数据的不同切片或方面。好消息是,我们有一种已建立的有效沟通数据的方法:将数据转化为一种抽象的可视化形式,传达我们希望传递的关键内容。这就是数据可视化的核心所在。
数据可视化之所以强大,是因为它利用了我们大脑最发达的功能之一:视觉。作为自然进化的一部分,人类一直依赖眼睛来执行生命中至关重要的活动,如寻找食物来源和识别关键威胁。因此,我们的大脑不断优化其视觉能力。正如罗切斯特大学医学光学教授大卫·威廉姆斯所注意到的,现在大脑皮层(大脑表面)中超过 50% 的部分参与处理视觉信息:这比所有其他四种感官加起来还多!大脑可以迅速通过识别一些关键特征(如大小、颜色、曲率、位置、坡度等)来解读图像,这些特征是我们不加意识努力就能本能察觉的。它们被称为注意前属性,我们在数据可视化中广泛利用这些特性。
在图 7.2中,你可以看到数据可视化的潜在用途:通过将数据(即使是大量数据,经过适当筛选和聚合)编码成图形摘要,决策者的认知能力得到了最充分的利用,且接收到的信息是明确无误的:

图 7.2:通过可视化呈现数据:通过选择正确的设计方案,决策者可以轻松理解你的信息
如图所示,数据可视化就像一个可定制的漏斗,正确使用需要一些调整。事实上,并没有一种唯一的方式来可视化相同的数据:通过做出一些设计选择(如图表类型、要以图形方式编码的度量、视觉属性等),你可以“调整”漏斗,使其最适合实现你的精确沟通目标。你的责任是做好这个调整。需要注意的是,这些设计选择并非仅仅出于美学需求。图表中的每一个视觉模式都有其含义,并且会被我们的脑海解读,我们本能地会在其中识别出一些视觉线索(先觉属性)。每一个图形元素都占用了部分认知能力,因此除非它在我们的沟通目标中有意义,否则我们不会使用任何视觉线索。正如我们稍后会深入了解的,数据可视化的口号是少即是多,而简约无疑是最佳的选择。
尽管漏斗的类比是对现实的粗略简化(数据可视化不仅仅是“压缩”数据),但它很好地描绘了我建议你在可视化数据时保持的思维方式。记住这一点:要将数据转化为直观、具有影响力且不含糊的视觉效果,你必须做出正确的设计选择。你需要像设计师一样思考。在这一章中,你将扮演图中“漏斗操作者”的角色,即决定如何根据要传达的特定信息来表现数据的视觉设计师。你将学会如何为你的图表始终如一地做出正确的设计选择。
现在,场景已经设定,你作为视觉设计师的角色也揭晓了,接下来让我们进入规划阶段,在这一阶段我们将做出一些关键的设计选择。
每个信息都有一个合适的图表类型
每一个图表背后的终极目标应该是传达一个精准的基于数据的信息。不出所料,当我们规划图表时,首先要做的就是决定我们要传递的具体信息。你可以把这个信息看作是对某个特定业务问题的回答,比如品牌 X 的市场份额是否持续增长?或收入与服务价格之间有何关联?。尽管业务问题往往模糊且多面,但在大多数情况下,它们属于以下三种类型之一:
-
演变:这些问题涉及随着时间推移数量的变化。如果你的业务问题包含像增长、下降、增加、减少、加速、减速、落后、滞后、超越或趋势等词汇,那么它很可能属于演变类型。这是数据图表回答的最常见问题之一,因为理解业务绩效指标如何演变是无处不在的需求。
-
大小:这些问题询问的是组成部分相对于整体的比例(也称为部分与整体)或在可比数量中的排名。你可以在此类问题中找到的典型词汇包括驱动因素、消耗因素、高、低、顶部、底部、最大、最小,以及——通常——所有以est结尾的最高级形容词。每当我们涉及基准、排名、比较或深入分析组成部分时,我们都会提出与大小相关的商业问题。
-
关系:这类问题探讨不同指标之间的相互关系。当我们使用诸如相关、共同增长/下降等词汇时,通常是在询问一个数量如何相对于另一个数量发生变化,这类问题就属于这一类型。
表 7.1 提供了按每组分类的商业问题示例列表。看完后,想想你最近在工作中参与的一些问题:很有可能你会在这三类中的每一类中找到相关的示例。
| 信息类型 | 商业问题示例 |
|---|---|
| 演变 | 销售是在增加还是减少?变化速度如何? |
| 趋势是否有加速或减缓? | |
| 我们在消费中是否看到季节性变化? | |
| 尺寸 | 哪些产品推动了销售增长? |
| 哪些品牌是我最大的竞争对手? | |
| 我的竞争对手在哪个产品线中赚取的利润最多? | |
| 销售流失方面最重要的机会是什么? | |
| 关系 | 利润如何随着包装尺寸的增加而分布? |
| 可支配收入在全国范围内是如何分布的? | |
| 不同品牌之间价格与盈利能力有关系吗? |
表 7.1:按信息类型组织的一些商业问题示例
确定你想要传达的商业信息类型是规划数据可视化设计的必要初步步骤。事实上,每种信息类型(演变、大小或关系)都对应一个或多个匹配的图表类型,如图 7.3所示。图中,每一行表示一种基本的图表类型(柱状图、折线图、树图和散点图):它们有一组备选的呈现方式,你可以根据具体情况考虑使用:

图 7.3:图表选择矩阵:每种信息类型都有其偏好的图表类型。两个星号是显而易见的匹配,但一个星号的组合也可以很好地工作
我希望你能发现图表选择矩阵简单易记,因为它可以成为你根据所要传达的消息快速决定使用何种图表类型的最佳助手(通过这样做,你可以回答你当时面临的商业问题)。你应该考虑到,市面上有更多的图表类型,有些具有很强的视觉吸引力;然而,超过 90%的情况下,你仅使用这个简单的图表类型列表就能传达清晰的信息。坚持使用这些已知图表的另一个好处是,商业伙伴们自然能够识别这些图表并知道如何解读它们,从而使你的信息——记住数据可视化的终极目标——更加简洁和直接。
在介绍了四种图表类型及其选择时机后,我们来逐一了解每种类型及其最佳使用方式。对于每种图表类型,你将看到一个简要描述,包含它是什么样的,提供一些视觉示例,并列出一系列规则(这些规则会以粗体突出显示),在构建这种图表时可以随时参考。
条形图
条形图(图 7.4)可能是地球上最具代表性的图表类型。对于横轴上的每个类别,你都有一个或多个条形,其长度与要可视化的数量成比例。长度是一个非常直观的预注意属性:大脑会自然地感知每个条形之间的相对大小差异。这使得条形图特别适合传递关于不同大小的商业实体(如品牌、产品或国家)的信息,便于快速比较、排名和基准测试(尤其是当条形按高度排序时,这是通常推荐的做法)。类别也可以是时间段,如月份、季度或年份:这就是为什么条形图也用于展示随时间变化的信息(当然,在这种情况下,你不应该对条形进行排序,始终保持自然的时间顺序)。

图 7.4:一张简单的条形图:你可以一眼看出不同国家的 GDP 水平。
使用条形图时需要牢记的一个简单规则是,比例尺应始终从零开始。如果不这样做,条形图的长度就不再与我们希望显示的实际值成比例:这会欺骗观众的眼睛,误用了长度这一预注意属性。例如,看看图 7.5:德国人均 GDP 看起来只有挪威的一半,而实际上约为其三分之二:

图 7.5:在条形图中,条形应始终从零开始(而不是像这个例子中从 25 开始)
这种图表的一种有趣变体是横向条形图:通常情况下,横向条形比纵向条形更好,尤其是当类别很多或标签较长时。看一下图 7.6中的例子:国家名称不需要倾斜(节省读者的脖子),而且条形可以更长,这样能更容易地比较不同国家之间的差异:

图 7.6:横向条形图:更好地利用视觉空间的简单方式
当你有另一个类别变量需要编码时,可以使用堆叠条形图。如图 7.7所示,每个子类别(在这个例子中是国家内的部门)作为图表的一部分显示,用不同的颜色突出显示。通过这种方式,你可以展示每个组件相对于整个条形的大小,并且还可以进行国家/部门组合的比较。建议仅在需要编码的子类别较少时使用(理想情况下不超过四个);否则,读者很难辨认每个条形部分:

图 7.7:堆叠条形图:通过使用颜色可以区分子类别
需要考虑的条形图系列中的另一个扩展是直方图:这本质上是一个条形图,展示了通过分组范围的频率分布。请看图 7.8中的例子。这个图表告诉我们,价格落在 €5.8 到 €5.9 区间内的频率最高:

图 7.8:直方图:你可以轻松看到落在等大小范围内的值的频率
最后,条形图的另一种有用变体是瀑布图。这种图表非常适合展示前后对比中的正负变化成分,就像图 7.9中显示的 GDP 变化:

图 7.9:瀑布图:你可以揭示变化的推动因素和抑制因素
折线图
折线图是展示数量随连续变量(如时间)变化的最自然方式。一个典型的案例是图 7.10:这条线是通过“连接点”得出的,连接了在纵轴上显示的不同销售值(在这种情况下,不需要像条形图那样从零开始),而横轴则表示时间值,按等间隔排列。数据点之间的连接线利用斜率这一预注意属性来传达数量是上升还是下降,以及变化速度:

图 7.10:折线图的结构:连续变量(在大多数情况下是时间)位于横轴上
虽然最常见的情况是展示随时间的演变,但你也可以使用折线图来绘制任何连续变量的趋势。例如,如果你想展示不同价格点的销售产品数量,你可以将价格设置为横轴,观察随着价格的提高,销售如何下降。在任何情况下,切勿在折线图的横轴上使用类别变量。原因很简单:在折线图中,大脑将线条的坡度与相邻元素之间的变化联系起来,比如两个随时间连续的点。以图 7.11为例:意大利和挪威之间没有逻辑上的连续性(除了字母顺序,这对我们的信息没有意义),因此我们在两国之间看到的陡峭上升既是人为的,也是令人困惑的:

图 7.11:折线图的横轴上使用类别变量:初学者应避免的错误
你还可以使用折线图显示多条时间序列在相同时间框架内的关系,并通过颜色区分不同的线条。然而,建议使用直接标签,将其放置在每条线旁边:这些标签更清晰,可以避免使用图例,从而省去了“映射”颜色到类别的麻烦。此外,这种方法还允许你使用颜色来视觉突出数据的一部分,就像图 7.12中所展示的那样,这将使图表更专注于你想传达的具体信息。

图 7.12:带有直接标签的折线图:尽量避免使用颜色图例,将其替换为直接标签
另一个建议是在采用双轴时要非常小心,双轴意味着在同一图表中允许线条分别对应两个不同的参考轴,且这些轴具有不同的量度尺度。双轴图形可能出现的问题之一是,当两条线相交时,大脑会预先关注这一交叉点:换句话说,它必须意味着某些东西。但实际上,这可能与我们想传达的信息没有任何关系。以图 7.13中的左侧图表为例:份额和销售线在第二季度和第三季度之间交叉,但这完全是由于两个垂直尺度的任意定义所致:

图 7.13:双轴图形较为复杂:左侧图表有一个人工交叉点,且比右侧图表更难解读
右侧图表中的组合图是一种更为稳健的替代方案:柱状图和折线图明确地分别对应两个不同的轴,它们既不重叠也不产生交叉。选择右侧图形的另一个理由是其简单的轴增量:选择连续的两个奇数(29%、31%、33%等)作为增量,不如右侧图形(30%、35%、40%等)直观。
另一种更直接的替代方法是将相同数据可视化为多个单独的图表(通常称为层格图或面板图),如图 7.14所示。这种方法对于分离多条重叠数据序列时非常有用。它是一种避免意大利面图表的方法,后者将许多线条挤进一个图表中,使得每条线都很难单独追踪并解读:

图 7.14:在层格图中合并的两条线:在这种情况下,我们通过采用数据标签来避免使用垂直坐标轴
在图 7.14的特定情况下,你还可以看到垂直轴已经完全被移除,取而代之的是数据标签,用于显示垂直轴的值。当你更倾向于报告精确值且可视化的数据点不多时,可以考虑使用数据标签,而不是依赖坐标轴。
层级树图
层级树图非常适合展示整体各个部分的相对大小。在层级树图中,整个空间被划分为多个矩形,每个矩形的大小与一个数值变量成正比。正如在图 7.15中所示,可以同时展示层级的多个层次(在此例中,国家和类别是用于分解销售的两个层级),并且可以比较所有元素的大小:

图 7.15:展示国家/类别组合的销售相对大小的层级树图:颜色用于突出显示每个国家橄榄销售的普及度
即使你只有一个层级的分割,层级树图仍然是传达整体各部分相对大小的好方法。我敢打赌,有些人现在在想:我们不能用饼图来表示吗? 尽管饼图仍然被广泛使用,数据可视化专家建议避免使用饼图,认为有更直接和更好的替代方案。信息设计专家 Stephen Few 用一个简洁的规则总结了他对饼图的看法:饼图留着当甜点吃吧! 很容易理解为什么:图 7.16展示了一个饼图和一个条形图,它们可视化的是相同的数据集,并清楚地展示了为什么饼图不如条形图。饼图通过角度来编码定量值,而角度比长度更难以立即感知,长度则用于条形图。我们的脑袋在评估角度的幅度时比较困难。再看一下图中的饼图:你能轻松比较中国(饼图中的第一块,从“正午”开始)和法国(第四块,顺时针方向)的大小吗?

图 7.16:饼图更适合搭配茶水,而不是用来展示数据:在这种情况下,条形图做得更好
唯一可以使用饼图(或其其他听起来更好听的替代图表,如甜甜圈图)的情况是当你只有两部分时(如我们在上一章中做的那样——参见图 6.32):在这种情况下,很容易看出哪一部分更大,因此可以使用这些图表。在所有其他情况下,你应该使用条形图或树图来传达关于大小和比例的信息:就是这么简单。
散点图
在散点图中,数据以一系列点的形式显示在一个矩形区域内。两个量用来控制出现在图表中的点的横坐标和纵坐标。通过这种方式,你可以轻松地展示这两个量之间的关系。看看图 7.17中的示例:单位销售数量(编码为纵坐标,或y轴)随着单位价格(用于控制横坐标,或x轴)的增加而明显下降:

图 7.17:显示单位销售数量与单位价格关系的散点图:价格越高,销售越少。虚线趋势线使这一关系更加明显
我们可以看到这两个量之间的相互依赖关系(线性相关性):随着价格的上涨,我们的销售量减少。散点图同样给我们提供了关于非线性现象的明显提示。例如,在图 7.17中,我们可以看到在€6.00 的价格阈值之后,销售出现了明显的下降。似乎全数字价格充当了一个心理阈值:顾客对€5.99 的价格标签比€6.00 的价格标签更具吸引力。像这样的线性和非线性模式可以通过散点图轻松发现:这使得它们成为在需要传达基于关系的商业信息时的安全图表选择。
添加一个趋势线,就像你在图 7.17中看到的虚线那样,可以突出线性关系。你还记得我们在第五章《工作中应用机器学习》里遇到的线性回归算法吗?趋势线只是通过横坐标(自变量)解释纵坐标(因变量)数量的线性模型的可视化呈现。你可以回去查看图 5.7,复习一下线性回归的视觉效果。
象限图,如图 7.18所示,是散点图的一种有趣扩展。通过两条参考线——一条垂直线和一条水平线——通常将它们设置在感兴趣范围的“中间”,我们将图表的空间划分为四个象限。每个象限与“低于”和“高于”每个参考阈值的四种逻辑组合之一相关:

图 7.18:一个象限图,显示了市场规模和市场份额变化(x 轴和 y 轴)以及业务规模(气泡大小):这个图表提供了一个框架,可以根据每个国家的位置来对其进行分类。
这种图表在将每个象限与明确的商业解释关联时变得非常强大。例如,图 7.18 显示了一个公司在各个国家市场的市场份额年变化(纵轴)和所在市场的规模(横轴)。出现在右上角的国家(在我们的例子中,只有印度)是公司的优势:在这些市场中,公司正在增加其市场份额,同时,整个类别的消费也在增长(可能是由人口增长驱动)。如果这一趋势在未来得到确认,这个市场将变得对公司越来越重要:结合市场份额的增长,印度可以被加入到公司战略优势的列表中。如果你转而查看右下象限,我们会发现一些国家的市场规模在增长,但市场份额却在下降。如果我们不采取行动,这些市场将逐渐侵蚀我们更多的全球份额,因为这些国家的市场份额可能会增加。因此,这些是需要谨慎管理的威胁。在这个象限图中,气泡的大小与当前业务的规模成正比,这使得优先事项更容易看出。这个例子说明了象限图成为数据的商业解释框架的潜力。不幸的是,象限图仍然被低估,我强烈建议在你的工作领域考虑其可能的应用,因为它们可以带来真正的不同。
关于散点图的最后一个考虑:刻度不需要从零开始。因此,当你想要展示的值都远离“零”时,可以用散点图代替条形图来传达关于规模的信息:这会给你带来一个有意义的优势,即将刻度缩小到一个更小的感兴趣范围,使得差异更加明显。例如,图 7.19 是一个散点图,展示了与图 7.4 相同的数据:在散点图中,各国人均 GDP 的差距更加明显。

图 7.19:与图 7.4 中的条形图替代的散点图:如果信息是关于各国人均 GDP 的绝对差距,这种设计效果很好
我们现在已经完成了对数据可视化所需的基本图表类型的概述。条形图、折线图、树图和散点图涵盖了你可以通过数据传达的大多数商业信息。现在我们已经准备好了所有的元素,接下来我们将它们整合在一起,最终确定我们的视觉设计。
完成你的可视化
除了我们在前面几页中遇到的关于每种图表类型的具体设计指南外,还有一些适用于每次数据可视化的通用质量设计规则。这些规则的共同点将我们带回到本章开始时提到的地方:极简主义是有效数据可视化的终极关键。
耶鲁大学教授爱德华·塔夫图在现代数据可视化领域开创了先河。他提出的一个关键概念是数据墨水比,它描述了图表中由数据驱动的视觉元素的普及程度。考虑你在图表中使用的所有“墨水”来绘制数据的本质和非冗余的展示信息:如果我们删除这些图表元素,我们也会去除我们想要传达的潜在商业信息。现在想一想,绘制图表所需的总墨水量,包括不必要的图例、背景图片、不需要的文本等。塔夫图发现,通过去除所有杂乱的元素,我们最大化了数据墨水在总墨水中的比例(数据墨水比),从而获得更有效的数据可视化效果。
让我们通过一个例子来看它可能变得多糟:图 7.20展示了一个糟糕的柱状图,里面包含了几种错误的设计选择:

图 7.20:数据可视化中不应采取的做法示例:此图表的数据墨水比处于最低水平
虽然很少能看到像这样的数据可视化如此糟糕,我相信你在工作中看到的许多视觉图表也会存在一个或多个与此类似的错误。在接下来的几页中,我们将通过一套实用的指南,帮助我们避免所有这些问题。我们需要培养出能够发现这些缺陷的设计眼光,以便我们能够始终构建出整洁且专业级别的数据图表。看看图 7.20,我们似乎可以从多种角度来开始分析:
-
网格线:网格线有助于引导视线将数据点与坐标轴连接起来,但并非总是必要的。无论如何,网格线应始终保持视觉低调且几乎不可见。尽量让它们尽可能细,且使用浅灰色。不要在每个轴上夸大网格线的数量:每个维度的网格线应不超过 10 条。如果你能够完全避免使用网格线,那就更好了:例如,如果你在数据点上方使用了数据标签,就应该去掉网格线和坐标轴,因为它们已经不再需要了。
-
刻度标记:刻度标记有助于将轴标签与数据元素对齐,比如线形图中的时间周期。类似于网格线,刻度标记应当视觉上较为低调,因此应保持其短小和纤细。柱状图通常不需要刻度标记,因为每一根柱子都应当很容易地与某个类别对应。就像任何可视化辅助工具一样,如果你不确定是否需要保留刻度标记,我的建议是将它们去掉,然后检查是否所有内容仍然清晰可见。
-
图表边框:你可以去掉图表的外部边框:它们会浪费墨水,但确实不会提供任何信息。为了避免与幻灯片或文档中的其他元素或文本混淆,围绕图表留出一条宽敞的空白区域:这样看起来既整洁又轻盈,这正是你需要的效果。
-
旋转文本:如前所述,当文本被垂直旋转或倾斜时,它的可读性会降低,需要更多的时间才能阅读,因此应该避免。在条形图的情况下,使用水平条形可以为长标签腾出空间。
-
3D 效果:数据图表是对一组数据点的抽象表示。在数据可视化中,我们完全可以去除真实感的因素。数据图表中的三维视角只会带来负面影响,因为它使得比较大小和参考线变得更加困难。3D 散点图有时在科学领域用于数据探索:在这种情况下,它们总是允许通过适当的旋转和平移与视图进行交互。在商业领域,这几乎是不必要的。不要使用 3D。
-
阴影:与我们在 3D 部分所说的类似,在任何数据可视化中都没有必要添加光影效果。虽然许多软件平台无理地允许这样做,但不要在你的视觉元素中添加阴影。
-
背景:图表的背景应该是中性的,以便前景中的所有元素能够尽可能清晰地区分开来。有时,缺乏经验的用户会在图表的背景中加入颜色或更糟糕的是产品和品牌的图片来使其看起来“酷”:这只会降低他们传达业务信息的成功率,因为图表的可读性变差。有趣的是,Excel 提供了在图 7.20中看到的白色大理石纹理作为背景——我并没有编造!别问我为什么,但 Excel 还有一个预加载的纹理,展示了鱼化石的图案。它非常奇怪,值得一看,但——请不要使用它。
-
标签:使用标签来标识线条或指定数据值非常有用。你应该避免添加重复标签,因为它们会增加不必要的墨水:例如,如果你在折线图或条形图上有数据标签,你可以完全去除坐标轴和网格线,正如我们在图 7.14中所做的那样。使用标签时,请确保它们没有边框或非中性色背景。如果它们显示数据值,避免过多的小数位,就像在图 7.20中那样。一般来说,保持文本标签尽可能简洁,以便清晰地传达你需要的信息。
-
图例:图例用于提供图表中颜色或纹理的解读键。使用图例的问题在于,它们始终需要读者的眼睛和注意力在图表中的数据元素和图例本身之间来回切换。作为一般规则,我们应该尽量避免使用图例,并始终寻找替代方法,就像我们在图 7.12中使用直接标签一样。如果必须使用图例,尽量通过将元素分组或过滤不重要的项来限制项目数量:人眼很难在同一图表中清晰地区分超过五种颜色。
除了前述元素,当我们优化数据图表时,还应注意颜色的使用。重要的是要认识到,颜色是我们大脑在面对图表时解码的最直接的前注意属性之一。至于其他属性,如长度、大小和位置,颜色在数据图表中使用时应始终具有特定的含义。换句话说,颜色从来不是为了装饰或满足任何美学需求而存在。在数据可视化中,颜色是有功能性原因的,比如:
-
突出需要注意的元素,就像我们在图 7.15中强调橄榄类别时所做的那样。正如我们将在下一章看到的,颜色在区分数据的背景和前景时可以非常有力。
-
编码额外维度,就像在图 7.7中展示的堆叠条形图,或通过颜色渐变显示连续变量。
大约 5%的人受到色觉缺陷(CVD)的影响,这是一种让某些颜色组合(如绿色和红色的不同色调)难以区分的色盲形式。因此,通过采用对色盲友好的调色板(davidmathlogic.com/colorblind)或使用明暗对比的颜色差异(当图表仅以黑白墨水打印时,这也很有用),尽量在数据可视化中做到完全包容。
在图 7.21中,你会看到一个改进版的之前看到的糟糕图表。这个图表现在已经通过应用我们在本章中遇到的所有质量指南进行了处理:

图 7.21:改进版的前一个条形图:简洁胜出
自行判断:极简主义能增强清晰度,并超越任何添加不必要图形修饰的华丽尝试。
总结
本章为你提供了一套实用的工具和指南,用于设计专业且有效的可视化图表,供你在日常工作中使用。我们从设定数据可视化的整体目标开始:通过利用人类的视觉感知将基于数据的信息传递给他人。我们已经看到,在这一过程中,我们需要扮演设计师的角色,做出关于“要可视化什么”和“如何可视化”的选择。在选择了要传达的特定信息类型(可能是时间演变、绝对和相对大小的比较,或数量之间的关系)后,我们学习了如何使用图表选择矩阵来挑选合适的图表类型。我们发现了线性图表、柱状图、树形图和散点图的优缺点以及实施时常见的陷阱,而这些图表正是我们最常需要使用的类型。最后,我们介绍了一套确保数据可视化质量时应遵循的指南。我们发现,所有这些规则有一个共同的目标:它们都邀请我们在构建图表时应用有条理的简化、直接性和极简主义。
本章中我们学到的所有好实践都需要通过实践才能转化为习惯。我的建议是,一旦你开始处理下一个需要刷新或创建的数据图表,就立刻应用我们在这里学到的所有规则。有些规则一开始可能会让你感觉不太习惯——我知道你们当中有些人是饼图的忠实粉丝——但它们无疑会帮助你在数据可视化方面变得更加自信和成功。
在本章中,我们专注于将数据转化为可视化并传达特定的信息。在下一章中,我们将更进一步:我们将学习如何将基于数据的信息转化为引人入胜的故事,这就是数据讲故事的核心。
第八章:用数据讲故事
这是你没有预料到的章节。制作和传达一部虚构作品中,什么可以是分析性的、科学的和专业的呢?尽管看起来充满矛盾,但讲故事却是从数据中创造经济价值的最实用方法之一。在这一章中,你将了解这一过程是如何运作的,并且如何利用它来为自己谋取优势。
我们将很快回答以下问题:
-
故事与商业和数据分析有什么关系?
-
一个故事的构成要素是什么?
-
如何从我的数据开始构建一个故事?
-
我可以使用什么技巧来讲述推动商业价值的故事?
在本章的第一部分,你将发现是什么让故事如此有效地与他人沟通(并说服他人)。在第二部分,你将学习一种简单的方法论以及一些实用技巧,帮助你自己构建强有力的数据故事。本章不同于书中其他章节,因为它旨在培养一套比你之前看到的更柔和的技能。对于一些更熟悉技术和科学的读者来说,这可能会让人感到有些不适。无论如何,我保证这本章值得一读:你可能会像之前的许多人一样,成为一个意想不到的数据故事爱好者。
说服他人的艺术
仅仅“正确”是不够的:这是许多数据从业者面临的平凡且有时令人不安的现实,他们的观点——无论多么真实和深刻——无法被主管接受和听取。正如我们在第一章中看到的那样,通过数据分析创造经济价值有多条路径,我们称之为数据到价值的路径。在大多数情况下,要创造价值,我们需要通过数据来影响他人,促使他们做出正确的决策或采取适当的行动。现在请想一想:到目前为止,你在书中所看到的一切——所有努力转化数据、发现洞察、建立强大模型的工作——如果我们错过了链条的最后一环,即影响他人的行动,这些工作都将悲哀地变得无用。为了防止我们的工作变得无关紧要,最好的办法是将其贯彻到底,直到采取行动,而不是天真地认为“做数学工作就足够了”。为了做到这一点,我们需要通过掌握劝说的艺术与科学,来有说服力地传达我们的观点。
描述劝说动态的最简单(也是最古老)的模型是修辞学:它总结了使演讲或书面文件(在我们的案例中,可以是支持管理决策的演示或商业备忘录)在说服他人时成功的三个基本特征。这些特征,也被称为劝说模式,包括:
-
可信度:发言者、作者或支持者的权威性和个人诚信会使论点更具可信性,更容易被接受。那些能够展示成功的经验记录的人,会更容易获得认可。此外,用于支持某个观点的来源的可靠性,无疑会增强论点的说服力。 |
-
逻辑严谨性:清晰且扎实的理性论证链条能够激发听众的智慧和理性,使其更容易接受。如果你能够使用一种被他人接受(并且—特别—易于理解)的逻辑来证明你的观点,最终他们会信服。如果你的逻辑有任何缺陷或无法理解,你的听众将会质疑整个论点,哪怕你完全是对的。 |
-
情感参与:如果观众在情感上投入,并且感觉到与案件有个人的关联,他们更有可能同意并采取你推荐的行动。发展情感诉求的方式有很多种,比如使用唤起情感的图像,选择带有情感强调的词语,提到亲身经历,做出人们能个人感同身受的类比,或者创作引人入胜的故事保持高关注度。这个特征要求你识别情感,分辨情绪,并根据环境调整风格和内容,这一系列能力被称为情商。
修辞学是一门古老的学科。它最早起源于公元前 5 世纪的西西里岛,在古希腊的叙拉古和阿格里真托的殖民地,作为一种提高法律程序成功几率的技术方法论。它最早由希腊哲学家亚里士多德(384–322 BC)描述,提出了这里展示的三大支柱模型:伦理(ἦθος,指的是可信度)、逻辑(λόγος,逻辑)和情感(πάθος,情感)。 |
让我们回到商业数据,考察一些具体的例子,看看如何利用修辞学为我们带来优势。表 8.1仅展示了我们可以在数据修辞中实施的一些技巧:在浏览这些技巧时,思考一下你是否已经见过它们的实际应用,并开始想象如何在下一次数据呈现中利用这些技巧: |
| 模式 | 驱动因素 | 示例 |
|---|---|---|
| 伦理 | 资历/个人简介 | 我在使用这种方法论方面有 15 年的经验。 |
| 成功案例 | 我们已经在法国尝试了这种方法,它推动了 7%的市场增长。 | |
| 权威来源 | 根据斯坦福大学的研究... | |
| 支持者/推荐人 | 该模型已由我们的财务总监审核。 | |
| 逻辑 | 逻辑推理 | 既然 X 是对的,那么 Y 也必须是对的。 |
| 严谨的商业事实 | 正如表格所示,这个品牌的利润是所有其他品牌的 5 倍。 | |
| 科学有效性 | 经测试,该模型达到了 92%的准确率。 | |
| 情感 | 隐喻/拟人化 | 认识一下我们的典型客户,Matt:他 35 岁,是一名… |
| 情感画面 | 看看调查中的趋势,我们正朝着悬崖边缘走去… | |
| 个人经历 | 我最近也作为消费者亲身经历了相同的情况… | |
| 先前的希望与恐惧 | 想象一下,如果我们再次经历去年那样的衰退,后果会如何… | |
| 引人入胜的叙事与转折 | 看看如果我们不采取行动会发生什么,接下来是我们如何取胜… |
表 8.1:数据修辞的使用示例
根据你的背景、个人倾向和风格,你可能会发现三种说服方式中的每一种对你来说都更自然或不太自然。一般来说,我们可以观察到这些偏好中的一些模式。
例如,许多数据专业人士会觉得使用逻各斯模式最为得心应手:通过将科学方法应用于现有数据,他们能自信地证明自己的观点。数据和逻辑的世界是他们的世界。
偏好伦理学模式在一定程度上取决于个人演讲者的历史及其在组织中的信誉。幸运的是,个人信誉是可以通过努力逐步建立的。
对于大多数数据从业者来说,最难掌握的模式是情感。情感比数字和算法更难以管理。它们无法归入静态和预设的类别。人类的一个迷人之处在于,每个人都是不同的,每个人都有不同的敏感度。毫无疑问,在用数据说服他人时,管理情感模式是最艰难的部分,这将需要本章剩余部分的详细探讨。
好消息是,在用数据进行逻辑论证时,有一种经过验证的方式可以实现高度的情感投入,这正是我们现在要重点关注的:构建伟大的故事。
讲故事的力量
人类是讲故事的生物。这一特性是我们天性的一部分。当我们的祖先第一次围坐在篝火旁时,故事开始被讲述,语言也随之发展。讲故事的根本目的一直是为了传递知识,使其能够深入听众的脑海并说服他们。自人类诞生以来,文化就是通过故事传承的:它们通过口头方式世代相传,远在文字(和 PowerPoint 演示)出现之前。
现在,我们的日常生活完全沉浸在故事中。品牌通过叙事来进行传播:广告将通过一个故事来促使你购买某个产品,而不是单纯列举你应该购买它的理由。当你与好友聊天或在咖啡机旁遇见同事时,你会讲述你生活中的故事,而不是冷冰冰地列出你过去的活动。当你在家消费媒体、读书、看剧或哄孩子入睡时,你正在利用我们每个人都能感受到的对虚构故事的天然吸引力。
在让故事如此核心的众多原因中,有三个具体的原因使得叙事在商业环境中展示数据时如此有效:
-
故事比统计数据更能留在人们心中。多项认知心理学研究证实,当事实以叙事的形式呈现时,它们会比单独列出时更容易在我们的大脑中留下深刻印象。正如斯坦福大学教授戈登·鲍尔和米哈尔·克拉克进行的著名实验所证明的那样,如果通过创造包含这些单词的虚构故事来记忆一系列随机单词,人们的记忆力要比平时强 6 到 7 倍。其他研究还表明,与说明性文本相比,叙事性文本可以阅读得更快,回忆起来也更容易。只要增加一个“串联事实”的情节,你更可能被理解并被记住:就这么简单。
-
故事鼓励接受。当我们观看科幻剧集时,我们完全知道这只是虚构作品,里面的一切都不真实。但我们可能会被它吸引,并且继续观看,迫不及待地跳到下一集。怎么可能呢?这发生是因为,当我们面对一个故事时,我们默契地签署了一项协议,称为叙事契约。它的内容大致是:“我同意暂时放下我的怀疑,因为我知道这个故事一定会带来一些好的东西,无论是新的知识,还是娱乐或短暂脱离现实的体验。”当有人在给我们讲故事时,我们同意怀疑的余地,因为我们接受有可能会被惊讶到(甚至改变自己的想法)。许多商业情境要求你让观众跳出当前的信念,因此叙事契约正是你所需要的!大多数决策是由直觉和过去的个人经验驱动的。当你开始讲故事时,你让观众默契地签署了叙事契约,这是让他们心态开放并聆听的绝佳方式。
正如小说作家所深知的那样,叙事契约只有在我们为虚构世界提供连贯的逻辑时才会有效。正如本章稍后所述,我们必须在数据故事中保持一致性,无论是内容(基本假设、用词)还是外观(如颜色和格式)。
-
故事推动连接。当普林斯顿大学的神经科学家乌里·哈森使用功能性磁共振成像(fMRI)扫描仪研究讲故事者和听众的大脑活动时,他对结果感到惊讶:随着故事的展开,受试者的大脑开始趋于一致,显示出越来越同步的信号模式。故事有能力在参与方之间创造一种情感连接或共鸣的状态。这种连接会让你的受众感觉更亲近你并认同你。因此,他们会更倾向于同意你的数据所建议的内容。
我们在过去几页中看到的所有内容引出了一个简单的结论:故事为我们的数据洞察加上了轮子,让它们走得更快、更远。通过为数据赋予引人入胜的叙事,我们的观点将更具记忆点,更容易被接受。故事讲述是一个有效的工具,它将我们宝贵的洞察带到最重要的地方:决策者的行动能力,改变现状的能力,从而将数据转化为真正的商业价值。既然我们已经了解了为什么故事讲述是如此重要的技能,现在让我们看看如何将其应用到我们的数据中。
数据故事讲述过程
创作一个引人入胜的数据故事需要将创造力的发挥与结构化方法的应用相结合。在接下来的页面中,我们将揭示每一个数据故事讲述过程的步骤,这是你在通过数据和分析影响业务合作伙伴时可以遵循的方法论。它是这样运作的:
-
第一步是设定目标,这意味着定义故事的预期结果(预测它将产生的影响),并明确你的受众组成、驱动因素和已有知识。
-
然后,你需要选择场景,你的故事将由这些场景构成,并草拟它们。我们将介绍五种典型的场景类型,你可以将其作为灵感来让数据发声。
-
一旦你明确了场景,你就可以按顺序排列它们,并应用结构,让你的故事流畅地展开。我们将介绍一种基本的三幕结构,这是一种证明有效的组织叙事的基础。
-
到这时,你将润色场景,使其内容更加突出:你将明确哪些内容应该放在背景中,哪些应该在每个场景的前景中被重点展示。
-
你的草稿可以经历多个周期,你将逐步优化它,重新考虑所有场景及其结构,以确保最终达到最初的业务目标。
-
最终,你的故事将准备好进入黄金时段,你将充满信心地在受众面前呈现它。
图 8.1展示了数据故事讲述过程的图示总结:你先定义目标,然后经历一个迭代过程,选择、构建和润色场景,最后准备好进行讲述:

图 8.1:数据故事的流程:设定目标,完善场景设置,自信地呈现
构建一个强有力的数据故事并准备好呈现它是需要时间的!你应该主动规划这一过程:如果可能的话,可以在日程中预留一些时间段,为演练留出充足的时间。
让我们从这个过程的第一部分开始:定义你的故事目标。
设定目标
达成任何目标的一个基本条件是明确它的样子。数据故事也是如此:这一过程的第一步是向自己明确你想要获得什么,以及从谁那里获得。
思考你期望的具体结果,并试着在脑海中描绘出成功的生动画面:
-
你是希望让某人意识到一些深刻的数据发现吗?在你完成讲述后,他们应该对你的发现以及它所意味着的内容感到信服。
-
你是在为某个项目争取资金支持,还是为你的团队争取额外的投资?你希望达成的目标是,让决策者在听完你的故事后立即批准它。
-
你是否发现了一个商业机会,并想要说服经理人采纳你找到的解决方案?你的目标是让经理人对当前的现状感到不安,并以紧迫感支持你的推荐。
这些例子有些过于刻板和陈词滥调:在实际的商业环境中,你的目标将会是多个项目的组合。不过,在开始构建你的故事之前,你需要尽可能清晰地定义你想要实现的具体情境。把它写下来,因为你将在最后检查你的故事是否符合这一目标。
讲故事总是涉及到一个观众,而观众的特点将决定你如何构建故事并将其生动呈现。我们不能忽视观众——实际上,越是根据观众的需求来调整我们的故事,我们就越能有效地达成目标。在这个初始阶段,你需要集中精力关注两个定义你面前观众的基本特征,也就是:
-
当前的知识和先前的信念:你可以合理地假设他们已经知道哪些关于你将讨论的话题的信息?他们需要哪些背景知识才能跟得上你的讲解?当你解释你用来分析和建模数据的方法时,他们能理解吗?他们对于你故事中的主题有什么已有的看法?是否需要说服他们摆脱任何先入为主的错误假设?花几分钟思考这些问题——或许可以借助那些最了解他们的人——并记下你内容中必须包含的关键要素。通过思考这些问题,你还能提前预见观众的一些提问,并主动做好回答的准备。
-
关键业务目标:你的观众最关心的是什么?目前他们最关注的具体业务指标是什么?他们现在的战略优先事项是什么?例如,是否更重要的是在其他市场迅速扩展业务,还是在当前市场战胜竞争对手?是增加销售还是通过节省成本来提高生产力?你需要清楚地知道他们最关心哪些业务 KPI,这样你才能以这些为基础分享你的发现和建议。在与观众交谈时,切勿低估与他们关注的事项保持一致的重要性:许多数据故事未能引起注意,因为呈现者未能吸引听众的兴趣。你需要说同样的语言,触动他们的痛点。
在你脑海中清晰地描绘出理想结果,并了解观众当前的知识和动机,将帮助你保持相关性、引人入胜并专注于结果:这是你开始构建一篇出色的数据故事的最佳视角。
选择场景
既然我们谈论的是故事,我相信如果我们借用一些典型的剧院和电影行业的术语,比如场景和幕,你应该不会感到惊讶。在戏剧中,场景指的是在某一特定时间发生在某个特定地点的动作。在数据叙事中,场景代表一个准确的陈述,支持这一陈述的是具体的数据发现。场景可以用简洁、明了的短语总结,例如:自去年九月起,销售额每个月下降 8%或现在推出这项新服务,我们预计在不到两年内即可实现盈亏平衡。场景是你故事的基本组成部分,是构成你叙事链条的各个环节:它们必须独立(由数据有力支持)且简洁,以便有效引导观众了解你的逻辑论证发展。
确定正确的场景组合来构建数据故事是很困难的。如果你有大量的数据,可能会陷入展示超出必要范围的数据的诱惑,包括那些不支持情节发展的数据。你可能最终会展示大量的数据显示,却没有清晰的发现或它们之间的联系:这样做会让你的观众感到非常困惑。另一方面,如果你没有足够的数据证据来支持一个场景,你的故事基础就会崩塌,叙事链条会被打断,论证的逻辑性也会瓦解。此外,一个数据场景必须告诉我们一些吸引人、有价值和对故事发展有功能性作用的信息。如果我们展示某些数据,却没有阐明它为什么重要,我们就会失去观众的关注。
很容易在数据提供的复杂和多样化路径中迷失方向。幸运的是,我们能够识别出几种经常出现的相关数据场景类型:它们作为故事中的转折点效果很好,可以为叙述提供有趣的转折点。在我们头脑中清楚地拥有它们可以帮助我们定义我们故事中的场景,这恰恰是我们作为流程的一部分需要做的事情。最常见的五种数据场景类型包括演变、比较、关系、分解和分布。我们现在将逐一介绍它们,澄清您应该用来支持特定观点的典型数据证据,并提供示例。
演变
这个场景主要突出了随时间推移的某种变化。典型情况是展示 KPI 的增长或下降(过去 5 年,收入年均增长 7%,在过去 3 个月加速增长;在 12 月,用户数量比 11 月减少了 13%):这些信息深刻展示了企业的动态状态。分析指标过去的演变可以突出突破趋势和相关的“异常”(在广告活动期间,我们网站的访问量是平均日访问量的 2.5 倍)。它还可以展示重复的模式和周期,揭示我们企业运作方式中的季节性组成部分(12 月至 2 月间热巧克力的消耗通常占年度类别销售的三分之二)。通过预测模型,我们的场景还可以关注未来可能发生的情况,并警示观众即将发生的事情(明年我们预计月度新合同将下降 15%,相当于 250 万美元)。
比较
当您带领观众通过对比两个或更多项的并列比较结果时使用这种场景类型:当您希望放大显著差异(对于我们的经销商来说,销售 A 制造商的汽车比销售 B 和 C 制造商的汽车分别更有利可图,分别是 3.4 倍和 3.7 倍),或者报告假设模拟的不同结果(选项 A 每周确保 4500 欧元的增量销售,而选项 B 则不然)。这种场景在数据叙述中无处不在:通常,您希望利用对比效应来增强差异,并将您的叙述引向特定方向。
如果您在比较场景中以与业务相关的术语传达关键场景,您将使您的数据故事更具影响力。在比较场景中,尝试将差距“货币化”,将其转换为您的观众评估的同一计量单位(如美元销售额、新订阅者数量或成本降低百分点)。
关系
通过使用这种场景类型,你可以展示两个度量之间的关系。一种常见的情况是,突出两个量之间相互关联的程度。你可以通过相关系数来总结这种关系(85%的冰激凌销售波动可以通过天气条件来解释)或适合这些数据的模型参数(每增加一美元的价格,我们预计市场份额将下降 12 个百分点)。
虽然关系场景用于暗示业务关键绩效指标(KPI)之间的因果关系,但你需要辨别相关性和因果性之间的区别,确保向你的听众明确指出这一点。确保明确提到你揭示的关系不意味着什么,理想情况下通过提出一些反事实来阐明这一点。这样,你可以防止你的故事被误解,避免给业务带来损害。
另一个情况(与演变场景类型部分重叠)是当你展示两个指标的交集,标明一个度量超过另一个的时刻(截至去年,制造商 A 超越了制造商 B,成为市场领导者),或者对两个度量之间逐渐形成的差距进行思考(制造商 A 现在每个月出货量是制造商 B 的两倍)。
分解
当你将某物分解为其组成部分时,可以使用这个场景。例如,你可以深入挖掘,更细致地展示影响业务指标的主要因素(或负面因素)(在当前与目标的$10.4M 差距中,$9.2M 完全是由于产品 X,我们欧洲的收入中,83%来自意大利,其余部分由西班牙和希腊平均分配):当你希望将听众的注意力引导到那些(少数)最重要的组成部分时,这非常有用。你也可以反过来,从详细视图“拉远”到聚合视图,以便与大局进行对比,并为某个具体问题提供更一般性的背景(我们的商店在两年内销售额翻了一番,但仍然是该地区表现最差的商店)。
分布
这个场景帮助你突出数据点分布中的有趣模式。例如,你可以展示如何将相似的商业实体分组为同质化的集群(我们的客户群体可以分为四个群体:A、B、C 和 D),这些群体可以通过它们的典型特征来描述(A 组的客户大多是单身,每年收入在 50 万到 75 万瑞士法郎之间)。或者,你可以揭示一个实体在整个群体中的相对位置(我们的公司财务表现位居行业的上四分之一)或揭示异常情况(X 商店是该地区的异常值,因为其货架生产力是所有其他商店的两倍)。
在本节开头,我们提到过一个好的数据场景总能用一句简明扼要的陈述来总结:通常,这个总结会借助支持性的数据证据。表 8.2总结了五种数据场景类型以及你应该使用的典型数据事实来论证你的观点:
| 场景类型 | 典型转折 | 典型支持数据 |
|---|---|---|
| 演变 | 上升或下降,加速或减速,保持稳定,预见未来,揭示过去的趋势破坏者,季节性 | 与上期的变化,和去年同一时期的变化,每期的平均变化,实际变化与预期演变的差距,季节性指数 |
| 比较 | 并排比较,假设模拟,异同对比 | 相对差异,绝对或货币化差距,场景之间的差异,以及结果对比 |
| 关系 | 不同度量之间的相关性,趋势交汇,差距 | 相关系数,一项度量对另一项度量的影响,反转时间,差距积累程度 |
| 细分 | 深入拆解成分,汇总成聚合,聚焦具体,放眼全局 | 部分与整体的相对贡献,成分的显著性,与更高层次的差异,主要驱动因素和影响 |
| 分布 | 成为异常值,属于某个聚类,排名位置 | 四分位数,方差或标准差,偏离常规的距离,顶端与底端,排名,聚类数量,聚类中心 |
表 8.2:数据场景类型及典型转折和支持数据
在构建你的叙事时,可以参考这个表格,决定你想要为数据故事加入的具体转折点——更重要的是,决定你将使用哪个度量来支持它。
应用结构
选择了数据场景后,是时候将它们组合成一个连贯且吸引人的结构了。在传达数据洞察时,简洁和直接总是有效的,特别是在商业环境中。因此,我们将采用一个简单明了的三幕剧模型来安排我们的数据故事:它基于经典的叙事结构——开端、中间和结尾。这种结构从希腊悲剧到最新的 Netflix 电视剧,一直是虚构作品的骨架。想想你最喜欢的书或电影:它们可能会从介绍主要人物和描述他们的正常生活(开端)开始,可能还会带有一些关于即将发生的悬念暗示。
然后(在中间),一系列激动人心的事件开始发生:它们让人物经历一些重大的变化,并在过程中面临种种复杂和障碍。这些变化使得紧张情绪起伏不定,最终导致一次重大危机或高潮。最后(在结尾),紧张情绪缓解,人物进入一种“新常态”,这通常不同(如果是幸福结局的话,则更好)于开头所描绘的状态。
这种结构有效!在它的简洁性中,它可以以一种让观众不断翻页或凝视屏幕的方式保持张力。让我们逐个审视这三幕,并看看我们如何应用这种结构(如图 8.2所示)来构建一个引人入胜的数据故事:

图 8.2:数据故事的三幕结构。始末分明的开始、中间和结束仍然有效。
开始
当你开始你的数据故事时,你希望通过使用所谓的引子(Hook)迅速抓住你的听众的注意力:这是一个简短的陈述(可能不需要任何特定的视觉或支持性细节),它使听众渴望听完整个故事,并愿意投入他们的精力跟随你和你的故事几分钟。在数据故事中效果良好的引子可能包括:
-
关于你的主要发现的部分预览(我们将看到导致上个月顾客满意度下降 10%的原因)。
-
一个支持你要讨论的主题紧迫性的声明(数据表明我们只有 20 天的时间来加强生产线,而不影响未完成订单的履行)。
-
如果你的建议被采纳,可能产生的后果的预期(我们将了解如何在未来夏季与去年相比增加 210 万美元的销售额)。
在数据故事的开始,你需要做的另一件事是提供一些通用的背景信息,使每个人在讨论你将要讨论的问题时都处于同一起跑线上。考虑一下你希望稍后在故事中展示的数据场景:观众需要完全理解它们的背景是什么?业务的当前状态是什么?此外,如果之前已经对这个主题进行了一些努力(例如早期尝试解决同样的问题),在开始时提醒听众这些努力及其为什么尚未完全令人满意可能会有所帮助。
有时,数据展示以对数据来源、它们的范围和新鲜度的全面描述以及与其限制性有关的详细声明开始。这是一把双刃剑,因为它甚至可以在讲话开始之前就让谈话停下来:它确实可能降低对那些对这些细节不太感兴趣的观众的注意力。建议是将这些技术内容保持在最低限度,仅提及要点,并准备一些后备材料,以便只有在它被提出作为一个问题时才能深入讨论更多细节。
许多演讲者陷入的另一个陷阱是过多分享与项目相关的个人背景细节。这是迅速失去听众兴趣的另一种方式。只有在你的背景有助于增强你在该主题上的权威性时才谈论自己,而且即使如此,也要节制:过多谈论自己会使你的故事变得不那么突出。谦逊是有好处的。
通过抛出一个吸引人的钩子并铺设必要的背景,你已经完成了故事的开端,可以准备进入故事的核心部分。
中间
故事的中间部分:这是大多数行动发生的地方。在这一部分,你要铺设一系列场景,逐步建立支持你论点的逻辑。正如数据故事专家布伦特·戴克斯所指出的,你首先要做的是确定顿悟时刻:这是你的数据故事的高潮——可以将其看作是戏剧的焦点场景。一旦你明确了顿悟时刻,就可以向后规划所有前面的场景,让观众通过一系列逐渐升高的洞察力被引导,最终将他们带到高潮。
Pixar 的电影导演安德鲁·斯坦顿注意到,观众总是喜欢为他们的饭菜付出努力。鉴于我们人类推理和演绎的倾向,他建议故事的中间部分应该留出机会让观众自己将信息拼凑起来,积极参与这个过程,而不是每一步都端到他们面前。斯坦顿建议:“不要给他们四个,”他说,“而是给他们二加二”。当决策者觉得自己是思考过程的一部分(而不是旁观者)时,他们更有可能接受你的提案。
这就像一个“连点成线”的拼图游戏:编号的点告诉你确切的操作步骤,但你仍然会在自己画线时找到某种内在的满足感,或许还能揭示一些意想不到的东西。实现这一技巧的一个实用方法是,在场景中仅展示一部分可用数据,要求观众思考剩下的部分。例如,你可以利用动画来直观地展示逐步揭示的过程,或者停下来使用翻转白板收集观众的想法(并让他们思考),然后再恢复流程并分享你的观点。通过让他们参与思考,你会将他们带入到这个过程,从而使他们与你更紧密地联系起来。当他们在这个问题上作出立场时,他们也会直接面对自己之前的信念,并可能证明自己错了。
允许观众参与可能会适得其反:例如,某些参与者可能会干扰注意力,转移到他们的具体目标上,从而危及你的叙事。避免这种情况的一个技巧是,在请求观众参与时,明确说明你希望他们做什么:与其仅仅停下来并要求一般性的评论,不如提出一个具体问题,并清楚说明你期望的具体行为。
当你清楚地知道如何通过逐渐升高的洞察力引导到顿悟时刻时,你就可以进入故事结构的下一部分,也是最后一部分。
结束
那又怎样? 这是观众对数据故事可能做出的最令人畏惧的反应。你要尽力避免这种情况。记住:讲故事的工作不是为了打扮数据,使其看起来更美观,或仅仅为了让展示更具吸引力。数据故事实际上是一个实用的工具,用来实现一个非常实际的目标:推动业务行动!故事的结尾有着至关重要的作用——让观众从理论转向实践,从一个好主意转化为实际改变,从一个深刻的洞察力转化为有影响力的决策。许多数据故事——即使逻辑上合理、情感上吸引——在最后一步失败,未能带来任何显著的后果。为避免这种情况,你需要在故事的结尾部分包含两个关键要素。
第一个要素是关键要点的列表:这些是三到五个你希望观众记住的信息。要点无疑包括“顿悟时刻”场景的总结,以及你希望观众牢记的每一条建议。仔细选择你的要点:它们不应根据你自己觉得很自豪的发现来选择,而应该根据它们对业务的价值增益来决定(即观众记住并付诸实践的意义)。
数据故事结尾的第二个要素是提出的下一步行动列表:这可以是简单的要点列表,或者是一个表格,列出每个有意义的行动的做什么、由谁负责以及何时完成等元素。至关重要的是,不仅要描述需要发生的事情,还要标明负责人和完成期限,以避免你的提议因责任模糊而落空。某些下一步可能在你准备的资料中提前填写好,因为你预计它们会被需要,依据你计划展示的内容。其他则可能在观众对你的故事提出意见时即时决定。无论如何,你需要确保把它们写下来,并验证各责任方的对齐情况。
根据你故事呈现的上下文(例如与少数决策者的简短电话、一个大团队会议或市政厅报告等情况),你需要适当调整故事结尾部分的格式。你可能需要加入简短或长篇的问答和讨论环节,以便鼓励观众积极参与并为决策做出贡献,或明确下一步的必要行动。
这里没有统一的格式:只需考虑一下你的特定观众最终会希望在故事的结尾部分做什么,并据此规划。一旦你准备好了一个简明的要点清单和一些务实的下一步行动,你就拥有了自信结束故事所需的一切,你也为进入数据故事讲述过程的下一步——完善你的场景以使它们更出色——做好了准备。
打磨场景
有时,不够经验丰富的数据故事讲述者会天真地认为“让数据说话”就足够了:他们的故事最终变成了一个信息倾泻,一系列图表被简单地粘贴在一长串 PowerPoint 幻灯片中。结果呢?让观众感到困惑、失去兴趣,并将他们推得离原本目标越来越远。通过选择合适的(少量的)场景并将其放入稳固的三幕结构中,你已经采取了一些有效的步骤来避免掉入信息倾泻的陷阱。然而,这还不足够,在结束故事之前,你需要花时间打磨你的场景,使它们聚焦且易于理解。
聚焦注意力
在数据故事讲述中,正如生活中的许多其他事情一样,少即是多。观众的注意力是稀缺且脆弱的资源,你需要不惜一切代价保护它。如果你仅通过语言来讲述数据故事,而没有任何视觉辅助工具,那么你需要保持语言简洁:使句子简短明了;除非叙述需要,否则避免加入不必要的细节。如果像大多数情况一样,你会配合一些辅助视觉材料(比如带有图表的幻灯片),你需要对这些材料进行严格的必要性检查。幻灯片中的每个视觉元素都会占用观众一定的认知带宽。你不能浪费这种资源——它总是稀缺的——来做装饰、杂乱无章或一些可有可无的附加内容。
系统地保持数据场景聚焦的有效方法是遵循这个简单的两步方法:
-
识别需要处于前景的内容以及需要保持在背景的内容。考虑你想在场景中传递的关键信息:所有直接支持你观点的事实都应该被照亮并放在前景中。另一方面,所有为你的信息提供背景支持的其他数据点应被移除或在视觉上弱化。区分前景和背景元素并不难。如果信息是品牌 X 的增长相对于竞争对手过于突出,那么显示品牌 X 增长的线条应位于前景,而竞争对手的品牌则应处于背景。如果你想说的是表现出这两个症状(在 10 个可能的症状中)的患者更可能是阳性,这两个关键症状应处于前景,其他症状则应置于背景以提供背景信息。
非数据元素如图形辅助线(网格线、坐标轴和图例等)、重复文本和标志应始终放在背景中,并应视觉上保持柔和(或者在不必要时移除)。
-
一旦你明确了场景两层中应该包含什么内容,你需要利用你的图形设置来“最小化”背景元素的突出性,以支持前景中的元素。在许多情况下,数据故事在区分这些层面时会失败:所有图表设置都仅保持在它们的“默认”模式下,迫使每个图形元素(线条、柱子、表格单元格等)都平等对待,没有一个能够突出。你希望正好相反的情况发生:注意力应自然地流向应该从众多元素中脱颖而出的少数项目。与其加强关键内容,不如“雕刻”非必要内容:通过这样做,你避免了增加更多可能进一步分散观众注意力的视觉元素。
以下是最常用的引导观众关注重点的方法:
- 颜色:给背景元素以低饱和度的颜色,最好是灰色,并为前景元素指定高饱和度的颜色。大多数情况下,你只需在所有场景的前景中一致使用单一的高饱和度颜色(如蓝色、橙色,甚至黑色),并且其他所有元素只用灰色调即可。如果图表中只有特定的部分应该处于前景(如线的一部分或柱状图中的特定柱),则只需将颜色应用于该部分:这将清晰突出其在故事中的独特角色。
注意颜色!避免在故事中不加考虑地使用多种不同颜色,因为它们可能会严重分散注意力。数据场景中出现的颜色越少越好:作为经验法则,永远不要在单个视图中使用超过五种不同的颜色。
-
尺寸:对于应保持在背景中的内容,请使用较细的线条和较小的字体。较粗的元素和粗体字体非常有效,可以清晰地区分前景内容。
-
分组:将背景中不需要保持分开的元素组合在一起,是使前景内容获得关注的有效方法。典型情况是当图表中有许多重叠的线条(使它们难以区分)或者堆叠在一起的几个(小)子柱难以辨认时,你可以通过将背景中的较小元素聚合为单个项目来解决问题,你可以称其为其他所有。
你的第一轮打磨已经完成:你已经确定了应该放在前景的内容,并使其脱颖而出。
使场景易于访问
数据故事讲述中的清晰度是必须的,但要实现这一点却相当困难。你的观众在背景、资历、前期知识和注意力集中度方面可能非常多样。因此,为每一位观众清晰地展示内容需要额外的努力。如果你希望做到包容性,你的数据场景应该易于所有人理解,并尽可能自我解释。你可能是你所展示内容的专家,但请记住——你的专业知识不应该是观众完整理解你的故事所必需的。
在构建数据故事的视觉支持时,你可以使用一些经过验证的方法,使你的幻灯片简洁明了,便于所有人理解:
-
行动标题:确保每个幻灯片的标题能够直接传达你想表达的观点。一个糟糕的标题是Sales evolution forecast (in US$), next three years,而一个好的标题是我们预计销售在未来 2.5 年内增长 50%。使用标题来告诉观众你希望他们了解什么,而不仅仅是提供关于他们所看到内容的背景信息。你可以使用其他功能(如轴标题)来解释你展示的指标。你还记得我们说过可以用简洁明了的句子来总结场景吗?把这个句子作为幻灯片的标题。
-
引导标签:添加文本框,标示并解释你所展示数据中有趣的部分。典型的做法是,当你圈出一些数据点或一部分线条时,在附近添加一些文字来解释发生了什么。如有必要,可以使用线条或箭头将你想要特别说明的数据与其相关的文字注释连接起来。仅通过查看引导标签,观众应该能够自动理解场景中的大部分动作,而无需额外解释。
使用颜色将文本和视觉元素连接起来,指向同一个实体。例如,如果一条蓝色的线代表某个特定品牌,那么在标题或标签中提到该品牌时,使用相同的蓝色。这是一种非常有效的方式,使你的材料自解释且能明确地引导观众。记住,在整个故事中要保持颜色选择的一致性。
-
构建动画:考虑以逐步构建的方式组织你的视觉材料。通过几步递进的动画,是传达更复杂思维的有力方式,这能让你逐步引导观众,随着一个个场景的展开,展示更多标签和数据块。动画也适用于强化一些场景类型的情感负荷,比如演变(这是我们去年获得的利润,接下来...(动画继续添加预测的开发内容)... 如果产品发布成功,明年可能会达到的目标)和分解(在所有西班牙新订阅的用户中...(动画继续展示深入分析)... 超过 80%的用户仅仅由于收购)。此外,动画还可以防止观众提前阅读你的材料:他们的好奇心可能会分散他们的注意力,使他们偏离你精心设计的讲解流程。
-
可读性:过于复杂的幻灯片可能会导致观众在试图解读他们所看到的内容时,无法集中注意力在你的叙述上。避免视觉信息过载:如果内容太多,你应该问问自己哪些可以删减,哪些可以作为备份材料保留。如果内容都很重要,可以使用多个图表。写字要节省:字数越少越好。保持字数最小化,也能避免“不小心‘读幻灯片’”,而是让你的演讲内容通过表达充分呈现。你还应该检查你使用的字体的可读性:从电脑屏幕前退后两步,看看能否轻松阅读其中的所有数字和文字。
明智地使用标题、标签和动画,你可以使支持数据场景的视觉材料自解释且易于观众理解。一旦你完善了故事的所有部分,你就可以继续向前推进。
完成你的故事
数据叙事过程是迭代的。现在你已经有了完整的故事框架,可以回顾它,并批判性地评估是否有进一步改进的机会。以下检查清单包含了一些你在此阶段应该问自己的有效(有时甚至是严苛的)问题:
-
这个故事达到了最初的目标吗?在你的脑海中想象期望的结果(决策、变化、批准):通过这个故事的呈现,它有多大可能变成现实?
-
当前的脚本符合你所面临的后勤限制吗?你认为有足够的时间完成它吗?你是否给了足够的时间进行问答和讨论?
-
这对于观众特别是关键决策者来说是否有吸引力?站在他们的角度想想:他们会如何反应?这是否与他们当前关注的热点话题相符?这是你希望他们思考的内容吗?这真的是他们关心的事情吗?他们会提出什么问题?
-
你是否有一个强而清晰的开头吸引点?它对关键决策者来说是否具有吸引力?
-
你是否提供了足够的初步背景?你是否在一开始就清晰地表达了目标?
-
你是否有明确的待展示数据场景列表?在这些场景中,是否有一个特别突出的?这个场景是否真能引发“啊哈”时刻的反应?
-
提升的见解是否按一定方式逐步展开,以便观众可以轻松跟随?你是否清楚每个场景中你想要传递的唯一信息?
-
你是否根据类型使用了正确的支持事实来支撑每个场景(参见表 8.2)?
-
在你用来支持数据场景的视觉材料中,是否有明确的行动标题?数据是否在前景中突出于其他内容?你是否通过清晰的引导标签突出了关键要素?颜色使用是否一致?字体是否太小?
-
你是否在结尾总结了关键收获?这些收获不超过 5 点吗?
-
你是否列出了所有提议的后续步骤,并为每个步骤指定了明确的负责人、描述和截止日期?
-
你是否利用了修辞方式来增强说服力(参见表 8.1)?你和你的故事是否看起来可信?有没有什么可以添加的内容,比如来源、个人简介和推荐信,以增强可信度?
-
仔细重新思考你所提供的逻辑思路,并请某人批评并扮演反对者的角色。它是否合逻辑?你的观众是否都能理解并跟随?逻辑链中是否有薄弱环节?
-
你是否通过使用意象、隐喻和个人经验与观众建立情感连接?你的结果是会让人赞同和谦逊,还是让人不悦和傲慢?
当你准备讲述故事时,确保为高质量的排练留出一些时间。故事中的一些弱点只有在实际讲述时才会显现出来。没有比通过几次排练更好的方式来打磨你的故事并增强自己讲述时的自信。我强烈建议你准备一个剧本,写下你想要说的内容。根据你讲演时的自信程度,你可以仅仅写下一个概要或要传达的关键信息要点,或者写一个完整的逐字剧本。即使在实际讲述时无法通过剧本来读,提前准备好剧本也会带来很大的好处:相信我,这真的有效!
如果你决定将你的故事写成完整的剧本,确保你的呈现方式不会显得机械或呆板。多次排练剧本,这样就不必每次都读它。
数据故事画布
本章内容丰富,涵盖的诸多概念、模型和技巧,肯定需要一些实践才能成为习惯。为了随时参考,你可以使用数据故事画布,它可以在图 8.3中找到(如果需要,你也可以从书籍网站下载可打印版本):

图 8.3:数据故事画布。按照结构来构建你的下一个故事
画布的结构作为支架,帮助有效构建数据故事。画布的框架将:
-
强迫你思考一些初步的方面,比如目标和受众(先做最重要的事!)。
-
引导你通过数据故事的关键部分(开头、中间和结尾),为你在构建叙事时提供空间,添加场景的占位符。
-
提供一个快速参考(如数据类型列表和简短版检查清单),在准备过程中非常有用,可以随时备用。
你可以在独立模式下使用画布来引导个人思考。如果有机会以团队协作的方式构建故事,你可以重复使用画布的结构来支持合作设计环节。在这种情况下,所有输入和想法可以作为便利贴添加到各个框中,或者作为文本注释添加到虚拟白板上,在进行远程会议时使用。下次尝试一下:这是一种高效的头脑风暴方式,能够汇聚集体创意,最终产生出色的故事。
摘要
我希望你像我一样享受本章带我们进入这个广阔而迷人的数据故事世界的激烈旅程。我们可以成为出色的数据分析师或受人尊敬的业务领域专家。然而,在一个商业组织中,我们常常缺乏自由决策和推动事务发生所需的充分权限,即使数据已经证明我们的观点是有效的。故事讲述扩展了数据分析的潜力,它让我们能够将数据转化为创造价值的行动。
我们从将说服的永恒要素(具备可信度、提供逻辑推理和激发情感参与)应用于商业数据开始,探索了故事在推动我们基于数据的建议方面能带来差异的多种原因。接着,我们经历了一个系统的过程,用来构建能够持久的、令人记住的数据故事,利用(简单但有效的)三幕式故事结构和五种原型数据场景类型。之后,我们掌握了一套实用技巧,用来完善故事并对其进行微调,使其呈现方式最有可能实现预期的结果。最后,我们探索了一个实用工具(数据故事画布),可以在需要时加以利用。
在结束和继续前的最后考虑事项:奇怪的是,在这个数据叙事章节中,你没有找到任何数据图表。现在,你应该清楚叙事和数据可视化之间的区别,有时候它们被混淆在一起令人困惑。图表本身并不能“说服”任何人,而故事可以。设计一个看起来不错的视觉比基于扎实叙述构建一个引人入胜的故事要容易得多。我希望你现在能够意识到在数据分析中叙事的至关重要性。
我告诉过你:这是你没有预料到的章节!
第九章:扩展你的工具箱
迅速掌握最新的数据分析工具和新颖技术无疑是一个永无止境的过程。在这个领域,你需要时刻准备好不断更新和扩展你的知识。到目前为止,本书已经涵盖了许多至关重要、与应用无关的数据技术,如数据清理与建模、机器学习、数据可视化和讲故事技巧。我们还学会了如何通过一个由 KNIME 和 Power BI 组成的坚实应用工具箱来应用这些技术。随着我们接近旅程的尽头,我们应该看看还有哪些工具可用,并且如何将所有应用整合在一起,充分发挥它们的最大潜力。
我们将特别讨论以下问题:
-
什么是 Tableau,我如何使用它进行可视化和讲故事?
-
什么是 Python,我如何开始使用它?
-
我如何通过集成 Python 或其他代码来提升我的工作流?
-
如何使用 KNIME 扩展包来增加功能?
-
什么是自动化机器学习,我应该对其未来的商业应用有何期待?
本章并不是为了让你成为 Python、Tableau 和其他工具的自主使用者。此阶段并不需要这样。你最初的工具箱(KNIME 和 Power BI)已经很好地满足了你的基本分析需求。本章的重点是向你展示其他可用的工具,并激发你对数据分析未来各种扩展方向的好奇心和兴奋感。
我们将首先介绍 Tableau,另一个数据可视化工具:通过一个简单的例子,我们将看到如何将我们在 Power BI 中学到的知识轻松应用到 Tableau 中。接下来,我们将学习 Python,并获得如何在分析中使用它的友好介绍。我们将看到如何通过扩展包将 Python 代码集成到 KNIME 中。最后,我们将了解自动化机器学习,并借助 H2O.ai 平台看到这一概念的实际应用。本章中的所有工具要么是开源的,要么提供免费试用选项,因此你有机会亲自尝试并评估它们如何帮助你和你的业务。
开始使用 Tableau
Tableau 作为斯坦福大学的衍生公司,已经在数据可视化领域开创了近二十年的先河,现在被认为是领先的商业智能平台之一。其直观的拖放式用户界面、与多种数据平台的集成以及高度可定制、高质量的图表类型,使得 Tableau 在商业专业人士、分析师和数据记者中非常受欢迎。
与 Power BI 类似,Tableau 有不同版本。本章我们将使用 Tableau Public:这是一款免费的桌面应用程序(您可以从 public.tableau.com 下载),它几乎包含了完整版(名为 Desktop Professional)中的所有功能,但也有一些重要的限制。首先,它依赖本地数据,因此您无法连接到远程数据源。此外,公共版本仅允许将结果保存在公共 Tableau 服务器上,该服务器对所有人开放:这意味着您无法将工作保存在计算机上。由于缺乏隐私保护,Tableau Public 不适用于日常业务需求,但我们仍然可以用它来探索 Tableau 的功能,并与 Power BI 进行对比。
您可以使用基于云的服务 Tableau Server 在线发布仪表板。您还可以仅通过浏览器设计仪表板,避免安装新软件。为此,您需要在上述 Tableau Public 网站注册,进入个人资料页面,点击 Create a Viz。网页版应用的用户界面与我们将在本章中使用的桌面应用非常相似。
延续本书始终贯穿的精神,让我们通过实践来探索 Tableau。 在这篇简短的教程中,我们将基于第6 章《Power BI 入门》中使用的销售数据库创建几种可视化:一个展示各类别相对权重的树状图和一个展示销售随时间变化的折线图。这次,三个表格(Transactions,ProductMD 和 CustomerMD)保存在一个单独的 Excel 文件 (SalesDashboardTableau.xlsx) 的不同工作表中:
-
打开 Tableau Public。在第一个屏幕上(看起来类似于图 9.1),点击左侧的 Microsoft Excel,并打开包含我们数据的文件:
![]()
图 9.1:Tableau Public 的初始屏幕:在左侧选择您想使用的文件类型
-
在下一个窗口,名为 Data Source 屏幕(图 9.2)中,您将在左侧看到我们刚刚打开的 Excel 文件中的三个工作表。通过将它们拖到左上方的空白区域,您可以构建一个实体关系图,定义仪表板的基础数据模型:
![图形用户界面,表格 描述自动生成]()
图 9.2:Tableau 中的数据源屏幕:拖放您的源表格并构建数据模型
为了做到这一点,我们需要按照正确的顺序操作。首先,拖动交易(Transactions)表并等待几秒钟,直到数据加载并且预览出现在底部。然后,拖动客户主数据(CustomerMD)表并将其放置在交易框的右侧:两者之间的线表明 Tableau 将连接这两个表。当你释放鼠标按钮时,编辑关系(Edit Relationship)窗口将出现(图 9.3):Tableau 成功识别出客户 ID(Customer ID)作为用于匹配行的列。我们可以通过关闭窗口来确认该关系,而不对默认设置进行任何更改。一旦完成此操作,就可以将产品主数据(ProductMD)表拖动到交易右侧,确保结果连接与图 9.2中的相似。最后,通过关闭弹出的窗口确认StockCode作为匹配列:你的数据模型准备就绪。
![图形用户界面,应用程序 自动生成的描述]()
图 9.3:编辑关系窗口:为你的连接选择一个或多个匹配条件
为了继续,点击底部左侧的工作表 1标签:你将进入 Tableau 的主界面,称为工作区(Workspace)(图 9.4)。让我们来探索工作区中的四个基本部分:
数据面板(Data Panel)是你找到所有数据列的地方,按表格进行组织。在这里,你可以拖动你希望在可视化中使用的量,或者创建计算字段。这类似于 Power BI 中的字段(Fields)部分。
可视化视图是你可以构建可视化内容的地方。在这里,你可以将数据面板中可用的字段与可视化中的视觉属性连接,在 Tableau 中,这些视觉属性被称为架子(Shelves)。例如,条形图的高度、点的位置、它们的颜色、大小以及标签上显示的文本,都是通过行(Rows)、列(Columns)和标记(Marks)架子来控制的(它们的使用将在我们进行教程时变得更加清晰)。在同一视图中,你还可以实现分页功能,并将一个可视化拆分为多个页面,每个页面显示给定列的不同值(你需要将该列拖到页面(Pages)架子上)。此外,在可视化视图中,你可以决定使用哪些字段来限制要显示的数据(筛选器(Filters)架子)。
显示面板(Show Me Panel)是你可以选择使用的图表类型的地方,比如折线图、树形图、直方图或地理图。
底部的条形图让你添加工作表标签并在它们之间进行导航。在 Tableau 中,每个工作表可以是三种不同类型之一:工作表(一个单独的图表)、仪表板(多个图表的组合)或故事(一个受控的工作表或仪表板序列,旨在传达数据故事,如你在第八章《用数据讲故事》中学到的那样):
![]()
图 9.4:Tableau 中的工作区界面:将列拖放到可视化特性中,选择图表类型,并在可视化、仪表板和故事之间切换
现在我们已经熟悉了工作区界面,可以构建我们的第一个图表,以展示每个类别和子类别在销售额方面的相对大小。然而,我们还没有包含每笔交易生成的收入的列,因此,我们需要首先添加一个计算字段来为我们进行数学计算。
-
右键单击数据面板中的价格列,然后选择创建 | 计算字段…,如图 9.5所示:
![图形用户界面,应用程序 自动生成的描述]()
图 9.5:在 Tableau 中创建计算字段:我们可以添加数学公式并生成新的量来进行可视化
系统会弹出一个对话框(图 9.6),让你输入新列的名称(在左上角的文本框中——在本例中我们使用
Sales),以及要使用的数学表达式,其中字段通过方括号表示。点击窗口最右侧的小箭头。你将打开一个额外的面板,类似于我们在 KNIME 的数学公式节点中看到的那样,提供许多可用的逻辑和数学函数,并且右侧有文本描述。在我们的案例中,表达式[Price]*[Quantity]就可以:将其写入左侧的框中(Tableau 会在你输入列名时帮助自动补全),然后点击确定继续。新的计算字段将出现在数据面板中,之后可以根据需要使用:![]()
图 9.6:定义计算字段:根据需要添加合并列的数学表达式
-
我们现在拥有了制作第一个可视化所需的所有元素:在第七章中学习了如何抵制使用饼图的甜蜜诱惑后,我们希望构建一个漂亮的树形图,展示按类别和子类别的销售相对大小。 在 Tableau 中构建可视化需要将感兴趣的数据字段(左侧数据面板中列出的列)拖放到一些可视化属性(在可视化视图中显示的货架)。对于树形图,你可以按照图 9.7中的箭头作为指南。首先将类别(第一个)和子类别(第二个)拖到名为文本的框中(稍后在确定图表类型时,它会自动重命名为标签)。然后,将新创建的销售额字段拖到大小框中。最后,将类别字段也拖到颜色框中,以控制区域的颜色:
![]()
图 9.7:在 Tableau 中构建树形图:将左侧的字段拖放到标记架右侧的框中
在 Tableau 中构建可视化图表后,你可以轻松地探索不同版本,其中将不同的图表类型应用于相同的数据。要尝试这个操作,请点击右侧Show Me面板中的各种框。那些由于当前数据无法渲染的图表类型会被灰显,且无法选择。Tableau 还可能推荐一种特定的图表类型,并用橙色突出其边框。我建议你在选择图表类型时始终牢记商业问题的背景,正如你在第七章中学到的那样,有效地可视化数据。
做得好!只需四次拖放,你就已在 Tableau 中构建了第一个可视化图表。我们可以轻松地看到“家居”类别(以及其中的“厨房”子类别)为我们的业务创造了最大的一块收入。
接下来是第二个商业问题:这次,我们希望将信息重点放在按类别划分的销售额趋势上。我们决定创建一个折线图,因为它是我们用来传达与数量随时间变化相关的见解的自然图表类型。
-
要创建一个新的可视化图表,点击底部Sheet 1标签右侧的第一个小+图标(或者,你可以点击顶部菜单中的工作表 | 新建工作表,或者直接按CTRL + M)。这样会出现一个空白的Sheet 2:这是我们绘制折线图的空间。
-
第一个拖动的字段是发票时间:将其拖到列架上。考虑到其类型(包含每个交易的日期和时间),我们需要告诉 Tableau 我们希望按哪个粒度级别(年、季度、月、周等)进行聚合。在此情况下,我们希望可视化每个月交易的一个数据点:右键单击该字段在架上的显示方式,然后在弹出菜单中选择第二个月项(参考图 9.8作为指导):
![图形用户界面,应用程序 自动生成的描述]()
图 9.8:使用日期字段进行折线图:右键单击该字段并选择所需的时间粒度。在本例中,我们选择按月份进行聚合。
-
接下来,让我们实现我们想要使用的其他字段,按照图 9.9中的拖放操作进行。将销售额拖到行架上(默认情况下会应用求和聚合,但你可以通过右键单击该字段并在度量子菜单中选择适当的函数轻松更改)。下一个要移动的字段是类别。将其拖放两次:首先拖到颜色框(这样我们就可以按类别区分线条),然后拖到标签框(这样我们就可以为每条线显示直接标签):
![]()
图 9.9:在 Tableau 中构建折线图:列和行架分别控制 x 轴和 y 轴
-
在编排仪表板之前,我们可以通过右键点击每个标签并选择Rename来编辑底部的工作表名称。我们可以为第一个和第二个可视化选择更有意义的名称,比如
Business by category和Sales trend。 -
现在是通过组合这两个可视化来构建仪表板的时机。点击底部Sheets选项卡中的第二个+图标,或者从顶部菜单中选择Dashboard | New Dashboard。
-
在新仪表板视图的左侧,您会找到我们构建的两个工作表列表,每个工作表对应一个我们创建的图表。要创建仪表板,只需将工作表拖放到右侧的空白区域,就像在图 9.10中看到的那样:
![图表 描述自动生成]()
图 9.10:在 Tableau 中构建仪表板:将可视化拖放到它们的位置
在仪表板视图的左下方,你会找到几个图标,可以将它们拖放到仪表板中,添加额外的对象,比如文本标签、图片、网页或扩展程序。试试看吧。
-
在发布仪表板之前,让我们配置各可视化之间的交互。如果你点击第一个可视化的任何空白区域,它将被选中,且其边框会高亮(让你可以调整形状,如果需要的话)。同时,几个图标会出现在选中可视化的右上角,正如在图 9.11中看到的那样。如果你点击过滤器图标,正如图中的箭头所示,你将把该可视化设置为仪表板中所有其他可视化的过滤器。你可以快速测试这个功能是否正常工作:如果你点击矩形树图中的任何子类别(你可以按住CTRL键一次选择多个子类别),你会注意到折线图会相应更新,只显示所选部分的趋势。这正是我们所期待的:
![图表,矩形树图 描述自动生成]()
图 9.11:在 Tableau 仪表板中使用可视化过滤后续图表。点击右上角的过滤器图标
-
现在我们可以将工作发布到服务器:只需打开顶部的File菜单,然后点击Save to Tableau Public...。接下来,选择一个名称(我选择了
Ecom Sales Dashboard),点击OK,并等待几秒钟,直到数据上传完成。浏览器将自动打开并显示发布的仪表板,尽显优雅(你可以在 tiny.cc/ecomdashboard 查看我的版本,并在图 9.12中看到):![图表,矩形树图 描述自动生成]()
图 9.12:发布在 Tableau Public 服务器上的仪表板:让其他人访问并与之互动
在过去几页中,我们快速浏览了 Tableau 的基本功能:我们学习了如何加载数据,如何在一个简单的数据模型中组合数据,创建计算字段,构建可视化并将它们结合在一个交互式仪表板中。我相信你已经注意到 Tableau 与我们在 Power BI 上所学内容之间的相似性。我们本可以继续探索其他商业智能平台,如 Qlik、MicroStrategy 和 TIBCO Spotfire,仅举几例。令人(兴奋的)现实是,它们的工作原理大致相同,最后几章已经为你提供了开始并为你的业务创造价值所需的一切,无论你使用哪个工具。
现在,让我们进入数据分析工具箱的下一个“扩展”阶段,继续使用 Python。
用于数据分析的 Python
Python 是一种日益流行的高级编程语言,特别适用于数据分析和机器学习应用。丰富的数据分析相关库的可用性以及易学的语法,使其成为许多数据科学从业者的首选。
Python 名字背后的故事与蛇无关。它的创造者,荷兰程序员 Guido van Rossum,是 1970 年代 BBC 喜剧系列《Monty Python's Flying Circus》的忠实粉丝。所以他为这个项目选择了 Python 这个名字,以此向那个节目中英国喜剧团体的不拘一格的天才致敬。
由于本书侧重于可视化编程,我们不会深入讲解编程原理。相反,本节的目的是让你看到 Python 在熟悉的问题上的实际应用,并了解它如何在我们的日常工作中使用。我们将首先通过一个脚本,重复我们在第五章,在工作中应用机器学习中看到的回归教程。然后,我们将看到 Python 如何与 KNIME 平滑集成,以充分发挥两种互补的分析编程方法的优势。
Python 语言的温和介绍
要使用 Python,你可以安装像 Anaconda 这样的开发平台(我们稍后会做这个),或者利用基于网页的界面,如 Colab。Google Colab(Colaboratory 的简称)是一个免费的云服务,允许你编写并运行 Python 代码,而无需任何设置:你可以通过 colab.research.google.com 访问它。
正如你在图 9.13中看到的,Colab 的用户界面是一个交互式网页,你可以在其中添加文本和代码,然后逐行运行:

图 9.13:Google Colab 欢迎界面:无需安装任何软件即可开始使用 Python
为了简化与 KNIME 的比较,让我们使用 Colab 来处理我们在第五章《在工作中应用机器学习》中遇到的同一个罗马住房商业案例。作为提醒,目标是通过将线性回归学习算法应用于历史租赁协议数据库来预测租金价格。你可以通过连接到 tiny.cc/romecolab 来一步步跟随完整的 Colab 脚本。
让我们逐步分析代码,并理解每一部分的作用:
import pandas as pd
import numpy as np
import statsmodels.formula.api as smf
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, mean_squared_error
第一步是将一些有用的库导入到 Python 环境中。这将使得我们能够利用一些额外的功能(例如加载 Excel 文件和计算线性回归)。特别是在前面的代码中,我们使用了几条import语句来引入一些最流行的 Python 库,这些库广泛用于数据分析,具体包括:Pandas 用于数据处理,NumPy 用于数值运算和数组计算,Statsmodels 用于硬核统计分析,Scikit-learn(代码中为sklearn)用于机器学习:
full_data = pd.read_excel("RomeHousing-History.xlsx")
full_data.head()
接下来的步骤,我们通过使用pd.read_excel()函数读取存储在 Excel 文件中的数据,并将其内容分配给full_data变量。然后,我们可以通过可视化数据的前五行来检查导入的数据,使用head()函数,输出如图 9.14所示:

图 9.14:head() 函数在 Colab 中显示的输出:我们数据集的前五行,是一个非常有用的预览
我们得到的数据正是我们在第五章《在工作中应用机器学习》教程开始时遇到的数据(见图 5.2中的前几行)。我们可以继续进行每个监督式机器学习过程的第一步,即数据划分:
train_set, test_set = train_test_split(full_data,test_size=0.3)
在train_test_split()函数的帮助下,我们对完整数据集进行了随机抽样,并获得了训练集和测试集(我们将其设为总数据的 30%),这些数据分别存储在train_set和test_set变量中。这行 Python 代码实现了 KNIME 中 Partitioning 节点为我们做的操作。现在,我们已经拥有了使用训练集来训练模型所需的一切:
model = smf.ols(formula='Rent ~ Rooms + Surface + \
Elevator + Floor_number + \
C(Neighborhood) + C(Property_type) + \
C(Floor_type)',data=train_set).fit()
print(model.summary())
利用 smf.ols() 函数,这段代码训练了一个普通最小二乘回归模型(OLS,正如我们在 第五章,在工作中应用机器学习 中遇到的那样),使用 train_set 变量作为输入。输出模型存储在一个名为 model 的对象中。在训练模型时,我们可以编辑代码中看到的公式字符串(Rent ~ Rooms + Surface + ...),以选择哪个列作为目标变量(在我们的案例中是 Rent,出现在 ~ 符号之前)以及其他哪些列应作为预测变量(它们出现在 ~ 符号后,并由 + 符号分隔)。类别列需要被 C() 函数封装(如 C(Neighborhood)):通过这样做,Python 会将它们转换为多个数值列(虚拟变量),这些列与线性回归模型兼容。线性回归公式的定义和名义变量的转换是由 KNIME 中的 线性回归学习器 节点在“幕后”完成的,而在 Python 中,它们需要在代码中明确指定。最后,summary() 函数总结了回归结果,包括每个特征的系数和 p 值。如果将 Python 中获得的输出(图 9.15)与 KNIME 中 线性回归学习器 节点的输出(图 5.9)进行比较,你会发现数字有所不同(当然,随机抽样总会产生略微不同的结果),但它们是一致的。例如,我们注意到,Piazza Navona 是一个高档社区(因为它的系数,在 coef 列中显示,高于所有其他地区),而电梯的存在可以忽略不计(高 p 值,如你在 P>|t| 列中看到的):

图 9.16:对比视图,展示了 Python 的关键函数与进行线性回归所需的相应 KNIME 节点:基本步骤完全相同
本练习澄清了可视化编程(你在 KNIME 中可以做的事情)与传统编程(你可以使用 Python 或任何其他语言来编写代码)之间的区别。每种方法都有其优缺点,个人偏好选择其中任何一种都是很自然的事情。好消息是……你不必在这两种选择之间做出最终决定。实际上,可视化编程和编码可以结合使用,这样就能为你的数据分析魔法创造出强大的效果。在接下来的几页中,你将学习如何将 Python 代码片段嵌入到 KNIME 工作流中。这是一个非常有价值的技巧,因为它能让你最大程度地利用 KNIME 的易用性与 Python 的广泛功能的结合。即使你此时不打算将 KNIME 与 Python 集成,我也建议你还是浏览接下来的几页。它们将让你有机会了解两个你应该知道的重要功能:KNIME 扩展和 KNIME Hub。
Python 与 KNIME 的集成
首先,你需要确保你的计算机上已经安装并运行了本地版本的 Python。获取它最简单的方法是安装Anaconda 个人版,这是一个非常流行的 Python 数据分析分发平台。下载并安装最新版本的软件,免费提供,下载地址为anaconda.com/download。Anaconda 内置了多个用于 Python 和 R 编程的应用程序。例如,Jupyter Notebook,它让你可以通过 Web 浏览器创建 Python 脚本——就像我们在 Colab 中做的一样,但没有任何限制。在Anaconda Navigator的欢迎页面中(图 9.17),你可以启动 Jupyter Notebook 或安装其他应用程序,如 RStudio,用于 R 开发:

图 9.17:Anaconda Navigator 的欢迎屏幕:从这里,你可以启动 Jupyter 笔记本进行 Python 编程,或者安装额外的免费包。
如第二章《KNIME 入门》所述,你可以通过安装额外的扩展来扩展 KNIME 的功能。为了在我们的工作流中嵌入 Python,我们需要安装KNIME Python 集成扩展。操作步骤是:打开 KNIME,点击顶部栏的文件 | 安装 KNIME 扩展...,然后在顶部的文本框中输入python进行搜索 (图 9.18)。勾选KNIME Python 集成选项,点击下一步,然后按照安装过程进行操作:

图 9.18:在 KNIME 中安装扩展的对话框。看看可用的包列表:你可以轻松地通过成千上万个新的 KNIME 节点扩展你的分析工具包。
完成后,系统会提示你重启 KNIME 以应用软件更新。重启后,去节点库并打开脚本 > Python文件夹。正如你在图 9.19中看到的,通过安装该扩展,你将获得几个可以在工作流中使用的新节点:

图 9.19:安装 KNIME Python 集成扩展后的节点库:几个新节点已经显示出来
在此之前,让我们完成设置 KNIME 与 Anaconda 自带的 Python 环境连接所需的最后一步。操作是:在 KNIME 中点击文件 | 首选项,然后在左侧出现的菜单中,选择KNIME > Python,或者使用左侧的文本框搜索 Python 首选项窗口,正如你在图 9.20中看到的那样。你应该能看到预先填充的 Anaconda 安装目录路径(如果没有,你需要通过点击浏览...按钮来设置)。设置完成后,点击Python 3 (默认)部分中的第二个新建环境...按钮,正如下图所示:这将创建一个新的 Python 环境,包含所有与 KNIME 集成所需的包:

图 9.20:KNIME 首选项中的 Python 窗口:你需要告诉 KNIME 本地 Python 环境的位置
在下一个窗口中 (图 9.21),点击创建新环境,并耐心等待环境生成。完成后,你就完成了所有设置,准备好将你所需的 Python 功能集成到 KNIME 工作流中了:

图 9.21:新环境对话框:在 KNIME 中启动 Python 的最后一步
如果你希望在 KNIME 工作流中使用 R 而不是 Python,你需要安装KNIME 互动式 R 统计集成,并通过首选项菜单设置 R 环境,类似于我们为 Python 所做的设置。KNIME 还允许你对表格的每一行运行一些 Java 代码:查看Java 片段节点了解更多信息。
在你通过安装 Python 扩展获得的新节点中(图 9.19),Python 脚本无疑是最通用的:该节点允许你嵌入一系列 Python 代码,应用于存储在输入表格中的数据(通常称为 input_table_1),以生成一个或多个输出表格(称为 output_table_1)。你可以在脚本中引用这些表格,并像使用 Python 中的任何数据框一样自由使用它们。例如,如果你想对两列(数量 和 价格)进行简单的乘法运算,并输出一个附加列(销售额)作为结果,使用此节点的 Python 脚本将如下所示:
output_table_1 = input_table_1
output_table_1['Sales'] = output_table_1['Quantity'] * output_table_1['Price']
第一行代码只是将输入表复制到输出表中,保持不变。第二行代码应用了对两个列的乘法——就这么简单。我们本可以导入任何库(前提是它们已安装在 Anaconda 的 Python 环境中),并利用它执行我们需要的任何操作。
让我们来看一个简单的工作流,展示在我们的分析工作流中集成 Python 的强大功能。我们无需从头开始构建这个工作流,而是可以在KNIME Hub中找到已经存在的版本,KNIME Hub 是一个在线工作流、扩展、组件和节点的资源库。如图 9.22所示,打开KNIME Hub面板(你会在右上角的节点描述标签旁找到它),然后在搜索框中输入 Python Gaussian Fit。在众多选项中,你应该能找到一个包含我的名字和照片的工作流:这就是我为你准备的工作流。要将其导入到你的 KNIME 安装中,你只需将框(如图所示)拖动并放到你的工作流编辑器中。另一种方法是导入KNIME 工作流(文件 | 导入 KNIME 工作流...),你可以在 GitHub 仓库中找到它:

图 9.22:KNIME Hub 面板:搜索你需要的工作流、节点或组件,并将它们拖放到你的工作区
如果你打开Python View节点的配置对话框,你将看到如图 9.23所示的代码窗口。中间的文本框是你可以编写 Python 代码的地方。在左侧,你会看到输入表中可用的列列表:通过双击它们,相关的 Python 数据框将被添加到代码中。你还可以通过点击执行脚本或执行选定行按钮来测试你的代码,检查其是否正常运行。如果在执行脚本时遇到任何警告或错误,它们会方便地显示在窗口底部的控制台框中:
![图形用户界面,文本,应用程序
自动生成的描述
图 9.23:Python View 节点的配置窗口:使用 Python 图形库生成任何你喜欢的图表
在这个特定案例中,我们利用Python View节点将高斯函数(著名的钟形曲线)拟合到罗马租金价格的分布,并返回带有拟合曲线的直方图。在此阶段无需详细了解代码,但你会注意到,代码中通过input_table['Rent']引用了Rent列,而生成的图表被保存在名为output_image的变量中:你可以在图 9.24中看到最终结果:

图 9.24:Python View 节点的输出:罗马的租金价格约为 €1,000
这为你展示了 Python 节点是如何工作的:输入端口的数据被转换为输入变量,在脚本的末尾,分配给输出变量的内容会被返回到节点的输出端口。在你从 KNIME Hub 下载的相同工作流中,你还会看到一个Python Script节点的示例:本质上,两个节点都在输入数据上运行 Python 代码,但Python View节点“专门”用于输出图像。
在工作流中交织代码具有巨大的潜力。如果你想应用一些复杂的逻辑或重用在 KNIME 之外开发的专用代码来解决你的特定业务需求,你现在可以将这些代码无缝集成进来,极大地扩展你的工具箱功能。
在看到 Python 实际操作后,让我们回到无代码分析的世界,了解高级分析的一个有前景的方向:自动化机器学习。
自动化机器学习
“暴力模式发现”:这可以简洁(且生动)地概括自动化机器学习,简称AutoML,的核心内容。正如你在第四章和第五章中看到的,构建一个机器学习模型远不是一个线性、单次尝试的过程。获得高性能监督学习模型的常规过程是经历一系列的“反复”尝试:每次我们都会对模型或其特征进行一些“调优”,并检查预测性能是否有所提升。我们已经看到过一些这些机制的实际应用:
-
超参数优化:这是对学习算法的操作方式进行调整,比如我们在决策树中启用了剪枝,或改变了多项式回归的次数。在更复杂的模型(如深度神经网络)中,改变参数(例如网络中的神经元数量)可能会显著影响性能。
-
特征选择:通过选择特征的子集(并去除冗余特征),使模型学习集中在最重要的部分,从而提升其预测能力。我们在决定从回归模型中移除一些高 p 值特征时就做了这一操作。此外,减少模型运行所需的特征意味着节省时间和计算资源。
-
特征工程:通过组合或转换原始特征来生成新的特征,使其对模型更具信息量。例如,这就是我们在回归中创建虚拟变量时所做的。
-
集成学习:我们曾提到, 有时可以将不同的算法组合在一个学习过程中。想象一下,预测租金时,使用五个不同的回归模型,然后将这五个中间预测值的平均值作为整体预测:通过将替代模型组合在一起,你可能获得一个更强健的模型。
与其手动逐一检查每个调整步骤的效果,不如构建一个程序,利用所有可用的计算能力来找到通向最佳模型的路径。这正是 AutoML 方法所承诺的目标:自动化识别最大化整体性能(并且——希望——能够带来业务影响)的参数、特征和模型组合的“试错”过程。
AutoML 目前是商业应用 AI 中的热门话题,市面上已有越来越多的产品和开源库,支持将 AutoML 应用于实际任务,包括 H2O.ai、DataRobot、auto-sklearn、Google Cloud AutoML、IBM AutoAI、Amazon AutoGluon 和 Azure AutomatedML。随着我们不断扩展分析工具箱,让我们看看其中一款产品的实际应用:这将给你一个关于目前已有的产品及未来几年内我们公司可能推出的产品的了解。
我们将探索 H2O Driverless AI,一个基于云的服务,允许你使用网页界面上传数据,运行 AutoML 进行预测,并解释结果。如果你想亲自测试,可以访问 h2o.ai/products/h2o-driverless-ai,注册一个免费帐户,并创建一个 Driverless AI 实例。
AutoML 实践:一个 H2O.ai 的示例
在这个示例中,我们将再次使用罗马住房的业务案例:这次,我们将上传 Excel 数据集并创建一个新的实验。图 9.25 显示了界面的样子:你可以选择 目标列(在我们的案例中是 租金),为 评分器 选择一个指标(在图中,你可以看到我们选择了 RMSE),然后调节底部的三个旋钮,设置期望的预测 准确性、训练模型所需的 时间 和 可解释性 水平。这部分非常有趣:当你操作旋钮时,系统会更新其“试错”策略(你可以在左侧看到一个动态摘要),并在 AutoML 搜索过程中执行。如果你选择高准确性和低可解释性,你最终将得到高性能的黑箱模型,而如果将可解释性设置为较高水平,你将得到特征较少、便于解释的简单模型,以便向你的业务伙伴解释它是如何工作的:

图 9.25:H2O Driverless AI 中的实验设置页面:通过调节旋钮,确定你希望生成的模型如何被“烹饪”
点击 启动实验 后,远程计算资源将为你完成繁重的工作,而你可以去拿点喝的。下图显示了随着越来越多的模型被迭代尝试,得分指标的实时演变,完成后将显示最佳结果(图 9.26):

图 9.26:AutoML 例程的结果:在左下角,你可以看到随着搜索迭代的进行,评分指标是如何变化的
作为 AutoML 过程的一部分,我们还获得了一些有用的视图,帮助我们理解模型的工作原理。请看看为我们的租金预测生成的解释仪表盘(图 9.27):
-
在右上角,我们看到一个条形图显示 特征重要性:毫不奇怪,邻里是预测租金时最有用的单一列,紧随其后的是物业的 面积。
-
在左下角,我们有一个基于树的 替代模型:这是 AutoML 例程生成的实际预测模型的“简约”版本。通过查看这个树的前三个层次,我们可以得到一个高层次、易于解释的视图,展示了将最重要特征与租金联系起来的模式。
-
在右下角,我们可以看到部分依赖图:它展示了特定特征(在图 9.27中为Surface)对预测结果(Rent)的边际影响。此图为我们提供了一个额外的解释关键,揭示了“租金”如何随着“面积”的增加而上升:
![A screenshot of a computer 描述自动生成,信心中等]()
图 9.27:模型解释仪表板:获取有关预测模型如何工作的提示
通过这个例子,我们充分欣赏了 AutoML 方法的所有潜力。只需几次点击,我们便获得了一个强大的预测模型(可以导出并部署以供进一步使用),以及一个简单的框架来解释其结果。需要进一步考虑的是:尽管它看起来像是机器学习的“圣杯”,但在商业环境中使用 AutoML 仍然需要用户始终“知道自己在做什么”。这意味着,构建机器学习专业知识,并且总体上提高数据分析能力(就像在本书中所做的那样),对于充分利用这项技术至关重要,尽管它看起来已变得自动化且易于使用。
AutoML 可以成为我们数据分析工具包中的另一个宝贵工具。好消息是,你会发现这个方法在 KNIME 中也得到了很好的实现,因此你可以将其与本书中所学的其他内容连接起来。如果你打开名为 H2O AutoML for Regression 的示例工作流(你可以在 KNIME Explorer 中的示例服务器或在 KNIME Hub 中搜索到它),你将被要求安装一个新的扩展:KNIME H2O 机器学习集成。通过安装这个扩展,你可以在 KNIME 中使用我们在 H2O Driverless AI 中看到的许多 AutoML 功能。看一下前面提到的示例工作流(图 9.28):通过使用一些 H2O 节点—按照常见的监督学习结构(包括划分、学习者、预测器和评分器)组织—你可以直接在 KNIME 中获得 AutoML 的全部功能:

图 9.28:H2O AutoML 回归 KNIME 工作流:使用 AutoML 为你找到最佳模型
总结
我希望这最后一章能让你对进一步扩展数据分析工具箱的各种方向感到兴奋。我们在 Tableau 中迈出了第一步,意识到它在基本功能上与 Power BI 是如此相似。我们还通过对 Python 的友好介绍,了解了这一在数据科学中无处不在的编程语言。当我们将 Python 集成到 KNIME 中时,我们看到了如何从可视化和编码编程两个世界中获取最佳成果。与此同时,我们借此机会学习了如何通过利用 KNIME 庞大的扩展库以及公共的 KNIME Hub 环境来进一步扩展 KNIME。最后,我们对 AutoML 的迷人领域进行了简短的探索,了解了它简化构建高性能机器学习模型过程的强大能力。
在这一章中,我们通过探索新的工具和方法,扩展了我们的工具箱,以便在日常工作中更好地进行数据分析。我的建议是把这变成一个习惯。我在许多数据从业者中看到的一个局限性是,他们认为自己熟悉的少数工具 永远 是最适合他们的,从而陷入了自给自足的局限性偏见。所以,别对我们刚刚建立的工具箱感到满足——要做好持续探索的准备:保持好奇心,因为数据分析的不断扩展世界将提供许多精彩的东西!
第十章:那么,接下来呢?
这是一次漫长的旅程,但你成功了:你刚刚完成了一段了不起的旅程!
在这九章内容中,我们亲自掌握了数据分析的潜在价值,并认识到了解锁这些价值的几种实用方法。我们已经构建了一个随时可以使用的数据应用工具箱(以 KNIME 和 Power BI 为核心),你现在可以在需要时使用它。最重要的是,你已经获得了一套广泛的工具无关的数据能力,可以在任何应用中加以利用。无论是组织、清理和转化数据;基于机器学习算法构建、验证和解读模型;设计、准备和展示基于有效可视化的数据故事……这一系列广泛的基础知识和数据能力将使你受益,无论你今天使用什么具体的软件,或是明天将使用什么软件。你所完成的教程让你在相关的商业需求上获得了一些现实世界的经验,比如自动化数据管道、预测消费者行为、预判价格、创建有意义的客户群体以及构建互动仪表板。恭喜你完成了所有这些——你有很多值得自豪的成就!
如果你享受了这次旅程,你可能会问:“...接下来呢?” 在我们结束这段旅程时,我想与您分享我在旅程早期得到的两条建议,这些建议在我的个人和职业生活中非常有帮助。
第一条建议是保持好奇心,永远不要停止学习。这说起来容易,但做起来难。个人发展不会自然而然地发生,它需要适当的规划。安排一些时间在你每周的日程里(为什么不在每个星期五安排几个小时?)来阅读更多关于数据分析领域的书籍,选择那些最令你感兴趣的方面。关注一些博客文章(Towards Data Science、Data Science Central、Low Code for Advanced Data Science 和 Storytelling with Data 是我最喜欢的一些),参加在线或传统课程(Coursera 和 edX 平台上有许多免费的高质量大学课程——其中一门对我影响很大的“经典”课程是 Andrew Ng 的 Machine Learning)。你需要时刻关注现在正在做的事情以及即将到来的发展。数据分析是一个多学科、流动性的领域,你需要拥抱真正的成长心态,才能全面应对它。将每一次你不知道如何做某件事的情况,转化为学习的机会。保持好奇心!
第二点是有意识地寻找机会将你所学应用到日常工作中。我建议你计划如何在未来利用你的新技能。既然你对这些都了如指掌,现在就行动起来吧:拿一张白纸,列出你可以立即实施的两三个实验。比如用团队最常用的数据制作一个简单的仪表盘?或者,用最热门的业务挑战创作一个引人注目的故事?尝试自动化繁琐的数据清理过程,或者使用你学到的机器学习算法来改善今天的决策方式。你不必追求复杂和华丽。我见过很多伟大的数据分析倡议从只有两个基本元素开始:一小群热情的人认为他们有一个好主意,以及一个简单粗糙的原型,证明了这个主意的价值并获得更多人的支持。我的建议是系统地做这件事:强迫自己选择几个要测试的想法。现在就开始吧。
如果你想不出主意或者数据不足,考虑加入 kaggle.com 并参加其中的一些分析竞赛:你将获得丰富的数据集,一些真实的任务简介,并有机会与其他专业或业余的数据从业者竞争。或者,询问当地的慈善机构是否需要帮助整理他们的数据或为他们的事业创造价值。今天你周围有很多机会可以利用数据分析:去发现它们吧。
我写这本书是为了赋予你力量,让你对数据分析充满激情。希望它能达到预期效果。无论如何,我都很乐意与你建立联系:请与我联系(你可以在下面找到我的联系方式;最简单的方法是添加我到 LinkedIn 并发送消息)。每一点反馈,每一个观点,甚至更好的是你驱动的数据分析成功案例的故事,我都会高度赞赏,并承诺以任何我能做到的方式回应。
祝愿你在不断发展中一切顺利,并希望数据分析能在你的道路上对你有所裨益!
安德烈亚·德·莫罗
联系方式:
-
书籍满意度调查:tiny.cc/dataanalyticssurvey
-
LinkedIn: linkedin.com/in/andread
-
ResearchGate: researchgate.net/profile/Andrea_De_Mauro
-
Twitter:@about_big_data
第十一章:有用的资源
第一章
-
关于数据分析职位类别和相关技能的全面回顾,你可以查看我在该主题上的一些研究论文,特别是:De Mauro, A., Greco, M., Grimaldi, M., Ritala, P. "Human resources for Big Data professions: A systematic classification of job roles and required skill sets." Information Processing & Management 54.5 (2018): 807-817,
doi.org/10.1016/j.ipm.2017.05.004。 -
若要获得有关数据分析领域众多工具的视觉总结,你可以查看由 Matt Turck 每年更新的《数据与 AI 数据景观》:
tiny.cc/datalandscape。 -
要了解更多关于运营研究和机器学习向处方分析融合的进展,你可以阅读 Lepenioti, K., Bousdekis, A., Apostolou, D., & Mentzas, G. "Prescriptive analytics: Literature review and research challenges." International Journal of Information Management 50 (2020): 57-70,
doi.org/10.1016/j.ijinfomgt.2019.04.003。
第二章
-
我建议查看 KNIME 的备忘单:它们是每个特定主题中“重要节点”的 1 页视觉摘要。可以在此处查看:
www.knime.com/cheat-sheets。 -
正则表达式可以大幅扩展你的模式匹配能力。当你需要清洗数据并检查复杂格式规则时,它们非常有用。从
regexone.com/获取正则表达式速成课程,或者使用regexr.com/直接在网页上测试你的表达式。 -
KNIME 的 YouTube 频道充满了短视频,供你探索节点和技术。你可以在这里查看:
www.youtube.com/user/KNIMETV。
第三章
-
若要了解如何构建数据清单,可以查看 IBM 提供的指南:
www.ibm.com/cloud/learn/data-catalog。 -
若要快速了解 KNIME 中的循环,可以查看以下自学模块:
www.knime.com/self-paced-course/l2-dw-knime-analytics-platform-for-data-wranglers-advanced/lesson4。 -
若要了解 KNIME 中的变量,可以通过以下附加的 KNIME 学习模块:
www.knime.com/self-paced-course/l2-ds-knime-analytics-platform-for-data-scientists-advanced/lesson2。 -
如果你需要在从 KNIME 导出数据到 Excel 时添加一些视觉格式(如字体类型和颜色),我推荐使用 Continental 社区扩展,网址是
www.knime.com/community/continental-nodes-for-knime-xls-formatter。
第四章
-
想要了解主题建模的一般介绍,请参考
monkeylearn.com/blog/introduction-to-topic-modeling。特别地,LDA 在 KNIME 中通过 Topic Extractor(并行 LDA)节点实现,该节点是 KNIME 文本处理扩展的一部分。 -
以下论文揭示了将强化学习应用于实际问题时所面临的挑战:Dulac-Arnold, G., Mankowitz, D., & Hester, T. "Challenges of real-world reinforcement learning." arXiv 预印本 arXiv:1904.12901 (2019),
arxiv.org/pdf/1904.12901.pdf。 -
神经网络是最有前景的机器学习算法之一。它们构成了一个独立的机器学习子学科,叫做深度学习。想要开始使用 KNIME 进行深度学习,我推荐阅读 Melcher, K., Silipo, R., 《使用 KNIME 无代码深度学习:构建、训练和部署各种深度神经网络架构》。Packt Publishing Ltd, 2020 年。
-
想要了解弱人工智能与强人工智能之间的差异以及后者几乎无法实现的原因,可以阅读 Fjelland, R. "Why general artificial intelligence will not be realized." 《人文学与社会科学通讯》 7.1 (2020): 1-9,
doi.org/10.1057/s41599-020-0494-4。 -
想了解与机器超智能到来相关的各种情景,可以阅读 Bostrom, M. 《超级智能:路径、危险与策略》。牛津大学出版社,2014 年。
-
准确率、精确度和敏感性并不是评估分类模型的唯一总结性指标。请查看 Maarit Widman 的这份演示文稿,了解在 KNIME 中可以计算的其他度量方法:
www.slideshare.net/KNIMESlides/scoring-metrics-for-classification-models,或者阅读电子书:Widmann, M., Roccato, A., "从建模到模型评估",KNIME 出版,2021 年,www.knime.com/sites/default/files/2021-05/Book-From-Modeling-Model-Evaluation-KNIME-05052021.pdf。
第五章
-
想了解如何使用 KNIME 组件进行时间序列分析,可以查看以下内容:Tonini, D. Weisinger, C., Widmann, M. "Time Series Analysis with Components", 低代码高级数据科学(2021),
tiny.cc/KNIMEtimeseries。 -
要了解 k 均值算法如何一步一步地运作,请查看 Naftali Harris 的这个模拟器:
www.naftaliharris.com/blog/visualizing-k-means-clustering。 -
阅读以下内容,了解更多使用 KNIME 检测异常值的方法:Widmann, M., Heine, M., 《四种异常值检测技术》,《低代码高级数据科学》(2021),
tiny.cc/outlierdetection。
第六章
-
有大量的 Power BI 示例仪表板供你更好地熟悉其功能。要了解如何访问它们,请阅读:
docs.microsoft.com/en-us/power-bi/create-reports/sample-datasets。 -
完成本书后,要进一步提升你的 Power BI 技能,可以查看这本书:Powell, B., 精通 Microsoft Power BI:高效数据分析和商业智能的专家技巧。Packt Publishing Ltd, 2018。
第七章
-
关于视觉优于其他感官,或者像 John Medina 所说的,“视觉胜过所有其他感官”,请参见:Medina, J. J., 12 条生存与发展原则,适用于工作、家庭和学校。Pear Press, 2009。
-
关于视觉在人类认知中的重要性,包括 David William 教授关于大脑皮层中与视觉相关部分的主张,访问:
www.rochester.edu/pr/Review/V74N4/0402_brainscience.html。 -
要了解更多关于前注意属性的信息,你可以阅读书籍 Few, S. "给我看数字。" 分析出版社 (2004),或者阅读 Few 的文章《变异的视觉感知》,文章链接:
www.perceptualedge.com/articles/visual_business_intelligence/the_visual_perception_of_variation.pdf。 -
1984 年,Cleveland 和 McGill 来自贝尔实验室发布了关于前注意属性的早期版本。论文展示了许多 80 年代的经典图表,值得一读:Cleveland, W. S., McGill, R. "图形感知:理论、实验与图形方法的应用。" 美国统计学会杂志 79.387 (1984): 531-554。
-
对于更广泛的图表选择,我推荐 Stephen Few 在 Perceptual Edge 网站上发布的图表选择矩阵:
www.perceptualedge.com/articles/misc/Graph_Selection_Matrix.pdf。 -
要了解 Stephen Few 对饼图的看法及其不推荐使用饼图的诸多原因,你可以阅读他的文章《把饼图留给甜点》,文章链接:
www.perceptualedge.com/articles/visual_business_intelligence/save_the_pies_for_dessert.pdf。 -
若要了解更多关于旋转文本对可读性的影响,请参考 Wigdor, D., & Balakrishnan, R. "Empirical Investigation into the Effect of Orientation on Text Readability in Tabletop Displays." ECSCW 2005。Springer, Dordrecht, 2005。
-
若想了解色盲如何影响数据可视化以及如何使我们的图表更加易于理解,请阅读此文章:
www.tableau.com/about/blog/examining-data-viz-rules-dont-use-red-green-together。
第八章
-
如果你想了解更多关于认知心理学研究如何证实故事叙述在讲故事中的重要性,可以查看:
www.storypack.co/post/stanfordstorytelling-why-retention-is-higher-through-stories。 -
瑞典教授 Hans Rosling 是数据讲故事领域的巨人之一。可以观看他的一些启发性视频,比如 TED 演讲 "The Best Stats You've Ever Seen",链接:
tiny.cc/beststats,以及 BBC 纪录片 "200 Countries, 200 Years, 4 Minutes",tiny.cc/200countries。 -
我找到的关于数据讲故事特别有用的两本书是 Dykes, Brent. Effective Data Storytelling: How to Drive Change with Data, Narrative and Visuals。John Wiley & Sons, 2019,以及更侧重于数据可视化的:Knaflic, C. N. Storytelling with Data: A Data Visualization Guide for Business Professionals。John Wiley & Sons, 2015。
第九章
-
若要了解更多关于 Tableau 的信息,我推荐 Meier, M., Baldwin, D. Mastering Tableau 2021: Implement Advanced Business Intelligence Techniques and Analytics with Tableau。Packt Publishing Ltd, 2021 和 Loth, A. Visual Analytics with Tableau。John Wiley & Sons, 2019。
-
要开始你的 Python 学习之旅,可以参考:Matthes, E. Python Crash Course: A Hands-On, Project-Based Introduction to Programming, No Starch Press, 2019,然后深入学习机器学习应用:Raschka, S., Mirjalili, V. Python Machine Learning: Machine Learning and Deep Learning with Python, scikit-learn, and TensorFlow 2。Packt Publishing Ltd, 2019。
-
一个很好的集成 KNIME、Python 和 Tableau 的例子是 Ganzaroli, D., "Data Science With KNIME, Jupyter, and Tableau Using COVID-19 Projections as an Example",Low Code for Advanced Data Science (2021),
tiny.cc/knimefusion。 -
若要了解如何将 H2O Driverless AI 与 KNIME 集成,请参考此指南:
docs.knime.com/2020-07/h2o_driverless_ai_guide/h2o_driverless_ai_guide.pdf。









CSV 读取器
排序器
Excel 写入器
Excel Reader
重复行过滤器
字符串操作
行过滤器(Row Filter)
缺失值
列过滤
列重命名
列重排序器
CSV Writer
Joiner
按组
Pivoting
Concatenate
数字转文本
数学公式
组循环起始
循环结束

String to Date&Time
基于日期和时间的行过滤器
表格行到变量

提取日期和时间字段
折线图
图像写入器(端口)
统计

划分
线性回归学习器
参数。
回归预测器
数值评分器





决策树学习器

Decision Tree Predictor
评分器

随机森林学习器
随机森林预测器

移动聚合
线图(本地)
Numeric Outliers
Normalizer

去标准化器
颜色管理器
散点矩阵(本地)
条件箱型图



































浙公网安备 33010602011771号