IBM-数据科学-VIII-笔记-全-
IBM 数据科学 VIII 笔记(全)
001:数据可视化导论 📊

在本节课中,我们将要学习数据可视化的基本概念,并通过一个具体例子,了解如何将一个复杂的图表转化为更有效、更具吸引力且更有影响力的可视化形式。


大家好,欢迎来到Python数据可视化课程的第一个模块。
在这个视频中,我们将介绍数据可视化,并通过一个例子展示如何将一个给定的视觉图表转化为更有效、更具吸引力且更有影响力的形式。

那么,让我们开始吧。



有人可能会问,为什么需要学习如何可视化数据?
数据可视化是一种以图形化且易于理解的形式展示复杂数据的方法。
这在探索数据并熟悉数据时尤其有用。
此外,由于一图胜千言,图表在清晰传达数据描述方面非常有效。
特别是在向观众展示发现或与其他数据科学家共享数据时,图表非常有用。
此外,在向客户、经理或所在领域的其他决策者提出建议时,图表也非常有价值。

Darkro Analytics是一家于2008年从阿尔伯塔大学研究实验室分离出来的公司,在数据可视化方面做了许多引人入胜的工作。
Darkro Analytics专注于多个领域的定量咨询,包括数据可视化和地理空间分析。


他们在创建可视化图表时的方法围绕三个关键点展开:少即是多、更有效、更具吸引力、更有影响力。
换句话说,为了使图表更具吸引力或更美观而加入的任何功能或设计,都应支持图表所要传达的信息,而不是分散注意力。


让我们来看一个例子。

这里有一个饼图,看起来展示了人们对不同类型猪肉的偏好。
图表传达的信息是:在接受调查的人中,近一半的人更喜欢培根,而不是其他类型的猪肉。


但我相信几乎所有人都同意,这个饼图中包含了许多元素,我们甚至不确定蓝色背景或3D方向等功能是否旨在传达任何信息。

事实上,这些额外的不必要功能会分散主要信息的注意力,并可能使观众感到困惑。



因此,让我们应用Darkro Analytics的方法,将这个图表转化为更有效、更具吸引力且更有影响力的可视化形式。
如前所述,这里的信息是:人们更可能选择培根,而不是其他类型的猪肉。
因此,让我们去除一切可能分散核心信息注意力的元素。


以下是具体步骤:

首先,去除蓝色背景和灰色背景。
其次,去除边框,因为它们不传达任何额外信息。
接着,去除冗余的图例,因为饼图已经通过颜色进行了标注。
3D效果没有增加任何额外信息,因此去除它。
文本阴影也是不必要的,去除它。
然后,去除不同的颜色。
最后,去除饼图的扇形块。
哇,发生了什么?


让我们坚持使用线条,使它们更有意义。
现在,这看起来有点熟悉了。
是的,这是一个条形图,更具体地说,是一个水平条形图。
最后,让我们突出显示培根,使其在其他类型的猪肉中脱颖而出。



现在,让我们将饼图和条形图并置,比较哪一个更好且更易于理解。
我希望我们一致同意条形图是两者中更好的选择。它更简单、更清晰、更少分散注意力,且更易于阅读。

事实上,饼图最近受到了数据可视化专家的批评,他们认为饼图仅在极少数情况下适用。
相比之下,条形图和图表被认为是快速传达信息的更优方式。

但暂时不用担心这一点。当我们学习如何使用Matplotlib创建饼图和条形图时,会再次回到这一点。

如需更多类似且有趣的例子,请查看Darkro Analytics的网站。
他们还有更多关于如何清理条形图和地理空间数据地图的例子。
所有这些例子都强化了“少即是多”的概念,即更有效、更具吸引力且更有影响力。


在本节课中,我们一起学习了数据可视化的基本概念,并通过一个具体例子了解了如何优化图表以更有效地传达信息。记住,一个好的可视化图表应该简洁、清晰,并突出核心信息。
002:Matplotlib入门



在本节课中,我们将开始学习Matplotlib。我们将了解Matplotlib的历史背景及其核心架构,并通过实例理解其不同层次的工作原理。

🏛️ Matplotlib的历史与起源

Matplotlib是Python中最广泛使用的数据可视化库之一,即使不是最流行的,也位居前列。


它由约翰·亨特创建。约翰·亨特是一位神经生物学家,当时他所在的研究团队正在分析脑皮层电图信号。

团队当时使用一款专有软件进行分析。然而,他们只有一个软件许可证,因此需要轮流使用。


为了克服这个限制,约翰着手开发一个基于MATLAB的替代版本,以便他和他的团队成员都能使用,并且可以被其他研究者扩展。
因此,Matplotlib最初是作为一个脑皮层电图可视化工具而开发的。与MATLAB类似,Matplotlib配备了一个脚本接口,用于通过Pyplot快速、轻松地生成图形。



🧱 Matplotlib的三层架构


Matplotlib的架构由三个主要层次构成。

- 后端层
- 艺术家层:大部分繁重工作在此层完成。当编写Web应用服务器、UI应用程序或需要与其他开发者共享的脚本时,通常使用此编程范式。
- 脚本层:这是适合日常使用的层次,被视为一个更轻量的脚本接口,用于简化常见任务,并快速、轻松地生成图形和图表。


接下来,让我们更详细地了解每一层。

后端层


后端层包含三个内置的抽象接口类。


以下是后端层的核心组件:
- 图形画布:定义并包含了绘制图形的区域。
- 渲染器:渲染器类的实例知道如何在图形画布上绘制。
- 事件:处理用户输入,如键盘敲击和鼠标点击。

艺术家层

艺术家层由一个主要对象构成,即艺术家。艺术家是知道如何获取渲染器并使用它在画布上“着墨”的对象。你在Matplotlib图形中看到的一切都是一个艺术家实例。标题、线条、刻度标签、图像等等,都对应着独立的艺术家。


艺术家对象有两种类型。
以下是艺术家对象的两种类型:
- 基本类型:例如线条、矩形、圆形或文本。
- 复合类型:例如图形或坐标轴。



顶层的Matplotlib对象是图形艺术家,它包含并管理给定图形中的所有元素。最重要的复合艺术家是坐标轴,因为大多数Matplotlib API的绘图方法都在此定义,包括创建和操作刻度、轴线、网格或绘图背景的方法。


需要注意的是,每个复合艺术家可以包含其他复合艺术家以及基本艺术家。例如,一个图形艺术家可以包含一个坐标轴艺术家,以及矩形或文本艺术家。


现在,让我们使用艺术家层,看看如何用它生成一个图形。
我们将尝试使用艺术家层生成一个包含10,000个随机数的直方图。
首先,我们从后端导入图形画布,并将图形艺术家附加到它上面。请注意,Agg代表反图形几何库,这是一个能生成高质量图像的高性能库。




from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure

然后,我们导入NumPy库来生成随机数。

import numpy as np


接下来,我们创建一个坐标轴艺术家。坐标轴艺术家会自动添加到图形容器的坐标轴列表中。

fig = Figure()
canvas = FigureCanvas(fig)
ax = fig.add_subplot(111)


请注意,这里的111遵循MATLAB的惯例,它创建一个一行一列的网格,并使用该网格中的第一个单元格作为新坐标轴的位置。


然后,我们调用坐标轴的hist方法来生成直方图。hist方法为每个直方图条创建一系列矩形艺术家,并将它们添加到坐标轴容器中。这里的100表示创建100个数据箱。


x = np.random.randn(10000)
ax.hist(x, 100)

最后,我们为图形添加标题装饰并保存它。

ax.set_title('Normal distribution with $\mu=0, \sigma=1$')
fig.savefig('matplotlib_histogram.png')



这就是生成的直方图。以上就是我们如何使用艺术家层来生成图形。

脚本层


脚本层是为非专业程序员的科学家们开发的。我相信,基于我们刚刚创建的直方图代码,你会同意我的看法:艺术家层的语法较为繁琐,因为它面向开发者,而不是那些目标是对某些数据进行快速探索性分析的个人。
Matplotlib的脚本层本质上是Matplotlib的Pyplot接口,它自动化了定义画布、定义图形艺术家实例以及连接它们的过程。


让我们看看之前使用艺术家层生成10,000个随机数直方图的代码,现在使用脚本层会是什么样子。
首先,我们导入Pyplot接口。你可以看到,所有与创建直方图、其他艺术家对象以及操作它们相关的方法,无论是hist方法还是显示图形,都是Pyplot接口的一部分。



import matplotlib.pyplot as plt
import numpy as np


x = np.random.randn(10000)
plt.hist(x, 100)
plt.title('Normal distribution with $\mu=0, \sigma=1$')
plt.show()
📚 延伸阅读



如果你有兴趣了解更多关于Matplotlib历史及其架构的信息,这个链接将带你到由Matplotlib创建者亲自撰写的一章内容。这绝对是一篇值得推荐的阅读材料。
🎯 课程总结



在本节课中,我们一起学习了Matplotlib的起源、其三层架构以及各层的基本概念。我们了解到,艺术家层提供了底层的精细控制,而脚本层则通过Pyplot接口提供了更简洁、更易用的方式来进行日常数据可视化。理解这些层次将帮助我们更有效地使用Matplotlib来创建各种图表。
003:Matplotlib基础绘图


在本节课中,我们将学习如何使用Matplotlib库来创建图表。我们将使用Jupyter Notebook作为开发环境,并重点介绍Matplotlib的脚本接口。通过本课,你将掌握如何绘制基本图表,并了解Matplotlib与Pandas库的集成使用。

🎯 Matplotlib简介



Matplotlib是一个成熟的数据可视化库,它在多种环境中都得到良好支持,包括Python脚本、IPython shell、Web应用服务器、图形用户界面工具包以及Jupyter Notebook。

对于不熟悉Jupyter Notebook的学员,它是一个开源Web应用程序,允许你创建和共享包含实时代码、可视化图表以及解释性文本的文档。
Jupyter对Matplotlib有专门的支持。启动Jupyter Notebook后,你只需导入Matplotlib即可开始使用。



🛠️ 脚本接口


在本课程中,我们将主要使用Matplotlib的脚本接口。换句话说,我们将学习如何使用脚本接口创建几乎所有的可视化工具。

随着课程的深入,你将体会到这个接口的强大之处。你会发现,仅使用一个函数——plot函数,就能创建几乎所有常见的可视化工具,例如直方图、条形图、箱线图等。

📈 基础绘图示例



让我们从一个例子开始。首先,我们将脚本接口导入为plt。

import matplotlib.pyplot as plt


然后,我们在坐标(5,5)的位置绘制一个圆形标记。

plt.plot(5, 5, 'o')
plt.show()

请注意,图表是在浏览器中生成的,而不是在单独的窗口中。

如果图表在新窗口中生成,你可以使用所谓的“魔法函数”来强制在浏览器中生成图表。魔法函数以%符号开头。


%matplotlib inline

通过传入inline作为后端,可以强制图表在浏览器中渲染。Matplotlib有许多不同的后端可用。

这个后端的一个限制是,一旦图表被渲染,你就无法修改它。因此,在渲染上述图表后,我们无法添加图表标题或为坐标轴添加标签。


你需要生成一个新图表,并在调用show函数之前添加标题和坐标轴标签。


🔄 Notebook后端
一个克服此限制的后端是notebook后端。使用notebook后端时,如果调用plt函数,它会检查是否存在活动图表,你调用的任何函数都将应用于这个活动图表。



如果不存在活动图表,它会渲染一个新图表。

因此,当我们调用plt.plot函数在位置(5,5)绘制圆形标记时,后端会检查是否存在活动图表。


由于没有活动图表,它会生成一个图表,并在位置(5,5)添加一个圆形标记。

这个后端的美妙之处在于,我们现在可以在图表渲染后轻松添加标题或坐标轴标签,而无需重新生成图表。


🤝 Matplotlib与Pandas集成


Matplotlib的另一个优点是,Pandas也内置了它的实现。

因此,在Pandas中绘图就像在给定的Pandas Series或DataFrame上调用plot函数一样简单。


假设我们有一个数据框,包含从1980年到1996年从印度和中国移民到加拿大的人数。

如果我们想为这些数据生成折线图,只需在这个数据框上调用plot函数,并将参数kind设置为line。

india_china_df.plot(kind='line')

这样,你就得到了数据框中数据的折线图。


绘制数据的直方图也没有什么不同。假设我们想为数据框中的“India”列绘制直方图,只需在该列上调用plot函数,并将参数kind设置为hist(表示直方图)。

india_china_df['India'].plot(kind='hist')
这样,你就得到了从1980年到1996年印度移民到加拿大人数的直方图。




📝 总结

本节课我们一起学习了Matplotlib的基础绘图。我们介绍了Matplotlib库及其在Jupyter Notebook中的使用,重点讲解了脚本接口和notebook后端的优势。我们还演示了如何与Pandas集成,轻松创建折线图和直方图。掌握这些基础将为你后续学习更复杂的可视化技术打下坚实的基础。
004:加拿大移民数据集介绍 📊


在本节课中,我们将学习本课程将使用的核心数据集——加拿大移民数据集。我们将了解数据来源、结构,并学习如何用Pandas库将其导入为DataFrame,为后续的可视化分析做好准备。
数据集概述 🌍
上一节我们介绍了数据可视化的重要性,本节中我们来看看我们将要使用的具体数据。


联合国人口司编制了一份涵盖45个国家的移民数据。该数据集包含了从世界各地迁移到这45个国家的移民总数,以及与移民原籍国相关的其他元数据。


在本课程中,我们将重点关注移民到加拿大的数据,并主要使用涉及“大白北”(加拿大)移民的数据集。

数据集结构 📁

以下是联合国加拿大移民数据的一个Excel文件快照。可以看到,前20行包含关于联合国部门和其他不相关信息的文本数据。第21行包含各列的标签。
在此之后,每一行代表一个国家,并包含关于该国家的元数据,例如它位于哪个大洲、属于哪个区域,以及该区域是发展中还是发达状态。


每一行还包含了从1980年到2013年每年从该国移民到加拿大的总人数。

导入数据到Pandas 🛠️

在本课程中,我们在创建任何可视化图表之前,都将使用Pandas进行数据分析。
因此,为了开始为数据创建不同类型的图表(无论是用于探索性分析还是演示),我们需要将数据导入到Pandas的DataFrame中。


以下是实现此目标所需的步骤:

首先,我们需要导入Pandas库以及XLDR库。XLDR库是提取Excel电子表格文件数据所必需的。
import pandas as pd
import xlrd
然后,我们调用Pandas的read_excel函数将数据读入一个DataFrame。


df_can = pd.read_excel('canada_immigration_data.xlsx', skiprows=20)

请注意,我们通过skiprows=20参数跳过了前20行,以便只读取与每个国家对应的数据行。
验证数据导入 ✅


如果你想确认已正确地将数据导入Pandas,可以随时使用head函数来显示DataFrame的前五行。
因此,如果我们在我们的DataFrame df_can上调用这个函数:


df_can.head()

以下是输出结果。可以看到,head函数的输出看起来是正确的,列具有正确的标签,每一行代表一个国家并包含来自该国的移民总数。
总结 📝
本节课中我们一起学习了本课程的核心数据集——加拿大移民数据集。我们了解了它的来源和结构,并掌握了使用Pandas和xlrd库将Excel数据导入为DataFrame的关键步骤。正确导入和查看数据是进行有效数据分析和可视化的第一步。在接下来的课程中,我们将基于这个DataFrame创建各种可视化图表。
005:折线图绘制

在本节课中,我们将学习如何创建第一个可视化工具——折线图。折线图是数据科学中最基础的图表类型之一,广泛应用于各个领域。


📈 什么是折线图?
折线图由一系列数据点组成,这些点通过直线段连接。它是最基本的图表类型之一,不仅限于数据科学,在许多其他领域也很常见。


🕰️ 何时使用折线图?

折线图最适合用于展示连续数据集在一段时间内的变化趋势。
例如,如果我们想了解海地移民到加拿大的趋势,可以创建一个折线图。该图表将描绘从1980年到2013年海地移民到加拿大的趋势。
基于这个折线图,我们可以研究明显异常或变化的原因。在这个例子中,我们看到2010年从海地到加拿大的移民数量出现了一个高峰。



快速的网络搜索显示,2010年海地发生了一场悲惨的地震。因此,移民到加拿大的激增主要是由于那场地震。


🗃️ 数据准备
在介绍生成折线图的代码之前,我们先快速回顾一下数据。


数据集中,每一行代表一个国家,包含该国家的元数据,例如地理位置以及是发展中国家还是发达国家。每一行还包含从1980年到2013年该国每年移民到加拿大的数字。
现在,我们处理数据框,使国家名称成为每一行的索引。这将使筛选特定国家变得更加容易。

同时,我们添加一个额外的列,代表每个国家从1980年到2013年年度移民的累计总和。例如,阿富汗的总和是58,639,阿尔巴尼亚是15,699,依此类推。


我们将这个数据框命名为 df_canada。
🖥️ 生成折线图
现在我们知道了数据是如何存储在 df_canada 数据框中的,接下来生成与海地移民对应的折线图。
以下是生成折线图的步骤:
首先,导入必要的库。

import matplotlib as mpl
import matplotlib.pyplot as plt
然后,在海地对应的行上调用 plot 函数,并设置 kind='line' 来生成折线图。


years = list(map(str, range(1980, 2014)))
df_canada.loc['Haiti', years].plot(kind='line')

请注意,我们使用了 years 列表(包含从1980年到2013年的字符串格式年份)来排除我们添加的“总移民”列。

接着,为图表添加标题和坐标轴标签,以完善图形。

plt.title('Immigration from Haiti to Canada (1980-2013)')
plt.ylabel('Number of immigrants')
plt.xlabel('Years')

最后,调用 show 函数来显示图形。


plt.show()

请注意,这是使用魔术函数 %matplotlib inline 生成折线图的代码,以便在Jupyter笔记本中内联显示图表。

这样,我们就得到了一个描绘1980年至2013年海地移民到加拿大情况的折线图。

🧪 实验环节

在实验环节中,我们将更详细地探索折线图,请务必完成本模块的实验部分。


📝 总结

本节课我们一起学习了折线图。我们了解了折线图的基本概念、适用场景,并通过一个具体案例——海地移民到加拿大的趋势——演示了如何使用Python的Matplotlib库来创建和定制折线图。记住,折线图是展示时间序列数据趋势的强大工具。
006:面积图绘制


在本节课中,我们将学习另一种数据可视化工具——面积图。面积图实际上是之前学过的折线图的扩展,常用于比较两个或多个数量随时间变化的累积趋势。

什么是面积图?


面积图,也称为面积图表,是一种使用数字或百分比随时间变化来描绘累积总量的图表类型。它基于折线图,通常用于比较两个或多个数量。


数据集回顾

在编写代码生成面积图之前,我们先快速回顾一下数据集。数据集中的每一行代表一个国家,包含该国的元数据,如地理位置、发展状态等。每一行还包含从1980年到2013年该国每年移民到加拿大的人数。
为了让数据更易于处理,我们将国家名称设置为每行的索引,并添加一个新列,表示从1980年到2013年每个国家的年度移民累积总和。我们将这个数据框命名为 df_canada。

生成面积图的步骤
现在我们已经了解了数据在数据框 df_canada 中的存储方式,接下来尝试为移民到加拿大人数最多的国家生成面积图。
1. 找出移民人数最多的国家


我们可以通过按1980年至2013年累积移民总数降序排序数据框来找出这些国家。以下是排序的代码:

df_canada.sort_values(by='Total', ascending=False)

排序结果显示,印度、中国、英国、菲律宾和巴基斯坦是移民到加拿大人数最多的五个国家。

2. 准备数据框
为了生成这些国家的面积图,我们需要创建一个仅包含这五个国家的新数据框,并排除“Total”列。更重要的是,我们需要将年份绘制在横轴上,将年度移民人数绘制在纵轴上。
由于Matplotlib默认将数据框的索引绘制在横轴上,而当前数据框的索引是国家名称,因此我们需要对数据框进行转置。以下是准备数据框的步骤:
# 创建包含前五个国家的新数据框
df_top_five = df_canada.head(5)
# 选择1980年至2013年的列,排除Total列
df_top_five = df_top_five.loc[:, '1980':'2013']


# 转置数据框
df_top_five = df_top_five.transpose()


转置后的数据框包含五列,每列代表一个前五名的国家,年份作为索引。

3. 生成面积图


现在我们可以调用数据框 df_top_five 的 plot 函数来生成面积图。以下是生成面积图的代码:

import matplotlib.pyplot as plt


# 生成面积图
df_top_five.plot(kind='area')


# 添加标题和轴标签
plt.title('Immigration Trend of Top 5 Countries to Canada (1980-2013)')
plt.xlabel('Year')
plt.ylabel('Number of Immigrants')

# 显示图表
plt.show()


注意,这里我们使用内联后端生成面积图。生成的面积图描绘了从1980年到2013年移民到加拿大人数最多的五个国家的移民趋势。

总结

在本节课中,我们一起学习了面积图的基本概念和生成方法。面积图是折线图的扩展,适用于比较多个数量的累积趋势。通过排序数据框、选择特定列、转置数据框并使用Matplotlib的 plot 函数,我们可以轻松生成面积图。在实验环节中,我们将进一步探索面积图的细节,请务必完成本模块的实验部分。


下节课再见!
007:直方图绘制




在本节课中,我们将学习另一种数据可视化工具——直方图。我们将了解直方图的定义、工作原理,并学习如何使用Matplotlib库来创建直方图。


📈 什么是直方图?


直方图是一种用于表示数值数据集频率分布的图表。它的工作原理是将数值数据的范围划分为若干个区间(称为“箱”),将数据集中的每个数据点分配到一个箱中,然后计算每个箱中数据点的数量。


公式:频率 = 每个箱中的数据点数量


例如,假设数据集中数值的范围是0到34,129。创建直方图的第一步是将水平轴划分为10个等宽的箱。然后,我们通过计算有多少数据点的值落在第一个箱、第二个箱、第三个箱等范围内来构建直方图。


🛠️ 使用Matplotlib创建直方图



上一节我们介绍了直方图的基本概念,本节中我们来看看如何使用Matplotlib库来创建直方图。


首先,我们需要导入必要的库并准备数据集。数据集中的每一行代表一个国家,包含该国的元数据以及从1980年到2013年每年移民到加拿大的数量。我们将国家名称设置为每行的索引,并添加一个表示从1980年到2013年累计移民数量的列。
以下是创建直方图的步骤:
- 导入Matplotlib库及其脚本接口。
- 调用绘图函数,指定要绘制的数据列(例如2013年的移民数据),并设置图表类型为直方图。
- 为图表添加标题和坐标轴标签。
- 显示图表。
代码示例:
import matplotlib.pyplot as plt


# 假设df_canada是包含2013年移民数据的数据框
df_canada['2013'].plot(kind='hist')
plt.title('2013年移民到加拿大的分布')
plt.xlabel('移民数量')
plt.ylabel('频率')
plt.show()

🔧 优化直方图显示


然而,使用上述方法创建的直方图可能会遇到箱边界与水平轴刻度不对齐的问题,这会影响图表的可读性。为了解决这个问题,我们可以使用NumPy库的histogram函数来更精确地控制箱的划分。


以下是优化直方图的步骤:


- 导入Matplotlib和NumPy库。
- 使用NumPy的
histogram函数计算数据的频率和箱边界。 - 将这些箱边界作为参数传递给绘图函数,生成对齐的直方图。


代码示例:
import matplotlib.pyplot as plt
import numpy as np

# 计算频率和箱边界
count, bin_edges = np.histogram(df_canada['2013'])



# 绘制直方图
df_canada['2013'].plot(kind='hist', xticks=bin_edges)
plt.title('2013年移民到加拿大的分布(优化后)')
plt.xlabel('移民数量')
plt.ylabel('频率')
plt.show()

通过这种方式,我们可以生成一个箱边界与水平轴刻度对齐的直方图,使其更加清晰易读。



📚 总结


本节课中我们一起学习了直方图的定义、工作原理以及如何使用Matplotlib和NumPy库来创建和优化直方图。直方图是分析数值数据分布的重要工具,通过合理划分箱和优化显示,我们可以更有效地展示数据的频率分布。


在实验环节中,我们将进一步探索直方图的更多细节,请务必完成本模块的实验部分。希望本节课的内容能帮助你更好地理解和应用直方图。我们下节课再见!
008:条形图绘制教程

在本节课中,我们将学习一种额外的可视化工具——条形图,并了解如何使用Matplotlib库创建条形图。


📈 条形图简介

上一节我们介绍了数据可视化的基本概念,本节中我们来看看条形图。
条形图是一种非常流行的可视化工具。与直方图不同,条形图(也称为柱状图)是一种图表类型,其中每个条形的长度与其所代表项目的值成比例。它通常用于比较在特定时间点上某个变量的值。
例如,假设我们想以离散的方式可视化从1980年到2013年从冰岛到加拿大的移民情况。

一种方法是构建一个条形图,其中条形的高度代表特定年份从冰岛到加拿大的总移民人数。


🗃️ 数据准备
在介绍如何使用Matplotlib绘制条形图之前,我们先快速回顾一下我们的数据集。

数据集中的每一行代表一个国家,并包含有关该国家的元数据,例如其地理位置以及它是发展中国家还是发达国家。每一行还包含从1980年到2013年每年从该国到加拿大的移民数字。

现在,让我们处理数据框,使国家名称成为每一行的索引,这将使检索特定国家的数据行变得更加容易。此外,我们添加一个额外的列,代表从1980年到2013年每个国家年度移民的累计总和。
例如,对于阿富汗,总数是58,639;对于阿尔巴尼亚,总数是15,699,依此类推。我们将这个数据框命名为df_canada。
现在我们已经了解了数据是如何存储在df_canada数据框中的,接下来看看如何使用Matplotlib生成条形图,以可视化从1980年到2013年从冰岛到加拿大的移民情况。
🖥️ 使用Matplotlib绘制条形图
以下是使用Matplotlib绘制条形图的步骤。
首先,我们导入Matplotlib及其脚本接口。
import matplotlib.pyplot as plt
然后,我们使用年份变量创建一个新的数据框,我们将其命名为df_iceland,其中包含与从冰岛到加拿大的年度移民相关的数据,并排除“总计”列。
years = list(range(1980, 2014))
df_iceland = df_canada.loc['Iceland', years]

接着,我们在df_iceland上调用绘图函数,并设置kind='bar'以生成条形图。

df_iceland.plot(kind='bar')
为了完善图形,我们为其添加标题并标注坐标轴。
plt.title('Immigration from Iceland to Canada (1980-2013)')
plt.xlabel('Year')
plt.ylabel('Number of Immigrants')


最后,我们调用show函数来显示图形。


plt.show()
这样,我们就得到了一个描绘从1980年到2013年从冰岛到加拿大移民情况的条形图。

🔍 解读条形图

通过检查条形图,我们注意到自2010年以来,从冰岛到加拿大的移民呈上升趋势。
我相信好奇的你已经想知道这种上升趋势背后的原因了。在实验环节中,我们揭示了原因,并学习了如何创建带有水平条形的条形图,因此请务必完成本模块的实验环节。
📝 总结
本节课中我们一起学习了条形图的基本概念、数据准备步骤以及如何使用Matplotlib库绘制条形图。条形图是用于比较类别数据的强大工具,通过本课的学习,你应该能够创建并解读基本的条形图。
我们下节课再见。
009:饼图绘制


在本节课中,我们将学习另一种数据可视化工具——饼图,并掌握如何使用Matplotlib库来创建它。
饼图是一种圆形统计图表,通过分割成若干扇形来展示数值比例。例如,2015年加拿大联邦选举的饼图显示,自由党(红色部分)赢得了超过50%的众议院席位,因此红色占据了圆形的一半以上。


数据集回顾
在开始编写代码之前,我们先快速回顾一下数据集。数据集中的每一行代表一个国家,包含该国的元数据(如地理位置、发展状况)以及从1980年到2013年每年移民到加拿大的数量。
为了让数据检索更便捷,我们将国家名称设置为每行的索引,并新增一列,用于记录每个国家从1980年到2013年的累计移民总数。例如,阿富汗的累计移民总数为58,639,阿尔巴尼亚为15,699。我们将这个处理后的数据框命名为df_canada。
按大洲分组数据
假设我们希望按大洲可视化移民到加拿大的分布情况。第一步是使用Continent列将数据按大洲分组。我们使用pandas的groupby函数对df_canada进行分组,并对属于同一大洲的国家的移民数量进行求和。


以下是分组后的数据框,我们将其命名为df_continents。该数据框包含6行(每个大洲一行)和35列(代表1980年至2013年的年份,以及每个大洲的累计移民总数)。

创建饼图


现在,我们开始创建饼图。首先,导入必要的库:
import matplotlib as mpl
import matplotlib.pyplot as plt

接着,调用df_continents数据框中Total列的plot函数,并设置kind='pie'以生成饼图:

df_continents['Total'].plot(kind='pie')


然后,为图表添加标题,并调用show函数显示图表:

plt.title('Immigration to Canada by Continent (1980-2013)')
plt.show()
至此,我们成功创建了一个饼图,展示了1980年至2013年各洲移民到加拿大的比例。



饼图的局限性

需要指出的是,饼图在某些情况下存在争议。许多反对者认为饼图难以准确、一致地展示数据。相比之下,条形图在呈现数据一致性和传达信息方面更为有效。


如果你对反对饼图的论点感兴趣,可以参考视频下方链接中的文章,该文章详细讨论了饼图的缺陷。


总结

本节课中,我们一起学习了饼图的基本概念、如何按大洲分组数据,以及使用Matplotlib创建饼图的步骤。我们还简要探讨了饼图的局限性。在实验环节中,你将有机会将基础的饼图优化为更专业、美观的版本。请务必完成本模块的实验部分,以巩固所学知识。
010:箱线图绘制



在本节课中,我们将学习另一种数据可视化工具——箱线图,并了解如何使用Matplotlib库来创建箱线图。


箱线图是一种通过五个主要维度来统计表示数据分布的方法。



📦 什么是箱线图?


箱线图通过五个关键维度来展示数据的统计分布。这五个维度分别是:最小值、第一四分位数、中位数、第三四分位数和最大值。此外,箱线图还会将超出上下极值的异常值显示为单独的点。


上一节我们介绍了箱线图的基本概念,本节中我们来看看这五个维度的具体定义。


以下是箱线图的五个核心维度:



- 最小值:这是排序后数据中的最小数值。其值可以通过公式
最小值 = 第一四分位数 - 1.5 * IQR计算得出,其中IQR是四分位距。 - 第一四分位数:这是数据排序后位于25%位置的值。换句话说,有25%的数据点小于这个值。
- 中位数:这是排序后数据的中间值。
- 第三四分位数:这是数据排序后位于75%位置的值。换句话说,有75%的数据点小于这个值。
- 最大值:这是排序后数据中的最大数值。其值可以通过公式
最大值 = 第三四分位数 + 1.5 * IQR计算得出。

🛠️ 使用Matplotlib创建箱线图
现在,让我们看看如何使用Matplotlib来创建一个箱线图。在开始编写代码之前,我们先快速回顾一下我们将要使用的数据集。
我们的数据集每一行代表一个国家,包含了该国的地理元数据(如地理位置、属于发展中国家还是发达国家)以及从1980年到2013年每年移民到加拿大的人数。
为了方便操作,我们将对数据框进行处理,使国家名称成为每行的索引。这样,检索特定国家的数据会更容易。同时,我们添加一个名为“Total”的新列,用于表示每个国家从1980年到2013年移民人数的累计总和。我们将这个处理后的数据框命名为 df_canada。



假设我们想要创建一个箱线图来可视化日本到加拿大的移民情况。


以下是创建箱线图的步骤:


- 首先,导入必要的库:Matplotlib。
import matplotlib as mpl import matplotlib.pyplot as plt - 从主数据框
df_canada中提取日本的数据,并排除“Total”列。years = list(map(str, range(1980, 2014))) df_japan = df_canada.loc[['Japan'], years] - 将得到的数据框进行转置,使其格式符合创建箱线图的要求。
df_japan = df_japan.T - 在
df_japan数据框上调用plot函数,并设置kind='box'来生成箱线图。df_japan.plot(kind='box', figsize=(8, 6)) - 为图形添加标题和纵轴标签,使其更完整。
plt.title('Box plot of Japanese Immigrants from 1980 - 2013') plt.ylabel('Number of Immigrants') - 最后,调用
show函数来显示图形。plt.show()


完成以上步骤后,你就得到了一个展示1980年至2013年日本移民到加拿大数据分布的箱线图。




🧪 后续练习

在实验环节中,我们将更详细地探索箱线图,学习如何创建多个箱线图以及水平箱线图。请务必完成本模块的实验部分。


📝 总结



本节课中我们一起学习了箱线图。我们了解了箱线图如何通过最小值、第一四分位数、中位数、第三四分位数和最大值这五个维度来展示数据的统计分布,并掌握了使用Matplotlib库从数据集中提取特定国家数据并绘制箱线图的具体步骤。
011:散点图绘制教程


在本节课中,我们将学习一种额外的数据可视化工具——散点图,并了解如何使用Matplotlib库来创建它。

什么是散点图? 🤔


散点图是一种图表类型,用于展示两个变量之间的数值关系。


通常,散点图将一个因变量与一个自变量进行对比,以确定这两个变量之间是否存在相关性。

例如,下图展示了一个收入与受教育年限的散点图。
通过观察图表数据,可以得出结论:受教育年限更长的个体,其收入可能高于受教育年限较短的个体。



如何用Matplotlib创建散点图? 🛠️
上一节我们介绍了散点图的基本概念,本节中我们来看看如何使用代码创建散点图。在编写代码之前,我们先快速回顾一下数据。
我们的数据集中,每一行代表一个国家,并包含该国的元数据,例如地理位置以及属于发展中国家还是发达国家。每一行还包含了从1980年到2013年该国每年移民到加拿大的数量。

现在,我们对数据框进行处理,使国家名称成为每一行的索引。这将使检索特定国家的数据变得更加容易。同时,我们添加一个新列,表示从1980年到2013年每个国家移民数量的累计总和。例如,阿富汗的总数是58,639,阿尔巴尼亚是15,699,依此类推。我们将这个数据框命名为df_canada。
了解了数据在df_canada数据框中的存储方式后,假设我们想要绘制一个散点图,展示从1980年到2013年每年移民到加拿大的总人数。
为了实现这个目标,我们首先需要创建一个新的数据框,显示每一年以及当年来自全球所有国家的移民总人数,如下图所示。
我们将这个新数据框命名为df_total。



在实验环节,我们将一起学习如何从df_canada创建df_total数据框,请务必完成本模块的实验部分。

绘制散点图的步骤 📈


接下来,我们按照常规步骤进行。首先导入Matplotlib库及其脚本层Pyplot接口。
import matplotlib as mpl
import matplotlib.pyplot as plt



然后,我们在df_total数据框上调用plot函数,并设置kind='scatter'来生成散点图。

df_total.plot(kind='scatter', x='year', y='total')


与其他数据可视化工具不同,仅传递kind参数不足以生成散点图。我们还需要将要在水平轴上绘制的变量作为x参数传递,将要在垂直轴上绘制的变量作为y参数传递。
在本例中,我们将year列作为x参数,将total列作为y参数。

为了完善图表,我们为其添加标题并标注坐标轴。




plt.title('Total Immigration to Canada (1980-2013)')
plt.xlabel('Year')
plt.ylabel('Number of Immigrants')

最后,我们调用show函数来显示图表。

plt.show()

这样,我们就得到了一个散点图,展示了从1980年到2013年全球各国移民到加拿大的总人数。



解读散点图 📊

散点图清晰地描绘了移民数量随时间推移的整体上升趋势。
在实验环节,我们将更详细地探索散点图,并学习一种非常有趣的散点图变体——气泡图,以及如何使用Matplotlib创建它。请务必完成本模块的实验部分。



总结 🎯

本节课中我们一起学习了散点图的概念及其在数据可视化中的应用。我们了解了如何使用Matplotlib库创建散点图,包括数据准备、图表绘制和结果解读。散点图是分析两个变量之间关系的强大工具,能够直观地展示数据趋势和相关性。
012:华夫饼图绘制 🧇

在本节课中,我们将学习一种被视为高级可视化工具的方法——华夫饼图。我们将了解它的定义、用途,并简要介绍其实现原理。


什么是华夫饼图?🧇

华夫饼图是一种将数据与整体关系可视化,或突出显示相对于给定阈值的进展情况的优秀方法。

华夫饼图的应用示例 📈


例如,假设从斯堪的纳维亚地区到加拿大的移民仅由来自丹麦、挪威和瑞典的移民构成。我们想要可视化每个国家对斯堪的纳维亚地区移民总量的贡献比例。
华夫饼图的绘制原理 ⚙️

上一节我们了解了华夫饼图的应用场景,本节中我们来看看它的核心绘制原理。
其主要思想是:对于一个定义了目标高度和宽度的华夫饼图,每个国家的贡献值会被转换为一定数量的方块(tiles),这个数量与该国家对总量的贡献成正比。


公式表示:某国家的方块数 ≈ (该国贡献值 / 总贡献值) * (图表总方块数)

贡献越大,方块数量就越多。当所有方块组合在一起时,其外观类似于华夫饼,因此得名“华夫饼图”。
实现说明与课程总结 📝
遗憾的是,Matplotlib库没有内置创建华夫饼图的函数。因此,在实验环节中,我将引导你完成创建自定义Python函数来绘制华夫饼图的过程。完成本模块的实验课程非常重要。
本节课中我们一起学习了华夫饼图的基本概念、用途及其核心绘制原理。我们了解到它是一种通过方块比例来展示部分与整体关系的有效可视化工具。
013:词云生成 ☁️📊

在本节课中,我们将学习另一种高级可视化工具——词云。词云能够直观地展示文本数据中不同词汇的重要性,帮助我们快速洞察文本的核心主题。

什么是词云? 🤔
词云是一种对文本中不同词汇重要性进行视觉化描绘的工具。


词云的工作原理非常简单:在文本数据源中,某个特定词汇出现的频率越高,它在词云中显示得就越大、越醒目。
词云的作用与示例 📈

假设我们有一些关于招聘的文本数据,可以生成如下所示的词云。


这个词云告诉我们,“招聘”、“人才”、“候选人”等词汇在这些文本文档中非常突出。

如果我们对这些文档的内容一无所知,词云可以非常有效地帮助我们为未知的文本数据分配一个主题。
如何在Python中生成词云? 🛠️
不幸的是,与华夫饼图一样,Matplotlib库没有内置生成词云的功能。
然而,幸运的是,由Andrea Muer创建的一个用于生成词云的Python库是公开可用的。在接下来的实验环节中,我们将学习如何使用Muer的词云生成器,并创建叠加在不同背景图像上的有趣词云。
请务必完成本模块的实验部分。
总结 📝
本节课我们一起学习了词云的概念、作用及其在Python中的实现方式。词云是一种强大的文本数据可视化工具,能够快速揭示文本中的关键主题和词汇频率。
我们下个视频再见。
014:Seaborn与回归图 📈

在本节课中,我们将学习Python中的一个新的数据可视化库——Seaborn。我们将了解它的基本概念,并重点学习如何使用Seaborn高效地创建带有回归线的统计图形。

什么是Seaborn?🤔


上一节我们介绍了课程目标,本节中我们来看看Seaborn是什么。

Seaborn是另一个Python数据可视化库,但它实际上是基于Matplotlib构建的。

它主要被设计用来提供一个高级接口,用于绘制美观的统计图形,例如回归图、箱线图等。

Seaborn使得创建图表非常高效。使用Seaborn,你可以用比Matplotlib少五倍的代码量生成图表。

使用Seaborn创建回归图 📉

了解了Seaborn的基本概念后,本节我们来看看如何使用它创建一个具体的统计图形——回归图。


假设我们有一个名为df_tot的数据框,它包含了从1980年到2013年加拿大移民的总数数据。

数据框的一列是年份,另一列是对应的移民总数。

我们想要创建一个散点图,并附上回归线,以突出显示数据中的任何趋势。

使用Seaborn,你只需一行代码就可以完成所有这些操作。

以下是实现步骤:


首先,我们导入Seaborn库,通常将其别名为sns:
import seaborn as sns
然后,我们调用Seaborn的regplot函数:
sns.regplot(x='year', y='total', data=df_tot)


我们基本上告诉函数:使用数据框df_tot,在横轴上绘制“year”列,在纵轴上绘制“total”列。
这一行代码的输出结果是一个散点图,图中包含一条回归线。不仅如此,它还自动包含了95%的置信区间。



自定义回归图 🎨
上一节我们看到了创建回归图是多么简单,本节中我们来看看如何对其进行个性化定制。

Seaborn的regplot函数也接受额外的参数,用于进行任何个性化定制。

例如,你可以使用color参数来改变颜色。让我们将颜色改为绿色:
sns.regplot(x='year', y='total', data=df_tot, color='green')
此外,你还可以使用marker参数来改变标记点的形状。让我们将标记点的形状从默认的圆形改为加号形状:
sns.regplot(x='year', y='total', data=df_tot, color='green', marker='+')



总结 📝
本节课中我们一起学习了Seaborn数据可视化库。我们了解到Seaborn是基于Matplotlib构建的高级库,能够用非常简洁的代码创建美观的统计图形。我们重点学习了如何使用sns.regplot()函数快速生成带有回归线和置信区间的散点图,并探索了如何通过参数自定义图形的颜色和标记点形状。

在实验环节中,我们将更详细地探索Seaborn的回归图功能,请务必完成本模块的实验部分。


关于Seaborn和回归图的简短介绍到此结束,我们下个视频再见。
015:Folium地图库入门

在本节课中,我们将学习一个非常有趣的Python数据可视化库:Folium。

Folium是一个强大的Python数据可视化库,其主要设计目的是帮助人们可视化地理空间数据。

使用Folium,只要你知道某个地点的纬度和经度值,就可以创建世界上任何位置的地图。

你还可以在地图上叠加标记点,甚至创建标记点簇,以实现酷炫且有趣的可视化效果。

此外,你可以创建不同风格的地图,例如街道地图、地形图等,我们稍后会进行探讨。

创建世界地图 🌍
使用Folium创建世界地图非常简单直接。


你只需调用 map 函数即可。
Folium创建的地图有一个非常有趣的特点:它们是交互式的。在地图渲染完成后,你可以进行缩放,这是一个非常有用的功能。

默认的地图样式是OpenStreetMap。当你放大时,它会显示区域的街道视图;当你完全缩小时,它会显示世界各国的边界。

创建特定区域的地图 🎯
现在,让我们创建一个以加拿大为中心的世界地图。


为此,我们使用 location 参数传入加拿大的纬度和经度值。
在Folium中,你可以使用 zoom_start 参数设置初始缩放级别。

之所以称为“初始”级别,是因为在地图渲染后,你可以通过放大或缩小轻松地改变缩放级别。

你可以尝试调整这个参数,看看不同值对应的初始缩放级别是什么样子。
现在,让我们将加拿大地图的缩放级别设置为4。

这样,我们就得到了一个以加拿大为中心的世界地图。


探索不同的地图样式 🎨
Folium另一个令人惊叹的功能是,你可以使用 tiles 参数创建不同的地图样式。


让我们为加拿大创建一个“Stamen Toner”风格的地图。这种样式非常适合可视化和探索河流蜿蜒和海岸带。
另一种样式是“Stamen Terrain”。

让我们为加拿大创建一个“Stamen Terrain”风格的地图。这种样式非常适合可视化山体阴影和自然植被颜色。


总结 📝
本节课中,我们一起学习了Folium地图库的基础知识。


我们了解了Folium是一个用于地理空间数据可视化的强大库。
我们学习了如何创建世界地图,如何通过指定经纬度来聚焦特定区域,以及如何设置初始缩放级别。


我们还探索了如何通过 tiles 参数来改变地图的视觉样式,例如“Stamen Toner”和“Stamen Terrain”。
Folium地图的交互性是其核心优势,允许用户在渲染后自由探索。
通过掌握这些基础,你已经可以开始使用Folium创建自己的交互式地理可视化项目了。
016:在地图上添加标记

在本节课中,我们将继续学习使用 Folium 库,并掌握如何在地图上叠加标记点,以创建更具信息量的可视化效果。


在上一节视频中,我们学习了如何创建一个以加拿大为中心的世界地图。

因此,让我们再次创建这个地图,这次将其命名为 canada_map。

import folium
canada_map = folium.Map(location=[56.130, -106.35], zoom_start=4)
安大略省是加拿大的一个省份,拥有加拿大约40%的人口,被认为是加拿大人口最多的省份。


让我们看看如何为安大略省的中心位置添加一个圆形标记。

为此,我们需要创建一个所谓的“要素组”。

让我们继续创建一个名为 ontario 的要素组。

ontario = folium.FeatureGroup(name="Ontario")
现在,当一个要素组被创建时,它是空的。这意味着下一步是开始创建所谓的“子元素”,并将它们添加到要素组中。


因此,让我们创建一个子元素,其形式为一个位于安大略省中心的红色圆形标记。我们通过传入其纬度和经度值来指定该子元素的位置。
ontario.add_child(
folium.CircleMarker(
location=[51.2538, -85.3232],
radius=50,
color='red',
fill=True,
fill_color='red'
)
)
一旦我们完成了向要素组添加子元素,就将该要素组添加到地图上。
canada_map.add_child(ontario)
canada_map
这样,我们就得到了一个叠加在地图上的红色圆形标记,它被添加到了安大略省的中心位置。
现在,如果能给这个标记加上标签,以便让其他人知道它实际代表什么,那就更好了。
为此,我们只需使用 Marker 函数,并通过 popup 参数传入我们想要添加到此标记的任何文本。
ontario.add_child(
folium.Marker(
location=[51.2538, -85.3232],
popup='Ontario'
)
)
canada_map.add_child(ontario)
canada_map
现在,我们的标记在被点击时会显示“Ontario”。
在实验环节,我们将研究一个真实世界的例子,探索旧金山的犯罪率。我们将创建一张旧金山的地图,并在地图上叠加成千上万个这样的标记。不仅如此,我还会向你展示如何创建标记簇,以使你的地图看起来不那么拥挤。本模块的实验环节非常有趣,请务必完成它。
通过以上内容,我们结束了关于使用 Folium 在地图上添加标记的视频讲解。我们下个视频再见。
017:区域统计地图 🌍
在本节课中,我们将学习如何创建一种特殊的地图类型——区域统计地图(Choropleth Map)。
什么是区域统计地图? 🤔
上一节我们介绍了基础地图的创建,本节中我们来看看区域统计地图。
区域统计地图是一种专题地图,其中区域根据所展示的统计变量(如人口密度或人均收入)的测量值按比例进行着色或填充图案。测量值越高,颜色越深。
例如,左侧的地图是一张展示每千名新生儿中婴儿死亡率的世界区域统计地图。颜色越深,婴儿死亡率越高。根据地图,非洲国家的婴儿死亡率非常高,其中一些国家报告的比率超过每千名新生儿160例。同样,右侧的地图是一张展示美国各州每平方英里人口的区域统计地图。颜色越深,人口越密集。根据地图,美国东部各州的人口往往比西部各州更密集,加利福尼亚州是一个例外。
创建区域统计地图的前提 📁
为了创建感兴趣区域的区域统计地图,Folium库需要一个包含该区域地理空间数据的GeoJSON文件。对于世界区域统计地图,我们需要一个列出每个国家及其定义边界所需地理空间数据的GeoJSON文件。
以下是GeoJSON文件为每个国家包含信息的示例(以文莱为例):
- 国家名称
- 国家ID
- 几何形状
- 定义国家边界的坐标

实践:创建世界移民区域统计地图 🛠️

现在,让我们看看如何创建一张像这样的、展示移民到加拿大的情况的世界区域统计地图。
在讲解实现代码之前,我们先快速回顾一下我们的数据集。数据集中的每一行代表一个国家,并包含该国家的元数据,如其地理位置以及是发展中国家还是发达国家。每一行还包含从1980年到2013年每年从该国移民到加拿大的数字。
以下是数据处理步骤:
我们添加一个额外的列,代表从1980年到2013年每年从每个国家移民到加拿大的累计总和。例如,阿富汗的总数是58,639,阿尔巴尼亚是15,699,依此类推。我们将这个数据框命名为 df_canada。
现在我们已经知道数据是如何存储在 df_canada 数据框中的,接下来看看如何生成展示移民到加拿大的世界区域统计地图。
我们现在应该是使用Folium创建世界地图的专家了,所以让我们直接创建一个世界地图,但这次使用Mapbox Bright图块集。
结果是一张显示每个国家名称的漂亮世界地图。
要将此地图转换为区域统计地图,我们首先定义一个指向GeoJSON文件的变量,然后将 choropleth 函数应用到我们的世界地图上。我们告诉它使用 df_canada 数据框中的“国家”和“总计”列,并使用国家名称在GeoJSON文件中查找每个国家的地理空间信息。

核心代码如下:
# 假设 world_map 是已创建的基础世界地图对象,geo_json_file 是GeoJSON文件路径
world_map.choropleth(
geo_data=geo_json_file,
data=df_canada,
columns=['Country', 'Total'],
key_on='feature.properties.name'
)
这样,我们就得到了一张展示全球不同国家移民到加拿大的强度的区域统计地图。
在实验环节,我们将更详细地探索区域统计地图,请务必完成本模块的实验部分。
总结 📝
本节课中我们一起学习了区域统计地图的概念。我们了解到它是一种通过颜色深浅表示数据值大小的专题地图。我们掌握了创建区域统计地图的关键前提——GeoJSON文件,并实践了使用Folium库将基础世界地图转换为展示具体数据(如移民数据)的区域统计地图的完整流程。
018:仪表盘概述


在本节课中,我们将学习交互式数据应用如何帮助提升业务表现,并了解可用于构建此类应用的工具。

概述

仪表盘通过在一个集中的位置展示实时数据和合适的图表,使利益相关者能够轻松理解业务的运行状况、存在的问题以及需要改进的方面。这有助于企业做出明智的决策,从而提升业务表现。通常,最佳的仪表盘能够回答关键的商业问题。


仪表盘的价值:一个案例
假设你被分配了一项任务:监控并报告美国国内航班的运营表现。


以下是年度审查报告需要包含的项目:
- 2019年航班数量排名前十的航空公司。
- 2019年按月份划分的航班数量。
- 从加利福尼亚州出发,按距离组划分的前往其他州的旅客数量。
让我们看看呈现此类报告的两种方式。
报告类型一:传统表格报告

第一种方式是通过表格呈现信息,并将从表格中得出的推论记录在案以供参考。


报告类型二:交互式仪表盘报告


第二种方式是以仪表盘格式呈现相同的报告。

在仪表盘中,将鼠标悬停在每个图表上,可以在底部的旭日图中查看数据点的详细信息。你可以点击不同的数字,向下钻取层级,获取每个细分部分的详细信息。


你能观察到两种方式在呈现结果上的差异吗?

如果需要基于实时数据而非静态数据生成报告,情况又会如何?此外,使用表格和文档呈现结果耗时较长,视觉吸引力较低,且更难以理解。


数据科学家需要能够围绕发现创建并传达一个故事,让利益相关者易于理解。考虑到这一点,仪表盘是理想的选择。


Python中的Web仪表盘工具

接下来,我们来看看Python中可用的基于Web的仪表盘工具选项。
Dash
Dash 是一个用于构建Web分析应用的Python框架。它构建在 Flask、Plotly.js 和 React.js 之上。Dash非常适合构建具有高度自定义用户界面的数据可视化应用。



Panel



Panel 可以与来自 Bokeh、Matplotlib、HoloViews 以及许多其他Python绘图库的可视化图表协同工作,使它们能够单独或与控制它们的交互式小部件结合时即时查看。Panel在Jupyter Notebook中同样表现优异,可用于创建快速数据探索工具。它也可以用于独立部署的应用和仪表盘,让你可以根据需要在不同场景间轻松切换。


Voila


Voila 可以将Jupyter Notebook转换为独立的Web应用程序。它可以与Jupyter Flex等独立的布局工具或Voila Butify等模板一起使用。

Streamlit

Streamlit 可以轻松地将数据脚本转换为可共享的Web应用,其核心应用理念有三点:
- 拥抱Python脚本。
- 将小部件视为变量。
- 重用数据和计算。
其他工具



以下是其他一些可用于构建仪表盘的工具:
- Bokeh: 一个绘图库,也是一个部件和应用库。它充当图表和仪表盘的服务端。Panel就是构建在Bokeh之上的Web仪表盘工具之一。
- ipywidgets: 提供了一系列与Jupyter兼容的小部件,以及一个受许多Python库支持的接口。但共享仪表盘需要一个像Voila这样的独立可部署服务器。
- Matplotlib: 一个用于在Python中创建静态、动画和交互式可视化的综合库。
- Bottle: 允许用户使用纯Python构建仪表盘。
- Flask: 一个Python后端Web服务器,可用于构建任意网站,包括那些包含作为Flask仪表盘功能的Python图表的网站。


你可以从源链接了解更多关于这些工具的信息。


在本课程中,我们将重点学习 Dash。


总结

本节课我们一起学习了仪表盘在提升业务洞察和决策效率方面的重要价值。我们通过一个航班数据报告的案例,对比了传统表格报告与交互式仪表盘报告的差异,明确了仪表盘在实时性、交互性和易理解性上的优势。最后,我们概述了Python生态中主流的Web仪表盘构建工具,如Dash、Panel、Voila和Streamlit等,并明确了本课程将重点深入讲解Dash框架。
019:Plotly可视化入门

在本节课中,我们将要学习Plotly Python库的基础知识。Plotly是一个功能强大的交互式绘图库,支持多种图表类型,适用于数据科学和可视化任务。

🎯 什么是Plotly?
Plotly是一个交互式的开源绘图库,支持超过40种独特的图表类型。它提供Python、R和JavaScript版本。

Plotly Python库构建于Plotly JavaScript库之上,包含统计、金融、地图、科学和三维数据等多种图表类型。使用Plotly Python创建的基于Web的可视化图表可以在Jupyter Notebook中显示,保存为独立的HTML文件,或作为使用Dash构建的纯Python Web应用程序的一部分。
本节课的重点将放在Plotly的两个子模块上:plotly.graph_objects和plotly.express。
🔧 Plotly Graph Objects 模块
上一节我们介绍了Plotly的基本概念,本节中我们来看看plotly.graph_objects模块。这是用于处理图形、轨迹和布局的低级接口。

plotly.graph_objects模块提供了一个自动生成的类层次结构,称为图形对象,用于表示具有顶层类plotly.graph_objects.Figure的图形。

以下是使用plotly.graph_objects创建简单折线图的步骤:
首先,导入所需的包。这里我们将plotly.graph_objects导入为go。
import plotly.graph_objects as go
import numpy as np

然后,使用NumPy生成样本数据。
x = np.arange(10)
y = np.random.randn(10)

plotly.graph_objects包含一个图形对象,它具有字典结构。由于我们在上一张幻灯片中将plotly.graph_objects导入为go,因此go就是图形对象。
通过更新go.Figure关键字的值来绘制图表。我们将通过添加散点类型的轨迹来创建图形。

fig = go.Figure(data=go.Scatter(x=x, y=y, mode='lines'))
接下来,使用update_layout方法更新图形的布局。这里我们更新X轴、Y轴和图表标题。
fig.update_layout(title='简单折线图示例',
xaxis_title='X轴',
yaxis_title='Y轴')
fig.show()
🚀 Plotly Express 模块

上一节我们使用graph_objects创建了图表,本节中我们来看看更高级的plotly.express模块。plotly.express是Plotly的高级封装,是使用更简单语法创建Plotly提供的大多数常见图形的推荐起点,它在内部使用图形对象。
以下是使用plotly.express创建相同折线图的方法:
使用Plotly Express,整个折线图可以通过单个命令创建。可视化自动具有交互性。Plotly Express使可视化易于创建和修改。
import plotly.express as px
import numpy as np

x = np.arange(10)
y = np.random.randn(10)

fig = px.line(x=x, y=y, title='使用Plotly Express创建的折线图')
fig.update_layout(xaxis_title='X轴', yaxis_title='Y轴')
fig.show()

现在是时候动手实践Plotly库了。接下来将是一个实验环节。

🧪 实验环节:使用航空报告数据
我们将使用Data Asset Exchange的航空报告数据库来演示如何使用Plotly图形对象和Express创建图表。
以下是航空报告数据集的简要概述:
报告承运人准点性能数据集包含大约2亿个美国国内航班的信息,这些信息报告给美国运输统计局。数据包含每个航班的基本信息,例如日期、时间、出发机场、到达机场,以及如果适用的话,航班延误的时间和延误原因的信息。


现在让我们开始实验。




本节课中我们一起学习了Plotly Python库的基础知识,包括plotly.graph_objects和plotly.express两个核心模块的使用方法。我们了解了如何创建简单的折线图,并介绍了即将在实验环节中使用的航空数据集。Plotly的强大功能和易用性使其成为数据可视化的优秀工具。
020:Dash框架导论 🚀
在本节课中,我们将学习Dash库的概述。Dash是一个开源的Python用户界面库,用于创建响应式的、基于Web的应用程序。它企业级就绪,是Plotly开源工具中的一等成员。Dash应用程序是运行Flask并通过HTTP请求通信JSON数据包的Web服务器。Dash的前端使用React.js渲染组件。使用Dash构建图形用户界面非常容易,因为它抽象了构建应用程序所需的所有技术。Dash是声明式和响应式的。Dash输出可以在Web浏览器中渲染,并可以部署到服务器。Dash使用一个简单的响应式装饰器将代码绑定到UI。这本质上是移动端和跨平台就绪的。
Dash库概述 📊
上一节我们介绍了Dash的基本概念,本节中我们来看看Dash的核心组成部分。
Dash应用程序由两个主要部分组成:布局和交互性。布局决定了应用程序的外观,包括使用哪些图表以及将它们放置在何处。交互性则允许用户与应用程序进行动态交互。
Dash的组件构成 🧩
Dash的核心功能通过其组件库实现。主要有两类组件:核心组件和HTML组件。
以下是导入这些组件的标准方式:
import dash_core_components as dcc
import dash_html_components as html
HTML组件
dash_html_components库为每一个HTML标签提供了一个组件。你可以使用这个库,通过Python数据结构来组合你的布局。该库为所有HTML标签提供了对应的类。关键字参数描述了HTML属性,如style、className和id。虽然不需要HTML或CSS知识,但它们有助于美化仪表板。
让我们看一个如何使用HTML组件的例子。


我们首先创建一个Dash应用程序。然后,在应用程序布局中创建分区(division),并向其中添加组件。在最外层的分区中,我们首先使用HTML标题组件H1为应用程序提供一个名称。style参数用于更改标题的字体颜色、大小和边框。接下来,我们将使用HTML段落组件P向页面添加段落内容。分区可以嵌套在外部分区内部创建。

在这里,我们为新创建的分区提供内容,并使用style参数对其进行样式设置。为了将所有内容整合到应用程序布局中,需要创建一个HTML分区并添加组件。多个分区可以被添加到外部应用程序布局中。

核心组件
dash_core_components描述了更高级别的交互式组件,这些组件通过React.js库使用JavaScript、HTML和CSS生成。核心组件的一些例子包括创建滑块、输入区域、复选框和日期选择器。你可以使用幻灯片末尾提供的参考链接探索其他组件。

现在,让我们看看如何向应用程序添加滑块和下拉菜单。

对于下拉菜单,我们使用dcc.Dropdown组件。我们将在options参数下创建一个字典列表作为下拉列表。label将保存下拉菜单显示的标签名称,value将保存标签的值。我们还可以使用value参数提供默认的下拉显示标签。
对于滑块,我们使用dcc.Slider组件,并向滑块提供最小值和最大值。marks参数用于添加滑块标记,value参数用于添加默认值。

总结 ✨

本节课中,我们一起学习了Dash框架的基础知识。我们了解了Dash是一个用于构建交互式Web应用的Python库,它由布局(HTML组件)和交互性(核心组件)两部分构成。通过导入dash_html_components和dash_core_components,我们可以使用Python代码轻松地创建用户界面元素,如标题、段落、下拉菜单和滑块,而无需深入掌握前端技术。Dash的声明式和响应式特性使得构建数据可视化仪表板变得简单高效。
021:使用回调函数构建交互式仪表盘

在本节课中,我们将学习如何使用Dash框架中的回调函数,将核心组件与HTML组件连接起来,从而创建交互式数据可视化仪表盘。回调函数是Dash实现交互性的核心机制。

🔗 回调函数简介

上一节我们介绍了Dash应用的基本布局。本节中我们来看看如何让组件之间“对话”,即响应用户交互。
回调函数是一个Python函数,当输入组件的属性发生变化时,Dash会自动调用它。该函数使用 @app.callback 装饰器进行装饰。
@app.callback 装饰器告诉Dash:每当输入组件的值发生变化时,就调用被装饰器包裹的回调函数,并随之更新应用布局中输出组件的属性。
🧱 回调函数的基本结构


以下是构建回调函数的基本步骤:
首先,创建一个函数,该函数执行操作以返回输出组件所需的理想结果。
def update_output(input_value):
# 执行一些操作
result = perform_operation(input_value)
return result
然后,使用 @app.callback 装饰器装饰这个回调函数。该装饰器接收两个主要参数:
- Output:将回调函数返回的结果设置给指定ID的组件。
- Input:将提供给回调函数的输入设置为指定ID的组件。
通过这两个参数,我们将输入和输出连接到所需的组件属性。

📈 实践案例:单输入回调

我们将通过一个使用航空公司数据的例子来具体实践。这个用例的目标是:根据用户输入的年份,提取该年份航班数量排名前10的航空公司。输出图表会随着输入年份的变化而更新。
步骤一:导入包与加载数据
首先,导入所需的包。除了之前用到的,这里新增了从 dash.dependencies 导入 Input 和 Output,它们将用于回调函数。

import pandas as pd
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output

# 将航空公司数据读入Pandas DataFrame
df = pd.read_csv(‘airline_data.csv‘)
我们在应用启动时加载数据框,它可以在回调函数内部被读取。
步骤二:设计应用布局
我们开始设计Dash应用的布局,添加必要的组件。
app = dash.Dash(__name__)
app.layout = html.Div([
html.H1(‘航空公司航班数量分析‘, style={‘textAlign‘: ‘center‘}),
html.Div([
“输入年份: ”,
dcc.Input(id=‘input-year‘, value=2010, type=‘number‘)
]),
html.Br(),
html.Br(),
dcc.Graph(id=‘bar-plot‘)
])
在Dash中,应用的输入和输出就是特定组件的属性。在本例中:
- 我们的输入是ID为
‘input-year‘的组件的value属性(默认值为2010)。我们将在回调函数中更新这个值。 - 我们的输出是ID为
‘bar-plot‘的dcc.Graph组件的figure属性。


步骤三:定义回调函数



现在,我们添加回调装饰器并定义函数。


@app.callback(
Output(component_id=‘bar-plot‘, component_property=‘figure‘),
Input(component_id=‘input-year‘, component_property=‘value‘)
)
def get_graph(entered_year):
# 1. 使用输入的年份筛选数据
df_year = df[df[‘Year‘] == int(entered_year)]
# 2. 按航空公司分组并计算航班数,取前10名
df_carrier = df_year.groupby(‘Carrier‘)[‘Flights‘].sum().nlargest(10).reset_index()
# 3. 创建条形图
fig = {
‘data‘: [
{‘x‘: df_carrier[‘Carrier‘], ‘y‘: df_carrier[‘Flights‘], ‘type‘: ‘bar‘, ‘name‘: ‘Flights‘}
],
‘layout‘: {
‘title‘: f‘{entered_year}年航班数量最多的航空公司‘
}
}
return fig

component_id 和 component_property 关键字是可选的,这里为了清晰而包含。回调函数 get_graph 接收输入的年份作为参数,使用该年份从数据中提取所需信息,最后创建并返回更新后的图表。
步骤四:运行应用
if __name__ == ‘__main__‘:
app.run_server(debug=True)
这是代码的输出效果。初始输入年份是2010。请注意,当我们更新年份时,图表会相应更新为该年份的数据。



🎛️ 实践案例:多输入回调
第二个例子是带有两个输入的回调。它与单输入回调类似,只有几处变化。


更新布局
我们在布局中再添加一个文本输入框。

app.layout = html.Div([
html.H1(‘特定州航空公司分析‘, style={‘textAlign‘: ‘center‘}),
html.Div([
“输入年份: ”,
dcc.Input(id=‘input-year‘, value=2010, type=‘number‘),
“ 输入州代码 (如 AL): ”,
dcc.Input(id=‘input-state‘, value=‘AL‘, type=‘text‘)
]),
html.Br(),
html.Br(),
dcc.Graph(id=‘bar-plot‘)
])

更新回调装饰器和函数
现在,我们将新的输入组件ID ‘input-state‘ 添加到装饰器的输入列表中。
@app.callback(
Output(component_id=‘bar-plot‘, component_property=‘figure‘),
[Input(component_id=‘input-year‘, component_property=‘value‘),
Input(component_id=‘input-state‘, component_property=‘value‘)]
)
def get_graph(entered_year, entered_state):
# 1. 使用输入的年份和州筛选数据
df_filtered = df[(df[‘Year‘] == int(entered_year)) & (df[‘DestState‘] == entered_state)]
# 2. 按航空公司分组并计算航班数,取前10名
df_carrier = df_filtered.groupby(‘Carrier‘)[‘Flights‘].sum().nlargest(10).reset_index()
# 3. 创建条形图
fig = {
‘data‘: [
{‘x‘: df_carrier[‘Carrier‘], ‘y‘: df_carrier[‘Flights‘], ‘type‘: ‘bar‘}
],
‘layout‘: {
‘title‘: f‘{entered_year}年目的地为{entered_state}的航班数量最多的航空公司‘
}
}
return fig



回调函数 get_graph 现在接收输入的年份和州作为参数。执行计算以提取信息,并用新图表更新应用布局。

这是代码的输出效果。初始输入年份是2010,州是AL(阿拉巴马州)。当我同时更新年份和州时,可以观察到图表会同步更新。
📝 总结



本节课中我们一起学习了Dash中回调函数的核心概念与应用。我们了解到:
- 回调函数通过
@app.callback装饰器定义,连接输入和输出组件。 - Input 和 Output 对象用于指定哪个组件的哪个属性作为输入和输出。
- 我们实践了单输入和多输入两种回调模式,实现了根据用户交互动态更新可视化图表的功能。
- 回调函数是构建交互式Dash仪表盘的基础,它使得数据可视化从静态展示变为动态探索。

现在,你可以开始动手实验,创建属于自己的交互式数据仪表盘了。

浙公网安备 33010602011771号