作者 | SHUBHAM SINGH
编译 | VK
来源 | Analytics Vidhya
概述
Seaborn是Python流行的数据可视化库
Seaborn结合了美学和技术,这是数据科学项目中的两个关键要素
了解其Seaborn作原理以及使用它生成的不同的图表
介绍
一个精心设计的可视化程序有一些特别之处。颜色突出,层次很好地融合在一起,整个轮廓流动,整个程序不仅有一个很好的美学质量,它也为我们提供了有意义的技术洞察力。
这在数据科学中非常重要,因为我们经常处理大量杂乱的数据。对于数据科学家来说,具有可视化的能力是至关重要的。我们的利益相关者或客户将更多地依赖于视觉提示,而不是复杂的机器学习模型。
有大量优秀的Python可视化库可用,包括内置的matplotlib。但Seaborn对我来说很重要。它将美学魅力与技术洞察力无缝地结合在一起,我们很快就会看到这一点。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/60d747aaad3c3a163e525f71eefca41a.jpeg)
在本文中,我们将了解什么是seaborn以及为什么应该使用它而不是matplotlib。然后我们将使用seaborn在Python中为数据生成各种不同的可视化。
目录
什么是Seaborn?
为什么应该使用Seaborn而不是matplotlib?
搭建环境
使用Seaborn进行数据可视化
可视化统计关系
用分类数据绘图
可视化数据集的分布
什么是Seaborn?
你曾经在R中使用过ggplot2库吗?它是任何工具或语言中最好的可视化包之一。Seaborn给了我同样的感觉。
Seaborn是一个构建在matplotlib之上的一个非常完美的Python可视化库。
它使我们能够创建放大的数据视觉效果。这有助于我们理解数据,通过在可视上下文中显示数据来发现变量或趋势之间的任何隐藏相关性,而这些相关性最初可能并不明显。与Matplotlib的低级接口相比,Seaborn具有高级接口。
为什么应该使用Seaborn而不是matplotlib?
我一直在谈论Seaborn是多么的棒,所以你可能想知道我为什么这么大惊小怪。
当我们使用seaborn生成图时,我将以实际的方式全面地回答这个问题。现在,让我们快速讨论一下seaborn为什么在matplotlib之上。
Seaborn使我们的图表和绘图看起来很吸引人,并支持一些常见的数据可视化需求(比如将颜色映射到变量或使用分面(faceting))。从根本上说,它使数据可视化和探索变得很容易。相信我,这在数据科学中不是一件容易的事。
如果Matplotlib"试图让简单的事情变得简单,而让困难的事情变得可能",那么seaborn也尝试让一组定义良好的困难事情变得简单。——迈克尔·瓦斯科姆(Seaborn的创始人)
在matplotlib中有几个(很大的)限制是Seaborn已经修复的:
Seaborn提供了大量的高级接口和自定义主题,而matplotlib没有这些接口,因为很难确定哪些设置使图表更吸引人
Matplotlib函数不能很好地处理数据流,而seaborn可以
这第二点在数据科学中很突出,因为我们经常使用数据模型。
搭建环境
seaborn库具有四个必需的必需依赖项:
NumPy (>= 1.9.3)
SciPy (>= 0.14.0)
matplotlib (>= 1.4.3)
Pandas (>= 0.15.2)
要安装Seaborn并有效地使用它,首先需要安装前面提到的依赖项。一旦这一步完成,我们都准备安装Seaborn和享受其迷人的绘图。要安装Seaborn,可以使用以下代码
要安装最新版本的seaborn,你可以使用pip:
pip install seaborn
你也可以使用conda安装最新版本的seaborn:
conda install seaborn
要在代码中导入依赖项和seaborn本身,可以使用以下代码
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from scipy import stats
就是这样!我们都准备好了详细地探索seaborn。
用于数据可视化的数据集
我们将主要处理两个数据集:
人力资源分析
(https://datahack.analyticsvidhya.com/contest/wns-analytics-hackathon-2018-1/)
预测投票数
(https://datahack.analyticsvidhya.com/contest/enigma-codefest-machine-learning-1/)
之所以选择这两个,是因为它们包含多个变量,因此我们有很多选择可以使用。这两个数据集还可以模拟现实情况,因此你将了解数据可视化和了解业内的数据可视化方式。
你可以在DataHack平台上查看这个和其他高质量的数据集。因此,请在继续之前下载上述两个数据集。我们将一起使用它们。
使用Seaborn进行数据可视化
让我们开始吧!我已将此实现部分分为两类:
可视化统计关系
绘制分类数据
我们将研究每个类别的多个示例,以及如何使用seaborn对其进行绘制。
可视化统计关系
统计关系表示理解数据集中不同变量之间的关系以及这种关系如何影响或依赖于其他变量的过程。
在这里,我们将使用seaborn生成以下图:
Scatter plot (散点图)
SNS.relplot
Hue plot (Hue图)
我选择了预测投票数数据集。所以,让我们导入数据集:
df = pd.read_csv(r"train.csv")
df.head()
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/7d20ee7aed92ec2dc0316b2ebf32d29c.png)
使用Seaborn绘制散点图
散点图可能是可视化两个变量之间关系的最常见的例子。每个点在数据集中显示一个观察值,这些观察值用点状结构表示。图中显示了两个变量的联合分布。
为了绘制散点图,我们将使用seaborn库的relplot()函数。它是可视化统计关系的图形级角色。默认情况下,使用relplot会生成散点图:
sns.relplot(x="Views", y="Upvotes", data = df)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/e7b174ea37a3bf8c48f1000624597825.png)
Seaborn的SNS.relplot
SNS.relplot是来自SNS类的relplot函数,SNS类是我们在上面与其他依赖项一起导入的一个seaborn类。
这里,参数是x、y,数据有在X,Y轴上表示的变量和我们要分别画出来的数据点,通过图片,我们发现了views和upvotes之间的关系。
接下来,如果我们想要看到与数据相关的标签,我们可以使用下面的代码:
sns.relplot(x="Views", y="Upvotes", hue = "Tag", data = df)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/260a43d142207a6af809147de2aedff0.png)
Hue图
我们可以在色调(Hue)的帮助下在我们的图片中添加另一个维度,通过为点赋予颜色来实现,每种颜色都有一些附加的意义。
在上图中,色调代表是样本类别,这就是为什么它有一个不同的颜色。如果色调代表的只是数字,那么色调就应该是连续的(因为数字是连续的,样本类别不是连续的)。
sns.relplot(x="Views", y="Upvotes", hue = "Answers", data = df);
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/1c977f95b1b780476fc7a331c1707ff4.png)
我们还可以更改每个点的大小:
sns.relplot(x="Views", y="Upvotes", size = "Tag", data = df);
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/b6438f9bc861c5d2d74fb5983a7974af.png)
我们还可以手动更改大小,方法是使用另一个参数size=(15,200)。
用分类数据绘图
抖动图
Hue图
箱线图
小提琴图
Pointplot
在上面的小节中,我们了解了如何使用不同的视图表示来显示多个变量之间的关系。我们绘制了两个数值变量之间的关系图。在本节中,我们将看到两个变量之间的关系。例子中的数据是已分类的(分为不同的组)。
我们将使用seaborn库的catplot()函数来绘制分类数据图。就让我们一探究竟吧
抖动图
对于抖动图,我们将使用另一个数据集人力资源分析来分析,让我们现在导入该数据集。
df2 = pd.read_csv(r"train.csv")
df2.head()
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/3831a0941fa06dc64f63348c0b2156d0.png)
现在,我们将使用catplot()函数查看education列和avg_training_score列之间的关系。
sns.catplot(x="education", y="avg_training_score", jitter = False, data=df2)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/15a0ba4ccc23d8095ad44b9835cccfe6.png)
我们可以看到图表是散开的,所以为了处理这个问题,我们可以将抖动设置为false。抖动是偏离真实值。因此,我们将使用另一个参数将抖动设置为false。
sns.catplot(x="education", y="avg_training_score", jitter = False, data=df2)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/bef832c2586d02934a530063a1c99af5.png)
Hue图
接下来,如果我们想在我们的图中引入另一个变量或另一个维度,我们可以使用hue参数,就像我们在上一节中使用的一样。假设我们希望看到教育和avg_training_score图中的性别分布,为此,我们可以使用以下代码
sns.catplot(x="education", y="avg_training_score", hue = "gender", data=df2)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/050d0831261fdd4bbddb940c19cd8f51.png)
在上面的图中,我们可以看到这些点是相互重叠的,为了消除这种情况,我们可以设置kind = "swarm", swarm使用一种算法来防止这些点重叠,并且沿着分类轴调整这些点。我们看看它是怎样的
sns.catplot(x="education", y="avg_training_score", kind = "swarm", data=df2)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/3bd5d7f213368ab6f9e244a2a9789d15.png)
很神奇,对吧?如果我们想要看到引入swarmed作为第三维的版本呢?让我们将is_promoted作为一个新变量引入
sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "swarm", data=df2)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/5245f81d09f3c7959529d1c9ad19d0a2.png)
显然,分数更高的人得到了提升。
使用Seaborn的箱线图
我们可以绘制的另一种绘图是箱线图 ,它显示了分布的三个四分位值以及最终值。箱图中的每个值都对应于数据中的实际观察值。让我们现在绘制箱线图
sns.catplot(x="education", y="avg_training_score", kind = "box", data=df2)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/3c689dfbc33e0077f2a04d9d84e09516.png)
当我们将Hue与boxplot一起使用时,它会沿着分类轴对齐,因此它们不会重叠。带有Hue的箱线图看起来是
sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "box", data=df2)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/e13197ae2a9595ddf3aeb53c50d5e0fb.png)
使用seaborn绘制小提琴图
我们也可以通过使用小提琴图来不同地表示上述变量。让我们尝试一下
sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "violin", data=df2)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/ff3248266a3224b3a44cba630624afff.png)
小提琴图结合了箱线图和核密度估计程序,以提供更丰富的值分布描述。四分位数值显示在小提琴内部。当色调语义参数是二值时,我们还可以拆分小提琴,这也可能有助于节省绘图空间。让我们看一下具有不同值色调的小提琴图。
sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "violin", split = True, data=df2)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/02b723272d5fab49ec7e75926009e406.png)
我开始使用seaborn的原因就是这些美妙的图表。它为你提供了很多显示数据的选项。另一个例子是箱线图。
使用Seaborn绘制箱线图
Boxplot对整个数据集进行操作,默认情况下获取平均值。
sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "bar", data=df2)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/d09fe1d277d3e96db9822a15de4a4543.png)
使用Seaborn绘制Pointplot
另一种类型的图是pointplot,这个图指出估计值和置信区间。Pointplot连接来自相同色调类别的数据。这有助于识别特定色调类别中的关系如何变化。你可以查看pointplot如何显示下面的信息。
sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "point", data=df2)从上面的图表可以明显看出,得分高的人更容易升职。
这不是结束,seaborn是一个巨大的库,有许多用于不同目的的绘图函数。其中一个目的是引入多维度。我们也可以想象高维的关系。让我们用群图来检验一下。
使用Seaborn的群图
sns.catplot(x="education", y="avg_training_score", hue="is_promoted",
col="gender", aspect=.9,
kind="swarm", data=df2);
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/eaab47e410fb65bf9c488973b08eb33c.png)
当我们将多个概念组合成一个概念时,我们很容易将这个概念形象化。这里群图将色调语义属性和性别属性作了分面处理。
可视化数据集的分布
无论何时处理数据集,我们都想知道数据或变量是如何分布的。数据的分布可以告诉我们很多关于数据性质的信息,所以让我们深入研究一下。
绘制单变量分布
柱状图
在研究变量分布时,最常见的一个图是柱状图。默认情况下,distplot()函数绘制柱状图并适合内核密度估计。让我们看看年龄是如何分布在数据中的。
sns.distplot(df2.age)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/304d1518782cbcaa0c64d77c6a294acd.png)
这清楚地表明,大多数人都在二十多岁和三十多岁。
使用Seaborn的直方图
另一种用于单变量分布的图是直方图。
直方图以箱子的形式表示数据的分布,并使用条形图来显示每个箱子下的观察次数。我们还可以在其中添加一个加固图,而不是使用KDE(核密度估计),这意味着在每次观察时,它都会画一个小的垂直标尺。
sns.distplot(df2.age, kde=False, rug = True)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/f412718506c158cc06c711365b76e89f.png)
绘制双变量分布
Hex图
KDE 图
Boxen 图
Ridge 图 (Joy图)
除了可视化单个变量的分布外,我们还可以看到两个独立变量是如何相互分布的。双变量表示关节,为了将其形象化,我们使用了seaborn库的jointplot()函数。默认情况下,jointplot绘制散点图。让我们看看年龄和avg_training_score之间的二元分布。
sns.jointplot(x="avg_training_score", y="age", data=df2);
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/586f9251ef3e7a0cead24403fb9b97b2.png)
有多种方式可视化双变量分布。让我们再看几个。
使用Seaborn的Hexplot
Hexplot是一个双变量的直方图,因为它显示了在六边形区域内的观察次数。这是一个非常容易处理大数据集的图。为了绘制Hexplot,我们将把kind属性设置为hex。我们现在就去看看。
sns.jointplot(x=df2.age, y=df2.avg_training_score, kind="hex", data = df2)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/c1f9a6d354373622a89653320d86ac90.png)
使用Seaborn的KDE图
这还不是结束,接下来是KDE绘图。这是另一个很好的方法来可视化双变量分布。让我们看看如何使用jointplot()函数并将属性kind设置为KDE来实现上述观察。
sns.jointplot(x="age", y="avg_training_score", data=df2, kind="kde");
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/377652d0c96740877a22cb9c139ed8a7.png)
使用Seaborn绘制Heatmaps
现在让我们来谈谈我最喜欢的图表Heatmaps。Heatmaps中每个变量都表示为一种颜色。
让我们来生成一个:
corrmat = df2.corr()
f, ax = plt.subplots(figsize=(9, 6))
sns.heatmap(corrmat, vmax=.8, square=True)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/b72fc11f384cd4581d512171b0ba3bc4.png)
使用Seaborn的Boxen图
另一个我们可以用来表示二元分布的图是boxen图。Boxen plot最初被命名为letter value plot(字母值图),因为它显示了一个变量大量的值,也称为分位数。这些分位数也被定义为字母值。通过绘制大量的分位数,可以对分布的形状有更多的了解。这些类似于箱形图,让我们看看如何使用它们。
sns.catplot(x="age", y="avg_training_score", data=df2, kind="boxen",height=4, aspect=2.7, hue = "is_promoted")
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/6c64af9f7ec832f87c0133d2d8732027.png)
使用Seaborn绘制Ridge图
下一个图表相当引人入胜。叫做Ridge图。它也被称为joy图。Ridge图有助于可视化几个组的数值分布。这些分布可以用KDE图或直方图来表示。现在,我们试着画一个Ridge图来表示年龄和性别的关系。
# 初始化FacetGrid对象
g = sns.FacetGrid(df2, row="gender", hue="gender", aspect=5, height=3)
# 画出密度
g.map(sns.kdeplot, "age", shade=True, alpha=1, lw=3.5, bw=.2)
g.map(sns.kdeplot, "age", color="w", lw=2, bw=.2)
g.map(plt.axhline, y=0, lw=2)
# 定义并使用一个简单的函数在坐标轴坐标中标记绘图
def label(x, color, label):
ax = plt.gca()
ax.text(0, .2, label, color=color, ha="left", va="center", transform=ax.transAxes)
g.map(label, "age")
# 将子图表设置为重叠
g.fig.subplots_adjust(hspace=-.25)
# 删除轴的细节,不要让细节影响到重叠
g.set_titles("")
g.set(yticks=[])
g.despine(bottom=True, left=True)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/02e8476d269c75156950dda3ab7e0b5e.png)
可视化数据集中的成对关系
我们还可以使用seaborn库的pairplot()函数来绘制数据集中的多个二元分布。这显示了数据库中每一列之间的关系。并绘制各变量在对角线上的单变量分布图。让我们看看它是什么样子。
sns.pairplot(df2)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/d799109838bbdfe9918409a6d8e9c237.png)
结尾
我们已经讲了很多图表了。我们看到了seaborn库在可视化和研究数据(尤其是大型数据集)时是如何如此有效的。我们还讨论了如何为不同类型的数据绘制seaborn库的不同函数。
正如我前面提到的,学习seaborn的最佳方法是实践它。你自己实践产生的新的视图越多,你就会变得越自信。