5.2 聚类热力图 (clustermap)


文档摘要

5.2 聚类热力图 (clustermap) 第五章:Seaborn 矩阵图 (Matrix Plots) - 5.2 聚类热力图 (clustermap) 详解 Seaborn 库作为 Python 数据可视化领域的佼佼者,提供了强大的矩阵图绘制功能,帮助我们有效地展示和分析二维数据。在矩阵图中,热力图 (heatmap) 是一种常用的可视化方式,它通过颜色的深浅来表示数据的大小,直观地展现数据的分布和模式。而聚类热力图 ( ) 则在热力图的基础上更进一步,它不仅展示数据的大小,还通过层次聚类算法对行和列同时进行聚类,并以树状图 (dendrogram) 的形式展现聚类结果,从而帮助我们发现数据中隐藏的结构和关系。

5.2 聚类热力图 (clustermap)

第五章:Seaborn 矩阵图 (Matrix Plots) - 5.2 聚类热力图 (clustermap) 详解

Seaborn 库作为 Python 数据可视化领域的佼佼者,提供了强大的矩阵图绘制功能,帮助我们有效地展示和分析二维数据。在矩阵图中,热力图 (heatmap) 是一种常用的可视化方式,它通过颜色的深浅来表示数据的大小,直观地展现数据的分布和模式。而聚类热力图 (clustermap) 则在热力图的基础上更进一步,它不仅展示数据的大小,还通过层次聚类算法对行和列同时进行聚类,并以树状图 (dendrogram) 的形式展现聚类结果,从而帮助我们发现数据中隐藏的结构和关系。

本节将深入探讨 Seaborn 的 clustermap 函数,包括其原理、参数详解、代码实践以及结果解读,帮助您充分利用聚类热力图进行数据探索和分析。

5.2.1 聚类热力图 (clustermap) 的概念与优势

传统的热力图 (heatmap) 主要关注数据的数值大小,通过颜色编码来展现矩阵数据。它可以有效地展示数据的整体分布和数值范围,但对于发现数据中潜在的结构性模式,例如行与行、列与列之间的相似性关系,则显得力不从心。

聚类热力图 (clustermap) 的出现弥补了这一不足。它将热力图层次聚类算法相结合,不仅能够展示数据的大小,还能同时揭示数据的内在结构。clustermap 的核心优势在于:

  1. 同时展示数据值和聚类结构: clustermap 不仅以热力图的形式展示原始数据矩阵,还在图的边缘添加了行和列的树状图 (dendrogram),清晰地展示了行和列的聚类结果。这使得我们能够同时观察数据值和数据之间的相似性关系。

  2. 发现隐藏的数据模式: 通过层次聚类,clustermap 可以自动地将相似的行和列聚集在一起,从而帮助我们发现数据中潜在的群组结构和模式。这在生物信息学、市场营销、社交网络分析等领域尤其有用,例如基因表达数据的分析、用户行为的细分等。

  3. 增强数据解读的深度: 树状图提供了关于聚类过程的详细信息,例如哪些行/列最相似,聚类的层次结构等。结合热力图的颜色信息,我们可以更深入地理解数据的特征和关系,从而得出更富有洞察力的结论。

  4. 直观且信息量丰富: clustermap 将复杂的聚类分析结果以图形化的方式呈现出来,相比于纯粹的数值结果,更易于理解和沟通。它能够有效地传达数据中的多维度信息,提升数据分析的效率和效果。

5.2.2 seaborn.clustermap() 函数详解

Seaborn 库通过 seaborn.clustermap() 函数来实现聚类热力图的绘制。该函数功能强大,提供了丰富的参数来控制聚类过程、热力图样式和树状图的显示。

函数签名:

seaborn.clustermap( data, *, pivot_kws=None, method='average', metric='euclidean', z_score=None, standard_scale=None, cmap=None, center=None, robust=False, cbar_kws=None, row_cluster=True, col_cluster=True, row_linkage=None, col_linkage=None, row_colors=None, col_colors=None, mask=None, dendrogram_ratio=(0.2, 0.2), colors_ratio=(0.03, 0.03), cbar_pos=('right', 'top'), tree_kws=None, figsize=(10, 10), gridspec_kws=None, **kwargs, )

核心参数详解:

  • data: 必需参数。输入的数据集,可以是 Pandas DataFrame、NumPy 数组或者可以转换为 DataFrame 的数据结构。这是 clustermap 要处理和可视化的核心数据。

  • method: 指定层次聚类算法中使用的连接方法 (linkage method)。默认为 'average' (平均连接)。其他常用的方法包括:

    • 'single' (单连接): 也称为最近邻连接,聚类簇之间的距离定义为两个簇中最近点之间的距离。

    • 'complete' (全连接): 也称为最远邻连接,聚类簇之间的距离定义为两个簇中最远点之间的距离。

    • 'average' (平均连接): 聚类簇之间的距离定义为两个簇中所有点对之间距离的平均值。

    • 'weighted' (加权平均连接): 类似于平均连接,但在计算平均值时,考虑每个簇的大小。

    • 'centroid' (质心连接): 聚类簇之间的距离定义为两个簇质心之间的距离。

    • 'median' (中位数连接): 类似于质心连接,但使用中位数而不是平均值来定义质心。

    • 'ward' (Ward 方差最小化算法): 旨在最小化簇内方差的增加。通常用于欧氏距离。

    选择合适的 method 对聚类结果有重要影响,需要根据数据的特性和分析目标进行选择。

  • metric: 指定计算距离时使用的距离度量 (distance metric)。默认为 'euclidean' (欧氏距离)。其他常用的度量包括:

    • 'euclidean' (欧氏距离): 两点之间直线距离。

    • 'cityblock' (曼哈顿距离): 也称为出租车距离,两点在标准坐标系上的绝对轴距总和。

    • 'cosine' (余弦距离): 衡量两个向量方向的差异,常用于文本相似度分析。

    • 'correlation' (相关系数距离): 基于皮尔逊相关系数计算距离,衡量变量之间的线性相关性。

    • 'hamming' (汉明距离): 用于度量两个等长字符串之间的汉明距离,即对应位置字符不同的数量。常用于分类数据。

    选择合适的 metric 同样重要,需要根据数据的类型和要衡量的相似性进行选择。例如,对于数值型数据,欧氏距离或曼哈顿距离常用;对于文本数据,余弦距离可能更合适。

  • z_score: 是否对数据进行 Z-score 标准化。可以设置为 0 (按行标准化) 或 1 (按列标准化)。Z-score 标准化将数据转换为均值为 0,标准差为 1 的分布,有助于消除不同变量量纲的影响,突出数据的相对差异。

  • standard_scale: 是否对数据进行标准化,使其均值为 0,标准差为 1。 可以设置为 0 (按行标准化) 或 1 (按列标准化)。与 z_score 类似,但 standard_scale 直接减去均值并除以标准差,而 z_score 在某些情况下可能会使用更稳健的估计。

  • cmap: 指定热力图的颜色映射 (colormap)。可以使用 Matplotlib 支持的任何颜色映射名称或 Colormap 对象,例如 'viridis', 'plasma', 'magma', 'coolwarm', 'RdBu' 等。选择合适的 cmap 可以增强热力图的可读性和视觉效果。

  • center: 指定颜色映射的中心值。如果设置了 center 值,颜色映射将以该值为中心对称分布。这对于突出显示数据中偏离中心值的情况很有用。

  • robust: 是否使用稳健的百分位数来计算颜色映射的范围。如果设置为 True,则颜色映射的范围将基于数据的 2% 和 98% 百分位数,而不是最小值和最大值。这有助于减少异常值对颜色映射的影响。

  • cbar_kws: 传递给 matplotlib.figure.Figure.colorbar() 的参数字典,用于自定义颜色棒 (colorbar) 的外观,例如标签、刻度等。

  • row_cluster: 是否对行进行聚类。默认为 True。设置为 False 则不进行行聚类,只显示原始行顺序的热力图。

  • col_cluster: 是否对列进行聚类。默认为 True。设置为 False 则不进行列聚类,只显示原始列顺序的热力图。

  • row_linkage: 预先计算好的行聚类连接矩阵 (linkage matrix)。如果提供了 row_linkage,则 clustermap 将使用该连接矩阵,而不再重新计算行聚类。这允许用户使用自定义的聚类算法或参数。

  • col_linkage: 预先计算好的列聚类连接矩阵 (linkage matrix)。与 row_linkage 类似,用于提供预先计算的列聚类结果。

  • row_colors: 为每一行添加额外的颜色条。可以是 Pandas Series 或 DataFrame,长度或列数需要与 data 的行数匹配。用于在热力图旁边展示行级别的分类信息或其他属性。

  • col_colors: 为每一列添加额外的颜色条。与 row_colors 类似,用于展示列级别的分类信息或其他属性。

  • mask: 布尔型数组,用于遮盖热力图中的某些单元格。True 值表示遮盖,False 值表示显示。常用于处理缺失值或突出显示特定区域。

  • dendrogram_ratio: 控制树状图相对于热力图的宽度和高度的比例。默认为 (0.2, 0.2)。调整该参数可以改变树状图的大小。

  • colors_ratio: 控制颜色条相对于热力图的宽度和高度的比例。默认为 (0.03, 0.03)。调整该参数可以改变颜色条的大小。

  • cbar_pos: 指定颜色棒的位置。可以是 ('right', 'top'), ('right', 'bottom'), ('left', 'top'), ('left', 'bottom')

  • tree_kws: 传递给 matplotlib.lines.Line2D 的参数字典,用于自定义树状图线条的样式,例如颜色、线宽等。

  • figsize: 指定整个图形的尺寸,例如 (10, 10)

  • gridspec_kws: 传递给 matplotlib.gridspec.GridSpec 的参数字典,用于更精细地控制子图布局。

  • **kwargs: 其他传递给 seaborn.heatmap() 的参数,用于自定义热力图的样式,例如 annot (是否显示数值标签), fmt (数值标签格式), linewidths (单元格边框线宽), linecolor (单元格边框颜色) 等。

5.2.3 代码实践与内容详解

为了更好地理解 clustermap 的使用,我们通过几个代码示例进行演示。我们将使用 Seaborn 自带的 flights 数据集,该数据集记录了 1949 年至 1960 年间每月国际航空旅客的数量。

示例 1: 绘制基本聚类热力图

import seaborn as sns import matplotlib.pyplot as plt # 加载 flights 数据集 flights = sns.load_dataset("flights") flights_pivot = flights.pivot_table(index="month", columns="year", values="passengers") # 绘制基本的 clustermap sns.clustermap(flights_pivot) plt.suptitle("Basic Clustermap of Flights Data", y=0.95) # 添加总标题 plt.show()

代码详解:

  1. 加载数据集: 使用 sns.load_dataset("flights") 加载 Seaborn 内置的 flights 数据集。

  2. 数据透视: 使用 flights.pivot_table() 将数据转换为适合热力图展示的矩阵形式。index="month" 指定行索引为月份,columns="year" 指定列索引为年份,values="passengers" 指定数值为乘客数量。

  3. 绘制 clustermap: sns.clustermap(flights_pivot) 使用默认参数绘制聚类热力图。默认情况下,clustermap 会对行和列都进行聚类,并使用欧氏距离和平均连接方法。

  4. 添加标题: plt.suptitle() 添加整个图的标题,y=0.95 调整标题的垂直位置。

  5. 显示图形: plt.show() 显示绘制的图形。

图形解读:

运行代码后,您将看到一个基本的聚类热力图。

  • 热力图 (Heatmap): 颜色深浅表示乘客数量,颜色越深表示乘客数量越多。

  • 行树状图 (Row Dendrogram - Month): 位于热力图左侧,展示了月份的聚类结果。相似月份在树状图上距离更近。

  • 列树状图 (Column Dendrogram - Year): 位于热力图上方,展示了年份的聚类结果。相似年份在树状图上距离更近。

通过观察树状图和热力图,我们可以初步发现:

  • 月份聚类: 夏季月份(如 6, 7, 8 月)往往聚在一起,冬季月份(如 1, 2, 12 月)也可能聚在一起,这反映了季节性对航空旅行的影响。

  • 年份聚类: 早期的年份(如 1949, 1950 年)可能聚在一起,晚期的年份(如 1959, 1960 年)也可能聚在一起,这反映了航空旅行的增长趋势。

示例 2: 自定义聚类参数和颜色映射

import seaborn as sns import matplotlib.pyplot as plt flights = sns.load_dataset("flights") flights_pivot = flights.pivot_table(index="month", columns="year", values="passengers") # 自定义聚类方法、距离度量和颜色映射 sns.clustermap( flights_pivot, method="ward", # 使用 Ward 方差最小化算法 metric="euclidean", # 使用欧氏距离 cmap="viridis", # 使用 viridis 颜色映射 standard_scale=1, # 按列进行标准化 figsize=(12, 10) # 设置图形尺寸 ) plt.suptitle("Clustermap with Custom Parameters", y=0.95) plt.show()

代码详解:

  • method="ward": 将连接方法设置为 Ward 算法。Ward 算法倾向于生成大小相对均衡的簇,并最小化簇内的方差。

  • metric="euclidean": 明确指定使用欧氏距离。

  • cmap="viridis": 使用 'viridis' 颜色映射,这是一个感知均匀的颜色映射,更适合表示数值数据。

  • standard_scale=1: 按列进行标准化。这会将每一年份的数据进行 Z-score 标准化,使得不同年份的数据在同一尺度上进行比较,突显年份之间的相对变化模式。

  • figsize=(12, 10): 增大图形尺寸,使图形更清晰。

图形解读:

通过自定义参数,我们可能得到不同的聚类结果和视觉效果。

  • 颜色映射 'viridis': 提供了更连续和均匀的颜色过渡,更易于观察数据细微的变化。

  • 按列标准化: 使得热力图更侧重于展示每一年份内月份之间的相对乘客数量变化,而不是绝对数量。

  • Ward 算法: 可能会产生与默认平均连接方法不同的聚类结果,需要根据具体数据和分析目标进行评估。

示例 3: 添加行颜色条和列颜色条

import seaborn as sns import matplotlib.pyplot as plt import pandas as pd flights = sns.load_dataset("flights") flights_pivot = flights.pivot_table(index="month", columns="year", values="passengers") # 创建月份颜色条 month_colors = pd.Series(flights_pivot.index).map({ "Jan": "red", "Feb": "red", "Mar": "red", "Apr": "blue", "May": "blue", "Jun": "blue", "Jul": "green", "Aug": "green", "Sep": "green", "Oct": "purple", "Nov": "purple", "Dec": "purple" }) # 创建年份颜色条 (简单示例,可以根据年份分组) year_colors = pd.Series(flights_pivot.columns).map({ 1949: "lightgray", 1950: "lightgray", 1951: "lightgray", 1952: "lightgray", 1953: "lightgray", 1954: "gray", 1955: "gray", 1956: "gray", 1957: "gray", 1958: "gray", 1959: "darkgray", 1960: "darkgray" }) # 绘制 clustermap 并添加颜色条 sns.clustermap( flights_pivot, row_colors=month_colors, col_colors=year_colors, cmap="YlGnBu", figsize=(14, 12) ) plt.suptitle("Clustermap with Row and Column Colors", y=0.95) plt.show()

代码详解:

  1. 创建月份颜色条 month_colors: 使用 Pandas Series 和 map() 函数,根据月份将颜色映射到不同的类别 (例如,红色代表冬季,蓝色代表春季,绿色代表夏季,紫色代表秋季)。

  2. 创建年份颜色条 year_colors: 类似地,根据年份分组 (例如,浅灰色代表早期年份,灰色代表中期年份,深灰色代表晚期年份) 创建颜色条。

  3. row_colors=month_colors: 将 month_colors 传递给 row_colors 参数,在热力图左侧添加月份颜色条。

  4. col_colors=year_colors: 将 year_colors 传递给 col_colors 参数,在热力图上方添加年份颜色条。

  5. cmap="YlGnBu": 使用 'YlGnBu' 颜色映射,这是一个从黄色到绿色再到蓝色的渐变色,适合表示数值大小。

图形解读:

  • 行颜色条 (Month Colors): 在热力图左侧显示,不同颜色代表不同的月份类别,帮助我们快速识别不同季节月份的聚类模式。

  • 列颜色条 (Year Colors): 在热力图上方显示,不同颜色代表不同的年份组别,帮助我们理解不同时期年份的聚类特征。

添加颜色条可以有效地将额外的分类信息整合到 clustermap 中,增强数据的多维度解读能力。

示例 4: 不进行行或列聚类

import seaborn as sns import matplotlib.pyplot as plt flights = sns.load_dataset("flights") flights_pivot = flights.pivot_table(index="month", columns="year", values="passengers") # 不进行行和列聚类 sns.clustermap( flights_pivot, row_cluster=False, # 关闭行聚类 col_cluster=False, # 关闭列聚类 cmap="coolwarm", annot=True, # 显示数值标签 fmt="d", # 数值标签格式为整数 linewidths=.5, # 单元格边框线宽 linecolor="black", # 单元格边框颜色 figsize=(12, 10) ) plt.suptitle("Clustermap without Clustering", y=0.95) plt.show()

代码详解:

  • row_cluster=False: 禁用行聚类。

  • col_cluster=False: 禁用列聚类。

  • annot=True: 在热力图单元格中显示数值标签。

  • fmt="d": 设置数值标签格式为整数。

  • linewidths=.5: 设置单元格边框线宽为 0.5。

  • linecolor="black": 设置单元格边框颜色为黑色。

  • cmap="coolwarm": 使用 'coolwarm' 颜色映射,这是一个适合表示中心对称数据的颜色映射。

图形解读:

row_clustercol_cluster 都设置为 False 时,clustermap 实际上退化成了一个普通的热力图,不再进行聚类,也不显示树状图。但它仍然可以使用 clustermap 函数提供的其他参数,例如颜色映射、数值标签、边框样式等。

5.2.4 聚类热力图的应用场景

聚类热力图在多个领域都有广泛的应用,以下列举一些常见的场景:

  • 生物信息学:

    • 基因表达数据分析: 分析基因表达谱数据,发现基因和样本的聚类模式,识别共表达基因和相似的样本类型。

    • 蛋白质组学数据分析: 分析蛋白质丰度数据,发现蛋白质之间的关联和样本的分类。

    • 微生物组学数据分析: 分析微生物群落组成数据,揭示微生物之间的共现模式和样本的生态类型。

  • 市场营销:

    • 客户细分: 根据客户的购买行为、人口统计学特征等数据,进行客户聚类,识别不同的客户群体,为个性化营销提供支持。

    • 产品关联分析: 分析产品的销售数据,发现产品之间的关联性,例如哪些产品经常被同时购买,用于产品推荐和捆绑销售。

  • 社交网络分析:

    • 社区发现: 分析社交网络结构数据,发现社交网络中的社区结构,识别用户群体和兴趣圈子。

    • 用户行为分析: 分析用户在社交网络上的行为数据,例如关注关系、互动行为等,发现用户之间的相似性和行为模式。

  • 金融分析:

    • 股票市场分析: 分析股票价格波动数据,发现股票之间的关联性,识别行业板块和风险相似的股票。

    • 风险评估: 分析金融风险指标数据,例如违约率、坏账率等,对金融机构或客户进行风险评估和分类。

  • 图像处理:

    • 图像分割: 将图像像素根据颜色、纹理等特征进行聚类,实现图像分割。

    • 图像检索: 将图像特征向量进行聚类,实现基于内容的图像检索。

  • 文本挖掘:

    • 文档聚类: 将文档根据内容相似性进行聚类,实现文档主题发现和分类。

    • 关键词提取: 分析关键词共现矩阵,发现关键词之间的关联性,提取文本主题和关键词。

总而言之,只要涉及到需要分析二维数据矩阵,并希望发现行和列之间结构性关系的应用场景,聚类热力图都可以发挥重要的作用。

5.2.5 总结

seaborn.clustermap() 函数是 Seaborn 库中一个强大的数据可视化工具,它将热力图与层次聚类算法相结合,能够有效地展示数据矩阵的数值大小和聚类结构。通过灵活调整 clustermap 的参数,我们可以自定义聚类方法、距离度量、颜色映射、颜色条等,以满足不同的数据分析需求。

本文详细介绍了 clustermap 的概念、函数参数、代码实践和应用场景,希望能帮助您掌握聚类热力图的使用,并将其应用到实际的数据分析工作中,挖掘数据中隐藏的价值。 掌握 clustermap 将极大地提升您在数据探索和可视化方面的能力,尤其是在处理复杂矩阵数据和需要发现结构性模式的任务中。


发布者: 作者: 转发
评论区 (0)
U