Python实践:seaborn的散点图矩阵(PairsPlots)可视化数据如何快速创建强⼤的可视化探索性数据分析,这对于现在的商业社会来说,变得⾄关重要。今天我们就来,谈⼀谈如何使⽤python来进⾏数据的可视化!
⼀旦你有了⼀个很好的被清理过的数据集,下⼀步就是探索性数据分析(EDA)。EDA是确定数据可以告诉我们的过程,我们使⽤EDA来查模式、关系或异常情况,以便指导我们后续的⼯作。然⽽在EDA中有很多的⽅法,但最有效的⼯具之⼀是对图(也称为散点图矩阵)。散点图矩阵让我们看到了两个变量之间的关系。散点图矩阵是识别后续分析趋势的好⽅法,幸运的是,它们很容易⽤Python实现!
在本⽂中,我们将通过使⽤seaborn可视化库在Python中进⾏对图的绘制和运⾏。我们将看到如何创建默认配对图以快速检查我们的数据,以及如何⾃定义可视化以获取更深⼊的洞察⼒。该项⽬的代码在GitHub上以Jupyter Notebook的形式提供。在这个项⽬中,我们将探索⼀个真实世界的数据集,由GapMinder收集的国家级社会经济数据组成。
Seaborn的散点图矩阵(Pairs Plots)
在开始之前,我们需要知道我们有什么数据。我们可以将社会经济数据⽤熊猫(Pandas)数据框加载并查看列:
每⾏数据代表⼀个国家在⼀年内的结果,列中包含变量(这种格式的数据称为整洁数据)。有2个分类专栏(国家和⼤陆)和4个数字专栏。这些专栏包括:life_exp是⼏年出⽣时的预期寿命,pop是⼈⼝,gdp_per_cap是以国际美元为单位的⼈均国内⽣产总值。
虽然后⾯我们将使⽤分类变量进⾏着⾊,但seaborn中的默认对图仅绘制了数字列。创建默认的散点图矩阵很简单:我们加载到seaborn库并调⽤pairplot函数,将它传递给我们的数据框:
# Seaborn visualization library
import seaborn as sns
# Create the default pairplot
sns.pairplot(df)
我仍然惊讶于⼀⾏简单的代码就可以完成我们整个需求!散点图矩阵建⽴在两个基本图形上,直⽅图和散点图。对⾓线上的直⽅图允许我们看到单个变量的分布,⽽上下三⾓形上的散点图显⽰了两个变量之间的关系。例如,第⼆⾏中最左边的图表显⽰life_exp与年份的散点图。
默认的散点图矩阵图经常给我们提供有价值的见解。我们看到⼈均预期寿命和⼈均GDP是正相关的,这表明⾼收⼊国家的⼈们倾向于更长寿(尽管这当然不能证明导致其他⼈也是如此)。它也似乎看起来是全世界的预期寿命随着时间的推移⽽上升。为了在未来的图中更好地显⽰这些变量,我们可以通过取这些值的对数来转换这些列:
# Take the log of population and gdp_per_capita
df['log_pop'] = np.log10(df['pop'])
df['log_gdp_per_cap'] = np.log10(df['gdp_per_cap'])
# Drop the non-transformed columns
df = df.drop(columns = ['pop', 'gdp_per_cap'])
虽然这种制图本⾝可以⽤于分析,但我们可以发现,通过对诸如⼤陆这样的分类变量进⾏数字着⾊,使
其更有价值。这在seaborn中⾮常简单!我们所需要做的就是在hue中使⽤sns.pairplot函数调⽤使⽤关键字:
sns.pairplot(df, hue = 'continent')
现在我们看到⼤洋洲和欧洲的⼈均预期寿命最⾼,亚洲⼈⼝最多。请注意,我们对⼈⼝和gdp的⽇志转换使这些变量正态分布,从⽽更全⾯地表⽰值。
上图更具信息性,但仍然存在⼀些问题:不到叠加的直⽅图,就像在对⾓线上那样,它⾮常易于理解。显⽰来⾃多个类别的单变量分布的更好⽅法是密度图。我们可以在函数调⽤中交换柱状图的密度图。当我们处理它时,我们会将⼀些关键字传递给散点图,以更改点的透明度,⼤⼩和边缘颜⾊。
# Create a pair plot colored by continent with a density plot of the # diagonal and format the scatter plots.
sns.pairplot(df, hue = 'continent', diag_kind = 'kde',
plot_kws = {'alpha': 0.6, 's': 80, 'edgecolor': 'k'},
size = 4)
对⾓线上的密度图⽐堆积条更容易⽐较各⼤洲之间的分布。改变散点图的透明度可以提⾼可读性,因为这些数字有相当多的重叠(称为重叠绘图)。
作为pairplot默认的最后⼀个例⼦,让我们通过绘制2000年后的年份来减少数据混乱。我们仍然会按照⼤陆分布着⾊,但现在我们不会绘制年份列。为了限制绘制的列,我们将⼀个列表传递vars给函数。为了说明情节,我们还可以添加标题
# Plot colored by continent for years 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是⼀个类,它意味着它不会⾃动填充我们的⽹格plot。相反,我们创建⼀个类实例,然后将特定函数映射到⽹格的不同部分。要⽤我们的数据创建⼀个PairGrid实例,我们使⽤下⾯的代码,这也限制了我们将显⽰的变量:
# Create an instance of the PairGrid class.
grid = sns.PairGrid(data= df_log[df_log['year'] == 2007],
vars = ['life_exp', 'log_pop',
'log_gdp_per_cap'], size = 4)
如果我们要显⽰它,我们会得到⼀个空⽩图,因为我们没有将任何函数映射到⽹格部分。有三个⽹格部分填写PairGrid:上三⾓形、下三⾓形和对⾓线。要将⽹格映射到这些部分,我们使⽤grid.map 部分中的⽅法。例如,要将散点图映射到我们使⽤的上三⾓形:
# Map a scatter plot to the upper triangle
grid = grid.map_upper(plt.scatter, color = 'darkred')
该map_upper⽅法接受任何两个变量数组(如plt.scatter)和关联的关键字(如color)的函数。该map_lower⽅法完全相同,但填充⽹格的下三⾓形。因为它需要在接受单个阵列(记住对⾓线仅⽰出了⼀个变量)的函数略有不同。⼀个例⼦是plt.hist我们⽤来填写下⾯的对⾓线部分:
# Map a histogram to the diagonal
grid = grid.map_diag(plt.hist, bins = 10, color = 'darkred',
edgecolor = 'k')
# Map a density plot to the lower triangle
grid = grid.map_lower(sns.kdeplot, cmap = 'Reds')
在这种情况下,我们在下三⾓形中使⽤2-D(密度图)的核密度估计值。放在⼀起,这段代码给了我们下⾯的图:
数据可视化是什么使⽤PairGrid类的真正好处在于我们想要创建⾃定义函数来将不同的信息映射到图上。例如,我可能想要将两个变量之间的Pearson相关系数添加到散点图中。为此,我会编写⼀个函数,它接受两个数组、计算统计量,然后在图上绘制它。下⾯的代码显⽰了这是如何完成的(归功于这个Stack Overflow答案):

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。