如何快速创建强大的探索性数据分析可视化
一旦你有了一个很好的清理数据集,下一步就是探索性数据分析(EDA)。EDA是确定数据可以告诉我们什么的过程,我们使用EDA来查找模式,关系或异常,以便为我们的后续分析提供信息。虽然在EDA中使用的方法几乎绝大多数,但最有效的启动工具之一是对图(也称为散点图矩阵)。一对plot让我们看到了两个变量之间的单变量和关系的两个分布。配对图是识别后续分析趋势的好方法,幸运的是,它很容易在Python中实现!
在本文中,我们将使用seaborn可视化库逐步启动并运行Python中的对图。我们将看到如何创建默认对图,以快速检查我们的数据,以及如何自定义可视化以获得更深入的见解。该项目的代码在GitHub上以Jupyter Notebook的形式提供。我们将探索由GapMinder收集的国家级社会经济数据组成的真实数据集。
Seaborn中的plot
要开始,我们需要知道我们有什么数据。我们可以将社会经济数据作为熊猫数据框加载并查看列:
数据的每一行代表一年内一个国家的观察,并且列保存变量(这种格式的数据称为整洁数据)。有2个分类列(国家和大陆)和4个数字列。这些专栏是相当不言自明的:life_exp
出生时的预期寿命是多少年,pop
是人口,gdp_per_cap
是人均国内生产总值,以国际美元为单位。
seaborn中的默认对图仅绘制数字列,但稍后我们将使用分类变量进行着色。创建默认对图很简单:我们在seaborn库中加载并调用pairplot
函数,并将其传递给我们的数据帧:
<span style="color:rgba(0, 0, 0, 0.84)">
#Seaborn 可视化库导入seaborn作为sns</span>
<span style="color:rgba(0, 0, 0, 0.84)">#创建默认的pairplot
sns.pairplot(df)</span>
我仍然惊讶于一行简单的代码为我们提供了整个plot!对图基于两个基本图形,即直方图和散点图。对角线上的直方图允许我们看到单个变量的分布,而上下三角形的散点图显示两个变量之间的关系(或缺少)。例如,第二行中最左边的图显示了life_exp与年份的散点图。
默认的配对图本身通常会给我们提供有价值的见解。我们看到预期寿命和人均GDP是正相关的,这表明高收入国家的人们往往寿命更长(尽管这当然不能证明一个人会导致另一个人)。似乎(幸运的是)全世界的预期寿命随着时间的推移而呈上升趋势。从直方图中,我们了解到人口和gdp变量严重偏右。为了在将来的图中更好地显示这些变量,我们可以通过取值的对数来转换这些列:
#记录人口和gdp_per_capita
df ['log_pop'] = np.log10(df ['pop'])
df ['log_gdp_per_cap'] = np.log10(df ['gdp_per_cap'])
#删除未转换的列
df = df.drop(columns = ['pop','gdp_per_cap'])
虽然这个图可以单独用于分析,但我们可以通过基于分类变量(如大陆)对图进行着色来发现它更有价值。在seaborn中这也非常简单!我们需要做的就是hue
在sns.pairplot
函数调用中使用关键字:
sns.pairplot(df,hue ='continent')
现在我们看到大洋洲和欧洲的预期寿命最高,亚洲人口最多。请注意,我们对总体和gdp的对数转换使得这些变量正态分布,从而更全面地表示了这些值。
这个图表提供了更多信息,但仍然存在一些问题:我倾向于找不到像对角线一样的堆积直方图,这是非常可以解释的。从多个类别显示单变量(单变量)分布的更好方法是密度图。我们可以在函数调用中将直方图替换为密度图。在我们处理它时,我们会将一些关键字传递给散点图,以更改点的透明度,大小和边缘颜色。
#创建一个由大陆着色的对图,其中#对角线的密度图和散点图的格式。
sns.pairplot(df,hue ='continent',diag_kind ='kde',
plot_kws = {'alpha':0.6,'s':80,'edgecolor':'k'},
size = 4)
对角线上的密度图使得比较堆积条之间的分布更容易比较各大洲之间的分布。改变散点图的透明度可以提高可读性,因为这些图上存在相当大的重叠(称为过度绘图)。
作为默认配对图的最后一个例子,让我们通过仅绘制2000年后的年份来减少混乱。我们仍将按大陆着色,但现在我们不会绘制年份列。为了限制绘制的列,我们传入一个vars
函数列表。为了澄清plot,我们还可以添加标题。
# 2000-2007年,非洲大陆的土地颜色
sns.pairplot(df[df['year'] >= 2000],
vars = ['life_exp', 'log_pop', 'log_gdp_per_cap'],
hue = 'continent', diag_kind = 'kde',
plot_kws = {'alpha': 0.6, 's': 80, 'edgecolor': 'k'},
size = 4);
# Title
plt.suptitle('Pair Plot of Socioeconomic Data for 2000-2007',
size = 28);
这开始看起来很漂亮!如果我们要进行建模,我们可以使用这些图中的信息来告知我们的选择。例如,我们知道log_gdp_per_cap与life_exp正相关,因此我们可以创建一个线性模型来量化这种关系。对于这篇文章,我们将坚持绘图,如果我们想要更多地探索我们的数据,我们可以使用PairGrid类自定义配对图。
使用PairGrid进行自定义
与sns.pairplot
函数相反,sns.PairGrid
是一个类,这意味着它不会自动填充我们的图。相反,我们创建一个类实例,然后将特定函数映射到网格的不同部分。要使用我们的数据创建PairGrid实例,我们使用以下代码来限制我们将显示的变量:
#创建PairGrid类的实例。
grid = sns.PairGrid(data = df_log [df_log ['year'] == 2007],
vars = ['life_exp','log_pop',
'log_gdp_per_cap'],size = 4)
如果我们要显示这个,我们会得到一个空白图,因为我们没有将任何函数映射到网格部分。要为PairGrid填充三个网格部分:上三角形,下三角形和对角线。要将图绘制到这些部分,我们使用grid.map
该部分的方法。例如,要将散点图映射到上三角形,我们使用:
#将散点图映射到上三角形
grid = grid.map_upper(plt.scatter,color ='darkred')
该map_upper
方法接受任何接受两个变量数组(例如plt.scatter
)和相关关键字(例如color
)的函数。该map_lower
方法完全相同,但填充网格的下三角形。的map_diag
,因为它需要在接受单个阵列(记住对角线仅示出了一个变量)的函数的略有不同。plt.hist
我们用一个例子填写下面的对角线部分:
# 将直方图映射到对角
grid = grid.map_diag(plt.hist, bins = 10, color = 'darkred',
edgecolor = 'k')
# 将密度图映射到下三角
grid = grid.map_lower(sns.kdeplot, cmap = 'Reds')
在这种情况下,我们在下三角形上使用2-D(密度图)中的核密度估计。放在一起,这段代码给出了以下plot:
当我们想要创建自定义函数以将不同信息映射到绘图上时,使用PairGrid类的真正好处就出现了。例如,我可能想要将两个变量之间的Pearson Correlation Coefficient添加到散点图上。为此,我将编写一个函数,该函数接收两个数组,计算统计数据,然后在图形上绘制它。以下代码显示了如何完成此操作(归功于此Stack Overflow答案):
# 功能计算两个数组之间的相关系数
def corr(x, y, **kwargs):
# 计算值
coef = np.corrcoef(x, y)[0][1]
# Make the label
label = r'$\rho$ = ' + str(round(coef, 2))
# 将标签添加到图中
ax = plt.gca()
ax.annotate(label, xy = (0.2, 0.95), size = 20, xycoords = ax.transAxes)
# 创建一对网格实例
grid = sns.PairGrid(data= df[df['year'] == 2007],
vars = ['life_exp', 'log_pop', 'log_gdp_per_cap'], size = 4)
# 将图表映射到位置
grid = grid.map_upper(plt.scatter, color = 'darkred')
grid = grid.map_upper(corr)
grid = grid.map_lower(sns.kdeplot, cmap = 'Reds')
grid = grid.map_diag(plt.hist, bins = 10, edgecolor = 'k', color = 'darkred');
我们的新函数映射到上三角形,因为我们需要两个数组来计算相关系数(另请注意我们可以将多个函数映射到网格部分)。这会产生以下plot:
相关系数现在出现在散点图上方。这是一个相对简单的例子,但我们可以使用PairGrid将我们想要的任何函数映射到图上。我们可以根据需要添加尽可能多的信息,只要我们能够弄清楚如何编写函数!作为最后一个例子,这是一个绘图,显示对角线而不是绘图的摘要统计。
这需要一点清理,但它显示了一般的想法; 除了使用库中的任何现有函数(例如matplotlib
将数据映射到图形)之外,我们还可以编写自己的函数来显示自定义信息。
结论
对图是一种快速浏览数据集中的分布和关系的强大工具。Seaborn提供了一种简单的默认方法,用于制作可以通过Pair Grid类定制和扩展的配对图。在数据分析项目中,价值的主要部分通常不在华而不实的机器学习中,而在于直观的数据可视化。配对图为我们提供了全面的数据查看,是数据分析项目的一个很好的起点。
原文:https://towardsdatascience.com/visualizing-data-with-pair-plots-in-python-f228cf529166