内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

Python实践:seaborn的散点图矩阵(Pairs Plots)可视化数据

2018-04-16 16:32 出处:清屏网 人气: 评论(0

如何快速创建强大的可视化探索性数据分析,这对于现在的商业社会来说,变得至关重要。今天我们就来,谈一谈如何使用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 答案 ):

# Function to calculate correlation coefficient between two arrays
def corr(x, y, **kwargs):
    # Calculate the value
    coef = np.corrcoef(x, y)[0][1]
    # Make the label
    label = r'$\rho$ = ' + str(round(coef, 2))
    # Add the label to the plot
    ax = plt.gca()
    ax.annotate(label, xy = (0.2, 0.95), size = 20, xycoords = ax.transAxes)
# Create a pair grid instance
grid = sns.PairGrid(data= df[df['year'] == 2007],
                    vars = ['life_exp', 'log_pop', 'log_gdp_per_cap'], size = 4)

# Map the plots to the locations
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');

我们的新函数映射到上三角形,因为我们需要两个数组来计算相关系数(还要注意我们可以将多个函数映射到网格部分)。这会产生以下图形:

相关系数现在出现在散点图上方。这是一个相对直接的例子,但我们可以使用 PairGrid 将我们想要的任何函数映射到图上。我们可以根据需要添加尽可能多的信息,只要我们能够弄清楚如何编写函数!作为最后一个例子,这里是一个显示对角线而不是网格的汇总统计图。

它显示了我们只做图标的总体思路,除了使用库中的任何现有功能(例如 matplotlib 将数据映射到图上)之外,我们还可以编写自己的函数来显示自定义信息。

结论

散点图矩阵是快速探索数据集中的分布和关系的强大工具。 Seaborn 提供了一个简单的默认方法,可以通过 Pair Grid 类来定制和扩展散点图矩阵。在一个数据分析项目中,价值的主要部分往往不在于浮华的机器学习,而在于直观的数据可视化。散点图举证为我们提供了全面的数据分析,是数据分析项目的一个很好的起点。

分享给小伙伴们:
本文标签: seabornPython

相关文章

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

CopyRight © 2015-2016 QingPingShan.com , All Rights Reserved.

清屏网 版权所有 豫ICP备15026204号