理解数据如何分布以及不同变量之间如何关联,对数据分析的初步阶段(EDA)和为机器学习模型准备数据来说是基础。Seaborn,一个强大的数据可视化库,提供了专门的函数,使这些方面的可视化变得直接且有意义。主要内容是使用Seaborn来有效地查看单变量分布和多变量关系。单变量分布的可视化在考察变量关系之前,了解单个变量的特性通常是很有帮助的。值是如何散布的?它们是对称的、偏斜的吗?存在异常值吗?Seaborn为此提供了多种图表类型。直方图和密度图直方图是一种常见的方式,通过对数据进行分箱并显示每个箱的计数来可视化连续变量的频率分布。Seaborn的histplot函数简化了此过程,并可以选择性地叠加核密度估计 (KDE)。KDE图对直方图进行平滑处理,提供对潜在概率密度函数的估计。import seaborn as sns import matplotlib.pyplot as plt import pandas as pd import numpy as np # 样本数据模拟 np.random.seed(42) data = pd.DataFrame({ 'feature_A': np.random.normal(loc=5, scale=2, size=200), 'feature_B': np.random.exponential(scale=5, size=200), 'category': np.random.choice(['Group 1', 'Group 2', 'Group 3'], size=200, p=[0.4, 0.3, 0.3]) }) # 带有KDE的直方图 plt.figure(figsize=(8, 5)) sns.histplot(data=data, x='feature_A', kde=True, color='#339af0') plt.title('Distribution of Feature A (Histogram with KDE)') plt.xlabel('Feature A Value') plt.ylabel('Frequency / Density') plt.show() # 独立的KDE图 plt.figure(figsize=(8, 5)) sns.kdeplot(data=data, x='feature_B', fill=True, color='#20c997') plt.title('Density Plot of Feature B') plt.xlabel('Feature B Value') plt.ylabel('Density') plt.show()直方图显示清晰的分箱,而KDE则提供分布形状的更平滑表示。当您想查看特定范围内的频率计数时,请使用histplot;当您对分布的整体形状和平滑度更感兴趣时,请使用kdeplot。{"layout": {"title": "特征A的直方图和KDE", "xaxis": {"title": "特征A"}, "yaxis": {"title": "计数"}, "bargap": 0.1, "width": 600, "height": 400, "yaxis2": {"overlaying": "y", "side": "right", "showgrid": false, "title": "密度"}, "showlegend": false}, "data": [{"type": "histogram", "x": [4.98, 4.31, 5.64, 7.35, 3.68, 3.98, 6.53, 5.66, 3.13, 3.81, 4.88, 2.94, 4.76, 5.08, 6.58, 3.22, 7.78, 6.13, 4.43, 3.57], "marker": {"color": "#4dabf7"}, "name": "直方图"}, {"type": "scatter", "x": [1.4, 1.8, 2.2, 2.6, 3.0, 3.4, 3.8, 4.2, 4.6, 5.0, 5.4, 5.8, 6.2, 6.6, 7.0, 7.4, 7.8, 8.2, 8.6], "y": [0.6, 1.3, 3.6, 8.0, 13.7, 20.2, 26.4, 31.7, 35.2, 36.5, 35.5, 32.7, 28.5, 23.7, 19.1, 14.9, 11.4, 8.6, 6.4], "mode": "lines", "line": {"color": "#1c7ed6", "width": 1.5}, "yaxis": "y2", "name": "KDE"}]}特征A的计数直方图,叠加了其核密度估计。箱线图和提琴图箱线图(或箱须图)使用四分位数总结分布。箱体代表第25 ($Q_1$) 和第75 ($Q_3$) 百分位数之间的四分位距 (IQR),一条线表示中位数 ($Q_2$)。须线通常延伸到距箱体1.5倍IQR的距离,超出须线的点通常被认为是潜在的异常值。提琴图结合了箱线图和KDE。“提琴”形状的宽度表示数据在不同值处的密度。这使您可以看到汇总统计数据以及分布的形状,包括箱线图可能隐藏的潜在多峰(多模态)。# 箱线图 plt.figure(figsize=(8, 5)) sns.boxplot(data=data, y='feature_A', color='#ffc078') plt.title('Box Plot of Feature A') plt.ylabel('Feature A Value') plt.show() # 提琴图 plt.figure(figsize=(8, 5)) sns.violinplot(data=data, y='feature_B', color='#b197fc') plt.title('Violin Plot of Feature B') plt.ylabel('Feature B Value') plt.show(){"layout": {"title": "特征B分布的比较", "yaxis": {"title": "特征B值"}, "xaxis": {"title": "图表类型"}, "width": 600, "height": 400}, "data": [{"type": "box", "y": [1.64, 1.64, 0.22, 1.16, 1.39, 7.19, 2.01, 0.68, 1.56, 3.51, 4.04, 0.69, 0.52, 1.11, 0.71, 1.41, 1.53, 1.62, 1.68, 1.93, 4.54, 7.52, 1.41, 8.14, 2.11, 6.34, 5.39, 2.41, 4.92, 0.08, 1.54, 11.81, 10.66, 6.75, 7.10, 5.62, 0.08, 2.08, 2.37, 0.45, 5.96, 8.06, 1.86, 1.71, 1.99, 2.59, 7.26, 11.19, 2.68, 7.96, 10.66, 1.94, 2.67, 1.58, 11.11, 3.77, 4.47, 3.04, 8.09, 1.77, 6.30, 1.07, 1.88, 13.67, 0.46, 0.75, 0.32, 3.65, 3.08, 1.35, 8.08, 1.27, 0.19, 2.16, 0.33, 2.22, 0.70, 3.68, 2.31, 0.53, 0.84, 7.43, 1.60, 1.53, 3.43, 1.02, 10.05, 0.84, 4.21, 5.29, 2.46, 2.33, 4.24, 2.11, 1.79, 11.02, 12.24, 1.98, 7.16, 15.70, 1.12, 1.17, 1.62, 2.02, 1.68, 8.81, 1.35, 5.89, 2.30, 7.21, 0.44, 6.81, 3.06, 0.78, 3.02, 3.80, 2.70, 3.50, 11.77, 2.78, 1.91, 1.24, 3.13, 5.91, 5.77, 5.01, 1.15, 1.64, 10.87, 6.32, 5.08, 7.54, 1.39, 7.37, 3.21, 5.46, 1.42, 3.76, 0.65, 4.95, 0.82, 7.04, 5.39, 1.14, 2.61, 1.43, 3.78, 6.15, 1.74, 1.70, 1.56, 5.01, 7.64, 1.59, 6.23, 3.79, 5.18, 6.03, 7.41, 10.88, 0.98, 6.92, 1.64, 2.95, 5.17, 5.00, 10.04, 3.07, 5.54, 6.70, 1.92, 5.28, 1.67, 1.68, 1.03, 0.49, 3.62, 3.06, 1.31, 1.38, 1.63, 4.74, 0.88, 0.44, 7.49, 5.00, 3.06, 0.78, 3.22, 1.77, 2.12, 1.84, 0.25, 6.43, 8.42, 1.77, 2.29], "name": "箱线图", "marker": {"color": "#ffc078"}}, {"type": "violin", "y": [1.64, 1.64, 0.22, 1.16, 1.39, 7.19, 2.01, 0.68, 1.56, 3.51, 4.04, 0.69, 0.52, 1.11, 0.71, 1.41, 1.53, 1.62, 1.68, 1.93, 4.54, 7.52, 1.41, 8.14, 2.11, 6.34, 5.39, 2.41, 4.92, 0.08, 1.54, 11.81, 10.66, 6.75, 7.10, 5.62, 0.08, 2.08, 2.37, 0.45, 5.96, 8.06, 1.86, 1.71, 1.99, 2.59, 7.26, 11.19, 2.68, 7.96, 10.66, 1.94, 2.67, 1.58, 11.11, 3.77, 4.47, 3.04, 8.09, 1.77, 6.30, 1.07, 1.88, 13.67, 0.46, 0.75, 0.32, 3.65, 3.08, 1.35, 8.08, 1.27, 0.19, 2.16, 0.33, 2.22, 0.70, 3.68, 2.31, 0.53, 0.84, 7.43, 1.60, 1.53, 3.43, 1.02, 10.05, 0.84, 4.21, 5.29, 2.46, 2.33, 4.24, 2.11, 1.79, 11.02, 12.24, 1.98, 7.16, 15.70, 1.12, 1.17, 1.62, 2.02, 1.68, 8.81, 1.35, 5.89, 2.30, 7.21, 0.44, 6.81, 3.06, 0.78, 3.02, 3.80, 2.70, 3.50, 11.77, 2.78, 1.91, 1.24, 3.13, 5.91, 5.77, 5.01, 1.15, 1.64, 10.87, 6.32, 5.08, 7.54, 1.39, 7.37, 3.21, 5.46, 1.42, 3.76, 0.65, 4.95, 0.82, 7.04, 5.39, 1.14, 2.61, 1.43, 3.78, 6.15, 1.74, 1.70, 1.56, 5.01, 7.64, 1.59, 6.23, 3.79, 5.18, 6.03, 7.41, 10.88, 0.98, 6.92, 1.64, 2.95, 5.17, 5.00, 10.04, 3.07, 5.54, 6.70, 1.92, 5.28, 1.67, 1.68, 1.03, 0.49, 3.62, 3.06, 1.31, 1.38, 1.63, 4.74, 0.88, 0.44, 7.49, 5.00, 3.06, 0.78, 3.22, 1.77, 2.12, 1.84, 0.25, 6.43, 8.42, 1.77, 2.29], "name": "提琴图", "box": {"visible": true}, "meanline": {"visible": true}, "marker": {"color": "#b197fc"}}]}箱线图和提琴图显示了特征B的分布汇总和密度形状。使用箱线图可以简洁地汇总集中趋势和离散程度,尤其是在比较多个组时。当您需要更全面地了解分布形状时(例如,在汇总统计数据之外识别多个峰值或偏斜),请使用提琴图。变量间关系的可视化机器学习通常涉及理解变量如何互相影响。一个变量增加时另一个变量也会增加吗?不同的类别是否呈现不同的模式?Seaborn在可视化这些关系方面表现出色。两个数值变量之间的关系散点图是考察两个连续变量之间关系的常用工具。每个点代表一个观测值,根据其在两个轴上的值进行绘制。Seaborn的scatterplot使这变得容易,并允许使用颜色 (hue)、大小 (size) 或样式 (style) 引入第三个变量。plt.figure(figsize=(8, 6)) sns.scatterplot(data=data, x='feature_A', y='feature_B', hue='category', palette=['#fa5252', '#4c6ef5', '#82c91e']) plt.title('Relationship between Feature A and Feature B by Category') plt.xlabel('Feature A') plt.ylabel('Feature B') plt.legend(title='Category') plt.show(){"layout": {"title": "特征A与特征B的散点图", "xaxis": {"title": "特征A"}, "yaxis": {"title": "特征B"}, "legend": {"title": {"text": "类别"}}, "width": 600, "height": 450}, "data": [{"type": "scatter", "x": [4.98, 4.31, 5.64, 7.35, 3.68, 3.98, 6.53, 5.66, 3.13, 3.81, 4.88, 2.94, 4.76, 5.08, 6.58, 3.22, 7.78, 6.13, 4.43, 3.57, 6.04, 4.15, 3.96, 4.64, 4.17, 2.32, 4.41, 4.77, 4.24, 6.06, 6.53, 5.37, 5.04, 3.41, 3.78, 5.79, 3.33, 5.19, 3.95, 5.66, 7.00, 5.95, 5.53, 6.79, 5.16, 6.87, 5.34, 5.24, 4.16, 4.99], "y": [1.64, 1.64, 0.22, 1.16, 1.39, 7.19, 2.01, 0.68, 1.56, 3.51, 4.04, 0.69, 0.52, 1.11, 0.71, 1.41, 1.53, 1.62, 1.68, 1.93, 4.54, 7.52, 1.41, 8.14, 2.11, 6.34, 5.39, 2.41, 4.92, 0.08, 1.54, 11.81, 10.66, 6.75, 7.10, 5.62, 0.08, 2.08, 2.37, 0.45, 5.96, 8.06, 1.86, 1.71, 1.99, 2.59, 7.26, 11.19, 2.68, 7.96], "mode": "markers", "marker": {"color": ["#fa5252", "#4c6ef5", "#4c6ef5", "#4c6ef5", "#fa5252", "#fa5252", "#82c91e", "#fa5252", "#fa5252", "#82c91e", "#4c6ef5", "#fa5252", "#fa5252", "#fa5252", "#82c91e", "#82c91e", "#4c6ef5", "#fa5252", "#fa5252", "#fa5252", "#82c91e", "#82c91e", "#4c6ef5", "#fa5252", "#fa5252", "#fa5252", "#fa5252", "#4c6ef5", "#fa5252", "#fa5252", "#82c91e", "#4c6ef5", "#fa5252", "#fa5252", "#4c6ef5", "#82c91e", "#4c6ef5", "#fa5252", "#4c6ef5", "#4c6ef5", "#4c6ef5", "#4c6ef5", "#82c91e", "#82c91e", "#82c91e", "#fa5252", "#4c6ef5", "#82c91e", "#fa5252", "#4c6ef5"], "size": 7}, "name": "数据点(按类别分类)"}]}特征A和特征B之间的关系,按类别着色。jointplot函数将散点图与每个变量的直方图或KDE图结合在边距中。这同时提供了关系和各个分布的视图。sns.jointplot(data=data, x='feature_A', y='feature_B', kind='scatter', color='#7048e8') # kind 可以是 'kde' (核密度估计), 'hist' (直方图), 'reg' (回归) plt.suptitle('Joint Distribution of Feature A and Feature B', y=1.02) # 调整标题位置 plt.show()多个数值变量之间的关系当处理两个以上数值变量时,为每对变量单独创建散点图可能会很繁琐。Seaborn的pairplot可使此过程自动化。它生成一个网格,其中对角线显示每个变量的分布(使用histplot或kdeplot),非对角线单元格显示每对变量的散点图。这对于快速了解数据集中变量之间的成对关系非常有用。# 创建另一个数值特征用于演示 data['feature_C'] = data['feature_A'] * 0.5 + np.random.normal(0, 1, 200) # 仅选择数值列用于pairplot numerical_data = data[['feature_A', 'feature_B', 'feature_C']] sns.pairplot(numerical_data) plt.suptitle('Pairwise Relationships Between Numerical Features', y=1.02) plt.show() # 按类别着色的pairplot # sns.pairplot(data, hue='category', palette=['#fa5252', '#4c6ef5', '#82c91e']) # plt.suptitle('按类别着色的成对关系', y=1.02) # plt.show()请注意,当特征数量很多时,pairplot可能会变得计算量大且视觉上杂乱。涉及分类变量的关系通常,您需要比较不同类别之间的数值变量,或可视化两个分类变量之间的关系。数值变量 vs. 分类变量: 箱线图和提琴图在此处非常有效。通过为x(或y)轴指定一个分类变量,为另一个轴指定一个数值变量,您可以并排比较分布。plt.figure(figsize=(10, 6)) sns.boxplot(data=data, x='category', y='feature_A', palette=['#f783ac', '#91a7ff', '#8ce99a']) plt.title('Distribution of Feature A across Categories (Box Plot)') plt.xlabel('Category') plt.ylabel('Feature A') plt.show() plt.figure(figsize=(10, 6)) sns.violinplot(data=data, x='category', y='feature_B', palette=['#f783ac', '#91a7ff', '#8ce99a']) plt.title('Distribution of Feature B across Categories (Violin Plot)') plt.xlabel('Category') plt.ylabel('Feature B') plt.show()Seaborn还提供了stripplot和swarmplot,它们为每个类别绘制单独的数据点,有助于可视化密度和重叠,尤其适用于较小的数据集。swarmplot调整点的位置以避免重叠,而stripplot允许点重叠(通常与透明度或jitter结合使用)。分类变量 vs. 分类变量: 要理解两个分类变量之间的关系,通常会查看频率计数。Seaborn中的countplot可以显示单个分类变量内的计数,或使用hue参数按另一个分类变量分组的计数。为了可视化联合频率或从中派生的指标(例如外部计算的相关性),通常使用热力图。用于相关矩阵的热力图热力图非常适合可视化矩阵状数据,其中颜色代表值。数据分析中一个常见应用是可视化数值特征的相关矩阵。Pandas DataFrame具有.corr()方法来计算成对相关性,Seaborn的heatmap可以有效地显示此矩阵。# 计算数值特征的相关矩阵 correlation_matrix = numerical_data.corr() print("相关矩阵:") print(correlation_matrix) plt.figure(figsize=(7, 5)) sns.heatmap(correlation_matrix, annot=True, cmap='viridis', fmt=".2f", linewidths=.5) # 常用配色方案选项: 'viridis', 'plasma', 'coolwarm', 'Blues', 'Reds' # annot=True 在单元格上显示值 # fmt=".2f" 将注释格式化为两位小数 plt.title('Correlation Matrix of Numerical Features') plt.show(){"layout": {"title": "相关性热力图", "xaxis": {"tickangle": -45}, "yaxis": {"automargin": true}, "width": 500, "height": 450, "coloraxis": {"colorscale": "Viridis", "colorbar": {"title": "相关性"}}}, "data": [{"type": "heatmap", "z": [[1.00, -0.01, 0.89], [-0.01, 1.00, 0.01], [0.89, 0.01, 1.00]], "x": ["特征A", "特征B", "特征C"], "y": ["特征A", "特征B", "特征C"], "text": [["1.00", "-0.01", "0.89"], ["-0.01", "1.00", "0.01"], ["0.89", "0.01", "1.00"]], "texttemplate": "%{text}", "hoverongaps": false}]}热力图显示了数值特征之间的成对相关系数。在此特定的“viridis”配色方案中,颜色越深可能表示相关性越弱,颜色越浅则表示正相关性越强。热力图可以快速显示哪些变量具有强正向(接近1)或负向(接近-1)线性关系,以及哪些变量相对不相关(接近0)。通过使用这些Seaborn函数,您可以对数据结构有重要的了解,识别模式、异常以及变量互相影响的情况,这对于高效的特征工程和模型构建是不可或缺的。请选择最适合变量类型(数值型、分类型)以及您希望回答的关于其分布或关系的具体问题的图表类型。