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

简介: 如何快速创建强大的可视化探索性数据分析,这对于现在的商业社会来说,变得至关重要。今天我们就来,谈一谈如何使用python来进行数据的可视化!

如何快速创建强大的可视化探索性数据分析,这对于现在的商业社会来说,变得至关重要。今天我们就来,谈一谈如何使用python来进行数据的可视化!

一旦你有了一个很好的被清理过的数据集,下一步就是探索性数据分析(EDA)。EDA是确定数据可以告诉我们的过程,我们使用EDA来查找模式、关系或异常情况,以便指导我们后续的工作。然而在EDA中有很多的方法,但最有效的工具之一是对图(也称为散点图矩阵)。散点图矩阵让我们看到了两个变量之间的关系。散点图矩阵是识别后续分析趋势的好方法,幸运的是,它们很容易用Python实现!

在本文中,我们将通过使用seaborn可视化库Python中进行对图的绘制和运行。我们将看到如何创建默认配对图以快速检查我们的数据,以及如何自定义可视化以获取更深入的洞察力。该项目的代码GitHubJupyter Notebook的形式提供。在这个项目中,我们将探索一个真实世界的数据集,由GapMinder收集的国家级社会经济数据组成

Seaborn的散点图矩阵(Pairs Plots

在开始之前,我们需要知道我们有什么数据。我们可以将社会经济数据用熊猫(Pandas)数据框加载并查看列:

95ed713028089a443d0f196ac28b7c2aa12c0fdb

每行数据代表一个国家在一年内的结果,列中包含变量(这种格式的数据称为整洁数据)。有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)
5814452fdf88bd18dd605d71d07ef1b985d9c08b

我仍然惊讶于一行简单的代码就可以完成我们整个需求!散点图矩阵建立在两个基本图形上,直方图和散点图。对角线上的直方图允许我们看到单个变量的分布,而上下三角形上的散点图显示了两个变量之间的关系。例如,第二行中最左边的图表显示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')
8e5e598f774fd4aa1a819afb4e4294f1e950ac38

现在我们看到大洋洲和欧洲的人均预期寿命最高,亚洲人口最多。请注意,我们对人口和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)
75e0e96df2503d25cb5ee9edb07b45af9d921526

对角线上的密度图比堆积条更容易比较各大洲之间的分布。改变散点图的透明度可以提高可读性,因为这些数字有相当多的重叠(称为重叠绘图)。

作为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);
8b8cfbffae8f4451d0dc1cffbbbad4e6447b8e0d

这开始看起来很不错!如果我们要进行建模,我们可以使用这些图中的信息来帮助我们进行选择。例如,我们知道log_gdp_per_caplife_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(密度图)的核密度估计值。放在一起,这段代码给了我们下面的图:

69a544e1c0eb50dfc36888602021d7fb33d5d461

使用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');

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

2e2b961261ada9aafbd92bd7640462817bf9e01f

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

b4767adb43362a3f812c4df8fadaeca57b480b9e

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

结论

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

数十款阿里云产品限时折扣中,赶紧点击领劵开始云上实践吧!

本文由北邮@爱可可-爱生活 老师推荐,阿里云云栖社区组织翻译。

文章原标题《visualizing-data-with-pair-plots-in-python》,

译者:虎说八道,审校:袁虎。

文章为简译,更为详细的内容,请查看原文 

相关文章
|
5天前
|
Python
深入理解Python装饰器:从入门到实践####
本文旨在通过简明扼要的方式,为读者揭开Python装饰器的神秘面纱,从基本概念、工作原理到实际应用场景进行全面解析。不同于常规的摘要仅概述内容概要,本文将直接以一段精炼代码示例开篇,展示装饰器如何优雅地增强函数功能,激发读者探索兴趣,随后深入探讨其背后的机制与高级用法。 ####
33 11
|
2天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
1天前
|
设计模式 缓存 开发框架
Python中的装饰器:从入门到实践####
本文深入探讨了Python中装饰器的工作原理与应用,通过具体案例展示了如何利用装饰器增强函数功能、提高代码复用性和可读性。读者将学习到装饰器的基本概念、实现方法及其在实际项目开发中的实用技巧。 ####
11 3
|
5天前
|
机器学习/深度学习 数据采集 数据可视化
Python在数据科学中的应用:从入门到实践
本文旨在为读者提供一个Python在数据科学领域应用的全面概览。我们将从Python的基础语法开始,逐步深入到数据处理、分析和可视化的高级技术。文章不仅涵盖了Python中常用的数据科学库,如NumPy、Pandas和Matplotlib,还探讨了机器学习库Scikit-learn的使用。通过实际案例分析,本文将展示如何利用Python进行数据清洗、特征工程、模型训练和结果评估。此外,我们还将探讨Python在大数据处理中的应用,以及如何通过集成学习和深度学习技术来提升数据分析的准确性和效率。
|
4天前
|
移动开发 数据可视化 数据挖掘
利用Python实现数据可视化:以Matplotlib和Seaborn为例
【10月更文挑战第37天】本文旨在引导读者理解并掌握使用Python进行数据可视化的基本方法。通过深入浅出的介绍,我们将探索如何使用两个流行的库——Matplotlib和Seaborn,来创建引人入胜的图表。文章将通过具体示例展示如何从简单的图表开始,逐步过渡到更复杂的可视化技术,帮助初学者构建起强大的数据呈现能力。
|
4天前
|
数据采集 IDE 测试技术
Python实现自动化办公:从基础到实践###
【10月更文挑战第21天】 本文将探讨如何利用Python编程语言实现自动化办公,从基础概念到实际操作,涵盖常用库、脚本编写技巧及实战案例。通过本文,读者将掌握使用Python提升工作效率的方法,减少重复性劳动,提高工作质量。 ###
14 1
|
5天前
|
机器学习/深度学习 数据采集 人工智能
探索机器学习:从理论到Python代码实践
【10月更文挑战第36天】本文将深入浅出地介绍机器学习的基本概念、主要算法及其在Python中的实现。我们将通过实际案例,展示如何使用scikit-learn库进行数据预处理、模型选择和参数调优。无论你是初学者还是有一定基础的开发者,都能从中获得启发和实践指导。
11 2
|
8天前
|
算法 Python
Python图论探索:从理论到实践,DFS与BFS遍历技巧让你秒变技术大牛
图论在数据结构与算法中占据重要地位,应用广泛。本文通过Python代码实现深度优先搜索(DFS)和广度优先搜索(BFS),帮助读者掌握图的遍历技巧。DFS沿路径深入搜索,BFS逐层向外扩展,两者各具优势。掌握这些技巧,为解决复杂问题打下坚实基础。
18 2
|
7天前
|
搜索推荐 Python
快速排序的 Python 实践:从原理到优化,打造你的排序利器!
本文介绍了 Python 中的快速排序算法,从基本原理、实现代码到优化方法进行了详细探讨。快速排序采用分治策略,通过选择基准元素将数组分为两部分,递归排序。文章还对比了快速排序与冒泡排序的性能,展示了优化前后快速排序的差异。通过这些分析,帮助读者理解快速排序的优势及优化的重要性,从而在实际应用中选择合适的排序算法和优化策略,提升程序性能。
19 1
|
9天前
|
Python
探索Python装饰器:从入门到实践
【10月更文挑战第32天】在编程世界中,装饰器是一种特殊的函数,它允许我们在不改变原有函数代码的情况下,增加额外的功能。本文将通过简单易懂的语言和实际案例,带你了解Python中装饰器的基础知识、应用以及如何自定义装饰器,让你的代码更加灵活和强大。
14 2