Pandas 可视化初步

用Pandas绘图。初学者的Python数据可视化
作者:Reka Horvath 4 评论 数据科学 中级
鸣叫 分享 电子邮件
目录
设置你的环境
创建你的第一个Pandas图
看看引擎盖下面:Matplotlib
调查你的数据
分布和柱状图
异常值
检查关联性
分析分类数据
分组
确定比率
放大类别
总结
进一步阅读

本教程有一个由Real Python团队制作的相关视频课程。将其与书面教程一起观看,以加深你的理解。 用Pandas绘图。Python数据可视化基础知识

无论你是刚开始了解一个数据集还是准备发表你的发现,可视化都是一个必不可少的工具。Python流行的数据分析库,pandas,为用.plot()实现数据的可视化提供了几种不同的选择。即使你的pandas之旅刚刚开始,你也会很快创建出基本的图表,从而对你的数据产生有价值的洞察力。
在本教程中,你将学习。

什么是不同类型的pandas图以及何时使用它们
如何用直方图来了解你的数据集的概况
如何用散点图来发现关联性
如何分析不同的类别和它们的比例

免费奖励:点击这里可以获得一份Conda小抄,其中有管理Python环境和软件包的方便使用的例子。
设置你的环境
你最好在Jupyter笔记本中跟随本教程的代码。这样,你就可以立即看到你的绘图,并能够对它们进行操作。
你还需要一个工作的Python环境,包括pandas。如果你还没有,那么你有几个选择。
如果你有更宏伟的计划,那就下载Anaconda发行版。它很庞大(大约500MB),但你将配备大多数数据科学工作。
如果你喜欢简约的设置,那么请看在Windows上为机器学习设置Python中关于安装Miniconda的部分。
如果你想坚持使用pip,那么就用pip install pandas matplotlib来安装本教程中讨论的库。你也可以用 pip install jupyterlab 来获取 Jupyter 笔记本。
如果你不想做任何设置,那就在Jupyter Notebook的在线试用中跟着做。

一旦你的环境设置好了,你就可以准备下载一个数据集。在本教程中,你将分析来自美国社区调查2010-2012年公共使用微数据样本的大学专业的数据。它是FiveThirtyEight网站上的《挑选大学专业的经济指南》的基础。
首先,通过将下载URL传递给pandas.read_csv()来下载数据。

[1]: import pandas as pd

[2]: download_url = (
   ...: "https://raw.githubusercontent.com/fivethirtyeight/"
   ...: "data/master/college-majors/recent-grads.csv"
   ...: )

[3]: df = pd.read_csv(download_url)

[4]:type(df)
out[4]: pandas.core.frame.DataFrame

通过调用 read_csv() ,你创建了一个 DataFrame,它是 pandas 中使用的主要数据结构。
注意:即使你不熟悉 DataFrame,你也可以继续学习这个教程。

但如果你有兴趣学习更多关于使用pandas和DataFrame的知识,那么你可以查看《使用pandas和Python来探索你的数据集》和《pandas DataFrame》。让与数据打交道变得愉快。

现在你有了一个DataFrame,你可以看一下数据了。首先,你应该配置display.max.columns选项,确保pandas不会隐藏任何列。然后你可以用.head()查看前几行的数据。

pd.set_option("display.max.columns", None)
df.head()

你刚刚使用.head()显示了DataFrame df的前五行。你的输出应该看起来像这样。

.head()显示的默认行数是5,但是你可以指定任何行数作为参数。例如,要显示前十行,你可以使用df.head(10)。

创建你的第一个Pandas图
你的数据集包含了一些与各专业毕业生的收入有关的列。
"中位数 "是全职、常年工作者的收入中位数。
"P25th "是收入的第25百分位数。
"P75th "是收入的第75个百分位数。
"排名 "是该专业按收入中位数的排名。
让我们先来看看显示这些栏目的图。首先,你需要用%matplotlib魔法命令设置你的Jupyter笔记本来显示图。

使用苹果MacOSX,使用matplotlib后端。
[7]:%matplotlib

%matplotlib魔法命令设置了你的Jupyter笔记本,以便用Matplotlib显示图画。默认使用标准的Matplotlib图形后端,你的绘图将显示在一个单独的窗口中。

注意:你可以通过向%matplotlib magic命令传递一个参数来改变Matplotlib后端。
例如,Jupyter note流行使用内嵌式后端,因为它在笔记本本身中显示绘图,就在创建绘图的单元格的下面。

代码部分:

import pandas as pd

download_url = (
   ...:     "https://raw.githubusercontent.com/fivethirtyeight/"
   ...:     "data/master/college-majors/recent-grads.csv"
   ...: )

df = pd.read_csv(download_url)

type(df)
pandas.core.frame.DataFrame

通过调用 read_csv() ,你创建了一个 DataFrame,它是 pandas 中使用的主要数据结构。
注意:即使你不熟悉 DataFrame,你也可以继续学习这个教程。

但如果你有兴趣学习更多关于使用pandas和DataFrame的知识,那么你可以查看《使用pandas和Python来探索你的数据集》和《pandas DataFrame》。让与数据打交道变得愉快。

现在你有了一个DataFrame,你可以看一下数据了。首先,你应该配置display.max.columns选项,确保pandas不会隐藏任何列。然后你可以用.head()查看前几行的数据。

[5]: pd.set_option("display.max.columns", None)
[6]: df.head()

你刚刚使用.head()显示了DataFrame df的前五行。你的输出应该看起来像这样。

.head()显示的默认行数是5,但是你可以指定任何行数作为参数。例如,要显示前十行,你可以使用df.head(10)。

创建你的第一个Pandas图
你的数据集包含了一些与各专业毕业生的收入有关的列。
"中位数 "是全职、常年工作者的收入中位数。
"P25th "是收入的第25百分位数。
"P75th "是收入的第75个百分位数。
"排名 "是该专业按收入中位数的排名。
让我们先来看看显示这些栏目的图。首先,你需要用%matplotlib魔法命令设置你的Jupyter笔记本来显示图。

使用苹果MacOSX,使用matplotlib后端。
[7]:%matplotlib

%matplotlib魔法命令设置了你的Jupyter笔记本,以便用Matplotlib显示图画。默认使用标准的Matplotlib图形后端,你的绘图将显示在一个单独的窗口中。

注意:你可以通过向%matplotlib magic命令传递一个参数来改变Matplotlib后端。
例如,Jupyter笔记本流行使用内嵌式后端,因为它在笔记本本身中显示绘图,就在创建绘图的单元格的下面。

[7]:%matplotlib inline

还有一些其他的后端可用。更多信息,请查看IPython文档中的Rich Outputs教程。
现在你已经准备好做你的第一个图了!你可以用.plot()来做。你可以用.plot()来做。

df.plot(x="Rank", y=["P25th", "Median", "P75th"])
 <AxesSubplot:xlabel='Rank'>

.plot()返回一个包含DataFrame中每一行数据的线图。x轴的数值代表每个机构的排名,"P25"、"中位数 "和 "P75 "的数值被绘制在y轴上。

注意:如果你不是在Jupyter笔记本或IPython shell中跟读,那么你需要使用matplotlib中的pyplot接口来显示该图。

下面是在标准的Python shell中显示该图的方法。

import matplotlib.pyplot as plt
df.plot(x="Rank", y=["P25th", "Median", "P75th"])
plt.show()

注意,在调用plt.show()来显示绘图之前,你必须先从Matplotlib导入pyplot模块。
由.plot()产生的图形默认显示在一个单独的窗口中,看起来像这样。

观察该图,你可以做出以下观察。

收入中位数随着等级的降低而降低。这是预期的,因为排名是由收入中位数决定的。
一些专业在第25和第75百分位数之间有很大差距。拥有这些学位的人的收入可能大大低于或大大高于收入中位数。

其他专业在第25和第75百分位数之间的差距非常小。拥有这些学位的人的工资非常接近收入中位数。
你的第一张图已经暗示了在数据中还有很多东西可以发现! 一些专业的收入范围很广,而其他专业的收入范围则相当狭窄。为了发现这些差异,你将使用其他几种类型的图。

注意:关于中位数、百分位数和其他统计数据的介绍,请查看Python统计学基础知识。如何描述你的数据。

.plot()有几个可选参数。最值得注意的是,kind参数接受11个不同的字符串值,并决定你将创建哪种类型的图。

"area "用于绘制面积图。
"bar "用于垂直条形图。
"barh "用于水平条形图。
"box "用于箱形图。
"hexbin "用于hexbin图。
"hist "用于柱状图。
"kde "用于内核密度估计图。
"density "是 "kde "的一个别名。
"line "用于线状图。
"pie "用于饼图。
"scatter "用于散点图。

默认值是 "line"。线形图,就像你上面创建的那个,提供了一个很好的数据概览。你可以用它们来检测一般趋势。它们很少提供复杂的洞察力,但它们可以给你提供线索,告诉你应该在哪里放大。
如果你没有给.plot()提供一个参数,那么它就会创建一个X轴上有指数,Y轴上有所有数字列的线图。虽然这对于只有几列的数据集来说是一个有用的默认值,但是对于大学专业数据集和它的几个数字列来说,它看起来是相当混乱的。
注意:作为向.plot()的kind参数传递字符串的替代方法,DataFrame对象有几个方法,你可以用来创建上述各种图。
.面积()
.bar()
.barh()
.box()
.hexbin()
.hist()
.kde()
.密度()
.line()
.pie()
.scatter()
在本教程中,你将使用.plot()接口并向kind参数传递字符串。我们鼓励你也尝试一下上面提到的方法。
现在你已经创建了你的第一个pandas绘图,让我们仔细看看.plot()是如何工作的。

还有一些其他的后端可用。更多信息,请查看IPython文档中的Rich Outputs教程。
现在你已经准备好做你的第一个图了!你可以用.plot()来做。你可以用.plot()来做。

看看引擎盖下面:Matplotlib
当你在一个DataFrame对象上调用.plot()时,Matplotlib会在引擎盖下创建该图。
为了验证这一点,请尝试两个代码片断。首先,用Matplotlib使用你的DataFrame的两列创建一个图。

import matplotlib.pyplot as plt
plt.plot(df["Rank"], df["P75th"])
 [<matplotlib.lines.Line2D at 0x7f859928fbb0>]

首先,你导入matplotlib.pyplot模块并将其重命名为plt。
然后你调用plot()并将DataFrame对象的 "Rank "列作为第一个参数,将 "P75th "列作为第二个参数。
结果是一个线图,在Y轴上绘制第75个百分位数,在X轴上绘制排名。

你可以使用DataFrame对象的.plot()方法创建完全相同的图形。

df.plot(x="Rank", y="P75th")
 <AxesSubplot:xlabel='Rank'>

.plot()是pyplot.plot()的一个封装器,其结果是一个与你用Matplotlib制作的图形相同的图形。

你可以同时使用 pyplot.plot() 和 df.plot() 来从 DataFrame 对象的列中产生相同的图形。然而,如果你已经有了一个DataFrame实例,那么df.plot()提供的语法比pyplot.plot()更简洁。

注意:如果你已经熟悉了Matplotlib,那么你可能对.plot()的kwargs参数感兴趣。你可以向它传递一个包含关键字参数的字典,然后将其传递给 Matplotlib 绘图后端。

注意:如果你已经熟悉Matplotlib,那么你可能对.plot()的kwargs参数感兴趣。你可以向它传递一个包含关键字参数的字典,然后将其传递给Matplotlib的绘图后端。

关于Matplotlib的更多信息,请查看Python Plotting With Matplotlib。
现在你知道了DataFrame对象的.plot()方法是Matplotlib的pyplot.plot()的一个封装器,让我们深入了解你可以创建的不同类型的图以及如何创建它们。

调查你的数据
接下来的图将让你对数据集的某一列进行总体了解。首先,你将用直方图看一下一个属性的分布。然后,你将了解一些检查离群值的工具。

分布和柱状图
DataFrame 并不是 pandas 中唯一具有 .plot() 方法的类。正如在pandas中经常发生的那样,Series对象提供了类似的功能。

你可以将DataFrame的每一列作为一个Series对象来获取。下面是一个使用你从大学专业数据创建的DataFrame的 "中位数 "列的例子。

In [14]: median_column.plot(kind="hist")
Out[14]: <AxesSubplot:ylabel='Frequency'>

现在你有了一个系列对象,你可以为它创建一个图。直方图是一个很好的方法来可视化数值在数据集中的分布情况。直方图将数值分组,并显示其数值在某一特定仓中的数据点的数量。
让我们为 "中位数 "列创建一个直方图。

代码块

你在median_column Series上调用.plot(),并将字符串 "hist "传递给kind参数。这就是它的全部内容!
当你调用.plot()时,你会看到下图。

直方图显示数据被分组为10个仓,范围从20,000美元到120,000美元,每个仓的宽度为10,000美元。直方图的形状与正态分布不同,正态分布是一个对称的钟形,中间有一个峰值。

注:关于直方图的更多信息,请查看Python直方图绘制。NumPy, Matplotlib, Pandas & Seaborn。
然而,中位数数据的直方图在低于40,000美元的左侧达到峰值。尾部远远向右延伸,表明确实有一些领域的专业可以期待明显的高收入。

异常值
你有没有发现分布的右边缘那个孤独的小仓?似乎有一个数据点有自己的类别。这个领域的专业不仅与平均水平相比,而且与亚军相比,都能获得很好的薪水。虽然这不是它的主要目的,但直方图可以帮助你发现这样一个离群点。让我们再调查一下这个离群点。
这个离群点代表哪个专业?

它的边缘有多大?
与第一个概述相反,你只想比较几个数据点,但你想看到关于它们的更多细节。为此,柱状图是一个很好的工具。首先,选择收入中位数最高的五个专业。你需要两个步骤。
要按 "中位数 "列排序,使用.sort_values(),并提供你要排序的列的名称以及方向ascending=False。
要获得列表中的前五项,使用.head()。让我们创建一个名为top_5的新DataFrame。

In [15]: top_5 = df.sort_values(by="Median", ascending=False).head()

现在你有一个较小的DataFrame,只包含前五个最赚钱的专业。作为下一步,你可以创建一个条形图,只显示具有这前五个工资中位数的专业。

In [16]: top_5.plot(x="Major", y="Median", kind="bar", rot=5, fontsize=4)
Out[16]: <AxesSubplot:xlabel='Major'>

注意,你使用rot和fontsize参数来旋转和调整x轴的标签大小,以便它们能够被看到。你会看到一个有5条杠的图。

这个图显示,石油工程专业的工资中位数比其他专业高20,000多美元。第二名到第四名的专业的收入相对接近。
如果你有一个数据点的数值比其他的高得多或低得多,那么你可能要进一步调查一下。例如,你可以看一下包含相关数据的列。
让我们来调查所有工资中位数高于60,000美元的专业。首先,你需要用掩码df[df["Median"] > 60000]来过滤这些专业。然后你可以创建另一个条形图,显示所有三个收入列。

In [17]: top_medians = df[df["Median"] > 60000].sort_values("Median")
In [18]: top_medians.plot(x="Major", y=["P25th", "Median", "P75th"], kind="bar")
Out[18]: <AxesSubplot:xlabel='Major'>

你应该看到一个每个专业有三个条形图,像这样。

第25和第75百分位数证实了你在上面看到的情况:石油工程专业是迄今为止收入最高的应届毕业生。
为什么你要对这个数据集中的异常值如此感兴趣?如果你是一名大学生,正在考虑选择哪个专业,那么你至少有一个非常明显的理由。

为什么你要对这个数据集中的异常值如此感兴趣?如果你是一名大学生,正在考虑选哪个专业,你至少有一个相当明显的理由。但从分析的角度来看,离群值也是非常有趣的。它们不仅可以表明资金充裕的行业,也可以表明无效的数据。

无效数据可能是由任何数量的错误或疏忽造成的,包括传感器故障,手工数据输入过程中的错误,或者一个五岁的孩子参加了一个为十岁以上的孩子准备的焦点小组。调查异常值是数据清理的一个重要步骤。

即使数据是正确的,你可能会决定它只是与其他的数据有很大的不同,以至于它产生的噪音多于好处。让我们假设你分析一个小出版商的销售数据。你按地区对收入进行分组,并与前一年的同一个月进行比较。然后突然间,该出版商出版了一本全国性的畅销书。

这个令人愉快的事件使你的报告变得有点毫无意义。包括了畅销书的数据后,各地的销售都在上升。在没有异常值的情况下进行同样的分析会提供更有价值的信息,让你看到在纽约你的销售数字有了明显的改善,但在迈阿密却变得更糟。

检查关联性
通常情况下,你想看看数据集的两列是否有联系。如果你选择了一个收入中位数较高的专业,你的失业几率是否也较低?作为第一步,用这两列创建一个散点图。

In [19]: df.plot(x="Median", y="Unemployment_rate", kind="scatter")
Out[19]: <AxesSubplot:xlabel='Median', ylabel='Unemployment_rate'>

你应该看到一个看起来相当随机的图,像这样。

扫一眼这个图就会发现,收入和失业率之间没有明显的相关性。

虽然散点图是一个很好的工具,可以获得关于可能的相关性的第一印象,但它肯定不是联系的明确证明。对于不同列之间的相关关系的概述,你可以使用.corr()。如果你怀疑两个值之间有相关性,那么你有几个工具可以用来验证你的预感并测量相关性有多强。

但是,请记住,即使两个值之间存在相关性,它仍然不意味着一个值的变化会导致另一个值的变化。换句话说,相关关系并不意味着因果关系。

分析分类数据

为了处理更大的信息块,人类的大脑会有意识和无意识地将数据分类。这种技术通常是有用的,但它远非完美无缺。

有时候,我们把一些东西归入一个类别,但经过进一步的检查,这些东西并不那么相似。在本节中,你将了解一些检查类别和验证给定分类是否合理的工具。

许多数据集已经包含了一些显性或隐性的分类。在当前的例子中,173个专业被分为16个类别。
分组
类别的一个基本用法是分组和聚合。你可以使用.groupby()来确定大学专业数据集中每个类别的流行程度。

In [20]: cat_totals = df.groupby("Major_category")["Total"].sum().sort_values()

In [21]: cat_totals
Out[21]:
Major_category
Interdisciplinary                        12296.0
Agriculture & Natural Resources          75620.0
Law & Public Policy                     179107.0
Physical Sciences                       185479.0
Industrial Arts & Consumer Services     229792.0
Computers & Mathematics                 299008.0
Arts                                    357130.0
Communications & Journalism             392601.0
Biology & Life Science                  453862.0
Health                                  463230.0
Psychology & Social Work                481007.0
Social Science                          529966.0
Engineering                             537583.0
Education                               559129.0
Humanities & Liberal Arts               713468.0
Business                               1302376.0
Name: Total, dtype: float64

[20]:cat_totals = df.groupby("Major_category")["Total"].sum().sort_values()

在[21]中:cat_totals
输出[21]:
专业类别
跨学科 12296.0
农业和自然资源 75620.0
法律与公共政策 179107.0
物理科学 185479.0
工业艺术与消费者服务 229792.0
计算机与数学 299008.0
艺术 357130.0
通讯与新闻 392601.0
生物学和生命科学 453862.0
卫生463230.0
心理学和社会工作 481007.0
社会科学 529966.0
工程学 537583.0
教育学 559129.0
人文科学和文科 713468.0
商业1302376.0
名称。总数, dtype: float64

使用.groupby(),你可以创建一个DataFrameGroupBy对象。用.sum(),你创建一个Series。
让我们画一个水平条形图,显示cat_totals中所有的类别总数。

In [22]: cat_totals.plot(kind="barh", fontsize=4)
Out[22]: <AxesSubplot:ylabel='Major_category'>

你应该看到一个每个类别有一个水平条的图。

正如你的图所示,到目前为止,商业是最受欢迎的专业类别。虽然人文科学和文科是明显的第二名,但其余领域的受欢迎程度比较接近。
注意:包含分类数据的列不仅为分析和可视化提供了有价值的洞察力,还为提高你的代码性能提供了机会。

确定比率
如果你想看到你的类别之间的差异,垂直和水平条形图通常是一个不错的选择。如果你对比率感兴趣,那么饼图是一个很好的工具。然而,由于cat_totals包含一些较小的类别,用cat_totals.plot(kind="pie")创建一个饼图会产生几个标签重叠的小片子。
为了解决这个问题,你可以把较小的类别合并成一个组。将所有总数低于100,000的类别合并为一个叫做 "其他 "的类别,然后创建一个饼图。

In [23]: small_cat_totals = cat_totals[cat_totals < 100_000]

In [24]: big_cat_totals = cat_totals[cat_totals > 100_000]

In [25]: # Adding a new item "Other" with the sum of the small categories

In [26]: small_sums = pd.Series([small_cat_totals.sum()], index=["Other"])

In [27]: big_cat_totals = big_cat_totals.append(small_sums)

In [28]: big_cat_totals.plot(kind="pie", label="")
Out[28]: <AxesSubplot:>

注意,你包含了参数 label=""。默认情况下,pandas添加了一个带有列名的标签。这通常是有意义的,但在这种情况下,它只会增加噪音。
现在你应该看到一个像这样的饼图。

其他 "类别仍然只占饼的很小一块。这是一个好兆头,说明合并这些小类别是正确的选择。
放大类别
有时你也想验证一下某种分类是否合理。一个类别的成员之间的相似度是否比他们与数据集其他部分的相似度高?同样,分布图是一个很好的工具,可以得到一个初步的概述。一般来说,我们希望一个类别的分布与正态分布相似,但范围更小。
创建一个直方图,显示工程专业的收入中位数的分布。

In [29]: df[df["Major_category"] == "Engineering"]["Median"].plot(kind="hist")
Out[29]: <AxesSubplot:ylabel='Frequency'>

你会得到一个直方图,你可以从头与所有专业的直方图进行比较。

专业的收入中位数的范围要小一些,从40000美元开始。分布更接近于正态,尽管其峰值仍然在左边。因此,即使你已经决定选择工程类的专业,明智的做法是更深入地挖掘和分析你的选择。

总结
在本教程中,你已经学会了如何使用Python和pandas库开始可视化你的数据集。你已经看到了一些基本的图如何让你深入了解你的数据并指导你的分析。
在本教程中,你学会了如何。
用直方图了解你的数据集的分布概况
用散点图发现相关关系
用柱状图分析类别,用饼状图分析其比例
确定哪种图最适合你当前的任务

使用.plot()和一个小的DataFrame,你已经发现了提供数据图片的许多可能性。现在你已经准备好在这些知识的基础上,发现更复杂的可视化。
如果你有问题或意见,那么请在下面的评论部分提出来。

进一步阅读
虽然pandas和Matplotlib让你的数据可视化变得非常简单,但要创建更复杂、更漂亮或更吸引人的图,还有无限的可能性。

pandas DataFrame文档中的绘图部分是一个不错的开始。它包含了一个很好的概述和一些关于你可以在你的DataFrame中使用的众多参数的详细描述。

如果你想更好地理解用pandas绘图的基础,那就多了解一下Matplotlib。虽然文档有时会让人不知所措,但Anatomy of Matplotlib在介绍一些高级功能方面做得很好。

如果你想用交互式可视化给你的听众留下深刻印象,并鼓励他们自己去探索数据,那么把Bokeh作为你的下一站。你可以在Interactive Data Visualization in Python With Bokeh中找到Bokeh的功能概述。你也可以通过pandas-bokeh库配置pandas来使用Bokeh而不是Matplotlib。

如果你想为统计分析或科学论文创建可视化,那么请查看Seaborn。你可以在Python直方图绘制中找到一个关于Seaborn的简短课程。

立即观看 本教程有一个由Real Python团队创建的相关视频课程。将它与书面教程一起观看,以加深你的理解Plot With Pandas: Python数据可视化基础知识

🐍 Python 技巧 💌
每隔几天就会有一个短小精悍的Python技巧送到你的收件箱中。从来没有垃圾邮件。任何时候都可以取消订阅。由Real Python团队策划。

关于Reka Horvath
Reka是一个狂热的Python爱好者,为Real Python写文章。
" 关于Reka的更多信息

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容