2.3 分对分布图 (pairplot) Seaborn 分布图详解:探索数据关系的利器 - 分对分布图 (pairplot) 在数据可视化领域,理解数据集中变量之间的关系至关重要。Seaborn 库作为 Python 中强大的可视化工具,为我们提供了多种分布图,帮助我们从不同角度探索数据。在“第二章:Seaborn分布图 (Distribution Plots)”中,分对分布图 (pairplot) 占据着重要的地位。它能够一次性展示数据集中多个变量两两之间的关系,是进行探索性数据分析 (Exploratory Data Analysis, EDA) 的强大工具。 2.3 分对分布图 (pairplot) 概览 的核心功能在于 “成对” 分析数据集中的变量。
在数据可视化领域,理解数据集中变量之间的关系至关重要。Seaborn 库作为 Python 中强大的可视化工具,为我们提供了多种分布图,帮助我们从不同角度探索数据。在“第二章:Seaborn分布图 (Distribution Plots)”中,分对分布图 (pairplot) 占据着重要的地位。它能够一次性展示数据集中多个变量两两之间的关系,是进行探索性数据分析 (Exploratory Data Analysis, EDA) 的强大工具。
pairplot 的核心功能在于 “成对” 分析数据集中的变量。它会创建一个由多个子图组成的矩阵,其中:
对角线 (Diagonal): 显示每个变量自身的分布情况。通常使用直方图 (histogram) 或核密度估计图 (Kernel Density Estimate, KDE)。
非对角线 (Off-diagonal): 显示两个变量之间的关系。通常使用散点图 (scatter plot)。
通过 pairplot,我们可以快速地:
识别变量之间的相关性: 观察散点图的趋势,判断变量之间是否存在线性或非线性关系,以及关系的强度。
了解变量的分布形态: 通过对角线上的直方图或 KDE 图,了解每个变量的数据分布情况,例如是否为正态分布、偏态分布等。
发现潜在的数据模式: 例如,通过颜色编码 (hue) 引入分类变量,可以观察不同类别在变量关系上的差异,从而发现更深层次的数据模式。
总而言之,pairplot 提供了一个高效的方式,让我们从全局视角审视数据集,快速捕捉变量间的复杂关系,为后续的数据分析和建模提供有价值的线索。
pairplot 的创建首先,我们需要导入必要的库:
import seaborn as sns import matplotlib.pyplot as plt # 设置 Seaborn 默认样式,使图表更美观 sns.set(style="whitegrid")
为了演示 pairplot 的使用,我们将使用 Seaborn 内置的 iris (鸢尾花) 数据集。这是一个经典的数据集,包含萼片长度、萼片宽度、花瓣长度、花瓣宽度四个数值型变量,以及鸢尾花种类 (species) 一个分类变量。
iris = sns.load_dataset('iris') print(iris.head())
输出结果 (部分):
sepal_length sepal_width petal_length petal_width species 0 5.1 3.5 1.4 0.2 setosa 1 4.9 3.0 1.4 0.2 setosa 2 4.7 3.2 1.3 0.2 setosa 3 4.6 3.1 1.5 0.2 setosa 4 5.0 3.6 1.4 0.2 setosa
现在,我们使用 sns.pairplot() 创建基础的分对分布图:
sns.pairplot(iris) plt.show()
运行这段代码,您将看到一个 4x4 的矩阵图。
图表解析:
对角线 (从左上角到右下角): 显示了 sepal_length, sepal_width, petal_length, petal_width 这四个变量的直方图。例如,第一行第一列的子图显示了 sepal_length 的直方图。
非对角线: 显示了变量两两之间的散点图。例如,第一行第二列的子图显示了 sepal_length (y轴) 和 sepal_width (x轴) 的散点图。
通过这个基础的 pairplot,我们可以初步观察到:
petal_length 和 petal_width 似乎呈现较强的正相关关系 (散点图呈上升趋势)。
sepal_length 和 sepal_width 的相关性相对较弱 (散点图较为分散)。
各个变量的分布形态大致呈现单峰分布,但可能存在一定的偏斜。
pairplot 的结构可视化为了更清晰地理解 pairplot 的结构,我们可以使用 Mermaid 语法绘制一个流程图:
图表解释:
数据集 (DataFrame): pairplot 函数的输入是包含多个变量的数据集 (通常是 Pandas DataFrame)。
pairplot 函数: Seaborn 的 pairplot 函数接收数据集作为参数。
变量列名列表: pairplot 内部会获取数据集的列名,用于确定要绘制的变量。
循环遍历变量列名: pairplot 通过两层循环遍历变量列名列表,外层循环确定 X 轴变量,内层循环确定 Y 轴变量。
判断 X == Y: 在循环中,pairplot 会判断当前 X 轴变量和 Y 轴变量是否相同。
是 (X == Y): 如果相同,则在对角线上绘制该变量自身的分布图 (直方图或 KDE)。
否 (X != Y): 如果不同,则在非对角线上绘制 X 轴变量和 Y 轴变量的散点图。
绘制分布图/散点图: 根据判断结果,选择绘制相应的图表类型。
子图: 每个变量对 (或单个变量) 的图表都作为一个子图。
矩阵图: 所有子图按照变量顺序排列,组成一个矩阵形式的图表。
输出 pairplot: 最终生成并显示 pairplot 矩阵图。
这个 Mermaid 图表清晰地展示了 pairplot 的内部工作逻辑,帮助我们更好地理解其结构和绘制过程。
pairplot 的外观和功能pairplot 提供了丰富的参数,允许我们高度定制图表的外观和功能,以满足不同的分析需求。
hue 参数:引入分类变量hue 参数是 pairplot 最强大的功能之一。它可以接受一个分类变量的列名,并根据该变量的不同类别,在散点图中使用不同的颜色进行编码。这使得我们能够观察不同类别在变量关系上的差异。
例如,我们可以使用 iris 数据集中的 species 列作为 hue 参数:
sns.pairplot(iris, hue='species') plt.show()
图表解析:
现在,散点图中的每个点都根据鸢尾花的种类 (setosa, versicolor, virginica) 进行了颜色编码。
对角线上的直方图也变成了堆叠直方图,或者核密度估计图 (取决于 diag_kind 参数,稍后介绍),以展示不同类别在单个变量上的分布差异。
通过 hue='species',我们可以观察到:
不同种类的鸢尾花在 petal_length 和 petal_width 上的分布差异非常明显,setosa 种类的花瓣明显更短更窄。
不同种类在 sepal_length 和 sepal_width 上的差异相对较小,但仍然可以观察到一些区分。
palette 参数:自定义颜色方案当我们使用 hue 参数时,Seaborn 会自动选择默认的颜色方案。我们可以使用 palette 参数来自定义颜色方案。palette 参数接受 Seaborn 预定义的颜色调色板名称,或者 Matplotlib 的颜色列表。
例如,使用 "husl" 调色板:
sns.pairplot(iris, hue='species', palette='husl') plt.show()
Seaborn 提供了多种预定义的调色板,例如 "deep", "muted", "pastel", "bright", "dark", "colorblind" 等。您也可以使用 Matplotlib 的颜色名称或 RGB 值列表自定义颜色。
vars 参数:选择要绘制的变量默认情况下,pairplot 会绘制数据集中的所有数值型变量。如果数据集包含很多变量,或者我们只关注部分变量的关系,可以使用 vars 参数来指定要绘制的变量列名列表。
例如,只绘制 sepal_length, sepal_width, species 的 pairplot:
sns.pairplot(iris, vars=['sepal_length', 'sepal_width'], hue='species') plt.show()
此时,pairplot 只会生成一个 2x2 的矩阵图,只包含 sepal_length 和 sepal_width 两个变量。
kind 参数:修改非对角线图表类型kind 参数用于指定非对角线子图的类型。默认值为 'scatter' (散点图)。还可以选择其他类型:
'hist': 绘制二维直方图。
'kde': 绘制二维核密度估计图。
'reg': 绘制带有线性回归线的散点图。
例如,使用 'kde' 类型:
sns.pairplot(iris, hue='species', kind='kde') plt.show()
非对角线子图将变为二维 KDE 图,展示变量之间的联合概率密度分布。
diag_kind 参数:修改对角线图表类型diag_kind 参数用于指定对角线子图的类型。默认值为 'hist' (直方图)。还可以选择 'kde' (核密度估计图)。
例如,使用 'kde' 类型:
sns.pairplot(iris, hue='species', diag_kind='kde') plt.show()
对角线子图将变为 KDE 图,更平滑地展示变量的分布形态。当使用 hue 参数时,diag_kind='kde' 通常更适合展示不同类别的分布差异,因为 KDE 图可以更清晰地展示分布的形状和重叠程度。
markers 和 plot_kws 参数:进一步定制散点图markers 参数可以用于自定义散点图中不同类别的标记形状。它接受一个列表或字典,指定不同类别使用的标记。
plot_kws 参数允许我们传递额外的关键字参数给底层的 Matplotlib 绘图函数,以进一步定制散点图的细节,例如标记大小、透明度等。
例如,自定义标记形状和大小:
sns.pairplot(iris, hue='species', markers=['o', 's', 'D'], plot_kws={'s': 50, 'alpha': 0.8}) plt.show()
markers=['o', 's', 'D']:分别使用圆形、正方形、菱形作为 setosa, versicolor, virginica 的标记。
plot_kws={'s': 50, 'alpha': 0.8}:设置标记大小为 50,透明度为 0.8。
corner 参数:创建角落图当变量较多时,完整的 pairplot 矩阵可能会显得冗余,因为矩阵的上下三角部分是镜像对称的。corner=True 参数可以只绘制矩阵的下三角部分,创建一个角落图,减少冗余信息,使图表更简洁。
sns.pairplot(iris, hue='species', corner=True) plt.show()
此时,pairplot 只会显示矩阵的下三角部分,对角线和下方的子图仍然保留,上方的子图被省略。
grid_kws 参数:定制底层 PairGrid 对象pairplot 函数实际上是基于 Seaborn 的 PairGrid 类构建的。grid_kws 参数允许我们传递字典给 PairGrid 构造函数,以定制底层的 PairGrid 对象。这提供了更底层的定制能力,例如调整子图之间的间距、添加共享坐标轴标签等。
例如,调整子图间距:
sns.pairplot(iris, hue='species', grid_kws={'wspace': 0.3, 'hspace': 0.3}) plt.show()
grid_kws={'wspace': 0.3, 'hspace': 0.3} 设置了子图之间的水平和垂直间距为 0.3。
pairplot 图表:从视觉模式到数据洞察pairplot 不仅仅是一个可视化工具,更重要的是如何解读它所呈现的信息,从中提取有价值的数据洞察。以下是一些解读 pairplot 的关键点:
散点图的趋势:
正相关: 散点图呈现从左下角到右上角的趋势,表明两个变量呈正相关关系,一个变量增大时,另一个变量也倾向于增大。
负相关: 散点图呈现从左上角到右下角的趋势,表明两个变量呈负相关关系,一个变量增大时,另一个变量倾向于减小。
无相关性: 散点图呈随机分布,没有明显的趋势,表明两个变量之间可能没有线性关系。
散点图的密度和形状:
线性关系 vs. 非线性关系: 如果散点图近似呈直线分布,可能存在线性关系。如果呈曲线或其他形状分布,可能存在非线性关系。
聚类: 散点图中出现明显的点簇,可能表明数据存在分组或类别。
离群点: 散点图中远离主体数据点的点,可能是离群点,需要进一步 investigation。
直方图/KDE 图的分布形态:
正态分布: 直方图呈钟形曲线,KDE 图呈平滑的钟形曲线,表明数据近似服从正态分布。
偏态分布: 直方图或 KDE 图的峰值偏向一侧,表明数据分布不对称。
多峰分布: 直方图或 KDE 图出现多个峰值,可能表明数据由多个不同的分布混合而成。
hue 参数带来的类别差异:
比较不同类别在散点图中的分布位置和形状,可以了解不同类别在变量关系上的差异。
比较不同类别在直方图/KDE 图中的分布形态,可以了解不同类别在单个变量上的分布差异。
结合 iris 数据集的例子,我们可以总结出一些洞察:
花瓣长度和花瓣宽度是区分鸢尾花种类的关键特征。 不同种类的花瓣长度和宽度差异显著,散点图和直方图都清晰地展示了这一点。
萼片长度和萼片宽度在区分种类上的作用相对较小。 虽然不同种类在萼片长度和宽度上也有一定差异,但不如花瓣特征明显。
setosa 种类的花瓣明显比其他两种短而窄。 散点图和直方图都显示 setosa 种类的数据点明显集中在花瓣长度和宽度较小的区域。
数据准备: 在使用 pairplot 之前,确保数据已经过清洗和预处理,例如处理缺失值、异常值等。
选择合适的变量: 根据分析目的,选择最相关的变量进行可视化。避免绘制过多不相关的变量,导致图表过于复杂和难以解读。
合理使用 hue 参数: hue 参数是强大的工具,但也要谨慎使用。如果分类变量类别过多,颜色编码可能会变得混乱,影响图表的可读性。
根据数据特点选择 kind 和 diag_kind: 根据数据分布和分析目的,选择合适的图表类型。例如,如果关注变量的联合概率密度分布,可以使用 kind='kde';如果关注变量的边缘分布,可以使用 diag_kind='kde'。
定制图表外观: 利用 palette, markers, plot_kws 等参数,定制图表的外观,使其更美观、更易于理解。
结合领域知识进行解读: pairplot 只是一个可视化工具,最终的数据洞察还需要结合领域知识进行深入解读和分析。
pairplot 是 Seaborn 库中一个非常实用的分布图,它能够高效地展示数据集中多个变量两两之间的关系,帮助我们快速进行探索性数据分析,发现数据中的模式、相关性和潜在的类别差异。通过灵活运用 pairplot 的各种参数,我们可以定制出满足不同分析需求的可视化图表,并从中提取有价值的数据洞察,为后续的建模和决策提供支持。掌握 pairplot 的使用,无疑会大大提升您的数据分析效率和可视化能力。