UIUC-商业分析笔记-全-

UIUC 商业分析笔记(全)

001:课程介绍 🎯

在本节课中,我们将要学习商业分析专项课程的第一部分,了解课程的整体结构、核心概念以及你将掌握的关键技能。我们将从商业分析的定义开始,逐步介绍Python编程、数据分析工具以及如何利用AI辅助学习,为你后续的学习打下坚实基础。

课程概述

我是Ron Geyman。正如布莱斯峡谷这些令人惊叹的岩层揭示了漫长而复杂的历史,在本课程中,我们将探索数据的各个层面,以揭示有价值的商业洞见。

你将学习商业分析的概念。在本课程中,商业分析是将数据科学应用于商业环境的过程。重要的是,它还包括与组织内其他人沟通发现结果,并使业务流程与这些发现保持一致的能力。

实践是最好的学习方式

让你理解商业分析的最佳方式之一是开始分析商业数据。因此,在本课程中,你将学习Python,这是一种功能强大的编程语言,可用于执行许多数据分析任务。

你不仅会学习Python,还会获得一些使用它的实践机会。学习编程语言可能是一个挑战,对我而言也是如此。但不必担心,除了让你练习使用Python,你还会学习到帮助你创建代码的工具。

核心工具:Jupyter Lab

主要工具是Jupyter Lab,这是一个用于开发脚本的集成开发环境(IDE)。需要知道的一个重要事实是,开发者并非记住他们创建的所有代码。相反,他们知道如何使用集成在IDE中的工具来查找和自动补全代码。

这些IDE工具很重要,因为如果你能快速找到所需内容而无需切换环境,那总是很好的。

学会搜索与利用AI

然而,你应该习惯一个事实:你将需要进行大量搜索。Python是开源的,这意味着许多人创建了可以免费使用的代码。所有这些代码无法放入一个简单的用户手册中,因此请准备好使用互联网和未嵌入你所用IDE的AI工具进行搜索。

说到AI,你应该学会使用AI来帮助你创建数据分析代码,这将为你节省大量时间。因此,在整个课程中,我们将探索AI如何帮助你。

尽管如此,学习使用Python进行分析的基础原理对你仍然很有价值,这样你才能为AI创建有效的提示、评估AI的输出,并创建那些难以用语言描述的东西。

课程模块结构

本课程分为四个模块,每个模块包含多节课。

模块一:入门基础

在模块一中,我们将向你介绍商业分析、Python入门,以及创建和执行你的第一个Python代码。

你还将学习Markdown,这是一种将格式化文本直接包含在代码旁边和代码输出旁边的方法,这样你就不必将文本输出复制粘贴到文字处理文档或演示文稿软件中。

模块二:问题框架与Python基础

在模块二中,你将学习构建问题框架的重要性。这不仅从商业角度很重要,从学习如何使用Python的角度也很重要。

虽然你不需要像计算机科学学生那样在理论上了解相同的编程概念,但理解一些基本概念(如对象)将有助于你更好地提出问题。

我们还将向你介绍Python中的一些基本数据对象。

模块三:数据价值与探索

在模块三中,你将探索是什么让数据变得有价值。然后,你将获得使用Python探索数据集以确定其数据是否有价值的经验。

这部分探索将包括学习如何使用Python创建可视化图表。当你开始操作和分析数据时,探索数据集的能力将是无价的。

模块四:数据清洗与代码整理

最后,在模块四中,你将学习如何执行常见的数据清洗任务,例如更改列名、重新排列和删除数据集中的列、处理缺失值、重塑数据集以及合并数据集。

我们还将演示如何清理你的代码,以便在你晋升或其他人接替你的角色时,他人能够轻松阅读。

总结与展望

以上就是四个模块的概述。由于这是使用Python的商业分析专项课程系列中的第一门课,希望本课程能为你打下坚实的基础,让你能够在商业环境中欣赏并执行数据分析任务,而不会感到过于吃力。

未来的课程将向你介绍数据可视化的更多细节、高级分析算法,以及将商业分析应用于市场营销、会计和其他商业领域。

正如布莱斯峡谷激发敬畏和理解其奇迹的渴望,我希望这门课程能点燃你对数据分析的热情。如果运用得当,这些技能可以改变企业。我的目标是,在本课程结束时,你将装备齐全并充满热情地使用数据来改进你的业务并做出自己的发现。

002:遇见罗恩·盖蒙教授

在本节课中,我们将跟随罗恩·盖蒙教授的分享,了解他对数据分析的见解、个人经历以及他在伊利诺伊大学的教学理念。这将帮助我们打破对数据分析师的刻板印象,并理解数据分析中蕴含的创造性与价值。


关于数据分析,人们普遍存在一种误解。有人认为数据分析师是声音尖细、缺乏热情、只喜欢整天埋头处理数字的人。但这完全不是事实。

我在伊利诺伊大学教授会计和数据分析课程。年轻时,我曾梦想成为一名NBA篮球运动员。但我知道自己必须选择另一条道路。

我一生中大部分时间都在从事教学工作。我的父亲热爱教学,并且非常擅长让教学变得生动有趣。我深受这种理念的影响:将一个复杂的概念变得易于他人理解,实现知识的传递。成长过程中,我一直希望成为像他那样的人——尽管他没打过NBA,但他总能享受生活的乐趣。

后来,我不得不做出一个非常艰难的职业决定。当时我父亲中风了,我住在佐治亚州,而他住在犹他州。我意识到,正如你小时候所认为的那样,父母可能不会永远陪伴我们。那时,我获得了一个加入一家商业智能公司的机会。他们最终向我发出邀请:“嘿,你愿意加入我们担任首席数据科学家吗?”

这是一个非常艰难的决定,但关键在于,这份工作地点离我父母居住的地方很近。我最终做出了这个决定,并为此感到非常感激,原因有很多。首先,因为在我们搬回去之后,我父亲只活了七个月。其次,我也很感激我们搬了回去,因为我有机会从事研究中最好玩的部分——分析数据。这段经历对我来说是无价的。

如今,我重返学术界,拥有了绝佳的机会。我能够与学生分享这些知识,帮助他们更好地服务于自己的公司。伊利诺伊大学非常出色。对我来说,能成为伊利诺伊大学的一员一直是一个梦想。我可以将自己的大量经验带入课堂,帮助这些商科学生学习如何分析数据,并让这些知识变得易于他们掌握。

在数据分析中,我最喜欢的事情之一就是能够从数据中提炼出一个故事。数据分析中有很大的创意空间。我认为它在很多方面是一门艺术,因为你拥有各种工具、算法、可视化软件,你可以创造出对人们具有巨大价值且非常优美的东西。利用数据分析创建的一些可视化作品确实非常漂亮。当然,我可能有偏爱,因为我热爱数据,我能看到许多可能大多数人看不到的应用场景。但你可以呈现一个具有“眼外伤式冲击力”的可视化效果——一个结论直接冲击你的视觉,这可以是一件非常酷且富有成就感的事情。

在在线学位项目中工作,我最喜欢的一点就是能够结识来自世界各地的人。仅仅听人们交谈就非常酷,我真的很享受在线学位项目工作带来的这个机会。

来到伊利诺伊大学工作是一种怎样的体验?在驱车前往这里的路上,穿过田野,你会突然发现自己置身于一个知识与技能的绿洲之中。我们是遍布全球的大家庭的一部分,这是一个非常棒的大家庭。我们拥有众多才华横溢、技能出众的人,他们非常乐于彼此分享,并在前进的道路上互相帮助。因此,来到这里令人兴奋,因为你知道离开时一定会学到新东西。至少,你会更了解这里的优秀人才,或者加深与他们的现有关系。


本节课中,我们一起学习了罗恩·盖蒙教授对数据分析的深刻理解。我们了解到数据分析远非枯燥的数字处理,而是一门融合了技术、艺术与讲故事的创造性学科。教授的个人经历也告诉我们,职业选择与家庭价值可以找到平衡,而实践经验对于学术教学具有不可估量的价值。最后,我们感受到了伊利诺伊大学作为一个全球性学术社区的活力与包容性。

003:盖斯社区的影响 🚀

在本节课中,我们将了解伊利诺伊大学盖斯商学院社区的影响力、其创新教育模式以及它为全球学习者创造的独特价值。


加入盖斯商学院社区正逢其时。我们的创新方式其他商学院无法比拟。

我们在国内和国际层面因这些成就而获得认可。我们的学生和校友是盖斯商学院卓越教育的活生生的证明。

我坚信我们的盖斯品牌及其产生的影响力从未如此强大。

我们在同行中确立了真正的领导地位。我们在在线研究生教育领域成就斐然。

我们正在重新思考商业教育的交付方式。我们正在尽可能打破财务和地理上的障碍。

我们正在触及成千上万原本可能没有机会或能力获得研究生学位、证书或学习新技能的学习者。

通过扩大教育机会,我们创造了前所未有的多样性,体现在经验、文化、人口统计、性别、种族和民族各个方面。我们的校友网络正以比其他任何项目都更快、更广的速度增长,校友基础遍布全球和各行各业。

最令人兴奋的发展之一是我们扩展教育内容的方式。并非每个人都想要或需要一个完整的学位。

或者他们可能需要,但不确定是否已准备好全身心投入。我们正引领“可叠加内容”的发展方向,这为来自不同背景、经验水平和拥有不同目标的学习者创造了大量机会。你可以只修一门课,然后将其叠加成一个专项课程,再进一步叠加成一个完整的研究生学位,而无需重复已修读的课程。

这是我们承诺的一部分:让所有渴望并致力于追求教育的人都能获得并实现教育目标。这正是盖斯商学院的核心所在,也是我以之为荣并称之为家的原因。我希望你能在这里看到自己的潜力,并考虑加入我们的学习者、学者和领导者社区。


本节课中,我们一起学习了盖斯商学院社区如何通过创新教育模式、打破传统壁垒以及提供可叠加的学习路径,为全球多样化的学习者创造价值并扩大影响力。其核心在于让优质商业教育变得更具可及性和可实现性。

004:第1模块-简介 📘

在本节课中,我们将要学习商业分析的基本概念及其重要性,并初步了解用于数据分析的强大工具——Python编程语言。我们将通过一个真实的企业家访谈,探讨数据在商业决策中的核心作用。


正如我们凝视布莱斯峡谷令人惊叹的景色,理解地貌能帮助我们欣赏其美丽与历史。同样地,商业分析帮助我们理解企业的“地貌”。这是一项大多数商业专业人士都认可的重要技能。

那么,为什么数据对商业分析如此重要?我采访了社交媒体影响力公司创始人斯科特·沃纳,询问了他关于数据在商业及其合作企业中的应用。他的回答很有见地。以下是部分访谈内容。

斯科特于2013年1月创立了公司,最初旨在帮助音乐家和艺术家,无论大小,将他们的品牌推向大众,主要通过社交媒体渠道与世界分享他们的音乐。社交媒体正在改变世界,他认为这是广告业的未来,这令他着迷,并且他一直对艺术和音乐怀有极大的热爱。

随着时间的推移,他们意识到,为艺术家创建的用于建立品牌、实现盈利、联系新粉丝并找到核心粉丝的体系,实际上适用于所有人。因此,他们的平台真正帮助每个人,尝试分享他们的“艺术”或激情,通过不同的社交媒体策略,并帮助他们理解其背后的数据。

信息、对数据的理解和认知,对任何企业都至关重要。要真正构建他们想要的东西,他们需要知道、理解并看到这些。因此,他们的重点正是帮助企业或影响者,利用数据来建立品牌并理解它。

在任何企业内部,数据都是必不可少的。你不应该在没有任何数据支持的情况下做出任何决策。当然,你总得从零开始,需要通过试错来学习。但一旦你开始创造数据,你就必须理解它。根据你的业务指标,一旦你知道了这些指标是什么,你就需要围绕它们构建数据集。因此,作为企业主,理解你的目标至关重要,因为一旦理解了目标,你就可以开始整合数据集。

许多人真的很难知道一天中何时在社交媒体上发帖。他们不明白什么似乎有效或无效,不理解点击率,不明白什么能吸引眼球。因此,他们构建的很多数据都是为了理解这些重要的信息片段。

他曾与许多公司合作,它们都对数据感兴趣。其中许多公司面临的一个问题是,它们没有真正定义自己想要实现或完成的目标,不理解自己的目标。因此,很多时候他会花时间去了解他们的业务,然后确定他们应该围绕哪些数据集进行构建或寻求更好的理解。他认为,那些不理解自己目标或如何取胜的公司,永远无法围绕其构建出色的数据集。

他一直对那些学会如何利用数据为自己谋利的公司着迷。他知道很多公司真的在数据方面苦苦挣扎,但也有少数公司找到了如何利用数据获利的方法。因为他们理解围绕团队共同制定的目标所产生的数据,销售额会飙升,员工效率会提高。他见过一些公司,根据数据、根据谁在何时进入商店,精确地调整了所需的地面员工数量,因为很多公司在不需要那么多员工的时段支付了大量薪水。因此,理解为何在此时需要或不需要员工背后的数据,确实可以帮助你节省或赚取大量资金。


我们推测,斯科特的感受并不仅限于他的行业,而是大多数商业组织中日益增长的一种共识。

在本模块中,我们将首先介绍数据分析在商业中的角色,回顾一些例子,以及一个用数据做决策的框架。我们也希望让你尽快开始进行商业分析。

因此,在本模块中,你还将学习一种强大的编程语言——Python,它经过调整可以执行许多数据分析任务。你还将学习如何开始使用Python。具体来说,我们将向你展示如何安装它以及如何运行代码。重要的是,你将学习如何开始使用一个常见的集成开发环境(IDE)——Jupyter Lab。

虽然我们希望你能在自己的机器上安装并使用Python,但我们知道有些人可能无法做到。为此,我们还将向你介绍Google Colaboratory,它允许你在类似于Jupyter Lab的浏览器环境中轻松使用Python,而无需在计算机上安装任何东西。

Google Colab不仅仅是你没有Jupyter Lab时的备用方案。它还具有一些Jupyter Lab中没有的实用功能,例如仅通过链接即可与他人共享文件。

你将学习如何在Python中执行一些基本操作,例如读取数据文件、向其添加新列以及将结果保存为不同的数据文件。你还将学习如何使用一些基本的数学运算以及如何创建变量。

需要明确的是,这不是传统意义上的编程课程。我们的目标不是教你Python的每一个细节,就像我们不会探索布莱斯峡谷小径上的每一个细节一样。相反,我们将专注于数据分析所需的基本Python技能。

因此,对于那些有编程背景的学员,你会注意到本课程有意省略了一些内容,因为我们觉得在现阶段不需要它们。然而,我们希望到本模块结束时,即使你是初学者,也能掌握足够的知识来开始使用Python进行数据的读取和写入。


本节课中,我们一起学习了商业分析的价值与数据在其中的核心地位,并通过案例了解到明确业务目标是有效利用数据的前提。同时,我们开启了Python数据分析之旅,介绍了其学习环境(Jupyter Lab和Google Colab)以及本课程将聚焦的核心技能。

005:商业分析概览 🧭

在本节课中,我们将要学习商业分析的基本概念,了解它如何通过数据驱动决策来增强我们的直觉判断,并探索其在现代商业环境中的广泛应用。


我身后的风景很美,稍后我会再回到这个话题。但首先,我想分享一个与商业分析相关的故事。

《点球成金》是迈克尔·刘易斯的一本书,它对我如何看待商业环境中的数据驱动决策产生了巨大影响。即使在人工智能时代,这个故事仍然是一个相关范例,展示了我们如何用数据驱动决策来增强我们的直觉。正如奥克兰运动家队利用数据寻找被低估的球员,从而能够与更富有的球队竞争一样,我们也可以使用商业分析来发现商业环境中隐藏的机会,识别被低估的增长领域。这就像在布莱斯峡谷中发现独特的岩层。


上一节我们提到了《点球成金》的故事,本节中我们来看看球队内部面临的一个核心冲突。球队内部挣扎的一个焦点是,应该在多大程度上依赖球探的直觉,而不是数据分析的结果。电影中有一些相当幽默的部分,球探们在讨论球员是否看起来像运动员、球员击球时球的声音如何,甚至球员的女朋友长什么样。可以推测,球探们试图处理这些无形因素,以识别那些即使不符合优秀棒球运动员刻板印象也能表现出色的球员。球队总经理比利·比恩很难说服球探们,最重要的事情是球员上垒的频率。

这个故事蕴含的教训可以应用于许多商业环境。如果你没有读过这本书或看过这部电影,我推荐你去看,这是一种有趣的方式,可以了解在一个依赖直觉的文化中为实证探究留出空间的重要性。


现在,直觉并非全是坏的,人脑和直觉的能力是惊人的。例如,我们能在片刻之间,结合一个人的说话方式、外貌、谈吐、气味和动作等信息,然后判断这个人是否适合公司的文化,或者至少我们认为是这样。通常我们可能是正确的。然而,我们的能力是有限的,并且在某些情况下容易受到弱点的影响。如果使用得当,数据分析可以增强我们的心智能力,帮助我们认识到仅依赖直觉时产生的思维弱点。


上一节我们讨论了直觉与数据的平衡,本节中我们来正式定义商业分析。应用数据科学、商业数据、沟通,并使业务流程与分析结果保持一致,这被称为商业分析

商业分析的目标并不总是消除所有直觉和判断,而是考虑如何利用数据为战术和战略性的商业决策提供信息。商业分析可以帮助确认或否定一个直觉,它也可以帮助我们发现那些不付出巨大努力就无法识别重要模式的场景。它还可以引导我们思考未曾考虑过的问题,甚至帮助我们制定新的商业策略。


那么,商业分析通常是如何运作的呢?一般来说,商业分析利用历史数据帮助我们回答以下问题:

  • 发生了什么?
  • 为什么会发生?
  • 现在正在发生什么?
  • 如果不加干预,接下来会发生什么?
  • 应该采取什么干预措施才能实现最理想的结果?

自《点球成金》出版以来,体育分析几乎在每项运动中都已变得非常重要。更广泛地说,数据分析似乎影响着每一个企业和生活的方方面面。事实上,像ChatGPT和Gemini这样的人工智能工具正是以这种方式创建的。

从与我们的锻炼、睡眠和营养相关的健康分析,到分析我们的祖先来自哪里以及我们观看的节目,商业分析都扮演着重要角色。

因为越来越多的公司采用数据驱动决策工具,所以只说“我认为最佳行动方案是……”变得越来越不可接受,而更重要的是说“在查看数据后,我认为最佳行动方案是……”。

作为一名商业专业人士,人们也越来越期望你知道如何分析数据,从而为决策情境带来洞见。


本节课中我们一起学习了商业分析的核心概念。我们通过《点球成金》的故事,理解了数据如何补充甚至挑战传统直觉。我们明确了商业分析的定义是应用数据科学、商业数据、沟通,并使业务流程与分析结果保持一致,其核心目标是回答关于过去、现在和未来的关键问题。最后,我们看到了数据分析在现代商业和社会中的普遍性与重要性,以及掌握相关技能对商业人士的必要性。

006:商业分析实例 🏔️

在本节课中,我们将回顾商业分析如何影响各类公司的具体实例。这些案例将阐明你如何在当前职责中应用分析技术,从而改进业务流程。

太阳能公司的成本控制案例

上一节我们提到了商业分析的广泛应用,本节中我们来看看一个具体的小型企业案例。一家快速发展的太阳能公司怀疑自己在采购电气元件时经常被多收费。然而,两个因素使他们难以验证这一情况。

首先,公司有多名员工采购多种电气元件,这使得采购人员难以在脑海中追踪所有成本。其次,尽管发票都发送到同一个电子邮箱,但文件是扫描的PDF格式,本质上是插入PDF文件的照片。因此,将图像转换为可用于汇总价格变化的表格数据并不直接。

解决方案
他们利用编程语言和计算机调度工具,建立了一个自动化脚本。该脚本定期访问接收发票的邮箱,下载PDF文件,使用光学字符识别技术将文本图像转换为表格数据,然后将所有数据合并到一个综合的价值文件中。

成果
随后,他们利用该文件快速识别出被多收费的情况并追回了款项。最终追回的金额约为建立该脚本所花费用的四倍。这个例子展示了小公司如何利用技术来收集数据,甚至无需依赖复杂的数据处理就能改善业务。

市场营销中的数据分析案例

现在,我们将聆听乌纳蒂南甘博士的分享,了解数据分析在市场营销中的应用实例。在市场营销领域,分析已成为游戏规则的改变者,也是企业保持竞争力的必要条件。我将分享来自零售业和数字平台(如社交媒体)的两个例子,这些领域我拥有超过十年的行业经验和学术研究专长。

零售业的促销优化

想象一家零售公司试图优化其促销活动,以提升销售额,同时最大限度地减少浪费的广告支出。历史上,企业会依赖通用促销或单纯凭直觉来定位客户。现在,通过使用分析工具,公司可以更深入地研究客户的购买行为。

以下是利用数据分析可以实现的改进:

  • 分析销售点数据与忠诚度计划:结合来自零售商移动应用程序的忠诚度计划数据,可以揭示新趋势,例如哪些产品经常被一起购买,哪些促销活动最受特定客户群体欢迎等。
  • 设计定向营销活动:利用此类数据,公司可以设计定向营销活动,个性化他们的优惠,甚至优化库存以减少积压或缺货的情况。
  • 提升消费与忠诚度:在我与一家在美国拥有超过4000家门店的大型消费电子零售商的一些研究中,我已经证明了零售应用程序分析在增加消费者支出和忠诚度方面的强大作用。

社交媒体平台的分析应用

让我们切换到另一个例子,在社交媒体网站等平台上,分析工具使企业能够衡量参与度指标,如点击率、分享率,以及来自客户评论的情感分析。这超越了枯燥的数字,帮助营销人员了解什么类型的内容在每个平台上效果最好,以及他们的受众在什么时间最活跃。

以下是社交媒体分析带来的策略转变:

  • 内容策略优化:例如,一家户外装备公司可能通过社交聆听和情感分析发现,展示冒险故事的帖子比传统的产品广告能带来更高的客户参与度。
  • 强化品牌连接:基于这一洞察,他们可以调整策略,更多地专注于讲故事,从而建立更强的品牌联系,并获得更高的客户转化率。他们甚至可以整合生成式AI工具。

这两个例子都强调了营销分析如何将数据转化为可操作的见解,使公司能够做出更智能、更快速、更具影响力的决策。创造性的数据分析方法可以直接改善客户关系并推动增长。

体育产业中的创新分析

体育是一门大生意,因此让我们考虑来自该领域的分析案例。棒球是一项非常适合进行统计分析的运动,因为每个比赛回合都是一个离散的事件序列,开始方式几乎相同。相比之下,篮球则是一种流动性强得多的比赛,回合之间相互交融,球员在一个回合开始时可能处于许多不同的位置。

因此,一些有进取心的公司开发了视频软件,每秒拍摄25张图片,并追踪球员和球的坐标。这使得可以考虑新的指标来识别被低估的球员,例如那些在防守者非常接近时仍能得分的球员。这也使得分析师能够使用复杂的统计分析来评估球员的防守价值。可穿戴技术还帮助球队监控球员,确保他们在关键时刻得到休息并做好准备。这些例子突显了创新性地使用数据来提升表现。

高频交易中的数据分析

这个例子说明了数据收集和分析的创造性应用如何改进业务。考虑快节奏的股票交易世界。为了竞争,交易员使用自动化系统来跟踪新闻和社交媒体,解释信息并在几分之一秒内执行交易,速度远超人类。

核心机制
你可以假设设置了一个机器人来跟踪新闻源或社交媒体帖子,解释这些新闻片段,然后快速进行交易。实际上,机器人的速度比人类快得多,比如在新闻发布后三秒内就能完成。

这个例子阐释了利用数据收集和分析来改进业务。

总结:拥抱技术,聚焦价值

我认为,像数据分析工具、视频捕捉软件技术和人工智能这样的技术进步是值得热爱而非恐惧的。有些人担心机器正在接管许多工作,我理解他们的出发点。然而,这些工作通常相当重复和枯燥。因此,许多平凡的任务可以委托给机器,以便人类能够从事更有趣的事情。

在本节课中,我们一起学习了从太阳能、市场营销、体育到金融交易等多个行业中商业分析的具体应用实例。这些案例共同表明,无论是通过自动化脚本处理发票,还是利用复杂模型分析球员表现,创造性地收集和分析数据都能直接带来流程优化、成本节约和业绩提升。关键在于将技术视为解放人力、聚焦高价值创造性工作的工具。

商业分析专项课程:P7:数据驱动决策的事实框架

在本节课中,我们将学习一个用于进行数据驱动决策的简单框架——FACT框架。这个框架将指导我们如何系统地利用数据来解决问题并创造商业价值。

在深入探讨这个框架之前,我们先听听一位业内人士的看法。我采访了布法罗比尔队(一支NFL美式橄榄球队)的分析与应用开发总监路易斯·吉莫。在采访接近尾声时,我询问他对于使用数据分析进行决策有何建议。他是这样说的:

真正遵循一个结构化的流程来得出结论至关重要。始终遵循一个非常相似的方法来分解问题,有条不紊地进行,这对于准确性非常重要。这个过程带来准确性,准确性带来信任,而对数据和结果的信任将继续推动分析向前发展。无论是橄榄球、医疗信息还是零售业,如果你提供了不准确的结果,那么数据将失去信任,分析工作将难以持续。

正如路易斯所言,流程至关重要。现在,让我们来详细了解一下FACT框架。

第一步:界定问题

框架的第一步是界定问题。你需要识别一个需要解决的问题。思考如何以鼓励人们使用数据来寻找根本原因的方式构建问题,并且这种方式应能带来可付诸行动的洞见。在某些时候,你还需要考虑如何将问题构建成可以通过特定分析来解答的形式。

第二步:收集数据

接下来是收集数据。财务数据通常很重要,因为它有助于确定某事对利润的影响。然而,其他内部可用的非财务数据以及外部数据也应考虑在内。你甚至可能需要收集自己的数据。

一旦确定了数据,你需要找到提取、转换和加载数据的方法,这个过程通常被称为 ETL过程。最后,还需要进行大量的数据整理工作,以便将数据结构化,为你将要执行的计算做好准备。

第三步:计算结果

第三步是计算结果。首先,确保你对数据的基本汇总统计有良好的感觉。例如,数据中各个因素的分布情况如何?有多少缺失值?各因素之间的相关性如何?在对数据有了充分了解之后,你就可以开始对数据进行高级分析了。

这些高级算法可以通过揭示数据中的模式来提供洞见。有多种算法可供选择。了解每种算法的优缺点可以帮助你判断何时应该应用它们。你还应该知道如何评估这些算法所创建模型的结果。

第四步:传达结果

第四步,也是最后一步,是向他人传达结果。使用你的受众易于理解的技术和沟通方法。努力确保在主旨思想与细节之间取得平衡。细节过多,你会让受众感到困惑并失去他们;细节过少,你的受众可能会过度概括你的结果。

在向受众传达分析结果时,务必观察他们的反应。乐于接受反馈,并承认你分析的局限性。当你敞开心扉接纳其他意见和观点时,你很可能会改进你的分析,并因此获得额外的洞见。几乎总是如此,在你深入挖掘所解决问题的根本原因时,你会发现更多值得探究的新问题。

以上就是FACT框架的全部内容。但我想强调的是,框架的每个部分只有在与其他步骤结合使用时才重要且有用。

框架各环节的关联性

上一节我们介绍了FACT框架的四个步骤,本节中我们来看看如果缺失其中任何一步会怎样。

  • 如果未界定问题:考虑一下,如果你在没有首先界定要回答的问题、或没有任何关于数据如何有用的想法、或不知道将用它进行何种计算的情况下,就开始收集数据,会发生什么?即使信息不像资产负债表上的存货那样有明确的会计价值,但它与存货有相似之处。你拥有的数据越多,你在存储、跟踪、更新、保护和授权访问方面的投入就越大。因此,先有意识地界定问题,然后收集数据来回答该问题是理想的做法。它也可以作为一个指南针,如果你在无关的分析上偏离了方向,它可以作为一个很好的参考点让你回到正轨。

  • 如果未收集数据:界定问题是一个良好的起点,但如果你对可用数据一无所知,或者不知道能用它做什么,那么你将很难有效地界定问题。此外,人们常常认为复杂的算法可以在任何数据中找到模式,尤其是在数据量很大的情况下。这可能有一定道理,但更多时候,通过收集正确的数据,你能更好地利用时间和资源。因此,收集一组相关的数据非常重要。

  • 如果未进行计算:虽然收集数据非常重要,但如果不进行计算呢?复杂的算法确实非常有用,因为它们可以识别数据中复杂的模式,而人类可能需要更长的时间才能识别。例如,确定最优票价通常需要考虑许多因素,如一年中的时间、星期几、节假日、天气条件以及宏观经济条件(如油价)等等。人类需要很长时间来评估所有这些因素的组合才能得出最优价格。因此,使用强大的计算很重要,因为它可以更快地得出最优价格。

  • 如果未有效传达结果:最后,如果你没有有效地向他人传达结果会怎样?即使问题界定得很好,收集了优质的数据集,并进行了强大的计算,以正确的方式向正确的人传达正确的信息以便采取行动,这一点仍然至关重要。未能准确、简洁地传达结果是许多公司未能变得更加数据驱动的一个常见原因。因此,能够有效地向他人讲述数据至关重要。

从洞见到行动

FACT框架为将数据转化为改善的业务绩效提供了指导。《信息经济学》的作者道格·莱尼有一个很棒的图表,称为“高德纳分析进阶模型”,它也强调数据分析应侧重于行动。

我喜欢这个模型,因为它强调了如何将洞见转化为预见。识别数据中的关系可以帮助你从描述性分析转向规范性分析。换句话说,历史数据有助于识别关系,然后这些关系可用于预测未来会发生什么。如果预测结果不利或无利可图,那么你就可以更好地建议采取行动方案,以防止无利可图的情况发生。

总结

本节课中,我们一起学习了数据驱动决策的FACT框架。它包括界定问题、收集数据、计算结果和传达结果四个关键步骤。请记住,框架中的所有步骤都同等重要,缺一不可。通过系统地应用这个框架,你可以从简单的描述性分析,逐步迈向更具前瞻性的规范性分析,从而更好地利用数据为商业决策服务。

008:为什么选择Python进行商业分析

在本节课中,我们将探讨在商业分析领域选择Python编程语言的核心原因。我们将对比Python与低代码工具的区别,并解释Python如何为数据分析提供全面且灵活的支持。

我现在位于布莱斯峡谷纳瓦霍小径上一段非常蜿蜒的路段。你可能会好奇我为什么在这里,以及这与课程有何关联。我希望建立一些对你有帮助的联系。首先,这条蜿蜒的小径让我联想到一条蛇,而我们将要使用的关键工具是Python编程语言。

现在你可能会问,为什么我们使用Python,而不是像Excel、Power BI和Tableau这样的低代码工具?

主要原因是Python允许你执行FACT框架的每一个步骤,而低代码工具通常只允许你执行其中一两个步骤。这就像只能走小径的主要部分,而无法探索小径旁那些少有人走的路径。Python允许你做到后者。

使用Python的另一个好处是,它非常适合与人工智能助手协同工作。像ChatGPT和Gemini这样的工具,在生成可用于商业分析的代码方面提供了巨大的帮助。这就像拥有一位专家向导,可以带你探索这些岩石的上下左右。

因此,我希望你和我一样,对使用Python探索商业数据感到兴奋,就像我对探索布莱斯峡谷的其他小径一样兴奋。


本节课中我们一起学习了选择Python进行商业分析的两大核心优势:全面性AI友好性。Python能够完整支持数据分析的整个流程,并借助现代AI工具极大地提升开发效率,这使其成为深入探索商业数据的强大工具。

009:Python附加工具 🛠️

在本节课中,我们将学习如何在使用Python时,借助一些重要的附加工具来提高效率。我们将了解这些工具的作用,并通过一个生动的类比来理解它们之间的关系。

概述

Python本身是一个强大的编程语言,但单独使用它就像只用一把螺丝刀修理汽车,效率不高。为了更高效地编写、阅读和运行代码,我们通常会使用三种主要的附加工具:计算机编程模块集成开发环境

核心概念与类比

为了更好地理解这些工具,我们可以将它们与汽车修理店的工作方式进行类比。

计算机:执行任务的“机械师”

当你需要修理汽车时,你会把它交给机械师。机械师能够比我们更快地执行特定任务。在我们的语境中,计算机就扮演着“机械师”的角色,它负责实际运行我们编写的Python代码。

编程模块:特定任务的“工具箱”

机械师拥有各种工具箱,每个工具箱里装着用于完成特定任务的工具。例如:

  • 通用工具箱可能装有棘轮扳手和螺丝刀,用于大多数任务。
  • 诊断工具箱可能装有多用表和扫描仪,用于检查发动机故障灯。
  • 换胎工具箱可能装有千斤顶、支架和扭矩扳手。

编程模块就类似于这些工具箱。它们是一组预先写好的函数集合,让我们能更容易地执行特定任务,而无需每次都从头编写代码。就像机械师不会把所有工具都带到车旁一样,我们只根据任务需要导入特定的编程模块。

代码示例:导入模块

import pandas  # 导入用于数据分析的“工具箱”
import numpy   # 导入用于科学计算的“工具箱”

集成开发环境:高效工作的“车库”

机械师很可能在一个车库里工作。这个车库能帮他管理工具,墙上有快速参考海报,可以调节灯光,甚至能发动汽车来测试修理是否成功。

集成开发环境 就相当于这个“车库”。它为编写Python代码提供了一个高效的环境,通常包含以下功能:

  • 代码提示与补全:帮助你快速参考语法和函数,无需精确记忆。
  • 语法检查:实时检查代码错误。
  • 调试与运行:允许你运行部分代码并查看输出结果。

总结

本节课我们一起学习了使用Python的三个关键附加工具。计算机是执行代码的基础;编程模块是包含特定功能函数的工具箱,需要时导入即可;集成开发环境 则提供了一个功能齐全、便于编写和调试代码的工作空间。

理解这三者的区别非常重要。这不仅能让你更清楚地知道Python如何被使用,更重要的是,它能让你明白你不需要记忆所有的代码。对于Python新手来说,认识到这一点可以极大地减轻学习压力。在后续的课程和实践中,你将逐步积累使用Python及其附加工具的经验。

010:Python与集成开发环境(IDE) 🐍

在本节课中,我们将学习区分Python代码本身与用于帮助创建Python代码的集成开发环境(IDE)。我们将通过类比Excel中的VBA编辑器来理解IDE的作用,并介绍四种常用的Python IDE。


在之前的课程中,我们简要介绍了Visual Basic编辑器。它是一个用于运行Visual Basic for Applications语言的集成开发环境,该语言在Excel中用于创建宏。

屏幕上显示的是Visual Basic编辑器。在这个特定窗口中,是执行K均值聚类的VBA代码和注释。

这个环境非常有用。让我快速演示原因:在这段代码中,如果我想查看其运行过程,可以设置一个断点,然后点击播放按钮。现在,你可以在“本地窗口”中看到我创建的不同变量及其赋值。

如果我再次点击播放按钮,代码将继续执行。如果有任何值被更新,我可以滚动查看。这在我逐步检查代码、确保其按预期运行时非常有帮助。

在Excel中使用Visual Basic编辑器的另一个优点是它有不同的窗口。如果我使用双屏或分屏,我可以逐步执行代码,并同时在Excel工作表中查看数据本身或生成的图表的变化。请注意,当我点击播放按钮时,会进行新的聚类分配。我甚至可以移除这个断点,运行剩余的宏。完成后,可以看到它已经完成了K均值聚类分析,并将每个观测值分配到了一个聚类。

因此,能够在运行代码时看到输出,尤其是在开发代码时,是非常有帮助的。

拥有用于创建、调试和逐步执行代码的软件这一概念非常重要。因为你几乎不可能编写出完全没有错误的代码,也不太可能记住所有代码。因此,拥有工具来提醒我们需要运行什么,并让我们看到正在做什么,是至关重要的。


接下来,我们将介绍四种用于Python的IDE。我们将在后续视频中讨论如何安装这些IDE以及它们的优缺点。现在,我只想让你看到不同的环境,以便你能真正区分Python本身和代码。

以下是四种我们将介绍的IDE。前两种IDE由Jupyter开发。

第一种叫做Jupyter Notebook。它是一个基于浏览器的工具。界面看起来很不错,你可以在其中格式化文本,使其易于阅读。然后,你可以拥有其他包含Python代码的代码块或单元格。

这里的第一个单元格实际上只是文本,不是代码。但这有助于我展示代码和代码输出,使其易于阅读。而这里才是Python代码本身。

同样,这里还有更多的Python代码。这组特定的代码读入股票数据并绘制图表。我可以快速向下滚动,查看微软和英伟达股价随时间变化的多线图,以及所谓的配对图。这就是Jupyter Notebook,你会经常看到它,它非常简单易用。

第二种IDE也是由Jupyter创建的,被称为Jupyter Lab。

它同样是一个基于浏览器的工具,看起来与Jupyter Notebook非常相似。虽然这个背景是黑色的,但我们可以将其设置为白色,就像Jupyter Notebook一样。但它集成了更多的工具,在这个环境内部有多个窗口,还有一个文件浏览器。

这是我们希望你也能熟悉的一个环境。它的好处在于,虽然看起来更复杂一些,但随着你对Python经验的增加,你会非常喜欢拥有更多可用的工具。


现在我想介绍的另外两种工具是更传统的开发环境,它们类似于Visual Basic编辑器。

这个IDE叫做Spyder。

Python代码显示在这个窗口中。下方有一个控制台,用于查看运行代码的输出。我们可以在旁边看到生成的图表,这里还有文件浏览器。此外,这里还有其他几个工具,用于查看帮助文档。我需要在这里暂停一下,强调在IDE中知道如何寻求帮助至关重要。

这是编程时要知道的关键事项之一。一个关键的秘诀是:你不需要记住所有东西。你确实需要学习并记住很多内容,但知道如何使用内置的帮助功能,我认为是现阶段你能做的最重要的事情。

这就是Spyder集成开发环境。

我要展示的第四个IDE实际上与Spyder非常相似,尽管这个使用了白色主题。这个IDE是RStudio。

对于那些想学习如何同时使用R和Python的人来说,这个IDE很有用。这里是代码窗口,即编辑器,其中包含Python代码。下方有一个控制台窗口,允许我们查看运行代码的输出。我们还有文件浏览器以及图表窗口。我们可以查看图表,还有一个环境窗口,可以查看创建的变量,甚至可以打开它们并像在Excel工作表中一样进行探索。


本节课中,我们一起学习了Python代码与集成开发环境(IDE)的区别。我们通过Excel的VBA编辑器理解了IDE在代码编写、调试和可视化方面的价值。接着,我们快速浏览了四种主流的Python IDE:Jupyter NotebookJupyter LabSpyderRStudio。前两者是基于浏览器的交互式笔记本,适合展示和分析;后两者是功能更全面的传统IDE,提供代码编辑、调试和变量探索等集成工具。了解这些工具将帮助你在后续课程中选择和高效使用合适的开发环境。

011:使用JupyterLab桌面安装Python(推荐Windows和Mac用户) 🚀

在本节课中,我们将学习如何通过最简单的方法之一开始使用Python,即下载并安装JupyterLab桌面应用程序。这种方法的一大优点是,无论您使用的是Windows还是Mac操作系统,其安装过程几乎完全相同。

概述

我们将通过访问GitHub仓库来获取JupyterLab桌面应用程序的安装程序,并根据您的操作系统选择正确的版本进行下载和安装。安装完成后,我们还会引导您完成初始的Python环境设置,确保您可以立即开始使用JupyterLab进行数据分析。


下载JupyterLab桌面应用程序

首先,您需要打开一个网页浏览器来下载安装程序。

以下是下载步骤:

  1. 在浏览器中搜索“JupyterLab desktop”,请注意拼写为“JupyterLab”,它是一个单词,并且“Jupyter”的拼写是 J-U-P-Y-T-E-R
  2. 在搜索结果中,您应该会看到一个指向GitHub仓库的链接,标题通常为“JupyterLab desktop application based on electron”。请点击该链接。
  3. GitHub是一个开发者分享代码的网站,JupyterLab桌面版是一个开源免费的应用程序。进入仓库页面后,向下滚动。

选择并下载安装程序

在仓库页面中,找到安装部分。这里会有一个表格,列出了针对三个主要操作系统的安装程序。

以下是各操作系统对应的安装文件:

  • Windows用户:请点击“x64 installer”链接,下载安装程序到您的电脑。
  • Mac用户:这里有两个链接。一个适用于使用Apple Silicon芯片(如M1、M2、M3等)的新款Mac,另一个适用于使用Intel芯片的旧款Mac。
    • 如果您不确定自己的Mac型号,可以点击屏幕左上角的苹果图标,选择“关于本机”。在“芯片”一栏,如果显示“Apple M…”字样,则说明您使用的是新款Mac。

由于我使用的是新款Mac,我将点击对应的Apple Silicon版本链接进行下载。下载的文件大约300MB,根据您的网络状况,可能需要等待片刻。

安装应用程序

下载完成后,即可开始安装。

安装步骤如下:

  1. 双击下载好的安装程序文件。
  2. 对于Mac用户,这是标准流程:将JupyterLab图标拖拽到“应用程序”文件夹中。安装过程非常快。
  3. 安装完成后,您可以退出安装程序,并可以选择删除下载的安装文件。
  4. 像打开其他任何应用程序一样,在“应用程序”文件夹中找到并双击“JupyterLab”来启动它。
  5. 如果是首次打开,Mac系统可能会要求您确认是否打开此应用,请点击“打开”按钮。

初始设置与安装Python

启动JupyterLab后,您会看到欢迎页面。页面左侧的“Start”区域有几个链接,其中前三个是灰色的不可用状态。

这是因为我们目前只安装了JupyterLab桌面应用程序,尚未安装Python环境。页面底部会有一个警告提示:“Python environment not found”。

要解决这个问题,请按照以下步骤操作:

  1. 点击警告信息中的“install using the bundled installer”链接。
  2. 系统将开始安装Python以及一些常用的数据分析Python模块。这个过程可能需要一点时间,但不会太长。
  3. 安装成功后,灰色链接将变为可点击状态。

启动JupyterLab工作环境

现在,Python环境已准备就绪。您可以直接点击“New Notebook”创建一个新笔记本,但这会默认在您的根目录(如用户文件夹)下创建。

我通常的作法是点击“New Session”,这会直接打开JupyterLab的工作环境。首次启动时,可能会询问您是否希望接收Jupyter的官方新闻通知,您可以选择“否”。

如果您的界面布局与演示中不完全相同,可以通过以下步骤调整:

  1. 点击顶部菜单栏的“View”(查看)。
  2. 选择“Appearance”(外观),您可以查看或取消勾选“Simple Interface”(简单界面)等选项。
  3. 一个简单的方法是直接点击“Reset Default Layout”(重置默认布局),这通常能让界面恢复到标准状态。

开始使用

至此,一切准备就绪。您可以在左侧文件浏览器中导航到电脑上的不同文件夹。进入目标文件夹后,点击顶部的“+”按钮即可创建新的笔记本或其他文件。关于如何使用JupyterLab进行编程和分析,我们将在后续视频中详细介绍。


总结

本节课中,我们一起学习了如何为Windows和Mac系统下载并安装JupyterLab桌面应用程序。我们完成了从GitHub获取安装程序、根据操作系统选择正确版本、执行安装、到最终通过捆绑安装程序设置Python环境的全过程。这种方法将所有必要工具集成在一起,极大简化了安装流程,非常适合编程初学者快速搭建数据分析环境。现在,您已经拥有了一个功能完整的Python和JupyterLab平台,可以开始您的商业分析之旅了。

012:在Mac上使用Homebrew和pyenv安装Python 🐍

在本教程中,我们将学习如何在Mac操作系统上安装Python。我们将使用Homebrew这个免费开源的软件包管理器来简化安装过程,并进一步使用pyenv工具来管理多个Python版本。这种方法虽然步骤稍多,但能让你轻松地在不同Python版本之间切换,以适应不同项目的需求。


检查现有Python安装

首先,我们需要确认你的Mac上是否已经安装了Python 3。

  1. 打开终端应用程序。你可以使用Spotlight搜索(按下 Command + 空格键),然后输入“terminal”并回车。
  2. 在终端中,输入以下命令来检查Python 3是否已安装:
    python3 --version
    
  3. 如果系统返回一个版本号(例如 3.12.0),则说明Python 3已经安装。如果未安装,终端会提示“command not found”,我们将继续后续步骤。


安装Homebrew

由于我们将使用Homebrew来安装Python,接下来需要确保Homebrew本身已安装。

  1. 在终端中,输入以下命令检查Homebrew:
    which brew
    
  2. 如果命令返回一个路径(例如 /opt/homebrew/bin/brew),则说明Homebrew已安装。如果未安装,你需要先安装它。
  3. 要安装Homebrew,请访问其官方网站 brew.sh。页面上会提供一个安装命令。
  4. 复制该命令,返回终端窗口,粘贴并执行。系统可能会要求你输入管理员密码。
  5. 安装过程中,可能会提示你安装Xcode命令行工具或其他软件,请按照提示同意并安装。
  6. 安装完成后,再次运行 which brew 命令,确认已成功安装并显示路径。

安装pyenv

虽然可以直接用Homebrew安装Python,但我们更推荐使用pyenv。pyenv是一个Python版本管理工具,可以让你轻松安装、切换和管理多个Python版本。

  1. 首先,检查是否已安装pyenv:
    pyenv --version
    
  2. 如果命令返回版本号,说明已安装。如果未安装,使用Homebrew进行安装:
    brew install pyenv
    
  3. 安装过程中,可能会提示你将pyenv的初始化脚本添加到shell配置文件中(如 ~/.zshrc~/.bash_profile)。请按照提示复制并执行给出的命令,这能确保pyenv在终端中正常工作。

使用pyenv安装Python

现在,我们可以使用pyenv来安装特定版本的Python了。

  1. 首先,查看pyenv支持安装哪些Python版本:
    pyenv install -l
    
    这会列出一个很长的版本列表。我们通常选择列表顶部不带任何后缀字母(如 abrc)的最新稳定版,例如 3.13.0
  2. 选择你想要安装的版本,执行安装命令。例如,安装Python 3.13.0:
    pyenv install 3.13.0
    
    命令执行后,pyenv会开始下载并安装该版本的Python及其相关组件。

管理Python版本

安装完成后,你可以查看和管理已安装的Python版本。

  1. 查看当前系统上通过pyenv安装的所有Python版本:
    pyenv versions
    
    输出结果会列出所有版本,并用星号(*)标记当前全局正在使用的版本。
  2. 如果你想切换全局使用的Python版本,可以使用 global 命令。例如,切换到刚安装的3.13.0版本:
    pyenv global 3.13.0
    
  3. 再次运行 pyenv versions,你会看到星号已经移动到 3.13.0 旁边,表示切换成功。

总结

本节课中,我们一起学习了在Mac上安装Python的进阶方法。我们首先检查了系统是否已安装Python,然后安装了强大的软件包管理器Homebrew。接着,我们通过Homebrew安装了Python版本管理工具pyenv。最后,我们使用pyenv查看了可安装的Python版本列表,安装了一个特定版本,并学会了如何在不同的Python版本之间进行切换。

使用pyenv管理Python版本的优势在于,你可以为不同的项目轻松配置不同的Python环境,并且卸载不再需要的版本也非常简单。在后续的课程中,我们将介绍如何安装集成开发环境(如Visual Studio Code或Jupyter Lab),以便更高效地编写和运行Python代码,而不仅仅是在终端中使用。

013:Python安装指南 🐍

在本节课中,我们将学习如何在您的计算机上安装Python。我们将重点介绍从Python官方网站直接下载安装的方法,并涵盖安装前检查、安装步骤以及安装后的验证过程。

有多种方法可以在计算机上安装Python。本视频将演示直接从Python.org安装Python的方法。

对于使用Mac操作系统的用户,建议观看另一个视频,其中介绍了通过Homebrew安装Python的方法、其优势以及具体操作步骤。尽管如此,您也可以在Windows和Mac操作系统上通过Python.org安装Python。

检查现有安装

在开始安装之前,您应该首先确认计算机上是否已经安装了Python。

以下是检查方法:打开命令提示符(Windows)或终端(Mac)。例如,在Mac上,可以通过按下 Command + 空格键 打开聚焦搜索,输入“terminal”并按回车键来启动终端。

打开终端后,输入以下命令并按回车:

python3 --version

如果已经安装了Python 3,您将看到一条消息,显示Python及其版本号。例如,输出可能类似于 Python 3.12.0

如果没有任何输出,则说明需要安装Python。

下载Python安装程序

要安装Python,请访问Python.org网站,然后进入下载页面。

您的浏览器通常会检测您使用的操作系统类型,并显示一个下载最新版本Python的按钮。

点击该按钮(例如“Python 3.13.2”)开始下载。安装程序将下载到您计算机的“下载”文件夹中。

运行安装程序

下载完成后,前往文件管理器,双击下载的安装程序文件。这将启动安装向导,引导您完成安装步骤。

您需要阅读并同意各种信息,例如安装内容、安装位置、许可协议等。您可以自行决定阅读多少内容。

对于Mac用户,通常可以接受所有默认设置进行安装。

对于Windows用户,安装过程中会到达一个关键步骤:您可以选择“立即安装”或“自定义安装”。

在点击“自定义安装”之前,请务必勾选“Add Python X to PATH”选项。 这将使您能够更轻松地从命令行启动Python。

然后,您可以决定是否在安装可执行文件时使用管理员权限,接着点击“自定义安装”。

这将带您进入另一个窗口,其中列出了可以随Python一起安装的所有附加功能。

您可以勾选所有选项,但关键是要确保 pip 被选中。pip是一个包管理器,对于安装额外的模块非常有用,这些模块能扩展Python以实现多种不同用途。

完成安装

勾选所需选项后,点击“下一步”。对于Mac和Windows用户,都可以接受剩余的默认设置,然后完成Python的安装。

验证安装

安装过程结束后,您应该能够返回命令提示符或终端,再次输入验证命令:

python3 --version

以确认已安装最新版本的Python。

您甚至可以直接在这个Shell脚本(命令提示符或终端)中使用Python。只需输入 python3 并按回车,您将进入一个称为 REPL 的环境,其提示符是三个大于号 >>>

在这里,您可以执行一些基本的Python计算。例如,输入 5 + 6 并按回车,会得到结果 11

要退出REPL环境,请输入 quit() 并按回车。

后续步骤

现在,您已经成功安装了Python。但是,请务必观看后续的其他视频,我们将演示如何安装集成开发环境,例如 Jupyter LabVisual Studio Code。使用这些工具将比仅在Shell脚本中使用Python更高效。

总结

本节课中,我们一起学习了如何从Python.org官方网站下载并安装Python。我们涵盖了安装前的版本检查、详细的安装步骤(特别是Windows用户需注意的PATH设置和pip选择),以及安装后的基本验证方法。成功安装Python是开始编程之旅的第一步。

014:使用JupyterLab的一个示例工作流程 📊

在本节课中,我们将通过一个具体示例,学习如何在JupyterLab环境中进行数据分析。我们将从读取Excel数据开始,进行数据探索、处理和可视化,最后将结果保存为文件。这个流程将帮助你初步了解数据分析在JupyterLab中的工作方式。

启动与准备

上一节我们介绍了JupyterLab的基本概念,本节中我们来看看一个实际的工作流程。首先,我们启动JupyterLab并定位到数据文件所在的目录。

在文件浏览器中,导航至桌面上的目标文件夹。数据文件名为 SPA disaster loan data FY 22.xlsx。定位到正确位置后,我们将创建一个新的笔记本文件。

创建与命名笔记本

我们将这个新的未命名 .ipynb 文件保存为一个更具描述性的名称。

以下是保存和重命名步骤:

  • 点击“保存笔记本”。
  • 将文件重命名为 disaster_data_exploration
  • 重命名后,可以在同一文件夹中看到新的 .ipynb 文件。

关闭文件浏览器。接下来,为笔记本添加一个标题。将第一个单元格的类型改为 Markdown,然后输入标题并运行该单元格。


导入数据

现在开始进行分析。首先,从 pandas 模块导入功能。

import pandas as pd

然后,读取数据并将其保存为一个 DataFrame 对象。使用 pandasread_excel 函数。

df = pd.read_excel('SPA disaster loan data FY 22.xlsx')

为了指定读取哪个工作表,需要添加 sheet_name 参数。数据位于名为 FY 22 business 的工作表中。此外,原始文件的前几行不是列名,因此需要跳过。

df = pd.read_excel(
    'SPA disaster loan data FY 22.xlsx',
    sheet_name='FY 22 business',
    skiprows=4
)

运行代码后,显示 DataFrame 的前五行以确认数据已正确加载。

df.head()


数据探索与处理

数据加载成功后,我们进行初步探索。关键列包括 total verified loss(总核验损失)和 total approved loan amount(总批准贷款金额)。

假设我们想评估批准贷款金额占核验损失的比例。为此,需要在数据中创建一个新列。

以下是创建新列的步骤:

  • 创建一个新的代码单元格。
  • 新列名为 loan_pct_of_loss
  • 其值等于 total approved loan amount 列除以 total verified loss 列。
df['loan_pct_of_loss'] = df['total approved loan amount'] / df['total verified loss']

运行后,再次显示前五行数据,并滚动到最右侧以查看新列。

数据筛选与分析

新列创建成功,但部分观测值因缺少贷款金额而无法计算。接下来计算该新列的平均值。

df['loan_pct_of_loss'].mean()

计算结果为无穷大,证实存在无效数据。因此,我们需要筛选数据,创建一个新的 DataFrame

df2 = df[df['loan_pct_of_loss'] < 1000]

然后,计算筛选后数据的平均值。

df2['loan_pct_of_loss'].mean()

为了更详细地了解数据分布,我们创建一个直方图。

df2['loan_pct_of_loss'].hist()

数据可视化

直方图显示大部分观测值集中在0到20之间,但存在一些极高的异常值。为了使图表更具信息性,我们进一步筛选数据并调整直方图参数。

将数据限制在贷款损失比小于5的范围内,并优化直方图。

df2 = df2[df2['loan_pct_of_loss'] < 5]
df2['loan_pct_of_loss'].hist(bins=100, title='Distribution of Loan as Percentage of Loss');


保存结果与总结

分析完成后,将处理后的数据保存为CSV文件,以便未来使用。

df2.to_csv('smaller_loans.csv', index=False)

保存后,可以在文件浏览器中看到新生成的 smaller_loans.csv 文件。

最后,总结本次分析的主要发现。创建一个Markdown单元格,列出要点。

以下是本次分析的关键发现:

  • 部分发放的贷款金额超过了核验损失。
  • 许多贷款的金额与核验损失完全相同。

导出与分享

笔记本可以导出为不同格式以便分享。例如,可以导出为HTML文件。

# 通过JupyterLab菜单操作:File -> Save and Export Notebook As -> HTML

也可以进一步转换为PDF文档。一种方法是打印HTML文件并选择“另存为PDF”。

本节课中我们一起学习了在JupyterLab中执行端到端数据分析的完整工作流程。我们从读取Excel数据开始,进行了数据清洗、计算新指标、可视化分析,最后将结果保存并导出。在后续课程中,我们将更深入地讲解所使用的代码细节以及JupyterLab的操作技巧。

015:JupyterLab 入门之旅 🚀

在本节课中,我们将一起探索 JupyterLab 的核心界面与功能。JupyterLab 是一个基于浏览器的交互式开发环境,是数据分析和编程的得力工具。我们将从界面概览开始,逐步介绍文件管理、菜单操作、侧边栏工具等关键部分,帮助你快速上手。

界面概览与启动器

JupyterLab 在浏览器中运行。主工作区通常用于打开和编辑文件,例如交互式 Python 笔记本文件(.ipynb 文件)。我们将在后续视频中详细介绍这种文件。

首先,让我们从启动器窗口开始。通过点击顶部菜单的 文件 -> 新建启动器,或直接点击界面左上角的加号(+)按钮,可以打开启动器。

启动器窗口允许你创建多种新文件:

  • Notebook:最常用的是创建新的 Python 3 笔记本文件,它使用交互式 Python 内核。
  • Console:创建控制台窗口,用于运行临时代码,但不会保存。
  • Terminal:创建终端窗口,允许你与计算机的命令行界面(如 Mac 的终端或 Windows 的命令提示符)交互。
  • Text File:创建文本文件。
  • Markdown File:创建 Markdown 文件。
  • Python File:创建标准的 .py Python 脚本文件。

启动器还提供了打开其他工具(如文本编辑器)和显示上下文帮助的选项。

顶部菜单栏详解

接下来,我们看看顶部的菜单栏。它包含了许多类似 Word 或 Excel 的常见操作。

文件菜单

文件 菜单中,你可以进行以下操作:

  • 新建文件:从这里也可以创建新文件。
  • 保存:手动保存笔记本文件。默认情况下,JupyterLab 会每隔一段时间自动保存,但手动保存能确保即时存储。
  • 另存为:用新名称保存文件。
  • 导出 Notebook 为:将笔记本导出为多种格式。最常用的是 HTML 格式。PDF 格式也很有用,但需要额外安装软件。此外,还可以导出为 reveal.js 幻灯片,用于制作演示文稿。
  • 关闭标签页关闭所有标签页:管理打开的标签页。
  • 关机:关闭整个 JupyterLab 环境。

编辑与视图菜单

编辑 菜单提供了与单元格交互的各种方式,例如移动、拆分、合并、剪切和粘贴单元格。

视图 菜单中,一个非常实用的功能是 显示行号。在代码单元格中,默认不显示行号。当你需要与他人协作,例如指出“请看第 15 行代码”时,显示行号会非常方便。你可以通过 视图 -> 显示行号 来开启或关闭它。

此外,你可以使用快捷键 Shift + L 来快速切换行号的显示状态。

内核菜单

内核 菜单包含几个重要命令:

  • 重启内核:这类似于关闭 Python 再重新打开。当代码运行出现异常时,重启内核可以清除当前状态,是一个有效的“重置”手段。
  • 重启内核并清除所有输出:重启内核,并清空所有单元格的输出结果,只保留代码本身。
  • 重启内核并运行所有单元格:重启内核后,自动从头到尾运行笔记本中的所有单元格。这在提交作业或分享文件前,用于检查代码是否存在错误非常有用。运行遇到错误时会自动停止。
  • 重启内核并运行至选中单元格:重启内核后,自动运行从第一个单元格到你当前选中单元格之间的所有代码。

设置与帮助菜单

设置 菜单允许你个性化 JupyterLab:

  • 主题:可以切换主题,例如切换到 JupyterLab Dark 深色主题。
  • 文本编辑器:建议开启 自动闭合括号 功能。开启后,当你输入一个左括号 (、左方括号 [ 或左引号时,编辑器会自动补全右括号。这能提升编码效率。
  • 字体大小:可以调整字体大小,也可以直接使用 Ctrl +(加号)和 Ctrl -(减号)来缩放界面。
  • 高级设置编辑器:这里可以配置更多选项。例如,在 代码补全 设置中,可以启用自动补全功能。

帮助 菜单是获取信息的好地方:

  • 可以查看你正在使用的 JupyterLab 版本信息。
  • 获取官方文档和教程链接。
  • 显示上下文帮助 功能非常实用,它可以在你编写函数或查看数据时,在旁边显示相关的帮助文档。
  • 还提供了 Markdown 语法的快速参考指南。这些帮助内容会以新标签页的形式打开。

左侧边栏工具

现在,让我们将目光转向左侧的边栏。这里集成了几个核心工具。

第一个图标是 文件浏览器。你可以在这里浏览和导航到你计算机上的不同目录和文件,双击即可打开。

第二个图标是 打开标签页列表,用于管理所有已打开的标签页。

第三个图标是 内核管理器。内核是你计算机上运行的一个独立 Python 进程。每个打开的 .ipynb 文件通常会占用一个独立的内核,这样不同文件之间的运行不会相互干扰。如果你同时打开了多个文件并运行了代码,可能会占用较多系统资源,导致电脑变慢。此时,你可以在这里查看所有活跃的内核,并选择关闭某个特定的内核(点击旁边的 X),或者 关闭所有内核 以释放资源。

第四个图标是 目录导航器。这个工具对于处理较长的笔记本文件极其有用。它会自动提取你文件中用 Markdown 编写的标题,生成一个可点击的目录。因此,使用标题(如 # 一级标题## 二级标题)来组织你的笔记本内容非常重要,它能让你快速跳转到文件的任何部分。

第五个图标是 扩展管理器。你可以在这里浏览、安装和管理 JupyterLab 的扩展插件,以增加额外功能。扩展会不断更新,建议你根据需要自行探索和添加。

最后一个图标是 AI 助手。这是一个需要单独安装的扩展功能,我们将在后续课程中详细介绍它。

总结

本节课我们一起学习了 JupyterLab 的基本界面和核心功能。我们从启动器创建各种文件开始,详细讲解了顶部菜单栏的文件管理、编辑视图、内核操作和设置帮助。接着,我们探索了左侧边栏的文件浏览器、内核管理器、目录导航等实用工具。记住,熟悉 JupyterLab 的最佳方式就是多使用它。现在,你已经具备了开始使用 JupyterLab 进行数据分析的基础知识。

016:使用交互式 Python 笔记本 📓

在本节课中,我们将要学习交互式 Python 笔记本文件(IPYNB 文件)的基本概念、核心特性以及如何在 Jupyter Lab 环境中有效地使用它们。这种文件格式是数据分析和商业分析领域非常流行的工具。


什么是 IPYNB 文件?

IPYNB 文件,即交互式 Python 笔记本文件,是一种特殊的文档格式。它之所以广受欢迎,主要有两个原因。

首先,它允许你将格式化文本代码以及代码运行结果整合在同一个文档中。这意味着你无需将数据分析软件中的结果复制粘贴到文字处理工具中,所有工作都可以在一个环境中完成。

其次,IPYNB 文件允许你将代码模块化。你可以将代码行组合成独立的“单元格”,并可以单独运行这些单元格,而不必运行整个文件。相比之下,在 .py 这类文件中,如果你想运行部分代码,通常需要在集成开发环境中启用特殊的调试设置或更改默认配置。IPYNB 文件固有的模块化特性让你可以逐步执行代码,这对于数据分析来说非常有用,因为跟踪数据的变化过程通常很困难。你通常会希望先运行一些代码,评估数据以确保代码按预期工作,然后再添加更多代码。


认识 Jupyter Lab 中的 IPYNB 文件

让我们来看一个 IPYNB 文件,并了解它的一些特点。

在 Jupyter Lab 中打开一个文件,你可以在文件浏览器中看到它的名称以 .ipynb 结尾。这就是交互式 Python 笔记本文件。

当然,还有其他可以存储和运行 Python 代码的文件类型。例如,在启动器中,你可以创建 .py 文件。你仍然可以在其中添加代码并与 Python 交互,但它不会将代码输出直接显示在代码下方。.py 文件也很有用,但在 Jupyter Lab 中,我们主要使用 IPYNB 文件。


核心组件:单元格

IPYNB 文件中一个非常重要的概念是单元格。当你点击一个单元格时,它的左侧会高亮显示。如果该单元格有输出,输出部分也会被高亮。当输出内容很多时,你可以点击左侧的页边空白处来折叠输出,这样你就可以滚动浏览而不必显示全部内容,避免了长距离滚动。

蓝色线条指示当前选中的单元格。单元格的类型至关重要,我们主要使用两种类型:MarkdownCode。虽然还有“Raw”类型,但我们不常使用,暂时无需担心。

Markdown 单元格

Markdown 单元格允许你创建格式化的文本。例如,你可以通过帮助菜单中的“Markdown 参考”来学习如何格式化文本。

你可以使用井号(#)来创建标题。一个井号加空格表示一级标题,两个井号表示二级标题,依此类推,最多支持六级标题。每增加一级,标题的字体就会变小一些。

这些标题非常重要,因为它们能让你有效地使用文档的目录功能。通过目录和标题,你可以轻松导航到文档的不同部分。

代码单元格

代码单元格是你输入和运行 Python 代码的地方。重要的是,你可以随时更改单元格的类型。例如,如果你不小心创建了一个代码单元格,但想把它改成 Markdown 单元格,只需在下拉菜单中选择“Markdown”即可。运行这个单元格时,它不会执行 Python 函数,而是渲染为文本。


运行与编辑单元格

你可以使用顶部的菜单栏来运行单元格。对于任何单元格,点击播放按钮即可运行它。

  • 对于 Markdown 单元格:双击可以进入编辑模式,编辑完成后点击播放按钮来渲染文本。
  • 对于代码单元格:点击播放按钮会执行其中的 Python 代码。

如果代码运行时间过长,你可以停止它。此外,你还可以剪切、复制单元格,或通过点击加号按钮来添加新的单元格(默认是代码单元格,可更改为 Markdown)。要删除单元格,可以使用剪切功能。


提高效率:快捷键

很快,你就会希望学习使用快捷键来提高效率。在“编辑”菜单中,你可以看到各种快捷键。

  • 剪切单元格:按 X
  • 复制单元格:按 C
  • 粘贴单元格:按 V
  • 删除单元格:按 D 两次。
  • 运行选中单元格:按 Shift + Enter
  • 显示/隐藏左侧边栏:按 Command + B(这是一个切换键)。
  • 保存笔记本:按 Command + S
  • 显示目录:按 Shift + Command + K
  • 在选中单元格上方添加单元格:按 A
  • 在选中单元格下方添加单元格:按 B

你可以在帮助菜单的“显示键盘快捷键”中找到完整的快捷键列表。


特殊指令:单元格魔术与终端命令

在使用 IPYNB 文件时,你可能会遇到一些以特殊符号开头的单元格。

单元格魔术

有时你会看到以单个或双个百分号(%%%)开头的单元格。这些是单元格魔术,它们不是 Python 代码,而是 Jupyter Lab 提供的一些便捷功能。

例如:

  • %%load:用于将其他文件中的代码加载到当前前端。
  • %%timeit:放在单元格开头,用于测量其下方代码的运行时间。

终端命令

如果一个单元格以感叹号(!)开头,意味着该单元格的内容不是 Python 代码,而是终端命令

例如,如果你想安装一个新的 Python 包,可以运行:

!pip install pandas

你还可以运行其他终端命令,如列出工作目录中的文件(!ls)或打印当前工作目录(!pwd)。


总结

本节课中,我们一起学习了交互式 Python 笔记本(IPYNB 文件)的核心知识。我们了解了它如何整合文本、代码和输出,以及通过单元格实现代码模块化的优势。我们探索了 Markdown 和 Code 两种主要单元格类型,学习了如何运行、编辑单元格,并介绍了一些提高效率的快捷键。最后,我们还简要介绍了单元格魔术(%)和终端命令(!)这两种特殊指令。

起初,处理这些不同的单元格可能有点不习惯,但就像其他技能一样,你使用 IPYNB 文件的次数越多,操作起来就会越得心应手。简而言之,IPYNB 文件是使用 Python 执行数据分析任务的绝佳工具。

017:Jupyter Notebook 之旅 🚀

在本节课中,我们将学习 Jupyter Notebook 集成开发环境。这是一个简化版的 Jupyter Lab 环境。我们将了解如何访问它、其基本界面以及与 Jupyter Lab 的主要区别。

访问 Jupyter Notebook

首先,如何访问 Jupyter Notebook?主要有以下几种方式:

  • 通过 Anaconda Navigator 图形界面启动。
  • 在命令行界面中输入命令 jupyter notebook 并回车启动。
  • 通过 Jupyter Lab 环境访问,这也是本教程将演示的方式。

在 Jupyter Lab 中,你可以看到一个笔记本图标。点击该图标,即可在 Jupyter Notebook 环境中打开对应的 .ipynb 文件。

Jupyter Notebook 与 Jupyter Lab 的对比

上一节我们介绍了如何访问 Jupyter Notebook,本节中我们来看看它与 Jupyter Lab 的异同。

Jupyter Notebook 是 Jupyter Lab 的简化版本。这既是优点也是缺点。

  • 优点:对于 Python 初学者,Jupyter Lab 可能因其丰富的功能而显得复杂。Jupyter Notebook 保持了简洁性,让用户能专注于运行代码单元、创建新单元和删除单元等核心操作,这些操作方式与 Jupyter Lab 中一致。
  • 缺点:随着学习的深入,你可能会需要 Jupyter Lab 中那些随时可用的额外工具。

Jupyter Notebook 的基本操作

在 Jupyter Notebook 中,你可以通过点击左上角的 Jupyter 图标来访问文件浏览器。这会在新的浏览器标签页中打开文件浏览器界面。

以下是文件浏览器的基本功能列表:

  • 点击不同的文件夹或文件进行浏览和打开。
  • 从浏览器窗口打开另一个 .ipynb 文件,它会作为一个新标签页在 Notebook 中打开。
  • 通过点击“运行中”的标签并关闭标签页,来关闭正在运行的笔记本。

总结与建议

本节课中我们一起学习了 Jupyter Notebook 的基本概念和操作。它是一个轻量级的交互式编程环境。

当你在 Jupyter Lab 和 Jupyter Notebook 之间做选择时,建议优先使用功能更全面的 Jupyter Lab。但至少现在,你已经了解了 Jupyter Notebook 是什么以及如何使用它。

018:使用Python进行基础计算 🧮

在本节课中,我们将学习如何在Python中执行基础计算。这些操作大多与计算器或Excel中的功能类似,我们将通过Jupyter Lab环境进行演示,涵盖数学运算、比较运算符、变量以及格式化字符串。

数学运算

上一节我们介绍了课程目标,本节中我们来看看如何在Python中进行基础的数学运算。

在Jupyter Lab中创建一个代码单元格,输入9 + 7并运行,结果会显示为16。单元格旁边的[1]表示这是本次会话的第一个输入和输出。

以下是其他基础数学运算符的示例:

  • 9 / 4 执行除法,结果为 2.25
  • 9 * 3 执行乘法,结果为 27
  • 9 ** 3 使用两个星号 ** 表示幂运算,即9的3次方,结果为 729

除了常见运算符,Python还有两个特殊的除法运算符:

  • 10 // 3 使用两个正斜杠 // 执行地板除法,它返回除法结果的整数部分,忽略余数,结果为 3
  • 10 % 3 使用百分号 % 执行取模运算,它返回除法结果的余数部分,结果为 1

文本的运算

数学运算符中的加法和乘法也可以应用于文本(字符串)。

在Python中,我们用单引号或双引号来定义文本。例如,‘Hello’ * 2 会将字符串重复两次,结果是 ‘HelloHello’

字符串加法 ‘Ho’ + ‘llo there’ 执行的是拼接操作,将两个字符串连接起来,结果是 ‘Hollo there’

比较运算符

比较运算符用于比较两个值,并返回布尔值(TrueFalse)。

以下是常用的比较运算符示例:

  • 10 > 3 判断10是否大于3,返回 True
  • 10 <= 3 判断10是否小于或等于3,返回 False
  • 10 == 3 使用双等号 == 判断10是否等于3,返回 False。注意,单个等号 = 用于赋值,不能用于比较。
  • 10 != 3 使用感叹号和等号 != 判断10是否不等于3,返回 True

变量与赋值

变量用于存储信息。我们使用单个等号 = 进行赋值。

例如,x = 3 将数值3赋给变量 x。之后,输入 x 并运行,Python会输出其值 3

你可以创建多个变量并进行运算:

x = 3
y = 5
z = x * y
print(z) # 输出 15

要同时查看多个变量的值,需要使用 print() 函数。如果直接在单元格中输入 xy,默认只会显示最后一个变量 y 的值。

若想查看当前会话中创建的所有变量,可以使用Jupyter的魔法命令 %whos

格式化字符串(F-strings)

当需要将变量值嵌入到字符串中时,直接拼接数字和字符串会导致错误。例如,‘Hello’ + z 会报错。

此时可以使用格式化字符串(F-strings)。在字符串引号前加上字母 f,然后在字符串内部用花括号 {} 包裹变量名。

z = 15
print(f‘Hello {z}’) # 输出 ‘Hello 15’

F-strings 提供了一种简洁明了的方式来构建包含变量值的字符串。


本节课中我们一起学习了Python的基础计算知识。我们掌握了数学运算、比较运算符、变量的赋值与使用,以及如何用F-strings格式化字符串。这些计算虽然基础,但却是处理更复杂数据集的基石。每位专家都曾是初学者,持续练习并保持好奇,你将在接下来的几周内取得惊人的进步。

019:Google Colab - Jupyter Notebook的在线版本 🚀

在本节课中,我们将学习如何使用Google Colab,这是一个基于浏览器的集成开发环境,可以让你无需在本地安装Python或任何IDE就能运行Jupyter Notebook。我们将介绍如何访问Colab、上传数据、运行现有代码,并了解其核心功能与优势。


概述

Google Colab是Google提供的免费云端Jupyter Notebook服务。它允许用户在浏览器中编写和执行Python代码,特别适合数据分析、机器学习和协作项目。本节将引导你完成从访问Colab到运行一个完整数据分析项目的全过程。


访问Google Colab

首先,你需要使用Chrome浏览器并登录你的Google账户。如果你有多个账户,可以方便地在账户间切换。

  1. 点击浏览器右上角的三个点。
  2. 将鼠标悬停在你的个人资料图标上。
  3. 从弹出的菜单中选择你想要使用的工作或个人账户。

切换账户后,你将打开一个新的浏览器窗口。


准备Google Drive

Google Colab与Google Drive深度集成,你的工作文件和数据通常存储在Drive中。以下是设置工作文件夹的步骤。

  1. 在浏览器中导航至 drive.google.com
  2. 点击“新建”按钮。
  3. 选择“文件夹”来创建一个新文件夹,建议命名时避免使用空格,例如 videoRecordings
  4. 双击进入新创建的文件夹。

上传文件

为了在Colab中分析数据,你需要将数据文件和Jupyter Notebook文件上传到Google Drive。

  1. 在目标文件夹内,点击“新建” -> “文件上传”。
  2. 从你的电脑中选择需要上传的文件(例如Excel数据文件和 .ipynb 笔记本文件)。
  3. 点击“打开”完成上传。现在,这些文件已保存在你的Google Drive文件夹中。

创建与打开Notebook

如果你还没有现成的Notebook,可以直接在Colab中创建。

  1. 在Google Drive文件夹中,点击“新建” -> “更多” -> “Google Colaboratory”。
  2. 系统会创建一个名为 Untitled0.ipynb 的新笔记本。
  3. 你可以像在Jupyter Lab中一样,创建代码单元格和文本(Markdown)单元格。例如,输入 # 标题 可以创建一个一级标题。

如果你想使用已上传的现有Notebook,只需在Google Drive中双击该 .ipynb 文件,它就会在Colab中打开。


Colab界面与核心功能

打开Notebook后,你会看到与Jupyter Lab相似的界面。顶部菜单栏提供了运行单元格、查看快捷键等选项。

一个Colab特有的强大功能是集成了Google的AI工具Gemini,你可以通过点击相应图标访问它,获取代码解释或帮助。

左侧边栏提供了一些实用工具:

  • 目录:方便导航大型笔记本。
  • 查找:在笔记本中搜索文本。
  • 变量浏览器:跟踪当前会话中创建的所有变量。例如,运行 x = 3 后,你可以在变量浏览器中看到变量 x


读取本地数据

在Colab中运行代码时,一个关键步骤是访问你上传到Google Drive的数据文件。直接使用本地文件路径是行不通的,你需要先“挂载”Google Drive。

  1. 点击左侧边栏的文件夹图标。
  2. 点击“挂载Google云端硬盘”图标。
  3. 运行自动生成的代码单元格,并根据提示授权访问你的Google Drive。
  4. 授权成功后,你可以在文件浏览器中看到一个名为 drive 的新文件夹,里面包含了你的Google Drive内容。

要读取特定文件,你需要获取其正确路径:

  1. 在文件浏览器中找到你的数据文件。
  2. 点击文件右侧的三个点,选择“复制路径”。
  3. 在代码中使用 pd.read_csv() 等函数时,粘贴这个路径作为文件名参数。路径通常类似 /content/drive/MyDrive/videoRecordings/your_data_file.csv

导出与分享

Colab可以轻松地将Notebook导出为其他格式,例如HTML,便于分享结果。

你可以使用终端命令来完成转换:

!jupyter nbconvert --to html "/content/drive/MyDrive/videoRecordings/your_notebook.ipynb"

运行此命令后,HTML文件将生成在相同目录下,你可以从Google Drive中下载它。


优势与注意事项

上一节我们介绍了Colab的基本操作,本节中我们来看看它的主要优势和需要注意的地方。

Google Colab的主要优势包括:

  • 无需本地安装:无需在电脑上安装Python或任何IDE。
  • 云端协作:可以轻松地与他人共享Notebook并实时协作。
  • 随处访问:只要连接互联网,你可以在任何电脑上访问和继续你的工作。
  • 强大的计算资源:免费提供GPU和TPU资源,对于机器学习任务非常有用。你也可以付费升级以获得更强大的处理能力。

使用Colab时需要注意:

  • 需要挂载数据:必须先将Google Drive挂载到当前会话才能访问数据文件。
  • 会话限制:免费版本的运行时会话在一段时间不活动后会断开,所有存储在内存中的数据会丢失(但Drive中的文件会保留)。
  • 默认资源限制:免费版本的计算资源和内存有一定限制,对于非常大型的计算任务可能不足。

总结

本节课中我们一起学习了Google Colab的核心用法。我们了解了如何访问Colab、在Google Drive中管理文件和文件夹、上传数据、挂载Drive以读取数据,以及运行和导出Notebook。Colab作为一个强大的云端工具,极大地降低了数据分析的入门门槛,并促进了团队协作。尽管在数据挂载和资源方面有一些限制,但其便捷性和可访问性使其成为学习和执行数据分析项目的优秀平台。

020:结论 🎯

在本模块中,我们初步探索了商业分析的工作方式,并介绍了Python的基础应用。现在,我们将对本模块内容进行总结,并为下一阶段的学习做好准备。

模块回顾与感受

至此,希望你对商业分析的实际运作有了更清晰的认识。

我猜测你可能会感到有些不知所措,尤其是在本模块学习了Python的使用之后。这种感觉是正常的,许多学习者都有同感。需要掌握的知识浩如烟海,目前已有超过50万个由社区创建的Python编程模块可供使用。

下一模块的焦点

在第二个模块中,我们将重点关注如何为数据分析和商业问题构建分析框架,同时继续学习如何使用Python。一个关键的要点是:懂得如何使用内置工具比死记硬背代码更为重要

开始使用Python的要点

以下是开始使用Python时需要牢记的两件事。

1. 寻找有意义的项目

你能做的最好的事情之一,是找到一个有意义的项目来尝试用Python完成。你的实际需求将指引你应该学习什么,并且所学到的知识将在此课程结束后长久留存。

如果你对已学内容感到兴奋,或许已经找到了可以开始着手进行的项目。如果需要帮助,可以考虑一个你在Excel中经常重复的任务,或者向本课程的其他学员寻求建议。

2. 对自己保持耐心

学习过程就像在布莱斯峡谷等待日出。起初,天色黑暗,你可能会感到些许迷茫和寒冷。但慢慢地,几乎难以察觉地,你能看到更多东西,身体也逐渐暖和起来。最终,太阳跃出地平线,色彩交响乐般迸发而出。😊

所有的挣扎与等待,都凝聚成了令人屏息的美丽瞬间。你会意识到,这段旅程对于真正欣赏美景至关重要。

学习语言的规律

类似地,对于Python或任何口语,你阅读代码的速度将快于编写代码的速度。你可能已经体验到,当你开始编写时,会纠结于最微小的细节。你能看到最终目标,但达成目标的步骤却模糊不清。

请再次记住,你并不孤单。我猜想每个人在某种程度上都会经历这个过程。

挫折的价值

你花费所有时间去尝试弄明白代码为何无法运行,并因为仅仅缺少一个逗号或引号而感到沮丧——这些经历将帮助你更好地记住相关知识,尽管你可能并未意识到这一点。

持之以恒的回报

通过持续而勤奋的努力,终有一天你会认识到自己已经走了多远,并会为自己取得的进步感到惊叹。


本节课总结:我们一起回顾了商业分析模块一的初步探索,理解了初学Python时的常见感受是正常的。我们明确了下一模块将聚焦于问题框架的构建,并掌握了两个关键的学习心态:通过实践项目驱动学习,以及对学习过程保持耐心。记住,阅读先于编写,挫折是学习的一部分,持之以恒的努力终将带来显著的成长。

021:引言 🏔️

在本模块中,我们将探讨商业与技术领域的一项基础且至关重要的技能:如何有效地构建问题。核心在于掌握FACT框架中的“F”——Framing Questions(构建问题)。即使面对最复杂的挑战,提出正确的问题也是通往有效解决方案的第一步。

概述:为什么构建问题如此重要?

上一节我们介绍了本模块的主题。本节中,我们来看看构建问题的核心价值。无论是在商业决策还是编程实践中,答案往往触手可及,但提出好问题的能力却始终不可或缺。这关乎于知道问什么问谁如何问,以及如何根据答案采取行动。

具体而言,需要付出努力来明确:

  • 问什么:问题的具体内容。
  • 问谁:最合适的提问对象。
  • 如何问:提问的方式与时机。
  • 如何行动:如何利用获得的答案。

商业场景中的问题构建

在商业环境中,一个构建得当的问题,可能是抓住市场机遇与完全错失机会之间的分水岭。

以下是两个对比示例,说明如何改进问题的构建:

  • 效果不佳的提问方式:在走廊里匆匆遇见采购经理时,提出一个宽泛的问题:“我们怎样才能提高销售额?”
  • 效果更佳的提问方式:在与销售经理的一对一会议中,提出一个更聚焦的问题:“我们销量最好的产品有哪些具体共同特征,是驱动客户购买的关键?” 在这种场合下,你可以记录经理的反馈,从而获得更具建设性的结果。

因此,你的商业知识、对其他员工和客户的理解、从生活经验中获得的直觉,以及你根据问题答案采取行动的意愿,都至关重要。

编程场景中的问题构建

同样,在Python编程中,精确地构建问题能带来更高效的解决方案。

以下是问题构建从模糊到精确的演进过程:

  1. 模糊提问:向AI工具提问:“为什么我的代码不工作?”
  2. 更精确的提问:提出一个构建更好的问题:“在Python中,尝试连接字符串和整数时,什么可能导致类型错误(TypeError)?”
  3. 自主解决:一旦你学会阅读错误信息并理解TypeError的含义,你将能够快速独立地识别并修复问题。

对于更复杂的问题,根据你使用的工具,你可能只需点击一个按钮即可实现代码的改进建议,或查找特定函数的工作原理说明。

总结与展望

本节课中,我们一起学习了构建问题的核心原则及其在商业与编程中的实际应用。

当我们共同面对商业和Python编程的挑战时,请记住一个构建良好的问题所蕴含的力量。这不仅仅是获得答案,更是通过提出正确的问题,引导我们获得有意义的见解和有效的解决方案。

让我们拥抱好奇心,磨练构建问题的技能,一起踏上探索与发现的旅程。在接下来的课程中,我们将深入FACT框架的其他部分,继续构建完整的分析能力。

022:制定可操作性见解的问题框架 🎯

在本节课中,我们将学习数据分析中至关重要的一步:如何构建一个能够通过数据分析工具解答,并能产生可执行见解的问题框架。我们将通过美国国家橄榄球联盟选秀的真实案例,来理解这一过程的核心原则。


构建可回答的问题

FACT框架中首要且最关键的一步,是构建一个能够使用数据分析工具来解答的问题。这个问题所导向的答案,应能推动组织目标的实现。

让我们通过美式橄榄球的背景来思考构建问题的重要性。每年春天,美国国家橄榄球联盟会举行选秀,各球队在此选择他们希望招募的大学运动员。这看似一个非常复杂的决策,因为球队拥有许多不同的位置。

为此,我们听取了NFL布法罗比尔队分析与应用总监路易斯·吉莫的见解,了解他们如何应对NFL选秀。通过分析他的回答,我们可以思考他是如何构建问题的。


分解复杂问题

路易斯在回答中指出,处理选秀这样的大问题时,需要将其分解为更小的部分。以下是分解问题的三个步骤:

  1. 理解“赛场”:即了解有哪些新秀球员可供选择,并尽可能深入地了解每一位球员。这个过程非常漫长,通常需要集中精力进行约六个月,且准备工作开始得更早。
  2. 理解己方阵容:大多数球队都擅长分析自身阵容的优缺点,明确强项和需要改进之处。但归根结底,目标是全面提升所有位置的实力。
  3. 理解其他球队的阵容:这有助于了解对手的需求、他们可能选择的球员以及他们的策略。

通过整合这三个部分,球队可以确定自己的选秀方向。关键在于:仅仅因为你需要某个位置的球员,并不意味着你必须选那个位置;同样,你在某个位置很强,也不意味着你就不该选那个位置的球员。 目标是全方位增强实力。如果最终在某些位置出现人员过剩,还可以通过交易、自由球员签约、弃权球员认领等其他途径进行调整。


从案例中汲取的三个关键经验

从路易斯的回答中,我们可以总结出三条重要的经验:

第一,将大问题分解为小部分。 这在商业环境中尤为重要,因为它能通过让多人并行收集和分析数据来加速分析进程。同时,分解问题也显示出对问题根源的深入思考。请注意,路易斯的第三个问题明确承认了需要考虑对手的技能。

第二,关注分析的聚合层级。 请注意,整体问题的三个部分都聚焦于球员层面,而非比赛、球队或赛季层面。虽然数据最初可能并非按球员层级聚合,但如果你想回答关于球员的问题,将数据聚合到球员层级是显而易见的。

第三,明确核心目标。 路易斯所在组织在选秀期间的主要目标,并非寻找最符合球队当前需求的球员,而是寻找最好的球员。因此,选秀问题可以构建为:我们如何识别最好的球员? 路易斯提到,选秀结束后,NFL还可以通过交易、弃权球员认领等其他途径获取所需球员。


精炼问题以获取可执行见解

在确定了更具体的问题后,我们需要进一步精炼它,以鼓励采用严谨、系统的方法,从而得出可执行的见解。这需要好奇心,以及对数据和数据分析方法的深入理解。

例如,路易斯可以将问题精炼为:哪些因素能识别出最好的球员? 这个问题与之前的问题仅有细微差别,但区别很重要,因为它要求分析师具体解释导致或至少关联于优秀球员的原因。这要求分析师不仅要识别优秀球员,还要提供关于球员最重要特征的见解。

随着你对不同数据分析算法的了解加深,你可能需要考虑如何构建问题,以引导使用特定的算法或数据。

例如,问题的进一步精炼可以是:哪些因素能识别出职业生涯收入最高的球员? 这个问题明确了“最好”的含义,更加具体,因此要求分析师使用球员职业生涯收入的数据,这是之前的问题所没有暗示的。


结合领域知识

请记住,我们分析的成果应导向可执行的见解,因此领域知识是数据分析的关键要素。就NFL的例子而言,我们需要考虑与选秀运作方式相关的细节。

可能的情况是,我们只想创建一个球员的排名顺序,并在每一轮选秀中根据可选的最高排名球员进行选择。如果是这样,那么我们可能需要将问题精炼为:哪些因素能根据预期职业生涯收入对球员进行排序?


总结

本节课中,我们一起学习了构建问题框架的重要性。你的问题构建能力至关重要,因为它将影响你在数据分析中采取的方法。如果遵循严谨、系统的方法,得出的答案就更可能被信任并付诸行动。通过分解问题、聚焦正确的分析层级、明确核心目标并不断精炼问题,我们可以将复杂挑战转化为可通过数据驱动的、可执行的商业见解。

023:构建Python问题 🐍

在本节课中,我们将学习如何有效地构建关于Python的问题。无论是向他人请教还是使用AI工具,清晰地描述你的问题、提供足够的上下文信息,是获得有效帮助的关键。我们将探讨三种常见场景:开始新项目、扩展现有代码以及修复代码错误。


引言:从自然奇观到代码问题 🌄

大家好,欢迎来到本模块。今天,我们身处犹他州南部布莱斯峡谷令人惊叹的红色岩石群中。看看这些不可思议的峡谷层,这个地方会激发人们提出“这是如何形成的?”之类的问题。

在本模块中,我们将讨论如何构建问题,特别是关于使用Python的问题。我向一位经验丰富的程序员请教了他如何获得编码问题的答案。让我们听听他怎么说。


专家访谈:Jeff Campbell的经验分享 💡

关于Jeff Campbell:
Jeff Campbell是一位拥有超过30年经验的软件工程师。他目前为耶稣基督后期圣徒教会工作,担任移动团队的首席软件开发人员,负责移动应用程序。他的职业生涯涵盖了非营利和营利性企业,曾在Intuit(开发QuickBooks)、州政府以及初创公司工作。

关于集成开发环境(IDE)的工具:
编程语言及其库非常庞大。IDE提供的工具,如代码补全、自动编写代码段或重构功能,至关重要。重构尤其重要。一个好的IDE能帮助你识别潜在问题,让你专注于手头的任务,而不是去回忆具体的语法。这就像文字处理软件中的拼写检查器一样。

关于人工智能(AI)工具:
AI工具很有趣,它是一种爱恨交织的关系。AI的代码补全功能超越了基础的语法提示。它能够根据你正在编写的代码上下文,建议完成整段代码。很多时候,它能准确地写出你打算写的内容,节省了编写5到10行代码的时间。

然而,必须谨慎使用AI生成的代码。你总是需要二次检查。AI生成的代码在概念上可能是正确的,但具体实现可能有误。例如,在翻译工作中,AI填充的词语可能只有60%的正确率。如果盲目采用,可能导致数据损坏或误解。因此,使用这些工具时必须小心,并验证其输出。

未来的软件开发可能演变为AI辅助编写代码,而工程师则扮演代码审查的角色。AI可以根据设计图生成代码,但你仍然需要仔细检查和修正。对于新手开发者来说,尤其要注意,不能盲目接受AI的建议,因为可能隐藏着内存泄漏或效率低下的问题。你需要有扎实的软件开发基础,才能识别模式并确保其正确性。


构建Python问题的三种典型场景

现在,让我们考虑三种你会想要构建关于如何使用Python的问题的典型场景。这三种场景是:

  1. 在开始新项目时,寻求帮助来创建Python代码。
  2. 寻求帮助来扩展现有的Python代码。
  3. 寻求帮助来修复代码中的错误。

场景一:开始新项目时创建代码 🚀

上一节我们了解了专家的建议,本节中我们来看看在项目伊始如何提问。假设你想使用历史销售数据来预测未来销售。

以下是提问时的关键要点:

  • 提供数据信息: 无论向人类还是AI求助,都应尝试包含数据信息。包括数据集中每一行代表什么、列名是什么,以及数据样本(如前五行)。这为确定哪种分析方法最有效提供了有用的上下文,因为并非所有分析都适用于所有类型的数据。
  • 先问分析,再问代码: 另一个重要细节是,在开始询问实现分析的代码之前,你可能会先就具体的分析提出广泛的问题。因此,计划提出后续问题,以帮助你了解更多关于建议分析的信息。
  • 善用视频和文档: 当你开始一个从未做过的项目时,视频教程会很有帮助。每当需要做的不仅仅是实现代码时,视频可以帮助你更好地理解细节,例如等待时间或使用哪些按键。此外,无论是否有AI工具,都有内置文档可供访问。

场景二:扩展现有代码时 🔧

在上一节我们讨论了如何开始一个新项目,本节中我们来看看如何对已有代码进行扩展。在这种情况下,记住要提供你现有的代码。

这很重要,因为用代码做事通常有很多种方法。了解你的起点,以便在此基础上进行构建,而不是采用完全不同的方法,这样效率更高。

例如,假设你已经分析了销售数据并创建了预测的气泡图。现在你想在图表的气泡上添加标签。

如果你问一个关于“如何为气泡图添加标签”的通用问题,得到的回复可能会引导你创建一种不同类型的气泡图,这需要不同的函数和编程模块。这实际上是一个好处,因为Python中有许多优秀的编程模块可以用来创建气泡图。

但更好的做法是,分享你当前正在使用的代码,并询问如何使用你特定的函数来为气泡添加标签。

以下是获取帮助的高效方法:

  • 使用IDE内置文档: 如果你想快速访问特定函数的参数,大多数IDE允许你只需按下一两个键盘按键,即可访问特定函数的内置文档。
  • 利用集成AI环境: 当你在集成了AI的环境中工作时,你可能会对最初看到的内容感到惊讶,以为有人在读你的心思。有时,这些AI工具会从你现有的代码中推断出你想做什么,并建议大块的代码,你只需按Tab键即可实现。这非常棒。你可能只需要高亮显示需要帮助的代码,然后输入你的问题,这样就节省了将代码从IDE复制粘贴到AI工具中的时间。

场景三:修复代码错误时 🐛

最后,现在让我们考虑第三种场景:当你寻求帮助修复代码中的错误时。

首先,看到错误信息时不要惊慌。在这个过程中你肯定会遇到一两个错误信息,而且它们可能非常长。然而,这并不意味着你搞砸了什么,所以不用太担心。

当Python遇到错误时,它会停止运行并打印一条消息,以帮助你识别错误来源。对于我们的目的,你只需跳到错误信息的末尾,阅读最后一行,然后如果需要更多细节,再从那里向上看。

Python是一种通用编程语言,错误信息的长篇部分可能对创建新软件的人有用,但对你来说可能不是。你也可能会遇到警告信息。与错误信息不同,警告信息并不意味着Python停止了运行。

警告意味着你可能需要更改代码以澄清你的意图,或者更新代码以满足新标准。如果你使用的编程语言内置了AI,那么你可能只需要点击一个按钮,它就会解释你得到的错误信息或警告信息,甚至可能建议修复代码的方法。


总结 🎯

本节课中,我们一起学习了如何有效地构建Python问题。无论是探索Python的复杂性还是布莱斯峡谷的地质奇观,请记住清晰的沟通是关键。考虑你项目的背景,提供相关细节,并具体说明你的需求。无论你是开始新项目、扩展现有代码还是排查错误,清晰的沟通和分享相关信息都将帮助你获得最有效的帮助。

024:利用外部资源构建问题 💻

在本节课中,我们将学习如何利用外部资源来帮助编写Python代码。你不需要也不可能记住所有代码,掌握寻求帮助的方法至关重要。

上一节我们介绍了编程的基本概念,本节中我们来看看如何借助外部工具高效地解决问题。

1. PyPI.org 📦

PyPI.org是Python的官方第三方软件包仓库。你可以在这里找到通过包管理器(如pip)安装的模块的文档。

目前该网站上有超过616,000个项目,这正说明了记忆所有代码是不可能的。

当你对某个想使用的模块有疑问时,这个网站非常有用。例如,搜索pandas模块的信息。

以下是使用PyPI的步骤:

  1. 访问PyPI.org网站。
  2. 在搜索框中输入模块名称(如pandas)。
  3. 从结果中找到正确的项目(通常是最相关或最流行的)。
  4. 项目页面会提供当前版本、安装方法(如pip install pandas)等基本信息。
  5. 对于像pandas这样流行的模块,通常会有详细的文档链接,引导你了解其功能和使用方法。

2. 互联网搜索引擎 🔍

你的互联网搜索引擎是另一个强大的资源。关键在于如何清晰地描述你的问题。

假设你有一个具体问题:“我有一个pandas数据框df,想按invoice_date列的值聚合total列,并创建一个交互式折线图。”

将这个问题输入搜索引擎,你会得到各种结果。通常,第一个结果可能是可以直接复制粘贴尝试的特定代码。此外,你经常会看到指向Stack Overflow的链接。

3. Stack Overflow 💬

Stack Overflow是一个编程问答社区,人们在这里提问和回答问题。

在搜索结果中,带有对勾标记的答案通常是评分最高的解决方案。使用Stack Overflow时,你需要阅读问题描述,然后将解决方案适配到你的具体场景中。

4. 独立AI工具(如ChatGPT)🤖

AI工具能提供更详尽、带有解释的代码建议。

将同样的问题粘贴到ChatGPT中,它会生成一个更详细的响应,包括代码和每行代码作用的注释。它还可能提醒你安装必要的库。

这些工具的优点是,它们能生成可读性强的代码并附带解释,方便学习和理解。

5. 集成在IDE中的AI工具 ⚙️

现在大多数集成开发环境都集成了AI功能,这使寻求帮助更加便捷。

以下是几种常见IDE的AI集成方式:

  • Jupyter Lab:可以安装Jupyter AI等扩展,并连接到ChatGPT等AI服务。你可以直接在笔记本中提问,并一键将生成的代码插入单元格。
  • Google Colab:集成了Gemini。你可以打开侧边栏的助手,直接提问并获得代码,然后轻松插入到代码单元格中。
  • VS Code:安装后通常会提示连接Copilot。免费版本有一定使用限制。它可以提供代码自动补全,你也可以打开内联聊天直接向Copilot提问。

简而言之,集成AI工具让你无需切换浏览器标签,就能在编码环境中快速获得帮助并应用代码。

本节课中我们一起学习了五种利用外部资源构建Python代码的方法:PyPI.org、搜索引擎、Stack Overflow、独立AI工具以及集成在IDE中的AI工具。虽然这些工具非常高效,能节省大量时间,但它们无法替代你对Python的基础理解。你仍然需要能够清晰地表述问题。在掌握了基础知识后,这些外部工具将成为你使用Python完成任务时的得力助手。

025:利用问题框架解析Python内置文档 📚

在本节课中,我们将学习如何从Python内置的帮助文档中获取信息。这类似于在Excel中使用函数向导,能帮助我们快速了解函数的功能和用法,从而提升编码效率。

访问内置函数列表 📋

上一节我们了解了在Excel中查找函数的方法。在Python中,我们同样可以查看所有可用的内置函数。

要查看Python内置的函数列表,可以使用dir()函数。具体操作是,将__builtins__作为参数传递给dir()函数。

以下是具体步骤:

  • 在代码单元中输入dir(__builtins__)并运行。
  • 运行后会得到一个函数列表。请注意,以大写字母开头或包含双下划线(如__xxx__)的函数通常是私有函数,我们一般不会直接使用。
  • 我们主要关注那些使用蛇形命名法(全部小写,单词间用下划线连接,如abs)的函数,这些是我们常用的内置函数。

查看函数的帮助文档 ❓

一旦我们知道了想要使用的函数名,就可以使用help()函数来查看其详细文档。在Python中,这种内置的帮助文本被称为“文档字符串”。

例如,要查看绝对值函数abs的用法,可以运行help(abs)。执行后,你将看到关于abs函数功能、参数和用法的详细说明。

探索第三方模块的函数 🔍

大多数时候,我们会使用需要先导入的第三方模块中的函数。以数据分析中常用的pandas模块为例。

首先,我们需要导入pandas模块,通常我们为其设置一个简短的别名pd

import pandas as pd

导入后,我们可以使用dir(pd)来查看pandas模块提供的所有函数和属性列表。同样,我们主要关注那些使用蛇形命名法的函数。

例如,如果我们对to_numeric函数感兴趣,可以运行help(pd.to_numeric)来获取该函数详细的帮助文档。

使用IDE快捷键提高效率 ⚡

直接使用dir()help()函数是基础方法,但利用集成开发环境(IDE)的快捷键可以更高效地访问帮助文档。

不同的IDE有不同的快捷方式。以下是两种常见环境的用法:

在Jupyter Lab中:

  • 自动补全:输入pd.后,按Tab键会自动弹出可用函数列表。
  • 查看文档:将光标放在函数名(如pd.to_numeric)上,按Shift+Tab键可以快速弹出格式清晰的帮助文档。

在Visual Studio Code (VS Code) 中:

  • 自动补全:输入pd.后,IDE会自动提示函数列表。
  • 查看文档:将鼠标悬停在函数名上,会以更美观的格式显示帮助文档。

掌握这些方法,无论是直接调用函数还是使用IDE快捷键,都将显著提升你在Python中编写代码的效率。

总结 📝

本节课我们一起学习了如何有效地利用Python的内置帮助系统。我们掌握了使用dir()函数查看可用函数列表,使用help()函数获取具体函数的详细文档。更重要的是,我们了解了如何在Jupyter Lab和VS Code等IDE中,通过Tab键自动补全和Shift+Tab/鼠标悬停等快捷键,更便捷地访问这些帮助信息。这些技能是独立学习和使用Python进行商业分析的重要基础。

026:关于模块函数和方法的提问技巧 🧠

在本节课中,我们将学习如何有效地获取Python模块函数和方法的帮助文档。掌握这些技巧,能让你在编程时更高效地解决问题,就像拥有了一张探索Python世界的详细地图。


上一节我们介绍了寻求帮助的重要性,本节中我们来看看获取帮助的两个核心技巧:针对模块函数和针对方法。

模块函数的帮助获取

模块函数是指只有在导入相应模块后才能使用的函数。Python中的大多数函数都属于此类。一个关键点是,在查阅模块函数的帮助文档之前,你必须先导入它所属的模块。

例如,如果你想查阅pandas模块中read_csv函数的帮助,必须先执行import pandas

导入模块后,调用函数通常需要遵循模块名.函数名的格式,例如pandas.read_csv()。这样做是为了避免命名空间冲突,即不同模块中可能存在同名函数(如内置的mean函数和NumPymean函数)。

为了简化代码的编写和阅读,我们经常在导入语句中为模块设置别名。例如,导入pandas的惯例是使用代码import pandas as pd。这里的as pdpandas重命名为pd。因此,如果你想查阅pandas函数的帮助,只需使用pd.函数名而非完整的pandas

以下是查阅模块函数帮助的步骤:

  1. 导入目标模块。
  2. 使用help()函数,并传入完整的函数引用。

例如:

import pandas as pd
help(pd.read_csv)

方法的帮助获取

为了更好地理解方法,我们可以用一个岩石的类比。岩石有不同的类别,如鹅卵石和巨石。每类岩石因其本质不同而具有不同的属性和功能。

  • 鹅卵石的属性是体积小、可投掷。其功能是能在水面上打水漂。
  • 巨石的属性是体积巨大。其功能是滚下山坡时可以撞倒树木。

这与Python中的方法有何关联?就像有不同的岩石类别一样,Python中也有不同类别的对象。一些基础的对象类别包括pandasDataFrame、字典、列表、字符串和数值等。

正如不同类别的岩石预期具有不同的属性和功能,不同类别的Python对象也拥有不同的属性和功能。这些由对象类别继承而来的功能,就称为方法

重申一下,方法是可由不同类别的对象执行的函数

例如,你可以在一个pandasDataFrame对象上使用.to_csv方法,但不能在一个Python字典对象上使用它。同样,字典因其本质而拥有一些DataFrame对象无法使用的方法。

使用方法的格式是:先写出特定对象的名称,然后输入一个点.,再输入你想要使用的方法名。

类似地,如果你想查阅某个方法的帮助文档,在help()函数中,你也需要遵循对象名.方法名的格式。

我们将主要关注以下四种数据结构:

  • pandasDataFrame
  • Python字典
  • Python列表
  • Python字符串

你很快会发现它们彼此之间的联系,并且随着时间的推移,你会认识到这些数据结构是数据分析中最常使用的工具。


本节课中我们一起学习了如何为Python编程寻求有效帮助。核心要点是:查阅模块函数的帮助前,务必先导入该模块;查阅对象方法的帮助前,务必先创建该对象。

就像拱门是进一步探索布莱斯峡谷的入口,理解模块和方法是你掌握Python的入门钥匙。起初这可能有些复杂,但通过练习并善用帮助文档,你将获得自信地处理任何Python对象的专业知识。拥抱这段学习旅程,持续探索,让知识的力量引导你在Python世界和周围的自然奇观中前行。

027:关于Pandas数据框的框架问题 🐼

在本节课中,我们将要学习Pandas库中一个核心的数据结构——数据框(DataFrame)。我们将了解如何创建数据框,以及如何查找和使用数据框自带的方法。

数据可以存储在许多不同的结构中。在本视频中,我们将重点介绍其中最重要的数据结构之一,即Pandas数据框,通常简称为数据框。关于数据框,我们有很多内容可以讨论,但在这个视频中,我们只想展示如何创建一个数据框,以便你随后可以提出关于如何使用数据框的问题。

数据框概述 📊

数据框类似于Excel工作表,数据被组织成行和列。通常,每一行代表一个观测值,每一列代表一个特征。

上一节我们介绍了数据框的基本概念,本节中我们来看看一些Pandas数据框的实际操作示例。

从CSV文件创建数据框 📂

首先,我们将演示如何将CSV文件作为Pandas数据框读入Python环境。

在创建Pandas数据框之前,需要从Pandas模块导入函数。我们通常从Pandas模块导入函数并将其重命名为pd,这样就不必每次都输入pandas

import pandas as pd

Pandas有很多不同的函数用于从不同文件格式读取数据,例如HTML、Excel文件、CSV文件等。由于我们要读取的数据是CSV格式,因此我们将使用read_csv函数。

df = pd.read_csv('receivables.csv')

读取CSV文件中的数据并将其转换为Pandas数据框后,我们将其保存为一个变量df。然后我们可以输入数据框的名称来预览数据。

df

运行代码后,数据框会以美观的格式显示,每个列标题和行索引值都会加粗显示。

从零创建数据框 🛠️

除了从文件读取,我们也可以从零开始创建数据框。这在某些情况下非常重要,并且你会发现数据框是由我们稍后将讨论的其他基础数据结构组成的。

以下是创建一个新数据框df2的示例:

df2 = pd.DataFrame({
    'Column_A': [1, 2, 3],
    'Column_B': ['A', 'B', 'C']
})
df2

运行此单元格后,我们创建了一个包含三行两列的简单数据框。

数据框对象与方法 🔍

现在我们已经创建了两个数据框,可以开始对它们提出问题。Python中一个非常重要的概念是创建对象。对象是特定类型的实例。

数据框对象因其是Pandas数据框而继承了特定的函数。这些由对象继承的函数被称为方法

要查看数据框对象可用的所有方法,可以在Jupyter Lab等IDE中输入数据框名称加一个点.,然后查看自动弹出的列表。

例如,to_excel方法允许我们将数据框对象写入Excel工作表。这是一个非常有用的功能。

要将我们创建的简单数据框写入Excel文件,只需使用to_excel方法:

df2.to_excel('test_df.xlsx')

运行此代码后,你可以在文件资源管理器中找到新生成的test_df.xlsx文件。

这里要强调的是,为了访问Pandas数据框继承的这些函数或方法,首先必须创建一个数据框。一旦你知道如何创建Pandas数据框,就可以通过简单地输入数据框名称,然后使用IDE中的快捷方式来查找相关的帮助文档,并访问与它们关联的方法。

总结 📝

本节课中我们一起学习了Pandas数据框的基础知识。我们了解了数据框是一种类似于Excel工作表的结构,用于存储行列数据。我们掌握了两种创建数据框的方法:从外部文件(如CSV)读取数据,以及使用pd.DataFrame()函数从零创建。最重要的是,我们学习了数据框作为对象,拥有许多内置方法(如to_excel),并知道了如何在IDE中查找和使用这些方法的帮助文档。这是后续深入学习数据操作和分析的重要基础。

028:Python字典基础教程 📚

在本节课中,我们将要学习Python中的一种基础数据结构——字典。我们将了解字典的构成、特点以及如何查找和使用字典的帮助文档。


什么是Python字典? 🔑

Python字典是一种基础数据结构,无需导入任何模块即可创建。在数据分析中,字典是一种常用且重要的数据结构。

字典由键值对组成。每个键值对包含一个键和一个对应的值,键和值之间用冒号分隔,键值对之间用逗号分隔,整个字典用花括号 {} 括起来。

例如,以下代码创建了一个字典:

dry = {'owner': ['John', 'Jane'], 'price': [100, 200]}

在这个例子中,字典 dry 包含两个键值对:键 'owner' 对应值 ['John', 'Jane'],键 'price' 对应值 [100, 200]


字典的键值对结构 🗝️

上一节我们介绍了字典的基本概念,本节中我们来看看字典的核心结构——键值对。

字典中的每个条目都是一个键值对。键是唯一的,用于查找对应的值。你可以通过键来访问字典中的值。

例如,要访问字典 dry 中键 'owner' 对应的值,可以使用以下代码:

dry['owner']

运行这段代码将返回 ['John', 'Jane']

这种访问方式类似于查字典:通过单词(键)查找定义(值)。


字典的常用方法 📖

了解了字典的基本结构后,我们来看看字典对象有哪些可用的方法。

字典作为Python对象,继承了一系列方法。要查看这些方法,可以先创建一个字典对象,然后使用点号 . 查看。

例如,对于字典 dry,输入 dry. 后,会显示一系列可用的方法,如 keys()values()items() 等。

以下是几个常用方法的示例:

  • dry.keys():返回字典的所有键。
  • dry.values():返回字典的所有值。
  • dry.items():返回字典的所有键值对。

运行 dry.keys() 将返回 dict_keys(['owner', 'price'])


如何查找字典的帮助文档 ❓

如果你需要更详细地了解字典的用法,可以查阅Python的内置帮助文档。

使用 help(dict) 函数可以获取关于字典数据类型的详细说明文档。这份文档包含了字典的创建、方法、操作等全面信息,是学习和查阅的好资源。


总结 📝

本节课中我们一起学习了Python字典的基础知识。我们了解到字典是一种由键值对组成的数据结构,可以通过键来快速访问对应的值。我们还学习了如何查看字典对象的方法以及如何利用 help() 函数获取详细的帮助文档。在后续的数据分析实践中,你会经常用到字典,例如作为函数参数或创建Pandas DataFrame。

029:Python列表基础与提问框架 📚

在本节课中,我们将学习Python中另一个基础数据结构——列表。我们将了解列表是什么、它的特点、如何从中提取数据,以及如何查找关于使用列表的文档和帮助信息。


什么是Python列表? 📝

列表是Python原生的一种数据结构。它用于存储一系列有序的元素。

在代码中,列表由方括号 [] 定义,其中的元素用逗号分隔。例如,从一个字典的值中提取出的列表可能如下所示:

my_list = ['Nelson', 'Montoya']

如何访问列表中的元素? 🔍

访问列表元素是列表最常用的操作之一。这通过索引实现。

Python使用从0开始的索引系统。这意味着第一个元素的索引是0,第二个是1,依此类推。

访问单个元素

要访问列表中的单个元素,需使用列表名称后跟方括号,并在方括号内指定元素的索引位置。

例如,要获取列表 my_list 的第一个元素 'Nelson',应使用索引0:

my_list[0]  # 返回 'Nelson'

要获取第三个元素 'Montoya'(假设列表中有足够元素),则使用索引2:

my_list[2]  # 返回 'Montoya'

访问连续的元素(切片)

如果需要获取列表中连续的一段元素(即切片),可以使用冒号 : 分隔起始索引和结束索引。

重要规则:切片操作包含起始索引,但不包含结束索引。

  • 要获取前三个元素(索引0, 1, 2),应使用 my_list[0:3]。因为结束索引3不被包含。
  • 如果只想获取前两个元素(索引0, 1),则应使用 my_list[0:2]

如何查找列表的方法和帮助文档? ❓

列表作为Python的内置对象,拥有许多内置方法(函数)。当你不确定如何操作列表时,可以查阅相关文档。

以下是查找帮助信息的几种方法:

  1. 使用 dir() 函数或IDE提示:输入列表变量名加一个点 .,大多数集成开发环境(如Jupyter Lab)会自动显示该列表可用的所有方法列表。
  2. 使用 help() 函数:你可以对特定的列表方法使用 help() 函数来获取详细说明。例如:help(my_list.append)
  3. 查阅官方文档:你也可以直接使用 help(list) 来查看列表数据结构的完整官方文档。这份文档虽然不如字典的长,但包含了一个非常有用的方法汇总表格,清晰地列出了所有可用的操作。

总结 📌

本节课中,我们一起学习了Python列表的基础知识。

我们了解到列表是一种用方括号 [] 表示的有序数据结构。访问其元素需使用从0开始的索引,并通过 list_name[index] 的语法进行。对于连续元素的切片,则使用 list_name[start:end] 的语法,并记住结束索引不被包含。

最后,我们掌握了如何利用 dir()help() 函数以及IDE的提示功能来查找列表的方法和官方文档,这是解决编程问题、自主学习的关键技能。

掌握了列表的基本操作后,你就能在数据分析中有效地组织和处理一系列数据了。

030:字符串基础与问题构建 🧵

在本节课中,我们将要学习Python中一个非常基础但极其重要的数据结构——字符串。你将了解到字符串是什么、如何创建它们、如何访问其中的字符,以及如何利用Python的内置帮助文档来探索字符串的各种操作方法。

什么是字符串?

字符串,顾名思义,是由字符“串”在一起组成的。在Python中,你可以通过将字符放在单引号 ' 或双引号 " 内来创建一个字符串。字符串是Python的原生数据类型,这意味着你无需导入任何模块即可创建和使用它们。

创建与访问字符串

让我们通过一个例子来开始。假设我们创建一个名为 my_s 的字符串变量,其值为 "Nelson"

my_s = "Nelson"

创建字符串后,我们可以像处理列表一样,通过索引来访问其中的特定字符。字符串的索引也是从0开始的。

以下是访问字符串元素的方法:

  • 访问单个字符:使用方括号 [] 和索引号。例如,my_s[0] 返回第一个字符 'N'
  • 访问字符序列(切片):使用冒号 : 指定起始和结束索引。例如,my_s[1:4] 返回从索引1到索引3的字符(即 'els'),注意结束索引本身不包含在结果内。
  • 从末尾开始访问:使用负索引。例如,my_s[-1] 返回最后一个字符 'n'my_s[-4:] 则返回从倒数第四个字符到末尾的所有字符(即 'lson')。

探索字符串的方法

字符串对象拥有许多内置方法(函数)。在Jupyter Lab等集成开发环境中,输入字符串变量名后加一个点 .,通常会弹出可用方法的列表。

例如,我们可以尝试一些方法:

  • my_s.capitalize(): 将字符串首字母大写(如果已经是,则无变化)。
  • my_s.lower(): 将字符串中所有字符转换为小写。

如果你想了解某个方法的具体用途,可以使用 help() 函数。例如,运行 help(my_s.casefold) 可以查看 casefold 方法的文档,该方法返回一个适用于不区分大小写比较的字符串版本。

处理字符串中的引号

有时,字符串本身需要包含引号字符。这可能会与定义字符串的引号产生冲突。Python的帮助文档提供了解决方案。

以下是处理字符串内引号的方法:

  • 使用转义字符:在字符串内的引号前添加反斜杠 \。例如,my_s = 'Nell\'s son'
  • 交替使用引号类型:用双引号定义包含单引号的字符串,或用单引号定义包含双引号的字符串。例如,my_s = "Nell's son"

当代码出现类似 SyntaxError: unterminated string literal 的错误时,通常就是因为引号匹配问题,上述方法可以帮助你解决。

总结

本节课中,我们一起学习了Python字符串的基础知识。我们了解了如何创建字符串、如何使用索引和切片访问字符串中的字符,并初步探索了字符串的内置方法。最重要的是,我们学会了如何利用 help() 函数和IDE的提示功能来构建关于字符串使用的问题并寻找答案,这是在Python学习中持续进步的关键技能。在后续课程中,你将获得大量使用字符串的实践机会。

031:行动指南 🚀

在本节课中,我们将学习如何在学习Python数据分析时采取有效行动。我们将探讨三种具体方法,帮助你从提问、实验和错误中学习,从而更高效地掌握技能。

引言:行动的重要性 🏞️

今天我正沿着犹他州南部布莱斯角观景台附近一条美丽的小径徒步。徒步旅行本身就是一种行动,正如你所看到的蜿蜒曲折的小径。我必须留意落石,同时也想欣赏沿途的美景,让好奇心作为我的向导。

同样地,在学习如何使用Python进行数据分析时,你也需要采取行动。

三种行动方式 📝

以下是三种你可以采取的具体行动方式,它们将帮助你更好地学习和理解Python。

1. 审慎思考得到的回答

第一种方式是,仔细思考你提出的问题所得到的回答,尤其是那些来自人工智能的回答。我的意思是,你应该考虑这些回答如何与你现有的知识体系相契合。它们可能强化你目前对Python工作原理的理解,这很好。然而,如果你不理解某个回答,那么你应该尝试弄清楚它如何与你现有的理解相融合,这样你的理解就会增长。

2. 尝试小型代码实验

第二种方式是根据你得到的回答,尝试进行小型代码实验。我的意思是,你可以创建一小段代码并运行它,即使代码运行不成功也不必担心。事实上,我经常从失败的代码中学到的东西比从成功的代码中学到的更多。这有助于我更好地记住我正在学习的内容。

3. 阅读错误信息

第三件事是阅读错误信息。如果你像我一样,可能习惯于不阅读错误信息,因为它们看起来很可怕,你会想:“嘿,那是IT部门的问题。”但我想鼓励你去阅读这些错误信息。阅读错误信息的一个技巧是从底部开始,然后向上阅读,因为最有洞察力的部分通常位于错误信息的底部。

当然,会有一些错误信息你无法完全理解。如果是这种情况,只需将它们复制并粘贴到AI工具中,让它解释错误信息的含义。

总结与鼓励 🌟

正如我们讨论的,好奇心是那些在这条美丽小径上徒步前行者的驱动力。在学习使用Python进行数据分析时,也让好奇心成为你的向导:深思熟虑地对待你得到的回答,无畏地进行代码实验,并将错误信息视为学习和成长的机会。

现在,去实践吧!从你的Python代码得到的反馈中实验和学习,让好奇心成为你的向导,就像它是这条小径上徒步者的向导一样。

本节课中,我们一起学习了在学习Python数据分析时采取行动的三种核心方法:审慎思考回答、进行代码实验以及阅读错误信息。记住,行动和好奇心是学习过程中最强大的工具。

032:通过运行代码实验来实践答案 💻

在本节课中,我们将学习如何通过运行小型代码实验来探索和理解代码的功能。这是一种高效的学习和调试方法,尤其适合初学者。

与构建实体结构不同,编写代码允许我们快速尝试多种方案,即使失败,损失的也仅仅是少量时间。这种低成本的试错特性是编程的巨大优势。接下来,我们将介绍两种运行代码实验的方法,以及集成开发环境中一些有用的工具。

两种实验方法 🧪

以下是两种在编写代码时进行实验的常用方法。

方法一:使用控制台

第一种方法是使用IDE中的控制台。在控制台中输入的代码是临时的,不会直接添加到你的主脚本文件中。在Jupyter Lab中,你可以通过“文件”菜单新建一个控制台。

# 例如,在控制台中测试对数据框某列的求和
df['quantity'].sum()

控制台的优势在于,你可以独立于主文件测试代码片段。如果测试成功,再将有效的代码复制到主文件中。

方法二:在代码单元中临时添加

第二种方法是直接在代码单元中添加实验性代码,并在确认其功能后将其删除。

# 在代码单元中临时添加测试
total_quantity = df['quantity'].sum()
print(total_quantity)
# 测试完毕后,记得删除这行临时代码

这种方法的好处是实验环境与最终代码环境完全一致,但需要你记得清理这些临时代码。

重要工具与注意事项 ⚠️

在运行实验后,有一个至关重要的步骤:确保代码能从头到尾独立运行。

当你进行多次实验后,可能会忘记某些变量是在之前的某个实验中定义的,而没有将其正式写入代码流程。因此,在将代码交付他人或提交作业前,必须使用IDE的“重启内核并运行所有单元”功能。

这个操作会清除所有已定义的变量,然后从头开始执行文件中的所有代码单元。如果此时出现错误,就说明你的代码存在依赖缺失的问题,需要将实验成功的代码正式整合到脚本中。

总结 📝

本节课我们一起学习了通过运行小型代码实验来探索代码功能的实践方法。我们介绍了两种主要方法:使用独立的控制台进行测试,以及在代码单元中临时添加并随后删除实验代码。同时,我们强调了在实验完成后,务必使用“重启并全部运行”功能来验证代码的独立性和完整性,这是保证代码质量的关键一步。

033:通过阅读错误信息来解决问题 🔍

在本节课中,我们将要学习如何正确理解和利用Python编程中出现的错误信息。错误信息是学习编程过程中的重要工具,而非障碍。我们将通过具体实例,掌握阅读和理解错误信息的技巧。

错误信息可能令人畏惧,因为它们通常是红色的,并且有时包含大量难以理解的技术细节。过去,错误信息可能曾导致软件损坏或硬件故障,甚至数据丢失,从而引发负面情绪。然而,在数据分析的Python编程中,我们应将其视为学习机会。本节将分享一些技巧,帮助你从错误信息中学到最多。

理解错误信息的价值 💡

上一节我们提到了错误信息是学习机会,本节中我们来看看如何具体操作。首先,我们需要改变对错误信息的看法。

以下是对待错误信息的第一条核心建议:

  • 阅读错误信息:不要仅仅将其视为表示“失败”的红灯,然后就去求助他人。请主动阅读错误信息本身。

阅读错误信息的技巧 📖

仅仅阅读还不够,我们需要掌握正确的阅读方法。这引出了第二条重要技巧。

以下是阅读错误信息的正确顺序:

  • 自下而上阅读:不要从上到下阅读错误信息。最有用、最核心的信息通常出现在最底部。从底部开始阅读,即使不能完全理解,通常也能推断出问题所在。

让我们通过一个具体例子来实践这些技巧。在Jupyter Lab环境中,我们尝试运行一段代码:导入pandas模块,读取一个CSV格式的应收账款文件,然后对quantity列进行求和,并将结果保存在变量total_quantity中,最后用这个变量生成一句话。但请注意,代码中变量名total__quantity多了一个下划线。

import pandas as pd
df = pd.read_csv('receivables.csv')
total__quantity = df['quantity'].sum()
print(f"The total quantity is {total_quantity}")

运行这段代码会产生一个错误。根据第二条技巧,我们从错误信息的底部开始阅读。底部显示:NameError: name 'total_quantity' is not defined。这明确告诉我们出现了名称错误,变量total_quantity未定义。结合我们已知的变量名拼写错误,问题就很清晰了。错误信息的上半部分会指出错误发生的具体行号和单元格信息,例如Traceback (most recent call last)等,这些信息在调试复杂代码时很有用。虽然看起来有些复杂,但并不可怕。

处理复杂错误信息 🧹

接下来,我们看另一种错误类型,并学习第三条技巧。我们尝试用read_excel函数去读取一个CSV文件,这显然会导致错误。

df = pd.read_excel('receivables.csv')

运行后会得到一个较长的错误信息。此时,第三条技巧就非常重要了。

以下是处理冗长错误信息的方法:

  • 忽略不必要的信息:你可以忽略错误信息中的很多内容。同样,从底部开始阅读。底部可能显示:ValueError: Excel file format cannot be determined, you must specify an engine manually。关键信息是,它无法确定Excel文件格式。这足以让你意识到问题所在:你正在对CSV文件使用read_excel函数。如果往上阅读的内容变得过于技术化,可以忽略它们。这些内容很多是面向软件工程师和开发者的。

经验积累与总结 🎓

最后,第四条技巧关乎长期的学习过程。

关于错误信息的经验之谈:

  • 经验使信息更有意义:请记住,随着经验的积累,错误信息对你来说会变得越来越有意义。最初,你可能会遇到一些完全无法理解的错误信息,但随着你反复遇到它们,你会逐渐理解其含义。要认识到你将从经验中学习。

在本节课中,我们一起学习了如何将Python中的错误信息转化为学习工具。我们掌握了四条核心技巧:主动阅读错误信息、自下而上阅读、忽略不必要的技术细节,以及相信经验积累的力量。确保将这些技巧付诸实践,你会发现错误信息能为你解答关于Python代码使用的疑问提供极其宝贵的信息。

034:结论

在本模块中,我们深入探讨了如何提出有效的问题,这是商业分析和Python数据分析学习的核心基础。我们将回顾本模块的关键要点,并理解如何将这些原则应用于实际探索中。

模块回顾:聚焦细节

上一节我们介绍了如何提出好的问题。本节中,我们来看看本模块的核心总结。

正如你所见,犹他州南部拉博角瞭望台的天气有些阴沉。云层可能限制了远眺的视野,但这让我们得以专注于细节。这正如同在本模块中,我们专注于探究什么构成了一个好问题的细节,无论是在商业领域还是在学习Python数据分析时。

即使天空如此戏剧化,前方的道路依然清晰,这得益于我们已掌握的基础知识。

核心框架:FACT 中的 “F”

这个综合性模块聚焦于FACT框架中的“F”,即构架问题。这在商业和编程语境中都至关重要。

在我们的数字时代,虽然答案唾手可得,但提出有效问题的艺术比以往任何时候都更加重要。

成功的构架问题需要理解:

  • 问什么:问题的具体内容。
  • 问谁:提问的对象。
  • 如何问:提问的方式。
  • 如何行动:如何根据答案采取行动。

商业应用:从模糊到可执行

商业部分展示了精心构架的问题如何将模糊的询问转化为可执行的见解。

例如,与其向一位路过的经理模糊地提问:“我们如何能增加销售额?”,一个更有效的方法是:在专门的会议中,提出一个关于产品功能和客户行为的、具体且有针对性问题。

编程应用:精确提问,高效解决

类似地,在Python编程中,精确的问题构架能带来更高效的问题解决,无论你是开始一个新项目、扩展现有代码还是排查错误。

本模块的很大一部分内容侧重于通过多种途径获取帮助的实践性指导,包括:

  • 内置文档(如 help() 函数)。
  • 外部资源(如官方文档、Stack Overflow)。
  • AI工具。

总结与前行

因此,即使今天我们周围的景色有些朦胧,我们在本模块中探索的原则依然鲜明而清晰。

我们学到,掌握Python和数据分析,如同任何旅程中的导航,不仅在于提出问题,更在于有效地利用我们找到的答案

我们可以通过以下方式利用找到的答案:

  • 深思熟虑地考虑回应,尤其是来自AI的回应。
  • 无畏地尝试代码。
  • 从错误信息中学习。

让我们带着本模块的见解和挑战,继续在我们探索的道路上前行。

在本节课中,我们一起学习了如何为商业分析和Python编程构架有效的问题,掌握了提问的艺术和利用答案的方法,为后续的深入学习奠定了坚实的基础。

035:第三模块简介

在本节课中,我们将要学习数据价值的核心特征,并了解如何将这些原则应用于数据分析中最关键的数据结构——Pandas的DataFrame。

大家好,欢迎来到令人惊叹的布莱斯峡谷荒野。正如你所见,我们被一片广阔而复杂的景观所包围,充满了隐藏的美丽和宝贵的资源。这很像我们即将探索的数据世界。想象这片荒野是一个巨大的矿藏,富含着有价值的矿石。这很棒,对吧?关键在于,你必须经历大量的工作,才能将原始的泥土转化为有用的矿石。

那么,这个类比如何与数据分析联系起来呢?数据对于做出明智的商业决策非常有价值。例如,创建像ChatGPT这样的人工智能工具需要海量的数据。然而,在数据能被用于创造这些神奇的工具之前,它必须经过处理,这通常需要大量的工作。例如,一家制造公司可能希望利用其大量的历史数据,创建一个智能代理来帮助进行预测性维护、质量控制和供应链优化。

这些数据可能包括存储在内存芯片或SD卡中的传感器数据、存储在PDF文档和电子邮件中的发票数据、存储在电子表格和图表中的财务建模数据,甚至可能包括从会议录音中提取的智慧。在使用这些数据之前,他们必须提取并规范化数据,以便所有数据都能用于训练LLM(大型语言模型)。即使你只是尝试使用存储在具有相同数据结构的历史文件中的数据来制作一些可视化图表,在将其转化为可视化之前,也需要付出一些努力来准备数据。

本模块的重点有两个。首先,我们将探讨使数据具有价值的一般特征。其次,我们将演示这些原则如何应用于Pandas的DataFrame,这是数据分析中最重要的数据结构。

正如布莱斯峡谷荒野的美丽需要通过细致的观察和处理才能展现,数据的价值也需要通过仔细的分析才能揭示。当你完成本模块时,你将能够使用过滤器、条件语句、汇总统计和简单的可视化来探索Pandas的DataFrame,就像使用工具来过滤、分析和可视化这片景观一样。因此,无论你是准备数据还是指导整个过程,你都将获得将原始信息转化为有意义见解的技能。

正如我们将对这片景观的理解转化为欣赏一样。

036:数据是一种资产 💎

在本节课中,我们将要学习“数据”这一核心概念。我们将探讨数据的定义,并从会计和商业实践两个角度,深入分析“数据是否是一种资产”这一重要问题。

当我们欣赏布莱斯峡谷这色彩斑斓、形态壮丽的绝美景色时,我希望你做一件事。几秒钟后,我会说一个词,请你思考脑海中浮现出什么。这个词是:数据。你想到了什么?

或许有些人想到了数学和统计学。另一些人可能想到了维基百科页面上那些包含几乎所有主题信息的文字。也许有些人想到了那些不可改变、无可争议的事实。或许你想到了石油,因为你听说过“数据是新的石油”。或许你想到了那些一旦丢失就会让公司陷入麻烦的东西。

我的观点是,当你们每个人听到“数据”这个词时,脑海中可能浮现出不同的意象。这个我们可能都习以为常的简单词汇,背后其实大有文章。

因此,让我们给出一个与商业信息决策相关的数据定义。我们将采用韦氏词典对数据的定义:用作推理、讨论或计算基础的事实性信息,例如测量值或统计数据。也就是说,如果测量值和统计数据能作为决策的基础,它们就算作数据。

如果没有可以分析和付诸行动的数据,商业分析的概念将不复存在。正因如此,数据对企业而言极具价值,这也是企业采用多种策略收集数据的原因。

既然公司会投资于收集、存储、处理和销售数据,一个有趣的问题便产生了:数据是一种资产吗? 让我们从不同角度来思考这个问题。

会计视角:数据的资产属性

首先,让我们听听会计学教授 Kim Mendoza 关于数据是否是资产的看法。

资产有很多定义,例如韦氏词典将资产定义为拥有的有价值的物品。从财务角度看,比如,数据是否是一种公司可以列入财务报表(或许在资产负债表上)的资产?会计准则将资产定义为一个实体获得经济利益的现有权利。本质上,实体拥有数据,并且数据将为实体赚钱。

那么,根据这些定义,数据是资产吗?虽然数据极具价值——想想社交媒体应用收集的关于我们的所有数据——这些数据被用来赚取数百亿的利润,所以数据确实能为实体带来经济利益。所有权也被讨论,公司拥有并出售他们的数据,所以数据再次符合资产的定义。

但有趣的是,我们并没有在财务报表上看到大多数数据被列出。为什么会这样?问题在于,当公司生成或收集数据时,其价值真的很难确定。我们无法轻易计算或预测能从数据中获得什么经济利益。利用我公司的数据,我可能知道为组织创造收入的不同方式,但我不知道具体金额,而且数据可能还有许多其他有益于我组织的方式是我尚未发现的。

因此,虽然根据定义数据是资产,但目前公司不允许在财务报表中确认大多数数据。也有一些例外,比如购买的数据。例如,如果我购买了一份潜在客户的名单用于联系,我知道那份数据的价值,因为我为此付了钱。像购买这样的交易使确定价值变得更容易,但绝大多数的数据并未作为资产列在财务报表中。😊

所以,当我们评估一家公司的财务报表时,这意味着什么?可能有数百万甚至数十亿美元的资产并未列在资产负债表上。也许有一天我们会找到衡量数据价值的方法,但就目前而言,我们必须认识到这些宝贵资产的存在,即使我们看不见它们。

Kim 对资产是什么给出了一个很好的技术定义,并指出数据当然有价值,但由于通常难以估价,所以不常被确认为公司资产负债表上的资产。

商业实践视角:数据的战略价值

接下来,让我们考虑另一个视角。我询问了伊利诺伊大学校友、美国国家橄榄球联盟(NFL)布法罗比尔队的分析与应用总监 Luis Guimmo,数据是否是一种资产。让我们听听他的回答。

我完全赞同数据是一种资产的概念。我相信优质且准确的数据永远不嫌多,我加上这些限定词是因为困境就在于此——你得到的数据很少是高质量、高准确性的。我喜欢这样想:如果 NFL 的每支球队在分析数据、创新使用数据方面都同样出色,那么拥有最多数据的球队基本上就会获胜。反之亦然,如果你没有足够的数据,就没有东西可以创新,没有东西可以分析,这可能会对你的团队、组织或你正在处理的任何事情造成阻碍。

总而言之,即使你在资产负债表上看不到数据,数据绝对具有未来的经济价值。因此,我倾向于同意 Luis 的观点,在其他条件相同的情况下,拥有最多数据的团队或公司会获胜。我相信这一原则适用于商业的所有领域,而不仅仅是橄榄球。

总结与启示

因此,当阳光照耀在这壮丽的景观上时,让我们记住,正如这景色不仅仅是岩石、树木和光线,数据也不仅仅是数字和统计。😊

把它看作是推动创新、驱动决策、并最终决定成功的燃料,不仅在商业中,也在我们理解周围世界的探索中。

在本节课中,我们一起学习了数据的定义,并从会计和商业实践两个维度探讨了“数据是一种资产”这一命题。我们了解到,尽管数据因其价值难以精确计量而通常不被列入财务报表,但它无疑是能为组织带来未来经济利益的战略资产。在商业竞争中,拥有更优质、更大量的数据往往意味着更大的优势。

037:数据组装 📊

在本节课中,我们将深入学习FACT框架中的第二步:数据组装。数据组装至关重要,因为它通常直接影响问题能否被有效解答。有趣的是,这个过程往往比实际计算结果花费更多时间。

概述:数据组装的重要性

上一节我们介绍了FACT框架,本节中我们来看看其中的“A”——数据组装。数据专家路易斯·吉列尔莫分享了他的经验:大约80%的时间用于数据准备,只有20%的时间用于实际计算。这主要是因为数据质量、准确性、格式以及确保拥有所需全部数据是关键所在。一旦数据以所需形式准备就绪,在其上构建模型就变得非常简单。

为什么数据组装如此耗时?

数据组装通常涉及多个步骤,可以概括为ETL(提取、转换、加载)和数据整理。这个过程之所以耗时,是因为每一步都可能遇到挑战。

以下是数据组装通常包含的几个关键环节:

  • 寻找数据:找到相关数据是第一步,但这往往并不容易。
  • 提取数据:从数据源获取原始数据。
  • 转换数据:将数据转换成适合分析的格式。
  • 加载数据:将处理好的数据导入分析工具。
  • 数据整理:对数据进行清洗、合并、重塑等操作。

寻找数据

寻找相关数据的重要性再怎么强调也不为过。数据常常因安全、法规和商业秘密保护而难以获取。有时,人们甚至不清楚自己组织内部存在哪些数据集。即使知道,也可能因安全和隐私问题而无法访问。

许多公司现在设立了首席数据官(CDO)。他们的职责是提高组织信息生态系统的效率和价值创造能力,确保员工知道有哪些数据可用以及如何获取。

数据来源可分为内部数据和外部数据。例如,分析销售下降原因时,除了内部销售数据,可能还需要外部天气数据、人口普查数据等。

美国等国家的政府机构会向公众开放大量数据集,例如天气、金融、人口普查数据。你可以通过 www.data.gov 等网站浏览数千个数据集。

如果问题足够重要,你可能需要自行收集数据。方式包括创建调查问卷、编写网络爬虫抓取分散的数据,或开始测量之前未记录的信息。

提取、转换与加载(ETL)

找到数据集后,你需要从其存储位置提取数据,将其转换成符合需求的格式,然后加载到数据处理工具中。这个过程简称为ETL

这很重要,因为数据仓库以多种格式存储数据,并以其他格式返回给用户。通常,你需要将数据转换为表格格式以便进行可视化或分析。当然,也存在其他格式,例如图数据库格式。

最著名的数据仓库是关系型数据库,它将数据存储在多个表中。通常使用结构化查询语言(SQL) 来提取所需的数据子集,并以表格形式返回。这非常方便,因为数据已经是表格格式,可以直接使用。

以下是其他一些数据存储和提取方式:

  • 从网站收集:你需要收集HTML或XML数据,这些数据包含大量标签来标识不同数据片段,然后必须提取关键信息并将其转换为表格格式。
  • 通过API访问:有时数据存储在关系数据库中,但通过应用程序编程接口(API) 访问,其结构类似于网站而非SQL查询。数据通常以JavaScript对象表示法(JSON) 格式返回。这种格式是由花括号、冒号和逗号分隔的一系列嵌套列表。与HTML和XML数据一样,关键数据需要先转换为表格格式才能进行分析。

数据整理

数据转换为表格格式后,很可能还需要经历一个数据整理或数据清理过程。

这个过程包括清洗数据、将数据与其他数据合并、再次清洗、可能再次合并、再次清洗,然后改变其形状。

虽然你现在可能还不完全理解这个过程中的许多术语,但希望你能明白这不是一个简单的线性过程。在数据整理过程中,与数据组装相关的这些步骤经常需要迭代。你可能会发现找到的某些数据错误太多,从而决定需要寻找不同的数据集,然后重新开始整个过程。

其核心要点是:组装正确的数据非常重要,而且通常需要大量的工作。

总结

本节课中,我们一起学习了数据组装的核心步骤与挑战。我们了解到,数据组装(ETL与数据整理)是分析过程中最耗时的环节,涉及寻找、提取、转换、加载和反复清洗整理数据。确保数据的质量、相关性和正确格式,是为后续分析与建模打下坚实基础的关键

038:整洁数据框的特性 📊

在本节课中,我们将学习什么是“整洁”的数据框,以及它为何对商业分析至关重要。数据是商业分析的关键原料,但原始数据通常需要经过整理才能进行有效分析。我们将通过一个烹饪的类比,详细探讨整洁数据框的五个核心特性。

概述

数据是商业分析的核心要素。我们想要分析的数据,通常必须先进行整理。接下来,我们将延续烹饪的类比,来阐释“整洁数据框”的含义。

你是否注意过,在烹饪节目中,所有食材都被整齐地摆放、称量、放入碗中,或许还经过了切割。根据我的经验,创造一个整洁的烹饪环境所花费的时间,可能比实际混合食材进行烹饪的时间还要长。

我个人经验也表明,如果没有一个整洁的烹饪环境,很容易混淆食材。例如,我可能会把盐当成糖,或者在制作曲奇时把孜然当成肉桂,又或者把泡打粉当成小苏打。

整洁数据框的五要素

以下是构成一个整洁数据框的五个关键要素。

1. 行与列的结构

第一要素是:每一行代表一个观测值,每一列代表该观测值的一个特征。虽然这个概念很简单,但必须认识到,许多电子表格为了打印格式美观,常常违反这条规则。

有时,两个表格会并排出现在同一页上。如果数据属于同一个表格,那么它们需要上下堆叠在一起。如果数据不相关,则需要拆分成两个独立的表格。

2. 索引

第二要素是:每一行通常有一个被称为“索引”的标签。索引是唯一标识一个观测值的方式,其默认值通常是行号。

有时,索引是每个观测值的标签,例如时间戳或公司名称。有时,索引由数据中的多个列组成,例如时间戳和公司名称的组合,这被称为多重索引

3. 列名规范

第三要素是:列名应简短、具有描述性,且不包含空格或标点符号,并且是唯一的

当程序员无需处理空格和标点符号时,代码更易读,编写耗时也更少。如果名称简短,默认的图表标签也更容易阅读。

列名应遵循一致的命名规范。两种最常见的命名规范是驼峰式蛇形命名法

有时,数据框本身使用一种命名规范,而列名使用另一种,这样在阅读代码时更容易区分两者。

4. 明确标识缺失值

第四要素是:明确标识缺失值,这对于数值型数据尤其重要。缺失值和0之间存在巨大差异。

例如,考虑一下如果用零替换缺失值,平均值会受到怎样的影响。因此,你应该用 NA(或 None 等)来替换缺失的测量值,而不是用零或留空。

5. 列内一致性

第五要素是:列内数据模式的一致性。举个例子,假设我们有一个名为“客户姓名”的列,它指的是客户的名和姓。

一个整洁的数据框会使用相同的模式来记录所有客户姓名,例如都是“Ronald Geman”或都是“Geman Ronald”,或都是“R. Geman”,而不是混合使用不同的模式。这使得数据更易于阅读,并且在需要时更容易解析或拆分成两列。

一个整洁的数据框还要求列内每个观测值的数据类型相同

那么,什么是数据类型?数据类型指的是数据的编码方式,这与它的显示方式不同。例如,数字3的二进制版本是 0000011。字符“3”的二进制版本是 00110011

思考这个问题的一种方式是区分数字三单词“三”。如果你想输入数字三以便它能与其他数字相加,那么你不会用字母拼写出“THREE”,而是输入数字3。

总结

本节课中,我们一起学习了整洁数据框的五个核心特性。创建整洁的数据框就像创造一个整洁的烹饪环境。在整理数据框的过程中,你会在一定程度上了解数据的内容。一旦你整理好了数据框,就可以开始更深入地理解数据的实际内容了。

039:数据字典 📖

在本节课中,我们将要学习数据字典的概念、重要性以及如何创建一个有效的数据字典。数据字典是数据分析中确保数据理解一致性和准确性的关键工具。


概述

在数据分析中,我们经常会遇到使用缩写或含义不明确的列名。这就像在烹饪食谱中看到“TSP”和“TBSP”一样,如果不清楚其含义,就可能导致错误。为了避免这种混淆,并确保数据能被正确理解和使用,创建一份数据字典是至关重要的实践。

数据字典的重要性

上一节我们提到了数据中缩写可能带来的问题。本节中我们来看看为什么需要一个专门的工具来解决它。

在数据分析中,缩写经常被使用,但很容易被误解。在创建这些缩写的当下,其含义可能很清楚,但时间一长就容易忘记。即使不使用缩写,列名也可能不完整。例如,永远不应使用“时间”作为列名,因为它不清楚指的是秒、分钟、小时、天、周还是其他时间单位。

一个极佳的实践是创建所谓的“数据字典”。

数据字典的核心特征

一个理想的数据字典至少应具备以下两个核心特征。

以下是数据字典应包含的第一个特征:

  1. 数据的简要概述。该概述可以包括:
    • 数据来源的描述。
    • 如何访问数据。
    • 每一行数据代表什么。
    • 收集数据的目的。
    • 任何刷新数据可能需要的特殊信息,例如获取密码或身份验证令牌的位置。
    • 如果数据可供许多人使用,则可能需要包含如何引用数据的说明。

以下是数据字典应包含的第二个特征:

  1. 每个列名的详细列表。对于每一列,应提供:
    • 列名的完整描述,解释任何缩写的含义。
    • 数据的类型,例如:字符串数值型日期型等。
    • 数据示例。
    • 可能还需要一个“备注”列,用于指出数据的任何特殊之处。例如,在一些旧数据集中,可能用 9999 来表示缺失值,而不是 NA。这一点尤其重要,因为 9999 很容易被误当作一个有效的数值。

数据字典缺失的原因及常见形式

理解了数据字典应包含什么之后,我们来看看为什么有时会缺少它,以及它通常以何种形式出现。

数据字典容易被忽视,因为对创建者来说,在创建时其含义是显而易见的,并且人们可能更关注其他更紧迫的工作。数据集没有数据字典的其他原因包括:它最初并非为他人或未来的自己使用而设计。

当提供数据字典时,它们可以有不同的形式。

以下是数据字典常见的几种形式:

  • 一种常见形式是 readme.txt 文本文件。使用文本文件是因为它不需要任何特殊软件就能打开。
  • 如果数据集以电子表格形式提供,数据字典可能是同一电子表格中的一个独立工作表。
  • 在其他情况下,例如财务会计数据,由于定义需要标准化,存在拥有非常庞大数据字典的网站。众所周知,财务报告中的项目有特定含义,对这些项目的解释在财务报表的附注中描述。从这个意义上说,财务报表附注也可以被视为数据字典,但它们通常比数据分析所需的内容要冗长得多。
  • XBRL(可扩展商业报告语言)有一个分类标准,本质上就是一个数据字典,它提供标签、文档和大量其他信息。你不需要担心这种复杂的数据字典,这里只是指出它的存在。

实例解析:NOAA气象数据

政府机构通常在提供数据字典方面做得很好。这里有一个来自美国商务部国家海洋和大气管理局(NOAA)数据集的气象数据 readme.txt 文件示例。

这个数据字典更接近你应该创建的类型,但它甚至比你最常需要的更复杂。以下是一些需要注意的事项:

  1. 它展示了如何引用数据。
  2. 接着展示了如何下载数据的说明。
  3. 在第3部分,它展示了文件的格式。请注意,它说明了每个文件包含一个气象站一个月的数据。
  4. 然后,它继续讨论每个变量或数据列的定义。重要的是,它显示了五个核心元素的数值是测量值,并展示了测量单位,例如降水是十分之一毫米,而雪深是毫米,最高和最低温度是十分之一摄氏度
  5. 第四个特点是,它为感兴趣的人提供了一堆其他信息。

总结

总而言之,数据字典对于跟踪数据集中包含哪些信息至关重要。在本节课中,我们一起学习了数据字典的作用、其应包含的核心特征(数据概述和列定义)、常见的呈现形式,并通过一个实际例子加深了理解。创建和维护数据字典是一个值得投入时间的好习惯,它能确保你和你的团队始终能准确理解和使用数据,避免因误解而导致的分析错误。

040:整洁数据集的特征 📊

在本节课中,我们将学习整洁数据集的核心特征。整洁的数据集易于处理和分析,是进行有效商业分析的基础。我们将通过对比两个数据集,来理解这些特征的重要性。


概述

整洁的数据集具有六个关键特征。理解这些特征有助于我们高效地使用Python等工具进行数据分析。本节我们将逐一探讨这些特征,并通过实例加深理解。


特征一:拥有数据字典 📖

整洁的数据集应附带一个数据字典。数据字典解释了数据集中每一列的含义,帮助我们理解数据的背景和内容。

例如,我们有一个薪资数据集。仅看列标题,我们可能推断这是关于人们收入的调查结果。

但更准确的信息通常来自数据存储的源头。这个特定的数据集来自一篇包含调查的文章。文章里列出了问题,例如“你多大了?”、“你在哪个行业工作?”、“你的职位是什么?”、“你的年薪是多少?”等。

这虽然不是正式的数据字典,但它提供了理解数据的上下文。数据字典的一个关键作用是明确数据集的每一行代表什么。既然我们知道数据来自调查,就可以确定每一行代表一个人对所有问题的回答。


特征二:行是观测,列是特征 📐

整洁数据集的第二个特征是:每一行是一个观测,每一列是该观测的一个特征或属性

换句话说,观测(例如,一位受访者)应放在行中,而他们的各种特征(如年龄、行业)应放在列中。


在我们的薪资数据集中,每一行代表一位受访者,每一列代表一个特征(如年龄、行业、薪资)。


特征三:行和列具有唯一名称 🔑

整洁数据集的第三个特征是:行和列的名称必须是唯一的

当我们用Pandas将数据集读入Python并创建DataFrame时,Pandas会自动为行分配数字索引(如0, 1, 2...)。


重要的是,每个行索引都应该是唯一的,不应出现两个相同的索引。同样,每一列的名称也应该是唯一的,不应有重复的列名。


特征四:简洁且一致的列名 ✏️

整洁数据集的第四个特征是:列名应简洁且一致

原始数据集的列名可能很长,例如“What is your annual salary? (In USD)”。在代码中引用这样的长列名很不方便。


我们可以清理这些列名,使其更简洁。清理后,列名变为 time, age, industry, job_title, annual_salary 等。

关于一致性,我们移除了所有标点符号和空格,只使用下划线 _ 来连接单词,并且全部使用小写。这种命名约定被称为 蛇形命名法

公式/代码示例:蛇形命名法

# 原始列名
"What is your annual salary? (In USD)"

# 整洁的列名(蛇形命名法)
annual_salary_usd






特征五:列具有一致的数据类型和模式 🔢

整洁数据集的第五个特征是:每一列应具有一致的数据类型和记录模式

列中的每个值应该是同一种类型,例如全是文本、数字、日期时间等,并且格式应该统一。

  • 时间列:所有时间戳应以相同格式记录(如年-月-日 时:分:秒.毫秒)。



  • 年龄列:所有值应是年龄范围或具体年龄,保持一致。
  • 数据类型:在Pandas中,日期时间、数字和字符串(在Pandas中称为object类型)应区分清楚。



特征六:缺失值应明确标识 ❓

整洁数据集的第六个特征是:缺失值应有明确的标识,不应留空

Pandas会自动将空白或无法解析的值标记为 NaN(Not a Number),代表缺失值。


NaN 表示该值未被记录、受访者未回答,或在数据清理过程中因故无法处理而被标记为缺失。


实例分析:公共部门债务数据集

上一节我们介绍了整洁数据的六个特征,并用薪资数据集进行了说明。本节我们来看另一个数据集——公共部门债务数据,并评估其整洁程度。

首先预览这个数据集,它包含国家名称、国家代码、系列名称、系列代码以及多年多季度的数据列。

该数据来自世界银行网站,拥有详细的数据字典和元数据,解释了每个数据系列(如“对外债权人的债务占GDP百分比”)的含义,这满足了特征一


关于特征二(行是观测),这个数据集的一行代表一个国家一种债务测量方式(如对外债权人债务)在多个时间段的数值。因此,一行包含了多个观测值。我们可以通过重塑数据,使其更整洁:将时间段(如“1995-Q1”)和对应的值分别放入单独的列中,这样每一行就只代表一个观测(一个国家在某个特定时间点的特定债务值)。

关于特征三,该数据集的行和列名称是唯一的。

关于特征四(简洁一致的列名),原始列名包含空格和括号。我们可以将其清理为更简洁的格式,例如使用驼峰命名法

公式/代码示例:驼峰命名法

# 原始列名
"Country Name"

# 整洁的列名(驼峰命名法)
countryName


关于特征五(一致的数据类型),该数据集在国别代码、国家名称等方面记录一致。相比之下,之前的薪资数据集中,“国家”列出现了“USA”、“United States”、“U.S.A”等多种不一致的写法,显得不够整洁。

关于特征六(缺失值标识),该数据集最初用“..”标识缺失值,在转换为数值类型后,Pandas将其正确转换为了NaN








总结

本节课我们一起学习了整洁数据集的六个核心特征:

  1. 拥有数据字典 📖:提供数据背景。
  2. 行是观测,列是特征 📐:结构清晰。
  3. 行和列具有唯一名称 🔑:避免歧义。
  4. 简洁且一致的列名 ✏️:便于引用,常使用蛇形命名法(snake_case)或驼峰命名法(camelCase)。
  5. 列具有一致的数据类型和模式 🔢:保证数据质量。
  6. 缺失值应明确标识 ❓:通常用NaN表示。

我们通过薪资数据和公共部门债务数据两个例子,对比评估了它们的整洁程度。理解这些特征非常重要,随着你在Python中实际操作数据,你会更深刻地体会到它们带来的便利。在后续课程中,我们将学习如何将不整洁的数据转换为整洁的格式。

041:使用筛选器探索数据框 📊

在本节课中,我们将学习如何使用Pandas库来探索和提取数据框的子集。这对于了解数据内容以及后续的数据处理和操作至关重要。

概述

我们将介绍几种查看和筛选Pandas数据框的方法,包括使用headtailsample方法,以及方括号[]、点号.lociloc操作符。这些技巧能帮助你快速浏览数据,并提取出你感兴趣的部分。


读取与准备数据

首先,我们需要将数据导入Python环境。我们将使用Jupyter Lab进行演示,以便你能直观地看到操作过程。

以下是读取数据的步骤:

  1. 导入Pandas库。
  2. 使用read_pickle函数读取一个压缩的薪资调查数据文件。
import pandas as pd
sd = pd.read_pickle('salary_survey21.xz')

运行代码后,我们可以使用%whos这个“魔法命令”来确认数据已成功加载,并查看其维度(28135行,18列)。


初步查看数据

在数据加载后,我们通常希望先直观地查看一下数据的内容和结构。

以下是几种快速查看数据的方法:

  • head()方法:查看数据框的前5行。
    sd.head()
    
  • tail()方法:查看数据框的最后5行。
    sd.tail()
    
  • sample()方法:随机抽取指定数量的行。例如,抽取5行。
    sd.sample(5)
    

这些方法能让你对数据的整体样貌有一个快速的了解。


使用方括号 [] 筛选

如果我们想查看特定的行和列,甚至重新排列列的顺序,可以使用方括号[]进行筛选。

例如,我们想查看第10到20行(注意:结束索引21不包含在内),并且只查看job_titlejob_contextannual_salaryindustry这几列,同时调整它们的显示顺序。

sd[10:21][['job_title', 'job_context', 'annual_salary', 'industry']]

更重要的是,我们可以将筛选后的结果保存为一个新的数据框,以便后续分析。

sd_b = sd[10:21][['job_title', 'job_context', 'annual_salary', 'industry']]

运行%whos命令,可以看到我们创建了一个名为sd_b的新数据框,它只有11行和4列。


使用点号 . 访问列

当我们需要访问单个列时,使用点号.表示法非常方便。

例如,如果我们只想获取industry列的第10到20行数据,可以这样做:

sd.industry[10:21]

这种方法简洁明了,特别适用于提取单列数据。


使用 loc 操作符筛选

loc操作符主要用于通过行标签和列名进行筛选。它非常灵活,可以处理非连续的行和列。

假设我们想查看第4、5、7行,以及从industryannual_salary的所有连续列。

sd.loc[[4, 5, 7], 'industry':'annual_salary']

注意,当使用列名和冒号:指定范围时,loc会包含起始和结束的列。


使用 iloc 操作符筛选

iloc操作符与loc类似,但它是基于行和列的整数位置(索引)进行筛选的,索引从0开始。

假设我们想通过索引位置查看相同的行(第4、5、7行)和列(第2到5列,对应industryannual_salary)。

sd.iloc[[4, 5, 7], 2:6]

请注意,当使用iloc和整数切片时,遵循“左闭右开”原则,即包含起始索引2,但不包含结束索引6。


总结

本节课我们一起学习了五种在Pandas中探索和筛选数据框的方法:

  1. head(), tail(), sample():用于快速浏览数据。
  2. 方括号 []:通过行切片和列名列表来筛选行和列,并可调整列顺序。
  3. 点号 .:方便地访问单个列。
  4. loc操作符:通过行/列标签名进行灵活筛选,切片包含两端。
  5. iloc操作符:通过行/列的整数索引位置进行筛选,切片遵循“左闭右开”。

掌握这些基础筛选技巧是进行数据探索的第一步。在后续课程中,我们将学习如何使用条件语句来提取满足特定条件的行和列,从而进行更深入的数据分析。

042:使用条件语句探索数据框

在本节课中,我们将学习如何基于条件语句筛选Pandas数据框。这是数据清洗和探索性分析中的核心技能,能帮助你聚焦于满足特定条件的行数据,从而简化分析过程。

我们将从读取数据开始,然后介绍六种不同的条件筛选方法。

读取数据

首先,我们需要将数据读入Python环境。我们将使用Jupyter Lab,并逐步编写代码,以便初学者能跟上操作。

第一步是导入必要的库并读取数据文件。我们使用的数据是薪资调查数据,存储为.pkl格式(pickle文件),这种格式能高效地压缩和存储数据及其类型。

import pandas as pd

# 读取pickle文件
df = pd.read_pickle(‘salary_survey_data.pkl.xz’)

# 显示前5行数据
df.head()

运行上述代码后,我们可以快速浏览数据的结构和内容。接下来,我们将重点学习如何根据annual salary(年薪)和industry(行业)等列的条件来筛选数据。

单数值条件筛选

上一节我们读取了数据,本节中我们来看看如何根据单一数值条件进行筛选。例如,我们想找出年薪超过100万的所有行。

以下是使用方括号[]进行筛选的基本方法:

# 方法1:使用方括号和列名
df[df[‘annual salary’] > 1000000]

为了更清晰地表示大数字,我们可以使用科学计数法1e6来代替1000000

# 方法2:使用科学计数法
df[df[‘annual salary’] > 1e6]

除了方括号,我们还可以使用.loc索引器达到同样的效果。.loc允许我们同时指定行和列的条件。

# 方法3:使用 .loc 索引器
df.loc[df[‘annual salary’] > 1e6, :]

以上两种方法都能筛选出年薪超过100万的76行数据。

单文本条件筛选

接下来,我们看看如何根据文本条件进行筛选。例如,我们想筛选出行业为“艺术与设计”(Art and Design)的所有观测值。

使用方括号和双等号==进行判断:

# 筛选行业等于“艺术与设计”的行
df[df[‘industry’] == ‘Art and Design’]

运行代码后,我们看到有359行数据满足条件。如果想筛选出行业不是“艺术与设计”的行,可以使用不等号!=

# 筛选行业不等于“艺术与设计”的行
df[df[‘industry’] != ‘Art and Design’]

同样,.loc索引器也适用于文本条件筛选,并且可以指定只输出某些列。

# 使用 .loc 并指定输出列
df.loc[df[‘industry’] == ‘Art and Design’, [‘industry’, ‘job title’]]

多条件组合筛选

在实际分析中,我们经常需要组合多个条件。例如,我们想找出年薪超过100万并且行业是“艺术与设计”的行。

这需要使用逻辑运算符&(与)来连接条件,并且每个条件必须用括号()括起来。

# 使用“与”条件(&)
df[(df[‘annual salary’] > 1e6) & (df[‘industry’] == ‘Art and Design’)]

运行后,我们只得到一行数据,即一位年薪远超100万的艺术设计公司CEO。

如果我们想找出年薪超过100万或者行业是“艺术与设计”的行,则需要使用逻辑运算符|(或)。

# 使用“或”条件(|)
df[(df[‘annual salary’] > 1e6) | (df[‘industry’] == ‘Art and Design’)]

这次我们得到了434行数据,它们要么年薪超过100万,要么属于艺术设计行业。

使用 .isin() 方法筛选

当我们需要检查某一列的值是否属于一个给定的列表时,重复使用|运算符会很繁琐。这时,.isin()方法就非常方便。

例如,我们想筛选出行业属于“艺术与设计”或“医疗保健”的行。

# 使用 .isin() 方法
df[df[‘industry’].isin([‘Art and Design’, ‘Health Care’])]

我们也可以先将列表存储在一个变量中,然后在.isin()方法中引用这个变量,使代码更清晰。

# 将列表存储在变量中
my_industries = [‘Art and Design’, ‘Health Care’]
df[df[‘industry’].isin(my_industries)]

使用 .query() 方法筛选(推荐)

在介绍了多种基础方法后,本节我们来看一个更简洁、易读的筛选方法:.query()。这是我最推荐的方式。

它的语法更接近自然语言,无需重复输入数据框名称。

# 使用 .query() 进行单条件筛选
df.query(“industry == ‘Art and Design’”)

对于多条件筛选,.query()同样简洁明了。

# 使用 .query() 进行“与”条件筛选
df.query(“industry == ‘Art and Design’ and `annual salary` > 1e6”)

注意,如果列名包含空格,需要用反引号 ` 括起来。

如果想使用之前定义的变量列表,需要在变量前加@符号。

# 在 .query() 中引用外部变量
df.query(“industry in @my_industries and `annual salary` > 1e6”)

筛选后排序数据

最后,我们经常需要在筛选后对结果进行排序。Pandas的.sort_values()方法可以轻松实现这一点,并且我们可以将它与.query()等方法链式调用。

例如,将筛选后的结果按年薪降序排列:

# 链式调用:筛选后按年薪降序排序
df.query(“`annual salary` > 1e6”).sort_values(by=‘annual salary’, ascending=False)

.sort_values()方法默认是升序(ascending=True)。通过设置ascending=False,我们可以得到降序排列的结果,便于查看最高薪资。

总结

本节课中,我们一起学习了在Pandas中使用条件语句筛选数据框的六种核心方法:

  1. 单数值条件筛选:使用比较运算符(如 >==)。
  2. 单文本条件筛选:使用 ==!=
  3. 多条件组合筛选:使用逻辑运算符 &(与)和 |(或),并用括号分隔每个条件。
  4. .isin()方法:高效检查值是否属于某个列表。
  5. .query()方法:语法简洁,推荐使用。
  6. .sort_values()方法:对筛选结果进行排序。

这些技能对于将分析聚焦于与目标相关的数据子集至关重要。记住,.query()方法因其可读性高而成为许多数据分析师的首选。熟练掌握这些筛选技巧,将极大提升你探索和理解数据的效率。

043:汇总统计 📊

在本节课中,我们将学习如何通过汇总统计来理解数据的基本构成。我们将探讨几种关键的统计量,包括均值、标准差和分位数,并学习如何通过直方图和箱线图来可视化数据的分布。这些工具能帮助我们快速评估数据的价值,并判断其是否适用于特定的商业决策。

整洁的数据框架

拥有一个整洁的数据框架,就像拥有一个干净、有序的烹饪环境。这为后续分析奠定了良好基础。

理解数据的构成

理解数据的构成同样重要。例如,糖有很多种类。制作“Snickerdoodle”饼干时,使用正确类型的糖至关重要。

  • 制作“Snickerdoodle”饼干通常使用普通白砂糖
  • 与普通糖相比,粗粒糖的颗粒更粗、更硬,大小和形状差异更大。
  • 与普通糖和粗粒糖都不同,红糖颜色更深,质地更粘。

数据也存在大量变异。这种变异通常很有用。理解变异有助于判断数据是否对特定商业决策有价值,从而评估其在商业决策中的用途。

一个示例

让我们通过一个例子来理解。这里有一个虚构的在线商店销售数据,包含两种不同产品的购买记录。

快速目视检查这个名为 sales_data 的数据框架,可以发现这是一个整洁的数据集。数据有两列:第一列记录产品1的美元销售额,第二列记录产品2的美元销售额。每种产品各有100笔交易记录。

这种快速目视检查有助于对数据形成初步印象。看起来,产品2的极端值数量比产品1更多。然而,即使只有100个观测值,这种方法也非常耗时且效率低下。

因此,我们通常使用汇总统计和可视化来评估数据的价值并寻找规律。

汇总统计

汇总统计也称为描述性统计。它们将数据每一列的不同特征简化为数字,用以描述数据的形态。

均值

或许最著名、最常用的、用于描述数据集中位置的汇总统计量是均值平均值。这也被称为集中趋势的度量

你可能熟悉如何计算平均值。通俗地说,平均值是将所有观测值相加,然后除以观测值数量得到的结果。

当你想将一个总数分成若干大小相同的部分时,这个统计量尤其有用。

对于两个产品的购买数据集,产品1的平均购买金额是199美元,产品2是202美元。它们的集中趋势相似,但这只是数据的一个特征。

标准差

另一个常用的汇总统计量是标准差,它描述了观测值围绕均值的分散或分布程度。从概念上讲,你可以将标准差视为每个数据点到均值的平均距离。

较高的标准差表明,相对于较低的标准差,数据平均而言在均值周围更分散。

对于两种产品的销售额,产品1的平均美元花费标准差是11,产品2是59。因此,尽管两种产品的平均销售额大致相同,但我们可以预期产品1的美元花费变异比产品2小。

可视化数据分布

让我们看看每种产品的直方图,以验证这一点。

以下是直方图,我们先讨论这些直方图是如何创建的。

直方图的X轴代表销售额可以取的值。在本例中,它被划分为宽度为5的区间,例如1到5,6到10,11到15,依此类推。Y轴代表落入每个区间的观测值数量。

让我们看看产品2最低的那个条形。它看起来是第二个区间(10到15),高度为2。如果我们核对数据,可以确认确实有两个值为10的观测值落在这个范围内。

比较这些直方图可以看出,产品2的区间在X轴上比产品1分布得更开。这证实了比较标准差得出的结论:产品2的观测值确实比产品1存在更多的变异。

这些直方图很好,因为它们能快速传达数据围绕均值分布的细微差别。例如,这些直方图显示,产品1的美元花费分布比产品2对称得多。具体来说,对于产品2,大量观测值紧密地聚集在240左右,而另一批观测值则散布在这个聚集点以下,包括两个远低于所有其他观测值的点。

虽然直方图有助于传达这些关系,但用语言描述它们却很困难。因此,还有另一组基于分位数的汇总统计量。

分位数

分位数是将数据按大小分组后形成的等份。分位数的形成过程是:将数据从小到大排序,形成大小相等的区间,然后报告每个区间起点的值。

  • 将排序后的数据分成100个等份,形成百分位数
  • 将数据分成10个等份,形成十分位数
  • 将数据分成4个等份,形成四分位数

报告分位数值时,通常也会报告最小值。为了更具体,让我们看看每种产品美元花费的最小值和四分位数值。

最小值与四分位数

对于产品1,最小值是178美元。相比之下,产品2的最小值是10美元,要小得多。这些最小值本身就能告诉我们很多信息,但当我们结合第一四分位数的值来评估它们时,信息量会更大。

对于产品1,第一四分位数值是191美元,比最小值178美元高出13美元。相比之下,对于产品2,第一四分位数值是183美元,比最小值10美元高出173美元,因此其范围比产品1大得多。这告诉我们数据在分布低端的分散程度。

第二四分位数值,产品1是198美元,产品2是231美元。因此,有50%的数据落在这点或低于这点,同时也有50%的数据落在这点或高于这点。

由于产品2的第二四分位数值大于产品1,而产品2的第一四分位数值又低于产品1,我们应再次预期产品2在第二四分位数内的观测值比产品1有更多的变异。

中位数

让我们稍作停顿,多谈谈第二四分位数。因为第二四分位数将数据一分为二,它有一个特殊的名称:中位数。中位数是衡量集中趋势时,均值的另一种选择。

中位数相对于均值的一个优势是,它不会受到极大或极小值的影响。这意味着当均值等于或接近中位数时(如产品1),数据很可能对称。另一方面,当均值小于中位数时(如产品2),则表明可能存在一些极小的值将均值拉低到中位数以下,或者低端有更大比例的观测值,或者两者兼有。反之,当均值大于中位数时,则可能存在一些极大的值将均值拉高到中位数以上,或者高端有更大比例的观测值。

第三四分位数值,产品1是205美元,产品2是241美元。正如你可能猜到的,这表示有75%的观测值落在这点或低于这点,25%的观测值落在这点或高于这点。产品1的第三四分位数范围比产品2略窄。同时,产品2的范围处于更高的美元花费水平。

最后,产品1的第四四分位数值225美元和产品2的267美元表明,100%的观测值落在这点或低于这点。这些值也称为最大值,或简称为最大值

鉴于产品2的第三四分位数和最大值都大于产品1,我们应预期产品2在第四四分位数内的所有观测值都大于产品1。同样,产品2在第四四分位数内的值也更分散。

箱线图

希望这些四分位数值在直觉上是合理的。然而,我也意识到要比较的信息量很大。因此,另一种类型的图表常被用来直观地传达这些四分位数值以及它们之间的范围。这些图表被称为箱须图,但通常简称为箱线图

让我们看看产品1的箱线图,以及叠加了所有四分位数值的产品1直方图。

请注意,箱体部分从第一四分位数值开始,到第三四分位数值结束。这被称为四分位距。中位数由穿过中间的那条线表示。左侧的须线延伸到最小值,而右侧的须线延伸到最大值。因此,箱线图简洁地传达了四分位数值以及这些值之间的距离。你可以很容易地看到第二和第三四分位数的大小大致相同。相比之下,第一和第四四分位数值则更大。

现在让我们看看产品2的箱须图,以及叠加了所有四分位数值的产品2直方图。如你所知,产品2的分布并不对称。具体来说,第一四分位数的范围非常大,这由左侧的长须线或线条说明。

现在,你可能还注意到一些“胡茬”或点。须线的最大长度通常是四分位距的1.5倍。因此,任何“胡茬”都表示那些距离数据主体部分极远的观测值,可被称为异常值

就像比较前两种产品的直方图一样,比较它们的箱须图可以清楚地看出,产品2的分布比产品1更分散且更不对称。

箱须图的相对优势在于,它们能快速传达四分位数值、范围以及异常值。箱须图的主要缺点是,它们比直方图需要稍多的技术理解,并且显示的细节较少。

总结

本节课中,我们一起学习了如何利用汇总统计来理解和描述数据。我们介绍了均值、标准差、分位数(特别是四分位数和中位数)等核心概念,并探讨了如何通过直方图和箱线图来可视化数据的分布和变异。这些工具能帮助我们快速评估数据的集中趋势、离散程度和整体形态,从而判断数据是否适合用于特定的商业分析。虽然这不是关于汇总统计的全面课程,但这些知识足以帮助你充分描述一列数据,以判断其在你分析中的可用性。

044:使用汇总统计量探索数据 📊

在本节课中,我们将学习如何使用汇总统计量(也称为描述性统计量)来探索Pandas数据框。我们将学习如何计算数值列和分类列的统计量,以及如何利用这些统计量快速了解数据集的整体情况。

上一节我们介绍了数据框的基本操作,本节中我们来看看如何使用汇总统计量来概括数据。

汇总统计量使用单个数字(如平均值、中位数、最小值等)来总结数据框列中的信息。这些统计量非常有用,有时是数据分析中的关键计算,但更多时候它们被用来初步了解数据的分布和特征。

我将切换到Jupyter Lab的Python环境中,读取数据并演示如何计算汇总统计量。


首先,我们需要导入必要的库并读取数据。

# 导入pandas库
import pandas as pd

# 读取数据文件
df = pd.read_pickle('Salary_survey_21.xz')

# 查看数据的前5行
df.head()

运行上述代码后,我们获得了薪资调查数据。接下来,我们将使用Pandas内置的汇总统计方法来探索这些数据。


使用describe方法

Pandas的describe方法可以快速生成数据框的汇总统计信息。让我们先对数据框应用此方法。

# 对数据框使用describe方法
df.describe()

执行后,结果会显示三列数据:timeannual salarybonuses。这是因为describe方法默认只处理数值型和日期时间型列。

以下是输出的统计信息:

  • count:非缺失值的观测数量。
  • mean:平均值。
  • std:标准差,衡量数据的离散程度。
  • min:最小值。
  • 25%:第一四分位数(25th percentile)。
  • 50%:中位数(50th percentile)。
  • 75%:第三四分位数(75th percentile)。
  • max:最大值。

例如,从bonuses列的count小于总行数可以看出,该列存在缺失值。


探索非数值型列

describe方法默认排除对象(字符串)类型的列。要查看这些分类列的统计信息,我们需要使用include参数。

# 对对象类型的列使用describe方法
df.describe(include='object')

对于分类列,describe方法提供以下信息:

  • count:非缺失值数量。
  • unique:唯一值的数量。
  • top:出现频率最高的值(众数)。
  • freq:最高频值出现的次数。

例如,在age列中,有7个不同的年龄组,其中“25 to 34”类别出现次数最多,共12679次。

如果你想一次性查看所有列的统计信息,可以使用include='all'

# 显示所有列的汇总统计信息
df.describe(include='all')

计算单个统计量(数值列)

有时我们只需要某个特定的统计量。Pandas为数据框提供了直接计算单个统计量的方法。

以下是计算annual salary列不同统计量的方法:

# 计算平均值
df['annual salary'].mean()

# 计算中位数
df['annual salary'].median()

# 计算最小值
df['annual salary'].min()

要计算百分位数,可以使用quantile方法。

# 计算第75百分位数
df['annual salary'].quantile(0.75)

# 计算多个百分位数(如第25和第75百分位数)
df['annual salary'].quantile([0.25, 0.75])

# 计算更极端的百分位数
df['annual salary'].quantile([0.01, 0.99])

为了生成一系列等间隔的百分位数,我们可以借助NumPy库的arange函数。

# 导入NumPy库
import numpy as np

![](https://github.com/OpenDocCN/dsai-notes-pt2-zh/raw/master/docs/uiuc-biz-anls/img/608d929cefd11da01657c621a57bc451_19.png)

# 生成从0到1,步长为0.1的序列(不包含终点1)
np.arange(0, 1, 0.1)

![](https://github.com/OpenDocCN/dsai-notes-pt2-zh/raw/master/docs/uiuc-biz-anls/img/608d929cefd11da01657c621a57bc451_21.png)

# 计算从10%到100%的十分位数
percentiles = np.arange(0.1, 1.1, 0.1)  # 注意终点设为1.1以包含1.0
df['annual salary'].quantile(percentiles)

计算单个统计量(分类列)

对于分类数据,常用的统计量包括唯一值数量、唯一值列表以及值计数。

以下是相关操作:

# 计算‘industry’列的唯一值数量
df['industry'].nunique()

# 查看‘industry’列的所有唯一值(默认显示前后各几个,中间用...省略)
df['industry'].unique()

# 将唯一值以列表形式完整显示
df['industry'].unique().tolist()

在Jupyter Lab中,如果输出结果很长,可以点击输出区域左侧的灰色条将其折叠,以便于滚动查看其他代码。

最常用的分类列统计方法是value_counts,它可以计算每个值出现的次数并按降序排列。

# 计算‘industry’列各值的出现频率
df['industry'].value_counts()

结果显示,“Computing or Tech”行业出现次数最多(4717次),其次是“Education, Higher Education”(2468次),还有一些行业仅出现一次。


本节课中我们一起学习了如何使用Pandas计算汇总统计量来探索数据。我们介绍了:

  1. 使用describe方法快速获取数据概览。
  2. 分别针对数值列和分类列计算单个统计量,如均值、中位数、百分位数、唯一值计数和频数分布。
  3. 利用value_counts方法分析分类数据的分布情况。

正如所见,仅使用Pandas模块就能轻松计算描述性统计量(NumPy模块也提供了更多相关函数)。这些统计量极其有用,有时本身就是核心分析结果,但更多时候它们会引发出更深层的问题,主要用于数据探索。当将这些统计量与探索性可视化结合使用时,能帮助你更好地理解数据的内涵。

045:使用可视化探索数据框 📊

在本节课中,我们将学习如何使用 Pandas 的 plot 方法快速创建探索性数据可视化图表。探索性可视化旨在帮助我们快速理解数据分布和关系,而无需过多修饰图表细节。

数据可视化通常分为两类:探索性和解释性。探索性可视化是为了快速探索数据而创建的,通常不精修坐标轴、标签或标题等细节。解释性可视化则用于向他人总结和传达关键发现,因此会精心设计字体、配色和标题等元素。本节课我们将专注于探索性可视化。

导入数据与准备工作

首先,我们需要导入必要的库并加载数据。以下是具体步骤。

import pandas as pd

![](https://github.com/OpenDocCN/dsai-notes-pt2-zh/raw/master/docs/uiuc-biz-anls/img/281ad111663c5d8e424ed29677e30c14_21.png)

# 读取数据
df = pd.read_pickle('salary_sur_21.xz')
# 查看前五行数据
df.head()

以上代码导入了 Pandas 库,读取了一个名为 salary_sur_21.xz 的 pickle 文件(这是一个关于薪资的调查数据),并将其存储在 DataFrame df 中。使用 head() 方法可以快速查看数据的前几行,了解数据结构,例如包含“年薪”、“年龄范围”、“行业”等列。

数值型数据的单变量分析 📈

上一节我们导入了数据,本节中我们来看看如何为数值型列创建单变量图表。我们将重点关注“年薪”这一列。

创建图表的核心是使用 DataFrame 的 plot 方法。例如,df[‘annual_salary’].plot.hist() 可以生成直方图。

以下是几种常用的单变量图表及其创建方法:

  • 直方图:用于展示数值数据的分布情况,显示观测值落入特定区间的次数。
    # 基础直方图
    df['annual_salary'].plot.hist()
    # 过滤异常值并增加箱数
    df.query('annual_salary < 1e6')['annual_salary'].plot.hist(bins=50, title='Histogram of Annual Salary')
    
  • 密度图:是直方图的平滑版本,能更清晰地显示数据分布的形状。
    df.query('annual_salary < 1e6')['annual_salary'].plot.density()
    
  • 箱线图:展示数据的五数概括(最小值、第一四分位数、中位数、第三四分位数、最大值)和异常值。
    # 整体数据的箱线图
    df['annual_salary'].plot.box()
    # 按年龄组分组的箱线图,便于比较
    df.boxplot(column='annual_salary', by='age_range')
    

分类型数据的可视化 📊

了解完数值型数据,我们转向分类型数据,例如“年龄范围”和“行业”。对于这类数据,我们通常关心每个类别出现的频率。

创建分类数据图表前,常使用 value_counts() 方法进行汇总。以下是几种可视化方法:

  • 垂直条形图:直观比较各类别的计数。
    df['age_range'].value_counts().plot.bar()
    
  • 水平条形图:当类别名称较长时,水平条形图能提供更好的标签显示空间。
    df['industry'].value_counts().head(7).plot.barh()
    
  • 饼图:展示各类别在总体中所占的比例。
    df['industry'].value_counts().head(5).plot.pie()
    

时间序列与关系分析 🔗

最后,我们看看如何分析数据随时间的变化趋势以及两个数值变量之间的关系。

  • 折线图与面积图:用于展示数据随时间变化的趋势。
    # 折线图
    df.query('annual_salary < 1e6').plot.line(x='timestamp', y='annual_salary')
    # 面积图
    df.query('annual_salary < 1e6').plot.area(x='timestamp', y='annual_salary')
    
  • 散点图与六边形分箱图:用于探索两个数值变量之间的关联。当数据点过多重叠时,六边形分箱图是更好的选择。
    # 散点图
    df.query('annual_salary < 1e6').plot.scatter(x='annual_salary', y='bonus')
    # 六边形分箱图
    df.query('annual_salary < 2e5').plot.hexbin(x='annual_salary', y='bonus', gridsize=20)
    

总结

本节课中,我们一起学习了使用 Pandas 快速生成探索性数据可视化的多种方法。我们涵盖了针对数值型数据的直方图、密度图和箱线图;针对分类型数据的条形图和饼图;以及用于分析趋势和关系的折线图、散点图和六边形分箱图。掌握这些快速可视化的技能,是理解数据、发现模式、指导后续深入分析的关键步骤。虽然还有其他专门的绘图库(如 Matplotlib, Seaborn)可以创建更精美的解释性图表,但 Pandas 内置的 plot 方法为数据探索提供了一个极其高效和便捷的起点。

046:结论与总结 🎯

在本模块中,我们围绕两个核心问题展开学习:如何了解你的数据,以及如何将数据的基本计算结果分享给他人。现在,让我们一起来总结本模块所学到的关键概念。

了解你的数据 📊

上一节我们介绍了数据分析的起点,本节中我们来看看如何系统地认识你的数据。

从商业角度看,理解数据的基本属性至关重要。具体而言,数据可以是一项资产,即使你无法在资产负债表上量化它。在提取价值之前,通常需要对数据进行整理。

一个数据字典是拥有整洁数据框的重要组成部分。除了数据字典,浏览数据也很有帮助。你可以在RStudio中以类似于Excel的方式浏览数据,以感受数据的行数、列数以及数据记录方式。

拥有整洁的数据框,就像拥有一个整洁的烹饪环境:你知道食材的位置或如何找到它们,并且食材本身也处于可用于烹饪的状态。如果你对食材的基本情况不了解,那么你需要确保它们对你试图烹饪的菜肴有用。

探索与分享数据 📈

在商业分析中,一旦你拥有了整洁的数据框,探索数据列的基本细节将有助于你判断这些数据对于解决当前商业决策问题的有用程度。

以下是两种关键的探索与沟通方式:

  • 汇总统计与可视化:它们有助于传达数据的集中趋势(如均值、中位数)和离散程度(如标准差、极差)。
  • 协作与报告工具:商业决策通常由团队共同做出,因此考虑如何向他人传达汇总统计及高级分析的结果非常重要。

以下是几种实用的工具:

  1. 脚本文件:适用于创建代码,特别是当你希望代码能自动运行时。
  2. 笔记本和仪表板:它们允许你将数据分析代码、文本格式和可视化内容组合到单个文件中,非常实用。
  3. Markdown:这是在笔记本文件中格式化文本的方式。
  4. 文档编织:笔记本的另一个巨大优势是,你可以将其“编织”成各种格式,包括PDF文档、HTML文件和网页。

总结 📝

本节课中我们一起学习了商业数据分析的初步流程。希望你有机会练习使用数据分析语言来:(全)了解你的数据;(二)与他人分享你的发现。这不仅能帮助你牢记这些原则,更能为你未来想要获取更多数据分析技能时,奠定一个可以持续构建的基础。

047:数据清洗与预处理介绍

在本节课中,我们将要学习数据清洗与预处理的重要性。这是数据分析流程中至关重要的一步,它确保了后续分析和决策的可靠性。

我非常喜欢山地自行车运动。

我如此喜欢它的部分原因,在于骑行时能沉浸于美丽的风景之中。

骑行时,我常想,有人开辟了这些骑行小径,这多么美好。

根据我的亲身经验,如果没有人开辟小径,我可能就无法骑车穿越山岭。

那么,我对山地骑行的热爱与数据分析有何关系?在利用数据之前,数据需要被清洗和预处理。正如小径需要被开辟和维护以确保安全与乐趣,数据也需要被清洗和准备,才能用于可视化和其他计算。

因此,在本模块中,我们将深入探讨数据清洗与预处理的关键任务。

为了说明这些任务的重要性,我们来看三个发人深省的场景。

以下是第一个场景:一个政党正在举行选举以选出新领袖。投票、计票,然后宣布了获胜者。但第二天,他们发现在将选票录入电子表格时出现了一个重大错误。有人犯了错,导致宣布了错误的获胜者。幸运的是,他们迅速发现并纠正了错误,在周一宣布了真正的获胜者。但可以想象,这对最初的获胜者及其支持者是多么沉重的打击,更不用说政党本身的尴尬与沮丧了。如果这个错误未被发现,后果可能相当严重。这一切都源于数据准备不当。

以下是第二个场景:这是一个在商业世界中很容易发生的假设故事。环球小工具公司的首席分析师莎拉,兴奋地准备展示第四季度销售报告。报告预测了一个破纪录的季度。但在她的演示过程中,一位敏锐的副总裁发现了异常。东海岸地区的数字看起来高得离谱。经过一番紧急调查,莎拉发现了问题所在:他们的销售数据库意外地导入了该地区的重复数据文件,导致报告的销售额翻倍。这描绘了一幅过于乐观的图景。这个尴尬的发现不仅损害了莎拉的信誉,还迫使公司撤回其预测。投资者信心受挫,基于错误数据制定的战略决策不得不暂停。这一切都源于一个未被发现的简单数据错误。

以下是第三个场景:这是一个真实案例,它清醒地提醒我们,干净、组织良好的代码是多么关键。一位司机在驶出高速公路时,车辆油门失控。由于汽车安全系统代码存在问题,司机无法减速,最终撞上了路堤。司机受重伤,不幸的是,她的乘客身亡。一位软件专家花了20多个月审查汽车关键系统的源代码。他的结论是:代码过于复杂,基本上无法测试。对其进行的任何修改都可能引入新的错误。这里的启示很明确:让你的代码具有可读性和可管理性不仅仅是为了方便,它可能关乎生死,尤其是当代码被用于做出关键决策时。

这三个故事突显了我们在清洗和预处理数据以及编写代码时为何需要如此谨慎。数据处理中的错误影响深远,可能波及从政治决策、商业战略到公共安全的方方面面。

随着我们继续学习本模块,请记住,数据清洗和预处理不仅仅是枯燥的杂务。它们是防止错误的重要保障,这些错误可能产生深远的后果。

通过密切关注这些任务,我们可以确保工作的完整性和可靠性,无论我们身处哪个领域,或者是否亲自执行这些清洗和预处理工作。

请记住,良好的数据卫生习惯,就像一条维护良好的小径,不仅仅是为了避免“撞车”,更是为了建立对我们分析和决策的信任。

现在,让我们卷起袖子,深入探索干净、可靠的数据世界。

048:数据清洗与预处理 🧹➡️📊

在本节课中,我们将学习数据准备工作的两个核心类别:数据清洗与数据预处理。我们将通过一个生动的比喻来理解两者的区别与联系,并了解它们在真实商业分析场景中的应用。


我们可以将数据操作任务分为两类:数据清洗任务数据预处理任务

为了更好地理解这两类任务的区别,让我们用一个“徒步小径”的例子来类比。

具体来说,让我们思考一下修建和清理一条小径,与规划一次徒步或骑行有何不同。


数据清洗:修建与维护小径 🛤️

修建一条小径并非易事。例如,科纳峡谷步道系统已经开发了多年。通常需要使用小型拖拉机来清理灌木丛并平整土地。

之后,还需要定期维护小径,移除大的树枝和石块,并填平车辙。

保持小径没有垃圾也很重要,以维持其可用性和美观性。对于有许多徒步者和骑行者使用的小径,清理工作通常由大型团队定期进行,例如在季节开始时和整个季节的固定时间点。

现在,让我们将这个修建和清理小径的例子关联到数据清洗过程。

正如我们必须付出大量努力来创建可供徒步和骑行的小径一样,我们也需要付出大量努力来准备和清洗数据,以便其能够被使用。

具体来说,我们希望数据没有重复行,并且没有缺失值。

如果我们有日期列,我们希望确保它们被一致地记录。

如果有包含名称的列,那么我们也希望确保名称被一致地记录。

我们希望数值以数值数据类型存储,等等。这将产生干净、整洁的数据。


上一节我们介绍了数据清洗,它就像是为分析准备好一条“干净的小径”。本节中我们来看看,当数据已经干净整洁后,我们如何为具体的分析目标“规划路线”,这就是数据预处理。

数据预处理:规划徒步或骑行路线 🗺️

一旦你有了小径,并且确保它们干净整洁,你就可以规划路线了。但这个路线取决于很多因素。

首先,如果你是骑行,那么你会使用与徒步不同的一组小径。具体来说,一旦你爬到山顶,你可能想利用那些顺畅的下坡道。

如果你是徒步,那么你会希望确保你没有使用骑行者使用的下坡道。沿途的标志有助于提醒人们如何使用小径。

天气条件也会影响你选择哪条小径以及穿什么衣服。此外,如果你打算在小径上花费很多时间,你会希望确保有足够的水和食物。

现在,让我们将规划徒步或骑行路线的过程与数据预处理联系起来。

正如我们需要计划如何使用小径一样,我们也需要计划将如何使用数据。

以下是数据预处理中需要考虑的一些关键步骤:

首先,我们需要知道有哪些数据可用,并考虑是否需要将两个或多个数据集的数据连接在一起。

然后,我们需要根据想要执行的分析类型,考虑所需的其他转换。

如果我们计划创建可视化,那么我们可能希望将数据转换为长格式

# 示例:使用 pandas 将数据从宽格式转为长格式
df_long = pd.melt(df, id_vars=['ID'], value_vars=['Var1', 'Var2'])

相反,如果我们想对数据使用机器学习算法,那么我们可能希望它是宽格式

我们可能还想对数据进行归一化标准化

# 示例:使用 sklearn 进行标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df[['feature1', 'feature2']])

我们甚至可能希望基于现有列的计算创建一些额外的数据列。


来自业界的见解:生物力学专家的实践 🎯

我采访了与高尔夫公司合作的生物化学家泰勒·斯坦福博士。他使用来自各种来源的数据,这些数据可能已经是干净的,但仍然需要进行预处理才能使用。

让我们听听他关于其领域内数据预处理的一些看法:

“我的名字是泰勒·斯坦福。我是犹他谷大学的生物力学副教授,也是几家不同高尔夫公司的独立顾问,我与他们合作进行产品教育和数据分析。在汇集和清理数据、确保其准确性方面,我的许多硬件系统都与软件后端相连,帮助将所有数据合并在一起。无论是发射监测数据、观察身体运动的动作捕捉数据、测力台数据,甚至是肌肉激活数据,很多都会被导入我经常使用的一个软件。在那里,如果我通过编码器、同步盒和硬件很好地同步一切,那么我就能将所有数据推到一起,我知道它们是时间戳同步的,并且我得到了所有数据。之后,我就在一个叫 Visual 3D 的软件里做很多事情。它基本上是一个允许我可视化并执行我称之为简化版编码的软件,有很多图形用户界面,我可以在其中测量关节角度、选择最大值和最小值,并以这种方式对数据运行计算,然后基本上导出数据表格,让我能够进入并比较和对比其中一些变量。所以我的流程通常是:收集数据 -> 在 Visual 3D 软件中进行一些过滤技术处理 -> 提取对我有意义的数据到某种 Excel 电子表格中 -> 然后我可以在上面运行统计分析。我认为这个领域的学生需要理解、并且我希望我10年前在教育阶段就掌握的软件是……我现在正好有一个学生在我这里实习,他们问‘我们实习要做什么?’我说‘你要学习 Python’。因为即使在数据组织方面,我们产生了所有这些带有离散数据点的电子表格,手动提取这些数据对他们来说太繁琐了。所以我看到了让他们理解像 Python 或 R 这样的东西的巨大潜力,以便能够快速组织数据,然后根据数据做出一些决策。我通常用来激励他们这样做的方法是,我会打开应用运动科学或应用生物力学领域的招聘公告,现在几乎每一个都列出了 Python 或 R。所以他们希望他们的运动科学家理解这些材料。我最近参加了一个很棒的棒球会议,遇到了几个学生,应该说是刚完成学业的前学生,他们都在为美国职业棒球大联盟球队工作,两人都拥有应用运动科学学位,他们的全部优势就是他们知道如何用 Python 编码,他们知道如何很好地使用它,但他们也理解这个科学背景。所以我认为像 Python 和 R 这样的东西在这个领域向前发展是必不可少的。”

你可能已经注意到,斯坦福博士谈了很多关于合并、过滤和组织数据,以便随后进行统计分析。这就是数据预处理的核心。

同样相关的是,他提到了像 Python 和 R 这样的工具对于帮助进行预处理的实用性。

回到我们的小径类比,正如在小径上拥有良好的标志很重要一样,在你的代码中拥有良好的注释也很重要,以提醒你自己和其他人你在数据预处理步骤中的位置。

数据预处理的另一个方面是能够将数据保存为易于在分析工具中使用的格式。例如,我们可以将数据保存在 pickle 文件、parquet 文件或其他一些能够压缩数据并保留数据类型的结构中。


总结 📝

本节课中我们一起学习了数据准备的两个关键阶段。

  • 数据清洗 是基础工作,旨在获得干净、一致、无错误的数据,就像修建和维护一条可供使用的小径。
  • 数据预处理 是基于特定分析目标(如可视化、机器学习)对干净数据进行转换、整合和重塑的过程,就像为一次具体的徒步或骑行规划最佳路线。

两者都至关重要。希望小径的例子能帮助你更好地理解为什么需要这两种类型的数据准备任务。

另外,如果你有一段时间没有休息了,不妨考虑离开电脑,到一条小径上去走走。也许你会有一些额外的感悟。

049:数据框列的一般数据清洗任务 🧹

在本节课中,我们将学习针对数据框(DataFrame)列进行的一些常见数据清洗任务。这些操作虽然简单,但却是数据分析工作流程中不可或缺的一部分。通过掌握这些技巧,你将能更高效地整理和准备数据。

上一节我们介绍了数据清洗的重要性,本节中我们来看看如何具体操作数据框的列。

准备工作

首先,我们需要导入必要的库并创建一个用于演示的小型数据框。这个数据框在多个方面都不够整洁,我们将逐步修复它。

import pandas as pd

![](https://github.com/OpenDocCN/dsai-notes-pt2-zh/raw/master/docs/uiuc-biz-anls/img/26c34a3e997267dcf461267f40031f21_3.png)

# 创建一个示例数据框
df = pd.DataFrame({
    'Product Name': ['Widget A', 'Widget B', 'Widget C'],
    'Product Cost': ['$30', '$50', '$55'],
    'Category': ['Spurs', 'Spurs', 'Spurs'],
    'ID': [101, 102, 103]
})

# 显示数据框信息和前几行
print(df.info())
print(df.head())

重命名列

观察数据框,你会发现有些列名中包含空格,这通常不是理想的格式。以下是重命名列的方法。

一种方法是直接使用数据框的 .columns 属性,将其设置为一个新的列名列表。这种方法适用于需要重命名所有列的情况。

# 重命名所有列
df.columns = ['product_name', 'product_cost', 'category', 'id']
print(df.columns)

然而,更多时候你只想重命名其中的一列或几列。这时,可以使用 .rename() 方法配合字典来实现。

# 使用.rename()方法重命名特定列
df = df.rename(columns={'product_name': 'Product Name'})
print(df.head())

如果需要重命名多列,只需在字典中添加对应的键值对即可。

删除列

你已经知道可以使用括号表示法或 .loc 方法来删除列。此外,数据框还有一个内置的 .drop() 方法。

假设我们想删除“category”列,因为它的值全部相同。

# 使用.drop()方法删除列
df = df.drop(columns=['category'])
print(df.head())

.drop() 方法也可以同时删除多列,只需将要删除的列名放入一个列表中。

删除并重新排序列

有时,你不仅想删除某些列,还想改变剩余列的排列顺序。这可以通过 .loc 方法一步完成。

以下是具体操作:我们将只保留“cost”列和“product name”列,并调整它们的顺序。

# 使用.loc方法选择并重排列
df = df.loc[:, ['product_cost', 'Product Name']]
print(df.head())

执行后,数据框将只包含指定的两列,并且顺序也按照列表中的顺序排列。

转换列的数据类型

数据清洗中一个关键步骤是确保每列都是正确的数据类型。例如,我们的“product_cost”列目前是字符串(object)类型,这导致无法对其进行数值计算。

尝试计算平均值会引发错误:

# 尝试对字符串列进行计算会报错
# df['product_cost'].mean()

为了修复这个问题,我们需要将其转换为数值类型。Pandas 的 pd.to_numeric() 函数可以轻松地将字符串转换为数值。

# 使用pd.to_numeric()将字符串列转换为数值
df['product_cost'] = pd.to_numeric(df['product_cost'].str.replace('$', ''))
print(df['product_cost'].mean())  # 现在可以成功计算平均值

转换后,该列的数据类型变为 float64int64,从而支持数值运算。

当然,有时也需要进行反向操作,将数值列转换为字符串。这可以使用 .astype() 方法。

# 使用.astype()将数值列转换回字符串
df['product_cost'] = df['product_cost'].astype(str)
print(df.info())  # 查看数据类型,确认已变回object

转换回字符串后,该列将无法再进行数值计算。

总结

本节课中我们一起学习了数据框列的几个核心清洗操作:

  • 重命名列:使用 .columns 属性或 .rename() 方法。
  • 删除列:使用 .drop() 方法。
  • 删除并重排列:使用 .loc 方法进行选择和排序。
  • 转换数据类型:使用 pd.to_numeric() 将字符串转为数值,或使用 .astype() 进行各种类型转换。

这些是构建整洁、可用于分析的数据集的基础步骤。虽然无需死记硬背所有语法,但理解其逻辑并知道如何查找应用,将极大地提升你使用 Python 进行数据分析的效率和优雅性。

050:数据框行的通用数据清洗任务 🧹

在本节课中,我们将学习针对数据框(DataFrame)行进行数据清洗的几种通用任务。具体包括:如何对行进行排序、如何处理重复值、如何处理缺失值,以及如何重置和排序索引标签。掌握这些技能是进行有效数据分析的基础。

数据排序 📊

上一节我们介绍了数据清洗的重要性,本节中我们来看看如何对数据框的行进行排序。排序可以帮助我们更好地组织和理解数据。

Pandas 提供了一个名为 sort_values 的方法,使用起来非常简单。你只需要指定想要依据哪一列进行排序即可。

以下是使用 sort_values 方法的基本步骤:

  • 按单列排序df.sort_values(by='列名')
  • 降序排序:使用 ascending=False 参数。
  • 按多列排序by 参数接受一个列名列表。ascending 参数也可以是一个布尔值列表,分别对应每一列的排序顺序。

例如,如果我们有一个名为 df 的数据框,包含 nameID 列,我们可以这样操作:

# 按 name 列升序排序
df_sorted = df.sort_values(by='name')

# 按 name 列降序排序
df_sorted_desc = df.sort_values(by='name', ascending=False)

# 先按 name 升序,再按 ID 降序排序
df_sorted_multi = df.sort_values(by=['name', 'ID'], ascending=[True, False])

处理重复值 🔍

数据中经常会出现重复的行,这可能会影响分析结果的准确性。因此,识别和处理重复值是数据清洗的关键一步。

Pandas 提供了 duplicated 方法来识别重复行,以及 drop_duplicates 方法来删除它们。

以下是处理重复值的常用方法:

  • 识别重复行df.duplicated() 返回一个布尔序列,标记每一行是否为重复行(从第二次出现开始标记)。
  • 提取重复行:可以通过布尔索引来查看所有重复的行。
  • 删除所有重复行df.drop_duplicates() 会删除所有列值完全相同的重复行,只保留第一次出现的行。
  • 基于特定列删除重复行:使用 subset 参数指定要检查重复的列。

例如:

# 检查重复行
duplicate_rows = df.duplicated()

# 查看所有重复的行
df_dupes = df[df.duplicated()]

# 删除所有完全重复的行
df_no_dupes = df.drop_duplicates()

# 仅基于 ‘name’ 列删除重复行
df_unique_names = df.drop_duplicates(subset=['name'])

处理缺失值 ⚠️

缺失值是数据集中常见的问题。Pandas 使用 NaN(Not a Number)来表示缺失值。处理缺失值主要有两种策略:删除包含缺失值的行,或用其他值(如均值、中位数)进行填充。

Pandas 的 dropna 方法用于删除缺失值,fillna 方法用于填充缺失值。

以下是处理缺失值的两种主要方式:

  • 删除包含缺失值的行df.dropna() 会删除任何列中包含 NaN 的行。
  • 删除特定列包含缺失值的行:使用 subset 参数指定要检查的列。
  • 填充缺失值df.fillna() 可以用指定的值填充缺失值。常见做法是用该列的均值进行填充。

例如:

# 删除任何列包含缺失值的行
df_cleaned = df.dropna()

# 仅删除 ‘name’ 和 ‘category’ 列同时为缺失值的行
df_partial_clean = df.dropna(subset=['name', 'category'])

# 用 ‘cost’ 列的均值填充该列的缺失值
mean_cost = df['cost'].mean()
df_filled = df.fillna({'cost': mean_cost})

重置与排序索引 🔢

在对数据框进行多次操作(如排序、删除行)后,行索引可能会变得不连续或混乱。为了使索引更规整,或者为了将某一列设置为新的索引,我们需要进行索引操作。

Pandas 的 reset_index 方法用于重置索引,set_index 方法用于将某一列设置为索引,sort_index 方法用于按索引排序。

以下是操作索引的常用方法:

  • 重置索引df.reset_index(drop=True) 会将索引重置为从0开始的连续整数。drop=True 参数可以避免将旧索引保存为新列。
  • 设置新索引df.set_index(‘列名’) 可以将指定列的值设置为数据框的新索引。
  • 按索引排序df.sort_index() 可以依据索引值对数据框进行排序。

例如:

# 重置索引,不保留旧索引
df_reset = df.reset_index(drop=True)

# 将 ‘name’ 列设置为索引
df_indexed = df.set_index('name')

# 按索引(现在是 ‘name’ 列的值)进行排序
df_sorted_by_index = df_indexed.sort_index()

本节课中我们一起学习了数据框行数据清洗的四个核心任务:排序、去重、处理缺失值以及管理索引。这些是使用 Pandas 进行数据预处理的基础操作,熟练掌握它们将为后续的数据分析和建模打下坚实的基础。记住,干净、规整的数据是获得可靠分析结果的前提。

051:清理数据框的字符串列 📊

在本节课中,我们将学习如何操作和清理数据框中数据类型为“对象”(即字符串或字符型)的列。我们将介绍合并字符串、修改大小写、去除空格、提取子字符串以及使用正则表达式等核心技巧。


概述

数据清洗是数据分析的关键步骤,尤其是处理文本数据时。字符串列中常见的问题包括大小写不一致、存在多余空格、需要提取或替换特定内容等。本节将演示如何使用Pandas库中的.str访问器及其方法来高效地解决这些问题。


合并字符串

有时我们需要将不同列的数据合并,或在现有字符串后添加固定文本。

以下是合并两列字符串的方法:

df['name_cat'] = df['name'] + df['category']

运行上述代码后,数据框中会新增一个name_cat列,其值为name列和category列对应值的拼接。

如果需要在现有列的每个值后添加固定字符串,可以这样做:

df['name_owner'] = df['name'] + '_wrong'

执行后,name_owner列的每个值都会在原始名称后加上“_wrong”。


修改字符串大小写

处理文本数据时,统一大小写(如全部转为小写)有助于后续的分析和匹配。

我们可以使用.str访问器下的.lower()方法来实现:

df['category'] = df['category'].str.lower()

运行代码后,category列中的所有文本都会转换为小写。.str访问器还提供了.upper()(转为大写)和.title()(转为标题格式)等方法。


去除首尾空格

数据中不易察觉的首尾空格可能导致字符串匹配失败。检查空格的一个方法是打印列值或使用.loc方法查看单个值。

检查空格示例:

print(df['name'])
# 或
print(df.loc[0, 'name'])

要去除这些空格,可以使用.strip()方法。通常,我们会将大小写转换和去除空格的操作链式执行:

df['name'] = df['name'].str.lower().str.strip()

执行后,name列不仅变为小写,首尾的空格也被移除。


提取子字符串

我们可以根据字符位置从字符串中提取特定部分。

提取前6个字符:

df['name_sub'] = df['name'].str[:6]

从第2个字符提取到第3个字符(索引从0开始):

df['name_sub'] = df['name'].str[1:3]

提取最后6个字符:

df['name_sub'] = df['name'].str[-6:]

这些操作允许我们灵活地获取字符串的任意部分。


检查与替换子字符串

判断字符串是否包含特定内容,可以使用.contains()方法。

例如,检查name列是否包含“ball”:

df['name_ball'] = df['name'].str.contains('ball')

运行后,name_ball列会显示布尔值,表示对应行是否包含“ball”。

若要替换或删除特定子字符串,则使用.replace()方法。例如,将“ball”替换为空字符串(即删除):

df['name'] = df['name'].str.replace('ball', '')

执行后,所有包含“ball”的地方都会被移除。


拆分字符串

.split()方法可以根据指定的分隔符将字符串拆分为列表。

按空格拆分:

split_result = df['name'].str.split(' ')

按字母“a”拆分:

split_result = df['name'].str.split('a')

如果希望将拆分后的结果扩展为新的数据列,可以结合expand=True参数:

df[['name1', 'name2', 'name3']] = df['name'].str.split(' ', expand=True)

这样,原name列会根据空格被拆分成三列。如果某行拆分后的部分不足,对应位置会填充None


使用正则表达式

正则表达式是用于匹配复杂文本模式的强大工具。例如,我们想替换每行字符串中最后一个空格之前的所有内容。

以下代码使用正则表达式实现该功能:

df['name_reg'] = df['name'].str.replace(r'^.* ', 'new_first_word ', regex=True)

代码解释:

  • r'^.* ' 是一个正则表达式模式,表示“从字符串开头(^)匹配任意字符(.)零次或多次(*),直到遇到一个空格”。
  • 'new_first_word ' 是替换后的内容。
  • regex=True 参数表明使用正则表达式进行替换。

执行后,对于包含空格的字符串,其最后一个空格之前的部分会被替换为“new_first_word ”。


总结

本节课我们一起学习了清理数据框字符串列的核心操作。我们涵盖了合并字符串、统一大小写、去除空格、提取子字符串、检查与替换内容、拆分字符串以及使用正则表达式进行模式匹配。掌握这些.str访问器下的方法,能帮助你高效地准备文本数据,为后续分析打下坚实基础。记住,你无需死记所有方法,但理解其原理并在需要时查找文档至关重要。

052:清理数据框中的日期列 📅

在本节课中,我们将学习如何处理Pandas数据框中的日期数据。日期是数据分析中常见且重要的一类数据,但由于其记录和报告格式的不一致性,处理起来可能颇具挑战。我们将介绍如何将字符串格式的日期转换为日期时间数据类型,如何提取日期特征,以及如何处理格式不一致的日期数据。

从字符串到日期时间

上一节我们介绍了日期处理的重要性。本节中,我们来看看如何将数据框中的字符串列转换为日期时间数据类型。Pandas提供了一个非常实用的函数 pd.to_datetime()

以下是一个简单的数据框示例,其中包含三个日期列,它们目前都是字符串(对象)数据类型:

import pandas as pd

![](https://github.com/OpenDocCN/dsai-notes-pt2-zh/raw/master/docs/uiuc-biz-anls/img/6aba8c7dd8b85f66e0bd34c788bec1fd_11.png)

# 示例数据框
df = pd.DataFrame({
    'date1': ['2025-04-03', '2026-07-14', '2027-01-01', '2032-08-09'],
    'date2': ['2025-04-03T12:00:00', '2026-07-14T23:59:59', '2027-01-01T00:00:00', '2032-08-09T03:15:24.325'],
    'date3': ['04/03/2027', '04-03-2027', '2027.04.03', '03/04/2027']
})

date1 列中的值都采用 ISO 8601 格式(即 YYYY-MM-DD),格式统一。对于这种格式统一的列,转换非常简单:

df['date1'] = pd.to_datetime(df['date1'])

执行后,date1 列的数据类型会从 object 变为 datetime64[ns]。这个数据类型可以精确记录日期和时间(纳秒级)。

提取日期特征

成功将列转换为日期时间类型后,我们就可以轻松提取各种日期特征,例如星期几、月份等。这主要通过 .dt 访问器实现,其功能类似于字符串列的 .str 访问器。

以下是提取星期几和星期几名称的示例:

# 提取星期几(数字,默认周一为0)
df['d1_dow'] = df['date1'].dt.dayofweek

![](https://github.com/OpenDocCN/dsai-notes-pt2-zh/raw/master/docs/uiuc-biz-anls/img/6aba8c7dd8b85f66e0bd34c788bec1fd_22.png)

# 提取星期几的名称
df['d1_dow_name'] = df['date1'].dt.day_name()

通过 .dt 访问器,你还可以获取年、月、日、小时等其他特征。

处理格式不一致的日期

在实际数据中,日期格式往往不一致。例如,我们的 date2 列虽然大体是ISO 8601格式,但有些值包含时分秒,有些甚至包含毫秒,有些则没有时间部分。

如果直接使用 pd.to_datetime() 转换,可能会报错。Pandas为此提供了 format='mixed' 参数,可以智能处理混合格式:

df['date2'] = pd.to_datetime(df['date2'], format='mixed')

此参数会尝试解析列中各种常见的日期时间格式,并将其统一转换。

然而,有些情况 pd.to_datetime() 也无法自动处理。例如 date3 列,其意图是表示“2027年4月3日”,但前三个值是“月/日/年”或类似格式,最后一个值是“日/月/年”。由于存在根本性的歧义(月份和日期的顺序不同),自动转换无法判断用户意图,可能导致错误结果。

对于这种极端情况,可能需要将数据框按不同格式拆分,分别进行转换后再合并。

计算日期差与时间间隔

日期时间数据类型的一个强大之处是可以直接进行算术运算,计算时间间隔。

1. 计算两个日期列之间的差值:

df['d1_minus_d2'] = df['date1'] - df['date2']

结果是一个 timedelta64[ns] 类型的序列,表示时间差。

2. 将时间差转换为数值(例如天数):

timedelta 的底层是纳秒数。我们可以先将其转换为数值,再转换为所需单位。

# 将时间差转换为天数(数值)
df['d1_minus_d2_days'] = pd.to_numeric(df['d1_minus_d2']) / (1e9 * 60 * 60 * 24)

3. 计算距今的时间:

使用 pd.Timestamp.now() 获取当前时间,可以轻松计算某个日期距离今天有多久。

df['days_since_d1'] = pd.Timestamp.now() - df['date1']
df['days_since_d1_numeric'] = pd.to_numeric(df['days_since_d1']) / (1e9 * 60 * 60 * 24)

4. 计算未来或过去的日期:

使用 pd.Timedelta 可以方便地对日期进行加减运算。

# 计算 date1 之后10天的日期
df['date1_plus_10d'] = df['date1'] + pd.Timedelta(10, unit='D')

总结

本节课中我们一起学习了在Pandas中处理日期时间数据的关键技能:

  1. 转换数据类型:使用 pd.to_datetime() 函数将字符串列转换为 datetime64[ns] 类型。
  2. 提取特征:通过 .dt 访问器提取如星期、月份等日期组成部分。
  3. 处理不一致格式:对于混合格式的日期,使用 format='mixed' 参数尝试转换;对于有歧义的格式,可能需要手动处理。
  4. 进行计算:日期时间类型支持直接相减得到时间差,也支持与 pd.Timedelta 相加得到新的日期。可以利用 pd.Timestamp.now() 计算与当前时间的间隔。

掌握这些基本操作,你将能够应对数据分析中遇到的大部分日期处理任务。

053:宽格式与长格式 📊

在本节课中,我们将学习数据框的形状,即宽格式与长格式的概念。理解这两种格式的区别以及如何根据分析需求进行转换,是数据预处理的关键步骤。

概述

数据框的形状由其行数和列数决定。这类似于人们录制视频时选择横屏或竖屏,取决于最终播放的平台。在商业分析中,数据的“长度”和“宽度”同样取决于你计划使用的分析工具。

数据长度与宽度的定义

在整洁的数据框中,每一行代表一个观测值,每一列代表观测值的一个特征。

  • 数据框的长度:指数据框的行数,即观测值的数量。
  • 数据框的宽度:指数据框的列数,即特征的数量。

因此,当我们谈论一个长数据框时,指的是拥有许多行(观测值)的数据框。相反,一个宽数据框则拥有许多列(特征)。

格式选择取决于分析工具

上一节我们定义了数据形状,本节中我们来看看如何选择。数据的形状并非固定不变,选择哪种格式通常取决于你计划使用的分析工具。

以下是不同工具对数据格式的典型偏好:

  • 可视化软件和仪表板:通常更依赖长格式的数据。这种格式便于按不同维度(如类别、时间)进行分组和绘图。
  • 算法和供人阅读的表格:通常更依赖宽格式的数据。许多机器学习算法要求每个观测值(行)的特征(列)是固定的。

数据格式转换示例

让我们通过一个例子来具体理解宽格式与长格式的转换。

假设我们有一个销售数据框,其中每一行代表一个产品线,第一列是产品线名称,其余31列分别代表一月份每一天的销售量。

  • 原始宽格式
    • 行数:15(15个产品线)
    • 列数:32(1列名称 + 31列日销量)
    • 特点:数据框较,每个产品线的所有日期销量都横向排列。

我们可以通过数据透视操作,将这个宽格式数据转换为长格式。

  • 转换后的长格式
    • 每一行代表一个产品线在特定日期的销售记录。
    • 列数减少为3列:产品线日期销售量
    • 行数增加:15个产品线 × 31天 = 465行。
    • 特点:数据框变得非常,但结构更简洁,便于按日期或产品线进行分析。

用伪代码表示,转换的核心是从:
数据框[产品线, 第1天销量, 第2天销量, ..., 第31天销量]
变为:
数据框[产品线, 日期, 销量]

总结与数据预处理流程

本节课中,我们一起学习了数据框的宽格式与长格式。

总结来说,当你为计算准备数据时,第一步是整理数据,包括填补缺失值、确保每列数据格式一致。

获得整洁的数据框后,下一步是预处理数据,使其格式符合你提出的分析问题。这包括两个关键元素:

  1. 确保数据聚合的层级与分析问题一致。
  2. 将数据透视成最适合你计划使用的分析工具的长度和宽度

记住,就像为不同平台选择视频比例一样,为分析任务选择正确的数据格式,能让后续工作更加高效。


054:更改数据框的形状 📊

在本节课中,我们将要学习如何使用Pandas库来重塑数据框的形状。具体来说,我们将探讨如何将数据从“长格式”转换为“宽格式”,反之亦然,以及如何对数据框进行转置。这些操作在数据整理和准备阶段至关重要,能够使数据更适合后续的分析或可视化。

数据重塑概述

上一节我们介绍了数据框的基本概念,本节中我们来看看如何改变数据框的结构。数据重塑指的是改变数据在数据框中的排列方式,例如将多行数据转换为多列,或者将多列数据合并为单列。这在处理时间序列数据、创建数据透视表或准备绘图数据时非常有用。

从长格式到宽格式:pivot方法

有时,为了便于阅读或报告,我们希望将数据从长格式转换为宽格式。长格式通常指数据有较多的行和较少的列,而宽格式则相反,有较多的列和较少的行。Pandas提供了pivot方法来实现这一转换。

假设我们有一个简单的数据框,包含三列:产品名称、销售额和日期。数据可能如下所示:

import pandas as pd

data = {
    'product': ['bat', 'bat', 'ball', 'ball'],
    'sales': [1500, 1000, 750, 400],
    'date': pd.to_datetime(['2023-01-25', '2023-01-26', '2023-01-25', '2023-01-26'])
}
df = pd.DataFrame(data)
print(df)

为了将日期作为列标题,产品作为行索引,销售额作为单元格值,我们可以使用pivot方法:

df_wide = df.pivot(index='product', columns='date', values='sales')
print(df_wide)

执行上述代码后,数据框将变为宽格式,其中行索引是产品名称,列是日期,单元格内是对应的销售额。pivot方法会自动处理数据的排序和重组。

从宽格式到长格式:melt方法

如果我们想将宽格式的数据框恢复为长格式,可以使用melt方法。这个过程通常涉及将多列“融化”为单列,同时保留其他列作为标识符。

以下是使用melt方法的关键步骤:

  1. 首先,如果行索引是我们想要保留的标识符,需要先使用reset_index方法将其转换为普通列。
  2. 然后,使用melt方法指定标识符列和需要融化的值列。
# 假设df_wide是我们的宽格式数据框,且‘product’是索引
df_wide_reset = df_wide.reset_index()
df_long = df_wide_reset.melt(id_vars='product', value_name='sales')
print(df_long)

执行后,数据将恢复为长格式,包含产品、日期和销售额三列。数据的顺序可能与原始顺序不同,但内容一致。

数据框转置:T属性或transpose方法

转置操作是将数据框的行和列进行互换。在Pandas中,我们可以使用.T属性或.transpose()方法来实现。

转置操作非常简单:

# 使用.T属性
df_transposed = df.T
print(df_transposed)

# 或使用.transpose()方法
df_transposed = df.transpose()
print(df_transposed)

转置后,原来的列名会成为新的行索引,原来的行索引会成为新的列名。这个操作在处理某些需要行列互换的分析场景时非常有用。

总结

本节课中我们一起学习了三种重塑Pandas数据框形状的方法。我们首先使用pivot方法将数据从长格式转换为宽格式,使数据更易于人类阅读和报告。接着,我们使用melt方法将宽格式数据恢复为长格式,适用于需要多行少列的数据结构。最后,我们介绍了如何使用.T属性或.transpose()方法对数据框进行转置,即交换行和列。掌握这些数据重塑技巧,将帮助你更灵活地准备和分析数据,为后续的商业分析任务打下坚实基础。

055:合并数据框 📊

在本节课中,我们将学习如何使用Pandas库将两个不同的数据框(DataFrame)合并在一起。我们将探讨不同的合并场景,包括按行合并和按列合并,并介绍concatmerge函数的具体用法。

数据准备

首先,我们创建一个简单的数据框,它包含三列(产品名称、销售额、日期)和六行数据。前三行是关于“球棒”(bat)的数据,后三行是关于“球”(ball)的数据。

为了演示合并操作,我们将这个原始数据框拆分成两个独立的数据框:df_bat(仅包含球棒数据)和df_ball(仅包含球数据)。

import pandas as pd

# 原始数据
data = {
    ‘product‘: [‘bat‘, ‘bat‘, ‘bat‘, ‘ball‘, ‘ball‘, ‘ball‘],
    ‘sales‘: [100, 150, 200, 50, 75, 100],
    ‘date‘: [‘2023-01-25‘, ‘2023-01-26‘, ‘2023-01-27‘, ‘2023-01-25‘, ‘2023-01-26‘, ‘2023-01-27‘]
}
df = pd.DataFrame(data)

![](https://github.com/OpenDocCN/dsai-notes-pt2-zh/raw/master/docs/uiuc-biz-anls/img/ac3365603b880ab4e95f0c6354a708bb_11.png)

![](https://github.com/OpenDocCN/dsai-notes-pt2-zh/raw/master/docs/uiuc-biz-anls/img/ac3365603b880ab4e95f0c6354a708bb_13.png)

# 拆分为两个数据框
df_bat = df[df[‘product‘] == ‘bat‘].reset_index(drop=True)
df_ball = df[df[‘product‘] == ‘ball‘].reset_index(drop=True)

按行合并数据

当您拥有格式完全相同的新数据,并希望将其添加到现有数据下方进行分析时,就需要按行合并数据。这可以通过Pandas的concat函数轻松实现。

以下是使用concat函数按行合并数据框的步骤:

  1. pd.concat()函数中,传入一个包含所有待合并数据框的列表。
  2. 默认情况下,axis参数为0,表示按行合并。

# 按行合并数据框
df_combined_rows = pd.concat([df_bat, df_ball], axis=0)
print(df_combined_rows)

执行后,df_combined_rows将恢复为与原始df数据框相同的样子。

按列合并数据

当您希望将新的数据列(例如模型预测结果)添加到现有数据框旁边时,就需要按列合并数据。其操作与按行合并类似,但需要设置axis=1

然而,直接按列合并可能会出现问题。默认情况下,concat函数会根据索引标签(index label)来对齐数据。如果两个数据框的索引标签不一致,就会产生大量缺失值(NaN)和重复的列名。

为了避免这个问题,在合并前需要确保两个数据框具有相同的索引标签。通常,我们可以使用reset_index(drop=True)来重置索引。

# 确保两个数据框索引一致(已在拆分时使用reset_index)
# 按列合并数据框
df_combined_cols = pd.concat([df_bat, df_ball], axis=1)
print(df_combined_cols)

现在,数据框会并排显示,这是我们期望的结果。

关于索引的另一个注意事项是,在按行合并时,如果原始数据框存在重复的索引标签,Pandas默认会保留它们,但这可能导致后续引用特定行时产生歧义。一个常见的做法是使用ignore_index=True参数,让Pandas自动生成新的连续索引。

# 按行合并并忽略原始索引
df_combined_rows_ignore = pd.concat([df_bat, df_ball], axis=0, ignore_index=True)

使用Merge函数合并数据

当需要根据一个或多个关键列(key columns)来匹配和合并两个数据框时,merge函数更为强大和灵活。这在数据不完全对齐时非常有用,例如为销售数据添加天气或单位数量等信息。

假设我们有一个新的数据框df_units,记录了不同产品和日期的销售数量,但它的行与原始销售数据框df并不完全对应。

# 创建单位数量数据框
df_units = pd.DataFrame({
    ‘product‘: [‘bat‘, ‘ball‘, ‘ball‘],
    ‘units‘: [60, 400, 500],
    ‘date‘: [‘2023-01-25‘, ‘2023-01-25‘, ‘2023-01-01‘] # 注意最后一个日期在df中不存在
})

merge函数的核心参数包括:

  • left/right:待合并的左右两个数据框。
  • how:指定合并类型,如‘left‘, ‘right‘, ‘outer‘, ‘inner‘
  • on:指定用于匹配的列名。

以下是四种主要合并类型的区别:

左连接 (Left Join)
保留左侧数据框(df)的所有行,只从右侧数据框(df_units)添加匹配的行,不匹配的则显示为NaN。

df_left_merge = pd.merge(df, df_units, on=[‘product‘, ‘date‘], how=‘left‘)

右连接 (Right Join)
保留右侧数据框(df_units)的所有行,只从左侧数据框(df)添加匹配的行。

df_right_merge = pd.merge(df, df_units, on=[‘product‘, ‘date‘], how=‘right‘)

外连接 (Outer Join)
保留两个数据框中的所有行,无论是否匹配。不匹配的位置用NaN填充。

df_outer_merge = pd.merge(df, df_units, on=[‘product‘, ‘date‘], how=‘outer‘)

内连接 (Inner Join)
只保留两个数据框中都能匹配上的行。这是最严格的合并方式。

df_inner_merge = pd.merge(df, df_units, on=[‘product‘, ‘date‘], how=‘inner‘)

重要注意事项与总结

在使用合并函数时,务必提前思考合并后的数据框应该是什么样子,并在操作完成后仔细检查结果是否符合预期。如果用于匹配的列指定不正确(例如忘记指定date列),可能会导致数据错误膨胀、产生重复列(如date_x, date_y)等问题。

本节课我们一起学习了Pandas中合并数据框的两种主要方法:

  1. concat函数:用于简单地将数据框按行(axis=0)或按列(axis=1)堆叠。使用时需注意索引对齐问题。
  2. merge函数:用于根据一个或多个关键列,以数据库连接(join)的方式合并数据框。通过how参数可以灵活控制左连接、右连接、外连接和内连接。

掌握这些数据合并技巧,是进行数据清洗、特征工程和构建分析数据集的基础。请务必在实践后验证数据形状和内容,确保合并操作正确无误。

056:清理你的代码 🧹

在本节课中,我们将要学习如何清理你的代码,而不是数据。在探索数据并创建了清理工作流之后,确保代码易于阅读且运行高效非常重要。我们将通过一个简单的场景,演示三种清理代码的方法。

概述

在探索数据并创建清理工作流后,代码的可读性和运行效率变得至关重要。本节将演示如何通过三个步骤来优化和清理你的代码。

初始场景与问题

在Jupyter Lab环境中,我们创建了一个存在多种不整洁问题的数据框。

这个数据框存在以下问题:

  1. 列名 a category 中包含空格。
  2. a category 列中的值,有些单词首字母大写,有些则没有。
  3. 数据中存在一些缺失值。


逐步清理过程

通常,我们会逐步执行代码,并检查每一步是否成功。

例如,要重命名一个列,我会使用 rename 函数,将 a category 改为 category

df.rename(columns={'a category': 'category'})

运行并验证它是否生效。


接着,如果我想将 category 列中的所有值转换为小写,我会使用字符串的 lower 方法。

df['category'] = df['category'].str.lower()

然后验证 category 列中的所有值是否都已变为小写。

假设我想用平均值填充 cost 列中的缺失值。

我会使用 fillna 函数,用均值填充这些值。

df['cost'].fillna(df['cost'].mean())

然后验证这些值确实已被填充。

最后,假设我还想删除包含缺失值的行,比如这里的这一行。


我会运行删除操作,并验证数据中不再有任何缺失值。

df.dropna()

代码清理的三个技巧

虽然逐步执行代码很容易,但这个过程有些繁琐,无法一眼看清所有操作,并且需要频繁打印数据框。以下是清理代码的三个技巧。

技巧一:移除探索性数据展示
如果你不再需要那些用于探索的数据框或可视化图表,可以将它们从代码中移除。

技巧二:将代码合并到单个单元格
你可以将多个步骤的代码合并到一个单元格中,或者合并到更少的单元格里。


技巧三:通过链式调用合并步骤
你可以更进一步,通过链式调用将多个步骤合并到一行代码中。

链式调用示例

让我们看看如何将所有步骤合并到一行代码中。

我将创建一个新的数据框 df_clean,然后链式调用 rename 方法。接着是 assign 方法(稍后会详细说明),然后是 fillna 方法、dropna 方法和 reset_index 方法。

df_clean = df.rename(...).assign(...).fillna(...).dropna(...).reset_index(...)

通过运行这一行代码,我得到了相同的结果,但代码只有一行。

提升链式代码的可读性

你可能会觉得这行代码很难阅读。确实,它很密集。而在用代码分析数据时,可读性非常重要。

让我展示如何让它变得更好。首先,你可以用括号将这行代码括起来。

df_clean = (
    df.rename(...)
    .assign(...)
    .fillna(...)
    .dropna(...)
    .reset_index(...)
)

这样做之后,我可以将每个方法放在单独的一行。现在代码变得容易阅读得多,因为我可以清楚地看到:我获取原始数据框、重命名列、使用 assign 创建新列、填充缺失值、删除包含缺失值的行以及重置索引。


另一个好处是,我只需要输入一次数据框的名称 df,而在逐步探索的代码中,我不得不反复输入 df_clean

关于 assign 方法的注意事项

现在,这段代码的一个缺点体现在 assign 这一行。assign 方法非常有用,它允许你在一个函数内创建新列,而无需反复输入数据框名称和列名。

但它的缺点是,在链式调用中,你不能像平常那样直接引用数据框本身。如果你尝试这样做,会得到一个错误。


因此,我们需要使用一个称为 Lambda函数 的短暂匿名函数。如果你不了解Lambda函数,不必过于担心。只需知道,我们不是输入数据框名称,而是输入 Lambda,然后是一个字母和冒号,再用这个字母来代表数据框的名称。

.assign(category_lower = lambda x: x['category'].str.lower())

总的来说,尽管 assign 方法有这个小缺点,但我非常喜欢这种链式写法,因为它极大地提高了代码的可读性。

总结 🎯

本节课中我们一起学习了清理代码的三个核心技巧:

  1. 移除不必要的探索性数据展示
  2. 将代码合并到单个或更少的单元格中
  3. 通过链式调用将步骤合并到更少的代码行中,并使用括号和换行来提升可读性。

这些技巧能显著提高代码的可读性和运行效率。虽然清理代码并非强制要求,但当你日后回顾代码,或者他人阅读你的代码时,你会庆幸自己这样做了。


057:保存清理后的数据 💾

在本节课中,我们将要学习如何将清理后的数据保存为CSV或Excel之外的替代文件格式。我们将探讨不同格式的优缺点,并通过实际示例比较它们在文件大小、读写速度等方面的性能。

概述

在数据清洗工作完成后,选择合适的格式保存数据至关重要。本节将介绍两种主要的替代文件格式:Pickle和Parquet,并解释为何有时需要放弃常见的CSV或Excel格式。

为何考虑替代格式?

主要有两个原因促使我们考虑使用CSV或Excel之外的格式。

  1. 保留数据类型与结构:在投入大量精力清洗数据后,我们希望保留数据的类型和结构。CSV或Excel文件可能无法完整保留这些信息。
  2. 处理大型数据集:CSV和Excel文件可能相对较大。处理大型数据集时,使用占用大量空间且传输耗时的格式会带来不便。

上一节我们介绍了选择替代格式的原因,本节中我们来看看这些格式在实际操作中的表现。

环境准备与数据创建

我们将在一个Jupyter Lab环境中进行演示。首先,需要导入必要的库并创建一个用于测试的大型数据集。

import pandas as pd
import numpy as np

# 创建一个包含三列、一百万行随机数的DataFrame
df = pd.DataFrame({
    'col1': np.random.randn(1_000_000),
    'col2': np.random.randn(1_000_000),
    'col3': np.random.randn(1_000_000)
})

我们将比较不同格式的读写速度和文件大小。以下是用于计时的代码示例:

%%time
# 此单元格中的代码执行时间将被测量
df.to_csv('test_data.csv', index=False)

不同格式的保存性能比较

我们将把同一个DataFrame保存为三种不同的格式,并测量所需时间。

1. 保存为CSV格式

  • 使用 df.to_csv('test_data.csv', index=False) 进行保存。
  • 本次操作耗时 1.48秒

2. 保存为Pickle格式

  • 使用 df.to_pickle('test_data.xz') 进行保存。这里使用 .xz 扩展名对应所采用的压缩方式。
  • 本次操作耗时 5.75秒

3. 保存为Parquet格式

  • 使用 df.to_parquet('test_data.parquet') 进行保存。
  • 本次操作耗时 53毫秒,是目前最快的。

文件大小比较

保存完成后,我们比较一下生成文件的大小:

  • CSV文件:57.8 MB(最大)
  • Parquet文件:24.82 MB(约为CSV的一半)
  • Pickle文件 (.xz):21.6 MB(最小)

不同格式的读取性能比较

现在,我们测试从这些文件中读取数据并加载回DataFrame的速度。

以下是读取操作的耗时结果:

1. 读取CSV文件

  • 使用 pd.read_csv('test_data.csv')
  • 耗时 142毫秒

2. 读取Pickle文件

  • 使用 pd.read_pickle('test_data.xz')
  • 耗时 645毫秒

3. 读取Parquet文件

  • 使用 pd.read_parquet('test_data.parquet')
  • 耗时 33.1毫秒,是最快的。

Parquet格式还有一个额外优势:可以只读取数据的部分列。例如:

%%time
df_subset = pd.read_parquet('test_data.parquet', columns=['col1', 'col2'])

此操作仅读取指定列,耗时更短(约12毫秒),在只需部分数据时非常高效。

格式对比总结与选择建议

根据以上测试,我们可以总结三种格式的性能特点:

  • 保存速度:Parquet最快,CSV居中,Pickle最慢。
  • 文件大小:Pickle最小,CSV最大,Parquet略大于Pickle。
  • 读取速度:Parquet最快,CSV居中,Pickle最慢。

综合来看,Parquet格式在大多数情况下是最佳选择,它在速度和大小上取得了很好的平衡。

然而,在以下特定场景中,其他格式可能更合适:

  • 优先考虑文件体积:如果数据集极大,且存储空间是首要考虑因素,则Pickle格式(尤其是压缩后)可能更合适。
  • 优先考虑兼容性与可移植性:如果需要将数据用于其他数据分析应用(如Power BI),需确保目标应用能读取保存的格式。并非所有应用都支持Pickle和Parquet文件。在这种情况下,CSV格式通常是兼容性最广、可移植性最强的选择。

总结

本节课中我们一起学习了CSV和Excel之外的替代数据存储格式。我们通过实践比较了Pickle和Parquet格式在读写速度、文件大小方面的性能。理解这些差异后,您可以在数据清洗完成后,根据对速度、体积和兼容性的不同优先级,做出更明智的数据存储决策。

058:数据清洗与预处理总结

在本模块中,我们系统性地学习了数据清洗与预处理的核心概念与重要性。本节我们将对整个模块的内容进行回顾与总结,帮助你巩固所学知识,并理解其在数据分析实践中的关键作用。

模块内容回顾

上一节我们介绍了数据清洗与预处理的具体技术,本节中我们来看看这些工作的整体意义。

我们在这个模块中学习了大量关于数据清洗和预处理的知识。这项工作有时可能显得繁琐,但它至关重要。

核心概念类比

我们可以将数据清洗与预处理比作徒步或骑行前的准备工作。想象一下在科纳峡谷这样的步道进行活动。在你踏上步道之前,你需要检查步道是否可用,对吗?

数据清洗就如同步道检查。其目的是移除障碍物,例如:

  • 缺失值
  • 重复条目
  • 不一致的数据

这样你的分析才不会在半路“爆胎”。这些障碍会拖慢你的进度,并可能导致“翻车”。

当你到达步道后,你应该对如何到达目的地有一个计划。这包括遵循路标,并在行进过程中调整路线。

数据预处理就如同规划你的路线。我们决定数据的最佳组织方式,以便能够回答我们的问题并获得洞察。

重要性重申

现在,请回想我们在课程最开始讨论的那三个场景:与政党计票错误、首席分析师重复数据以及汽车安全系统中的复杂代码相关的案例。

想象一下,如果这些案例涉及的是徒步路线。如果步道地图错误地标记了一个转弯,导致徒步者进入危险地形,会怎样?或者,如果一条步道被标记为“简单”,但分类错误,实际上极其困难,导致准备不足的徒步者迷路,又会怎样?

这就是为什么数据清洗和预处理如此重要。它们不仅仅是为了让数据看起来美观,更是确保你分析结果准确性的基础。

核心原则与目标

通过采用严谨的数据清洗与预处理方法,你可以确保你的分析洞察是:

  • 清晰的
  • 简洁的
  • 最重要的是,可信的

因此,下次当你准备开始分析一个数据集时,请记住要正确地准备数据,做好数据清洗和预处理工作。确保你的数据已为“旅程”做好准备,这样你才能避免那些错误的“转弯”,并确保能够到达你的目的地。

总结

在本节课中,我们一起学习了数据清洗与预处理在数据分析流程中的基础性地位。我们通过生动的类比理解了其必要性,并明确了其目标是确保分析过程的顺畅与结果的准确可信。现在,带着准备好的“数据”,去探索并做出伟大的发现吧。

059:自主学习课程

在本节课中,我们将了解吉斯商学院提供的灵活在线学习模式,它旨在帮助忙碌的学习者突破传统线性教育的限制。

概述

传统线性学习模式常常让聪明、勤奋但忙碌的人们错失教育机会。吉斯商学院通过提供可堆叠的在线内容,让学习者能够按照自己的节奏和方式学习。

学习模式的灵活性

上一节我们提到了传统学习的局限性,本节中我们来看看吉斯商学院提供的具体解决方案。其核心在于提供高度灵活的学习路径,适应不同学习者的需求。

以下是几种主要的学习方式:

  • 自定进度课程:学习者可以完全控制学习速度。
  • 获取可转录学分:完成课程可获得正式认可的学分。
  • 暂停与继续:可以根据个人安排随时暂停或恢复学习。
  • 转换与堆叠课程:允许在不同课程或项目间转换,并将已完成的学习成果堆叠起来。
  • 获取证书:完成特定系列课程后可获得专业证书。
  • 自定义学习路径:支持学习者以任何自己想要的方式进行学习。

教育内容与支持

无论学习者在教育旅程的哪个阶段,都能获得专家引领的教育。这些教育内容以不同的增量提供,既可以是系统性的“大块”知识,也可以是便于消化的“小块”内容。

最佳开始时机

关于何时开始学习,其核心理念可以用一个简单的公式表示:
最佳开始时机 = 你的时间
这意味着,最适合开始学习的时刻完全由学习者个人决定。

总结

本节课中,我们一起学习了吉斯商学院商业分析专项课程中倡导的自主学习模式。这种模式通过提供自定进度可堆叠学分灵活路径,打破了传统教育的线性束缚,让教育能够真正适配每位忙碌学习者的个人时间与目标。记住,开始学习的最佳时机永远是你准备好的那一刻。

060:遇见凯文·哈特曼教授

概述

在本节课中,我们将认识《用数据沟通》这门课程的讲师——凯文·哈特曼教授。我们将了解他的专业背景、核心工作理念以及他对本课程的期望。

讲师自我介绍

大家好,我是凯文·哈特曼,是《用数据沟通》这门课程的讲师。

我同时是谷歌芝加哥办公室的分析部门负责人,至今已在那里工作了大约六年。在加入谷歌之前,我曾在一家广告公司工作了很长时间。在那之前,我从事咨询工作,之后我攻读了两个硕士学位。

这两个学位分别是工商管理硕士和公共政策硕士。无论我身处何处,是咨询公司、广告公司,还是如今所在的谷歌,有一件事始终贯穿我的职业生涯。

这件事就是用数据讲述故事。我热爱这件事,一直对它充满热情,但我并非一开始就擅长此道。

用数据讲故事并非易事,但在我从事这类工作的二十年左右时间里,我逐渐学到了一些东西。

经验与心得

一路走来,你学会了正确的方法,也学会了错误的方法,从而能够巩固那些应有的好习惯,并避免那些不应有的坏习惯。

通过伊利诺伊大学和Coursera平台教授这门课程是一次美妙的经历。你能遇到来自世界各地的许多聪明、年轻以及经验丰富的人。交流的思想数量巨大,投入课程的想法和努力的质量也令人印象深刻。

课程寄语

基于所有这些原因,我非常高兴来到这里,非常高兴能成为这门课程的一部分,也非常高兴能成为你们学习经历的一部分。我热切期待在我负责的四个模块教学中,看到你们学习、成长,并在课程结束时,成为更懂如何用数据沟通、更精于此道的专业人士。

总结

本节课我们一起认识了凯文·哈特曼教授,了解了他丰富的行业背景、对“用数据讲故事”这一核心理念的执着,以及他对课程和学员的诚挚期待。在接下来的学习中,我们将跟随他的指导,深入探索数据沟通的艺术。

061:用数据沟通 📊

在本课程中,我们将学习如何有效地利用数据进行沟通。我们将从整体流程出发,探讨如何构思、开发并最终呈现数据可视化作品,而不仅仅是关注如何制作美观的图表。

我是凯文·哈特曼,谷歌分析部门负责人,也是本课程的讲师。数据可视化以及用数据沟通的实践是我非常热衷的领域。我们将以长远的视角来审视这一实践,涵盖从开始到结束的整个过程,探讨如何开发数据可视化并有效地传达信息。


课程结构 📚

我们将本课程分为四个模块。

上一节我们介绍了课程的整体目标,本节中我们来看看具体的课程结构安排。

以下是四个模块的主要内容:

  1. 背景与基础:我们将探讨大脑的工作原理,回顾数据可视化的历史,并为我们作为数据可视化从业者设定背景,理解这一实践的本质以及如何高效地进行创作。
  2. 流程与方法:我们将详细审视数据收集、故事构建、目标识别等整个流程的所有重要组成部分,这些对于完成最终能有效传达见解的数据可视化作品至关重要。
  3. 洞察与模式:我们将开始研究那些能够传达意义和洞察的图像与视觉元素。我们将寻找数据中的模式,并向你展示识别这些模式的技巧和提示。
  4. 优化与呈现:最后,我们将通过关注大量细节和技巧,将我们的数据可视化作品从“良好”提升到“卓越”。课程结束时,我们将掌握从构思到最终有效呈现数据可视化的完整沟通流程。

核心资源 📖

为了帮助你更好地学习,我们将使用一些核心资源。

以下是本课程将使用的主要参考资料:

  • 《Good Charts》:作者斯科特·贝里纳托。这本书深入探讨了创建数据可视化的过程,与本课程一样,它从长远视角审视这一实践。我们将从中汲取一些非常重要的概念。
  • 《The Wall Street Journal Guide to Information Graphics》:作者唐娜·王。唐娜·王在创建数据可视化的指南和所需的高度细节关注方面付出了巨大努力。这本书将教你如何运用技巧,将原本尚可的图表优化为出色的图形,例如利用前注意属性、恰当使用颜色和字体等。

此外,我还推荐以下资源以拓宽你的视野:

  • 大卫·麦克坎德莱斯的作品:他的著作如《信息是美丽的》、《知识是美丽的》等,将在数据可视化创作方面给我们带来灵感。
  • 《Visualize This》:作者内森·姚。内森·姚和他的网站“Flowing Data”在通过基于R的案例研究和课程来创建可视化方面做得非常出色。这本书结合其网站,为你如何使用工具(主要是R)实际创建可视化提供了深刻的见解。

核心理念与挑战 💡

在深入学习之前,我想提供一个核心理念,以便你了解我们看待数据可视化的角度。

你可能听过米开朗基罗的这句话:“每一块石头内部都藏着一尊雕像,雕塑家的任务只是凿去多余的部分,直到雕像显现。” 用数据有效沟通和创建可视化的实践与此非常相似,唯一的区别在于,我们的“石头”是数据

我们收集的信息中包含了大量不必要的内容。我们的工作是找到那些至关重要的部分。本课程中讨论的指南和规则将帮助你做到这一点。但这并非易事。

正如大卫·麦克坎德莱斯所言,可视化数据是他做过的最难的事情之一。部分原因在于,一个成功的数据可视化包含了太多要素。

本课程将逐一探讨所有这些要素。这不仅仅是一门教你制作漂亮图片的课程。我们将讨论数据可视化周围的所有背景和元素,确保你构建的视觉作品基础扎实、沟通正确,并最终能让你有效地向利益相关者传达数据洞察。


优秀案例与习惯 ✏️

大卫·麦克坎德莱斯创作了许多极其美观且富有洞察力的可视化作品。其中一个我特别喜欢的例子是,他运用对比手法展示了美国人每年看电视所花费的时间,与之形成鲜明对比的是创建维基百科这样的优秀资源所需的时间。这强烈对比了我们作为一个国家是如何分配时间的。

这样的可视化运用了许多我将教你使用的元素。此外,一个我们做得还不够的重要习惯是草图构思。上图来自大卫随身携带并记录想法的素描本。这是我们所有人都应该养成的习惯,这是该领域大师们实际的工作方式。它能让我们更有创造力、更高效、节省时间,并最终产生更好的成果。


第一模块预览 🔍

在第一个模块中,我们将讨论多个主题。

以下是本模块将涵盖的核心概念:

  • 数据可视化历史回顾:我们将回顾人类7000年来通过数据表达自我的经验,并从中汲取教训。
  • 现代工具概览:审视当前动态多变的数据可视化工具市场,并为你提供一种评估这些工具的方法。
  • 受众认知原理:理解你的受众如何从生理上解读你呈现的视觉信息,了解他们思维的工作原理,将帮助你构建符合他们认知方式的视觉作品。
  • 优秀可视化框架:我们将建立一个框架,来回答“什么造就了优秀的数据可视化”这个问题。通过理解这个框架和“优秀”的定义,我们可以朝着这个目标构建,确保最终产品是优秀的。

本节课中,我们一起学习了“用数据沟通”课程的总体介绍、结构、核心资源、核心理念以及第一模块的预览。我们明确了本课程将采取全面、深入的视角,而不仅仅是专注于图表的美观性。在接下来的课程中,我们将从历史、工具和原理开始,逐步构建有效数据沟通的完整知识体系。

062:数据可视化模块概述 📊

在本模块中,我们将探讨数据可视化的核心概念。我们将回顾数据可视化的历史,审视当前使用的工具,理解观众如何解读视觉信息,并最终学习一个评估数据可视化质量的框架。

历史回顾:七千年的数据表达 📜

上一节我们介绍了本模块的整体内容,本节中我们来看看数据可视化的历史。我们将回顾人类七千年来通过数据表达自我的经验。

从这段漫长的历史经验中,我们可以学到以下几点:

  • 人类很早就开始尝试用图形化的方式记录和传达信息。
  • 数据可视化的形式随着技术和社会需求的变化而不断演进。
  • 历史上的优秀案例揭示了有效沟通数据的基本原则。

现代工具:动态变化的市场 🛠️

了解了历史背景后,本节我们将目光转向当下。我们将审视当今使用的数据可视化工具,这是一个非常动态且不断变化的市场。

以下是评估和思考这些工具的一种方法:

  • 功能性:工具能创建哪些类型的图表?(例如,ggplot2 适用于复杂的统计图形,Tableau 擅长快速交互式仪表盘)。
  • 学习曲线:工具是否易于学习和使用?
  • 集成与协作:工具是否能与其他数据分析流程(如使用 Pythonpandas 库进行数据处理)顺畅集成,并支持团队协作?
  • 成本与可及性:工具是开源(如 Matplotlib)还是商业软件?其定价模式如何?

理解观众:视觉的生理与认知解读 👁️

掌握了工具概览,我们需要理解这些工具产出的内容是为谁服务的。接下来,我们将探讨你所面对的观众是如何从生理和认知层面解读你呈现给他们的视觉图像的。

理解观众思维的工作方式,将帮助你构建出符合他们认知习惯、能有效传达信息的可视化作品。核心在于让视觉编码(如位置、长度、颜色)能够被观众快速、准确地解码。

评估框架:何为优秀的数据可视化?✅

最后,我们将学习一个框架,用以回答一个核心问题:什么才是优秀的数据可视化?

通过理解这个框架和对“优秀”的定义,我们可以朝着这个目标去构建,确保最终产出的是高质量的作品。该框架通常涵盖以下几个维度:

  • 准确性:可视化是否真实、无误导地反映了数据?
  • 清晰性:主要信息是否一目了然?
  • 效率:观众能否以最小的认知努力获取最多的信息?
  • 美观性:设计是否在满足功能性的同时具有视觉吸引力?


本节课中,我们一起学习了数据可视化模块的四个支柱:从历史中汲取经验,了解现代工具市场,深入理解观众的认知过程,以及掌握评估可视化质量的框架。这些知识将为后续学习如何具体创建有效的数据可视化打下坚实基础。

063:数据可视化历史研究 📊

在本节课中,我们将追溯数据可视化的漫长而丰富的历史,了解人类如何利用数据进行沟通。我们将看到这门学科如何随时间演变,逐步增加能力,并应对许多至今仍非常熟悉的问题。最终,它真正融合了艺术与科学。

概述

数据可视化的历史可以追溯到人类存在的早期,并可以围绕八个不同的时代进行划分。每个时代都存在一个转折点,推动我们从历史的一个阶段进入下一个阶段。

八个历史时代

时代一:早期地图与图表阶段(1600年以前)

在这个时代,人类使用数据(主要是地图)来理解周围的世界,并通过视觉方式展示,以便分享信息、记录和测量日常生活中的事物。这成为了我们社会互动和理解世界的关键部分。

以下是该时代的特点:

  • 人类使用地图来理解世界。
  • 视觉展示用于分享信息和记录测量结果。
  • 这成为社会互动和认知世界的基础。

时代二:测量与理论时代(17世纪)

进入17世纪,随着我们对世界的理解加深,测量能力也在增长。克里斯托弗·沙伊纳的太阳黑子图就是一个很好的例子,它展示了人类开发工具记录数据(太阳黑子),并将其转化为视觉形式来讲述故事。

以下是该时代的进展:

  • 测量工具和能力得到发展。
  • 数据被转化为视觉形式以传达信息。
  • 出现了更多重要的可视化实例。

时代三:新视觉形式的探索时代

接下来,熟悉用数据沟通的艺术家们开始探索新的视觉形式。他们使用我们今天所知的前注意属性(如颜色、阴影等),以创造性的方式快速向观众传达洞察。

以下是该时代的创新:

  • 艺术家探索创造性的数据沟通方式。
  • 开始利用颜色阴影等前注意属性。
  • 目标是让观众快速获得洞察。

时代四:现代图形的开端时代

在这个时代,我们开始看到真正意义上的数据可视化扎根。威廉·普莱费尔引入了饼图,这至今仍是数据可视化的重要组成部分。条形图折线图等视觉形式也在此时代确立,并将持续影响未来。

以下是该时代的标志性贡献:

  • 威廉·普莱费尔引入了饼图
  • 条形图折线图开始普及。
  • 现代数据可视化的基础得以建立。

时代五:数据分析的黄金时代(19世纪下半叶)

在这个阶段,艺术家们收集数据,并使用可视化来最佳地传达这些数据。一些伟大的例子包括约翰·斯诺对伦敦霍乱和宽街水泵的流行病学研究,他的可视化改变了人们对这种疾病传播方式(从空气传播到水传播)的认识。弗洛伦斯·南丁格尔利用图表有力地说明了英军改善卫生条件的必要性。查尔斯·布斯则用颜色展示了伦敦的贫困状况,抓住了问题的情感核心。

此外,这个时代还诞生了可能是有史以来最伟大的数据可视化作品——描绘拿破仑进军莫斯科及撤退的图表。这幅作品包含了士兵伤亡人数、温度、距离等大量信息,至今仍被视为通过图形传达洞察和故事的最佳典范。

以下是该时代的杰出案例:

  • 约翰·斯诺的霍乱疫情地图。
  • 弗洛伦斯·南丁格尔的极区图(玫瑰图)。
  • 查尔斯·布斯的伦敦贫困地图。
  • 查尔斯·约瑟夫·米纳德的拿破仑东征图。

时代六:现代黑暗时代与反弹

然而,到了20世纪,我们似乎有些过度热衷于创建图形,导致一些图表变得过于复杂、堆砌,反而模糊了作者的本意。随之而来的是反弹,学术界兴起一股思潮,要求更高的准确性、更多的控制和标准化的语言,为了准确性而限制了创造性。这导致了我们今天所知的剪贴画的泛滥——用标准化的图标代表特定数据。

但在这个时期,我们也看到了一些有价值的引入。亨利·贝克的伦敦地铁地图就是一个著名的例子,它简洁优美地描述了一个复杂的系统,更重要的是,它并不追求地理上的绝对精确,这在一定程度上是对学术反弹的反抗,证明了图像即使不精确也能发挥重要作用。

同时,计算机(如哈佛大学的Mark I)在这个时代被引入。尽管其能力还不如我们今天手中的手机,但它为数据可视化艺术家创造了新的可能性。

以下是该时代的矛盾与发展:

  • 过度复杂的图形导致意义模糊。
  • 学术界强调准确性,催生了剪贴画的标准化图标。
  • 亨利·贝克的伦敦地铁图是简洁有效的反例。
  • 计算机(如Mark I)的引入为未来开辟了新道路。

时代七:数据可视化的重生时代

在这里,计算机开始扮演更重要的角色。我们可以处理更多数据,进行更复杂的分析,并添加以前没有的元素。随着我们磨练这些技能,我们进入了最后一个时代。

以下是该时代的特征:

  • 计算机处理数据的能力增强。
  • 可视化变得更加复杂和精细。
  • 为进入高清数据分析时代奠定了基础。

时代八:高清数据分析时代(当今)

这是我们今天所处的时代。可视化几乎总是由计算机或某些应用程序创建,它们处理海量信息,并利用我们过去在数据可视化中学到的一切知识,来创建高效、有力且强大的视觉作品。

以下是当今时代的特点:

  • 可视化由计算机或专业应用生成。
  • 能够处理vast amounts of information(海量信息)。
  • 综合历史经验,创建高效强大的视觉作品。

总结

本节课我们一起学习了数据可视化的八个历史时代。这段漫长而丰富的历史展示了人类如何从简单的手绘地图和笔记,发展到今天拥有生成图表的强大能力。有趣的是,现在的工具甚至已经超越了我们的创造力,而在过去,工具常常限制人们用数据沟通的想法。在这段历史长河中,我们应对了数据稀缺、人类政治、数据误用以及剪贴画的泛滥等问题,最终达到了我认为艺术与科学最纯粹、最美丽的融合——即通过视觉和数据可视化进行沟通的理念。理解这段历史,有助于我们更好地运用和发展数据可视化这一强大工具。

064:理解当今的数据可视化工具 📊

在本节课中,我们将要学习如何理解当今快速变化、充满活力的数据可视化工具市场。我们将通过一个简单的框架来梳理这个市场,帮助你选择适合自己需求的工具。

为了清晰地理解数据可视化工具市场,我们可以借助两个关键维度来评估它们:易用性功能广度。易用性指学习工具的难易程度、访问所需功能的便捷性以及使用效率。功能广度则指工具是功能全面,还是专注于完成特定任务。

使用这两个维度,我们可以将市场大致划分为一个2x2的矩阵,并识别出不同象限中的工具类别。接下来,我们逐一看看这些象限。

以下是四个象限的具体分析:

  • 左上象限:易用但功能有限
    这个象限包含的工具非常易于使用,但功能范围有限。它们通常能出色且快速地完成一次性或特定的任务。你应该将这些工具保留在你的“工具箱”中,以备不时之需。

  • 右上象限:易用且功能强大
    这个象限的工具既强大又易于使用。你应该选择其中一两个作为你大部分数据可视化工作的基础,使其成为你的“主力工具”。Tableau 就是这个象限的一个完美例子,它易于使用、社区庞大,是许多数据可视化从业者的首选工具。你可以将大约75%的工作交给这类工具。

  • 右下象限:功能强大但较难掌握
    这个象限的工具功能极其强大,但学习曲线相对陡峭,使用起来可能不那么便捷。强大的功能是以牺牲部分易用性为代价的。然而,这并不意味着你应该避开它们。事实上,在分析数据、从信息中发现视觉模式和规律时,这些工具可能至关重要。我个人非常推崇的工具是 R。它是一个开源、免费的工具,拥有庞大的社区贡献者,提供了海量的帮助文件、新功能、扩展包和脚本。如果你要在这个象限学习一个工具,我推荐 R。当然,还有其他工具也能满足多种需求,但我认为 R 的效率无与伦比。

  • 左下象限:难用且功能有限
    任何既难用又没有突出功能的工具,都应该立即从你的工具箱中剔除。没有必要在这样的工具上浪费时间。

以上就是对数据可视化市场的一个高层概览。我提到的具体工具可能并不比我们为这个市场建立的心智框架更重要。我推荐的方法是,根据工具的易用性和其提供的功能广度来评估它们。任何难学且对你而言没有突出能力的工具,都可以果断放弃,因为在这个快速发展的市场中,你总能找到替代品。

你最高频使用的、作为数据可视化“锚点”的工具,应该来自右上象限——易用且功能强大。而左上象限和右下象限的工具,你将根据具体需求和任务,偶尔使用。

在这个市场中,我们的诀窍是保持警惕。每天都有新工具出现,市场随着我们数据经验的积累而飞速变化,几乎不可能完全跟上。事实上,这里的概览图更多是示意性的,而非直接的使用指南。

因此,作为一名数据沟通者,你应该挑战自己,沉浸在这个市场中,了解新出现的工具。既要拥有你熟悉、使用并喜爱的工具,也要始终对新工具保持开放态度。

本节课中,我们一起学习了如何通过易用性和功能广度两个维度来理解数据可视化工具市场,并了解了不同象限工具的特点和适用场景。记住,选择工具的关键在于匹配你的需求,并保持对市场动态的关注。

065:通过视觉建立联系 👁️

在本节课中,我们将要学习人类如何处理视觉信息,以及如何利用这一认知原理来创建更有效的数据可视化图表。理解受众的思维过程,能帮助我们更好地传递信息,并利用“前注意属性”快速与受众建立联系。

视觉感知与大脑处理

上一节我们介绍了视觉沟通的重要性,本节中我们来看看视觉信息是如何被大脑处理的。我们的眼睛是绝佳的工具,但真正“看见”事物的是我们的大脑,而非眼睛。因此,当我们创建用于沟通的视觉图表时,应思考这些图像将如何在受众的大脑中留下印象。人脑是一个复杂且令人困惑的器官。

以下两个研究很好地说明了这一点:

  • 著名的“门”研究:研究中,一位研究员请公园里的受试者看地图指路。当受试者全神贯注于解读地图(这动用了最复杂的前额叶皮层)时,一群人抬着一扇门从中间穿过,第一位研究员趁机躲到门后,由第二位研究员接替出现。绝大多数受试者完全没有注意到交谈对象已换人,继续指路。这表明,当前额叶皮层高度活跃时,我们会超负荷,从而忽略最简单的事情。
  • 莫伦·瑟夫的“选择解释”研究:研究员向受试者展示两张异性的照片,询问哪张更有吸引力。在受试者做出选择(这依赖于大脑中更底层、更本能、负责“战或逃”反应的部分)后,研究员将受试者未选择的那张照片递给他们,并要求解释选择原因。结果,几乎每次受试者都会继续编造一套复杂的说辞,来解释他们为何选择了自己最初并未选择的人。这说明,如果受众不理解故事脉络或数据,他们就会自行编造信息来填补空白。

沟通的挑战与目标

作为数据沟通者,我们面临的危险正在于此:要么让受众过度思考而感到困惑,要么(在极端情况下)导致他们为我们试图讲述的故事编造出自己的叙事。

我们经常思考大脑左右半球的分工,但较少考虑底层大脑(情绪、本能)与前额叶皮层(理性、语言)的差异。作为数据沟通的“艺术家”,我们需要设法绕过前额叶皮层,让它保持平静,转而用能够触动底层大脑(即认知中非常情绪化的部分)的信息和视觉来打动受众。

利用前注意属性

人类天生擅长察觉差异,无论是形状还是颜色的差异。在构建数据可视化时,我们有一整套可用的“前注意属性”。

以下是我们可以利用的一些关键前注意属性,以在视觉中传达观点、吸引注意力,真正触及大脑的底层部分:

  • 颜色:例如,color = "red" 用于突出显示关键数据点。
  • 大小:例如,在散点图中,size 可以代表数值大小。
  • 形状:例如,使用不同的 marker(如圆形、方形、三角形)来区分数据类别。
  • 位置:例如,在坐标轴 (x, y) 上的相对位置。
  • 长度/宽度:例如,在条形图中,条形的 length 直接对应数值。
  • 方向:例如,线条的 slope(斜率)表示趋势。
  • ** enclosures**:例如,用方框 border 将相关元素分组。

这些技巧看似简单,但如果真是如此,为什么我们仍然会创建出杂乱无效的图表呢?我认为原因在于,我们并不完全理解创建数据可视化、进行数据沟通所需遵循的全部规则和准则。本课程的目的正是帮助你掌握这些。

创建有效可视化的核心原则

理解大脑工作原理将帮助我们创建更好的数据可视化。在此过程中,我们需要牢记以下几点:

  1. 以设计和信息为核心:无论试图沟通什么,都要围绕核心信息进行设计,并将其置于最突出、最中心的位置。
  2. 思考受众的解读方式:仔细思考受众将如何解读我们呈现给他们的内容、我们试图讲述的故事以及所使用的视觉元素。我们的目标是尽可能让前额叶皮层保持静止和安静。实际上,我们不希望受众思考太多,而是希望传递的信息如此易于理解和解读,以至于他们无需耗费精力启动前额叶皮层来自行填补空白或将注意力从我们的核心信息上移开。
  3. 善用前注意属性:前注意属性无疑会有所帮助,我们将在课程后续深入探讨。但最重要的是要明白,创建出色的数据可视化并成为有效的数据沟通者,不仅仅在于用好颜色、阴影或任何单一属性。这些只是从数据中提取信息,并以能精准传达给受众的方式进行有效沟通这一庞大而复杂过程中的一环。

本节课中,我们一起学习了人类处理视觉信息的认知基础,明白了让沟通绕过理性的前额叶皮层、直达感性底层大脑的重要性。我们介绍了“前注意属性”这一关键工具,并确立了以受众为中心、以信息为核心的设计原则。掌握这些是成为高效数据沟通者的第一步。

066:评估数据可视化的有效性

在本节课中,我们将学习如何评估数据可视化的有效性。我们将通过分析一些优秀的可视化案例,并引入一个实用的定义和框架,来回答“什么是好的数据可视化”这个问题。

优秀可视化案例赏析

以下是几个广受赞誉的数据可视化实例,它们有效地传达了信息。

  • “十亿美元项目”:由David McCandless创作。他收集了各种涉及“十亿美元”规模的支出数据,并将它们按相对大小呈现在一个图表中。这个图表揭示了不同支出规模的对比关系,非常直观。
  • 麻疹疫苗接种影响图:这张图展示了美国各州从1928年到21世纪初的麻疹病例发生情况。颜色越深表示病例越多。可以清晰地看到,在20世纪60年代中期引入麻疹疫苗后,病例数量急剧下降。
  • 实物可视化案例:这是一个“照片数据可视化”的例子。它用冰块来代表北极冰盖的面积:2008年的冰块代表183万平方英里,而四年后的冰块则展示了全球变暖对冰盖面积的影响。这个视觉形式非常有力。

有效数据可视化的四要素框架

上一节我们欣赏了几个优秀案例,本节中我们来看看是什么让这些可视化如此成功。一个被广泛认可的框架指出,有效的数据可视化需要四个核心要素协同作用。

当这四个要素齐备时,你才能进行有效的沟通,创造出成功的数据可视化。以下是这四个要素:

  1. 信息:这是指数据本身。我们收集的数据必须准确、深入且可靠。数据质量越高,可视化的基础就越好。如果没有数据作为基础,我们创造的就不是数据可视化,而是其他东西。
  2. 目标:这是我们所收集数据的功能目的,即我们希望通过可视化实现的客观目标。这个目标将聚焦我们的故事和数据收集,赋予工作明确的方向。没有目标,数据就会变得杂乱无章,失去意义。
  3. 故事故事是将数据引向目标的连接组织。它通过叙事引导观众。没有故事,我们只是在抛掷事实和数字,很难与观众建立联系。
  4. 视觉形式:即使具备了前三个要素,仍然不够。数据、目标和故事必须通过视觉形式才能有效地传达给观众。否则,我们得到的只是一份充满文字和要点的报告,容易让观众感到乏味或分心。视觉形式是我们与观众沟通的最有力方式。

框架的重要性

这个四要素框架之所以重要,有以下几点原因。

  • 它为我们提供了“什么是好的数据可视化”这一问题的清晰答案和理解路径。
  • 它超越了仅仅评价“漂亮的图片”,涵盖了创作过程的所有环节,迫使作者确保每个要素都坚实可靠。
  • 它很好地传达了这些要素共同构成一个和谐整体、相辅相成的理念。

因此,这个框架是我们思考和评估数据可视化有效性、以及在本课程中如何进行数据沟通的正确方法。

本章总结

本节课中,我们一起学习了如何评估数据可视化的有效性。我们首先回顾了几个优秀的可视化案例,然后引入并详细阐述了构成有效数据可视化的四要素框架:信息目标故事视觉形式。这个框架为我们提供了评估和创建高质量数据可视化的清晰指南。

067:快速工作与慢速思考概述 🚀🧠

在本模块中,我们将探讨在数据爆炸式增长的时代,如何高效地处理数据并深入思考。我们将学习数据收集与获取的方法,聚焦于沟通目标,并规划如何将数据转化为有说服力的故事。此外,我们将引入一家名为Bellabe的公司作为贯穿本模块的案例,用以具体说明相关概念。

我们将继续沿用成功数据可视化的整体框架。在本模块的第一课,我们将从审视“数据”本身开始。


上一节我们介绍了本模块的整体学习目标,本节中我们来看看模块内容的具体构成。

以下是本模块将涵盖的核心概念:

  • 数据的惊人增长:我们将探讨数据量如何以难以置信的速度膨胀。
  • 数据收集与获取方法:我们将评估分析师收集和访问数据的不同途径。
  • 聚焦沟通目标:我们将学习如何围绕一个具体的目标目的来规划沟通旅程。
  • 规划数据故事:我们将讨论如何构建数据故事,它如同结缔组织,连接起我们收集的数据和我们期望达成的目标
  • 案例公司引入:我们将介绍Bellabe公司,它将在后续的课程视频中作为案例反复出现,帮助我们理解新概念。

本节课中我们一起学习了模块“快速工作与慢速思考”的核心内容与学习路径。我们明确了将探讨数据增长、处理方法、沟通聚焦点以及数据故事规划,并认识了案例公司Bellabe。接下来,我们将深入第一个主题:数据的惊人增长。

068:理解数据增长 📈

在本节课中,我们将要学习数据增长的现状与规模,理解我们正身处一场前所未有的数据爆炸之中,并探讨这对商业分析领域意味着什么。

数据爆炸的时代

我们正经历着世界有史以来最大规模的数据扩张。这创造了一个前所未有的环境:理解如何与数据有效沟通变得至关重要。仅在过去的两年里,世界上90%的数据被创造出来,这确实非常惊人。

我们周围的数据爆炸有时会让我们失去对数据真实规模的感知。为此,我基于David McCandless的一个概念,制作了这张数据可视化图表。

每日数据生成量对比

以下是一张每日数据创造量的对比图,它能让我们直观地看到每天产生的海量数字数据。这些数据可以被移动、访问、分析,并用于讲述故事。

我收集了多个来源的数据,并将它们放入这张图表中,通过调整方框的大小来反映数据的相对规模。这为我们提供了关于数据生成量的良好相对洞察,同时也通过与一些线下数据的对比,显示出数字数据的庞大。

  • 每日45亿次 Facebook点赞。
  • 每日40亿次 YouTube视频观看。
  • 每日35亿次 Google搜索。

对于营销人员而言,这些都是极其丰富和有价值的信息来源,让我们能够了解消费者的喜好、厌恶和需求。这些正在生成的数据,为我们提供了营销史上乃至世界史上从未有过的深刻洞察。

数据的相对规模

那么,这些数据到底有多庞大呢?图中那个尚未揭示的棕色方框代表了全球每日咖啡消费的杯数。咖啡可以在世界任何地方消费和购买。

而图表中的其他所有数据,仅由全球约40%能够上网的数字人口所生成。右下角那个小小的蓝色方框,则代表了上一次总统选举的投票总数,而那是每四年才发生一次的事件。

这一切对比,真正让你感受到每天正在生成多少信息与数据——这些有用、有价值、有洞察力的数据,可以用来讲述精彩的故事。

数据催生的行业增长

正因如此,使用和处理这些数据的行业与公司也经历了类似的增长路径。Scott Brinker的一项分析很好地标记了这一点。

2011年,Scott整理了一张信息图,在数据社区中广为传播。他基本上收集了在这个非常新颖、初生的营销技术领域运营的所有公司的标志,并对它们进行了分类。这是人们第一次看到所有在这个数据领域工作的公司,它们处理生成的数据,理解它,并以此开展可行的商业活动。

当时是2011年,这张图非常受欢迎,以至于Scott决定在第二年、第三年持续修订。他发现的结果令人惊讶:

  • 2011年150家公司。
  • 2012年350家公司。
  • 2014年1,200家公司。
  • 2015年/2016年:这个数字跃升至3,500家。2016年发布的图表显示有5,000家公司。
  • 2018年:Scott生成的最新图表显示,目前有近7,000家公司在利用这些被创造的数据,从事营销技术领域的工作。

确实,从未有一个时代像今天这样,理解数据并知道如何与数据沟通变得如此重要。

变革才刚刚开始

然而,即便有所有这些数字,这可能还不是我想分享的最重要的数字。那个数字也许是这个:1%

这来自麦肯锡最近的一项研究,该研究发现,技术将给我们个人和职业生活带来的变化,我们仅体验了其中的1%。我们甚至还没有开始。

因此,面对我们现在已经生成并可以处理的所有数字和数据,我们正处在这场旅程的起点。如果说曾经有一个时刻需要理解如何使用数据来沟通,那么现在就是开始学习这些任务和技能的时候。

总结

本节课中我们一起学习了数据沟通的重要性。我们正身处一场巨大的数据爆炸之中,正如我们所看到的,每天都有超乎寻常的数据被生成,这些都是有用、丰富、至关重要的信息,可以讲述非常精彩的故事。新的公司、新的行业正从这些数据中涌现,因为它极具价值和丰富性。

然而,我们正在经历的这场革命,仅仅看到了一个非常、非常微小的开端。这一切将继续下去,随着时间的推移,我们将看到更大的变革。

069:第二讲 第二部分 数据访问方法的评估

在本节课中,我们将要学习如何评估获取数据的几种主要方法。数据是商业分析的基础,了解如何高效、合规地获取数据至关重要。

上一节我们讨论了数据在商业分析中的重要性及其爆炸式增长。本节中,我们来看看获取这些数据的具体途径。

三种主要的数据访问方法

作为分析师,我们主要通过三种方式来获取用于数据沟通和分析的数据:批量下载、应用程序编程接口和网络爬虫。让我们逐一审视。

批量下载 📥

批量下载是指数据所有者为你提供了一个专门的地方来收集数据。这是一种受控的数据发布方式,既包括公司内部数据,也包括第三方数据下载站点。

这些批量下载区域通常是通过图形用户界面访问的数据表。这个界面是专门为了让你获取数据而构建的。数据所有者希望你获得这些数据,并为你搭建了获取桥梁。

这种方法使数据所有者能够决定发布哪些数据、保留哪些敏感信息。它还能让数据所有者限制你获取的数据量,并根据你的登录身份来区分访问权限。这是获取数据最简单的方式。

以下是批量下载的一些例子:

  • 美国人口普查数据:通过“美国事实查找者”网站,可以非常简便地访问大部分人口普查数据。
  • IMDB(互联网电影数据库):虽然隐藏得较深,但它也提供了一个供个人访问数据的批量下载源。
  • Kaggle:每周会通过邮件发送有趣的新数据库链接,这本质上也是批量下载。

应用程序编程接口 🔌

第二种访问数据的方式是API。API的核心思想是让计算机与计算机对话,建立机器对机器的连接。

为自己建立API连接需要一些脚本语言知识,并使用包含令牌和密钥的命令集进行安全访问。其设计初衷是全自动的机器对机器交互。

虽然分析师可以构建自己的API访问工具来获取数据,但通常我们想要的数据通过批量下载方式获取会更好。不过,API在某些情况下也能很好地工作。

例如,Google Maps API的脚本调用可能如下所示:

import requests
response = requests.get('https://maps.googleapis.com/maps/api/geocode/json?address=YOUR_ADDRESS&key=YOUR_API_KEY')

实际上,与其自己编写API调用代码,你可以利用一些对用户友好的API封装网站。例如,Tweet Binder 提供了一个漂亮的图形界面来输入信息,它背后会调用Twitter API,获取数据并清洗干净后返回给你。这种方式虽然使用了API,但你是通过别人的图形界面访问的,比自行编写API脚本更高效。

网络爬虫 🕷️

第三种访问数据的方式是网络爬虫。在互联网早期,这曾是一种“黑帽”的数据获取方式,即偷偷获取所需数据。

如今,这种方法已不常使用。因为我们周围有如此丰富的信息,许多组织和数据所有者都愿意提供数据,几乎没有理由去爬取那些本不打算给你的数据。

Sophie Cho曾通过一个决策树矩阵来分析是否应该构建网络爬虫,结果几乎所有路径都指向“不要构建”。原因如下:

  1. 如果你需要从HTML网页或其他来源爬取数据,通常意味着数据所有者没有为你打包好这些数据。
  2. 如果数据所有者希望你拥有这些数据,他们会通过API或批量下载站点提供。
  3. 这些数据通常受版权和其他许可协议保护。
  4. 虽然有时复制粘贴HTML页面数据很容易,但更常见的情况是需要相当复杂的Python或其他语言编程才能获取你想要的数据,而这些数据可能本就不打算给你。

总结

本节课中,我们一起学习了分析师获取数据的三种主要方法:批量下载API网络爬虫

总的来说,批量下载站点应该构成我们分析所用数据的绝大部分来源,无论是公开数据还是公司内部数据。API在某些情况下可以很好地工作。而网络爬虫,作为分析师,我们最好将其留在身后,优先选择更合规、更高效的数据获取方式。

070:聚焦你的沟通之旅

在本节课中,我们将学习如何为你的数据可视化沟通设定明确目标,并引入一个强大的框架来组织数据和故事,确保你的分析工作高效且有针对性。

确立沟通目标 🎯

上一节我们介绍了沟通的重要性,本节中我们来看看如何为你的数据可视化沟通之旅确立一个清晰的目标。

为你的沟通和数据可视化设定一个目标至关重要。这个目标将使你在收集数据时保持专注。它为你要构建的叙事和故事赋予目的,将数据与最终目标连接起来。最终,这将为你节省大量时间,并让你作为一名分析师更加高效。这个目标,正如我们所见,是评估一个成功数据可视化框架中的关键要素。

五大商业目标 📊

作为一名商业分析师,你可以设定多种目标和目的。但总体而言,任何公司都拥有五个广泛的商业目标。这五个目标可以被认为是 MECE 的——即相互独立,完全穷尽。每一个目标都与其他目标截然不同,而它们共同构成了我们可能希望达成的所有目标。这些目标层次较高,但当你将世界上所有的商业目标归结为五个时,保持一定的概括性是必要的。

以下是五个核心的商业目标:

  • 建立品牌认知
  • 影响购买考虑
  • 优化销售流程
  • 重塑品牌定位
  • 培养客户忠诚

这五个目标的美妙之处在于,它们可以通过一个简单的问题来清晰区分。你可以问自己:消费者是否回忆并认可我的品牌?如果没有达到你的期望,那么你就存在“建立品牌认知”方面的问题,公司应将“建立更好的认知”设为目标。以此类推,你可以为这五个目标中的每一个进行类似的诊断。

这五个目标将成为我们进行任何分析时的焦点。我们通常需要专注于其中单一的一个目标。虽然世界上任何公司都可能希望在这五个方面都做得更好,但当我们构建数据故事和叙事并试图保持专注时,选择一个单一目标是明智的。这并不意味着其他目标无关紧要,而是意味着我们当前的分析焦点是集中的。

引入组织框架:消费者决策旅程 🧭

有了目标之后,我们仍然需要理解所收集的大量丰富数据。这时,一个组织框架或哲学将大有裨益。当我在处理营销数据或面向商业目标分析消费者时,我最喜欢的框架是 消费者决策旅程

这个框架源自麦肯锡的研究,旨在修订和振兴传统的营销漏斗模型。漏斗模型认为,消费者从众多公司开始,逐渐筛选,最终在购买前选定一家。然而,在数字时代,消费者能够获取海量信息,购买过程变得更加流动。从消费者的视角来看,漏斗模型实际上更像是一个我们称之为“消费者决策旅程”的循环过程。

这个旅程始于某个触发点。某件事促使消费者意识到需要一款产品,例如鞋子穿不下了、电脑坏了或汽车出故障了。这促使消费者进入市场购买新产品。

消费者将经历以下几个阶段:

  1. 考虑阶段:消费者会想到一个“初始考虑集”,即立即浮现在脑海中的几个品牌。例如,想买新运动鞋时,可能会立刻想到阿迪达斯、耐克、彪马等。这并不意味着一定会购买它们,只表明这些品牌认知度最高,进入了初始考虑集。
  2. 评估阶段:消费者开始评估各个品牌,新的品牌也可能在此阶段进入视野。随着获取新信息,消费者评估的品牌集合会动态变化。
  3. 购买阶段:消费者最终做出购买决定。
  4. 购后体验阶段:消费者评估产品是否达到预期,是否满足需求。
  5. 忠诚循环:如果产品令人满意并成为所爱,品牌的目标就是让消费者进入“忠诚循环”。当下次产生同样需求时,消费者将跳过考虑和评估阶段,直接再次购买该品牌产品,并成为该品牌的倡导者。

这个框架非常有效,适用于任何购买决策,从房屋、汽车到一包口香糖。对于投资较小的商品,这个过程可能更快,但它很好地解释了消费者思考购买决策的方式。

目标与框架的结合 🔗

现在,这个框架如何与我们的目标结合呢?你可以将之前介绍的、与每个目标对应的五个问题,直接映射到消费者决策旅程的不同阶段。

例如:

  • 如果我发现消费者无法回忆或识别我的品牌,我需要建立品牌认知。那么,我需要重点关注考虑阶段,让品牌进入消费者的初始考虑集。
  • 如果我发现我生产的产品不符合目标消费者的需求,我需要影响购买考虑。那么,我需要改善品牌在消费者评估阶段的地位。

以此类推,每个目标都能在消费者决策旅程中找到对应的焦点阶段。根据最相关的目标,它能指引我关注旅程中的特定方向。

总结与意义 📝

本节课中,我们一起学习了如何为数据沟通设定清晰目标,并利用消费者决策旅程框架来组织分析。

目标与框架的结合,不仅聚焦了我们收集的数据,也聚焦了我们将要进行的分析,并最终聚焦了我们要讲述的故事。通过专注于一个单一目标,并将其与消费者决策旅程中一个非常具体和独特的节点联系起来,我们的工作将变得高效且有力。

这种实践对于有效的数据可视化和数据沟通至关重要。因为我们被海量数据包围,需要某种组织框架来理解它;我们也需要某种焦点来防止偏离轨道。周围的高数据量意味着我们必须建立这些机制。这些框架确实能帮助我们理解非常复杂的数据故事和数据收集过程,对它们进行分类,并最终找到一个可以讲述故事的切入点。同时,我们选择的目标将开始为我们想要讲述的故事提供背景。正如我所提到的,麦肯锡的消费者决策旅程框架,对于任何涉及营销或商业、涉及消费者的分析,都是一个极佳的组织框架,能帮助我理清目标并为分析指明正确方向。

071:规划你的数据故事 📊

在本节课中,我们将学习如何规划一个有效的数据可视化故事。我们将探讨如何构建数据与目标之间的逻辑桥梁,并介绍一种强大的组织工具——明托金字塔原理,来帮助我们清晰地构建叙事。

从数据到故事

上一节我们讨论了如何设定清晰的目标。本节中,我们来看看如何将收集到的信息与我们的目标连接起来,形成一个连贯的故事。这个故事是创建成功可视化的关键部分,它充当了数据和目标之间的“结缔组织”。

在这里,组织至关重要。我们需要让所讲述的故事条理清晰,以便有效地与受众沟通,并高效地引导他们理解整个叙事。

介绍明托金字塔原理 🏛️

为此,我想向你介绍芭芭拉·明托。她是一位麦肯锡顾问,提出了一套出色的概念,称为“明托金字塔原理”。

该原理的核心思想是:任何陈述都必须有事实支撑,并且该陈述必须是这些事实的完美总结

她还有几条具体规则:

  • 第一,我们做出的陈述,必须是对其下方支撑要素的良好总结。
  • 第二,用于支撑陈述的那些要素(事实),必须在某些方面具有相似性。它们应该是一个同类群体,例如都是“苹果”,而不是“苹果和橘子”。
  • 第三,展示事实的顺序,应该让受众感到自然。我们可以按发生时间(从最早到最晚)、按规模大小(从最大到最小)等方式排序,总之要符合逻辑。

我之前使用过这个术语,而“相互独立,完全穷尽”的理念正源于此。明托原理要求我们:在同一层级上的事实,应该是“相互独立,完全穷尽”的

当我们做到这一点时,我们就拥有了一个结构稳健、组织良好的故事。我们应该用这种方式来组织我们要讲述的故事。你不仅可以使用一个金字塔,还可以根据故事中的章节或要点数量使用多个。这种组织方式非常重要。

从规划到数据收集

这种组织方式也能在我们开始规划如何收集和使用数据时,为我们提供指引。如果我们还没有一个明确的陈述或一组事实,我们可以将那个陈述替换为我们设定的目标。

我们将目标以陈述的形式表达出来。这样,上一课讨论的目标就成为了我们追求的核心。我们可能还没有事实,但我们有假设和关键问题。因此,我们可以开始思考这些问题是什么,并将它们组合起来。

如果我们能正确地阐述这些问题,并确保整个结构符合“相互独立,完全穷尽”的原则,这将帮助我们构建一个稳健、扎实的故事。我们需要将应用于最终陈述和故事的相同规则,也应用到规划过程中。这将指引我们走向正确的方向,最终产出我们想要的故事。

对于每一个关键问题或我们提出的假设,我们都希望用某种数据来支撑。通过这种方式,我们可以制定计划去收集信息、收集数据,以证明或反驳假设,回答我们提出的关键问题,并最终汇总成某个陈述。所有这些内容都能在一个组织良好的故事中完美地结合在一起。

案例分析:Bellabeat公司

这听起来有些复杂,让我用一个例子来说明。为此,我想介绍一家名为Bellabeat的公司。这是一家真实存在的公司,我们将用它来进行说明。

Bellabeat生产高科技、设计精美的仪器,主要面向孕妇。你在这里看到的设备叫做“Shell”,它允许孕妇听到胎儿的心跳,也可以反过来向胎儿播放音乐。

他们还有其他设计精良的产品。左边是“Leaf”,它是一款看起来更像珠宝的活动追踪器。右边是“Balance”,这是一款支持蓝牙的智能体重秤。所有这些产品都设计精良并融合了先进技术,但大多数产品并不为人所知。

无论是Leaf、Balance还是Shell,Bellabeat都面临着一个认知度问题。消费者,尤其是育龄女性,不知道这些产品的存在。尽管这些产品可能满足她们的许多需求,但她们就是不知道。

基于这个目标,我们可以在明托金字塔框架下进行构建。

在金字塔的最顶端,我们放置“提升认知度”这个目标,并以陈述的形式表达:为了增加Bellabeat的销售额(这是最终产出和目标),首先必须提升其品牌认知度。这样,我们就以陈述的形式捕捉了我们的目标。

在目标下方,我们开始列出一些关键问题,这些问题将帮助我们确定Bellabeat提升认知度的计划或方法。为了确保我们有一组“相互独立,完全穷尽”的问题,我喜欢做的一件事是:让一个问题以“是什么”开头,第二个以“如何”开头,第三个以“为什么”开头

如果我能就我的陈述回答“是什么”、“如何”和“为什么”的问题,我就知道我得到了一组相互独立的问题,并且对这个陈述有了非常全面和完整的视角。

在本例中,我会问:

  • 是什么:Bellabeat目前的认知度水平如何?(这显然是重要的信息。)
  • 如何:Bellabeat的认知度随时间发生了怎样的变化?
  • 为什么:为什么认知度对Bellabeat的产品采用至关重要?(用以验证我们的前提。)

在每个问题下方,你可以看到,我可以阐明一个数据来源来帮助我回答这个问题。通过这种方式,我形成了一个可视化的提纲,用于规划我将要进行的沟通旅程。我知道我将使用的数据能回答问题,而这些问题将支撑最终的目标。

你可以看到所有这些元素在故事层面是如何完美契合的。

总结

本节课中,我们一起学习了如何规划数据故事。

  • 我们看到了明托金字塔原理为我们组织数据故事提供了一个极佳的方法。它确保了我们做出的陈述都有事实支撑。
  • 它引入了“相互独立,完全穷尽”的概念,确保我们传达的是可靠的观点。
  • 其指导原则为任何故事提供了清晰、简洁的组织结构。
  • 这也将确保我们收集数据的方法和所做的分析是可靠的,因为它成为了我们开始的计划。

在本模块中,我们探讨了多个方面:我们看到了数据的爆炸式增长,认识到现在正是学习如何用数据进行有效沟通的最佳时机;我们评估了获取数据的方法;我们学习了通过使用目标和目的来聚焦沟通旅程的方法;最后,我们通过明托金字塔原理,学习了如何开始规划数据故事,并以可视化形式勾勒出一个良好的提纲。我们使用Bellabeat的案例来具体说明这些概念,并在后续课程中将继续使用这个案例。

072:数据可视化指南 🎨

在本模块中,我们将深入学习如何创建有效的数据可视化。我们已经探讨了定义优秀数据可视化框架的许多要素,现在将重点聚焦于视觉形式本身。

模块概述

上一模块我们完成了故事框架的构建。现在,我们将利用Bellevby案例研究,专注于分析“技术采用随时间变化”的数据,以回答“为何认知度对Bellevbe产品采用至关重要”这一核心问题。通过本模块的学习,我们希望展示技术随时间的采用如何导致其成功,并为我们预测Bellevbe新技术在市场中的采用速度提供参考。

模块学习目标

以下是本模块将涵盖的几个关键概念:

  1. 在数据中寻找模式:学习如何从数据集中识别有意义的趋势和规律。
  2. 规划可视化方法:在开始创建图表前,进行有计划的思考和设计。
  3. 理解优秀视觉形式的构成:掌握构成有效可视化图表的核心组件与原则。
  4. 引入一个分析框架:使用一个系统性的框架来评估和构建可视化。
  5. 创建引人入胜的数据可视化:学习如何让图表不仅清晰,而且具有吸引力和说服力。

学习路径

本模块将继续沿用之前指导我们的成功数据可视化框架。

在接下来的第一课中,我们将正式开始深入探讨视觉形式。从这节课开始,直到模块结束,我们的焦点都将放在视觉呈现上。

回顾Bellevby案例,我们已经完成了以下步骤:

  • 确定了分析目标。
  • 找到了关键业务问题。
  • 为每个问题匹配了相应的数据源。

目前,我们手头拥有“技术采用随时间变化”的数据。我们将从分析这些数据开始,寻找其中的模式,最终将这些分析结果转化为可供客户使用的、专业的数据可视化图表。


总结:本节课我们一起学习了模块三的总体目标与学习路径。我们明确了本模块的核心是掌握视觉形式的设计,并将通过一个完整的案例,逐步学习从数据中发现模式、规划设计到产出专业图表的全过程。接下来,让我们开始第一课,深入探讨优秀视觉形式的构成要素。

073:发现数据中的模式

在本节课中,我们将学习如何从数据中发现有意义的模式。我们将探讨数据可视化的目的,了解不同图表类型的适用场景,并学习如何根据分析阶段选择合适的可视化工具和技术。


概述:从数据到故事

现在我们已经拥有了数据,我们希望开始识别其中蕴含的“故事”。实现这一目标的最佳方式是将数据可视化,观察哪些模式会脱颖而出。通过可视化,我们能发现表格形式数据中难以察觉的信息。

但在深入之前,我们需要理解将要创建的不同图表类型。Baroninato 提出了一个很好的框架,通过回答两个关键问题来评估你处于沟通旅程的哪个阶段,从而决定应使用何种图表。


沟通旅程的评估框架

以下是两个关键问题:

  1. 你目前处于概念性阶段还是数据驱动阶段?你手头有数据吗?
  2. 你目前处于陈述性阶段(有明确信息要传达),还是仍在探索性阶段(仍在数据中寻找信息)?

根据你对这两个问题的回答,可以确定你在旅程中的位置,进而决定你需要投入的努力类型以及需要创建的图表类型。


图表类型的四象限框架

这两个问题很好地转化为一个 2x2 矩阵。在每个象限,你都将创建不同类型的图表。

  • 概念性 + 陈述性:你试图通过概念而非数据来讲述故事。此时创建的图表被称为 “想法说明”
  • 概念性 + 探索性:仍在探索如何将概念可视化呈现给受众。这被称为 “想法生成”
  • 数据驱动 + 探索性:我们正在数据集中进行探索,试图寻找故事。这被称为 “视觉发现”
  • 数据驱动 + 陈述性:基于数据做出陈述性声明,我们有一个故事要讲,并希望呈现给客户或受众。这可以称为 “日常数据” 或“客户就绪数据”。

在本课程中,对我们更重要的是这个框架的右侧,即数据驱动的部分。我们将主要讨论两个不同阶段:要么处于探索模式(有数据但尚未知故事),要么处于陈述模式(故事已定,需要沟通)。这将对我们在数据可视化上投入的打磨时间产生重大影响。


当前目标:寻找模式

我们当前的目标仅仅是寻找模式,因此无需打磨这些可视化图表。我们将创建的是工作产物,仅供我们自己查看。它允许我们测试假设或回答我们提出的问题。

在寻找模式时,我们将关注五种不同类型的模式:

以下是五种关键的数据模式:

  1. 变化:随时间的变化趋势或突然变化。
  2. 聚类:彼此相似但与其他数据点不同的数据点集合。
  3. 相对性:两个不同数据点之间的相互关系。
  4. 排名:最好、最差、最高、最低以及中间的一切。
  5. 相关性:一组数据如何影响或关联另一组数据。

这些模式中的每一种都可能揭示一个故事。


模式与可视化技术的匹配

当我们寻找这些模式时,某些可视化技术能有效地揭示它们。

例如,如果我们观察随时间的变化,折线图是一种很好的识别方式。饼图可能擅长描绘相对性,但它无法揭示变化趋势。将数据集放入饼图,无助于回答与变化相关的问题。

作为分析师,识别用于回答问题的技术,并确保它们与问题相匹配,这一点至关重要。

这种“变化类别”以及特定视觉形式适合每个独立类别的想法,并非数据独有。它也适用于概念性想法。当我们处理概念时,可能是在寻找描述、分类、结构、评估或流程。对于这些不同的概念性想法,都有一种有效的视觉形式,以及许多其他不适合该特定概念形式的视觉形式。同样,对于分析师而言,如果要揭示或陈述概念性想法,确保使用正确的视觉技术和视觉助记符来阐明观点非常重要。


案例实践:Bella Baby

让我们看看这个想法如何在实际中应用。我们将使用一直追踪的 Bella Baby 案例研究。目前,我们已拥有数据,并能够开始评估技术随时间的采用情况,以寻求回答“为什么认知度对 Bella Baby 很重要”这个问题。

如果我们获取这些数据并将其投入可视化,我们可能会使用的一种有效的视觉技术是折线图。从前面的讨论可知,这与我们的目标相符。该折线图将显示随时间推移的采用情况。从这个点出发,我们可以开始挑选出有趣的故事,这些故事要么能回答我们的关键问题,要么能让我们知道需要重新规划。


高效的可视化工具

此时,我发现一个有用的工具是 R 语言。我之前提到过 R,但 R 在高效处理和可视化大量数据方面表现出色。你可以快速创建箱线图、时间序列图、关系图、直方图等。借助 R 及其开发者社区的力量,你可以找到脚本和新的软件包(例如这里描述的 GGally 包),它们能实现其他程序无法做到的事情。在本例中,它可以在单个视觉图表中展示跨多种数据的巨大相关性,让你作为分析师清楚地知道故事在哪里,不在哪里。


核心要点总结

本节课中我们一起学习了从数据中发现模式的核心流程与原则。

这些对我们很重要,因为获取数据和数据故事最有效、最高效的方式就是将数据可视化并开始观察这些模式。要做到这一点,我们需要:

  1. 理解所处阶段:需要明白我们处理的是概念性事务还是数据驱动事务;需要知道我们是处于陈述故事的状态,还是仍在探索。
  2. 选择匹配的图表:对这些问题的回答决定了我们使用哪种图表类型。我们应用的视觉技术,无论是为了揭示还是最终传达模式,都需要与该模式相匹配。
  3. 掌握并应用技术:因此,作为分析师,熟悉可用的技术并知道何时适当地应用它们非常重要。
  4. 选择高效的工具:我们选择的工具应能非常高效地提供所需的视觉技术。此时,效率至关重要。我们不希望因为工具难以使用而在创建所需可视化时束手无策。学习那些能为你快速工作的工具,以便你能进入评估和分析的下一个阶段。
  5. 校准打磨程度:最后同样重要的是,根据你在沟通旅程中所处的阶段来校准所需的打磨程度。当我们对数据集进行探索性分析时,视觉效果是否出色并不重要,因为我们不会将这些视觉图表展示给客户或利益相关者,它仅供我们自己查看。

一旦我们开始进入 Baronnato 所称的“日常数据”或“客户就绪数据”阶段,我们才开始应用那些打磨技巧,利用前注意属性,做那些能让信息快速被记住的事情。但在当前探索阶段,这不相关,不必要,只会拖慢我们的速度。

074:创建数据可视化的计划性 📊

在本节课中,我们将要学习如何从探索性的数据可视化,过渡到面向客户或利益相关者的“日常数据可视化”。我们将重点介绍一个系统性的计划方法,以确保最终的可视化成果清晰、有效且专业。

上一节我们讨论了数据可视化的基础,本节中我们来看看如何通过周密的计划来提升可视化产出的质量。

从探索到交付的转变 🔄

创建数据可视化时需要有计划性。我们现在正从探索性可视化,迁移到日常的、面向客户的数据可视化。

在进行这种转变时,我们的方法需要改变。我们需要开始投入更多注意力到细节上。我们需要为可视化应用更多的润色,因为这是我们将要呈现给利益相关者的成果。因此,在这类可视化上投入的努力需要提升一个档次。

我们正从视觉发现阶段,转向日常数据可视化。Baronnato 提出了一个非常可靠的计划,来指导我们如何完成这个过渡。

一小时计划法 ⏳

Baronnato 提出,如果有一小时来创建一个日常数据可视化,他会这样分配时间:

以下是时间分配的具体步骤:

  1. 5分钟准备:用于创造所需的精神和物理空间,以便高效工作。
  2. 15分钟交谈与倾听:用于获取更多背景信息,了解受众是谁,并明确需要通过可视化达成的目标。
  3. 20分钟草图绘制:用于实际动手,在纸上绘制可视化的初步概念。
  4. 20分钟原型制作与改进:用于在软件中创建原型,并进行迭代优化。

详解各阶段任务

上一节我们介绍了整体时间规划,本节中我们来详细看看每个阶段的具体任务。

第一阶段:准备 (5分钟)

这最初的5分钟,纯粹用于清空思绪,为接下来的工作做好准备。

第二阶段:交谈与倾听 (15分钟)

此阶段的目的是理解你需要达成的目标。你已经有了一个很好的洞察,认为自己有一个好故事,现在需要验证它。与同事合作,确保方向正确、路径无误。一旦确认,就可以开始实际开发。

第三阶段:草图绘制 (20分钟)

草图绘制是一项被低估的艺术。我们常常会带着想法,匆忙地打开应用程序,开始用电脑生成图形。然而,如果我们花点时间,用笔和纸将一些想法可视化,我们将不再受限于对软件包、应用程序或其本身功能的理解。我们可以自由设计,只依赖于自己的创造力。

伟大的数据可视化艺术家,如 David McCandless,正是这样做的。他使用笔和纸,起草他创作的每一个数据可视化。这是一个好习惯,能让你更高效,并最终在数据沟通方面做得更好。

第四阶段:原型制作与改进 (20分钟)

此阶段的理念是,你创建的第一个可视化不应该是最终版本,而是一个起点。然后,你可以在应用程序中开始逐步改进它。有一些技巧可以应用,让你在过程中逐步将其变得更好。

这一点很重要。我们常常感觉自己在为一个最终的数据可视化投入所有努力,但实际上,我们应该更多地将其视为一个流动的、迭代的过程。

核心要点总结 ✅

本节课中我们一起学习了创建高质量数据可视化的计划性方法。

  • 计划至关重要:在从工作产出转向面向客户的数据时,需要更多关注细节。规划我们的方法并认真执行,能确保流程的每个环节都扎实可靠,最终构建出优秀的数据可视化。
  • 养成草图习惯:用笔和纸进行草图绘制是一项被低估的艺术,你应该将其培养成个人习惯。这将节省你的时间和精力,最重要的是,当你在思考如何有效可视化数据及讲述数据故事时,它能让你打开创造力。
  • 迭代是常态:制作最终的数据可视化是一个研究和迭代的过程,而非一蹴而就的经历。你不应觉得第一次做出的可视化就是正确的。发布一个可视化版本,使用它,应用我们将在课程后面讨论的一些工具使其越来越好,真正将其视为一个鲜活的、可迭代的数据可视化。

075:第三讲 第三部分 视觉形式的构成要素 🎨

在本节课中,我们将要学习构成优秀数据可视化“视觉形式”的三个核心要素。到目前为止,我们一直在使用一个框架来展示成功的数据可视化所需的所有不同元素,但我们尚未深入探讨“好的视觉形式”究竟意味着什么,也未曾给出明确的定义。这正是我们现在要讨论的内容。

框架回顾

以下是我们一直在使用的框架。其中每一个元素都至关重要,只有当它们全部存在且都成功实现时,可视化才能发挥作用。

视觉形式这个概念,即我们与受众沟通时所创建的实际图像,非常重要。但到目前为止,我们并不清楚什么构成了好的视觉形式,什么没有。因此,我希望在此提供一个定义。

优秀视觉形式的三要素框架 🧩

当我们思考什么造就了好的视觉形式时,一个包含三个部分的框架可以帮助我们回答这个问题。好的视觉形式包含三个不同的要素:

  1. 清晰的含义
  2. 对比的巧妙运用
  3. 精致的执行

上一节我们回顾了整体框架,本节中我们来看看构成优秀视觉形式的具体要素。以下是每个要素的详细说明:

  • 清晰的含义:它清晰地传达了预期的洞察,即我们费尽心力从数据中提取出的核心见解。
  • 对比的巧妙运用:它能将受众的注意力吸引到我们希望他们看到的图表元素上,并使其远离那些我们不希望他们花费过多时间的干扰性元素。
  • 精致的执行:它为视觉呈现增添了许多润色,体现了对细节的高度关注,同时也有助于让受众专注于重要的内容,而不被页面上那些不那么重要的元素分散注意力。

框架的重要性与关联 🔗

这个框架之所以重要,有多个原因。我尤其欣赏它如何与最初的麦肯锡五步法框架中的视觉形式要素联系起来。

这种联系非常直接。我们正是选取了麦肯锡框架中的“视觉形式”这一元素,并在其内部定义了构成优秀视觉形式的要素。

此外,该框架还揭示了数据分析过程(数据收集、设定目标等我们迄今讨论的所有重要环节)与我们最终将生成的图像之间的直接联系。

总结 📝

本节课中,我们一起学习了评估数据可视化“视觉形式”质量的三个核心要素:清晰的含义对比的巧妙运用精致的执行。理解并应用这个三要素框架,能帮助我们将分析过程中的核心洞察,有效地转化为一幅能精准传达信息、引导受众注意力且制作精良的视觉图像。

076:通过连接丰富内容 📊

在本节课中,我们将学习如何通过建立连接来丰富数据故事和数据可视化的内容。核心在于如何将冰冷的数字转化为能与观众产生情感共鸣的、富有意义的信息。


上一节我们讨论了构建数据故事的整体流程。本节中,我们来看看如何确保我们呈现的内容是“丰富”的。正如唐娜·王(Donna Wong)的框架所强调的,好的视觉形式包含多个要素,而“丰富的内容”是其中关键的一环。

安妮·沙利文(Anne Sullivan)有一句名言:“世界上最好、最美的事物,无法被看见或触摸,只能用心去感受。”这句话提醒我们,仅仅向观众罗列事实和数字,无法与他们建立情感连接,也无法产生我们期望的影响力。

我们可以通过发展丰富的内容来实现这种连接。其中,数字的表达方式至关重要,它决定了我们是否能与观众建立深厚的情感联系。让我们看一个例子。

美国每年消耗77.1175亿桶原油。

这只是一个纯粹的事实。虽然数字看起来很大,但我们缺乏上下文,难以理解其真正含义。对于大多数人来说,“百万”、“十亿”这些概念是抽象且难以感知的。抛出这样的数字,往往会让听众感到茫然。

因此,我的朋友、芝加哥FB公司的首席策划师约翰·肯尼(John Kenny)提出了五种不同的方法来构建或定位数字,以确保你能建立情感连接,确保我们使用的是丰富的内容。

以下是五种构建数字情感连接的方法:

  1. 使用易于理解的单位:将数字转化为人们熟悉的物品单位。

    • 示例:美国人每天使用的石油足以制造360亿个塑料水瓶
  2. 使用熟悉的比较(距离):将数字与众所周知的远近距离进行比较。

    • 示例:美国人每天使用的石油足以完成39次往返太阳的旅程

  1. 使用熟悉的比较(时间):将数字与一段易于感知的时间框架联系起来。

    • 示例:美国人每两分钟就消耗100万加仑石油。
  2. 关联日常生活:将数字与人们日常可见或使用的物品进行对比。

    • 示例:美国人每天消耗的石油是消耗水量的48倍
  3. 发掘道德维度:揭示数字背后的伦理或长期影响(需谨慎使用)。

    • 示例:不到四十年,世界有限的石油供应将永远耗尽
  4. 使数字个人化:将庞大的总数分解到个人或家庭层面。

    • 示例:一个典型的美国家庭一年要消耗70桶石油。

在谈论数字时,运用以上五种技巧之一,可以使数字更易于理解、更具冲击力,从而确保我们确实在使用丰富的内容,并在与观众交流时建立情感连接。

这种情感连接对我们至关重要,因为我们正试图通过建议来影响观众或与他们建立联系,以实现某个目标。事实上,正是情感为图表赋予了意义。孤立的数字很少能做到这一点,也几乎无法承载我们期望的影响力和情感。将数字情感结合使用,将对我们的观众产生更深远的影响。

我们之前经历的数据收集、目标确定、故事构建这一流程,本身就有助于确保我们在故事中融入丰富的内容。如果我们拥有深入可靠的数据、清晰的目标和精彩的故事,许多要素就已经具备。然而,运用肯尼介绍的这些技巧,将确保我们在呈现这些数字时,能最好地利用情感和可理解性。


本节课中,我们一起学习了通过五种具体方法(使用熟悉单位、距离/时间比较、关联日常、发掘道德维度、个人化)将抽象数据转化为富有情感和意义的“丰富内容”,从而与观众建立更深层的连接,提升数据故事的影响力。

077:模块四概述 🎯

在本模块中,我们将学习如何有效地传达数据故事。我们将探讨如何通过对比来丰富内容,运用专业指南提升图表的精致度,并动手优化一个实际图表。最后,我们将介绍一个流程,帮助您进行有影响力的数据可视化演示。


上一节我们回顾了数据可视化的核心框架。本节中,我们将深入探讨模块四的具体学习目标。

模块四的核心是“有效传达你的故事”。我们将在此讨论几个重要概念。

第一个概念是通过对比丰富内容。其核心思想是:利用对比将观众的注意力引导至我们希望他们关注的元素上,同时使其远离那些分散注意力的干扰元素。

以下是运用对比的关键方法:

  • 颜色对比:使用显著的颜色突出关键数据点。
  • 大小对比:放大重要图形元素以强调其重要性。
  • 位置对比:将核心信息置于视觉中心或显著位置。

接下来,我们将探讨如何为图表增添精致度。这里会借鉴Donna Wong提出的一些卓越指南。这些指南能为我们的视觉作品增添大量润色,将其从“良好”提升至“卓越”,并帮助我们更高效地与观众沟通。

然后,我们将进行实践操作。我们会选取一个相当糟糕的图表,并逐步改进它。在这个过程中,我们将实际应用之前讨论的所有指南和框架。

最后,我们将聚焦于数据可视化演示。我们将介绍一个流程,以确保演示能以 impactful 的方式与观众建立连接,并确保他们能够理解,从而准确传达我们的意图。


为了巩固我们讨论过的概念,让我们回顾一下 Mcans框架。该框架指出了优秀数据可视化的四个要素。

我们花了大量时间讨论如何收集信息、构建故事、确定目标,并将所有这些整合成一个能够传达信息的视觉形式。然而,该框架的局限在于,它并未深入探讨什么是“良好的视觉形式”。

这一点至关重要,因为在我们的流程中,我们已经完成了视觉探索,并在数据中发现了模式。现在,我们正处于Baronatto所说的“日常数据”阶段,或者可称之为“客户就绪数据”阶段。我们希望向客户展示的视觉作品,能够立即传达我们所发现的洞察。

为了实现这一目标,我们需要了解什么是良好的视觉形式。这正是以下框架发挥作用的地方。

这个三叉框架的核心思想包括:

  1. 清晰的意图
  2. 精妙的对比运用
  3. 精致的执行效果

关于“清晰的意图”,我们已经讨论过。现在,我们将深入探讨这个三叉框架的最后两个要素,并总结优秀数据可视化的要义。


本节课中,我们一起学习了模块四“有效传达你的故事”的核心目标。我们明确了将通过对比吸引注意力、运用专业指南提升图表质量、动手优化图表以及学习有效演示流程来达成这些目标。接下来,我们将逐一深入这些主题。

078:制作吸引人的数据可视化 📊

在本节课中,我们将学习如何制作吸引人的数据可视化。我们将重点探讨唐娜·王提出的视觉形式构成要素,并深入理解“吸引人的可视化”所遵循的三条核心规则。通过正反案例的对比,你将掌握如何让你的图表更清晰、更有效地传达信息。


上一节我们介绍了视觉形式的概念,本节中我们来看看如何制作一个真正“吸引人”的数据可视化。

一个吸引人的数据可视化遵循三条核心规则。这些规则是:

  1. 突出核心信息
  2. 消除干扰元素
  3. 运用视觉引导和对比来吸引读者注意力,并引导他们关注数据中的重要部分。

现在,让我们逐一详细探讨这些规则。

突出信息与消除干扰 🎯

这条规则要求你的图表必须清晰地传达核心观点,并移除一切无关的视觉元素。

以下是谷歌的一个优秀案例。这张图表非常简洁明了。

它展示了巴西在普通星期二(蓝色线条)与6月15日(世界杯开赛日,橙色线条)的谷歌搜索量对比。图表清晰地突出了你应该关注的信息:在比赛开始和进行期间,搜索量急剧下降;在半场休息和比赛结束后,搜索量又迅速回升。这张图表有效地突出了信息并消除了干扰。

相反,下图是摩根士丹利的一个反面案例。

这张图表包含了太多元素:彩色面积图、内嵌的表格、带框的数字、箭头和文本。过多的信息淹没了读者,核心信息既未被突出,干扰也未被消除。左侧的图表正确示范了如何突出信息,右侧的图表则展示了错误做法,两者的区别非常明显。

运用视觉引导 👁️

上一节我们强调了突出核心信息,本节我们学习如何运用视觉线索主动引导观众理解你的洞察。

视觉引导能像路标一样,指引观众的视线,帮助他们快速抓住重点。

以下是运用视觉引导的一个绝佳案例,它使用了Facebook关于状态更新的数据。

图表通过直接标注,明确指出了我们应该关注的区域和有趣的数据点。作为观众,我能立刻知道该看哪里、看什么,以及能从中获得什么结论。

下图则是一个完全错误的示范,它展示了一个医疗系统的信息图。

它极其杂乱,没有任何视觉线索能帮助我浏览或解读这张图。我无法知道应该寻找什么洞察。因此,我们应该追求左侧图表的设计,而避免右侧图表的设计。

运用对比吸引注意力 ⚡

我们学习了如何引导观众,最后一条规则是利用强烈的视觉对比来第一时间抓住读者的注意力。

对比可以通过大小颜色来实现。

以下是蜡笔品牌绘儿乐完美运用颜色和大小对比的案例。

即使不看文字,你也能理解这张图:它展示了从1903年公司成立至今,一盒绘儿乐蜡笔中典型颜色的数量变化。颜色的丰富度和图形的大小形成了鲜明的视觉对比,清晰地传达了信息。

下图则是一个未遵循此规则的案例。

首先,在饼图中仅使用高饱和度的原色并非明智之举,这里的对比过于强烈且刺眼。更重要的是,各扇区的大小非常接近,缺乏足够的大小对比来有效运用这一视觉技巧。此外,饼图的各扇区之和应为100%,这也是一个基本要求。因此,这是一个所选视觉技巧与故事本身不匹配的案例。

综上所述,我们看到了正确与错误运用这些规则的案例。

你可以通过关注以下问题,将这些规则融入你的设计习惯中:

  • 我是否突出了核心信息?
  • 我是否消除了干扰元素?
  • 我是否运用了视觉引导来带领观众理解我的洞察?
  • 我是否运用了对比?我运用得好吗?

案例研究:Bellevbe 📈

现在,让我们看看这些规则如何在Bellevbe的案例研究中得到应用。

我们最初用折线图可视化了数据,并从中发现了一些模式。对于这些数据,我们可以有多种处理方式。正如之前讨论的,我们可以先勾勒出不同的视觉形式草图,看看哪种最能传达信息。

我们可以很容易地通过使用颜色来引入一些对比,并通过移除一些杂乱元素来清理图表。

像这样的可视化确实能讲述一个故事,但它是一个宽泛的故事,可能并非我们真正想讲述的那一个。

因此,下图来自Sity.com的方案,以更清晰、更简洁的方式捕捉并表达了我们想要传达的全部含义。

这张图表明显消除了干扰。在后续工作中,我们会希望采用这样的可视化来讲述我们想要的故事,并剔除那些与故事无关或对结果没有影响的数据部分。


总结 📝

本节课中我们一起学习了如何制作吸引人的数据可视化。

在本模块中,我们涵盖了大量内容:

  • 我们讨论了从数据中发现模式的能力,以及如何使所使用的视觉技巧与我们寻找的模式类型相匹配。
  • 我们谈到了在创建数据可视化时要具有计划性,特别是在制作面向客户的或日常使用的图表时。当我们想要讲述一个故事时,需要投入大量注意力到细节中,而有计划的方能帮助我们做到这一点。
  • 我们理解了视觉形式的概念及其构成要素,探讨了什么是好的视觉形式,并引入了唐娜·王的框架,该框架指出有三个不同的基本要素。
  • 在最后的课程中,我们深入探讨了第一个要素:创建吸引人的数据可视化,并学习了实现它的三条具体规则。

通过掌握这些原则并不断实践,你将能够创建出更有效、更引人入胜的数据可视化作品。

079:为图表增添精致感

在本节课中,我们将学习如何通过关注细节,使数据图表在传达洞察时更加有效和高效。我们将深入探讨唐娜·王(Donna Wong)提出的视觉设计准则,这些准则能帮助我们提升图表的视觉表现力。

之前我们讨论了良好视觉形式的两个要素:清晰的意图巧妙的对比运用。现在,我们进入第三个要素:精细的执行

从探索到呈现:图表的两种形态

当我们处于数据探索模式,试图发现洞察时,R语言是一个极佳的工具。它能快速高效地处理海量数据,并呈现出有助于我们发现故事的规律。

然而,我们绝不应该直接将R生成的原始图表呈现给观众。即使故事对我们自己很清晰,但未参与数据收集和分析过程的观众,可能只会看到一条杂乱的折线,而无法理解其含义。

因此,我们需要对图表进行“润色”,将其转化为巴罗纳托(Baronato)所说的“日常数据”图表,或者我称之为“客户就绪”的数据可视化。R在这个过程中仍扮演重要角色,但通常用于创建更接近下图效果的视觉输出。

上图展示的是伦敦的自行车骑行路线。线条颜色越深,代表该路线的使用频率越高。这张图的核心部分(线条网络)由R生成,R凭借其强大的功能和丰富的扩展包,能够完成这类复杂的分析。

但在获得R的输出后,我们通常会将其导入第二个平台或独立的程序进行清理和增强。例如,在上图中,我们在R生成的骑行路线下方添加了伦敦的地图,这为抽象的线条提供了地理背景。此外,我们还添加了主标题、副标题和其他信息,使图表能更有效地传达信息。

学习唐娜·王的视觉准则

掌握这些增强元素需要时间。唐娜·王说得很好:我们并非一开始就能写出社论,而是从学习字母开始。在应用这些视觉准则时,我们也应采取同样的学习态度。

唐娜·王提出的准则非常详尽,它们真正区分了优秀和卓越的视觉作品。有些准则可能与你整个职业生涯中养成的制图习惯相悖,但我想告诉你,如果采纳她的建议,你将能持续创作出出色的数据可视化作品。

唐娜·王的所有建议,核心目标都是提升我们所创图表的可读性。这包括:

  • 字体选择文本排版的方式。
  • 我们之前讨论过的直接标注理念。
  • 创建简洁的折线图:避免使用数据点标记,永远不要使用虚线,而是运用不同的颜色元素来形成对比,力求图表线条干净、信号清晰。

她的准则列表很长,初次尝试应用时,有些可能显得古怪。但只要我们坚持培养这些习惯,我们的图表就会越来越好。这正是精细执行和为视觉作品增添润色的力量所在。

关键要点与总结

以下是几个需要思考的重点:

精细的数据可视化执行确实需要高度关注细节。 这种对细节的谨慎关注,能确保我们的数据可视化在传达洞察时既有效又高效。这正是我们所期望的——我们不希望观众需要费劲思考我们呈现的图表。

用于探索的工作图表无需精细执行。 这些视觉作品仅用于我们发现数据模式和寻找故事,此时我们只希望尽可能快速、高效地创建它们。在找到故事之后,我们才会投入精力,通常使用两个或更多应用程序,将这些图表转化为值得展示的形式。

在唐娜·王的所有准则中,最重要的是“去除图表中的杂乱”。 这是提升可读性最有效的方法。去除杂乱能排除那些会分散观众对主要观点注意力的元素,帮助我们将焦点集中在图表中少数几个想要传达的重要元素上,从而清晰地向观众传达洞察。


本节课中,我们一起学习了为图表增添精致感的重要性。我们了解到,从数据探索到最终呈现,图表需要经历一个“润色”过程。通过引入唐娜·王的视觉设计准则,特别是关注细节、去除杂乱和提升可读性,我们可以将原始的、仅自己可见的分析图表,转化为能够清晰、高效、自信地向客户或观众传达洞察的“客户就绪”型可视化作品。

080:提升图表可读性 📈

在本节课中,我们将学习如何应用之前讨论的设计原则,将一个可读性很差的图表,逐步优化成一个清晰、高效的沟通工具。我们将以贝拉比案例研究中的一个初始图表为例,展示如何通过遵循唐娜·王等人的指导原则,显著提升图表的可读性。

从“糟糕”的图表开始

上一节我们探讨了图表设计的基本原则。本节中,我们来看看如何将这些原则应用到一个具体的、可读性不佳的图表上。

初始图表可能直接来自R、Excel等分析软件,其目的是帮助我们发现数据中的故事。虽然它包含了必要的数据,但在视觉呈现上存在诸多问题,影响了信息的有效传达。

初步优化:添加基本元素

在完成数据分析并构思了如何更有效传达信息后,我们可以开始创建并迭代图表设计。

以下是初步优化的几个方向:

  • 添加标题:为图表加上一个清晰的标题。
  • 调整颜色:改变颜色使用,以提升视觉区分度。

这些初步改动已经能显著改善图表的可读性。然而,即使经过这些优化,图表在许多方面仍不符合唐娜·王所倡导的最佳实践标准。

应用唐娜·王的原则深入优化

为了将图表从“较好”提升到“出色”,我们需要深入应用唐娜·王的指导原则。经过彻底优化后,图表可能呈现为以下更简洁、高效的形式。

让我们逐步解析从“糟糕”到“更好”再到“出色”的过程中所做的关键改进:

  1. 添加清晰的标题:我们增加了一个用平实语言写成的标题,直接告诉观众他们正在看什么。这避免了观众的困惑,标题不卖弄、无术语,直接有力地回答了核心问题。
  2. 提供详细的副标题:副标题揭示了数据洞察。这样,观众不仅知道在看什么,还知道应该从中思考什么,核心观点已被植入他们脑海。
  3. 合理放置坐标轴标签:将Y轴标签从图表右侧(本不属于它的位置)移到了左侧。并以水平方式打印,符合人们的书写和阅读习惯,变得非常清晰。
  4. 优化坐标轴刻度:以易于理解的节奏设置年份刻度(例如每20年)。没有必要标注轴上的每一年,只要保持一致的节奏,就不会给观众造成混淆。
  5. 明确标注坐标轴含义:我们明确标注了X轴代表的是“该技术首次实现商业化的年份”。这样做有几个好处:虽然人们可能推测那是年份,但我们真正想传达的是“首次商业化年份”。为什么不直接写出来呢?否则,我们会期望观众去猜测,或者需要我们额外解释,而一旦没有书面记录,观众听完很快就会忘记。

三大测试:精炼你的数据可视化

为了进一步提升数据可视化水平,制作出更出色的图表,你可以应用以下几个测试。这些测试有助于实现直接标注和注释,使图表更有效。

以下是三个关键的测试方法:

  • 斯巴达测试:这个测试的理念是,逐一移除图表上的每个元素。每移除一个后,思考:我的图表含义改变了吗?如果该元素对含义影响不大,就应该完全去掉。通过这个过程,我们可以审视图表的每个部分,确保只包含那些重要的、能传达某种含义的元素。
  • 一瞥测试:将你的可视化图表打印出来,反面朝上放在桌上一段时间。然后快速翻过来,观察你的视线最先被吸引到哪里。你视线停留的位置,很可能也是观众视线会聚焦的地方。这是你希望他们看的地方吗?如果不是,就需要重新思考对比度的使用,将注意力引导到你真正希望他们关注的元素上。如果你的视线在一瞥测试中直接落在了理想位置,那么你的设计很可能很成功。
  • 同事测试(可能也是最重要的测试):拿着你的可视化图表,去找一位没有接触过你所收集的数据或试图解决的客户问题的同事。直接向他们展示图表并询问:“这说明了什么?”如果这位没有任何背景、上下文或理解基础的同事,能够说出你希望从该图表中传达的故事,那么你就做对了。但更多时候,我们会因为过于沉浸于数据或想当然,而忽略了一些元素。这个测试能有效帮助我们避免陷入这些陷阱。

总结

本节课中,我们一起学习了如何通过系统性的优化步骤提升图表可读性。我们从识别一个图表的缺陷开始,通过添加标题、优化标签、调整布局等初步改进使其变得更好。随后,我们深入应用唐娜·王的设计原则,去除了冗余的干扰元素,强化了核心信息的传达。最后,我们介绍了斯巴达测试、一瞥测试和同事测试这三个实用方法,它们能帮助我们客观评估并持续精炼数据可视化作品,确保其能够清晰、准确、高效地向目标受众传达核心洞察。

商业分析:4-4:有影响力的数据可视化展示

在本节课中,我们将学习如何有效地口头展示和沟通数据可视化。这是整个沟通旅程的最后一步,确保我们精心准备的分析成果能被听众清晰理解并产生影响力。


概述:沟通旅程的最后一步

我们已经完成了数据收集、目标确定、故事构建,并通过可视化发现了关键模式。我们还对图表进行了润色,使其达到交付标准。现在,最后一步是站在听众面前,有效地展示这些可视化成果。

为了确保沟通效果,我们可以遵循一个结构化的方法。接下来,我们将介绍一个由David McCandless启发的五步法,它能帮助你清晰、有力地展示任何图表。


五步展示法:McCandless方法

以下是展示数据可视化的五个关键步骤。这个方法能引导听众的注意力,并确保你的核心信息被准确接收。

第一步:介绍图表名称
首先,为你的图表命名。这能将听众的注意力从你身上转移到图表本身,并让他们对即将看到的内容有一个初步的认知框架。

第二步:解释图表要素
主动解答听众在看到图表时可能产生的疑问。例如:

  • 数据来源是什么?
  • 不同的颜色或形状代表什么含义?
  • 坐标轴的单位是什么?

提前回答这些问题,可以防止听众在思考中“掉队”,确保他们能紧跟你的叙述。

第三步:陈述核心洞察
在提供详细证据之前,先直接给出图表揭示的核心结论或故事。这相当于提前“剧透”。这样做能让听众进入一个“求证模式”,他们会带着你的结论去审视后续的例证,从而更专注。

第四步:提供例证支持
现在,用图表中的具体数据点或趋势来支撑你刚才提出的核心洞察。通过实例来证实你的观点。请注意,先给洞察,再给证据的顺序比反过来更有效,能避免听众在冗长的数据叙述中迷失方向。

第五步:阐明重要性
最后,告诉听众这个洞察为什么对他们重要。将数据与他们的利益、决策或行动联系起来,使其个人化,从而为整个展示画上圆满的句号。


方法应用示例

让我们通过课程中曾出现的两个图表,来具体应用这个五步法。

示例一:美国麻疹病例数(1928-2002)

  1. 介绍:“这是美国从1928年到2002年的麻疹病例数量图。”
  2. 解释:“图中红色线条代表报告的病例数,灰色阴影区域表示数据缺失的年份。”
  3. 洞察:“这张图清晰地展示了麻疹疫苗引入后,病例数出现了断崖式下降。”
  4. 例证:“请看,在1963年疫苗普及后,病例曲线急剧下滑,并在后续几十年维持在极低水平。”
  5. 重要性:“这有力地证明了疫苗接种在公共卫生中的决定性作用,是支持免疫规划的关键证据。”

示例二:巴西“流感”相关谷歌搜索量

  1. 介绍:“这张图展示了巴西地区‘流感’一词的谷歌搜索量变化。”
  2. 解释:“蓝色曲线代表实际的搜索量,红色虚线代表季节性基线,灰色区域表示搜索量异常高的时期。”
  3. 洞察:“图表显示,谷歌搜索量的激增能够比官方报告更早地预测流感爆发。”
  4. 例证:“例如,在这个灰色峰值出现几周后,卫生部门才确认了流感的社区传播。”
  5. 重要性:“这意味着,像搜索数据这样的非传统信息源,可以成为预警系统和公共卫生监测的宝贵工具。”

关键要点与总结

在本节中,我们一起学习了进行有影响力的数据可视化展示的核心方法。

首先,我们理解了沟通最后阶段的重要性。如果展示失败,之前所有的分析工作都可能付诸东流。听众在看到图表时产生的疑问会分散他们的注意力,因此必须主动解答。

其次,我们掌握了展示的核心顺序:洞察应先于证据。不要为了制造戏剧性的“揭秘”效果而让听众猜测,这有很大风险让他们失去兴趣。

最后,我们学习了五步机械法(介绍、解释、洞察、例证、重要性)。这是一个可靠的结构,可以应用于任何图表展示。建议你多加练习,甚至用它来分析日常看到的图表,从而内化成习惯。

通过遵循这个方法,你可以确保自己付出的努力,最终能转化为听众清晰的理解和有效的决策依据。

082:自主学习课程

在本节课中,我们将了解伊利诺伊大学吉斯商学院提供的灵活在线学习模式。这种模式旨在帮助忙碌的学习者突破传统线性教育的限制,按照自己的节奏和方式获取知识。

传统学习的挑战 🎼

传统线性学习方式常常让聪明、勤奋但忙碌的人们错失教育机会。

吉斯商学院的解决方案

因此,吉斯商学院提供了可堆叠的在线内容,让学习者能够按照自己的条件进行学习。

以下是该学习模式的核心特点:

  • 自定进度学习:你可以参加自主节奏的课程。
  • 获取可转录学分:完成课程可以赚取可被记录的学分。
  • 灵活掌控进度:你可以随时暂停学习。
  • 获得学位:通过积累学分,最终可以获得学位。
  • 自由组合课程:你可以切换和堆叠不同的课程作业。
  • 获取证书:完成特定课程组合可以赢得证书。
  • 个性化学习路径:或者以任何你想要的方式进行学习。

无论你处于学习旅程的哪个阶段,你都能以或大或小的增量,获得由专家引领的教育。开始吉斯商学院学习的最佳时机,就是你认为合适的时间。


本节课中,我们一起学习了吉斯商学院灵活、自主的在线学习模式。它通过提供可堆叠、自定进度的课程与学分,打破了传统教育的线性限制,让学习者能够根据自己的时间、目标和节奏来规划学习路径,最终实现获取证书、学分乃至学位的目标。

083:课程介绍 🚀

在本节课中,我们将学习商业分析专项课程的核心内容与学习路径。课程旨在为你提供利用数据获取可执行商业洞察所需的工具。我们将介绍一个核心决策框架,并概述四个关键模块的学习重点。

欢迎来到课程。本课程的目标是为你提供必要的工具,使你能够利用数据来获取可执行的商业洞察。

如今,从在线购物到使用人工智能,我们几乎所有的活动都渗透并受益于大数据、机器学习和数据分析。要在商业竞争中获胜,甚至只是成为一名成功的参与者,你我都需要学习如何掌握那些能帮助我们将数据转化为可用商业洞察的工具。

本课程将为你配备四种应对数据分析世界所必需的前沿工具。我们首先聚焦于培养你的分析思维,探索如何有效处理信息、批判性地思考数据以及进行数据驱动的问题解决。

基于此基础,接下来的三个模块将深入探讨Python和人工智能的力量。模块二将向你介绍用于探索性数据分析的Python,你将学习如何准备、清理、可视化数据并从中获得初步洞察。

模块三将专注于结构化查询语言,即SQL。这是从大型关系数据库中高效提取特定数据子集的基础工具,这些技能将与你基于Python的分析形成互补。

最后,模块四将探索应用程序编程接口,即API。这将使你能够从各种外部系统中检索数据,并将其整合到你的分析工作流中,从而进一步扩展你的数据来源范围。

在本课程中,我们将引用一个用于基于数据做出商业决策的框架,即FACT框架。

FACT框架是一个首字母缩写词,其中:

  • F 代表 Frame a question(构建问题)。
  • A 代表 Assemble the data(收集数据)。
  • C 代表 Calculate the results(计算结果)。
  • T 代表 Tell others(传达结果)。

虽然本课程涵盖的工具与FACT框架的每个部分都相关,但我们将重点强调“构建问题”和“收集数据”这两个部分。其他课程将更侧重于数据的高级计算以及如何向他人传达这些计算的结果。

我们在本课程中的目标是为你提供一个坚实的框架和基础,让你理解并实践商业分析。因此,未来当你遇到未曾接触过的数据分析任务时,你将能够将其纳入该框架,快速理解它,并利用Python和人工智能的力量,更快地吸收你需要学习的新信息。

更重要的是,你将能够运用新知识来获取商业洞察并解决商业问题。

在每个模块中,我们都将使用真实的商业数据来练习使用这些工具。因此,每个模块都将专注于解决商业问题。

我们很高兴你能通过学习更多关于Python和人工智能如何帮助你执行数据清理、加载和探索等任务来扩展你的工具包。这些是所有数据分析的基础。

有效利用数据就像拥有一个可靠的指南针和一张详细的地图,用以导航复杂的商业地形。它帮助你了解自己的位置,识别到达目的地的潜在路径或策略,并帮助你在学习这些模块的过程中避免迷失方向。深入钻研并尝试使用数据。你练习得越多,你的数据工具包和解决商业问题的能力就越强。

商业的未来是数据驱动的,你现在正走在成为关键参与者的道路上。让我们一起解锁Python、人工智能和深度思考的力量。

总结

本节课我们一起学习了商业分析专项课程的总体介绍。我们明确了课程目标:掌握将数据转化为商业洞察的工具。课程围绕 FACT框架(构建问题、收集数据、计算结果、传达结果)展开,并重点介绍了四个核心学习模块:分析思维、Python数据分析、SQL数据查询以及API数据获取。通过本课程的学习,你将建立起坚实的数据分析基础,为在数据驱动的商业世界中解决问题做好准备。

084:关于金门多萨教授 👩‍🏫

在本节课中,我们将了解本专项课程的一位核心讲师——金门多萨教授的背景与经历。这有助于我们理解她将如何引导我们学习商业分析。


大家好,我是金门多萨。我很高兴与大家分享一些关于我的信息。

在步入教学生涯之前,我曾在普华永道担任审计师,这段经历让我获得了关于会计和金融的宝贵见解。那些年加深了我对会计和金融的理解。

在担任审计师期间,我遇到了许多悬而未决、想要深入探究的问题。因此,我决定前往华盛顿大学攻读博士学位。这段求学之旅塑造了我的教学和研究方法,并帮助我在伊利诺伊大学厄巴纳-香槟分校获得了教职。

我教授过从财务会计到数据分析等多种课程,并在多年间开发了大量数据分析教学内容。我热切期待与我的学生们分享这些内容。

吉斯商学院是数据分析领域的领导者。它是德勤基金会商业分析中心的所在地,该中心是全球各大学获取商业分析教学材料的权威来源。

在课堂之外,我享受演奏音乐。我会弹吉他、钢琴和尤克里里。我也喜欢和我的三个孩子共度时光。我们热爱探索这个校园。在周末,我们经常去大学植物园、联合大楼或钟楼。看着我的孩子们玩耍并发现这所大学的美,是一件非常有趣的事。

我非常高兴你决定将吉斯商学院作为你教育旅程的一部分。我也很荣幸能在你于伊利诺伊大学学习期间担任你的导师。


本节课中,我们一起了解了金门多萨教授从审计实践到学术研究的职业路径,以及她在吉斯商学院开发数据分析课程的经历。这为我们跟随她学习商业分析奠定了良好的基础。

085:关于罗纳德·盖蒙教授 👨‍🏫

在本节课中,我们将认识本课程的教授——罗纳德·盖蒙。我们将了解他的专业背景、个人生活以及他对于教学和人生的深刻见解。


专业背景介绍

大家好,我是罗纳德·盖蒙,目前在吉斯商学院会计学院任教。

我的会计学位分别来自杨百翰大学和爱荷华大学。

我的职业经历融合了学术与实践。在学术方面,我的教学与研究专注于管理会计与数据分析。在实践方面,我曾担任过数据科学家。以上是关于我专业经历的一些介绍。

个人生活点滴

现在让我分享一些我的个人生活。好的,这张照片里是我,我正站在哥布林谷的顶部,我非常喜欢这里。这里的徒步旅行非常有趣,景色也十分壮丽,你可以看到全景式的风景。

我热爱能够来到户外。年轻时,我就常来这个地区徒步和露营。在人生的现阶段,我花大量时间从事我热爱的工作,但户外活动的时间变少了。因此,我有时会带我的孩子们来这里,看着他们奔跑和徒步,这让我感到非常快乐。

几年前,我和我的妻子有机会在这里参加了一场跑步比赛。我们跑遍了这里的部分区域。这场比赛我最喜欢的部分,是终点设在被称为“胡斯谷”的地方。最后,我们跑上一些台阶,在能看到所有“哥布林”岩石的地方完成了比赛。这是我参加过的最喜欢的比赛之一。

教学理念:成为桥梁建造者

我现在在拱门国家公园,欣赏这些巨大的拱门。在我身后,有几个看起来像桥的拱门。当我想到桥时,我就会想到教师。

为什么想到桥会联想到教师呢?因为我所知道的最伟大的教师之一,托马斯·蒙森,曾经常常谈论为他人建造桥梁的重要性。😊

他曾分享过一首名为《桥梁建造者》的诗。诗中,一位老人正在旅行,他遇到了一个巨大的峡谷,谷底有一条河。这位老人经验丰富,能够设法渡过河流,到达峡谷的另一边。

当他到达对岸后,他停下来建造一座桥。另一位路过的旅人问他:“既然你已经过来了,为什么还要建桥?”老人回答说,他不是为自己建桥,他是为他人建桥,这样当别人需要渡过时,会更容易一些。

我很感激有机会成为一名教师,我渴望成为一名优秀的桥梁建造者。我也希望你们,在完成学业后,能花时间为他人建造桥梁。😊


本节课中,我们一起认识了罗纳德·盖蒙教授。我们了解了他横跨学术与数据科学领域的专业背景,他对户外和家庭生活的热爱,以及他将教师比作“桥梁建造者”的深刻教学理念。他希望我们不仅能自己渡过知识的河流,更能为后来者搭建通往成功的桥梁。

086:盖斯社区的影响 🚀

在本节课中,我们将了解盖斯商学院社区的影响力,探讨其如何通过创新教育模式、扩大教育机会以及构建多元化网络,为全球学习者创造价值。


加入盖斯商学院社区正逢其时。我们的创新方式其他商学院无法比拟。

我们在国内和国际层面因这些成功而获得认可。我们的学生和校友是盖斯卓越教育的活生生的证明。

我坚信,我们的盖斯品牌及其产生的影响力从未如此强大。

我们在同行中确立了真正的领导地位。我们在在线研究生教育领域成就斐然。

我们正在重新思考商业教育的交付方式。我们正在尽可能打破财务和地理上的障碍。

我们正在触及成千上万原本可能没有机会或能力获得研究生学位、证书或学习新技能的学习者。

通过扩大教育机会,我们创造了前所未有的多样性,涵盖经验、文化、人口统计、性别、种族和民族。

我们的校友网络正以比其他任何项目都更快、更广的速度增长,校友基础遍布全球和各行各业。

最令人兴奋的事情之一是我们扩展内容的方式。并非每个人都想要或需要一个完整的学位。

或者他们可能想要,但不确定是否准备好全身心投入。我们真正引领了可堆叠内容的发展,这为来自不同背景、经验水平和拥有不同目标的学习者创造了众多机会。

你可以只修一门课,然后将其堆叠成一个专项课程,再进一步堆叠成一个完整的研究生学位,而无需重复已经修过的课程。

这是我们承诺的一部分,旨在让所有渴望并致力于追求教育的人都能获得并实现教育目标。这就是盖斯商学院的全部意义,也是我以之为家的原因。

我希望你能在这里看到自己的潜力,并考虑加入我们的学习者、学者和领导者社区。


本节课中,我们一起学习了盖斯商学院社区的核心影响力。其核心在于通过创新的“可堆叠”教育模式(如 单门课程 -> 专项课程 -> 完整学位),打破传统壁垒,为全球多元化背景的学习者提供了灵活、可及且高质量的教育路径,并构建了一个强大的全球校友网络。

商业分析专项课程:P87:商业分析关键术语 📊

在本节课中,我们将介绍一些与商业分析相关的关键术语、工具和概念。我们将以成对比较的方式呈现这些术语,以便提供一个比较基准,并帮助区分相似的概念。

ETL 与 EDA

首先,我们来比较 ETL 和 EDA。这两个缩写都是三个字母,并且都与数据有关,但相似之处仅此而已。

ETL 代表 提取、转换、加载,泛指将数据从其存储位置获取并导入数据分析软件所需完成的任务。ETL 任务通常需要了解数据的存储和排列方式。例如,如果数据以一系列 CSV 文件的形式存储在计算机上,那么了解这些文件的位置和命名方式会很有帮助。

数据还有许多其他存储方式。数据通常存储在远程位置,因此 ETL 过程始于获取访问数据的凭证,例如主机名、用户名和密码。在获得对远程数据存储的访问权限后,重要的是要知道如何提取数据的相关部分,并将其转换为对数据分析有用的格式,例如数据框

EDA 代表 探索性数据分析。之所以称为“探索性”,是因为在完成 ETL 过程后,确认数据是否符合预期至关重要。了解数据的分布情况,甚至是一些双变量关系也很重要。

例如,假设你将要分析刚刚加载到数据分析软件中的销售点数据。如果你对分析成本感兴趣,那么识别有多少条观测记录的成本值是缺失的,这是一个好主意。你可能还想确保成本值存在变化,并找出这些值与数量等值之间的关系。通常通过结合使用汇总统计量可视化来寻找这类问题的答案。EDA 通常是进行更深入分析的起点。

R 与 Python

上一节我们介绍了数据处理流程,本节中我们来看看两种流行的数据分析语言:R 和 Python。

这两种数据分析语言都非常流行,主要是因为它们都是开源的,这意味着它们是免费的,并且许多聪明人已经开放了他们的源代码供他人使用。它们都是高级语言,这意味着你无需深入了解计算机如何翻译二进制信号即可使用这些语言。高级语言的主要好处是更易于人类阅读。

你可以在网上搜索哪一种更好,会发现有很多支持其中一种的观点。以下是关于每种语言的一些背景信息,可能有助于你更好地理解这些观点。

R 是一种为没有深厚编程背景的统计学家构建的数据分析语言。因此,对于没有先前编码经验而进入数据分析领域的人来说,相对于 Python,R 的许多数据分析函数和错误信息通常更易于使用。R 是一种非常函数式的语言,意味着许多过程是通过使用函数来完成的,类似于在 Excel 中使用函数的方式。使用 R 进行数据分析通常围绕如何使用函数处理数据框展开。

相比之下,Python 是一种被应用于数据分析的通用编程语言。作为一种通用编程语言,它比 R 更受欢迎,因为它被用于许多非数据分析任务。Python 的许多数据分析功能都是模仿 R 的模式设计的。对于来自计算机科学背景而非统计学背景的人来说,Python 的错误信息可能更容易理解。Python 是一种面向对象的语言。不同的对象因其类型(例如,是数据框对象而非数组对象)而继承不同的能力和特性。Python 中的讨论通常围绕不同类型的对象以及处理这些对象的方法函数展开。

通常,统计学背景强于编程背景的人更倾向于使用 R,而编程背景强于统计学背景的人更倾向于使用 Python。因此,许多软件工程师非常偏爱 Python,并且发现使用 Python 更容易培养数据分析技能,因为他们已经从先前的编程经验中熟悉了 Python。

当然,每种数据分析语言都有一些任务比另一种做得更好,但这实际上取决于你如何定义“更好”。如果你指的是速度,那么 Python 在某些任务上可能更快,因为它可能需要的解释更少。如果你指的是可读性,那么 R 在某些任务上可能更好,因为它并非为具有深厚编程背景的人设计。在我看来,对于刚刚起步的人来说,最重要的是选择一种语言并坚持下去。这两种语言都已存在足够长的时间,在数据分析任务方面都有强大的社区支持。一旦你在一种语言中打下了坚实的数据分析基础,就更容易切换到另一种语言。

集成开发环境

关于 R 或 Python 哪个更适合数据分析的争论,也因优秀的集成开发环境而变得复杂。IDE 本质上是用于创建软件的软件。例如,RStudio 允许你用 R 创建代码,同时跟踪你的文件和项目、你创建的变量和图表,并访问终端或命令行等其他工具。RStudio 还有许多内置工具,用于高亮语法错误和提供代码补全提示。对于 R 与 Python 的争论,重要的是 RStudio 也允许你用 Python 创建代码,这意味着你实际上不必在两种语言中二选一,而是可以同时使用两种语言。有一些 IDE 主要用于 Python,如 Jupyter Lab 和 Spyder。但我认为 RStudio 是最好的。它之所以如此出色,部分原因在于一些常见的编程任务,例如将仪表板文件发布到互联网或将 Markdown 代码“编织”成 PDF 或 HTML 文件,只需点击一个按钮即可完成。

机器学习与人工智能

现在,让我们转换话题,将注意力转向比较机器学习人工智能

机器学习指的是从数据中提取模式,然后将这些模式总结在一个模型中的算法,该模型可用于预测未来结果、识别差异或突出显示可能隐藏的关系。因此,机器通过观察数据来学习这些模式,并且随着从更多数据中学习,所得模型的洞察力会得到提高。有许多机器学习算法,例如神经网络随机森林极限梯度提升聚类。你可能听说过深度学习。深度学习如何融入这个讨论?深度学习是一种具有多层数据处理结构的神经网络,它在图像检测和自然语言处理方面非常有用。因此,深度学习是机器学习的一个子集。

人工智能比机器学习更广泛,通常建立在机器学习算法以及许多其他技术之上。例如,人工智能可用于通过接收输入、使用机器学习算法进行分析,然后以拟人化的方式返回输出来模仿机器人的类人行为。为了实现这一点,机器学习当然可以作为一项技术,与机械和电气工程技术结合使用,使机器人能够将其环境中的音频和视觉线索转化为模仿行走的手势或模仿说话的音频信号。

数据分析与数据科学

最后,我们来谈谈数据分析数据科学。这是一个比较困难的比较,因为据我所知,并没有一个所有人都认同的权威定义。然而,人们在使用这些术语时存在一些共性。

这些职位的职责肯定有重叠。具体来说,数据分析师和数据科学家都应该能够执行 ETL、EDA、数据可视化和机器学习过程。然而,数据科学家还被期望在建模、将模型部署到生产环境以及处理更大量的数据和更复杂的问题方面更有技能。因此,数据科学家可能在编程和使用推断统计应用科学方法方面接受过更多培训。

根据最近在我居住地区的 LinkedIn 搜索,数据分析师职位比数据科学家职位多 70%。薪资搜索表明,数据科学家的薪资可能比数据分析师高,高出幅度从 35% 到 100% 不等。

什么是商业分析?

在本节课即将结束时,让我们以这个问题结尾:什么是商业分析?这实际上是本课程的重点。

商业分析师是能够使用商业数据(而非例如基因组数据)执行 ETL、EDA、数据可视化和机器学习过程的数据分析师。将你在市场营销、金融、会计、物流和组织行为学等领域的商业知识与数据分析技能相结合,应该使你有可能成为一名商业分析师。

总结

本节课中,我们一起学习了商业分析中的几组关键术语对比:ETL(提取、转换、加载)与 EDA(探索性数据分析)分别代表了数据处理流程的不同阶段;R 与 Python 是两种主流的数据分析编程语言,各有侧重;机器学习是人工智能的核心技术之一,而数据分析与数据科学在职责和技能要求上既有重叠又有区别。最终,商业分析被定义为运用这些技能处理商业数据,以解决实际商业问题的专业领域。

088:课程介绍 🎯

在本节课中,我们将学习商业分析的核心基础,理解数据分析如何为商业决策提供支持,并探讨培养正确思维模式的重要性。

欢迎来到位于南加州的美丽校园——西方学院。这里恰好是美国第44任总统巴拉克·奥巴马开始其教育生涯的地方。我坚信终身学习的重要性,尤其是在这个快速变化的世界中,保持与时俱进至关重要。

随着技术进步,掌握新工具变得非常重要。市面上有许多强大的软件工具可用于执行商业分析流程。然而,在这一系列课程中,我们将聚焦于最重要的工具——你的头脑。

有一句令人难忘的九字箴言,强调了头脑的重要性:“一个拿着工具的傻瓜,依然是个傻瓜。”

为了进一步阐述这个观点,想象一下:如果一个傻瓜有一堆梯子,却不知道如何用它们翻过一堵墙,会发生什么?无论他有多少梯子都无济于事,他很可能永远无法翻越那堵墙。

另一方面,一个知道如何使用梯子的人,不仅能用它上下攀爬,还可能想出其他创造性的使用方法。当你完成这些课程时,你的头脑将在几个方面做好准备。

以下是本模块将帮助你准备的几个关键方面:

首先,我们将通过分享几个公司使用数据分析来解答问题的简短案例,来武装你的头脑。这些案例将强调一个现实:数据本身并不创造价值,它更像一种原材料,只有在经过正确处理后才能体现价值。

其次,我们将通过讨论培养创造性和分析性思维模式的重要性来武装你的头脑。有时我们听到这些思维模式被讨论为右脑和左脑活动,并认为右脑活动更多属于艺术而非科学领域。但现实是,在商业分析工作中,好奇心和创造力与分析性思维、将大问题分解为小部分以及遵循结构化流程的能力同等重要。😊

这一点尤其重要,因为我们有时是在识别出数据中的模式后才去追寻商业洞见,而非从预设好的前提开始。将观察到的模式与业务流程、其他问题及分析流程联系起来的能力,需要一个好奇且富有创造力的头脑。

第三,我们将通过强调“让数据说话”的重要性来武装你的头脑。我们不希望你认为所有决策都必须基于数据做出。专业判断和直觉在商业决策中仍然极其重要。然而,重要的是要持开放态度,接受商业分析结果可能与你原有信念相悖的可能性。也就是说,让数据说话至关重要。

第四,我们将通过介绍一个样本数据集并详细阐述处理该数据的FACT框架,来武装你的头脑。

该数据集是真实商业数据的样本,我们希望你能对其以及它能回答的问题有一定程度的熟悉。我们希望你能认识到,这个数据集所展示的商业分析应用,可能也适用于你当前正在处理的数据。

然后,我们将回顾用于分析数据的FACT框架,并详细阐述这些步骤,以充实一个更细致入微的数据建模流程。

最后,我们将通过回顾一些相关的商业分析术语和主题来武装你的头脑。

在本模块结束时,我们希望你能说:一个只懂数据工具的傻瓜,依然是个傻瓜。但送那个傻瓜去上学,他就能变得相当酷。


本节课总结

在本节课中,我们一起学习了商业分析入门的核心思想。我们认识到,工具(包括数据)本身并非万能,最关键的“工具”是我们经过训练的头脑。我们探讨了培养兼具创造性分析性思维的重要性,并强调了在决策中既要尊重专业直觉,也要学会“让数据说话”。最后,我们预告了后续将深入学习的真实数据集和FACT分析框架。记住,学习的目标是让自己从“拿着工具的傻瓜”转变为能够巧妙运用工具的“酷”专家。

089:将业务数据转化为业务洞察 🎯

在本节课中,我们将学习如何将原始的业务数据转化为有价值的商业洞察。我们将通过几个真实案例,了解数据从收集、处理到最终产生决策价值的完整过程。数据本身并非魔法,它更像是原材料,需要经过一系列严谨的加工才能成为可用的“成品”。


引言:数据不是魔法粉尘 ✨

欢迎来到巴恩斯泰尔艺术公园,这里是各类艺术家的聚集地。公园里有美丽的建筑、艺术画廊、艺术学校和令人惊叹的景观。我们很感激那些与我们分享创造力的人才。

有些人可能不熟悉艺术创作过程,认为艺术家仅凭直觉就能神奇地创作出美丽、有价值的艺术品。虽然可能有些创作者确实能仅凭直觉,但大多数艺术家都花费了大量时间来培养直觉和磨练技巧。

类似地,数据对于做出有洞察力的商业决策非常有用。然而,根据我的经验,有些人认为数据就像魔法粉尘,他们只需将更多数据撒在问题上,就相信它会神奇地转化为清晰的解决方案或有价值的洞察,而无需任何实际工作或理解逻辑过程。他们认为粉尘越多,魔力就越强。

这种想法可能包含一点真理,因为先进的算法处理数据以创建有用模型的方式确实令人惊叹。然而,无论你是基于大量数据创建AI模型,还是基于少量数据构建回归模型,在本课中,我们都想强调:数据更像是原材料,而不是可以立即消费的成品

像任何原材料一样,数据必须通过劳动和机器进行处理,才能转化为可付诸行动的洞察“成品”。我们希望通过分享一些公司将数据转化为洞察的真实故事,来提供关于这一过程的一些高层细节。在分享这些故事时,请特别注意用于收集数据和将其转化为可操作洞察所付出的努力。


案例一:高尔夫运动中的生物力学分析 ⛳

上一节我们介绍了数据作为原材料的概念,本节中我们来看看数据在高尔夫运动分析中的具体应用。

我与生物力学家泰勒·斯坦福博士进行了交谈,他通过使用数据帮助高尔夫球手提升球技。我们来听听他关于高尔夫公司如何收集数据,然后将这些数据转化为洞察的看法。

“我叫泰勒·斯坦福,是犹他谷大学的生物力学副教授,也是几家不同高尔夫公司的独立顾问,我与他们合作进行产品教育和数据分析。我们的用户最想要的是,当他们购买一套测力板时,他们想知道应该关注什么,以及职业高尔夫球手的数据集是怎样的。每个人都希望像职业球手那样移动和挥杆,他们希望产生相同的速度和距离。因此,他们真正想了解的是数据的细微差别,这些差别可以帮助他们的球员开始那样移动。所以我做的很多工作就是深入研究这些数据集。我很幸运能够让许多高水平球员站在测力板上,查看数据并开始理解我们希望业余高尔夫球手追求哪些方面,以便他们能变得更好,或者从教育的角度,我们可以使用哪些信息。我们如何反过来告知高尔夫教练为什么这如此重要,以及它可能如何影响球被击中后的飞行轨迹。”

“就我收集的数据如何帮助这些公司而言,从高尔夫行业的角度看,力数据量很大。我们进行一种波形曲线分析。我实验室的测力板每秒收集约100帧数据。如果一个高尔夫挥杆大约三分之一到三分之二秒,那仍然可能有500到600个数据点。而这只是一个维度。我们从三个不同维度观察:上下、左右、前后,我们还观察旋转。你可以看到这些数据如何迅速变得令人不知所措。因此,公司最不希望做的就是向教练出售一套测力板,然后让教练立刻被数据淹没,不知道如何利用它为面前的球手做出决策。归根结底,球手来了,我能否利用所有这些数据做出更明智的决策,帮助这位球手更快地进步?因为他们与这位球手只有一小时的时间。如果他们不能在这一小时内改善球手的击球方式,他们就不可能让球手再来上多次课程。因此,能够清晰地理解数据的细微差别,然后能够将这些信息传达给教练,让他们能够根据我们提供的信息,根据这位球手的情况,在数据中找到他们需要关注的内容,从而做出有意义的改变,帮助球手比盲目猜测更快地进步。”

“我认为关于数据如何帮助你做出正确决策,我听过最酷的描述之一是:这适用于高尔夫球手、篮球运动员、排球运动员等任何运动员。他这样描述:如果你去看医生,你说‘嘿,这是我的药瓶,这是我的药桶,我不会给你做任何检查,你只需把手伸进桶里抓一把药,你可能拿到降压药,可能拿到降胆固醇药,可能拿到其他什么药,然后你就希望它有效’。而能够实际收集数据,就像你说的,使我们能够真正深入数据,并开出他们所需的确切、特定的药片,就像医生会尽可能多地进行检查一样。这能让教练更快地为球员做出改变。”

在这个例子中,测力板和动作捕捉技术被用来收集关于球员如何转移重心、挥动球杆等数据。然后可以分析这些数据,以识别高尔夫球手挥杆的弱点,并提供球员可以执行的特定训练建议,帮助他们将球打得更远、更直。


案例二:制造业的预测性维护 🔧

上一节我们看到了数据在体育训练中的应用,本节中我们来看看工程和制造公司如何使用数据分析来预测机器何时需要维护。

在制造业中,机器被用来执行许多任务,但这些机器的各种部件会磨损,需要维护或更换,否则就会损坏。即使机器有定期维护计划,意外故障也会发生。意外故障会产生高昂的现金成本,尤其是当机器的一个损坏部件导致另一个部件也损坏时。此外,机会成本也很高,因为必须花费时间来识别故障源并修理损坏的部件,而不是用于生产产品。

一种数据驱动的解决方案是使用预测性维护。科恩是一家专注于人员运输的工程公司,尤其是使用电梯和自动扶梯。如果你曾在高层建筑工作,并依赖电梯到达你的楼层,那么你可能从个人经验中知道,当电梯停运时,有时会出现长时间的延误。

科恩与IBM合作,使用连接到互联网的传感器对电梯设备进行24/7监控。

现在,他们不再等待客户打电话报告电梯故障,而是使用传感器数据创建模型,预测部件何时会损坏,然后在低使用率时段安排维修。

在这个例子中,努力被投入到使用战略性地放置在电梯设备上的传感器来收集数据,以提供持续监控。然后,传感器数据被用来创建模型以预测未来事件。


案例三:网站设计的A/B测试 🖥️

上一节我们探讨了数据在预测性维护中的作用,本节中我们来看看数据分析如何用于有效设计网站。

在线旅行社行业的公司倾向于将旅行者与交通、住宿、餐饮和其他活动联系起来。作为消费者,你可能从个人经验中知道,计划一次旅行需要考虑很多因素。因此,该行业的公司必须设计一个网站,既能提供适量的信息,又能营造一种紧迫感,使网站访问者不会转到其他网站进行购买。这是一个相当难以实现的平衡,而且必然会有许多设计意见。

那么,如何决定正确的设计呢?公司可以使用各种网站设计运行A/B测试,然后分析结果。这些A/B测试本质上是实验,消费者被随机分配到网站的现状版本(版本A)或实验版本(版本B)。

然后可以量化和分析客户行为,以确定实验版本是否比现状版本产生更理想的行为。如果是,那么实验版本就成为新的现状。

Booking.com 是一家将这一理念发挥到极致的公司。他们允许组织中的每位员工进行实验。

这种所有员工都可以进行实验的自由,导致每年进行数千次实验。Booking.com 拥有完善的基础设施来跟踪消费者行为如何受到网站每个版本的影响。尽管只有大约10%的测试能带来转化率的提升,但他们学到了很多关于如何微调网站设计和增加利润的知识。

因此,在这个例子中,必须仔细创建、存储和分析数据,以便Booking.com能够快速决定是否应该实施新版本的网站。


案例四:药物发现中的关系探索 💊

上一节我们了解了A/B测试在优化用户体验中的应用,本节中我们最后来看看数据分析如何用于探索复杂关系。

制药行业的药物发现在很大程度上依赖于探索体内蛋白质和化合物之间的复杂关系。考虑到人体中有数万种蛋白质可能成为治疗疾病的目标,以及理论药物空间中有无数分子,识别一种潜在的抗病药物是一项令人难以置信的任务。

如果我们试图系统地遍历每个分子和蛋白质的组合,那将永远无法完成。然而,如果公司能够对蛋白质及其化合物进行分类,然后计算并探索最有希望的关系子集,那么这个过程就可以快得多。

大型制药公司百时美施贵宝与生物技术公司Cirs合作,以发现有效的治疗方法。


Cirs收集了一系列海洋化合物,然后应用其专有的Atlans数据挖掘技术,快速识别治疗疾病的候选疗法。

在这个例子中,对数据进行处理以快速找到可能导致有效治疗的关系。然后探索数据以发现这些关系。


总结与核心要点 🎓

在本节课中,我们一起学习了将业务数据转化为商业洞察的完整过程。再次请注意,领域知识在所有例子中的重要性。如果没有对底层业务及其行业的了解,企业首先就不会收集正确的数据,更不用说分析数据并以能带来可操作洞察的方式解释结果了。

总而言之,请记住,数据只是一种原材料,就像油漆、植物和混凝土是创造这个美丽艺术公园的人们的原材料一样。通常需要付出努力来有效地收集和分析数据。将数据与领域知识和有效的数据处理工具相结合,可以产生能够付诸行动的洞察,从而将企业和组织提升到新的水平。

090:你的思维是最重要的工具 🧠

在本节课中,我们将要学习商业分析中一个至关重要的核心理念:你的思维是最重要的工具。我们将探讨创造力如何成为商业分析的核心,以及如何培养兼具创造力和分析性的思维模式。


虽然Python和生成式AI是用于商业分析的强大工具,但除非你拥有有效运用这些工具解决问题的方法,否则它们不会带来太多益处。因此,在本课中,我们首先要强调,你的思维是最重要的工具。

那么,如何才能释放你思维的潜力呢?我们想从讨论创造力开始。没错,就是创造力。这也正是我们身处南加州巴恩斯德尔画廊剧院前的原因。

对一些人来说,这可能显得不同寻常,因为创造力通常与绘画、摄影或建筑等艺术学科相关联。然而,我们认为创造力是商业分析的核心。

让我们通过首先定义创造力来探究其原因。

《牛津学习者词典》将“创造力”定义为:运用技能和想象力来创造新事物或艺术。这个定义虽然支持创造力源于艺术领域的观点,但它也普遍适用于创造事物。具体而言,这个定义提到了“新”或“原创”的概念,并指出创造力需要技能和想象力。因此,当你结合技能、想象力和努力时,你就踏上了创造之路。

像列奥纳多·达·芬奇和文森特·梵高这样的创意艺术家,他们擅长使用画笔等工具和颜料等原材料。他们也运用自己的想象力,我们推测这深受其领域知识(如人体知识)的影响。最后,他们付出努力,运用技能将想象中的画面转化为画布上的原创绘画。

同样,有创造力的商业分析师擅长使用硬件、软件等工具来收集和分析他们的原材料——数据。他们也运用想象力,这深受其商业经验的影响,并决定如何收集和分析数据。最后,他们付出努力,应用数据分析的结果,并将发现转化为可操作的见解,以便与他人沟通。

因此,我们要强调,商业分析需要大量的创造力。我们希望这对那些认为商业分析仅仅是死记硬背规则和公式、重复应用相同流程的人来说是个好消息。


上一节我们探讨了创造力在商业分析中的核心地位。本节中,我们来看看创造性的思维模式与分析性的思维模式并不矛盾。

我们已经确认创造力是商业分析的重要组成部分。我们还想强调,创造性思维与分析性思维并不冲突。分析性思维是指将问题分解成更小的部分,并系统地处理这些部分,使它们组合成一个连贯的整体。

我们推测,像列奥纳多·达·芬奇这样的艺术家,会将脑海中的想法分解成更小的部分,然后以结构化、系统化的方式去实现这些部分。例如,在画人脸时,艺术家可能先勾勒脸部轮廓,然后勾勒眼睛、鼻子、嘴巴和耳朵,之后才上色。上色时,他们可能会先画这些部分,然后再填充脸部的颜色。

类似地,商业分析师需要将一个商业问题分解成更小的部分,然后以结构化、系统化的方式去实现这些部分。例如,在制定客户细分策略时,商业分析师必须决定从何处获取数据、如何清理和汇总数据、哪些指标对细分客户最重要、创建多少个不同的客户细分、使用何种合适的算法来创建客户细分,以及如何以有意义的方式向利益相关者解释和传达结果。


在商业分析和艺术领域,培养兼具创造性和分析性的思维模式比工具和原材料更为重要。

创造性思维深受技能、想象力和投入努力的意愿影响。事实上,创造性的分析思维是你最重要的工具。这一点很重要,因为在本课程中,我们的重点确实是培养你的思维模式,而工具是次要的。

你可以使用多种工具来分析数据。我们鼓励你熟悉并最终掌握我们将重点关注的工具,即Python和生成式AI,两者都可以在个人电脑上运行。软件和硬件的进步使数据分析成为可能,没有它们,我们将无法从积累的所有数据中获得太多见解。


请记住,虽然这些工具非常出色,但它们本身并不会创造价值,就像把画笔放在颜料和画布旁边不会自动产生原创艺术品一样。😊

画笔、颜料和画布只有在技艺精湛且富有想象力的艺术家付出努力,系统地将颜料涂抹到画布上时,才会产生原创艺术品。

我们的目标是,在本课程结束时,你将在思维模式和软件工具方面打下基础技能,从而能够为许多商业问题提出创造性的解决方案。就像为巴恩斯德尔艺术公园的艺术画廊、景观和建筑做出贡献的艺术家们一样,他们的作品为许多人带来了享受。


总结

本节课中,我们一起学习了商业分析中思维模式的核心地位。我们明确了创造力不仅是艺术领域的专属,更是商业分析解决问题的关键驱动力。我们探讨了如何将创造性思维与分析性思维相结合,通过系统性地分解问题并付出努力,将技能和想象力转化为可执行的商业洞察。最后,我们重申了工具(如Python和生成式AI)是强大的辅助,但培养创造性的分析思维才是你最根本、最重要的工具。

091:系统1与系统2 🧠

在本节课中,我们将深入探讨分析思维的含义。我们将了解人类决策的两种模式,识别在商业数据分析中常见的思维偏差,并学习如何在直觉与分析之间做出明智的切换。

欢迎来到南加州的巴尔斯代尔艺术公园。这座公园是蜀葵之家的所在地。这座房子因其周围美丽的蜀葵植物而得名。它由著名建筑师弗兰克·劳埃德·赖特设计。这座房子非常美丽且独特。许多细节使其独具美感。例如,房子侧面雕刻着许多蜀葵雕塑,屋顶和花园周围也有独立的蜀葵雕塑。此外,房子周围种植了许多蜀葵。还有一个美丽的庭院,里面有绿色的水池。

虽然弗兰克·劳埃德·赖特是一位富有创造力的天才,但我认为他也懂得如何运用分析思维。我这样认为是因为他能够把握整体构想,然后将其分解成更小的部分,有条不紊、系统性地处理,最后再将它们组合成一个连贯的整体。

直觉与分析的较量

上一节我们提到了分析思维的重要性,本节中我们来看看它在具体问题中的体现。让我们看几个简单的问题。我会问你这些问题,只给你几秒钟时间写下答案。准备好了吗?开始。

以下是三个快速测试题:

  1. 一个球棒和一个球总共花费1.10美元。球棒比球贵1美元。球的价格是多少?
  2. 如果5台机器用5分钟制造5个零件,那么100台机器制造100个零件需要多长时间?
  3. 湖中有一片睡莲。每天,这片睡莲的面积会翻倍。如果它需要48天覆盖整个湖面,那么覆盖半个湖面需要多少天?

现在,看看你的答案。
第一个问题的答案是5美分。
第二个问题的答案是5分钟。
第三个问题的答案是47天。
如果你的答案是10美分、100分钟或24天,那么你错了,但很多人和你一样。每个问题都有一个明显但错误的答案,大多数人都会给出这个答案。

当你选择显而易见的答案时,很可能是因为你没有理由或没有能力花时间深入、仔细地思考它们。

系统1与系统2

丹尼尔·卡尼曼是一位诺贝尔经济学奖得主。他的工作专注于判断和决策,对包括商业在内的许多领域产生了巨大影响。他的研究发现挑战了“人类是理性决策者”这一传统经济学假设。

在他的著作《思考,快与慢》中,他谈到人类有两种决策系统。

  • 系统1 是快速、不费力且凭直觉的。
  • 系统2 是缓慢、费力且更具分析性的。

系统1的思维模式快速、不费力,并依赖于被称为启发法或经验法则的认知捷径来做出决策。当我们使用启发法时,我们试图将观察结果套入现有的思维模式,而不是花时间去创建一个新的模式。

启发法通常非常有用,因为我们可能没有时间和精力去仔细考虑所有呈现给我们的信息。例如,启发法让我们能快速评估信息,并常常能识别这些信息是否来自可靠来源。

然而,在某些常见情况下,这些启发法会导致有偏见或不正确的答案。如果我们能意识到这些启发法失效的情况,那么我们就有希望切换到系统2,即更慢、更有意识、更审慎的分析思维模式。这样,我们在得出最终的无偏见决策之前,会进行更仔细的思考。

大数据分析中的常见偏差

上一节我们介绍了两种思维系统,本节中我们来看看在应对大数据时可能遇到的一些具体启发法偏差,以便你能更好地识别它们何时可能导致有偏见的决策。

以下是几种常见的认知偏差及其在商业分析中的体现:

  • 锚定偏差:当你过于依赖一个可能不相关的参考点(锚点)且调整不足时,就会发生锚定偏差。

    • 商业分析示例:当你使用各种模型进行预测时,你可能对第一个模型的预测结果(锚点)赋予过多权重,而对后续可能更准确的模型的预测结果重视不足。
  • 聚类错觉:这是一种在随机数据中看到模式的倾向。

    • 商业分析示例:当你试图识别欺诈交易时,如果一个模型将某些交易模式或群体识别为欺诈,并且你看到附近有类似的观察结果,你可能会假设附近的交易也是欺诈性的,从而错误地标记无辜客户,或漏掉符合不同模式的实际欺诈。
  • 可得性偏差:指倾向于根据某件事在脑海中浮现的容易程度来高估其发生的可能性。

    • 商业分析示例:在财务预测中,如果财务团队依赖的历史数据显示某些经济指标波动较大,他们可能会假设未来的波动会遵循相同模式,即使当前情况已有所不同。
  • 信息偏差:认为更多信息总是能带来更好的决策,即使信息不相关。在我们能够获取大量数据的今天,这种偏差尤其重要。当我们经常听到“大数据”这个词时,更容易陷入这种偏差。有时,更多数据可能是有害的,因为它会分散我们对主要问题的注意力,或使我们偏离正轨。

  • 确认偏差:倾向于选择性地寻找、处理和回忆那些只支持我们当前观点的信息。

    • 商业分析示例:在创建推荐算法时,这种偏差尤其相关,因为它可能导致更大的两极分化,因为算法只会推荐与我们已看过的内容相似的文章和产品。牢记考虑不同观点的价值非常重要。

虽然还有各种其他偏差没有提及,但我想提醒你,启发法可以帮助我们,并且是我们思维运作中美好的一部分。主要思想是识别你自己和他人可能过度依赖这些启发法并最终做出有偏见决策的情况。如果你有时间更仔细地考虑这个决策,并且这个决策很重要,那么你应该暂停一下,采取更具分析性的系统2方法。

实践中的思维切换

我们采访了伊利诺伊大学校友、美国国家橄榄球联盟布法罗比尔队的分析与应用开发总监路易斯·吉列尔莫,询问他是否曾做出快速、不费力的决策,以及他如何知道何时从系统1思维切换到系统2思维。

“系统1,快速且不费力。系统2,缓慢且有方法。我认为它们都有其用武之地。我认为,随着我职业生涯的发展,基于经验,我越来越多地使用系统1。我以前见过,我知道需要做什么,这就是我们需要做的方式,你去执行。所以我从流程的角度来思考它,不一定是指它花费的时间短(希望如此),而是知道你需要采取什么流程来快速回答问题,这非常有价值,因为时间至关重要。所以,实际上我经常使用系统1。但这并不意味着我们不验证结果。从验证的角度,我通常告诉我的员工,当你认为你100%正确时,再检查一遍。但是,每当你遇到任何新问题、新数据,如果是新领域,系统2几乎是唯一的选择。你不想一头扎进去,自以为知道该怎么做,其实并不知道。那时你需要提问,尝试理解,你的方法要有条理,确保每一步都做得正确,并且结果符合你的预期。”

我非常喜欢路易斯的见解:当你对某个问题积累更多经验时,你就能更频繁地使用系统1思维。相反,当你面对一个新问题时,你应该切换到系统2思维,并将你的领域知识应用到具体情境中。

总结与练习

本节课中,我们一起学习了分析思维的核心——系统1(快速直觉)与系统2(慢速分析)的决策模式。我们探讨了在大数据分析中常见的几种认知偏差,如锚定偏差、聚类错觉等,并了解了何时应该从直觉切换到深入分析。

最后,这里有一个非正式的练习,可以让你练习同时运用创造性和分析性思维,就像著名建筑师弗兰克·劳埃德·赖特那样。看看你是否能找出一个你基于启发法做出决策,但后来发现决策有缺陷的例子。也许它与你的某次购买、一项投资决策、一次招聘决定或对某人某事的判断有关。

尝试找出你为什么做出了有偏见的决策。即使这个偏差不是本节课提到的,甚至没有名称,也没关系。然后与他人分享这个决策,以及你本可以如何避免做出这个有缺陷的决策,这样你就可以帮助他人避免犯同样的错误。你不仅会帮助他们,而且我相信,通过仔细思考你可能犯过的偏见,你将能更好地避免未来的偏见。

092:归纳与演绎推理 🧠

在本节课中,我们将要学习商业分析中的两种核心推理方法:演绎推理与归纳推理。我们将了解它们如何帮助我们从数据中提取洞见,并做出更明智的商业决策。

概述

位于南加州的格里菲斯天文台是一个标志性地点,坐落在广阔的洛杉矶大都市之上。类似这样的地点,至少通过两种普遍方式帮助我们增进对宇宙的理解。

首先,天文台中的望远镜帮助我们观测天体现象,并识别恒星、行星及其他天体运动的新模式。其次,天文台记录这些模式和已确立的定律,进而可用于预测未来的天体事件。

简而言之,这个天文台帮助我们运用系统二的思维模式,仔细且系统地思考与天体事件相关的数据。

从天文到商业:系统化思维

现在,让我们思考这与商业事件有何关联。一旦你确定某个商业决策值得投入时间,你就应该切换到系统二的思维模式,即仔细且有方法地思考问题。

接下来,让我们看看在处理大数据时,能帮助我们逻辑性地得出答案的一些推理技巧。两种常被比较的推理体系是演绎推理和归纳推理。

两种推理方法:演绎与归纳

通常认为,演绎推理是一种自上而下的方法,从一般规则出发,推导出具体的结论。其逻辑形式可表示为:
如果 P 成立,则 Q 成立;P 成立;因此,Q 成立。

而归纳推理是一种自下而上的方法,利用观察结果来创建一个更普遍的规则。其过程可概括为:
观察现象 A、B、C... → 发现模式 → 提出一般性假设或规则。

商业分析中的演绎推理

我们在商业分析中经常使用演绎和归纳推理。当我们基于论证的有效性来确定结论的真实性时,就会用到演绎推理。

例如,从会计角度看,我们知道公司的资产等于负债加上所有者权益。因此,如果我们知道资产和负债的价值,就可以推导出所有者权益的价值。

从商业分析的角度看,如果在网站分析数据中观察到来自特定地区的网站流量突然下降,演绎推理可能涉及考虑潜在原因,如该地区的服务器宕机、当地互联网基础设施的变化或针对性审查,然后逐一调查这些可能性。具体来说,如果是服务器宕机,你可能会看到该地区所有用户的网络流量突然全部停止。另一方面,如果是针对性审查,你可能会看到该地区部分用户的网络流量停止。

所以,演绎推理从一个前提开始,然后评估数据以查看其是否支持该前提。

商业分析中的归纳推理

与演绎推理相反,在使用归纳推理评估推论时,前提并不旨在被证明为绝对有效。你可能观察到一个模式,然后从该模式中推断出一个一般规则。

我正站在这片贫瘠、干燥、类似沙漠的气候中,旁边是这些像地精形状的岩石构造。地质学家认为,现在这片沙漠曾经是海滨地带。地质学家得出这个结论的方式,可能是归纳推理如何运作的一个好例子。

他们可能看到了这块岩石上的纹路,并提出了一个观点:造成这些纹路的原因是水在该区域涨落流动的结果。这一条证据不足以提供确凿的支持来证明这里曾是海滨地带,但当他们看到这种模式在这里一遍又一遍地重复出现数十次时,它就支持了那个假设。直到他们看到证据表明这里不是海滨地带,或者直到出现一个更好的假设来解释岩石上的这种模式之前,科学家们将继续相信这里曾是海滨地带,而这种信念最终会成为一个被普遍接受的前提,在此基础上可以建立额外的假设。

商业中归纳推理的一个例子是坏账费用的计算。由于坏账费用是对某一期间产生的、将永远无法收回的应收账款金额的估计,它通常是通过观察历史收款模式推断出来的。

具体来说,如果我们从历史数据中观察到,在过去五年中,每个月平均有 3% 的应收账款从未收回,那么我们可能会建立一个一般规则:每个月,坏账费用将占月度赊销额的 3%

现在,商业分析使我们能够完善坏账费用的估计。例如,如果我们观察到在每月的某个特定时间进行的购买,其坏账费用更高,那么我们或许能提出一个假设,然后通过额外的分析来证实它。

推理方法的结合使用

演绎推理和归纳推理在分析性地寻找问题答案时都很有用。

你可能从一个你认为正确的前提开始,然后收集数据来支持它是正确的。当你收集数据来验证那个前提时,你可能会发现一些证据表明它并不总是正确的。在这种情况下,你可以从该模式中进行推断,以生成一个修改过的或补充性的前提。

以下是一个例子:假设你知道销售收入比预期要好。根据这个观察结果,你使用归纳推理假设这是由于支付了社交媒体影响者的广告费用所致。

当你收集社交媒体数据时,你发现社交媒体平台上的点赞和评论确实增加了。然而,你还发现你的市场经理一直在付费给社交媒体渠道来推广帖子。

因为已经充分证实,额外付费在社交媒体上推广帖子确实会导致销售额增加,所以你使用演绎推理推断,销售额的增加可能同时由微影响者和社交媒体帖子推广所导致。

因此,你现在必须尝试弄清楚这两种行为各自的影响。解析每种行为的独特效果,是一类可以通过数据分析技术解决的问题,这将在另一节关于回归的课程中讨论。

总结

本节课中,我们一起学习了商业分析中的演绎推理与归纳推理。

关键要点是,演绎推理和归纳推理都能在商业环境中带来更有效的数据分析。演绎推理可以引导你收集相关数据,并在分析中包含正确的变量。归纳推理帮助你识别数据中意想不到的模式,这些模式可用于创建一个更普遍的规则,然后应用于其他情境。

请记住,无论你是从一个坚实的理论出发,还是在数据中发现有趣的模式,这些逻辑工具都是你做出更明智的数据驱动决策的秘密武器。这些逻辑工具将在任何商业领域,甚至在天体领域帮助你。现在,自信地去分析吧。

093:让数据说话 🎯

在本节课中,我们将探讨数据分析的两种核心思维路径:问题驱动数据驱动。我们将通过具体案例,理解如何让数据在商业决策中“发声”,并学习如何克服个人偏见,建立以数据为基础的决策文化。


从商业问题出发 🎯

上一节我们介绍了数据分析的两种推理方式。本节中,我们来看看第一种应用路径:从明确的商业问题出发,再寻求数据分析的解决方案。

一家大型洒水器制造公司通过家得宝等家居建材商店销售产品。其销售具有强烈的季节性,通常在春季飙升,因为人们会开启灌溉系统并发现设备在冬季损坏。商业建筑和园林绿化业务也在此时增加。该公司面临的问题是:确保在春季销售高峰到来前,商店有足够的库存,否则将错失大量销售机会。这类似于“黑色星期五”购物潮,但制造商无法预知其具体发生时间,且不同地区因天气差异,销售高峰时间也不同。

以下是该公司可以采取的步骤:

  1. 获取历史数据:收集历史销售数据和天气数据。
  2. 建立预测模型:分析数据,识别导致销售激增的天气条件模式。
  3. 应用模型预测:将天气预报数据输入模型,预测各地区销售高峰的周末。
  4. 优化库存管理:根据预测,提前向各地区调配适量的产品库存。

这个场景是典型的“商业问题先行”。公司先有“何时会出现销售高峰”的问题,然后通过收集和分析数据来寻找答案。


从数据本身出发 📊

上一节我们看到了如何用数据解决已知问题。现在,让我们看看相反的路径:先有数据,再从中发现可解决的商业问题。

假设一家小型餐厅拥有多年的销售点数据。餐厅经营状况良好,但业主希望找到降低成本的方法以提升利润。他们将销售数据与成本数据结合分析。

通过分析这些数据集,他们可能发现可以识别出人员配置过剩的时间模式。于是,他们提出了一个新的具体问题:在一周中的哪些时段,我们的人员配置过剩?

以下是他们可以采取的步骤:

  1. 识别模式:分析数据,找出客流量低但员工排班多的时段。
  2. 调整排班:根据洞察,不在那些时段安排员工上班。
  3. 创造新价值:或者为那些时段的员工规划新的增值活动。

这个案例是“数据先行”的范例。通过分析现有数据,他们发现了潜在的商业问题(效率优化),并据此采取行动。


让数据说话:克服偏见 🧠

我们介绍了两种启动分析的路径。然而,比选择路径更重要的是,如何对待数据分析的结果,尤其是当结果与固有信念相悖时。

Booking.com 是一家在线旅游机构,它允许所有员工对网站设计进行A/B测试,每年运行数千次实验,并用数据分析评估效果。由于任何人都可以发起实验,包括高管在内的所有员工都必须准备好用数据结果支持自己的观点,并承认自己的观点可能是错的。

这很困难,因为相信并承认自己错了对我们所有人来说都非易事。幸运的是,Booking.com 通过运行大量实验,建立了一种“让数据说话”的实验文化,这使得员工更容易接受数据证明自己观点错误的事实。

需要明确的是,我们并非否定意见、专业判断、经验法则和直觉的价值。我们强调的是,在这个拥有海量数据和强大分析工具的时代,我们必须确保数据在商业决策中拥有发言权。


总结 📝

本节课中,我们一起学习了数据分析的两种核心思维模式。

  • 问题驱动:先有明确的商业问题,再收集和分析数据来寻找解决方案。
  • 数据驱动:先探索和分析现有数据,从中发现潜在的商业问题或优化机会。

无论你从问题还是数据入手,最关键的原则是:让数据说话。不要让假设或直觉像六月的阴霾一样遮蔽你的决策。“在我看来”这句话的出现频率,应该远低于“数据显示”。

正如南加州持久的阴霾终将散去,显露出建立在坚实基础上的高速公路与建筑;你的商业决策也应拨开不确定的迷雾,牢固地建立在数据的基础之上。让数据成为你的向导,让它驱散不确定的乌云。

094:课程数据集简介 📊

在本节课中,我们将学习本课程将要使用的核心数据集——TechCA数据集。我们将了解其来源、结构、包含的字段组别以及如何为后续的分析任务做好准备。


当我们观察这个精心规划的社区时,它很好地提醒我们,组织和细节是理解复杂系统的关键。这正是我们将在本视频中要做的。具体来说,在本视频中,我们将练习在一些非常酷的销售点数据上应用数据分析工具。

在本课中,我们将详细浏览该数据集,以便你在思想上为如何处理它做好准备。

我们将使用的数据集称为 TechCA 数据。它来自一家名为 TechCA 的虚构公司,该公司在美国各地拥有超过 150 家便利店和加油站。这些商店销售典型的便利店商品,如汽油、糖果、苏打水、薯片、彩票等。

虽然这个 TechCA 数据集相当大(尤其是按 Excel 的标准),但它实际上只是所生成数据的一小部分。我们已将其缩小为 2023 年至 2025 年的数据样本。如果使用所有数据,它将包含数亿行,个人计算机将难以处理。


上一节我们介绍了数据集的背景,本节中我们来看看数据是如何聚合的。

该数据集的每一行代表单次交易中的一个独特产品。如果客户在一次交易中购买了两个不同的产品,那么该客户的交易将对应两行不同的数据。重要的是,如果客户购买了两个相同的产品,那么该交易将只有一行数据。还需要注意的是,客户在一次访问中可能进行多次交易。例如,如果客户购买了一个早餐卷饼,然后在离开前几分钟决定返回为朋友或家人再买一个早餐卷饼,那么每次交易都会有一行独立的记录。


了解了行的含义后,接下来我们看看数据列。数据集中有数十列,可以分为五组。

以下是数据列的分组说明:

  • 第一组:交易信息组

    • 这些列包括每行的唯一标识符、交易编号和交易日期。
  • 第二组:客户信息组

    • 这实际上只有一列:客户ID。此唯一标识符仅对忠诚度奖励计划的会员已知,否则为空。
  • 第三组:产品与类别组

    • 这组列包含产品名称及其在产品层次结构中的位置信息。具体来说,所有产品都属于一个类别,所有类别都属于一个父类别。因此,父类别列的不同值数量最少,类别列的不同值数量多于父类别,而产品列的不同值数量最多。
  • 第四组:门店信息组

    • 此组中的列包含商店位置信息,如城市、州、邮政编码和经纬度坐标。为了保护实际的便利店,坐标已更改为附近邮局的坐标。此外还有一个门店ID列。
  • 第五组:收入与利润组

    • 这些列表示与每行数据相关的收入和利润金额。这些列在我们的分析中将至关重要。


由于这些数据非常细粒度,因此可以在许多不同层级上进行聚合,例如按小时、日、月、年、客户、产品、类别、父类别、盈利能力以及这些特征的组合进行聚合。换句话说,从这些数据中可以获得许多潜在的商业洞察。

虽然数据已经过相当程度的清理,但我们保留了一些数据准备任务供你完成。


本节课中我们一起学习了 TechCA 数据集的基本情况。正如这个社区精心规划的基础设施可以实现顺畅的导航和可预测的结果一样,理解这个数据集的结构将使你能够驾驭其复杂性并发现宝贵的见解。这只是对数据的介绍,在后续课程中,当你进行一些数据准备和探索任务时,你会对它更加熟悉。

准备好深入探索吧。

095:事实框架 🧭

在本节课中,我们将学习一个用于将数据分析应用于商业问题的程序性框架——FACT框架。这个框架将指导我们如何从问题出发,最终获得可执行的见解,确保分析过程清晰、高效。


正如我们不会在没有地图或计划的情况下,贸然踏上一条云雾笼罩的陌生小径一样,我们也不应在没有策略的情况下,一头扎进数据之中。拥有清晰的路径和正确的工具至关重要。

第一步:F - 界定问题

上一节我们强调了清晰路径的重要性,本节中我们来看看如何迈出第一步:界定问题。

从个人经验来看,除非你对要在数据集中寻找什么有初步想法,否则很容易陷入一个无休止的循环,花费大量时间分析数据却找不到可执行的见解。

我们生活在一个数据量不断增长的世界。无论你采用的是演绎法还是归纳法,是从商业问题出发还是从数据出发,也无论你是用商业分析来预测、探索还是实验数据,界定问题都至关重要,它能防止你淹没在数据的海洋中。

  • 从商业问题出发:你通常可以提出一个相当具体的问题。
  • 从数据出发:你可能会有一个比较宽泛的问题。这没关系,因为在开始分析数据后,你很可能会改变或细化你界定问题的方式。

第二步:A - 整合数据

在界定了问题之后,下一步就是获取和处理数据。以下是整合数据的四个关键方面。

1. 识别数据源与获取方式
数据存储在各种位置和格式中。例如,有些数据可能以CSV文件的形式存储在本地计算机上,而其他数据可能存储在远程服务器的关系型SQL数据库中。对于后者,你需要获取主机名和登录凭据。

2. 数据管理与ETL
ETL代表提取(Extract)、转换(Transform)、加载(Load)。这个过程指的是从存储位置提取数据的必要部分,将其转换为数据分析软件可读的格式,然后加载到软件中。对我们而言,ETL过程的最终结果通常是一个数据框(Data Frame),其中行代表观测值,列代表观测值的特征。

3. 数据准备
数据准备通常在读取数据之前和之后进行。常见的任务包括:

  • 合并数据。
  • 填充或删除缺失值。
  • 识别并删除重复值。
  • 清理存储不一致的数据(如日期值)。
  • 将数据列转换为正确的数据类型。
  • 处理异常值。

数据清理后,通常还需要进行预处理,以便用于可视化和算法。这可能包括:

  • 移除某些变量。
  • 汇总数据。
  • 将数据从宽格式重塑为长格式,或反之。
  • 再次填充缺失值。

4. 探索性数据分析
探索性数据分析(EDA)指的是评估数据中数值列的分布、分类列的级别,并初步了解其他双变量关系。这一步通常通过可视化和汇总统计来完成。EDA很可能揭示异常值,并提示其他数据整理步骤。根据经验,EDA常常会引向额外的数据清理和预处理,甚至可能促使你修订最初的问题。这一步本身就能揭示一些有洞察力的关系。

第三步:C - 计算结果

探索性数据分析为我们提供了初步认识,本节中我们来看看如何通过计算获得更深入的见解。

虽然数据可视化和汇总统计也是计算结果的一种形式,但它们并不总能直接带来可执行的见解。因此,在进一步细化问题并查看结果时,你需要有能力提取更精细的见解,并量化你对这些见解的信心。这就是高级分析技术(如统计分析和机器学习算法)的目的。其他课程将更详细地介绍如何使用这些复杂算法以及如何解释其结果。希望你的计算结果能带来可执行的见解。

第四步:T - 传达结果

计算出结果后,关键的一步是有效地传达给他人。我们可以通过多种方式传达结果,但Jupyter Notebook文件(交互式Python笔记本文件)和仪表板是结合叙述、代码、分析和可视化的强大方式。我们还需要确保不会用分析的细节淹没他人。因此,能够从分析结果中识别关键见解,并知道关注什么是非常重要的。其他课程将更侧重于如何向他人传达结果。


本节课中,我们一起学习了FACT框架。无论你是在加州六月阴霾天里导航蜿蜒的徒步小径,还是在处理复杂的数据集,拥有清晰的计划都至关重要。请记住FACT:界定问题(Frame)、整合数据(Assemble)、计算结果(Calculate)、传达结果(Tell)。这是你通往可执行见解的路线图,确保你总能到达目的地,即使前方的道路看起来有些模糊。

096:结论 🎯

在本模块中,我们探讨了商业分析的基础,强调了分析思维和正确方法的重要性。现在,让我们来总结本模块的核心要点。


我站在南加州西方学院美丽的校园里,是为了强调持续学习的重要性。

分析工具非常强大,尤其是在与人工智能结合使用时,前提是你已经学会了如何使用它们。因此,我们很高兴能帮助你利用这些工具来获取可执行的见解。

关键在于策略性地使用它们。如果没有仔细的聚焦,你的见解可能会偏离目标,无法回答关键的商业问题。更糟糕的是,看似可执行的见解可能会在无意中损害业务表现。

本模块课程的目的在于强调,你的头脑是你拥有的最重要的商业分析工具

我们讨论了创造力的重要性,即在不同概念之间建立联系的能力,特别是数据分析商业领域知识之间的联系。

我们也确认了拥有分析思维的重要性,这使你能够将一个大问题分解成可管理的部分。

我们让你注意到了两种不同的推理方法:演绎法归纳法。我们提醒你要对违背你商业直觉的数据分析结果保持开放态度。

但同时我们也提醒你,不应完全忽视你的直觉。

我们向你介绍了一个示例数据集,并讨论了构建问题、收集数据、计算结果以及向他人传达结果所需的步骤。

最后,我们向你介绍了一些关键的商业分析术语。

简而言之,你的头脑现在已为使用即将学习的强大商业分析软件工具做好了更好的准备。

当你将正确的思维模式与正确的商业分析工具相结合时,你可以用数据做出一些令人印象深刻的事情。

总而言之,一个傻瓜即使有了工具也还是傻瓜,但当工具与富有创造力的头脑相结合时,人类便能从中获益。


在本节课中,我们一起学习了分析思维的核心地位、创造力与领域知识结合的价值、分解问题的方法、演绎与归纳推理,以及从数据到见解的完整流程框架。记住,工具是强大的助手,但你的头脑才是驱动一切的关键。

097:Python数据分析与可视化入门 🐍

在本模块中,我们将探索一个用于数据分析和可视化的流行工具——Python。我们将学习如何安装Python,如何使用Python进行数据的提取、转换和加载,以及如何对数据进行探索性分析。掌握这些基础技能是进行任何深入数据分析的前提。

Python简介 🚀

我们将要使用的工具是Python。Python是一种通用编程语言,也是数据科学领域最流行的编程语言之一。对于一些人来说,学习编程语言的想法可能令人望而生畏,但只要付出一些努力和时间,并遵循指导,你很快就能进行富有洞察力的数据分析。

市面上有很多编程语言,学习任何一门语言都需要时间和精力。但Python尤其以其易于学习的语法而自豪,它强调代码的可读性,这使得初学者相对容易上手。此外,它是开源的,可以免费使用。

因为Python是一种通用编码语言,它可以用于各种数据分析任务,从收集数据到使用高级机器学习技术,再到可视化和沟通发现与解决方案。它是一个真正强大的工具。

开发环境:Jupyter Notebook 💻

我们将在Jupyter Notebook中编写Python程序。Jupyter Notebook是一个基于Web的应用程序,允许你运行Python代码并查看结果。它是运行Python代码的众多选择之一。然而,它的优势在于允许你将代码与文本、可视化图表以及代码的其他输出结果交织在一起。

本模块核心任务 🎯

在本模块中,我们将教你完成三项主要任务。

以下是本模块将要涵盖的核心内容:

  1. 下载和安装Python:我们将指导你如何获取并设置Python环境。
  2. 使用Python进行ETL:ETL代表提取(Extract)、转换(Transform)、加载(Load)。我们将学习如何用Python处理数据,使其变得可用。
  3. 进行探索性数据分析:EDA代表探索性数据分析(Exploratory Data Analysis)。我们将学习如何探索、描述和分析数据。

在此过程中,我们将讨论一个用于许多动手示例和演示的酷数据集。当然,关于ETL和EDA可以开设完整的课程,因此我们必然只能在一个较高的层次上进行介绍。然而,本模块的视频将为你提供足够的信息来开始使用这个工具。虽然我们不假设你有任何Python经验,但我们鼓励你探索可用的在线资源,以加深对Python的理解。

因为Python是一个开源工具,所以有非常多免费的学习资源可以帮助你掌握它。

在FRACT框架中的位置 🗺️

那么,这个模块在FRACT框架中处于什么位置呢?你可能已经猜到了,ETL和EDA属于 “计算结果(Calculate Results)” 阶段。我们已经有了问题,也知道要使用什么数据,现在我们要进行一些分析,特别是探索性分析。要做到这一点,你需要将数据导入你的工具(在我们的案例中是Jupyter Notebook),然后需要清理数据,使其可查看并尽可能减少错误。

接着,你要探索数据能告诉你什么故事,以及它如何帮助你解决业务问题或创造商业机会。一图胜千言,因此探索数据的一部分工作必然是创建一些可视化图表,以帮助你和他人与数据互动并理解数据。

数据处理的挑战与价值 ⚙️

当然,事情从来不像听起来那么容易。原始数据似乎总是存在问题、错误和混乱。事实上,你可能听过一个常见的经验法则:商业分析师80%的工作是清理数据,而像分析、呈现结果等其他所有事情只占他们大约20%的时间。

本模块将涵盖几个常见的数据清理问题及其解决方法。

我们还将教你几种常见的数据可视化方法。

本模块的应用场景 💡

这个模块能帮助你解决什么样的问题呢?我们在本模块讨论的技术适用于任何你用数据来检验的业务问题。每当你拥有数据时,你都需要查看它、清理它,并在你开始尝试解决业务问题之前理解它。如果你不了解数据中包含什么信息,或者你的数据不干净,那么用这些数据解决业务问题几乎是不可能的。

我们使用的数据来自便利店,这是一个非常丰富的数据集,因此我们可以尝试用这些数据回答很多问题。但我们在本模块的重点是准备和探索数据。我们也会提及一些可以用这些数据解决的潜在业务问题。

总结与鼓励 🌟

我们很高兴你能通过学习更多关于Python的知识来扩展你的工具包。数据清理、加载和探索是所有数据分析的基础。打开一个新的数据集并理解它,就像打开一个宝箱并解开一个谜题,也像剥洋葱一样,需要一层一层地学习。

当你学习这个模块时,请深入钻研,把玩数据。你练习得越多,你扩展数据工具包和解决业务问题的能力就越强。


本节课中,我们一起学习了:

  • Python作为数据分析工具的优势和特点。
  • 如何使用Jupyter Notebook作为开发环境。
  • 本模块的三个核心学习目标:安装Python、进行ETL操作以及执行EDA。
  • 数据处理在商业分析中的核心地位和常见挑战。
  • 数据可视化在探索和理解数据中的重要性。
  • 通过实践来巩固和提升技能的必要性。

098:数据概览 🗂️

在本节课中,我们将简要了解在本模块中将要分析的数据集。我们将使用一个为本课程创建的、名为TechA的简洁数据集。TechA是一家虚构的公司,在美国中部地区(从怀俄明州到明尼苏达州,再到阿肯色州和阿拉巴马州)拥有超过150家便利店和加油站,类似于我身后的场景。

数据集来源与规模

我们将在这个模块中使用的具体数据,是从这些便利店2023年至2025年的顾客交易记录中随机抽取的样本。尽管我们的数据集相对较大,包含了超过一百万条交易记录,但它只是所有可用交易记录中的一个随机小样本。完整的数据集将比这个大145倍以上,包含数亿条交易记录。这些顾客交易包括购买燃油、彩票、苏打水和糖果等。

现在,让我们回到正题,更深入地了解数据。

数据的聚合层级

处理任何数据集时,了解数据的聚合层级都至关重要。聚合层级指的是数据中每一行所代表的内容。例如,每一行数据是代表一个商店的交易,还是一个顾客?在我们正在检查的这个特定数据集中,每一行代表单次交易中购买的一个单一产品。因此,数据是按交易-产品层级组织的。

这意味着,如果一位顾客去商店购买了三种产品(薯片、苏打水和一张彩票),这将在我们的数据集中添加三行数据,即该次交易中购买的每种产品对应一行。即使这是一次交易,该交易也被拆分成了所购买的各个独立产品。

关键标识列

每一行数据在unique ID列中都有一个条目。这个数字对于该行是唯一的,意味着没有其他行拥有相同的数字。此外,每一行在transaction ID列也有一个条目。这个数字不一定唯一,因为一次交易可以包含多个产品,就像这里的例子:一位顾客购买了樱桃可乐、薯片和一张彩票。

因此,虽然每行的unique ID不同,但transaction ID是相同的,因为这三件商品都属于同一次交易。很多时候,一次交易可能只购买一件商品,但有时会购买更多。

数据列的分类

我们的数据集中有数十个特征或列。我们不会在此一一描述,但它们可以归纳为五类。以下是这五个类别及其中的主要列或特征。

1. 交易信息组

以下是交易信息相关的列,它们记录了交易的基本标识和时间。

  • unique ID: 行的唯一标识符。
  • transaction ID: 交易编号。
  • transaction date: 交易日期。

2. 顾客信息组

上一节我们介绍了交易标识,本节中我们来看看顾客信息。实际上,这不是一组列,而主要是一个名为Customer ID的列。该列用于标识进行购买的顾客(当顾客身份已知时)。只有当顾客是公司的忠诚奖励计划会员,并且使用其忠诚奖励号码进行购买时,其身份才会被记录。

3. 产品与分类组

接下来,我们关注交易中的商品本身。这组列用于标识产品及其名称,同时也标识产品的类型或类别。产品分类有不同的层级。

例如,好时巧克力棒的类别可能是“巧克力糖果”,这个类别会包含其他巧克力产品;而其更广泛的父类别可能是“糖果”,这个分组会包含其他糖果,包括非巧克力糖果。因此,存在两个层级的分类:一个更具体,一个更宽泛。每个产品都属于一个类别,而该类别又有一个父类别或超集。

以下是产品与分类组的主要列:

  • 产品名称。
  • 产品类别。
  • 父类别。
  • 该次交易中购买的产品数量 (product count)。

4. 门店信息组

了解商品在哪里售出同样重要。这组列标识了发生购买的便利店,包括门店名称、地址以及经纬度坐标。

但需要注意的是,为了模糊数据集中使用的实际公司信息,地址是通过引用邮局而非实际便利店来掩盖的。尽管如此,这些地址仍然接近便利店的实际位置。

5. 财务信息组

最后,也是对于商业分析至关重要的部分。最后一组列展示了所售产品产生的收入和利润金额。这些列对我们后续的分析至关重要,因为TechA是一家企业,其核心关注点在于盈利。

总结与预告

以上只是对数据的一个概览。别担心,在本模块的后续课程中,我们将更深入地探索这些数据,进行数据清洗,并更好地理解它。

本节课中,我们一起学习了TechA数据集的基本情况,包括其来源、聚合层级(交易-产品级)、关键标识列(unique IDtransaction ID),以及将数据列分成的五大类别:交易信息、顾客信息、产品与分类、门店信息和财务信息。这为我们后续的数据清洗和分析工作奠定了坚实的基础。

099:商务问题

在本节课中,我们将学习如何为数据分析设定明确的目标,并理解这些目标如何指导后续的数据处理与探索过程。我们将以TechA公司的销售数据为例,探讨如何将业务问题转化为数据分析的具体任务。

处理数据时,心中有一个明确的目标至关重要。这个目标决定了你希望通过数据实现什么,或者从数据中学到什么。它将指导你后续的所有工作。

这个目标将决定如何准备或清理数据,以及如何探索数据。通常,我们的目标是解决某种类型的业务问题。虽然我们专注于学习如何使用Python作为工具来加载、清理和准备数据(这个过程我们称之为ETL,即提取、转换、加载)。

同时,我们也关注如何总结和检查数据(这个过程我们称之为EDA,即探索性数据分析)。我们可以将目标视为试图理解数据,并最终回答与公司相关的问题。

具体来说,是TechA公司的销售和利润问题。请记住,我们使用的是TechA公司从全国便利店和加油站收集的客户交易数据。

TechA收集这些数据可能有哪些潜在用途?TechA最初为什么要收集这些数据?这些数据可以帮助TechA解决哪些业务问题?

以下是这些数据可以回答的几个问题示例。我们的销售季节性如何?我们可能希望观察特定产品销售额和盈利能力的变化,以理解导致销售额或盈利能力增加或减少的因素。

例如,与去年相比,饮料的销售额发生了怎样的变化?原因是什么?与去年同期相比,本月糖果和口香糖的毛利率发生了怎样的变化?原因是什么?

我们可能希望根据地理位置,识别哪些产品总体上更成功。我们可能希望回答关于哪些产品应该增加或减少库存的问题。

或者,我们可能希望调查特定商店的销售情况。例如,能量饮料在一家商店的销售速度与另一家商店相比如何?哪些因素导致了更高的销售额?

在本模块中,我们将开始探索类似这样的几个问题。但只有在我们清理、准备并理解数据之后,才能开始处理数据。

ETL和EDA是本模块的重点,我们将使用数据分析工具Python来执行这两个过程。


本节课中,我们一起学习了为数据分析设定明确目标的重要性。我们了解到,业务问题(如分析销售季节性、产品表现或门店差异)是数据分析的起点,而ETL(提取、转换、加载)和EDA(探索性数据分析)是使用Python工具回答这些问题的关键准备步骤。在接下来的学习中,我们将具体实践这些过程。

100:Jupyter Notebook与Python安装教程 🚀

在本节课中,我们将学习如何在Windows PC和Mac电脑上下载并安装Jupyter Notebook和Python。我们将使用JupyterLab桌面应用程序,这是一个非常便捷的工具,它允许你像使用Microsoft Word或Excel一样,通过双击文件来打开笔记本。

概述

我们将分步完成以下操作:

  1. 在Windows PC上下载并安装JupyterLab桌面应用。
  2. 为JupyterLab安装Python环境。
  3. 在Mac电脑上完成相同的安装步骤。

在Windows PC上安装

上一节我们介绍了本教程的目标,本节中我们来看看如何在Windows PC上完成安装。

首先,我们需要在PC上同时安装Jupyter Notebook和Python。我们将下载JupyterLab桌面应用程序。这是一个非常棒的桌面应用,你可以通过双击笔记本文件来打开它,就像使用Microsoft Word或Excel一样。我们将先下载JupyterLab桌面应用,然后安装Python环境。如果你的电脑上已经安装了Python,可能不需要执行第二步。

以下是具体步骤:

  1. 访问GitHub页面:https://github.com/jupyterlab/jupyterlab-desktop
  2. 向下滚动到“Installation”部分。由于我们正在使用Windows电脑,请点击“Windows installer”链接进行下载。
  3. 下载完成后,双击下载的文件以执行安装程序。
  4. 当系统询问是否允许此应用对你的设备进行更改时,选择“是”并同意许可协议。
  5. 安装过程很快。安装结束时,确保“Run JupyterLab”选项被勾选,然后点击“完成”。这将打开JupyterLab桌面应用程序。

安装完成后,你可能会注意到桌面应用中的许多选项是灰色的。这是因为我们只安装了JupyterLab应用程序,还没有安装Python环境。

为了解决这个问题,我们将使用捆绑安装程序来安装Python。在JupyterLab应用窗口底部,你会看到提示“Python environment not found”,点击“install using the bundled installer”链接。

安装过程可能需要几分钟。完成后,底部的警告信息会消失,之前灰色的选项(如创建新笔记本、打开文件)将变为可用。

现在,你可以点击“Create a new notebook”来创建一个新笔记本,选择“Python 3”作为内核,然后就可以开始编辑和使用这个笔记本了。这就是我们后续课程中将使用的Jupyter Notebook环境。


在Mac上安装

上一节我们完成了Windows PC的安装,本节中我们来看看在Mac操作系统上的安装步骤。这种方法的一个巨大优点是,无论你使用Windows还是Mac,步骤几乎完全相同。

首先,打开网页浏览器。你可以搜索“Jupyter Lab desktop”,请注意拼写是“JupyterLab”一个词,并且“Jupyter”的拼写是 J-U-P-Y-T-E-R。这个名字是为了致敬Jupyter项目支持多种数据分析语言,包括Julia、Python和R。

在搜索结果中,你应该会看到一个指向GitHub仓库的链接,标题通常是“JupyterLab desktop application based on Electron”。点击这个链接,它会带你到GitHub页面。GitHub是开发者分享开源代码的网站,JupyterLab桌面版就是一个免费的开源应用。

进入GitHub页面后,向下滚动到“Installation”部分。这里有一个表格,列出了三个主要操作系统对应的安装文件。

以下是针对Mac用户的选择:

  • 如果你使用的是较新的、搭载 Apple Silicon芯片(如M1, M2, M3等)的Mac,请点击“Apple Silicon”对应的链接。
  • 如果你使用的是较旧的、搭载 Intel芯片的Mac,请点击“Intel”对应的链接。

如果不确定自己的Mac型号,可以点击屏幕左上角的苹果图标,选择“关于本机”。在“芯片”信息栏中,如果显示“Apple M…”字样,那么你使用的是Apple Silicon版本。

点击正确的链接后,会开始下载安装程序(约300MB)。下载完成后,双击.dmg文件。对于Mac用户,标准的安装方式是将JupyterLab图标拖拽到“应用程序”文件夹中。

安装完成后,你可以在“应用程序”文件夹中找到JupyterLab并双击打开。首次打开时,Mac系统可能会提示你确认是否要打开此应用,点击“打开”即可。

应用启动后,你会看到欢迎页面。左侧“Start”区域有三个灰色的链接和一个可用的“Connect”链接。为了让灰色链接可用,我们需要安装Python环境。

在窗口底部,你会看到警告“Python environment not found”,并提供了几个链接。最简单的方法是点击“install using the bundled installer”。

点击后,安装程序将开始安装Python以及一些常用的数据分析Python模块。这个过程不会太久。

安装成功后,底部的警告会消失,之前灰色的链接会变为可点击状态。你可以直接点击“Create a new notebook”创建笔记本,但这通常会在你的根目录创建。更常见的做法是点击“New Session”,这会打开完整的JupyterLab环境。

打开后,你可以根据喜好调整界面。建议进入“View” -> “Appearance”菜单,取消勾选“Simple Interface”和“Presentation Mode”。你也可以直接点击“Reset Default Layout”来恢复默认布局。

现在,环境已经准备就绪。你可以通过左侧文件浏览器导航到电脑上的不同文件夹,进入目标文件夹后,点击顶部的“+”按钮即可创建新的笔记本文件。


总结

本节课中我们一起学习了在Windows和Mac操作系统上安装Jupyter Notebook和Python的完整流程。我们通过下载 JupyterLab桌面应用程序 并利用其内置的捆绑安装程序来设置Python环境,这种方法简单统一,非常适合初学者。Jupyter Notebook是一个免费、开源、广泛使用的交互式开发环境,拥有丰富的在线资源可供查阅。安装完成后,我们就可以开始使用Python进行数据分析之旅了。

101:Jupyter Lab入门与AI辅助编程 🚀

在本节课中,我们将学习Jupyter Lab的基本操作,并了解如何利用AI工具辅助Python编程和数据分析。我们将从打开和运行笔记本开始,逐步探索代码与文本的编辑,最后介绍AI在代码创建、解释和调试中的强大应用。


打开与界面设置 🖥️

上一节我们下载了Jupyter Lab,本节中我们来看看这个工具如何工作。

我展示了我的桌面,上面有Jupyter Lab桌面应用程序,以及一个放在桌面上的Python笔记本文件(MOO_one.ipynb)。要打开它,可以直接双击笔记本文件,也可以在Jupyter Lab中导航到该文件位置。我选择双击打开。

打开后,可以看到笔记本内容。它包含Markdown文本(看起来像普通文档)和代码单元格(由灰色框和旁边的括号标识)。括号内有时有数字,有时没有。

初始视图可能不显示左侧工具栏。为了更方便地查看文件位置和目录,可以进行设置。

以下是调整视图的步骤:

  • 进入 View(视图) 菜单。
  • 选择 Show Left Activity Bar(显示左侧活动栏)

启用后,左侧会显示文件树和目录,方便我们跳转到笔记本的不同部分。


运行代码与单元格 ▶️

现在,我们位于笔记本的开头。首先介绍Jupyter笔记本的文件格式和基本使用方法。

第一件事是学习如何运行代码。Jupyter笔记本的优势在于,你可以拥有不会被计算机执行的文本(Markdown单元格),而只运行被指定为代码的单元格。

灰色框是代码单元格,而其他部分是Markdown单元格。我们可以随时更改单元格类型。

运行单元格有几种方法:

  • 选中想要运行的单元格,然后点击工具栏的 播放按钮
  • 或者,按下 Shift + Enter 组合键。

运行Markdown单元格时,不会有输出,但会渲染其格式。运行代码单元格时,左侧括号内会先显示一个星号 [*],表示代码正在运行。运行完成后,星号会变成一个数字序号。如果代码有输出,结果会直接显示在单元格下方;如果没有,则不会显示任何内容。


运行整个笔记本与重启内核 🔄

接下来,讨论如何运行整个笔记本。

点击顶部菜单栏的 Run(运行) 下拉菜单,可以看到多个选项:

  • Run Selected Cells(运行选中单元格):运行当前选中的单元格。
  • Run All Cells(运行所有单元格):按顺序运行笔记本中的所有单元格。
  • Restart Kernel and Run All Cells(重启内核并运行所有单元格):如果笔记本运行异常或卡住,这个功能非常有用。它会重启内核(类似于重启笔记本),然后重新运行所有代码。你可能需要重新选择Python作为内核。
  • Run All Above Selected Cell(运行选中单元格以上的所有单元格):这是我们经常使用的功能。它只运行当前选中单元格之前的所有单元格。例如,选中某个单元格后执行此操作,可以确保其依赖的代码都已执行。

如果代码出错,你会看到一个错误信息,通常显示为一个较长的粉色或红色框。


编辑与格式化Markdown单元格 📝

最后,我们来了解Markdown单元格。

你会注意到这些文本框就是Markdown单元格。它们的优点是:双击即可编辑,并且支持丰富的文本格式化,让笔记看起来更美观。

例如,这段文本之所以显示为大标题,是因为使用了 # 符号。# 的数量决定了标题的级别,从而在左侧自动生成目录结构。

以下是Markdown的使用要点:

  • 使用 ###### 等来创建不同级别的标题。
  • 这些标题符号会自动在左侧生成目录。
  • 双击单元格进入编辑模式,输入内容。
  • 编辑完成后,运行该单元格(Shift + Enter)以渲染格式化的效果。

Jupyter笔记本的真正优势在于,它允许我们在同一个文件中混合编写描述性文本和可执行代码。我们可以轻松地阅读和理解分析过程,添加对输出的解释,并清晰地展示代码。

随着课程的深入,我们会在笔记本中看到越来越多的代码输出,因为本课程将大量使用Python进行数据分析。


AI在数据分析中的应用 🤖

了解了Jupyter笔记本的基本操作后,现在花点时间谈谈AI。目前有许多AI工具对于使用Python进行数据分析极具价值。几乎所有这些工具都经过多种编程语言的训练,Python也不例外。

AI可以帮助创建程序、解释程序以及在遇到问题时调试程序。

以下是AI的三个主要应用场景:

  1. 创建:你可以要求AI编写一个执行特定任务的程序,它会提供相应的代码。
  2. 解释:你可以将已有的代码或代码运行后的输出交给AI,让它向你解释其含义。
  3. 调试/解决:如果你的程序出现错误或运行不正确,可以请AI帮助解决这个问题。

可以想象,这些AI工具非常强大且实用。然而,理解并批判性地评估你决定使用的AI输出同样重要。AI并非总是完美的,因此务必对AI的输出进行批判性评估甚至测试。

让我们通过打开一个新的Jupyter笔记本和你喜欢的AI工具(我将使用Perplexity进行演示),来具体看看这三种使用AI辅助数据分析的方法。


1. 使用AI创建代码 🛠️

让我们从创建程序开始。假设我有三个变量 ABC,我想创建一个程序来确定这三个变量中哪个数值最大。

我可以这样询问Perplexity:“What is the Python code for determining which of three variables is the highest value?(用于确定三个变量中哪个值最大的Python代码是什么?)”

AI会给出一种实现方法。我可以复制这段代码到Jupyter笔记本中并运行它。例如:

A = 13
B = 11
C = 32
largest = max(A, B, C)
print(f"The largest value is {largest}")

运行后,它会输出最大的值。如果我修改变量的值,重新运行,结果也会相应改变。

我还可以进一步要求AI修改代码,例如让它输出最大值的变量名而不是具体的数值。AI可能会提供使用字典或简单逻辑判断的不同解决方案。这就是使用AI进行创建的例子。


2. 使用AI解释代码 📖

接下来,谈谈使用AI进行解释。任何时候,当你遇到借用的、自己写的或网上看到的代码时,都可以将AI当作一个导师。你可以复制代码并请AI解释它。

例如,我找到一段不太理解的代码,可以将其粘贴到AI工具中并提问:“Please explain this code.(请解释这段代码。)”

AI会逐行解释代码的逻辑。例如,对于一段比较三个数字大小的代码,它可能会解释:“第一行检查A是否同时大于等于B和C,如果是,则A最大并打印A;否则检查下一个条件……”

你甚至可以要求AI用更简单的方式解释,比如“像我从没编过程序一样解释给我听”。AI会尝试用更基础的比喻(比如三个装有数字的盒子)来分解概念。你还可以针对特定代码行要求更详细的解释。这就是使用AI进行解释的方法。


3. 使用AI调试与解决问题 🐛

最后,讨论使用AI工具寻求解决方案。如果你在编码中遇到障碍或错误,可以利用AI。

例如,运行代码时出现了一个语法错误:“SyntaxError: invalid syntax”。我可以将这个错误信息复制给AI并提问:“What does this error mean?(这个错误是什么意思?)”

AI会解释错误原因,例如:“Python发现你的代码有问题,在 if 语句末尾忘记加冒号了。” 它甚至会指出需要添加冒号的位置。

对于更复杂的错误,你可能不需要粘贴整个错误堆栈,只需提供Python解释器给出的最终错误描述,AI就能帮助你调试代码。这就是使用AI进行调试和解决问题的例子。


总结 🎯

本节课中,我们一起学习了Jupyter Lab的核心操作和AI辅助编程的三种方式。

我们首先学习了如何打开Jupyter笔记本、设置界面以及区分代码单元格与Markdown单元格。接着,掌握了运行单个单元格、运行整个笔记本以及重启内核的方法。然后,探索了如何编辑和利用Markdown语法来格式化文本并生成目录。

在第二部分,我们深入探讨了AI在数据分析中的强大辅助作用:通过示例了解了如何使用AI创建代码、解释复杂的代码逻辑,以及在遇到错误时利用AI调试和解决问题。

借助Jupyter这类编程环境和丰富的AI工具,我们能够高效、有效地创建程序并进行数据分析。然而,尽管这些工具功能强大,仍然需要“人在循环中”。作为数据分析师,我们必须决定要检查什么、如何清理和准备数据、应该进行哪些分析以及这些分析结果意味着什么。同时,我们也必须判断AI的输出是否正确实现了我们的目标。

因此,即使我们在过程中使用了许多现成的工具,掌握如何创建Python程序、如何执行和解释数据分析的这些基础构建模块仍然至关重要。

102:加载和查看数据 📊

在本节课中,我们将学习数据准备与分析的核心环节——ETL(提取、转换、加载)。我们将通过实际操作,使用Python的Pandas库来加载一个数据集,并学习多种查看和检查数据的方法。掌握这些技能是进行有效商业分析的基础。

许多商业数据分析师声称,他们80%的工作是从原始环境中提取数据,将其加载到数据分析工具中,并进行转换或准备以便分析。这些过程通常被称为ETL(提取、转换、加载)、数据整理或数据清洗。无论80%这个数字是否准确,毫无疑问,准备数据进行分析需要大量的时间、资源和专业知识。本视频将为您提供一些ETL的实践练习。让我们使用我们的techca数据集。如果您能跟随Jupyter笔记本进行操作,我们鼓励您这样做,因为“边做边学”比“只看不练”能帮助您更快地熟悉Python。

我们为您提供了两个文件。第一个是名为OC1data.csv的数据文件。第二个是名为MOone_notebook.ipynb的Jupyter笔记本文件。

打开Jupyter笔记本

现在,我们想打开Jupyter笔记本。如何操作呢?您需要导航到保存Jupyter笔记本文件和数据的位置。在您的文件夹系统中,无论您将它们保存在哪里,都可以导航到该位置。如果您已经下载了Jupyter Lab桌面应用程序,那么打开这些文件就非常容易。您可以双击笔记本文件,它们就会打开,就像打开Word文档或Excel文件一样。所以,我将双击它。我想提到的另一点是,您需要确保数据文件也保存在与笔记本文件相同的文件夹中。这将使打开数据或将其加载到我们的环境中变得更加容易。如果它们没有保存在同一位置,您的笔记本中可能会出现错误。好的,我将双击它,这将打开Jupyter Lab。

我喜欢使用这个目录选项卡,它看起来像三个带线条的项目符号。如果我点击它,它会打开目录。这样做的目的是允许我通过点击来浏览我的笔记本。因此,我不需要向下滚动并试图找到我的位置,只需点击标题即可跳转到该位置。这对我们来说非常有用,因为这是我们整个模块的Jupyter笔记本。这意味着当我们进行到几个视频之后,我们将需要使用笔记本底部的代码。因此,我们不需要滚动,可以说“好的,让我们跳转到‘用于连接数据的ETL’部分”。然后,您在这里的左侧查看并点击“joining data”,它就会直接跳转到那个位置。

好的,让我们跳回到开头。打开笔记本后,我们要做的第一件事是加载我们的库和包,以便我们可以在Jupyter环境中拥有需要使用的函数。因此,我们将加载几个包到我们的环境中。

理解函数与库

有些人可能想知道什么是函数。函数是由其他人编写的代码块,我们可以调用它们来满足我们自己的目的。因此,我们不必自己从头开始编写一大堆复杂的代码,只需使用别人的函数,例如“制作直方图”或“过滤此数据表”。函数使我们的生活变得更加轻松。然而,要使用函数,我们必须告诉计算机我们想要使用哪些Python库。每次我们打开一个新的笔记本或环境时,都必须这样做。

这是有原因的。有成千上万的Python库和包。因此,如果我们每次打开笔记本时,计算机都必须将每个Python库加载到环境中,我们的程序会变得非常非常慢。为了提高效率,我们只告诉计算机我们计划使用哪些特定的Python库,而不是所有可用的库。这样,我们的计算机只需要将必要的库引入我们的环境。

好的,让我们先导入我们的库。

导入必要的库

我们将导入的第一个库是pandas库。然后我们还要导入numpy库。pandas库是数据分析中经常使用的库,它是处理数据表的一个非常流行的库。为此,我们将转到笔记本的“导入库和包”部分。我将在这里讨论这段代码。它被注释掉了,这意味着它不会运行。我把它放在这里,以防您遇到错误,但我会讨论它。

要导入一个库,我们需要写import这个词,然后是我们想要导入的库。如果您愿意,还可以包含一个as和一个别名。别名是一个缩短的名称或昵称。别名非常好,因为有时库的名称很长。因此,我们可以给它一个昵称,每次我们想使用该库中的函数时,都可以引用这个昵称。

pandas已经相当短了,但我们将使用别名pdnumpy也很短,所以我们将使用别名np,这样只是稍微缩短了一点。我这样做是因为这是在线上的标准做法。当您在线查看别人的代码并试图解决自己的代码问题时,如果人们使用pandas,他们通常使用别名pd。这样,您就熟悉了别名的概念,并且知道要查找什么或您在看什么。

好的,所以import pandas as pdimport numpy as np。当我运行这个时,这将把这些包加载到我们的环境中,这样我们就可以使用pandas库和numpy库中的所有函数。运行这个有几种方法。我可以按这个播放符号,但必须确保单元格被选中。我可以按播放符号,或者按Shift + Enter,这将运行单元格并将选择移动到下一个单元格。所以我按Shift + Enter

好的,我们的库已经加载到环境中了。这意味着我们可以告诉计算机,如果我们想使用pandasNumpy中的任何函数。

加载数据

接下来我们想加载数据。要加载数据,我们将使用一个名为read_csvpandas函数。您会注意到这里有pd,那是pandas库的别名。我要再次重申这一点,您需要确保O1data.csv文件与您打开的笔记本在同一个文件夹中。

要加载我们拥有的CSV文件数据,我们将创建一个名为df1的变量。这个变量将包含我们的数据。然后我们将该变量设置为这个pandas函数read_csv。要调用该函数,我们说从pandaspd.read_csv,这是我们正在使用的函数,然后我们说我们想要读取的文件是什么。在本例中,我们的数据文件名为MOO1data.csv

当我们运行这个时,我们应该在这里看到一个小星号,表示代码正在运行,然后数字2会出现,或者您运行的其他代码序列。如果您在此之前运行了其他单元格,您会看到不同的数字。好的,这可能是一个稍大的文件,它不算巨大,但它有一百多万行。所以我们会看到一个小星号出现,根据您计算机的速度,这可能需要一点时间,但请耐心等待。好的,我要运行这个。我们看到星号在那里。这意味着代码正在运行,并且正在加载数据。一旦我看到这里出现一个数字,我现在就有了一个名为df1的变量。df1是一个数据框,即一个数据表。这是pandas的一种数据类型,一个数据表,它就是我们的MOOC1数据表。

查看数据维度

我们可能想知道的关于数据的第一件事是它有多大。我们的数据有多少行或多少列?一种方法是使用shape属性。如果我们转到下一个代码单元格,我们可以使用所谓的shape属性或单词shape

这样做会给我们一个输出,其中行数和列数仅作为两个数字列出。有很多方法可以做到这一点,但我喜欢shape属性,因为它小巧简洁。因此,如果您真正寻找的只是行数和列数,它不会使您的笔记本变得杂乱。

要使用shape属性,我们说df1.shape。如果我运行这个,我会看到两个数字显示出来。第一个数字是150000。第二个数字是24。这两个数字分别代表我们的行数和列数。这意味着我们的数据集有150000行和24列或变量。

查看数据信息

我们可能想知道的关于数据集的下一件事是,我们拥有的这24个变量是什么。一种方法是使用info方法。我们拥有的下一个代码使用了这个info方法。info方法将列出我们数据框中的所有变量,并为我们提供关于这些不同变量的一些信息。

好的,让我们运行它,以便我们可以讨论我们所看到的内容。要运行info方法,我们首先必须说明我们想要获取哪个数据框的信息,因为有时我们处理许多不同的数据框。我们可能有df1df4df20。所以我们要说我们正在查看哪个数据框。在本例中,我们只有df1。所以df1.info。这表示我们想要这个数据框的信息。

我必须选中这个单元格,然后我可以按这里的播放键或按Shift + Enter。我们可以在代码单元格正下方看到这个的输出。好的,我们可以看到我们有24列。Python在计数时从0开始。所以我们有0到23。这是列数,也就是我们的24列。我们有列的名称。这是来自我们CSV文件的标题。所以我们有unique_idtransaction_idunformatted_datecustomer_id,一直到unitsgross_profit_margin。这就是列名。

然后我们有另一列叫做non-null count。这告诉我们,对于我们的每一列或每个变量,该列中有多少项是非空的,即不是缺失值。对于我们的大多数变量,我们可以看到它们有正确的数量,或者没有缺失值,因为我们看到数据框的行数是150000。我们看到许多变量有150000个非空值。这意味着没有缺失值。但实际上我们看到,对于我们的一些列,确实有缺失值。以这里的customer_id为例。customer_id有267000个非空值。这意味着其余的行是缺失值或空值。这并不奇怪。

实际上,因为customer_id只有在客户是忠诚客户时才存在,所以并非每个人、每笔交易或购买的物品都将是忠诚客户。事实上,许多交易都不是忠诚客户,我们可以在这里看到这一点。

这里的最后一列是数据类型列。

查看描述性统计

另一种检查数据的方法是查看数据的一些描述性统计。有一个名为describe的方法,它将查看所有列,并尝试提供关于这些列的一些描述性统计信息。要调用此方法,我们需要说明我们正在查看哪个数据框。在本例中是df1,然后.describe(),我们这里有括号。当我们运行这个时,我们可以看到它试图获取我们数据框中所有变量的描述性统计信息,但它实际上只能计算我们数值变量的这些描述性统计信息。

所以我们有unique_idcustomer_id等所有数值变量,它计算了一些描述性统计信息。具体来说,它计算了8个统计量:计数、平均值、标准差、最低值(最小值)、最高值(最大值),以及第25、50和75百分位数。它为您提供了一些关于数据分布的信息。

我们可以看到,对于我们的一些数字或变量,这可能是非常有用的信息,比如revenue,平均收入是多少,最大或最小收入是多少,gross_profit_margin也是如此。但对于其他变量,可能没有那么有用。比如说unique_id。那只是分配给给定行的ID。所以它实际上没有数值意义。因此,计算平均值、最小值、标准差并不是那么有用或有益。但是,如果您有一个数值变量,其数值很重要,那么describe方法可能非常有帮助。

查看数据框头部

我们可以检查数据的第四种方法是实际查看数据框本身。有几种方法可以做到这一点,但我们将使用所谓的head方法。head方法允许我们查看数据框的最顶部,默认显示前五行。要调用head方法,我们说我们想要查看哪个数据框,然后写.head(),括号闭合。当我们运行这个时,我们将在Jupyter笔记本中看到输出,即数据框的前五行。

我们运行了它,按Shift + Enter,我们看到了前五行,即第0、1、2、3、4行,以及列。我经常使用这个方法,因为它允许我快速查看我的数据发生了什么变化。例如,当我清理数据或更改数据时,比如删除一列或进行计算,我可以快速看到该列是否已添加到我的数据框中,计算是否正确执行。因此,当您处理数据时,这是一个非常有用的方法。

默认情况下,它显示前五行,但如果您想显示不同的行数,比如只想要三行,您可以在括号内添加一个3,然后它会显示三行。

查看数据样本

我们可能想要查看数据的最后一种方法是查看样本。这与head方法非常相似,因为它允许您实际查看数据框本身,但不同之处在于,sample从您的数据框中随机抽取一行。它的调用方式类似。所以我们说df1.sample(),如果我们括号里没有数字,那么它只给出一个样本,从数据框中抽取一行。但如果我们想说抽取10行的样本,我们可以在括号内键入数字10,然后我们最终会得到10个样本。

总结

这些只是使用Python和Jupyter Notebook查看数据的几种常见方法。我们将在数据分析的ETL阶段大量使用这些函数,因为我们在清理、准备和操作数据时,经常需要查看数据以确保我们的代码正常工作。熟悉这些概念将有助于您在进行数据分析时,尤其是在需要频繁查看数据的ETL阶段。

在本节课中,我们一起学习了如何打开Jupyter笔记本、导入必要的库(如pandasnumpy)、加载CSV数据文件,以及使用shapeinfodescribeheadsample等多种方法来查看和检查数据的基本信息。这些是数据准备和分析的基石,熟练掌握它们将为后续更复杂的数据操作和分析打下坚实的基础。

103:数据类型详解 📊

在本节课中,我们将学习Python中常见的数据类型。理解数据类型是数据处理和分析的基础,它决定了Python如何解释和操作数据。我们将逐一介绍整数、浮点数、字符串、日期时间和布尔值这几种核心类型,并了解它们在真实数据集中的具体表现。

数据类型简介

当数据存储在Python环境中时,其值会与数据类型一同存储。数据类型告诉Python在程序中使用这些数据时应如何处理。数据类型种类繁多,有针对单个值的类型(如数字与文本),也有针对数据集合的类型(如数据表或列表)。

本节我们将重点介绍单个数据值的常见数据类型。以下是本视频将涵盖的常见数据类型:整数、浮点数、字符串、日期时间和布尔值。

常见数据类型详解

整数

首先是整数。整数是一种数值数据类型,但它不能是任意数字,必须是没有小数部分的整数。整数可以是负数、正数,甚至是零。

  • 公式/代码示例42, -7, 0

上面这些数字是整数,而下面带小数点的数字则不是整数。

浮点数

另一种数值数据类型是浮点数。Float是“浮点小数”的缩写。这种数据类型可以表示从负无穷大到正无穷大的任何数字,并且顾名思义,它允许有小数位

  • 公式/代码示例3.14159, -2.5, 0.0, 42.0

您会注意到最后两个数字0.042.0的小数位是0。整数可以存储为整数或浮点数。当它们存储为浮点数时,您会在整数后面看到.0

字符串

我们将讨论的第三种数据类型是字符串。字符串是文本数据。文本数据包括字母、数字、标点符号、空格、字符——基本上,您能在键盘上键入的任何内容都可以是字符串。

  • 代码示例"Hello, World!", "Product ID: 12345", "2023-10-27"

左侧的所有这些文本都可以是字符串数据类型。通常,当我们想到文本数据时,会想到单词,但数字和日期也可以存储为字符串。有时这可能是个问题,我们需要将数据转换为正确的数据类型,但有时将数字存储为字符串实际上可能很有帮助。

日期时间

我们将使用的另一种常见数据类型是日期时间数据类型。顾名思义,日期时间数据类型包含日期和时间,代表精确到微秒的特定时刻

虽然您可以将日期存储为字符串,但将其存储为日期时间可以让Python按时间顺序对数据进行排序。使用日期时间数据类型,Python还可以计算两个日期时间之间过去了多少时间。这在日期时间存储为字符串时很难做到。

它也是一种极其有用的数据类型,因为它存储了大量关于日期的信息。

  • 代码示例(在pandas中):pd.Timestamp('2023-10-27 14:30:00')

虽然这看起来可能没什么特别,但借助日期时间对象,我们可以使用特殊函数来提取重要的信息,如月份、日期、年份、小时,甚至是星期几。这使我们能够进行一些非常有趣的分析。

布尔值

在查看真实世界数据之前,我们将介绍的最后一个数据类型是布尔值。布尔值是一种只能取两个值的数据类型:真(True)和假(False)

  • 代码示例True, False

这种数据类型用于我们程序中的逻辑,例如当我们使用“如果-那么”逻辑时。

在数据集中查看数据类型

既然我们已经讨论了常见的数据类型,现在让我们来看看这些数据类型以及它们在本模块的TechA数据中是如何表示的。

您需要打开您的Jupyter笔记本,然后我们希望运行“ETL2”部分之前的所有单元格。我们可以通过侧边栏的目录来导航。如果您没有看到侧边栏,可以转到“视图”->“外观”并勾选“显示左侧活动栏”。

点击目录后,它会显示我笔记本中所有不同的标题。我们将定位到“ETL2 数据类型”,然后点击它。接下来,我需要运行这个标题之前的所有单元格,也就是上一个视频中我们加载和查看数据所做的所有事情。

我们必须这样做的原因是,任何时候我们关闭Jupyter或电脑,实际上都会丢失我们的环境。环境保存了我们为此笔记本将要使用的所有库、已导入的任何数据以及已创建的任何变量。所有这些信息都会消失,并且只在我们运行和打开该环境时临时存在。如果我们关闭电脑或关闭Jupyter,那么该环境就不再存在,因此我们必须将所有库重新加载到环境中,并重新加载数据,以便我们可以再次开始处理它。

为此,我们希望运行“ETL2 数据类型”之前的所有单元格。我喜欢这样做:选中“ETL2 数据类型”单元格,然后选择“运行”->“运行选中单元格以上的所有单元格”。运行后,我们将看到它正在执行这些单元格。

现在,我们已经运行了之前的所有单元格,加载了库和数据。接下来,我们将查看数据框中所有不同的变量。如果您还记得上一个视频,我们实际上查看了多种查看数据的方法,我们可以查看整个数据框,也可以查看数据框的各个方面。现在我们将使用其中一种方法:info方法。info方法会列出数据框中所有不同的变量,并告诉您一些关于它们的信息,例如每个变量有多少非空行以及其数据类型。

我们将逐步讲解,并使用这个info代码来讨论数据框中的所有不同变量。我将选中这个单元格并运行它。然后,我直接在笔记本中得到了输出结果:我的数据框中所有列的列表。

总共有24列,从第0列“unique_id”一直到第23列“gross_profit_margin”。我对这些变量有了一些了解,让我们逐一讨论每个变量是什么。

以下是数据集中各变量的详细说明:

  • unique_id:数据框中的第一列,是整数数据类型。它是数据集中每一行的唯一标识符,没有重复项。每一行都有自己的unique_id,这是我们识别数据集中给定行或观察值的方式。
  • transaction_id:数据框中的第二列,没有缺失值,共有150,000个非空项(即数据框的行数)。它是对象数据类型,这意味着在我们的环境中它被保存为字符串数据类型。transaction_id是标识该商品属于哪笔交易的ID。此列中存在重复项,因为有时一笔交易包含多个商品。例如,购买三件商品的交易,这三件商品的transaction_id是相同的,以表示它们属于同一笔交易。这与unique_id不同,那三件商品会有各自的unique_id,但它们的transaction_id相同。
  • unformatted_date:同样没有缺失值,目前是对象(即字符串)。unformatted_date是该商品被购买的日期,即交易发生的日期。它目前没有格式化为日期数据类型,我们最终需要更改它,但现在我们只需知道这是购买发生的日期。
  • customer_id:第四列。实际上,customer_id存在一些缺失值,我们只有267,104个个体或交易有数字记录。它被保存为浮点数据类型,因此数据具有小数或分数部分。customer_id在某些情况下缺失,因为该customer_id仅对忠诚客户已知。如果在该交易中,客户使用了他们的忠诚卡或输入了忠诚号码,那么该customer_id号码将与那笔交易及其购买的所有商品关联。然而,有很多人进入这些便利店和加油站,他们没有忠诚卡或忠诚号码,因此他们的购买记录没有关联的customer_id。或者,忠诚客户可能没有输入他们的号码或使用忠诚卡,那么我们也不会为该交易或商品附加客户号码。
  • product_id:没有缺失值,因此数据框中的每一行都有一个product_id号码,并且它是整数。product_id是客户购买的实际产品的ID号码。每一行都是一笔交易中购买的单件商品,因此该商品有一个产品ID。还有一个product_name,即该商品的实际名称。ID是一个数字,而product_name是它的叫法。例如,我购买果冻豆,那将是产品名称,但会有一个product_id或数字与果冻豆产品类型或单个产品相关联。
  • category_id 和 category_name:对于TechA销售的每一种产品,它们都被分组到类别中。这些类别是相似类型的产品。以我的果冻豆例子为例,果冻豆是实际产品、单个产品,而类别可能是“水果糖”。我们为该水果糖类别有一个ID号码,然后我们也有该类别的名称。
  • parent_id 和 parent_name:这是我们单个产品更广泛的类别分组。我说过我有果冻豆,它们可能属于“水果糖”,而果冻豆的更广泛类别可能是“所有糖果”,这将包括巧克力、焦糖、其他可能不在更具体类别中的糖果。我们称之为父类别,因此我们看到parent_id和parent_name。每个父类别也有一个与之关联的ID号码以及一个名称(显示为对象数据类型,即字符串)。
  • product_count:表示每个父类别中不同类别或商品的数量。
  • site_id:代表购买该商品的便利店的特定ID号码。这也是数值数据类型。
  • site_name:是该位置的名称,通常根据便利店或加油站的位置命名。
  • address, city, zip_code:这些是位置变量。address和city都是字符串数据类型(此处显示为对象)。zip是整数,是一个数字,因此最终保存为整数数据类型。重要的是,这些不是我们便利店的真实地址,因为我们希望掩盖数据以保护这家公司的身份。
  • latitude 和 longitude:这些是浮点数据类型,是可以具有小数或分数部分的数值数据类型。纬度和经度也是用于确定商店位置的位置变量。
  • site_status:第19个变量,表示商店是活跃还是关闭的状态。
  • revenue:一个非常有用的数字,显示每个产品赚取了多少收入。这里没有缺失值。它是浮点数据类型,因此具有小数部分,可以赚取美元和美分,所以我们看到这种小数或浮点数据类型。
  • gross_profit:对我们来说也是一个非常有用的数字。总利润是扣除直接成本后公司剩余的利润的财务概念。总利润本质上是收入减去销售该产品的成本。我会跳到gross_profit_margin,因为它与总利润相关,那是我们的最后一个变量。
  • gross_profit_margin:是百分比,是一个财务概念。它的计算方式是(收入 - 成本)/ 收入,也就是我们的总利润除以收入。因此,毛利率代表了每美元收入中的利润百分比。这是衡量企业以及单个产品类别利润的一个非常重要的指标。我们将在课程中大量使用这些指标。
  • cost:所售产品的成本,即公司的成本。我们可以看到这里有一些缺失值,可能只是我们缺少某些成本信息。我们看到这也影响了总利润和毛利率,因为我们需要成本来进行这些计算。
  • units:我们将讨论的最后一个变量是units变量。units变量列出了售出的该产品的单位数量。

总结与下一步

本节课中,我们一起学习了Python中的核心数据类型:整数、浮点数、字符串、日期时间和布尔值,并详细查看了它们在示例数据集TechA中的具体应用和表现。理解每个变量的含义和其数据类型是进行有效数据分析的第一步。

既然我们已经讨论了不同的数据类型和数据集中的变量,在下一个视频中,我们就可以继续进行数据清洗了。

104:数据清洗

在本节课中,我们将学习数据清洗的核心概念与操作。数据清洗是数据分析中至关重要的一步,它确保我们使用的数据是准确、一致和可用的。我们将通过一个具体的便利店销售数据集(TechA数据)的实例,学习如何修复、删除和添加数据。

概述:数据清洗的类比与核心概念

上一节我们检查了数据集的每一列。本节中,我们将清理或整理这个数据集。

数据清洗的过程可以类比为打理花园。要打造一个美丽的花园,需要大量的准备工作。我们必须浇水、施肥、修剪,当然,还要除草。在这些步骤之前,我们需要高质量的输入,比如良好的土壤、优质的种子或合适的种植地点。高质量的输入和辛勤的照料,最终会产出美丽的花园。

这种准备工作类似于数据清洗。土壤、种子、肥料等输入是我们的原始数据,而除草或清理杂物的工作则类似于数据清洗。

数据集可能存在多种混乱的情况,包括但不限于以下几种:

  • 列标题没有名称。
  • 单个列中存储了多个变量。
  • 存在非常大或非常小的异常值或极端值。
  • 存在拼写错误。
  • 列的数据格式或数据类型错误。
  • 存在缺失值或缺失列。
  • 需要将其他来源的数据合并到当前数据集中。

我们稍后会回到这个花园的比喻,但现在,让我们回到工作室开始清洗数据。

当数据不干净时,我们通常可以采取以下三种途径之一进行清洗:

  1. 修复或更改数据:例如,纠正错误、更改数据类型或统一数据格式。
  2. 删除数据:如果某些观测行(数据行)没有意义或大部分数据缺失,我们通常会删除这些行;或者,如果某列不需要,我们可以从数据中删除该列。
  3. 添加数据:例如,我们可以基于现有列创建一个分析所需的新列,或者合并来自另一个数据集的数据,以便将所有需要的数据集中在一个地方。

相对而言,我们的TechA数据已经相当整洁。例如,每一行已经是一个观测值,每一列已经是一个变量。然而,仍有一些地方可以整理。在本视频中,我们将涵盖上述每种清洗途径的一个例子。

修复数据:更改日期列的数据类型

我们将从第一种清洗途径开始,即修复一个列。我们要修复日期列。

正如我们在上一个视频中看到的,日期列是字符串数据类型。我们也可以通过返回数据框中某个特定单元格的值来查看这一点。我们想查看未格式化日期列中的一个单元格。使用.at方法,我们可以引用要返回的列。

以下代码表示,我们想查看数据框df1。当我们使用.at时,表示返回数据框中的一个特定数据点。我们使用坐标来定位,即第3行,以及列“unformatted_date”。运行此代码,它将提取该列第3行的确切单元格。

我们可以看到它是“2023-10-20”。我们可以判断这是一个字符串,因为它被引号包围。当你提取或返回一个字符串值时,通常会看到两边的引号。

我们希望将其更改为datetime对象,而不是字符串。在Python中,有多种方法可以完成相同的任务,将日期转换为datetime对象也是如此。我们将使用pandas的to_datetime函数,它将字符串日期转换为datetime对象。

接下来的代码将把我们的“unformatted_date”列转换为格式化日期。我们将创建一个名为“formatted_date”的新列。在df1(我们保存数据的数据框)中,我们将创建一个名为“formatted_date”的新列。

为此,我们使用方括号指定新列名,并将其设置为以下内容:这实际上是获取我们未格式化的日期列,然后将这些字符串日期转换为datetime对象。我们使用pandas(别名为pd)的to_datetime函数。我们指定要转换的是df1中的“unformatted_date”列。

这段代码的作用是:获取保存为字符串数据类型的未格式化日期,将它们转换为datetime对象,并将这些datetime对象保存在“formatted_date”列中。

运行此代码后,笔记本中没有输出,因为它只是在环境中进行更改,只是向df1数据框添加了一列,我没有要求计算机显示它。

但如果我们想并排查看这两列,我们可以从数据框中提取这些列并并排显示。接下来我们就这么做:从df1中,我们选取这两列的列表,并在笔记本中显示它们。

运行后,我得到了并排显示的未格式化日期和格式化日期。如果你看它们,可能会觉得它们看起来没什么不同,确实如此,它们都是日期的表示形式。但在未格式化日期的表示中,它被保存为字符串数据类型,而在格式化日期的表示中,它被保存为datetime对象。

如果我们想查看“formatted_date”列中某个格式化日期的具体值,就像我们查看“unformatted_date”列中某个未格式化日期的具体值一样,我们可以再次使用.at方法。我们引用要查看的数据框df1,然后使用.at,再指定数据框内的坐标:第3行,“formatted_date”列。

回想一下,我们的未格式化日期在引号中,因为它是字符串。但我们的格式化日期应该不再是字符串了。当我们运行此代码时,这些值被保存为datetime对象,所以看起来会有点不同。它被保存为时间戳“2023-10-20”,没有列出具体的交易时间,只有日期。

这样看起来有点不同。与字符串日期相比,datetime对象可以给我们提供更多信息,或者我们可以更容易地从中提取信息。

我们还可以通过再次查看info方法来确认这是两种不同的数据类型。info方法提供了数据框中所有变量及其数据类型的列表。我们应该看到,对于未格式化日期,其数据类型是对象(即字符串),而对于格式化日期,其数据类型应该是datetime。

我们看到这里的未格式化日期是对象类型(字符串),而我们添加的最新列“formatted_date”的数据类型是datetime。因此,我们知道已将该日期转换为datetime对象,并将其保存为新列。

datetime对象的一个优点是,我们可以从中提取大量信息,如果日期保存为字符串,做这些操作会更具挑战性。例如,有许多日期方法可以应用于datetime对象来获取信息:我们可以提取年份、月份、星期几(周一、周二等)、分钟、毫秒。所有这些信息都可以非常容易地从datetime对象中提取。虽然用字符串日期也可以做到,但比直接说“从这个数据点给我获取星期几或月份”要麻烦一些。

接下来,我们将再创建三个列:年份列、月份列和星期几列。为此,我们将使用一些datetime对象的方法。使用.dt可以从中提取信息。

对于星期几,有几种方法:可以获取星期几的实际名称(周一、周二等),也可以获取与之关联的数字(0-6)。我们将提取两者,虽然其中一个会更常用,但我想展示两者都可以提取。

要创建新列,我们指定要添加到哪个数据框。在所有情况下,我们都是添加到df1,这是我们正在处理的唯一数据框。然后,使用方括号和新列名来创建新列。

第一行代码表示:在df1中,创建一个名为“year”的新列。
第二行代码表示:在df1中,创建一个名为“month”的新列。
第三和第四行代码表示:在df1中,创建名为“day_of_week_1”和“day_of_week_2”的新列。

运行此代码后,我们应该有四个新列:年份、月份,以及两种表示星期几的列。

对于每一行,我们将其设置为等于“formatted_date”(因为那是datetime对象),然后从中提取一些信息。

第一行:转到df1[‘formatted_date’],使用.dt.year从datetime对象中提取年份,并将年份保存到“year”列。
第二行:使用.dt.month提取月份。
第三行:使用.dt.dayofweek提取星期几的数字表示(0代表周一,6代表周日)。
第四行:使用.dt.day_name()提取星期几的名称表示(Monday, Tuesday等)。

运行此代码。

我们可以使用head方法来查看数据框,很多人经常使用这个方法,因为你只想查看数据框的一小部分来检查清洗过程。head方法允许你查看数据框的前五行(默认)。我们将从df1中查看数据框的头部。

运行后,我得到了数据框的前五行。如果我滚动到最右边,应该能看到我创建的列:那些新列。第一行的年份是2024,第二行是2023,我们可以看到这实际上是从“formatted_date”列中提取的。年份函数从格式化日期列中提取了年份,并将其保存为独立的“year”列。

然后是月份,可以看到它正确地从第一行提取了月份7(七月),从第三行提取了月份11(十一月)等等。这样可以检查代码是否正确运行。

接着是我们的两个星期几列。在Python中,一周的第一天是周一,所以数字0对应周一,6对应周日。我们可以看到,星期几的数字3是周四,0是周一,4是周五。我们既有星期几的数字表示,也有文字表示。

删除数据:识别并处理异常值

我们已经介绍了第一种清洗数据的方法,即更改数据。在TechA数据的例子中,我们更改了数据类型,并通过创建新的年份、月份和星期几列来添加数据。

第二种清洗数据的方法是删除数据。我们经常需要删除的一种数据是异常值。异常值是极端的数据点,通常不能准确代表数据。它们可能比其余数据极高或极低。

让我们转到Jupyter笔记本来查看TechA收入数据的异常值。

首先,确保收入列没有缺失值。实际上,当我们之前运行info方法时,可以看到数据框有150,000行,收入列有150,000个非空值。所以没有缺失值。

现在,检查异常值。我们可以查看是否有非常高或非常低的值。为此,我们首先查看一些汇总统计信息。回想一下之前的视频,我们学过一个名为describe的方法。

describe方法为数据框中的数值列提供汇总统计信息。我们也可以通过引用单个列来提供该列的汇总统计信息,这正是我们在这段代码中所做的。

查看汇总统计信息,我们可以看到可能存在一些异常值。最小值是负数(-1680),最大值是一个非常大的数字(4,500,000)。平均值和中位数有些不同,这告诉我们数据可能存在一些偏斜。450万是一个非常大的数字。

我们将查看那些高收入观测值,看看发生了什么。我们将使用sort_values方法对原始数据框进行排序。需要注意的是,sort_values会显示排序后的值,但不会实际更改原始数据框。除非我将看到的新排序值赋给一个新变量或该数据框,否则它不会将原始数据框更改为新的排序值。

我将在这里对值进行排序。使用df1.sort_values,并指定要按哪一列排序。它将查看该列,并按升序(从小到大)或降序(从大到小)排列这些值。sort_values的默认值是升序(从小到大)。但我们想看那些大数字,所以我会设置ascending=False,这意味着按降序排序。

这将显示按收入列排序后的数据框。当我们排序时,不仅仅是排序该列,而是每一行都会按照排序顺序移动。

运行此代码后,它显示了我的数据框。如果我看收入列,可以看到那个非常大的收入:450万、300万、200万、200万、200万。这些是非常大的值。但当我查看它们是什么时,发现它们都与“Okay Lucky Red Gaming Lottery Scratcher”有关。这看起来可能是一种错误。我们还可以看到,数据框末尾的负值是彩票奖金,便利店为赢得刮刮乐或彩票的人支付奖金,或者是一些预付卡。

在笔记本中显示数据框只允许我看到前五行和最后五行。但如果我想看更多行,可以通过编写相同的代码并加上.head()来实现。例如,我想看前25行。我可以再次按收入降序排序,并显示前25行。

然后我可以看到。前五行与“Okay Lucky Red”有关,但现在我发现这是一个大问题:这25个最大的收入观测值都归因于这个“Okay Lucky Red”刮刮乐。看起来系统中记录的方式可能有问题。一个人购买450万美元的刮刮乐,以及另一笔300万美元的交易和一堆200万和100万美元的交易来购买这种刮刮乐,这不太可能。

因此,我们或许可以安全地说这些是异常值,它们实际上并不代表购买那种“Okay Lucky Red”刮刮乐的真实情况。我们可能想要删除这些异常值,因为当我们开始查看诸如商店表现或收入时,它们会使数据产生偏差。

接下来,我们将查看所有这些“Okay Lucky Red”刮刮乐。我们将找到这个特定产品的产品ID,即17628。然后过滤我们的数据框,创建一个名为outliers的新数据框,只保留产品ID为此值的所有行,以便更仔细地查看所有这些“Okay Lucky Red”购买记录。

要过滤数据框,你需要确定要基于什么特征或条件进行过滤。我将创建一个名为outliers的新变量,将其设置为等于df1,但经过过滤。我的过滤条件放在这些方括号内。我指定要在df1中查看什么,对于过滤,我说查看“product_id”列,即df1[‘product_id’],并且只选择当它等于(双等号表示等于)数字17628时。

计算机将遍历所有行,只保留“product_id”等于17628的行,并将它们全部保存在我刚创建的outliers变量中。运行后,我现在在环境中有了这个outliers变量。如果我想看它,可以调用那个outliers数据框。

它显示给我看。我说,显示outliers数据框。我可以看到,这是我数据框中所有“Okay Lucky Red”的行。如果我查看它们并查看收入,可以看到对于所有行,收入都非常高。所以这似乎是我们“Lucky Red”产品的一个普遍问题。

那么,我可以做的是,将“Lucky Red”产品从我的数据框中移除。为此,我基本上可以进行过滤,但我说的是保留所有不是我的“Lucky Red”产品的行。

我将创建一个名为df2的新变量,这将是我的新的、更干净的、经过过滤的数据框。我将其设置为等于df1,但经过过滤。在这种情况下,我过滤的条件是什么?我想保留所有不是产品ID 17628的行。为此,我可以说,查看df1[‘product_id’],但任何不等于(用感叹号和等号表示不等于)产品ID 17628的行。这样将保留每一个不是这些异常行的行。

运行后,它保存了那个新变量df2,这是我的更干净的数据框,没有那些异常的刮刮乐彩票行。这应该删除了39行。如果我们想确认df2已删除这些行,可以检查数据框的形状。它应该是150,000减去39行。运行后,我得到149,961行,完美。

现在,我们将检查新数据框df2,看看移除那些非常大的收入项目(450万、300万、200万)后,我们的统计信息是什么样子。

现在,我们再次查看最小值和最大值。我们没有消除负值,这些负值看起来是彩票奖金,这是合理的,不是错误,也不是问题,公司支付彩票奖金是其业务的一部分。对于最大值,以前是450万美元,但现在只有990美元,这比数百万合理得多。现在只是几百美元,对于便利店来说仍然很大,但我们可以看看那是什么。

为此,我们将查看df2.sort_values,再次按收入查看,按降序排列,先看最大的项目,查看前10个,看看它们是否合理,是否是异常值,或者可能只是大额购买。

第一个,我们看到收入990美元、830美元,这些又是彩票购买。这可能是合理的,可能有人购买了近1000美元的彩票。如果我们查看单位,他们购买了999张这种彩票。这是1美元的彩票,单位与收入大致匹配,所以这可能说得通。830美元的情况类似。

接下来的最大项是燃料,柴油、大豆柴油。如果给一辆大型半挂车加油,或者有一个巨大的油箱或额外油箱,那将花费很多钱,所以几百美元的收入也可能是合理的金额。

我们查看了数据框中的这些异常值,删除了异常值。当我们再次查看那些非常大的数字时,发现我们可能已经去除了那些大的异常值,其他大额费用似乎更合理,也更有意义。

总结

在本视频中,我们学习了执行数据清洗的方法,并通过TechA数据的例子,逐一实践了这些清洗方式。

我们更改了以字符串数据类型导入的日期,使其成为datetime数据类型。然后,从datetime对象中,我们通过创建年份、月份和星期几列来添加数据。我们还通过搜索并删除异常的收入数据来删除数据。

105:合并数据

在本节课中,我们将学习如何将两个数据集合并在一起。当我们在一个数据集中找不到所需的所有信息时,可以从第二个数据集中获取这些数据,并通过合并或连接操作将它们整合起来。这是我们在深入分析之前,准备或清洗数据的另一种重要方法。

在开始合并我们正在使用的 techa 数据之前,让我们先来了解一下数据合并的基本概念。

合并的概念

上一节我们介绍了数据合并的必要性,本节中我们来看看四种常见的合并类型。

以下是四种主要的合并类型:

  • 内连接:只保留两个数据集中都存在的行。
  • 左连接:保留左侧数据集的所有行,并从右侧数据集中匹配对应的行。
  • 右连接:保留右侧数据集的所有行,并从左侧数据集中匹配对应的行。
  • 外连接:保留两个数据集中的所有行。

合并类型示例

为了更清楚地理解这些概念,让我们看一个具体的例子。

假设我们有两个数据集:

  • 数据集A 包含教授及其喜欢的糖果:Ron(糖果A),Park(糖果B),Kim(糖果C)。
  • 数据集B 包含教授及其喜欢的颜色:Unnati(颜色X),Park(颜色Y),Aishish(颜色Z),Ron(颜色W)。

如果我们想根据“教授”这一列来合并这两个数据集,不同的合并方式会产生不同的结果。

以下是不同合并类型的结果:

  • 左连接(以A为左数据集):最终数据集包含 RonParkKimUnnatiAishish 不在最终数据集中,因为他们不在左侧数据集A中。Kim 对应的“喜欢的颜色”为缺失值。
  • 右连接(以B为右数据集):最终数据集包含 UnnatiParkAishishRonKim 不在最终数据集中,因为她不在右侧数据集B中。UnnatiAishish 对应的“喜欢的糖果”为缺失值。
  • 内连接:最终数据集只包含同时出现在两个数据集中的教授:RonPark。没有缺失值。
  • 外连接:最终数据集包含所有五位教授:RonParkKimUnnatiAishish。任何缺失的“喜欢的糖果”或“喜欢的颜色”都会显示为缺失值。

应用于实际数据

现在,让我们将这些合并概念应用到我们的 techa 数据集中。

在我们的 techa 数据中,每一行都有邮政编码和城市信息,但没有“州”这一列。如果我们想添加州的信息,就需要从其他地方获取,因为它不在原始数据中。

我们有一个名为 MOC1_state.csv 的第二个文件,它为每个邮政编码提供了对应的州和国家信息(本例中所有行都是美国)。

我们可以将 techa 数据与这个邮政编码-州数据集进行合并。

如果我们的左侧数据集是 techa 数据,右侧数据集是州数据,我们应该选择哪种合并类型?

我们需要思考要保留哪些行。如果我们希望保留所有 techa 数据行,并添加对应的州信息,那么左连接将是合适的选择,因为它会为 techa 数据添加州信息。

在 Jupyter Notebook 中操作

让我们进入 Jupyter Notebook 查看实现此操作的代码。

首先,导航到“ETL4 joining data”部分。如果你关闭过 Jupyter Notebook,需要先运行此单元格上方的所有代码,以确保数据已正确加载和环境已设置。你可以通过点击“Run”下拉菜单并选择“Run All Above Selected Cells”来完成。

第一个代码单元格将把我们的州数据集加载到环境中。

df_states = pd.read_csv(‘MOC1_state.csv’)

这段代码使用 pandas 的 read_csv 函数读取 MOC1_state.csv 文件,并将其作为一个 DataFrame 存储在变量 df_states 中。请确保该文件与你的 Notebook 文件保存在同一文件夹中,否则你需要提供完整的文件路径。

接下来,我们将执行左连接操作。我们使用 pandas 的 merge 函数。

left_joined = pd.merge(df2, df_states, on=‘zip’, how=‘left’)
left_joined

这段代码的含义是:

  • df2:我们的左侧 DataFrame(即 techa 数据)。
  • df_states:我们的右侧 DataFrame(即州数据)。
  • on=‘zip’:指定根据两个 DataFrame 中都存在的名为 zip 的列进行合并。
  • how=‘left’:指定合并类型为左连接,这意味着保留 df2 的所有行,并从 df_states 中匹配并添加数据。

运行这段代码后,我们将得到一个新的 DataFrame left_joined。它包含了原始 techa 数据的所有行,并且在最右侧新增了来自 df_states 的列(例如 statecountry)。

总结

本节课中我们一起学习了数据合并。我们首先介绍了四种常见的合并类型:内连接、左连接、右连接和外连接,并通过示例理解了它们的区别。然后,我们将这些概念应用于实际场景,使用 pandas 的 merge 函数,通过左连接为我们的 techa 数据集成功添加了州信息。这完成了我们当前阶段的数据提取、转换和加载过程,为后续分析准备好了数据。

106:数据汇总 📊

在本节课中,我们将学习如何使用Python的pandas库对数据进行分组和汇总。我们将通过创建数据透视表来探索数据,从而获得有价值的商业洞察。

在之前的视频中,我们重点介绍了ETL,即数据的提取、转换和加载过程。现在,我们将转向数据的查看、理解和探索阶段。这个阶段有时被称为探索性数据分析。

探索性数据分析简介

想象一下,你精心打理了一个花园。在收获之前,你需要先观察花园的状况,比如植物的高度、颜色、种类,以及果实的数量。同样,在Python中,我们使用函数来了解数据的“产量”和“多样性”,也就是数据的规模和形态。

一个园丁可能会统计盛开的花朵数量,或者将水果蔬菜按类别分组并估算重量。在Python中,我们将使用pandas库中的groupby和聚合函数来按类别汇总数据。例如,我们可能希望计算每个地区的总销售额。

数据探索的目标与过程

我们分析数据的根本目的是从中获得商业洞察。因此,在提取和清理数据之后,就该开始探索了。但需要注意的是,数据清理和探索的过程并非线性的,而是一个迭代循环。我们清理数据后开始探索,可能会发现需要进一步清理,然后返回去处理,如此反复。

当我们查看数据时,心中需要有一个目标。我们探索数据通常出于两个广泛的原因:

  1. 我们有一些具体的问题需要向数据提问。
  2. 我们面对一个新的数据集,还不确定能从数据中了解到什么。

本节课我们将聚焦于第二个原因,即更好地理解数据及其所传达的信息。

开始汇总数据

我们将继续使用之前视频中的Jupyter Notebook,处理名为techA的数据集。这是一个美国连锁便利店2023年至2025年的销售数据。

首先,我们将学习如何汇总数据,然后学习如何使用Python可视化库创建图表。本视频中学习的EDA技术是一种将数据分组并汇总的方法。例如,我们可能想知道这家连锁店在哪几个月收入最高。

面对百万行数据,手动计算每月收入非常困难。幸运的是,有函数可以为我们完成这一切,并返回一个包含所有聚合数据的整洁数据框。

在Python中,完成任何任务都有多种方法,转换和汇总数据也不例外。我们将选择一种分组和汇总数据的方法:groupby方法。

创建月度收入汇总表

让我们回到Jupyter Notebook,查看techA的月度总收入。这将告诉我们一年中哪些月份对商店最有利,并帮助我们更好地了解整个行业。

以下是创建汇总表的步骤:

  1. 指定数据框:我们使用df2数据框,并调用.groupby()方法。
  2. 指定分组列:我们希望按month列进行分组。groupby会找到month列中的所有唯一值,每个唯一值将成为汇总表中的一行。
  3. 指定计算列:我们希望对revenue列进行计算。
  4. 指定聚合函数:我们使用.sum()函数来计算总和。

具体代码如下:

df2.groupby('month', as_index=False)['revenue'].sum()

运行这段代码后,我们会得到一个包含两列(monthrevenue)和12行(一月到十二月)的数据透视表。观察数字,我们可以看到下半年收入似乎略高于上半年。这种数据汇总让我们对收入情况有了清晰的洞察,而这在查看百万行原始数据时是难以做到的。

保存汇总结果

我们刚刚运行的代码返回了一个数据透视表,但它并没有被保存下来以供后续使用。为了保存它,我们需要将其赋值给一个变量。

以下是保存汇总结果的代码:

df_rev_by_month = df2.groupby('month', as_index=False)['revenue'].sum()

运行此代码后,数据透视表就被保存在变量df_rev_by_month中了。

使用多种聚合函数

除了求和,我们还可以使用其他聚合函数,例如计算每月平均收入的.mean()函数,或统计每月交易次数的.count()函数。

我们甚至可以将所有这些聚合结果合并到一个数据透视表中。以下是同时计算总收入、平均收入和交易次数的代码:

df2.groupby('month', as_index=False)['revenue'].agg(['sum', 'mean', 'count']).reset_index()

运行此代码,我们将得到一个包含monthsummeancount列的汇总表,可以从中观察到更多模式。

按年份和月份进行分组

如果我们不想将三年的所有相同月份数据合并在一起,而是希望分别查看每一年每个月的收入,该怎么办呢?

我们可以修改groupby函数,传入一个列名列表,同时按yearmonth进行分组。以下是相应的代码:

df2.groupby(['year', 'month'], as_index=False)['revenue'].sum()

这将生成一个包含36行的长表格(3年 x 12个月)。

重塑数据透视表

36行的表格可能有些冗长。我们可以使用.unstack()函数来重塑表格,让月份作为行,而每一年作为单独的列,这样更易于阅读。

以下是重塑表格的代码:

df2.groupby(['month', 'year'])['revenue'].sum().unstack()

运行后,我们将得到一个以月份为索引,以2023、2024、2025各年为列的表格,格式更加清晰易读。

总结

本节课中,我们一起学习了如何使用pandasgroupby方法创建数据透视表来汇总数据。我们掌握了如何按单列或多列分组,如何使用求和、平均值、计数等多种聚合函数,以及如何通过.unstack()重塑表格以获得更好的可读性。

数据透视表是一个极其强大的工具,特别是在探索数据时。它能快速汇总数据并执行计算,将数据转化为更易于理解的格式,帮助我们洞察数据背后的规律。这种层面的理解,在查看未经筛选和聚合的原始数据集时是极具挑战性的。

107:可视化入门 - Python库 📊

在本节课中,我们将学习如何使用Python进行数据可视化。上一节我们介绍了如何通过汇总统计来理解数据,但“一图胜千言”。本节中,我们将探索一个强大的Python库——Matplotlib,它能快速、轻松地将数据转化为直观的图表,帮助我们进行探索性数据分析。

可视化的重要性

正如园丁精心打理花园,通过修剪、移植和布置植物来创造赏心悦目的景观,数据分析师也需要通过可视化来“打理”数据。可视化让我们能够直观地理解数据的模式、分布和关系,从而更好地展示分析的成果。

为什么选择Matplotlib?

以下是选择Matplotlib作为入门可视化工具的几个主要原因:

  1. 成熟且广泛使用:Matplotlib是一个拥有超过二十年历史的库,拥有丰富的在线文档和社区支持,便于解决问题。
  2. 简单直接:它提供了预置的函数来创建各种图表。例如,要创建直方图,只需调用 hist() 函数,而无需手动计算和绘制每个条形。
  3. 直观的图层概念:构建图表就像在画布上添加图层一样直观,可以逐步添加坐标轴标签、标题等元素。

开始使用Matplotlib

首先,我们需要在Jupyter Notebook中导入Matplotlib库。我们通常使用 plt 作为其别名,以简化后续代码。

import matplotlib.pyplot as plt

创建第一个可视化:直方图

直方图用于展示单个变量的分布情况。每个条形代表一个数值范围,条形的高度代表落入该范围的数据点数量。

我们将针对数据集中的“营收”列创建直方图。

# 基础直方图
plt.hist(df2['revenue'])
plt.show()

运行上述代码会生成一个直方图,但初始结果可能因为数据分布过于集中而显得不够清晰。

调整与优化可视化

为了使图表更具信息量,我们可以利用Matplotlib的功能进行调整。

1. 调整条形数量
通过设置 bins 参数,可以控制直方图的条形数量,从而改变数据的粒度。

plt.hist(df2['revenue'], bins=100)
plt.show()

2. 调整视图范围
使用 plt.axis() 函数可以缩放图表的显示范围,聚焦于数据的特定区域。

plt.hist(df2['revenue'], bins=100)
plt.axis([-300, 300, 0, 5000]) # 设置x轴和y轴的显示范围
plt.show()

3. 指定条形宽度
除了设置条形数量,还可以通过计算来指定每个条形的宽度。

bin_width = 0.25
num_bins = int((df2['revenue'].max() - df2['revenue'].min()) / bin_width)
plt.hist(df2['revenue'], bins=num_bins)
plt.show()

4. 添加图表元素
最后,我们可以为图表添加标题和坐标轴标签,使其更加完整和易懂。

plt.hist(df2['revenue'], bins=num_bins, color='green')
plt.xlabel('Revenue') # x轴标签
plt.ylabel('Count')   # y轴标签
plt.title('Histogram of Revenue') # 图表标题
plt.show()

Matplotlib的总结与展望

本节课中,我们一起学习了如何使用Matplotlib库创建和定制直方图。Matplotlib是一个易于上手的可视化工具,非常适合初学者。它的主要优点是简单直接,但生成的图表风格相对基础。

数据可视化领域还有许多其他功能更丰富、图表更美观的Python库(如Seaborn, Plotly等)。当你掌握了Matplotlib的基础后,可以进一步探索这些库来创建更具吸引力的交互式可视化图表。

通过本节的学习,你已经掌握了将数据转化为直观视图的第一步。在接下来的课程中,我们将运用这个库创建更多类型的图表,深入进行探索性数据分析。

108:在Python中创建可视化 📊

在本节课中,我们将使用上一节介绍的 matplotlib 库,基于我们的 techca 数据创建一系列可视化图表。我们将学习四种核心图表:散点图、条形图、折线图和箱线图,并了解它们如何帮助我们探索和理解数据。

散点图:探索变量间关系 📈

上一节我们介绍了 matplotlib 库,本节中我们来看看如何用它创建散点图。散点图是一组绘制在水平轴(X轴)和垂直轴(Y轴)上的点。它使用两个连续或离散变量,分别代表X变量和Y变量。散点图可以展示两个变量之间的关系。

两个变量之间的关系主要有三种:正相关、负相关和无相关。通过观察散点图中点的分布模式,我们可以初步判断变量间的关系类型。

  • 正相关:点呈现向上的趋势。这意味着随着X轴变量的增加,Y轴变量也增加。
  • 负相关:点呈现向下的趋势。这意味着随着X轴变量的增加,Y轴变量减少。
  • 无相关:点没有明显的趋势,表明X和Y之间可能没有明确的关系。

现在,让我们用Python和matplotlib创建一个散点图。首先,请打开你的Jupyter Notebook,并导航到可视化部分。

以下是创建散点图的步骤:

  1. 我们想探究收入毛利率之间的关系:收入更高的商品,其毛利率是更高还是更低?
  2. 使用 plt.scatter() 函数,并指定X轴和Y轴的数据。
  3. 添加坐标轴标签等图层,使图表更清晰。
import matplotlib.pyplot as plt

# 创建散点图:X轴为收入,Y轴为毛利率
plt.scatter(df2['revenue'], df2['gross_profit_margin'])
plt.xlabel('Revenue') # X轴标签
plt.ylabel('Gross Profit Margin') # Y轴标签
plt.title('Revenue vs. Gross Profit Margin') # 图表标题
plt.show() # 显示图表

运行代码后,我们得到了散点图。从图中可以看出一些有趣的现象:收入和毛利率之间可能存在微弱的正相关关系,但很难确定。同时,不同收入水平下的毛利率差异很大。对于高收入商品(可能主要是燃油),其毛利率普遍较低。散点图是一个非常有用的工具,能帮助我们初步理解数据中真正发生了什么。

条形图:比较类别间的数值 📊

接下来,我们将创建条形图(或称柱状图)。在条形图中,每个条形通常代表一个不同的类别,而条形的高度(或长度)则代表该类别的数值大小。条形图有助于对类别进行排名和跨类别比较。

创建条形图时,我们通常需要重构数据,使每个类别成为一行,并有一个数值代表该类别条形的高度。

假设我们想创建一个条形图,展示每个饮料类别的总收入

以下是创建条形图的步骤:

  1. 首先,我们需要使用 groupby 和聚合函数(如 sum)创建一个数据透视表,汇总每个父类别(parent_name)的总收入。
  2. 然后,过滤出我们感兴趣的饮料类别。
  3. 使用 plt.bar() 函数创建条形图,将类别名称作为X轴,总收入作为条形高度。
  4. 为了使图表更美观,可以旋转X轴标签,避免重叠。
# 1. 创建数据透视表,汇总每个父类别的总收入
df_parent = df2.groupby('parent_name', as_index=False)['revenue'].sum()

# 2. 过滤出饮料类别
beverage_categories = ['Hot Dispensed Beverage', 'Juice', 'Liquor', 'Milk', 'Pop', ...] # 你的类别列表
df_beverages = df_parent[df_parent['parent_name'].isin(beverage_categories)]

# 3. 创建条形图
plt.bar(df_beverages['parent_name'], df_beverages['revenue'])
plt.xlabel('Beverage Category')
plt.ylabel('Total Revenue')
plt.title('Total Revenue by Beverage Category')
plt.xticks(rotation=90) # 旋转X轴标签90度
plt.show()

运行代码后,我们得到了按字母顺序排列的条形图。为了更直观地比较大小,我们可以在绘图前对数据进行排序。

# 在绘图前,按收入降序排列数据
df_beverages = df_beverages.sort_values('revenue', ascending=False)

# 然后使用排序后的数据创建条形图
plt.bar(df_beverages['parent_name'], df_beverages['revenue'])
# ... (其余代码不变)

现在,条形图将按收入从高到低排列,更容易进行比较。此外,除了垂直条形图,我们还可以使用 plt.barh() 函数创建水平条形图。

折线图:观察数据随时间的变化趋势 📉

我们的第三个可视化是折线图。折线图展示信息在连续区间(通常是时间)上的变化情况。在折线图中,数据点被绘制在图表上,并以点对点的方式用线连接起来。线条的上升或下降,直观地描绘了变量随时间增加或减少的趋势。

对于这个折线图,我们想知道收入是否具有季节性。因此,我们将检查收入如何随月份变化。

以下是创建折线图的步骤:

  1. 使用 groupby 按“年月”对数据进行分组,并计算每月的总收入。
  2. 使用 unstack 方法重塑数据,以便将不同年份的数据作为不同的列。
  3. 使用 plt.plot() 函数分别绘制每一年的折线。
  4. 添加图例以区分不同年份的线条。

# 1. 按年月分组并计算总收入,然后重塑数据
df_line = df2.groupby(['month', 'year'])['revenue'].sum().unstack()

# 2. 创建折线图
plt.plot(df_line.index, df_line[2023], label='2023') # 绘制2023年线
plt.plot(df_line.index, df_line[2024], label='2024') # 绘制2024年线
plt.plot(df_line.index, df_line[2025], label='2025') # 绘制2025年线

plt.xlabel('Month')
plt.ylabel('Total Revenue')
plt.title('Monthly Revenue Trend (2023-2025)')
plt.legend() # 添加图例
plt.show()

运行代码后,我们得到了一个清晰的折线图。从图中可以看到一个模式:在冬末春初,总收入较低,然后随着年份的推移而增加。2023年(蓝线)、2024年(橙线)和2025年(绿线)都显示出相似的模式。

箱线图:理解数据的分布情况 📦

最后一个可视化是箱线图。箱线图通过显示几个重要的统计量(最小值、最大值、中位数、第25百分位数和第75百分位数)来展示一个或多个变量的分布情况。它有时被称为盒须图,因为其可视化效果像一个带有两条“须”的盒子。

图的每个部分代表数据的四分之一(一个四分位数)。从上须顶端到箱体顶部是最大的25%数据,箱体顶部到箱体中间的线是次高的25%,箱体中间到箱体底部是第三高的25%,箱体底部到下须底端是最小的25%数据。与直方图类似,箱线图能告诉你很多关于变量分布的信息。

要创建箱线图,我们调用 plt.boxplot() 函数。

以下是创建箱线图的步骤:

  1. 在括号中放入我们想要为其创建箱线图的变量,这里是我们数据框 df2 中的 revenue 列。
  2. 使用 whiskers 参数将须线延伸到数据的最小值和最大值。
  3. 添加标题并显示箱线图。
# 创建收入数据的箱线图
plt.boxplot(df2['revenue'], whis=float('inf')) # whis=float('inf') 将须线延伸到最小和最大值
plt.title('Box Plot of Revenue')
plt.show()

初次运行箱线图时,你可能会发现图表看起来很奇怪,箱体被压缩成一条线。这是因为数据中存在一些极值,导致箱体本身在图表中显得非常小。为了更清楚地观察主要数据的分布,我们可以使用 plt.axis() 函数来放大图表的特定区域。

# 先创建箱线图
plt.boxplot(df2['revenue'], whis=float('inf'))
plt.title('Box Plot of Revenue (Zoomed In)')

# 然后放大到我们感兴趣的区域(例如,聚焦于大部分数据所在的区域)
plt.axis([0, 2, -10, 20]) # 设置X轴和Y轴的显示范围
plt.show()

通过放大,我们可以清楚地看到箱体,它包含了50%的数据。这让我们了解到,大部分数据都集中在这个缩放的区域内。

总结 🎯

本节课中,我们一起学习了如何使用Python的 matplotlib 库创建四种核心的可视化图表:散点图、条形图、折线图和箱线图。我们探索了数据,并特别对收入变量有了一些新的认识。虽然还有很多其他变量可以探索,也有很多其他类型的可视化可以学习,但掌握了这些图表和 matplotlib 包,你已经为对自己的数据进行探索性数据分析打下了良好的基础。

109:第二模块总结 🎯

在本模块中,我们学习了如何使用Python进行ETL(提取、转换、加载)和EDA(探索性数据分析)。我们将回顾视频中的核心内容,并总结Python在数据分析中的优势。


Python:数据科学的通用语言 💻

Python是一种通用编程语言,也是数据科学领域最流行的语言之一。我们目前所学的只是Python强大功能的冰山一角。

Python是开源的,这意味着它可以免费使用。网络上有大量关于我们正在使用甚至尚未探索的软件包的问答资源。因此,当遇到障碍时,通常可以在网上找到解决方案,或者利用许多可用的AI工具来帮助生成代码、通过调试找到解决方案并解释代码。

与“点击即用”或“拖放”式软件不同,作为一种编程语言,Python非常灵活,可以广泛应用于各种数据分析任务。


数据清洗:分析的基石 🧹

在本模块中,我们使用Python开始探索和理解TechA公司的数据。然而,在开始探索之前,我们需要清理数据,即修复或移除错误和异常值,并补充数据。

我们发现Python是清洗和整理数据的非常有用的工具。

数据概览与检查

首先,我们找到了一些有用的函数来汇总和查看我们的大型数据集。Python使我们能够轻松地检查数据。例如,我们无法在Excel中查看这个CSV文件,因为Excel只允许大约一百万行,而我们的数据集行数更多。

数据类型与清洗路径

接下来,我们学习了pandas库中的不同数据类型,这引导我们采用了不同的数据清洗路径。

以下是三种主要的数据清洗方法:

  1. 修复或更改数据:我们使用的例子是清理日期列并更改其数据类型。
  2. 移除数据:我们使用的例子是从数据中移除异常值。
  3. 补充数据:我们通过添加新信息来丰富数据集。

我们的数据起初相对干净,但通常数据分析师会花费大量时间来清洗和准备数据以供分析。


探索性数据分析:挖掘商业洞察 🔍

一旦数据相对干净,我们就能够通过EDA开始从数据中提取商业洞察。

数据汇总与聚合

我们使用了Groupby方法来汇总大数据,并学习了如何以不同方式重构和聚合数据。

示例代码:

# 使用Groupby按产品汇总收入
revenue_by_product = df.groupby('product')['revenue'].sum()

数据可视化

在学会了如何汇总和聚合数据后,我们转向了数据可视化。

我们学习了Matplotlib包,并创建了许多可视化图表,这些图表帮助我们开始获得关于TechA公司收入的商业洞察。我们了解了其收入的季节性,以及哪些产品可能产生更多或更少的收入。

示例公式/概念:
可视化帮助我们发现模式,例如:收入峰值出现在第四季度


总结:从园丁到数据分析师 🌱

我们曾用园丁来比喻数据清洗和可视化。就像园丁一样,我们通过探索这个真实的TechA数据集,亲手处理了现实世界的数据。

现在,你已经能够使用一个顶级的统计工具——Python,来快速高效地清洗和探索数据,从而深入了解你的业务及其面临的挑战与机遇。

本节课中,我们一起学习了Python在数据清洗和探索性数据分析中的核心应用,掌握了从数据准备到获取初步商业洞察的完整流程。


110:第三模块-简介 🏄

在本节课中,我们将要学习如何从关系型数据库中获取结构化数据,并重点介绍使用结构化查询语言(SQL)与数据库进行交互。这是数据工作中至关重要的一步。

正如海浪有规律地拍打着丹娜角海滩,我们作为数据专业人员,也经常需要从关系型数据库中读取数据。数据整合是FACT框架中的一大部分,据估计,数据工作者80%的时间都花费在这一步骤上。原因之一是数据可能以多种不同的形式和来源存在。

数据与SQL的重要性

上一节我们提到了数据整合的普遍性,本节中我们来看看为什么掌握SQL技能如此关键。拥有SQL的基础知识对几乎所有组织都至关重要。

我采访了健康保险公司Motive Health的技术执行副总裁Josh Doubin。以下是他就数据和SQL在公司中角色的看法:

“我叫Josh Doubin,是Motive Health公司的技术执行副总裁。数据是我们公司的命脉,没有我们使用、管理和传输的所有数据,我们就不会有公司。是的,我仍然在写代码,我使用的语言包括Python、SQL、C#、Go以及其他各种语言来支持核心系统。SQL是一门技术团队每个人都必须掌握的语言。SQL已经存在了很长时间,并且被广泛理解,我们所有的数据都存储在某种结构化数据库中,SQL是我们用来访问几乎所有这些数据的工具。”

Josh毫不犹豫地表示,SQL知识在他的公司是强制性的,至少对于技术团队的成员是如此。我认为这一说法对许多其他公司也同样适用。任何与数据打交道的人,都需要至少掌握如何使用SQL的基础知识。

学习SQL与Python

Josh还提到Python是他使用的重要语言。现在,你们中的一些人可能会因为需要学习另一门语言而感到有些焦虑。然而,你们很快会发现,SQL拥有一套相对较小且易于理解的命令集。此外,SQL已经存在了很长时间,因此有大量的资源可以帮助你使用SQL,包括AI工具。

我们的目标是,在本模块结束时,你不仅能够谈论如何使用SQL,还将在Python环境中获得一些使用它的实际经验。能够同时使用SQL和Python,将使你能够从数据中解锁许多洞见。

课程目标与展望

以下是本模块的核心学习目标:

  • 掌握基础:理解关系型数据库的基本概念和SQL的核心语法。
  • 实践操作:在Python环境中连接数据库并执行SQL查询。
  • 整合技能:学会将SQL的数据获取能力与Python的数据处理能力相结合。

就像冲浪者学习驾驭海浪一样,你将学习如何驾驭来自关系型数据库的数据流。

本节课中,我们一起学习了数据整合的重要性,了解了SQL在商业环境中的关键作用,并明确了本模块的学习目标。接下来,让我们开始深入学习关系型数据库和SQL。

111:数据库导论 🗄️

在本节课中,我们将要学习关系型数据库管理系统的基础知识。我们将探讨为什么需要数据库,以及它们相较于电子表格的关键优势与核心特性。

为什么需要数据库?

上一节我们介绍了课程主题,本节中我们来看看为什么数据库在现代数据管理中不可或缺。要理解这一点,可以先思考使用电子表格(如Excel)存储和共享数据时可能遇到的问题。

虽然电子表格是商业专业人士的重要工具,但在存储大量数据并供多人访问时,它们存在一些弱点。

以下是电子表格的三个主要弱点:

  1. 存储容量有限:例如,Excel工作表最多只能容纳约100万行数据。对于大多数电子表格用例来说,这已经足够。然而,与中型和大型组织存储的数据量相比,100万行数据只是沧海一粟。
  2. 可能存在数据版本冲突:如果你曾与团队合作项目,并且多人希望同时修改同一个电子表格文件,你就能体会到这一点。管理电子表格文件内容时,可能会发现存在多个文件版本,每个版本都包含其他版本没有的信息,这会造成困扰。
  3. 数据结构化程度低:对许多人来说,这可以是一个优点,因为你可以创建自定义样式的表格、隐藏工作表或在同一工作表中包含多个表格。然而,当你处理需要不断更新且供多人使用的数据时,缺乏结构会令人沮丧。

数据库可以解决所有这三个问题。

数据库的关键特性

既然我们了解了电子表格的局限性,接下来让我们探讨数据库的核心特性。数据库由一个或多个包含行和列的表格组成。

你可以将数据库中的表想象成电子表格工具中的单个工作表。然而,与电子表格不同,数据库对每个单元格可以存储的数据类型有严格的要求。

以下是数据库表格的一些关键特性:

  • 列数据类型一致:一列中的所有值必须是相同的数据类型,例如数值或字符串。
    • 代码示例:在SQL中定义表时,会指定列的数据类型,如 VARCHAR(50) 表示最大50个字符的字符串,INT 表示整数。
  • 字符串长度限制:如果是字符串,通常需要指定单个条目可使用的最大字符数。
  • 海量数据存储:数据库表可以包含数百万乃至数十亿行数据。其限制更多取决于数据库所在服务器的存储容量,而非软件本身。
  • 表间关联:数据库的一个重要特性是,表之间可以通过匹配一个表中的列值与另一个表中的列值相互关联。
    • 公式/概念:这种关联通常通过主键外键来实现。主键是表中唯一标识每一行的列,外键是另一个表中指向主键的列。

这些关系通常在创建数据库时定义,并汇总在数据库模式中。这些模式通常通过实体关系图进行可视化展示。

ERD列出了表名、包含的列,以及一列如何与其他表中的列值匹配。

数据库中各表之间的关系非常重要,因为它允许你根据需要,创建组合了来自多个表的列的新数据集。这通常通过使用查询来完成,我们将在其他课程中详细讨论。

数据库结构的一个理想特性是数据不应重复。例如,客户的地址不应存储在多个表中,而应只存储在一个表中。这使得更新数据库更容易,同时也减少了存储需求。

确保数据一致性:ACID属性

数据库的另一个重要特性是,尽管存在许多交互和错误,它们仍能保持数据的一致性。这是通过整合所谓的ACID属性来实现的。ACID是一个缩写词。

以下是ACID属性的具体含义:

  • A - 原子性:这意味着与数据库的每次交互都被视为一个单一单元。换句话说,整个交互要么成功,要么失败。不存在部分完成的情况。
  • C - 一致性:一个重要的含义是,当向数据库表中添加新行时,必须确保数据类型与每列要求的数据类型一致。
  • I - 隔离性:这意味着当对数据库的更改同时发生时,其结果与它们顺序发生的结果相同。例如,考虑一个在线交易,我与另一位客户Rick同时完成了购买自行车的交易。如果不存在隔离性,库存水平将错误地减少一个单位而不是两个。隔离性的存在确保了此类事件不会发生。
  • D - 持久性:这意味着对数据库的更改以某种方式存储,如果在事务开始后发生断电,一旦恢复供电,事务将完成。

总结

本节课中我们一起学习了关系型数据库管理系统的基础知识。我们了解到,数据库因其可靠性、安全性和可扩展性,自20世纪70年代出现以来,一直是存储数据的重要方式。我们比较了数据库与电子表格,指出了电子表格在存储容量、版本控制和数据结构化方面的局限性。接着,我们深入探讨了数据库的关键特性,包括严格的数据类型定义、海量存储能力、表间关联关系以及避免数据冗余的设计原则。最后,我们介绍了确保数据可靠性的ACID属性。正如我们可以对太平洋和美丽的后湾说更多一样,关于数据库还有很多可以探讨的内容,例如如何连接数据库以及如何与它们交互。我们将在后续课程中讨论这些内容。

112:结构化查询语言(SQL)概述 🚤

在本节课中,我们将要学习结构化查询语言(SQL)的基本概念。SQL是与关系型数据库进行交互的核心工具,它允许我们查询、操作和管理数据。我们将了解SQL的用途、基本命令以及它在实际工作中的应用场景。


我正身处巴布亚岛紧邻太平洋的一个码头。太平洋蕴藏着巨大的生产力和无与伦比的美丽。这片水域被用于多种用途,例如捕鱼、划船和运输。但要充分利用海洋的优势,你必须拥有某种方式来航行于水域之上,比如皮划艇、帆船、游艇或桨板。

类似地,关系型数据库内部也蕴藏着巨大的潜力,但你必须能够以某种方式在其中“航行”。在之前的课程中,我们讨论了关系型数据库。既然你已经对关系型数据库有了初步了解,本节课我们将重点学习如何使用一种易于理解的语言与关系型数据库进行交互,这种语言被称为结构化查询语言,通常缩写为 SQL

“结构化”和“语言”这两个词的含义应该相当直接。你可能想知道为什么“查询”这个词是SQL名称的一部分。一般来说,查询就是一个问题。因此,在关系型数据库的上下文中,你可以将查询视为向数据库提出的一个问题。作为回应,数据库将返回一部分数据作为答案。

你还可以创建不仅仅返回部分数据的查询。例如,你可以创建利用表之间关系的查询,以返回一个组合了多个表数据的数据集。你也可以创建返回数据相关计算的查询,例如平均值和中位数。

让我们听听Qualtrics的数据分析师Tucker Campamp讨论他如何使用SQL。

我的名字是Tucker K。我在Qualtrics担任数据分析师。我在服务运营团队工作。我们为客户运营团队提供洞察分析和分析支持,并为他们创建仪表板。这大致是我的工作内容。

是的,我作为数据分析师使用的主要工具是SQL。它是一个帮助提取、检索数据、操作数据并以有效和有用的方式呈现数据的工具。这是我使用的主要工具。另一个工具是Python,用于进行更深入的统计分析和可视化。所以这可能是我使用的主要两个工具。然后就是大量的电子表格和Google Docs。

就我使用的技术工具而言。是的,我使用的主要SQL命令显然是SELECT语句。这只是检索我需要的数据。DELETEALTER,比如SQL中的ALTER语句,例如,如果我需要向表中添加一个新列,我可以使用ALTER语句。或者如果我需要删除某些包含错误数据或缺失信息等的行,我可以使用DELETE语句。但我主要使用的是SELECT语句,选择我需要的列、字段,那些我试图从中获取洞察的字段。

是的,人工智能在帮助我处理SQL查询和Python代码方面扮演着重要角色。人工智能帮助我的主要方面是调试和查找代码中的错误。我觉得通常当我的代码出现错误时,我需要花很长时间才能找出错误发生的位置。有时错误信息没有给我很多细节。有了人工智能,我能够上传代码并说,嘿,我看到这个错误,你能帮我检测它来自哪里吗。它真的帮助我调试问题,并让整个过程快很多。而如果我独自卡在那里,将需要很长时间来解决并找出错误所在。人工智能还帮助我让代码更高效、运行更快。有时我自己想出的代码效率很低。它能完成任务,但速度不快。所以人工智能确实有助于缩短时间并提高效率。

正如Tucker所提到的,SQL可用于编辑表、删除表、向表添加数据以及读取数据。在本课程中,我们将重点学习使用SQL从数据库中读取数据

Tucker提到了他使用的几个命令。你可能注意到其中包含常见的英语单词,如SELECTDELETEALTERFROM

其他关键词还包括WHEREASINTO。因此,SQL的优势之一在于它相当容易理解。一旦你了解了其中一些关键命令及其必需的结构,你就可以将它们与表名和列名结合使用来创建查询。你会发现,仅仅几个命令就能让你完成许多查询。

此外,正如Tucker提到的,AI工具对于调试SQL查询和提高其效率非常有帮助。AI也可用于生成SQL查询。

现在,你应该注意,数据库有多种实现方式,每种都有自己略微不同的SQL命令集。例如,SQLitePostgreSQLMySQL是不需要许可协议和费用的开源数据库示例。

另一方面,Oracle DatabaseMicrosoft SQL ServerIBM DB2是需要许可费用的商业数据库示例。

每种数据库都有其自身的优缺点。但重要的是,与这些数据库中的任何一个进行交互的SQL命令大部分是相同的。这意味着你从使用像SQLite这样的开源数据库获得的经验,在很大程度上可以转移到使用像Oracle Database这样的商业数据库上。

你还应该知道,有一些专门为处理数据库而设计的集成开发环境。例如,DBeaverMySQL WorkbenchOracle SQL DeveloperDataGrip只是其中的几个。它们通过高亮显示语法、创建模式的视觉表示、预览查询数据以及将AI工具集成到环境中,帮助你创建SQL命令,从而可以将来自纯英语的非结构化命令转换为有效的SQL查询。

虽然我们可能不会使用这些IDE,但希望了解人们使用SQL的一些常见方式,能帮助你以更高效的方式与它们交互。


现在,你已经对SQL的用途和潜力有了扎实的概述。SQL就像一艘船,让我们能够航行于存储在关系型数据库中的数据海洋中。真正的学习始于动手实践,我们将在接下来的课程中进行探索。下节课见。

113:基础 SQL 命令 🛠️

在本节课中,我们将学习如何使用基础 SQL 查询从一个数据库中提取数据。我们将首先了解数据库的结构,然后通过一系列简单的命令来探索和操作数据。

数据库结构与关系图

在开始使用 SQL 查询之前,理解数据库中的不同表以及它们之间的关系至关重要。我们这里看到的是一个实体关系图(ERD),它由特定的数据库集成开发环境(IDE)生成,本例中使用的是 DBeaver。

这个数据库包含六个表。主表是 transactions 表。直接连接到 transactions 表的有 sites 表、customer 表和 products 表。products 表又连接到 categories 表,而 categories 表则连接到 parent 表。

为了更好地理解 ERD 中的连接关系,可以点击连接线。例如,点击连接 transactions 表和 products 表的线,可以看到它们通过 transactions 表中的 product_id 列和 products 表中的 product_id 列进行关联。图中的标记表明,transactions 表中的每一行都对应一个特定的产品 ID,但 transactions 表中的多行数据可以关联到 products 表中的任意一行。

在每个表的顶部,加粗显示的列被称为主键,它是唯一标识表中每一行的列。主键下方的则是其他列名。

将数据存储在数据库中的一个好处是可以减少存储数据的大小。例如,这个数据库文件的大小不到对应 CSV 文件的一半。

SQL 查询基础概念

在实际进行 SQL 查询之前,有两个重要事项。首先是提供 SQL 查询的基本概览和一些需要牢记的关键概念。

以下是需要掌握的几个关键概念:

  1. 简单关键字:SQL 使用简单的关键字来执行查询,例如 SELECTFROMLIMITWHEREANDORAS 等。这些词非常易于理解。
  2. 大小写不敏感:与 Python 不同,SQL 不区分大小写。无论你使用大写、小写还是混合大小写来拼写列名或表名,结果都一样。但按照惯例,通常将 SQL 命令大写,以帮助区分 SQL 命令和表名/列名。
  3. 特殊字符:SQL 查询语言包含一些特殊字符,如星号 *、百分号 % 和引号 "'。你会在查询中看到它们的使用。
  4. 多行格式:为了便于阅读,SQL 查询经常被分成多行。这不是必须的,但是一种常见的做法。
  5. 分号结尾:SQL 查询以分号 ; 结尾。这允许你将查询语句分成多行。
  6. 注意细节:有时最小的错误也会导致查询失败。例如,缺少逗号 ,、空格,或者命令顺序错误,都可能导致 SQL 查询出错。

连接并探索数据库

接下来,我们将在命令行环境中演示如何与数据库交互。在 Windows 上可以使用命令提示符,在 Mac 上可以使用终端。在 Jupyter Lab 中,可以通过选择“终端”来打开命令行窗口。

首先,使用 cd 命令切换到存储数据库文件的目录。然后使用 ls 命令列出文件,确认 teacha.db 文件存在。

现在,使用以下命令连接到数据库:

sqlite3 teacha.db

连接成功后,会显示 SQLite 版本信息并出现 sqlite> 提示符。

在数据库连接中,可以使用 .tables 命令查看所有表名:

.tables

这将显示六个表:categories, parents, sites, customers, products, transactions。这些名称与之前在 ERD 中看到的完全一致。

另一个有用的命令是 .schema,它可以查看数据库的结构定义:

.schema

这会输出创建每个表所需的 SQL 语句。例如,对于 parent 表,会显示:

CREATE TABLE parent (parent_id INTEGER PRIMARY KEY, parent_name TEXT NOT NULL);

这表示 parent 表有两列:parent_id(整数类型,主键)和 parent_name(文本类型,不允许为空)。虽然可以从模式信息中重建 ERD,但不如图形化的 ERD 直观。

在执行查询前,建议将输出模式设置为列格式,这样显示结果会更美观:

.mode column

执行基础 SQL 查询

现在,让我们开始执行 SQL 查询来探索数据。我们将以 sites 表为例。

首先,查询 sites 表中的所有行和所有列:

SELECT * FROM sites;

SELECT * 表示选择所有列,FROM sites 指定从 sites 表获取数据。执行后会返回表中的所有行。

如果只想查看前几行,可以使用 LIMIT 子句:

SELECT * FROM sites LIMIT 5;

这将只返回前 5 行数据。

可以使用 ORDER BY 子句对结果进行排序。例如,按 site_id 升序排列前5行:

SELECT * FROM sites ORDER BY site_id LIMIT 5;

注意,ORDER BY 子句需要放在 LIMIT 子句之前,否则会导致语法错误。

使用 WHERE 过滤数据

WHERE 子句用于根据指定条件过滤行。例如,只查询状态为“closed”的站点:

SELECT * FROM sites WHERE site_status = "closed";

这将只返回 site_status 列等于“closed”的行。

可以添加多个条件进行过滤。例如,查询纬度在 40 到 41 之间的站点:

SELECT * FROM sites WHERE latitude >= 40 AND latitude < 41;

AND 运算符表示两个条件必须同时满足。

使用 LIKE 进行模糊匹配

WHERE 子句还可以与 LIKE 操作符结合,进行模糊字符串匹配。例如,查询地址中包含“main”这个词的所有站点:

SELECT * FROM sites WHERE address LIKE "%main%";

这里的百分号 % 是通配符,表示“任意字符序列”。%main% 表示在“main”前后可以有任意字符。

总结

本节课我们一起学习了基础 SQL 命令。我们首先了解了数据库的结构和表之间的关系。然后,我们掌握了 SQL 查询的几个关键概念,包括关键字、大小写规则和格式。

通过实际操作,我们学会了如何连接到 SQLite 数据库,查看表结构和列表。最重要的是,我们练习了几个最核心的 SQL 查询命令:

  • SELECT ... FROM ... 用于选择数据。
  • LIMIT 用于限制返回的行数。
  • ORDER BY 用于对结果排序。
  • WHERE 用于根据条件过滤行,并可结合 =><AND 等操作符,以及 LIKE 进行模糊匹配。

SQL 结构化查询语言非常直观易学。一旦掌握了这些基础命令,就可以轻松地将它们组合起来,构建更复杂的查询。值得注意的是,本节课我们是通过命令行终端与数据库交互的。在后续课程中,我们将探讨如何直接从 Python 环境中与 SQL 数据库进行交互,而不必使用终端或像 DBeaver 这样的数据库 IDE。

114:为什么我们需要SQL和Python 🧩

在本节课中,我们将探讨为何将SQL与Python结合使用是数据分析领域的一项强大技能。我们将通过一个具体场景来理解这两种技术如何互补,并听取资深开发者的实践经验。


有些事物天生就适合结合在一起,例如沙子和水。结合沙子和水,你可以创造出沙堡或其他沙雕等非常酷的作品。

另一个强大的组合是Python和SQL。在本节中,我们将讨论为何掌握同时使用Python和SQL的技能会如此强大。

请想象以下场景:你已经拥有丰富的实践经验,并成为了一名SQL专家。你需要获取上个季度的销售数据,或是某个特定区域、特定产品的客户列表吗?这不成问题,因为你闭着眼睛都能写出查询语句来获取这些数据。

有一天,你面临一个新的挑战。你的团队希望理解客户流失的原因,不仅仅是哪些客户离开了,更重要的是他们为何离开。

因此,你需要将结构化的客户购买历史销售数据,与从客户调查开放式问题中收集的非结构化数据结合起来。

接着,你希望创建一个模型,用于预测客户在未来一年内继续留存的可能性。

虽然你的SQL技能可以让你读取结构化数据并进行一些基本计算,但它们无法让你从非结构化数据中获取洞察。

于是,你向数据科学团队求助,他们向你展示了如何使用Python从这两组数据中获得更深入的见解。

例如,他们向你展示了几行Python代码如何清理和结构化杂乱的调查数据、理解文字背后的情感、量化这种情感并将其可视化。

然后他们询问,你是否愿意将这些数据与你用SQL技能检索到的数据结合起来,以便创建一个预测客户流失可能性的模型。你感到非常兴奋。

然而,当你想到整个工作流程将变得多么复杂时,你的兴奋感逐渐消退。你询问是否必须在一个文件中编写SQL代码,在另一个文件中编写Python代码,然后安排一个平台运行SQL,另一个平台运行Python。

但随后你了解到,仅需几个pandas函数,你就可以执行SQL查询并将数据保存为DataFrame。

这几乎让你喜极而泣,因为你意识到现在可以在Python环境中轻松运用你的SQL技能,从而极大地简化了数据清洗、合并和建模的流程,帮助你更深入地理解客户流失问题。


那么,你对这个场景有何感想?它的一个目的是强调,将SQL技能与Python技能结合,能极大地提升你从数据中获取洞察的能力。

SQL是用于检索结构化数据的可靠、知名且经过验证的语言,而Python则更加通用,可用于数据清洗、合并以及进行更高级的数据计算。

该场景的另一个目的是强调,你可以在Python代码中嵌入SQL查询,这使得整个过程变得更加容易,因为所有步骤都可以存储在一个文件中,并通过一个平台运行。

既然你可以使用SQL查询和Python命令来筛选和汇总数据,那么下一个问题是:应该在多大程度上使用SQL进行数据筛选和汇总,又该在多大程度上使用Python?

我与资深软件开发者Jeff Campbell进行了交流,他在所开发的应用程序中使用SQL方面拥有丰富的经验。让我们听听他关于在何处清洗和汇总数据的观点。

我叫Jeff Campbell。我在软件工程领域工作了大概30多年。我目前为耶稣基督后期圣徒教会工作,担任移动团队的首席软件开发者,负责移动应用程序开发。

在我的职业生涯中,我曾在非营利和营利性机构工作过。我做过Novell网络、QuickBooks相关的工作,也为州政府工作过,还曾在初创公司任职。可以说,我经历了从大型企业到初创公司,再到个人项目等各种类型的工作。

因此,我拥有丰富的编程经验,并为许多不同类型的公司服务过。这些公司业务各异,我做过Web开发、桌面开发,现在在做移动开发。自从第一款移动应用问世以来,我已经做了大约15、16年的移动开发,还包括后端服务、数据库、API端点等。

在这个过程中,我也使用过多种编程语言。

关于数据清洗或数据准备工作,你会进行哪些类型的任务,甚至是数据合并?

我尽可能在数据源处完成尽可能多的工作。因为通常数据源的处理速度要快得多。例如,如果我有一个来自SQL数据库的大型数据集,在SQL查询中尽可能多地完成数据修剪和合并工作,然后再交给我,这样会更快、性能更好。而不是让我获取海量数据,然后手动解析和合并。

首先,我一开始就会得到远超所需的数据量。其次,这些数据库的性能远比我进行后处理要高,特别是因为后处理需要占用更多内存,因为我必须在处理过程中保持状态。

不过,有一点我们必须小心,那就是无论数据来自数据库还是API,如果你不是提供API或数据库数据的人,你根本不知道会得到什么。所以你必须格外谨慎。

你可能会说:“嘿,我刚看了这个数据库,发现每个人都有名字。”但你不知道的是,在数据库往下10万行,有一批人的名字是缺失的,它们就是NULL。这可能会完全搞垮你的程序,因为你没有预料到会有空值。

因此,除非数据提供者与我们签订了硬性合同,保证“我们保证返回的任何个人记录都不会有空的名字字段”,并且我们对此达成一致,否则我们通常会对获取的数据持过度谨慎的态度。如果我们没有得到这种确认和合同,那么我们通常会认为,任何时候数据都可能是NULL

所以你必须提前思考数据中可能存在的问题,要么确保它们不会发生,要么构建一些机制使其不会导致程序崩溃。但当你进入现实世界,处理数十万、数百万乃至数十亿行数据时,我的信条是:可能发生的事情,就一定会发生。你应该为此做好计划。

是的,你只需要添加一点点额外的代码来处理这些情况,但这最终会拯救你。所以,要么在源头进行批量处理,要么有时你不得不自己进行后处理,因为你还需要处理空值或意外情况,但这应保持在最低限度。这对于高性能应用程序和/或处理海量数据(尤其是在分析和数据分析等领域)将大有裨益。

正如Jeff所指出的,尽可能在靠近数据源的地方进行计算是合理的。这意味着,如果你能用SQL查询完成计算,那么通常最好这样做,因为这样会更快。

然而,在初学阶段,只要读取的数据量没有超过你计算机的处理能力,不必过分纠结是用SQL还是用Python来筛选和汇总数据。

同样,正如Jeff指出的,你应该预料到数据中会存在一些错误,即使它来自关系数据库中的结构化表。因此,即使从数据库读取数据,你已掌握的用Python组装数据的技能仍然会派上用场。


现在你已经更好地理解了为什么我们需要SQL和Python,接下来让我们通过实践来练习如何将这两种语言结合使用。

115:在Python中连接和断开数据库 📊

在本节课中,我们将学习如何在Python环境中连接和断开数据库。我们将重点介绍连接SQLite数据库的两种方法,并简要说明连接其他类型的关系型数据库管理系统(如MySQL或Microsoft SQL Server)时的差异。


准备工作

在开始编写代码之前,需要确保数据库文件与你的Python脚本位于同一文件夹中。例如,我们有一个名为 techca.db 的SQLite数据库文件。

连接SQLite数据库

首先,我们需要导入必要的模块。我们将使用 pandas 来处理数据,并使用 sqlite3 模块来连接数据库。

import pandas as pd
import sqlite3

sqlite3 是Python标准库的一部分,通常无需额外安装。

方法一:手动管理连接

上一节我们介绍了需要导入的模块,本节中我们来看看如何手动建立和关闭数据库连接。

使用 sqlite3.connect() 函数连接数据库,并将连接对象存储在一个变量中。

con = sqlite3.connect('techca.db')

运行这行代码后,连接就已建立,尽管界面上可能没有明显提示。

连接建立后,我们可以使用 pandasread_sql() 函数来执行查询。这个函数非常方便,因为它能自动将查询结果转换为 DataFrame

以下是该函数的参数示例:

df = pd.read_sql("SELECT * FROM parent LIMIT 5", con)

在这个查询中,我们从 parent 表中选择所有列,并限制返回前5行。重要的是,必须将连接对象 con 作为参数传递给函数。

执行后,结果会以 DataFrame 的形式返回。

我们可以执行另一个查询,例如读取 sites 表的前5行:

df_sites = pd.read_sql("SELECT * FROM sites LIMIT 5", con)

完成所有查询后,必须手动关闭数据库连接以释放资源。忘记关闭连接可能会导致问题。

con.close()

关闭连接后,如果尝试再次使用该连接对象执行查询,将会收到错误提示,指出无法在已关闭的数据库上操作。

方法二:使用上下文管理器自动管理连接

如果你只需要执行一个查询,推荐使用上下文管理器(with 语句)。这种方法可以自动处理连接的打开和关闭。

以下是使用上下文管理器的代码结构:

with sqlite3.connect('techca.db') as con:
    df = pd.read_sql("SELECT * FROM parent LIMIT 5", con)

在这段代码中:

  • with sqlite3.connect('techca.db') as con: 这一行建立了数据库连接,并将连接对象命名为 con
  • 缩进块内的代码(即查询语句)在连接有效期内执行。
  • 当代码执行离开缩进块时,连接会自动关闭,无需手动调用 close() 方法。

你可以根据需求选择上述任一方法。如果计划执行多个查询进行数据探索,手动管理连接可能更灵活。如果只是执行单一查询,使用上下文管理器是更简洁和安全的选择。

连接其他类型的数据库

在实际生产环境中,数据库可能不是SQLite,而是MySQL、PostgreSQL或Microsoft SQL Server等,并且通常位于远程服务器上。

连接这些数据库的基本步骤是相似的,但具体代码会有所不同。

以下是连接不同类型数据库时的主要区别:

  1. 识别数据库类型:首先确定你要连接的关系型数据库管理系统(RDBMS)的类型。
  2. 安装对应的Python驱动库:你需要安装能够与目标数据库交互的特定Python模块。
    • 例如,连接MySQL可能需要安装 mysql-connector-python 库。
    • 连接Microsoft SQL Server可能需要安装 pyodbcpymssql 库。
  3. 修改连接参数:连接字符串需要包含更多信息,通常包括:
    • 数据库所在的服务器地址(URL或主机名)
    • 数据库名称
    • 用户名和密码

以下是连接MySQL数据库的示例代码框架:

# 假设已安装并导入 mysql.connector
import mysql.connector

con = mysql.connector.connect(
    host="服务器地址",
    user="用户名",
    password="密码",
    database="数据库名"
)

对于Microsoft SQL Server,代码框架可能类似,但使用的库和关键字参数会不同。无论使用哪种数据库,在成功建立连接后,使用 pandas.read_sql() 执行查询的代码都是相同的。


总结

本节课中我们一起学习了在Python中连接和断开数据库的核心方法。

我们重点探讨了两种连接SQLite数据库的方式:手动管理连接和使用上下文管理器自动管理。我们也了解到,连接其他数据库(如MySQL、PostgreSQL)的主要区别在于需要安装特定的驱动库,并在连接字符串中提供服务器地址、用户名和密码等信息。

关键步骤始终是:建立连接 -> 执行查询 -> 关闭连接。上下文管理器(with 语句)能帮助我们更优雅地处理最后一步。

通过不断练习,你将能更熟练地从Python环境中连接和操作各种关系型数据库。

116:Python 中的基本 SQL 工作流程 🗺️

在本节课中,我们将学习一个简单的工作流程,该流程展示了在 Python 环境中访问 SQL 数据库数据的价值。我们将遵循 FACT 框架的四个步骤,完成从提出问题到可视化结果的完整分析过程。


第一步:提出问题(Frame)

上一节我们介绍了 FACT 框架,本节中我们来看看如何具体应用。首先,我们需要明确分析的问题。

我的问题是:地址中包含“Main”一词的门店位于何处?

换句话说,我希望在地图上可视化这些门店的位置。


第二步:收集数据(Assemble)

既然数据存储在 SQL 数据库中,我需要连接到数据库并将数据导入当前环境。

以下是实现此步骤的代码:

import pandas as pd
import sqlite3

![](https://github.com/OpenDocCN/dsai-notes-pt2-zh/raw/master/docs/uiuc-biz-anls/img/efd85cfd74b6025b87de8f64a23ac404_6.png)

![](https://github.com/OpenDocCN/dsai-notes-pt2-zh/raw/master/docs/uiuc-biz-anls/img/efd85cfd74b6025b87de8f64a23ac404_7.png)

query = """
SELECT site_name, address, city, latitude, longitude
FROM site
WHERE address LIKE '%Main%'
ORDER BY city
"""

关于这段查询代码,有几点需要说明:

  • 这是一个较长的查询语句。为了便于阅读,我将其分成了多行。
  • 我使用了三组引号(""")来包裹字符串,这允许我在代码中跨多行书写,而 Python 会将其视为同一个字符串。
  • 查询语句保存为变量 query
  • 查询逻辑是:从 site 表中选择特定的列(site_name, address, city, latitude, longitude),然后筛选出 address 列中包含“Main”字符串的记录,最后按 city 列进行字母排序。

现在,我无需打开终端或 SQL 集成开发环境(如 DBeaver),可以直接在 Python 中执行查询。

with sqlite3.connect(‘teched.db’) as con:
    df = pd.read_sql(query, con)

这段代码使用上下文管理器连接到本地的 teched.db 数据库文件。如果连接的是 MySQL 或 PostgreSQL 数据库,连接方式会略有不同。

然后,我使用 pandas 的 read_sql 函数,传入之前定义的查询变量 query 和连接对象 con。这个函数非常强大,它一次性完成了连接数据库、读取数据并将其转换为 pandas DataFrame 的多个步骤,我们将结果保存为变量 df

代码块结束后(没有缩进),上下文管理器会自动关闭数据库连接。

接着,我使用 pandas 的函数来查看数据的基本信息和前几行。

df.info()
df.head()

运行单元格后,可以看到数据有 32 行,并能初步了解数据的结构。


第三步:计算分析(Calculate)

现在,我可以利用 pandas 和其他库的更多功能来计算和展示结果。

具体来说,我将使用 plotly Express 模块中的函数来创建地图。首先需要安装这个库:pip install plotly-express。安装后,即可导入并使用。

import plotly.express as px

fig = px.scatter_geo(df,
                     lat=‘latitude’,
                     lon=‘longitude’,
                     projection=‘natural earth’,
                     title=‘Stores with “Main” in Address’)
fig.update_traces(hovertemplate=‘<b>%{text}</b>’,
                  text=df[‘address’])
fig.show()

我使用了 scatter_geo 函数来创建一个散点图,并将点绘制在地图上。需要指定的参数包括:

  • df:数据来源。
  • latlon:经纬度对应的列名。
  • projection:地图投影类型,这里使用“natural earth”。
  • title:图表标题。
  • 我还通过 update_traces 添加了悬停信息,使地图具有交互性。当鼠标悬停在点上时,会显示该点的地址,以便验证所有观察点地址中都包含“Main”。

运行这两段代码后,会生成一个交互式地图。


第四步:传达见解(Tell)

最后一步是向他人传达分析得出的见解。虽然本次分析没有重大发现,但可以总结出一些观察。

例如,我可以这样描述:共有 32 家门店的地址中包含“Main”一词,它们都大致位于美国中西部地区。


总结

本节课中我们一起学习了一个完整的 Python 与 SQL 结合的工作流程。我们从提出问题开始,通过在 Python 中编写 SQL 查询来收集数据,利用 pandas 进行数据处理,并借助 plotly 进行结果可视化,最后总结并传达发现。

这个流程的美妙之处在于,我们无需切换不同的集成开发环境或使用终端,所有编码和分析都可以在一个统一的 Python 环境中完成。这使得分析过程易于复制和调整,充分体现了在 Python 环境中操作 SQL 数据库的价值。

117:Python中的SQLite探索性查询 🔍

在本节课中,我们将学习如何使用SQL查询来探索SQLite数据库,其功能类似于在Python中使用Pandas的info()head()方法来探索数据框。这对于处理大型数据库至关重要,因为你通常无法将所有数据下载到本地进行分析。我们将学习如何通过SQL查询来识别和筛选需要的数据。

建立数据库连接

首先,我们需要导入必要的模块并建立与数据库的连接。我们将使用pandassqlite3模块。

import pandas as pd
import sqlite3

![](https://github.com/OpenDocCN/dsai-notes-pt2-zh/raw/master/docs/uiuc-biz-anls/img/1263b41adf93f46f9494837d82682e51_4.png)

# 建立与数据库的连接
conn = sqlite3.connect('techca.db')

探索数据库结构

上一节我们建立了数据库连接,本节中我们来看看如何探索数据库中有哪些表。

了解数据库中的表及其相互关系是第一步。虽然最好有实体关系图,但在Python环境中,我们可以通过查询来获取这些信息。

以下是获取数据库中所有表信息的查询:

# 查询SQLite系统表以获取所有用户表的信息
tables_df = pd.read_sql("SELECT * FROM sqlite_master WHERE type='table'", conn)
tables_df.set_index('name', inplace=True)
print(tables_df)

执行此查询后,你将看到一个包含表名和创建语句的数据框,这有助于你了解数据库的结构。

查看特定表的列信息

在了解了有哪些表之后,我们通常需要查看某个具体表的结构,例如列名、数据类型和主键/外键信息。

让我们以transactions表为例,查看其模式(schema)。

# 获取transactions表的创建语句,其中包含列信息
table_schema = tables_df.loc['transactions', 'sql']
print(table_schema)

这段代码会打印出创建transactions表的SQL命令,你可以从中看到所有列的定义、数据类型以及外键约束。

获取表的行数

在分析数据之前,了解数据量的大小非常重要。我们可以使用SQL的COUNT(*)函数来获取表中的总行数。

# 查询transactions表的总行数
row_count_df = pd.read_sql("SELECT COUNT(*) FROM transactions", conn)
print(f"表中共有 {row_count_df.iloc[0,0]} 行数据。")

预览表数据

类似于Pandas的head()方法,我们可以使用SQL的LIMIT子句来预览表的前几行数据,而无需加载整个表。

# 查询transactions表的前5行数据
preview_df = pd.read_sql("SELECT * FROM transactions LIMIT 5", conn)
print(preview_df)

检查缺失值

数据清洗是分析的关键步骤。在SQL中,我们可以查询特定列中缺失值(NULL)的数量。需要注意的是,有时缺失值可能以特定字符串(如‘NAN’)存储。

以下是检查customer_id列中缺失值的示例:

# 查询customer_id列为NULL的行数(标准缺失值)
null_count_df = pd.read_sql("SELECT COUNT(*) FROM transactions WHERE customer_id IS NULL", conn)
print(f"标准NULL缺失值数量: {null_count_df.iloc[0,0]}")

# 查询customer_id列为特定字符串‘NAN’的行数(非标准缺失值)
nan_count_df = pd.read_sql("SELECT COUNT(*) FROM transactions WHERE customer_id = 'NAN'", conn)
print(f"字符串‘NAN’的数量: {nan_count_df.iloc[0,0]}")

根据探索结果读取数据

经过上述探索,我们可能决定只读取满足特定条件的数据,以节省内存并提高分析效率。

例如,我们只想读取revenue大于2的交易记录:

# 构建查询语句,筛选revenue > 2的数据
query = "SELECT * FROM transactions WHERE revenue > 2"

# 执行查询并将结果读入Pandas数据框
filtered_df = pd.read_sql(query, conn)
print(filtered_df.info())

读取所需数据后,记得关闭数据库连接。

# 关闭数据库连接
conn.close()

总结

本节课中我们一起学习了如何在Python环境中使用SQL查询来探索SQLite数据库。我们掌握了以下技能:

  1. 连接数据库。
  2. 列出所有表。
  3. 查看特定表的详细结构。
  4. 获取表的行数。
  5. 预览表的前几行数据。
  6. 检查数据中的缺失值。
  7. 根据探索结果,编写筛选查询并读取所需数据到Pandas中进行后续分析。

这种方法使你能够有效地探索大型数据库,而无需将全部数据加载到内存中,从而优化了工作流程和资源使用。

118:Python中的SQL描述性查询 📊

在本节课中,我们将学习如何使用SQL查询来探索数据,特别是通过描述性统计来汇总数据框(DataFrame)中各个列的关键信息。我们将重点介绍如何在不将整个数据库表读入Python环境的情况下,直接使用SQL查询来获取数据的概览,例如总和、最小值、平均值、最大值以及唯一值的数量。

连接数据库与查看结构

首先,我们需要连接到SQLite数据库并查看其结构。以下是连接数据库和查看表结构的步骤。

import pandas as pd
import sqlite3

# 建立与数据库的连接
conn = sqlite3.connect('techca.db')

接下来,我们获取数据库的模式(schema),以了解其中包含哪些表。

# 获取数据库模式
query_schema = "SELECT name FROM sqlite_master WHERE type='table';"
tables = pd.read_sql(query_schema, conn)
print(tables)

假设我们想要探索 transactions 表,我们可以进一步查看该表的具体结构。

# 获取 transactions 表的模式
query_table_schema = "PRAGMA table_info(transactions);"
table_info = pd.read_sql(query_table_schema, conn)
print(table_info)

为了对数据有一个初步印象,我们先查看该表的前几行数据。

# 查看 transactions 表的前5行
query_first_rows = "SELECT * FROM transactions LIMIT 5;"
first_rows = pd.read_sql(query_first_rows, conn)
print(first_rows)

对数值列进行描述性统计

上一节我们查看了数据表的结构和样例。本节中,我们来看看如何对数值列(如 units 列)进行基本的描述性统计。

以下是计算 units 列总和的SQL查询示例。

# 计算 units 列的总和
query_total_units = """
SELECT SUM(units) AS total_units
FROM transactions;
"""
total_units = pd.read_sql(query_total_units, conn)
print(total_units)

除了总和,我们通常还关心数据的最小值、平均值和最大值。我们可以通过一个查询同时获取这些信息。

# 计算 units 列的总和、最小值、平均值和最大值
query_descriptive_stats = """
SELECT 
    SUM(units) AS total_units,
    MIN(units) AS min_units,
    AVG(units) AS mean_units,
    MAX(units) AS max_units
FROM transactions;
"""
descriptive_stats = pd.read_sql(query_descriptive_stats, conn)
print(descriptive_stats)

这些函数同样适用于日期列。例如,我们可以找出 unformatted_date 列的时间范围。

# 找出日期列的最小值和最大值
query_date_range = """
SELECT 
    MIN(unformatted_date) AS earliest_date,
    MAX(unformatted_date) AS latest_date
FROM transactions;
"""
date_range = pd.read_sql(query_date_range, conn)
print(date_range)

对分类列进行探索性分析

在分析了数值列之后,我们转向分类列。对于分类数据,了解其唯一值及其数量至关重要。

首先,我们可以列出 product_id 列中的所有不重复值。

# 获取所有不重复的 product_id
query_distinct_ids = """
SELECT DISTINCT product_id
FROM transactions;
"""
distinct_ids = pd.read_sql(query_distinct_ids, conn)
print(distinct_ids.head())  # 仅显示前几行

然而,有时我们只关心唯一值的数量,而不是具体是哪些值。这时可以使用 COUNTDISTINCT 的组合。

# 计算不重复 product_id 的数量
query_count_distinct = """
SELECT COUNT(DISTINCT product_id) AS unique_product_count
FROM transactions;
"""
unique_count = pd.read_sql(query_count_distinct, conn)
print(unique_count)

关闭数据库连接

完成所有查询后,记得关闭数据库连接以释放资源。

# 关闭数据库连接
conn.close()

总结

本节课中,我们一起学习了如何在Python环境中使用SQL查询进行描述性统计分析。我们掌握了如何连接数据库、查看表结构,并对数值列计算总和、最小值、平均值和最大值,以及对分类列找出唯一值及其数量。这些技能对于在数据量过大无法全部读入内存时,进行有效的数据探索和预处理非常有帮助。通过先使用SQL查询了解数据概况,我们可以更有针对性地决定将哪些数据加载到Python中进行后续分析。

119:Python中的SQL连接查询 🐍

在本节课中,我们将学习如何在Python环境中执行SQL连接查询。关系型数据库的主要优势之一是各个表之间相互关联。这意味着你可以执行SQL查询,将来自不同表的数据连接起来,合并成一个单一的表,然后导出到你正在使用的任何环境中。

我们将演示如何在Python环境中执行连接查询,以创建SQL数据库中原本不存在的组合表。

连接数据库与查看结构

首先,我们需要导入必要的模块并连接到数据库。

import pandas as pd
import sqlite3

![](https://github.com/OpenDocCN/dsai-notes-pt2-zh/raw/master/docs/uiuc-biz-anls/img/db21855efa296f3994da307972c01a64_2.png)

# 创建数据库连接
conn = sqlite3.connect('techca.db')

为了了解数据库中有哪些表,我们可以查看其模式。

# 获取数据库模式
query_schema = "SELECT name FROM sqlite_master WHERE type='table';"
tables = pd.read_sql_query(query_schema, conn)
print(tables)

执行后,我们可以看到数据库中有六个表。

接下来,让我们查看transactions表的详细信息,以了解其结构。

# 查看transactions表信息
query_trans_info = "PRAGMA table_info(transactions);"
trans_info = pd.read_sql_query(query_trans_info, conn)
print(trans_info)

从结果中,我们可以看到该表包含许多列,其中一些列是外键,关联到其他表。为了更好地理解这些关系,查看实体关系图会很有帮助。

从图中可以看到:

  • product_id列连接到products表。
  • customer_id列连接到customer表。
  • site_id列连接到sites表。

此外,通过product_id连接到products表后,还可以进一步关联到特定的类别和父类。

为了进行后续的连接操作,我们也查看一下sites表的结构。

# 查看sites表信息
query_sites_info = "PRAGMA table_info(sites);"
sites_info = pd.read_sql_query(query_sites_info, conn)
print(sites_info)

现在,我们已经了解了表的结构。我们的目标是从transactions表和sites表中读取数据,并创建一个单一的数据框。

执行左连接查询

我们将使用左连接。SQL中还有内连接和外连接,但左连接是最常用的连接类型之一。

左连接的基本逻辑是:以左表(基础表)的所有行为基础,将右表中匹配的行连接过来。如果右表中没有匹配的行,则结果中对应字段为NULL。

以下是执行左连接的SQL查询结构:

SELECT
    T.revenue,
    T.cost,
    T.units,
    S.site_name
FROM transactions AS T
LEFT JOIN sites AS S
ON T.site_id = S.site_id;

让我们分析一下这个查询:

  • SELECT:指定要从结果表中获取的列。
  • T.revenue, T.cost, T.units:这些列来自transactions表(我们为其指定了别名T)。
  • S.site_name:这一列来自sites表(别名S)。
  • FROM transactions AS T:指定左表(基础表)是transactions,并赋予其别名T
  • LEFT JOIN sites AS S:指定要左连接的表是sites,并赋予其别名S
  • ON T.site_id = S.site_id:指定连接条件,即两个表通过site_id列进行匹配。

现在,我们在Python中执行这个查询。

# 执行左连接查询
query_left_join = """
SELECT
    T.revenue,
    T.cost,
    T.units,
    S.site_name
FROM transactions AS T
LEFT JOIN sites AS S
ON T.site_id = S.site_id;
"""
joined_df = pd.read_sql_query(query_left_join, conn)
print(joined_df.head())
print(f"数据框行数: {len(joined_df)}")

执行后,我们得到了一个包含150,000行的数据框。它保留了transactions表中的所有行,并且新增了一个原本不存在的site_name列。对于每一行,查询都根据site_idsites表中找到对应的site_name,并将其添加为新列。

为连接查询添加筛选和排序

连接查询的结果可以像普通查询一样进行筛选和排序。我们可以在WHERE子句中添加条件,在ORDER BY子句中指定排序规则。

例如,我们只想保留站点名为“433 Bay Minet”的行,并按revenue列降序排列。

# 带筛选和排序的左连接查询
query_filter_sort = """
SELECT
    T.revenue,
    T.cost,
    T.units,
    S.site_name
FROM transactions AS T
LEFT JOIN sites AS S
ON T.site_id = S.site_id
WHERE S.site_name = '433 Bay Minet'
ORDER BY T.revenue DESC;
"""
filtered_df = pd.read_sql_query(query_filter_sort, conn)
print(filtered_df.head())
print(f"筛选后行数: {len(filtered_df)}")

现在,结果中只包含8,451行“433 Bay Minet”站点的数据,并且按收入从高到低排列。

如果想按多个列排序,例如先按revenue降序,再按cost升序,可以这样写:

ORDER BY T.revenue DESC, T.cost ASC;

如果revenue值相同,则会进一步按cost排序。

执行多表连接

一个查询中可以执行多个连接操作。例如,我们除了连接sites表获取站点名,还想连接products表获取产品名。

# 执行多表左连接查询
query_multi_join = """
SELECT
    T.revenue,
    T.cost,
    T.units,
    S.site_name,
    P.product_name
FROM transactions AS T
LEFT JOIN sites AS S ON T.site_id = S.site_id
LEFT JOIN products AS P ON T.product_id = P.product_id;
"""
multi_joined_df = pd.read_sql_query(query_multi_join, conn)
print(multi_joined_df.head())

这个查询首先将transactions表与sites表进行左连接,然后再将结果与products表进行左连接。最终的数据框包含了来自三个表的信息:交易数据、站点名称和产品名称。

关闭数据库连接

完成所有操作后,记得关闭数据库连接。

# 关闭连接
conn.close()

总结

本节课中,我们一起学习了在Python中执行SQL连接查询的方法。

  • 我们首先连接了数据库并查看了表结构,理解了表之间的关系。
  • 然后,我们重点学习了左连接,它能够以左表为基础,合并右表中的匹配信息。
  • 我们探讨了如何在连接查询的结果上进行数据筛选排序,以获取更精确的数据视图。
  • 最后,我们演示了如何在单个查询中执行多表连接,从而一次性整合多个来源的数据。

连接查询是与SQL数据库交互的核心技能之一。虽然本节课展示的是一些简单示例,但如果你计划更多地使用SQL数据库,深入探索各种连接查询(如内连接、全外连接)以及更复杂的查询条件,将非常有价值。

120:结论与回顾

在本节课中,我们将对第三模块的核心内容进行总结,回顾关系型数据库与SQL的基础知识,并展望后续的学习路径。

正如海洋蕴藏着丰富的资源,数据库也存储着大量可用于商业目的的数据资源。关系型数据库是企业用来存储大量结构化数据的最常用技术之一。

关系型数据库与SQL

上一节我们提到了数据资源的重要性,本节中我们来看看访问这些资源的工具。

关系型数据库由一个或多个相互关联的表组成,并以其可靠性、安全性和处理大量事务的能力而久经考验。正如我们需要船只或冲浪板来航行海洋并获取资源,我们也需要一个工具来导航关系型数据库并获取其中的数据资源。

SQL(结构化查询语言)正是这个工具。它是用于与数据库交互的语言,因其由常用词汇构成而易于理解。我们的重点在于介绍用于从数据库表中检索数据的查询关键词。

以下是本模块介绍的一些基础SQL命令:

  • SELECT:用于指定你想要查看的列。
    • 示例SELECT name, email FROM customers;
  • FROM:用于指明数据来源的表。
    • 示例SELECT * FROM orders;
  • WHERE:用于限制返回的数据,例如筛选出特定条件的记录。
    • 示例SELECT * FROM customers WHERE state = 'Illinois';
  • JOIN:通过匹配指定列的值,将来自多个表的数据组合起来,这一点非常重要。
    • 示例SELECT orders.id, customers.name FROM orders JOIN customers ON orders.customer_id = customers.id;

SQL与Python的协同

重要的是,我们希望你现在能更好地理解结合使用SQL与Python的益处,以及将这两种语言结合使用的一些技术细节。这只是一个入门介绍,但希望你现已打下坚实的基础,可以在此基础上轻松构建。

当你面对涉及SQL的实际项目时,你将知道下一步该做什么,从而持续提升你的SQL技能。此外,熟能生巧,练习得越多,使用起来就越得心应手。

所以,请持续练习,你必将更流利地掌握这门至关重要的数据语言。


本节课中我们一起学习了关系型数据库的核心概念以及SQL的基础查询命令。我们了解到,数据库如同数据的海洋,而SQL是我们获取其中价值的航船。通过掌握SELECTFROMWHEREJOIN等命令,你已经具备了从数据库中提取和组合信息的基本能力。记住,将SQL与Python等工具结合使用,能极大提升商业分析的效率。不断实践是精通这门技能的关键。

商业分析:P121:第四模块简介 🚀

在本节课中,我们将学习第四模块的核心内容:应用程序编程接口。我们将了解API是什么、它的用途、优势与局限,以及如何在商业分析中应用它来获取数据。


在FACT框架中,我们提出问题、收集数据、计算结果并传达给他人。本模块将探讨应用程序编程接口,即API。

API是一类用于连接第三方数据的工具。这类似于餐厅的服务员,将顾客与厨房工作人员连接起来,就像我身后南加州实验室里的那些餐厅一样。

为了继续介绍API,我们来听听Motive Health公司执行副总裁Josh Dabbin的分享。我有机会与Josh交谈,我们讨论了他们如何在健康保险行业使用API。

通过聆听我与Josh访谈的部分内容,你将更深入地了解API的目的、类型、优势以及一些劣势。

我是Josh Doubbin,Motive Health公司的技术执行副总裁。API代表应用程序编程接口,我们使用的API通常是基于网络的,这意味着我们使用REST或其他基于网络的协议。是的,我们在Python中使用requests库以及许多其他类似库,这些库有助于简化调用API以及安全调用API的操作。我们公司与许多其他公司之间存在着大量的相互通信。API是我们获取新鲜数据的关键,并帮助我们与这些不同的公司进行交互。

一个具体的例子是,我们有一个投资平台,实时交易数据对于与该平台交互至关重要。我们利用多组API来获取这些实时数据,以便我们的客户在尝试投资时能够做出明智的决策。

API的优势确实在于数据的实时性。通常对于数据库,你有一个固定的数据集,如果需要新数据,你必须通过其他方式获取。另一方面,API的劣势在于,你通过API推送和拉取数据的能力,无法像数据库那样处理大量数据。是的,通过API推送和拉取大量数据或进行复杂分析要困难得多。是的,已经有像GraphQL这样的尝试来帮助解决这个问题,但它们尚未像SQL那样被广泛采用,因此SQL仍然是主要工具。

你可能已经发现,API是一个广义的术语。Josh提到,在Motive Health,他们使用特定类别的API来发送和请求数据。具体来说,他提到了遵循REST协议的基于网络的API。

这种特定类别的API是来回发送数据的最常见类型,因此也将是本模块的重点。我们将更详细地解释它,并将其与其他类型的API进行比较。

Josh还提到,他们使用requests库在Python中实现API。在花时间进一步探索API、它们如何用于收集数据以及API的关键要素之后,我们将演示你如何也可以使用Python的requests模块来实现API,以从第三方检索数据。

Josh提到的另一点是,相对于SQL数据库,API在可以来回传递的数据量方面存在限制。因此,使用API的一个重要方面是,如果数据量大于单个API请求可以发送的量,就需要能够发出多个请求。

现在,与其手动发出许多API请求,或者复制粘贴相同的代码块来发出请求,在本模块中,我们将学习如何使用Python中的循环,以编程方式发出多个API请求。

我很期待你学习API,因为它们将使你能够访问海量数据,你可以收集这些数据,使你的分析更具信息量。


总结

本节课中,我们一起学习了第四模块的简介。我们了解到API是连接和获取第三方数据的关键工具,尤其基于网络的REST API在商业分析中应用广泛。我们通过实例看到了API在提供实时数据方面的优势,也认识到其在处理大数据量时的局限性。最后,我们明确了本模块将重点学习如何使用Python的requests库和循环结构来高效地通过API获取数据。

122:什么是API 🚀

在本节课中,我们将聚焦于定义应用程序编程接口(API),并探讨其重要性。

概述

我们将通过一个餐厅的类比来理解API的核心概念,然后直接探讨其定义、作用,并解释为何API对于软件开发和数据分析至关重要。

餐厅类比:理解API的角色

为了清晰地解释API,我们使用一个餐厅的类比。想象一位顾客走进一家餐厅,他想要获得食物,但自己不会做或没有时间做。

以下是点餐过程的分解:

  • 顾客:这类似于一个计算机应用程序,也称为客户端
  • 菜单:这代表了应用程序可以请求的服务或数据的列表。
  • 点单:顾客向服务员下单,这类似于应用程序发出的API请求
  • 服务员:服务员接收订单,确保订单被正确处理并最终将食物送回给顾客。这个角色就是API本身。
  • 厨房:这代表提供实际服务或数据的后端系统。

如果没有服务员(API),顾客(应用程序)就需要直接与厨房(后端系统)沟通,必须详细说明披萨的每一个制作细节。服务员(API)简化了这个交互过程,确保请求被有序、公平地处理,并返回正确的结果。

直接定义API

有了这个类比,我们可以更直接地讨论API。API是一套旨在简化编程应用程序之间流程使用和数据交换的工具与规则。

根据这个定义,您很可能已经使用过API。例如,如果您曾经使用过pandas模块中的函数,那么您就已经使用了API。pandas函数允许其他应用程序通过简单地调用函数来访问数据处理能力,而无需了解其背后的实现细节。

API在代码中的体现

让我们看一个更具体的例子。假设您正在开发一个数据分析应用程序,它需要读取数据并以pandas DataFrame的形式显示前五行。

使用pandas的API,您的应用程序只需几行简单的代码即可完成此任务:

import pandas as pd

# 使用pandas的API读取CSV文件
df = pd.read_csv('data.csv')

# 使用pandas的API显示前5行数据
print(df.head())

您的应用程序无需关心连接CSV文件的许多步骤,也无需了解DataFrame在内存中的底层表示。它只需要知道如何通过引用正确的函数来访问这些流程。

因此,pandas API就是用于访问众多流程的函数集合。它使您无需重新编写执行这些流程的底层代码(这些代码可能很复杂,甚至是用另一种语言编写的)。此外,底层流程可能会发生变化(例如为了提高效率),但函数名称可以保持不变。这使得改进可以在不要求应用程序改变其工作方式的情况下进行。

为什么API如此重要?

现在您对API有了更好的理解,让我们简要探讨一下为什么API对软件(尤其是数据分析任务)如此重要。

总的来说,API对软件的重要性体现在两个方面:

  1. 简化代码:API将复杂功能封装成简单的调用。
  2. 聚焦产品:开发者可以利用现有资源,更专注于产品本身的功能与创新。

具体到数据分析领域,API使我们能够专注于创建易于阅读的数据分析工作流。我们可以通过相对易读的Python脚本,来整合所有数据、计算结果并进行展示。我们无需了解这些流程是如何完成的细节,从而能更专注于发现洞察和做出决策。

例如,如果您需要执行一项不熟悉的任务(如图像识别),您无需从头开始用数千行代码创建自己的算法。相反,您可以简单地安装正确的Python模块(如Scikit-learn或PyTorch),它们提供的API让您通过一个简单的函数就能使用成熟的算法。

API不仅可以用于访问流程,还可以用于访问远程数据。例如,如果您需要评估天气模式的影响,您可以使用API从现有的数据仓库请求天气数据,而无需自己建立气象站并收集数据。

总结

在本节课中,我们一起学习了API的核心概念。简而言之,API是使用代码创建任何类型应用程序的重要组成部分。正如餐厅的服务员是顾客与厨房之间必不可少的中介一样,API简化了软件应用程序之间的交互。它将流程打包成一组可以轻松使用的函数。在您继续数据分析之旅的过程中,您将了解更多不同类型的API,以及如何利用它们轻松访问和处理数据。

123:组装数据的Web API 🧩

在本节课中,我们将要学习应用程序编程接口(API)的基本概念,特别是用于组装数据的Web API。我们将了解API的不同分类方式,并重点介绍一种最常用的架构——REST。


“餐厅”这个词涵盖了多种类型的就餐场所。在光谱的一端是高级餐厅,就像我身后这个非常繁忙的南海岸广场里的那些。它们提供由才华横溢的厨师和服务员带来的无可挑剔的服务。在光谱的另一端是快餐店,那里的食物大多是预先准备好的,你可能几乎不需要直接与他人互动。

因为餐厅的种类如此繁多,所以在与他人交流时,明确你心中所想的具体餐厅类别通常很重要。

同样,“应用程序编程接口”或“API”这个词也可以指代许多事物。广义上说,API是简化软件应用程序之间交互方式的工具。在本课中,我们希望重点描述那些常用于组装数据的API。具体来说,我们将向您介绍使用REST架构的、公开可用的Web API。


上一节我们提到了“REST架构”等技术术语。本节中,我们将简要介绍三种对API进行分类的方法,以帮助您更好地理解这些术语的含义以及API的整体格局。

让我们从讨论API的不同分类方式开始。

以下是按用途对API进行分类的方法:

  • 库API:其目的是提供一组函数,用于访问特定编程库(如pandas)提供的功能。
  • 操作系统API:其目的是提供一组命令,用于与计算机操作系统(如更改目录)进行交互。
  • Web API:其目的是使软件应用程序能够通过互联网相互交互。Web API之所以重要,是因为它们允许以编程方式在远程应用程序之间交换数据。

例如,假设您想获取一家在美国证券交易所公开交易的公司的财务数据。Web API允许您使用代码访问这些数据,并将其直接导入您的编码环境。您可以从网站手动下载数据,但如果您想用Python分析数据,那么使用Web API通常比手动下载更高效。因为它需要更少的手动导航,更不容易出错,更容易复制,并且该过程可以可靠地扩展到访问其他公司的数据。


现在,在Web API这一类别中,有不同的架构结构,每种都适用于不同的目的。

以下是按架构对Web API进行分类的方法:

  • REST:这是迄今为止最流行的Web API架构,是“表述性状态转移”的缩写。REST是一种成熟的架构,支持良好,相对易于理解,并且对许多应用来说效率很高。它有点像一种通用架构。这种架构通常用于为数据分析应用程序交换数据。使用REST架构,数据请求本质上是通过创建一个看起来像网站地址的统一资源定位符(URL)来发出的。服务器收到请求后,会以多种格式发回相关数据。
  • GraphQL:这是一种采用率正在增长的架构,其优点是请求可以结构化以识别精确的数据集。然而,这种精确性的缺点是,当您请求更具体的数据集时,请求可能会变得更加复杂。
  • SOAP:这种Web API架构具有内置安全性。它还具有关系数据库的一些特性,例如要求每列数据具有特定的数据类型,以及要求事务要么完全完成,要么完全失败。SOAP也已经存在很长时间了,因此是一种可信赖的技术。由于这些原因,SOAP被依赖安全、可靠传输敏感数据(如金融交易)的企业使用。然而,SOAP的受欢迎程度正在下降。对于许多数据传输需求来说,它通常是大材小用。此外,请求非常冗长,因为它们需要像用于格式化网页的超文本标记语言(HTML)那样的标签结构。
  • WebSocket:这种架构非常适合实时双向信息交换,例如聊天应用程序。
  • Webhook:这种架构非常适合在事件触发时需要推送通知的情况。

现在让我们讨论第三种对API进行分类的方法,即基于目标受众。

以下是按目标受众对API进行分类的方法:

  • 开放API:也称为公共API。就像开源代码一样,公共API可供组织内外的任何人使用。例如,政府可能会创建公共Web API,以便公众更容易以编程方式访问财务数据或天气数据。
  • 内部API:也称为私有API,旨在供特定的业务合作伙伴使用。例如,公司可能使用内部API来简化库存管理系统和销售系统之间的交互。鉴于私有API通常用于共享专有数据,因此它们比公共API更安全。私有API的文档也不广泛提供。

好了,通过以上三种分类方式,我们将要重点关注的API类型是使用REST架构且公开可用的Web API。

我们之所以关注这种特定类型的API,是因为它经常用于获取远程数据。了解如何使用API组装数据可以真正提高您的分析质量,因为您可以将不同的数据集相互结合,从而拓宽寻找变量之间潜在关系的能力。此外,一旦您对这种类型的API有了一些经验,您将拥有一个基础,可以用来学习其他API,例如ChatGPT、Google和Amazon提供的那些。

总结一下,API是一个广义术语,包含许多不同的类别。软件应用程序之间所促进的通信类型强烈影响着所使用的API类型。对于许多数据组装目的,您经常会看到使用REST架构的公共Web API。了解其他类型的Web API将帮助您知道如何驾驭多样化的数据组装格局。

124:API 请求与响应的关键要素 🔑

在本节课中,我们将要学习构成API请求与响应的核心要素。通过一个餐厅点餐的类比,我们将清晰地理解客户端如何向服务器发送请求,以及服务器如何返回响应。掌握这些基础知识是进行有效API调用的前提。

上一节我们介绍了API的基本概念,本节中我们来看看构成API交互的具体“积木块”。

餐厅点餐的类比

想象一下,你走进一家餐厅(比如我遇到的南加州著名玉米卷店Yukas),阅读菜单,然后向服务员下单。你最终会收到食物。这个过程与API的交互方式非常相似:应用程序(顾客)向API(服务员)发送请求(点单),并接收响应(食物)。

顾客无需知道厨房如何制作食物,只需知道如何与服务员沟通。同样,应用程序无需知道服务器内部如何运作,只需知道如何通过API与之交互。

API请求的五大组成部分

一个API请求由五个关键部分构成。以下是每个部分的详细说明:

1. 客户端与服务器关系
这描述了请求的发起方(客户端)与接收处理方(服务器)之间的连接。就像顾客需要走进餐厅才能与服务员互动一样,客户端(可能是一段代码或一个应用)需要能够通过网络连接到远程服务器。

2. 请求头
请求头包含服务器在处理请求前需要了解的特殊指令。在餐厅场景中,这类似于顾客在点餐前告知服务员:“我叫Ron,预订了两人位”或“我需要打包”。在API请求中,常见的头信息包括授权凭证(如API密钥)和期望的数据返回格式。头信息通常以类似Python字典的格式组织。

headers = {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json"
}

3. 请求方法
方法定义了客户端希望服务器执行的具体操作。在RESTful API中,主要有四种方法:

  • GET:用于获取信息,通常用于从服务器检索数据。
  • POST:用于创建新项目,向数据仓库添加新数据。
  • PUT:用于更新特定项目。
  • DELETE:用于删除特定项目。

4. 端点
端点是一个精心构造的URL,它指明了请求的目标资源。它通常由三部分组成:

  • 基础URL:指向特定组织或服务的固定部分。
  • 资源路径:指向具体的资源,例如某个产品或用户。
  • 查询参数:用于筛选数据,例如只请求特定时间段的数据。
    一个示例端点如下:https://api.example.com/products/12345/inventory?start_date=2023-01-01

5. 请求体
请求体包含了需要发送给服务器的其他具体数据细节。在使用GET方法时,请求体通常是空的。但在使用POST、PUT或DELETE等方法修改数据源时,请求体会包含具体的修改信息,通常以JSON格式发送。

API响应的三大组成部分

当服务器处理完请求后,会返回一个响应。响应通常包含以下三个部分:

1. 状态码
状态码是一个数字,用于表示请求的处理结果。最常见的状态码包括:

  • 200:请求成功接收并完成。
  • 404:服务器收到请求,但找不到请求的资源(例如,端点错误)。
  • 5xx(如500):服务器端内部错误,导致无法完成请求。

2. 响应头
响应头提供了关于响应本身的元数据,例如响应的生成时间、内容类型等。

3. 响应体
响应体是最重要的部分,它包含了请求所获取的实际数据。数据可以有多种格式:

  • JSON:目前最常用的格式,结构类似于Python的字典或列表,使用花括号 {} 和方括号 []
  • XML:可扩展标记语言,使用标签定义数据结构。
  • CSV:逗号分隔值,一种简单的表格数据格式。
    收到数据后,通常需要将其解析并转换为更易用的格式,如Pandas的DataFrame。

总结

本节课中我们一起学习了API请求与响应的关键要素。正如餐厅顾客与服务员的交互有可预测的环节一样,基于REST架构的Web API的请求与响应也由标准的组成部分构成。我们详细探讨了请求的五个部分(客户端-服务器关系、请求头、方法、端点、请求体)以及响应的三个部分(状态码、响应头、响应体)。理解这些元素将帮助你在实际编写代码发起API请求和处理响应时,更清楚地知道每一步在做什么。

125:使用requests模块构建API请求 📡

在本节课中,我们将学习如何使用API从外部数据源获取数据,并将其导入到本地的Python环境中进行分析。我们将重点介绍如何使用Python的requests模块来构建和执行API请求。

概述

API(应用程序编程接口)允许不同的软件应用之间进行通信和数据交换。通过API,我们可以直接从数据提供商的服务器请求数据,而无需手动下载文件。本节课将演示如何构建一个API请求URL,并使用requests模块获取芝加哥市建筑许可证数据。

构建API请求URL

上一节我们介绍了API的基本概念,本节中我们来看看如何构造一个能获取特定数据的请求URL。这是使用API过程中最具挑战性的部分,原因主要有两点:

  1. 没有一种像关系型数据库的SQL那样,在所有API中通用的、标准化的语言来指明你需要什么数据。
  2. 由于缺乏标准化,URL构造非常严格,一个缺失或多余的逗号都可能导致请求失败,且不易排查。

因此,最重要的一步是仔细阅读API的使用文档。

查找并理解API文档

以下是查找和理解API文档的关键步骤:

  1. 访问数据门户:我们以芝加哥市数据门户(data.cityofchicago.org)为例,在“建筑”类别下找到“建筑许可证”数据集。
  2. 查看数据详情:该数据集包含约80.6万行数据和115个列,并提供了详细的数据字典,这对理解数据字段非常有帮助。
  3. 定位API文档:API文档的位置并不固定。在本例中,通过点击页面右上角的“操作”按钮,在下拉菜单中找到“API”选项。
  4. 阅读关键信息
    • 数据格式:默认为JSON,也可选择CSV。
    • API限制:默认每次请求最多获取1000行数据。由于总数据量远大于此,我们需要通过参数来指定获取哪一部分数据。
    • API端点:这是请求的基础URL。例如:https://data.cityofchicago.org/resource/building-permits.json
  5. 深入研究过滤和分页:点击API文档链接,查看详细说明。核心要点包括:
    • 简单过滤:在基础URL后添加问号(?),然后使用类似SQL的语法进行过滤。例如:?source=NN
    • 组合过滤:使用“与”符号(&)连接多个过滤条件。例如:?source=PR&region=Virgin Islands
    • SOQL查询:该API使用类似SQL的查询语言(SOQL)。要按日期过滤,需要使用$where参数。例如:?$where=application_start_date >= '2024-01-01T00:00:00.000'
    • 分页:使用$limit$offset参数控制获取的数据量和起始位置。$limit=1000表示获取1000行,$offset=0表示从第0行开始(即第一组1000行),$offset=1000则获取第二组1000行。
    • 排序:使用$order参数对结果进行排序。例如:$order=application_start_date DESC 表示按申请开始日期降序排列。

在Python中执行API请求

理解了如何构造URL后,我们来看看如何在Python环境中将这一切组合起来并执行。

1. 导入必要模块

首先,需要导入requests模块来执行API请求,以及pandas模块来分析数据。

import requests
import pandas as pd

注意:如果你的环境中尚未安装requests模块,需要使用包管理器(如pipconda)进行安装。

2. 构造请求URL

为了避免创建冗长且易错的字符串,我们将URL分解为多个部分进行构建。

# 基础API端点
base_url = "https://data.cityofchicago.org/resource/building-permits.json"

![](https://github.com/OpenDocCN/dsai-notes-pt2-zh/raw/master/docs/uiuc-biz-anls/img/430a2c8d7fa3b2c36f1198b571fd2e30_34.png)

# 设置获取的行数和起始点
limit_clause = "$limit=1000"
offset_clause = "$offset=0"

# 设置过滤条件:获取2024年1月1日之后的数据
modifiers = "$where=application_start_date >= '20240101'"

![](https://github.com/OpenDocCN/dsai-notes-pt2-zh/raw/master/docs/uiuc-biz-anls/img/430a2c8d7fa3b2c36f1198b571fd2e30_36.png)

# 设置排序:按申请开始日期降序排列,确保获取最新数据
order_clause = "$order=application_start_date DESC"

# 使用f-string将所有部分组合成完整的URL
# 注意:第一个参数前用?,后续参数用&连接
url = f"{base_url}?{limit_clause}&{offset_clause}&{modifiers}&{order_clause}"
print(url) # 可以打印出来检查URL是否正确

3. 发送请求并获取响应

使用requests.get()函数发送构造好的请求。

# 发送GET请求
my_response = requests.get(url)

# 检查请求状态码,200表示成功
print(f"状态码: {my_response.status_code}")

4. 处理响应数据

请求成功后,我们需要将返回的JSON数据转换为pandas DataFrame以便分析。

# 将响应的JSON内容转换为Python字典
data_json = my_response.json()

# 将字典转换为pandas DataFrame
df = pd.DataFrame(data_json)

# 查看数据框的基本信息
print(f"获取的数据行数: {len(df)}")
print(df.head())

5. 数据后续处理与分析

现在数据已经存在于Python环境中,我们可以使用pandas进行各种分析。例如,将日期列转换为正确的格式,并按周对费用进行汇总。

# 示例:将日期列转换为datetime类型,并计算每周总费用
df['application_start_date'] = pd.to_datetime(df['application_start_date'])
df['fee_paid'] = pd.to_numeric(df['fee_paid'], errors='coerce') # 将费用转换为数值类型

![](https://github.com/OpenDocCN/dsai-notes-pt2-zh/raw/master/docs/uiuc-biz-anls/img/430a2c8d7fa3b2c36f1198b571fd2e30_40.png)

# 按周分组并求和
weekly_fees = df.set_index('application_start_date').resample('W')['fee_paid'].sum()

# 绘制图表
import matplotlib.pyplot as plt
weekly_fees.plot(kind='line', title='芝加哥建筑许可证每周总费用')
plt.xlabel('日期')
plt.ylabel('总费用(美元)')
plt.show()

总结

本节课中我们一起学习了如何使用Python的requests模块构建和执行API请求。关键步骤包括:

  1. 阅读API文档:理解端点、过滤、排序和分页参数是关键。
  2. 构造请求URL:将基础URL与各种查询参数($limit$offset$where$order)正确组合。
  3. 发送请求:使用requests.get(url)函数。
  4. 处理响应:检查状态码,并将返回的JSON数据转换为pandas DataFrame。
  5. 分析数据:数据进入DataFrame后,即可利用pandas进行灵活的分析和可视化。

尽管构造URL初看可能复杂,但通过仔细阅读文档和分解步骤,你可以有效地从各种在线数据源获取实时数据,为你的分析项目提供强大的支持。

126:构建需要身份验证的 API 请求 🔑

在本节课中,我们将学习如何通过身份验证来执行安全的 API 请求。身份验证类似于密码,但通常被称为令牌或密钥,由数据提供商而非用户设置。我们将以芝加哥市开放数据 API 为例,演示如何获取并使用 API 密钥,以及如何将其添加到请求中以获取更多数据。

概述与准备工作

上一节我们介绍了如何构建基础的 API 请求。本节中我们来看看如何为请求添加身份验证,以突破数据行数限制并执行更安全的调用。

与构建 URL 类似,每个 API 生成和使用 API 密钥的方式都不同。因此,我们必须阅读相关文档来了解具体用法。

在之前的课程中,我们演示了如何在不使用任何身份验证的情况下从芝加哥市 API 获取数据,但当时有 1000 行数据的限制。现在,让我们回到该 API 的文档。

获取 API 密钥

在文档顶部,提到了“应用令牌”。这里有一个显著的蓝色按钮,提示“注册获取应用令牌”。我们需要点击它进行注册。

这是一个开放数据集,因此你可以免费注册,但注册步骤是必须的。输入你的邮箱地址和密码即可完成注册。

注册后,你需要探索如何获取你的应用令牌或密钥。在当前示例的仪表板中,顶部有“开发者设置 - API 密钥”的选项。

我们正在寻找令牌,因此需要找到标有“应用令牌”的下半部分区域。你可以在此处查看更多信息。

我已经创建了一个令牌。创建方法是点击“创建新应用令牌”,然后为其命名和添加描述。之后,系统会生成一个应用令牌。

请注意:这是我的应用令牌,你不应使用它。你可能会好奇我为何与你分享它。实际上,这些令牌可以被删除。我将在你观看此视频前删除它。关键是要认识到你可以获取自己的应用令牌。

获取令牌后,你可以复制它。接下来,我需要知道如何在 API 请求中使用它。

了解使用方式

让我们回到文档。文档下方说明,一旦你拥有应用令牌,可以通过两种方式将其包含在请求中:一是使用 X-App-Token HTTP 头部,二是通过 URL 中的 ?app_token 参数传递。

我将演示如何使用头部方法。请记住这个头部字段:X-App-Token

在 Python 中实施

现在,让我们进入 Python 环境。

首先,从 pandas 和 requests 模块导入必要的函数。

import pandas as pd
import requests

接下来,构建我的请求头部。

我正在创建一个简单的 Python 字典。字典的键是引号内的 ‘X-App-Token’,后面跟着一个冒号,然后是我的令牌。我将把这个字典保存为一个名为 my_header 的变量。

my_header = {'X-App-Token': '你的应用令牌字符串'}

运行这个代码单元格。

现在,开始构建请求。与上一课相比,有几个不同之处。

请求的 URL 是相同的,但第一个不同点是,我将尝试一次性获取 10000 行数据,而不是 1000 行。$limit 参数设置为 10000。

$offset 参数相同。$order 参数也相同,我希望按降序排列。

另一个不同点是,我没有使用任何修饰符,没有指定必须大于某个特定日期。

最后,我构建我的 URL。

url = “https://data.cityofchicago.org/resource/xxxx.json?$limit=10000&$offset=0&$order=application_start_date DESC”

运行这个代码单元格,你可以看到生成的 URL。

令牌也可以附加在 URL 的末尾。但同样,我将其放在了头部中。

执行请求并计时

现在,让我们查看请求。我在这里添加了一个“魔法”命令,这是 Jupyter 允许我们做的功能。我想计时获取 10000 行数据与 1000 行数据所需的时间。

我将再次使用 requests.get() 函数,并传入 URL。但现在我多了一个参数 headers,我将其设置为之前创建的 my_header 变量,该变量包含了我的令牌。

%%time
response = requests.get(url, headers=my_header)

这就是主要的区别。让我们运行它,看看需要多长时间。

大约花了 2.7 秒。我得到了一个 200 响应类型,说明请求成功了。

数据处理与分析

本视频我想强调的关键点就是如何将头部信息添加到你的 API 请求中。

在此之后,我们当然可以继续评估数据。我们可以将其转换为 DataFrame 并创建图表,以便查看数据。

例如,我们可以按申请开始日期绘制每周的总费用,并对其执行一些额外的分析。

df = pd.DataFrame(response.json())
# 进行数据分析和绘图...

总结

本节课中,我们一起学习了如何将 API 密钥或令牌集成到 API 请求中。你现在已经准备好进行更安全的 API 调用,并能在单次请求中获取更多数据了。记住,始终遵循特定 API 的文档来正确使用身份验证机制。

127:使用软件开发工具包构建 API 请求 🛠️

在本节课中,我们将学习如何利用软件开发工具包来简化API请求的构建过程,避免手动拼接URL的繁琐与潜在错误。

概述

上一节我们介绍了通过直接构建URL来发起API请求。本节中我们来看看一种更便捷的方法:使用软件开发工具包。

如果有一种方法可以让你无需手动构造URL就能执行API请求,这将会非常棒。这能省去很多麻烦,因为你不再需要担心遗漏重要的“&”符号或添加了过多的符号。

许多提供API的数据供应商也会创建软件开发工具包。作为SDK的一部分,他们通常会开发可供下载并安装到计算机上的Python模块。这些模块包含了能极大简化API请求执行的函数。

当然,与API相关的所有事物一样,这并没有统一标准。因此,你需要阅读API的文档,以确认是否存在可用的Python模块。

实践:使用芝加哥数据门户的SDK

让我们通过一个例子来练习使用SDK。我们一直以芝加哥数据门户的建筑许可数据为例。

如果我们点击其API文档链接,并滚动到页面底部,可以找到关于SDK的信息。由于Python被广泛使用,通常都会有对应的Python模块。

在文档中,我们可以找到一个名为“Python pandas”的标签页,里面提供了一些可以复制的示例代码。

环境准备与代码执行

以下是使用SDK获取数据的关键步骤:

  1. 安装必要模块:首先,需要确保已安装pandassodapy模块。可以使用终端命令进行安装:

    !pip install sodapy
    
  2. 导入模块与创建客户端:导入必要的函数,并创建一个连接到芝加哥数据门户的客户端。None表示不使用应用令牌,若你有令牌,可将其作为第二个参数传入。

    from sodapy import Socrata
    import pandas as pd
    
    client = Socrata("data.cityofchicago.org", None)
    
  3. 发起数据请求:使用客户端的get方法,传入数据集标识符(例如建筑许可数据的ID)以及可选的查询参数(如排序)。这种方式比手动拼接URL参数更清晰。

    results = client.get("ydr8-5enu", order="application_start_date DESC", limit=1000)
    

  1. 转换为数据框并清洗:将返回的结果转换为Pandas数据框以便分析。通常,初始数据的所有列都是字符串类型,需要进行适当的数据类型转换。
    df = pd.DataFrame.from_records(results)
    # 后续进行数据清洗,例如转换日期、数值列
    

运行代码后,我们成功获取了1000行数据。与之前一样,每个列最初都是字符串类型,因此需要额外的清洗步骤,将其转换为正确的数据类型,之后才能使用pandas函数进行分析。

总结

本节课中我们一起学习了利用软件开发工具包来简化API数据获取流程。关键在于认识到,当我们开始使用某个新的API时,应该主动寻找其SDK,特别是查看是否有Python模块可用。这通常会让你的工作变得更加轻松。记住,在文档中寻找Python模块的踪迹,是提升数据获取效率的重要一步。

128:循环入门教程 🌀

在本节课中,我们将要学习循环(Loops)的基本概念及其在Python中的几种常见类型。循环是编程中用于避免重复代码、提高效率的重要工具。

概述

循环能帮助我们编写DRY(Don't Repeat Yourself)代码,避免WET(Write Every Time)代码。WET代码指通过复制粘贴产生的重复代码,它难以维护且容易出错。我们将介绍四种循环:基本for循环、列表推导式、while循环和pandas的apply方法。

基本for循环

上一节我们介绍了循环的基本概念,本节中我们来看看最常用的for循环。for循环用于遍历序列(如列表或数字范围)中的每个元素。

以下是基本for循环的示例代码:

for i in range(5):
    print(f"This is iteration {i}")

这段代码使用range(5)生成数字0到4的序列。变量i依次代表序列中的每个值。缩进部分的代码会在每次迭代中执行。

遍历列表的for循环

除了数字范围,for循环还可以直接遍历列表中的元素。

以下是遍历文件名列表的示例:

my_files = ["file1.csv", "file2.csv", "file3.xlsx", "file4.parquet"]
for n in my_files:
    print(n)

这里变量n依次代表my_files列表中的每个文件名。循环会打印出所有文件名。

列表推导式

列表推导式(List Comprehension)是for循环的简洁写法,特别适用于需要将结果保存为列表的简单循环。

以下是列表推导式的基本结构:

[expression for item in iterable]

以下是将文件名列表中的CSV文件筛选出来的示例:

csv_files = [n for n in my_files if n.find(".csv") >= 0]

这段代码会创建一个新列表csv_files,其中只包含原始列表中文件名包含“.csv”的元素。

while循环

while循环在指定条件为真时重复执行代码块,条件变为假时停止。

以下是while循环的示例:

i = 1
while i < 10:
    print(i)
    i += 1  # 等同于 i = i + 1

循环从i=1开始,每次迭代打印i的值并将其加1,直到i不再小于10时停止。

pandas的apply方法

在处理数据框(DataFrame)时,pandas库的apply方法可以对多列或多行应用函数,实现类似循环的效果。

以下是将数据框多列转换为数值类型的示例:

import pandas as pd

![](https://github.com/OpenDocCN/dsai-notes-pt2-zh/raw/master/docs/uiuc-biz-anls/img/83d179a2189f3b256282fd83acdf32ac_26.png)

df = pd.DataFrame({
    'A': ['1', '2', 'a'],
    'B': ['4', '5', '6']
})

df = df.apply(pd.to_numeric, errors='coerce')

apply方法将pd.to_numeric函数应用到数据框的每一列。参数errors='coerce'会将无法转换的值(如字母‘a’)替换为缺失值(NaN)。

总结

本节课中我们一起学习了四种主要的循环结构:基本for循环用于遍历序列;列表推导式用于简洁地生成列表;while循环用于在条件满足时重复执行;pandas的apply方法用于对数据框进行批量操作。掌握这些循环技巧能帮助你编写更高效、更易维护的DRY代码。

129:循环与应用程序接口

在本节课中,我们将学习如何利用循环结构,通过迭代式地向应用程序接口发送请求,来获取超过单次请求限制的大量数据。我们将以芝加哥市建筑许可数据接口为例,演示这一过程。

概述

应用程序接口通常会设置控制措施,以防止用户一次性下载过多数据,因为这可能占用全部带宽。因此,接口通常会对可下载的数据行数设置速率限制。本节课将演示如何使用循环执行迭代式API请求,从而下载所需的全部数据。

我们将基于之前使用的例子进行构建,从芝加哥市的API获取数据,具体是建筑许可数据。在没有应用程序令牌的情况下,该API的数据限制为1000行。

构建基础请求

首先,我们需要在Python环境中导入必要的模块。

import pandas as pd
import requests

接下来,构建我们的初始请求。以下是请求URL的构建方式:

base_url = "https://data.cityofchicago.org/resource/ydr8-5enu.json"
limit = 1000
offset = 0
order_by = "application_start_date DESC"
url = f"{base_url}?$limit={limit}&$offset={offset}&$order={order_by}"
print(url)

这个URL以建筑许可数据的端点为基础。问号表示我们将对数据进行筛选。我们将行数限制设置为1000,这是没有应用令牌时的最大值。偏移量从0开始。这两个数字非常重要。我们按“申请开始日期”降序排列数据,以确保首先获取最新的数据。

使用循环获取更多数据

我们一次只能获取1000行数据。假设我需要5000行数据,但没有API密钥。即使有API密钥或应用令牌,通常也存在限制。因此,我们将构建一个循环来帮助我们完成这个任务。

以下是应用循环的具体方法:

df = pd.DataFrame()  # 创建一个空的DataFrame
limit = 1000

for i in range(5):
    my_offset = i * limit
    url = f"{base_url}?$limit={limit}&$offset={my_offset}&$order={order_by}"
    response = requests.get(url)
    print(f"Request {i+1} status: {response.status_code}")
    tdf = pd.DataFrame(response.json())
    df = pd.concat([df, tdf], ignore_index=True)

首先,创建一个名为df的空DataFrame。然后,使用for i in range(5)的循环结构,将下面的代码执行五次。在循环内部,我们创建变量my_offset。记住URL中的偏移量参数,我们将其设置为i * limit。第一次循环时,i等于0,所以偏移量为0。第二次循环时,i等于1,偏移量变为1000,依此类推。这样,我们就能通过改变偏移量来逐页获取数据。

循环内的其余部分与单次请求类似:执行GET请求并保存响应;打印状态更新以跟踪进度;将获取的数据转换为名为tdf的临时DataFrame;最后,将这个临时DataFrame堆叠到主DataFrame df的下方。第一次循环时,df是空的,tdf会添加新行。后续每次循环都会添加更多行。我们忽略索引以避免重复的行名。

运行上述代码,可以看到循环依次执行了五次请求,成功获取了数据。

验证与数据清洗

为了验证结果并确保我们获得了不同的数据行,可以进行以下操作:

# 删除包含字典的‘location’列,以便检查重复项
df_clean = df.drop(columns=['location'])
# 删除任何重复的行
df_clean = df_clean.drop_duplicates()
# 重置索引
df_clean = df_clean.reset_index(drop=True)
print(f"Total rows: {len(df_clean)}")

运行后,可以看到我们确实获得了5000行不重复的数据,索引从0到4999。这表明循环请求成功了。

接下来可以进行一些额外的数据清洗。这里展示一个列表推导式的应用:

# 找出所有列名中包含‘date’的列,并转换为日期时间格式
date_cols = [c for c in df_clean.columns if 'date' in c.lower()]
df_clean[date_cols] = df_clean[date_cols].apply(pd.to_datetime)

# 找出所有列名中包含‘fee’的列,并转换为数值类型,非数值转换为缺失值
fee_cols = [c for c in df_clean.columns if 'fee' in c.lower()]
df_clean[fee_cols] = df_clean[fee_cols].apply(pd.to_numeric, errors='coerce')

这段代码首先循环遍历所有列名。对于每个列名,如果其中包含“date”这个词,就将其加入date_cols列表,然后对这个列表中的所有列应用pd.to_datetime函数进行转换。接着,用类似的方法找出所有包含“fee”的列,将它们转换为数值类型,无法转换的则替换为缺失值。

运行清洗代码后,可以看到“issue_date”等列已转换为日期时间格式,“building_fee_paid”、“zoning_fee_paid”等列已转换为数值类型。之后,就可以利用Python和pandas的功能来分析这些数据了。

总结

本节课中,我们一起学习了如何利用循环结构迭代执行多个API请求,以获取所需的大量数据。关键点在于通过动态调整请求中的偏移量参数来实现数据的分页获取。我们还演示了for循环、列表推导式以及apply方法在数据处理中的实际应用,展示了这些工具如何帮助您高效地从API获取并处理数据。希望这个演示对您理解循环在数据获取中的应用有所帮助。

130:ChatGPT API 编程调用指南 🚀

在本节课中,我们将学习如何通过 OpenAI 的 API,以编程方式调用 ChatGPT 等人工智能模型。我们将从获取 API 密钥开始,逐步演示如何在 Python 环境中发送文本和图像请求,并获取 AI 的响应。

准备工作:获取 API 密钥与阅读文档

要使用 OpenAI 的 API,首先需要一个付费账户并获取 API 密钥。每个 API 的文档都不同,因此仔细阅读官方文档至关重要。

以下是获取和使用 API 密钥的关键步骤:

  1. 访问文档:搜索并访问 OpenAI 的官方 API 文档网站。
  2. 身份验证:使用 API 必须进行身份验证。点击“组织设置”查看和管理 API 密钥。
  3. 创建密钥:在账户中创建新的 API 密钥。出于安全考虑,创建后无法再次查看完整密钥,需要妥善保存。
  4. 查看用量:在“账单”部分可以查看余额和使用情况。

核心概念:发起模型请求

上一节我们介绍了如何获取访问凭证,本节中我们来看看如何发起一个基础的文本请求。OpenAI 提供了详细的代码示例。

核心步骤是使用其软件开发工具包(SDK)来编程获取模型响应。以下是一个 Python 示例的代码结构:

# 导入必要的库
import openai
import os

![](https://github.com/OpenDocCN/dsai-notes-pt2-zh/raw/master/docs/uiuc-biz-anls/img/407a7b3cc2a4681b757daeea63f26920_7.png)

# 安全地从环境变量获取 API 密钥
api_key = os.environ.get("OPENAI_API_KEY")

# 初始化客户端
client = openai.OpenAI(api_key=api_key)

![](https://github.com/OpenDocCN/dsai-notes-pt2-zh/raw/master/docs/uiuc-biz-anls/img/407a7b3cc2a4681b757daeea63f26920_9.png)

# 创建请求
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "请给我一个关于使用API的提示,用打油诗的形式。"}
    ]
)

# 打印响应
print(response.choices[0].message.content)

运行上述代码后,可能会得到类似这样的响应:“调用 API 莫心急,文档先读细。端点地址要核对,错误信息需留意,请求频率控制好,否则结果一团糟。”

功能扩展:处理图像输入

除了文本,OpenAI 的 API 也支持图像分析。这为商业应用(如库存盘点、人群估算)打开了大门。

以下是分析图像内容的代码示例:

# 定义图像URL和问题
image_url = "https://example.com/your-image.jpg"
prompt_text = "这张图片里有什么?"

# 发起视觉请求
response = client.chat.completions.create(
    model="gpt-4-vision-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": prompt_text},
                {"type": "image_url", "image_url": {"url": image_url}},
            ],
        }
    ],
    max_tokens=300,
)

print(response.choices[0].message.content)

例如,给 API 一张玉米地的图片并询问“你认为这张图片中的玉米价值多少?”,模型可能会基于视觉信息给出估算,但同时会指出需要更多数据(如田地面积)才能精确计算。

模型选择与成本考量

OpenAI 提供了多种模型,性能和价格各不相同。在“快速入门”或“定价”页面可以查看每百万令牌(tokens)的价格。

选择模型的公式可以简化为:
模型选择 = 权衡(任务复杂度, 响应精度要求, 预算成本)

例如,gpt-4 系列模型比 gpt-3.5-turbo 更强大也更昂贵。在实际应用中,可以根据具体需求进行选择。

总结与展望

本节课中我们一起学习了如何通过 OpenAI API 以编程方式调用 ChatGPT。
我们从获取 API 密钥开始,实践了发送文本和图像请求,并了解了不同模型的选择。
现在,你已经掌握了将 API 与 AI 能力结合的工具。
接下来,你将创造什么呢?

131:高效处理 Web API 的策略 🚀

在本节课程中,我们将学习四种在 Python 环境中高效使用 API 来组装数据的核心策略。这些策略将帮助你更顺畅地与各种 Web API 进行交互,并规避常见的陷阱。


策略一:仔细阅读文档 📖

无论你出于何种目的使用 API,仔细阅读其官方文档都至关重要。文档中包含了 API 的调用方式、参数说明、数据格式以及重要的限制信息。

例如,在使用芝加哥市的建筑许可数据 API 时,必须仔细阅读关于分页的文档。最初可能无法获取预期的全部数据,原因在于没有正确理解分页机制。通过阅读文档,我们了解到需要使用 offsetlimit 参数来控制数据的分页获取。

核心概念:分页参数通常通过 URL 查询字符串传递。

# 示例:使用 offset 和 limit 参数
base_url = "https://data.cityofchicago.org/resource/..."
params = {'$limit': 1000, '$offset': 0}

策略二:寻找并使用软件开发工具包(SDK) 🧰

许多流行的 API 会提供官方的软件开发工具包。如果其中包含 Python 模块,强烈建议使用它。SDK 封装了底层的 HTTP 请求和响应处理,能极大简化你的代码。

我们演示过的一个例子是使用 openai 模块与 ChatGPT API 交互。使用 SDK 后,我们甚至无需手动构建请求 URL,直接调用封装好的函数即可。

核心概念:SDK 通常为商业化 API 提供,能简化身份验证和请求过程。

# 示例:使用 OpenAI 的 Python SDK
import openai
response = openai.ChatCompletion.create(...)

策略三:从易于调试的简单示例开始 🔍

不要一开始就尝试获取大量数据。复杂的请求可能导致长时间等待,并且出错时难以排查。建议从简单的请求开始,逐步增加复杂性。

在获取建筑许可数据的例子中,我们先执行了一个简单的 API 请求,确认能成功获取数据。然后,我们结合对 offsetlimit 参数的理解,通过循环逐步获取了全部所需数据。

核心概念:采用迭代开发的方法,先验证基础功能,再扩展复杂度。


策略四:时刻牢记安全性 🔒

身份验证在 API 使用中非常普遍且重要,尤其是处理商业专有数据时。你需要保护你的 API 密钥,防止泄露。

务必学习如何使用环境变量来安全地存储 API 密钥,避免将其硬编码在脚本中。对于有价值的服务,应定期更换密钥。

核心概念:使用环境变量管理敏感信息。

# 在终端中设置环境变量(示例)
export API_KEY="your_secret_key_here"
# 在 Python 代码中读取环境变量
import os
api_key = os.environ.get("API_KEY")

总结 📝

本节课我们一起学习了高效处理 Web API 的四个核心策略:

  1. 仔细阅读文档,理解 API 的具体规范。
  2. 寻找并使用 SDK,以简化开发流程。
  3. 从简单示例开始,采用迭代方式逐步完善。
  4. 重视安全性,使用环境变量妥善管理 API 密钥。

掌握这些策略将帮助你在未来的数据分析项目中,更自信、更高效地与各种数据源进行交互。

132:API与数据整合总结 🧩

在本节课中,我们将总结第四模块的核心内容,深入理解API(应用程序编程接口)在现代数字世界中的关键作用,并探讨其在商业数据分析流程中的重要性。


随着本模块的结束,希望你已对API如何作为数字世界中的重要“服务员”有了更深刻的理解。它们促进了数据的无缝传输。正如实验室餐厅的服务员连接顾客与后厨人员一样,API使得信息能够在不同应用程序和系统之间自由流动。

想象一下,如果数据无法通过这些数字服务员轻松传递,技术世界将会变得多么迟缓和割裂。

那么,这里有一个问题供你思考:你认为自己每天会使用多少次API?

在思考这个问题时,你可能会想:“我刚了解API,只在课程中使用过几次。”然而,让我们来听听我对沃尔格林公司产品工程总监Ravi Tawari的部分采访内容。我特别询问了他关于API的角色,相信这会进一步加深你对API如何被使用以及其潜力的理解。

我叫Ravi Tawari。我目前在沃尔格林公司担任产品工程总监,隶属于首席技术官办公室。这个办公室本质上是整个公司的创新与战略中心。众所周知,沃尔格林是美国第二大药房,但我们通常称它为Walgreens。其正式公司名称是Walgreens Boots Alliance,因为我们在2014年与Boots Alliance合并。我们在全美拥有约9000家门店,每年支持着万亿级别的交易量。

问:你能谈谈API在访问这些(业务)模型中所扮演的角色吗?

答: 当然。API即应用程序编程接口。你可以把它类比为UI(用户界面),UI是用户与程序交互的界面,而API是应用程序之间通信的接口。如今,每当我们开发任何微服务时,我们都希望秉持“API优先”的思维模式。这意味着我们拥有不同的用户界面,比如移动应用、电视应用、网页应用等。关键在于,我们不想为每个界面创建不同的数据提供方式。我们所做的是创建一个中心化的API。API开发有不同的设计模式,但核心是提供一个统一的API,让所有消费者都能使用相同的数据集。因此,你专注于定义“合同”(接口规范),然后开发这些API,供用户界面或其他任何消费者使用。

关于API的另一点是……我还可以补充一句:我们现在将70%的精力集中在“合同”上,至于如何编写实现代码,这已不是我们主要思考的问题,因为我们正将其交给AI,由AI来开发API并将其打包成我们发布的服务。

Ravi讨论的核心要点在于,API被用来简化创建适用于各种用户界面的应用程序的过程。例如,当你在沃尔格林的网站或App上点击按钮以了解更多产品信息时,无论你使用的是手机还是电脑,你的应用程序很可能都在使用同一个API请求来获取数据。同样地,你的音乐应用很可能使用API来获取你想听的歌曲。或者当你使用AI助手时,你的设备很可能通过API请求将信息发送到拥有更强处理能力的远程计算机。

因此,很可能你每天至少间接地使用API数十次,甚至数百次。我意识到你们中的许多人不会直接编写代码来开发软件产品,但至少你现在对API的工作原理及其用途有了更好的认识。此外,听起来AI也在为Ravi完成大量的软件开发工作。

那么,这对数据分析意味着什么?让我们再听听Ravi的说法:

根据我在科技行业20年的经验以及在众多财富500强公司工作的经历,我建议:是的,数据是关键。专注于数据分析、数据工程,这才是未来。AI并非……我想说,它不再像过去那样困难,因为模型已经存在。我们真正需要关注的是如何使数据变得干净、规整、高效和智能

一切奥秘都隐藏在数据中。数据质量越好,任何模型的表现就会越好;数据质量越差,你的模型表现也会越差。 因此,除非你有一个良好、完善的数据策略,否则AI或任何应用程序都毫无意义。

Ravi的评论有力地强调了API在我们FACT框架(注:可能指课程中的某个分析框架,如数据获取、分析、沟通等)中“数据整合”环节的重要性。他指出,API不仅仅是一个技术细节,更是像餐厅服务员一样必不可少的基础设施。没有这些数字服务员,数据就无法流动;而没有高质量的数据流,我们构建的分析模型将无法提取出有用的见解。

正如服务员通过连接厨师与顾客来促进用餐体验一样,API是数据革命的基础,它们连接数据源与决策者。

因此,除了培养分析思维、掌握探索性数据分析、理解关系型数据库之外,你现在应该将API添加到你的核心工具包中,以成功整合驱动智能商业决策所需的信息。


本节课总结

在本节课中,我们一起学习了:

  1. API的核心角色:API是数字世界的“服务员”,负责在不同系统间无缝传递数据,是技术流畅运行的基础。
  2. API的普遍性:我们每天都会间接使用API数十甚至数百次,无论是浏览网页、使用App还是与AI交互。
  3. “API优先”的开发思维:在现代软件开发中,尤其是微服务架构下,首先定义清晰、统一的API接口(“合同”)至关重要,这能确保不同前端(如网页、手机App)都能高效、一致地获取数据。
  4. 数据质量的根本性地位:Ravi的见解明确指出,无论AI模型多么先进,高质量(干净、规整、高效、智能)的数据是获得有效分析结果的绝对前提。API是确保这些高质量数据能够被有效“组装”和流动的关键管道。
  5. API在分析人员工具包中的位置:作为未来的商业分析专业人士,理解和使用API已成为一项必备技能,它与分析思维、数据探索和数据库知识同等重要,共同构成了成功整合信息、驱动商业智能的完整能力体系。

133:按你的方式学习

概述

在本节课中,我们将了解吉斯商学院如何通过可堆叠的在线内容,打破传统线性学习的限制,让你能够完全按照自己的节奏和方式获取教育。

传统学习的局限

过于频繁地,聪明、勤奋、忙碌的人们因为传统的线性学习模式而错失教育机会。

吉斯商学院的解决方案

因此,吉斯商学院提供了可堆叠的在线内容,让你能够按照自己的方式学习。

以下是吉斯商学院提供的主要学习方式:

  • 你可以参加自定进度的课程。
  • 你可以获得可转录的学分。
  • 你可以随时暂停学习。
  • 你可以最终获得学位。
  • 你可以转换和堆叠课程作业。
  • 你可以获得证书。
  • 或者,你可以以任何你想要的方式学习。

学习体验的核心优势

上一节我们列举了灵活的学习方式,本节中我们来看看这些方式带来的核心优势。你将获得由专家引领的教育,并且无论你处于学习旅程的哪个阶段,都能以或大或小的增量进行学习。

开始的最佳时机

在吉斯商学院开始学习的最佳时机,就是你认为合适的时间。

总结

本节课中,我们一起学习了吉斯商学院如何通过提供灵活、可堆叠的在线学习方案,让每个人都能掌控自己的学习节奏和路径,从而让教育变得更加个性化和便捷。

posted @ 2026-03-26 12:20  布客飞龙III  阅读(7)  评论(0)    收藏  举报