2.2 双变量分布图 第二章:Seaborn 分布图 (Distribution Plots) 2.2 双变量分布图 (Bivariate Distribution Plots) 在数据可视化领域,理解单个变量的分布固然重要,但现实世界的数据往往更加复杂,变量之间相互关联。双变量分布图 旨在探索和展示两个变量之间的关系和联合分布情况。Seaborn 库作为 Python 中强大的数据可视化工具,提供了多种便捷且美观的双变量分布图,帮助我们深入洞察数据之间的潜在联系。 本节将深入探讨 Seaborn 提供的双变量分布图类型,包括其原理、应用场景、代码实践以及定制方法,助您掌握使用 Seaborn 进行双变量数据分析和可视化的核心技能。 2.2.
在数据可视化领域,理解单个变量的分布固然重要,但现实世界的数据往往更加复杂,变量之间相互关联。双变量分布图 旨在探索和展示两个变量之间的关系和联合分布情况。Seaborn 库作为 Python 中强大的数据可视化工具,提供了多种便捷且美观的双变量分布图,帮助我们深入洞察数据之间的潜在联系。
本节将深入探讨 Seaborn 提供的双变量分布图类型,包括其原理、应用场景、代码实践以及定制方法,助您掌握使用 Seaborn 进行双变量数据分析和可视化的核心技能。
散点图 是最经典且直观的双变量分布图之一,它使用点在二维平面上的位置来表示两个变量的观测值。每个点代表数据集中的一个样本,点的横纵坐标分别对应两个变量的值。散点图能够清晰地展示两个变量之间的关系模式,例如线性关系、非线性关系、正相关、负相关、以及是否存在异常值或聚类现象。
Seaborn 实现:sns.scatterplot()
Seaborn 的 scatterplot() 函数提供了强大的散点图绘制功能,并支持丰富的定制选项。
基本用法:
import seaborn as sns import matplotlib.pyplot as plt # 加载示例数据集(例如:tips 数据集,关于餐厅小费的数据) tips = sns.load_dataset("tips") # 绘制散点图,x 轴为 'total_bill' (总账单),y 轴为 'tip' (小费) sns.scatterplot(x="total_bill", y="tip", data=tips) plt.title("总账单与小费的关系散点图") plt.show()
代码详解:
import seaborn as sns 和 import matplotlib.pyplot as plt: 导入 Seaborn 和 Matplotlib 库,Seaborn 构建于 Matplotlib 之上,通常需要一起使用。
tips = sns.load_dataset("tips"): 加载 Seaborn 内置的 tips 数据集,这是一个常用的示例数据集,包含餐厅顾客的总账单、小费、性别、是否吸烟、日期、时间和顾客人数等信息。
sns.scatterplot(x="total_bill", y="tip", data=tips): 调用 sns.scatterplot() 函数绘制散点图:
x="total_bill": 指定 total_bill 列作为 x 轴的变量。
y="tip": 指定 tip 列作为 y 轴的变量。
data=tips: 指定使用的数据集为 tips。
plt.title("总账单与小费的关系散点图") 和 plt.show(): 使用 Matplotlib 设置图表标题,并显示图表。
定制散点图:
sns.scatterplot() 提供了丰富的参数来定制散点图的外观和信息表达,使其更具信息量和可读性。
hue 参数:添加第三个分类维度
hue 参数允许我们根据第三个分类变量对散点进行着色,从而在二维散点图中展示第三个维度的信息。
sns.scatterplot(x="total_bill", y="tip", hue="sex", data=tips) plt.title("按性别区分的总账单与小费散点图") plt.show()
效果: 不同性别的点会用不同的颜色标记,例如男性用蓝色,女性用橙色,图例会自动生成。
size 参数:添加第三个数值维度
size 参数允许我们根据第三个数值变量调整点的大小,从而在二维散点图中展示第三个数值维度的信息。
sns.scatterplot(x="total_bill", y="tip", size="size", data=tips) plt.title("按顾客人数区分的总账单与小费散点图") plt.show()
效果: 顾客人数较多的点会更大,人数较少的点会更小,图例会自动生成。
style 参数:添加第四个分类维度
style 参数允许我们根据第四个分类变量改变点的形状,从而在二维散点图中展示第四个维度的信息。
sns.scatterplot(x="total_bill", y="tip", hue="sex", style="smoker", data=tips) plt.title("按性别和是否吸烟区分的总账单与小费散点图") plt.show()
效果: 不同性别的点用不同颜色,同时是否吸烟的点用不同的形状(例如,吸烟者用圆形,非吸烟者用叉号),图例会自动生成。
其他常用参数:
alpha: 设置点的透明度,取值范围 0-1 (0 完全透明,1 完全不透明),用于处理数据点重叠的情况。
marker: 设置点的形状,例如 'o' (圆形), 's' (正方形), '^' (三角形) 等,具体形状参考 Matplotlib marker 文档。
palette: 指定调色板,用于 hue 参数的颜色映射,例如 "Blues", "Reds", "viridis" 等,Seaborn 提供了丰富的内置调色板。
sizes: 自定义 size 参数的大小范围,例如 sizes=(20, 200) 设置最小点大小为 20,最大点大小为 200。
markers: 自定义 style 参数的形状映射,例如 markers={"Yes": "X", "No": "o"}。
散点图的应用场景:
探索变量关系: 初步观察两个变量之间是否存在线性、非线性、单调或非单调关系。
识别异常值: 观察图中是否有远离大部分数据点的异常值。
发现聚类模式: 观察数据点是否聚集在某些区域,可能暗示数据存在潜在的类别或分组。
多变量分析的初步探索: 通过 hue、size、style 等参数,初步探索第三甚至第四个变量对双变量关系的影响。
散点图流程图 (Mermaid Graph TD):
图表解释:
数据准备 (Dataset): 首先需要准备包含要分析的两个或多个变量的数据集。
选择 x 轴变量: 确定要作为横坐标的变量。
选择 y 轴变量: 确定要作为纵坐标的变量。
选择 hue (可选): 如果需要,选择一个分类变量用于颜色编码。
选择 size (可选): 如果需要,选择一个数值变量用于点大小编码。
选择 style (可选): 如果需要,选择一个分类变量用于点形状编码。
sns.scatterplot(): 调用 Seaborn 的 scatterplot() 函数,并传入选择的变量和数据集。
生成散点图: Seaborn 根据参数生成散点图。
分析图表,解读变量关系: 观察生成的散点图,分析两个变量之间的关系模式,以及其他维度变量的影响。
联合分布图 不仅展示了两个变量之间的散点关系,还同时展示了每个变量的边缘分布 (marginal distribution)。边缘分布是指单个变量的分布情况,通常用直方图、核密度估计 (KDE) 图或箱线图等形式展示在散点图的上方和右侧。联合分布图能够更全面地展示两个变量的分布特征以及它们之间的关系。
Seaborn 实现:sns.jointplot()
Seaborn 的 jointplot() 函数专门用于绘制联合分布图,它提供了多种 kind 参数来控制联合分布图的类型。
基本用法:
sns.jointplot(x="total_bill", y="tip", data=tips) plt.suptitle("总账单与小费的联合分布图", y=1.02) # 使用 suptitle 设置总标题,避免遮挡子图 plt.show()
代码详解:
sns.jointplot(x="total_bill", y="tip", data=tips) 的基本用法与 sns.scatterplot() 类似,但 jointplot() 会自动在散点图的上方和右侧添加边缘分布图。 默认情况下,边缘分布图是直方图。
kind 参数:选择联合分布图类型
jointplot() 的 kind 参数允许我们选择不同的联合分布图类型,以适应不同的数据和分析需求。
kind='scatter' (默认): 散点图 + 直方图
这是默认类型,联合分布图主体是散点图,边缘分布图是直方图。
sns.jointplot(x="total_bill", y="tip", data=tips, kind='scatter') plt.suptitle("散点图 + 直方图联合分布", y=1.02) plt.show()
kind='kde':核密度估计图 + 核密度估计图
联合分布图主体是二维核密度估计图 (2D KDE),边缘分布图是一维核密度估计图 (1D KDE)。KDE 图通过平滑的方式估计变量的概率密度分布,更适合展示连续变量的分布形状。
sns.jointplot(x="total_bill", y="tip", data=tips, kind='kde') plt.suptitle("核密度估计图联合分布", y=1.02) plt.show()
fill=True 参数: 在 kind='kde' 时,可以使用 fill=True 参数填充等高线之间的区域,使 KDE 图更易于解读。
sns.jointplot(x="total_bill", y="tip", data=tips, kind='kde', fill=True) plt.suptitle("填充的核密度估计图联合分布", y=1.02) plt.show()
cmap 参数: 可以使用 cmap 参数指定 KDE 图的颜色映射,例如 "Blues", "Greens", "viridis" 等。
sns.jointplot(x="total_bill", y="tip", data=tips, kind='kde', fill=True, cmap="Blues") plt.suptitle("蓝色调核密度估计图联合分布", y=1.02) plt.show()
kind='hist':二维直方图 + 直方图
联合分布图主体是二维直方图 (2D Histogram),也称为热力图 (Heatmap),将二维平面划分为网格,用颜色深浅表示每个网格内数据点的数量。边缘分布图是一维直方图。
sns.jointplot(x="total_bill", y="tip", data=tips, kind='hist') plt.suptitle("二维直方图联合分布", y=1.02) plt.show()
cmap 参数: 可以使用 cmap 参数指定二维直方图的颜色映射。
kind='hex':六边形箱图 (Hexbin Plot) + 直方图
联合分布图主体是六边形箱图,与二维直方图类似,但使用六边形网格代替矩形网格,更适合展示数据点密集区域的分布情况,减少网格边界的视觉干扰。边缘分布图是一维直方图。
sns.jointplot(x="total_bill", y="tip", data=tips, kind='hex') plt.suptitle("六边形箱图联合分布", y=1.02) plt.show()
cmap 参数: 可以使用 cmap 参数指定六边形箱图的颜色映射。
kind='reg':散点图 + 线性回归线 + 直方图
联合分布图主体是散点图,并添加了线性回归线和置信区间,边缘分布图是直方图。适用于观察两个变量之间是否存在线性关系,并估计线性关系的强度。
sns.jointplot(x="total_bill", y="tip", data=tips, kind='reg') plt.suptitle("线性回归联合分布", y=1.02) plt.show()
定制联合分布图:
jointplot() 函数返回一个 JointGrid 对象,通过该对象可以进一步定制联合分布图的各个部分。
joint_kws 参数:定制联合分布图主体
joint_kws 参数接受一个字典,用于传递给联合分布图主体的绘图函数 (例如 sns.scatterplot(), sns.kdeplot() 等) 的参数。
sns.jointplot(x="total_bill", y="tip", data=tips, kind='scatter', joint_kws={'alpha': 0.5, 'color': 'purple', 'marker': 'o'}) plt.suptitle("定制散点图主体的联合分布", y=1.02) plt.show()
marginal_kws 参数:定制边缘分布图
marginal_kws 参数接受一个字典,用于传递给边缘分布图的绘图函数 (例如 sns.histplot(), sns.kdeplot() 等) 的参数。
sns.jointplot(x="total_bill", y="tip", data=tips, kind='scatter', marginal_kws={'color': 'skyblue', 'bins': 20}) plt.suptitle("定制边缘直方图的联合分布", y=1.02) plt.show()
annot_kws 参数 (仅 kind='reg'): 定制回归线注释
annot_kws 参数用于定制 kind='reg' 时回归线注释的显示,例如显示 R 平方值、p 值等。
sns.jointplot(x="total_bill", y="tip", data=tips, kind='reg', annot_kws={'line_kws': {'color': 'red'}, 'scatter_kws': {'alpha': 0.6}}) plt.suptitle("定制回归线和散点的联合分布", y=1.02) plt.show()
联合分布图的应用场景:
全面了解双变量分布: 同时观察两个变量的联合分布和边缘分布,更全面地了解数据的分布特征。
选择合适的分布模型: 通过观察边缘分布的形状,可以帮助选择合适的概率分布模型来拟合数据。
评估变量之间的关系强度: 结合散点图和边缘分布,可以更准确地评估两个变量之间的关系强度和类型。
比较不同组别的双变量分布: 可以使用 hue 参数将数据分组,并在同一个联合分布图中比较不同组别的双变量分布差异。
联合分布图流程图 (Mermaid Graph TD):
图表解释:
数据准备 (Dataset): 与散点图相同,需要准备包含两个变量的数据集。
选择 x 轴变量: 确定横坐标变量。
选择 y 轴变量: 确定纵坐标变量。
选择 kind (散点, KDE, 直方图, Hexbin, 回归): 根据分析目标和数据特征,选择合适的联合分布图类型。
sns.jointplot(): 调用 Seaborn 的 jointplot() 函数,并传入变量、数据集和 kind 参数。
生成联合分布图 (主体 + 边缘分布): Seaborn 生成包含主体图 (根据 kind 参数) 和边缘分布图的联合图。
分析图表,解读联合分布和边缘分布: 观察联合分布图,分析两个变量的联合分布特征和各自的边缘分布特征。
成对关系图 (Pair Plot),也称为散点图矩阵 (Scatter Plot Matrix),用于展示数据集中多个变量之间所有可能的成对关系。它会生成一个矩阵式的图表,其中对角线上是每个变量的单变量分布图 (例如直方图或核密度估计图),非对角线上是每两个变量之间的散点图。成对关系图能够快速地概览数据集中所有变量两两之间的关系,是探索高维数据的有力工具。
Seaborn 实现:sns.pairplot()
Seaborn 的 pairplot() 函数可以轻松绘制成对关系图。
基本用法:
iris = sns.load_dataset("iris") # 加载 iris 数据集 (鸢尾花数据集) sns.pairplot(iris) plt.suptitle("鸢尾花数据集的成对关系图", y=1.02) plt.show()
代码详解:
sns.pairplot(iris) 直接传入数据集 iris,Seaborn 会自动选择数据集中的所有数值型变量,并绘制它们之间所有可能的成对关系图。
定制成对关系图:
hue 参数:添加分类维度
与 scatterplot() 和 jointplot() 类似,hue 参数可以根据分类变量对散点进行着色,从而在成对关系图中展示分类信息。
sns.pairplot(iris, hue="species") # 使用 'species' 列进行颜色编码 plt.suptitle("按鸢尾花种类区分的成对关系图", y=1.02) plt.show()
kind 参数:定制非对角线图类型
kind 参数可以控制非对角线上的图类型,默认为散点图 ('scatter'),也可以设置为核密度估计图 ('kde') 或其他类型。
sns.pairplot(iris, kind="kde") # 非对角线使用 KDE 图 plt.suptitle("非对角线使用 KDE 图的成对关系图", y=1.02) plt.show()
diag_kind 参数:定制对角线图类型
diag_kind 参数控制对角线上的单变量分布图类型,默认为直方图 ('hist'),也可以设置为核密度估计图 ('kde') 或其他类型。
sns.pairplot(iris, diag_kind="kde") # 对角线使用 KDE 图 plt.suptitle("对角线使用 KDE 图的成对关系图", y=1.02) plt.show()
vars 参数:选择要绘制的变量
vars 参数允许用户指定要包含在成对关系图中的变量列表,只绘制选定变量之间的关系。
sns.pairplot(iris, vars=["sepal_length", "sepal_width", "petal_length"]) # 只绘制 sepal_length, sepal_width, petal_length 之间的关系 plt.suptitle("部分变量的成对关系图", y=1.02) plt.show()
x_vars 和 y_vars 参数:分别指定 x 轴和 y 轴变量
x_vars 和 y_vars 参数允许分别指定成对关系图中每一列和每一行的变量,可以创建非对称的成对关系图。
sns.pairplot(iris, x_vars=["sepal_length", "sepal_width"], y_vars=["petal_length", "petal_width"]) plt.suptitle("非对称的成对关系图", y=1.02) plt.show()
成对关系图的应用场景:
快速概览高维数据: 快速了解数据集中多个变量两两之间的关系模式。
识别潜在的特征工程方向: 观察变量之间的相关性,可以为特征选择和特征组合提供线索。
初步判断变量之间的关系类型: 观察散点图的形状,初步判断变量之间是否存在线性、非线性关系。
发现数据分布的整体结构: 结合单变量分布和双变量关系,了解数据分布的整体结构和潜在的分组。
成对关系图流程图 (Mermaid Graph TD):
图表解释:
数据准备 (Dataset): 准备包含多个变量的数据集。
选择变量 (全部或指定): 可以选择使用数据集中的所有数值型变量,或使用 vars 参数指定要绘制的变量子集。
选择 hue (可选): 如果需要,选择一个分类变量用于颜色编码。
选择 kind (非对角线类型): 选择非对角线上图表的类型 (默认为散点图)。
选择 diag_kind (对角线类型): 选择对角线上图表的类型 (默认为直方图)。
sns.pairplot(): 调用 Seaborn 的 pairplot() 函数,并传入数据集和参数。
生成成对关系图矩阵: Seaborn 生成包含所有选定变量两两之间关系的图表矩阵。
分析图表矩阵,解读变量间关系: 观察成对关系图矩阵,分析变量之间的关系模式和分布特征。
热力图 主要用于可视化矩阵数据,通过颜色深浅来表示矩阵中元素的大小。在双变量分布的上下文中,热力图常用于可视化相关性矩阵,以展示数据集中变量之间的相关性强度。
Seaborn 实现:sns.heatmap()
Seaborn 的 heatmap() 函数可以绘制热力图,并提供了丰富的定制选项。
基本用法:
correlation_matrix = iris.corr() # 计算 iris 数据集的相关性矩阵 sns.heatmap(correlation_matrix, annot=True, cmap="coolwarm") # 绘制热力图,显示数值,使用 "coolwarm" 调色板 plt.title("鸢尾花数据集变量相关性热力图") plt.show()
代码详解:
correlation_matrix = iris.corr(): 使用 Pandas 的 .corr() 方法计算 iris 数据集的相关性矩阵。相关性矩阵是一个方阵,行和列都是变量名,矩阵中的元素表示对应两个变量之间的相关系数 (通常是 Pearson 相关系数)。
sns.heatmap(correlation_matrix, annot=True, cmap="coolwarm"): 调用 sns.heatmap() 函数绘制热力图:
correlation_matrix: 传入相关性矩阵作为数据。
annot=True: 在热力图的每个单元格中显示数值 (相关系数)。
cmap="coolwarm": 指定使用 "coolwarm" 调色板,该调色板用蓝色表示负相关,红色表示正相关,白色表示接近零相关。
定制热力图:
cmap 参数:选择调色板
cmap 参数用于指定热力图的调色板,Seaborn 提供了丰富的内置调色板,例如 "viridis", "plasma", "magma", "Greens", "Blues", "Reds", "coolwarm", "RdBu_r" 等。选择合适的调色板可以增强热力图的可读性和视觉效果。
annot 参数:显示数值
annot=True 在每个单元格中显示数值,annot=False 则不显示。也可以传入一个与数据矩阵形状相同的布尔矩阵或字符串矩阵,用于更精细地控制数值的显示。
fmt 参数:数值格式
fmt 参数用于指定数值的显示格式,例如 fmt=".2f" 表示保留两位小数的浮点数格式。
linewidths 和 linecolor 参数:单元格边框
linewidths 参数设置单元格边框的宽度,linecolor 参数设置边框颜色。
cbar 参数:颜色棒
cbar=True (默认) 显示颜色棒,cbar=False 则不显示。颜色棒用于解释颜色与数值之间的映射关系。
vmin 和 vmax 参数:颜色范围
vmin 和 vmax 参数用于设置颜色映射的最小值和最大值,超出范围的值会被截断到边界颜色。
热力图的应用场景:
可视化相关性矩阵: 清晰地展示数据集中变量之间的相关性强度和方向。
识别高相关性变量对: 快速找出相关性较高的变量对,用于特征选择或降维。
探索变量之间的依赖关系: 通过观察相关性矩阵,初步了解变量之间的线性依赖关系。
可视化其他矩阵数据: 热力图不仅限于相关性矩阵,还可以用于可视化其他类型的矩阵数据,例如混淆矩阵、距离矩阵、计数矩阵等。
热力图流程图 (Mermaid Graph TD):
图表解释:
数据准备 (Dataset): 准备包含多个变量的数据集。
计算相关性矩阵 (或其他矩阵): 计算变量之间的相关性矩阵,或者准备其他类型的矩阵数据。
选择调色板 (cmap): 选择合适的调色板,以增强热力图的可读性。
设置数值显示 (annot): 决定是否在单元格中显示数值。
sns.heatmap(): 调用 Seaborn 的 heatmap() 函数,并传入矩阵数据和参数。
生成热力图: Seaborn 生成热力图。
分析热力图,解读矩阵数据: 观察热力图,分析矩阵数据中蕴含的信息,例如相关性强度、数值大小分布等。