数据可视化项目异常检测算法与数据报表生成 - 第4节
4.1 统计图表绘制:从分布到趋势
Seaborn 在统计图表绘制上提供了比 Matplotlib 更高层的 API,能够自动计算并展示数据的统计特征。核心函数包括 distplot(已弃用,推荐 histplot / kdeplot)、jointplot、pairplot 以及 lineplot。
4.1.1 单变量分布:直方图与核密度估计
histplot 用于绘制直方图,可叠加核密度估计曲线;kdeplot 则单独绘制平滑的密度曲线。两者均支持 hue 分组与 multiple 参数控制堆叠或填充样式。
| 函数 | 用途 | 关键参数 |
|---|---|---|
histplot | 直方图 + 可选 KDE | bins, kde, hue, multiple |
kdeplot | 核密度估计曲线 | bw_method, cut, clip |
ecdfplot | 经验累积分布函数 | hue, stat |
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")
sns.histplot(data=tips, x="total_bill", kde=True, bins=30)
plt.title("Total Bill 分布(含 KDE)")
plt.show()
kde 或降低 bins 数量,避免渲染过慢。异常检测场景中,直方图尾部拖长往往提示离群点存在。
4.1.2 多变量关系:jointplot 与 pairplot
jointplot 展示两个变量的联合分布,中央为散点图或密度图,边缘为直方图或箱线图。pairplot 则对数据集中所有数值列两两绘制散点图,对角线为单变量分布。
sns.jointplot(data=tips, x="total_bill", y="tip", kind="hex", color="#3498db")
plt.suptitle("Total Bill vs Tip 联合分布(六边形分箱)", y=1.02)
plt.show()
jointplot 中,远离主密度区域的孤立点即为潜在异常。可结合 kind="kde" 观察等高线外部的稀疏区域。
4.2 分类数据可视化:比较与分布
分类数据可视化是 Seaborn 的强项,核心函数分为三类:分类散点图(stripplot、swarmplot)、分类分布图(boxplot、violinplot、boxenplot)以及分类估计图(barplot、pointplot、countplot)。
| 类别 | 函数 | 适用场景 |
|---|---|---|
| 散点类 | stripplot | 展示所有数据点,避免重叠 |
| 散点类 | swarmplot | 自动避让重叠,适合小样本 |
| 分布类 | boxplot | 四分位数 + 离群点标记 |
| 分布类 | violinplot | 箱线图 + 核密度估计 |
| 估计类 | barplot | 均值柱状图 + 误差线 |
| 估计类 | pointplot | 点估计 + 置信区间连线 |
4.2.1 箱线图与离群点检测
boxplot 是异常检测中最常用的分类可视化工具。箱体表示 IQR(Q1~Q3),须线延伸至 1.5×IQR 范围内的最远点,超出此范围的点自动标记为离群点(菱形)。
sns.boxplot(data=tips, x="day", y="total_bill", hue="sex", palette="Set2")
plt.title("不同日期的消费金额分布(按性别分组)")
plt.show()
violinplot 观察分布形状,或使用 boxenplot 展示更多分位数。
4.3 热力图与聚类图:矩阵数据的可视化
热力图(heatmap)用于展示矩阵或二维表格数据的数值大小,通过颜色映射直观呈现模式。聚类图(clustermap)在热力图基础上增加行/列层次聚类树,揭示数据的内在分组结构。
4.3.1 heatmap:相关矩阵与混淆矩阵
heatmap 的核心参数包括 annot(显示数值)、cmap(颜色映射)、fmt(数值格式)以及 mask(遮罩)。在异常检测项目中,常用来可视化特征之间的相关系数矩阵,或模型输出的混淆矩阵。
import numpy as np
import pandas as pd
# 构造相关系数矩阵
corr = tips.corr(numeric_only=True)
sns.heatmap(corr, annot=True, cmap="RdBu_r", fmt=".2f", linewidths=0.5)
plt.title("特征相关系数热力图")
plt.show()
4.3.2 clustermap:层次聚类 + 热力图
clustermap 在热力图基础上对行和列分别进行层次聚类(默认使用欧氏距离 + 平均链接法),并在边缘绘制聚类树。这对于发现样本或特征之间的相似群组非常有效。
# 使用鸢尾花数据集演示聚类热力图
iris = sns.load_dataset("iris")
sns.clustermap(iris.drop(columns="species"), metric="euclidean",
method="average", cmap="viridis", standard_scale=1)
plt.suptitle("鸢尾花特征聚类热力图", y=1.05)
plt.show()
| 参数 | 说明 | 常用值 |
|---|---|---|
metric | 距离度量方式 | euclidean, correlation, cosine |
method | 链接算法 | average, single, complete, ward |
standard_scale | 标准化方向 | 0(行), 1(列) |
z_score | Z-score 标准化 | 0 或 1 |
col_cluster | 是否对列聚类 | True / False |
4.4 综合案例:异常检测报表中的可视化组合
在实际项目中,通常将上述图表组合到一张报表中。以下是一个典型的异常检测数据报表可视化布局:
- 左上: 特征分布直方图 + KDE,用于观察整体分布形态与尾部离群。
- 右上: 箱线图矩阵,按类别分组展示各特征的离群点分布。
- 左下: 特征相关系数热力图,识别高度相关特征对。
- 右下: 聚类热力图,展示样本与特征的分组结构。
import matplotlib.pyplot as plt
import seaborn as sns
# 创建子图布局
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 1. 分布图
sns.histplot(tips["total_bill"], kde=True, ax=axes[0,0])
axes[0,0].set_title("Total Bill 分布")
# 2. 箱线图
sns.boxplot(data=tips, x="day", y="total_bill", ax=axes[0,1])
axes[0,1].set_title("按日期的消费箱线图")
# 3. 热力图
corr = tips.corr(numeric_only=True)
sns.heatmap(corr, annot=True, cmap="RdBu_r", ax=axes[1,0])
axes[1,0].set_title("相关系数热力图")
# 4. 聚类热力图(单独绘制,此处示意)
axes[1,1].text(0.5, 0.5, "Clustermap\n(单独窗口)", ha="center", va="center", fontsize=14)
axes[1,1].set_title("聚类热力图")
plt.tight_layout()
plt.show()
plt.subplots 或 sns.FacetGrid 统一管理布局。对于需要交互式探索的场景,可结合 Plotly 或 Bokeh 生成 HTML 报表,但 Seaborn 静态图更适合 PDF/Word 格式的正式报告。