2.1 单变量分布图 Seaborn单变量分布图详解:探索数据分布的利器 (2.1 单变量分布图) 引言 单变量分布图,顾名思义,是用于展示单个变量数据分布情况的图表。它们能够帮助我们快速了解数据的集中趋势、离散程度、偏态、峰度等关键特征,为后续的数据分析和建模奠定坚实的基础。Seaborn 提供了多种函数来绘制单变量分布图,包括 (直方图)、 (核密度估计图)、 (经验累积分布函数图) 和 (地毯图) 等。我们将逐一深入讲解这些函数,并结合实际案例进行演示。 2.1 单变量分布图的核心概念与类型 在深入代码实践之前,我们首先需要理解单变量分布图的核心概念和Seaborn提供的几种主要类型。
引言
单变量分布图,顾名思义,是用于展示单个变量数据分布情况的图表。它们能够帮助我们快速了解数据的集中趋势、离散程度、偏态、峰度等关键特征,为后续的数据分析和建模奠定坚实的基础。Seaborn 提供了多种函数来绘制单变量分布图,包括 histplot() (直方图)、kdeplot() (核密度估计图)、ecdfplot() (经验累积分布函数图) 和 rugplot() (地毯图) 等。我们将逐一深入讲解这些函数,并结合实际案例进行演示。
2.1 单变量分布图的核心概念与类型
在深入代码实践之前,我们首先需要理解单变量分布图的核心概念和Seaborn提供的几种主要类型。
核心概念:
单变量数据: 指的是只包含一个变量的数据集,例如,一组学生的考试成绩、一个地区的人口年龄分布等。
数据分布: 描述了数据集中各个数值出现的频率或概率。理解数据分布有助于我们了解数据的整体特征和潜在规律。
分布形态: 数据分布的形状,例如正态分布(钟形)、均匀分布、偏态分布(左偏或右偏)等。
集中趋势: 数据集中的典型值或中心值,常用统计量如均值、中位数、众数等来衡量。
离散程度: 数据值之间的分散程度,常用统计量如标准差、方差、四分位距等来衡量。
Seaborn提供的单变量分布图类型:
Seaborn 针对单变量分布提供了以下几种核心的绘图函数,每种函数侧重于从不同的角度展示数据分布:
histplot() (直方图): 是最常用的分布图之一,通过将数据划分为若干个区间(bin),并统计每个区间内数据出现的频数或频率,用柱状图的形式展示数据分布。直方图能够直观地展示数据的整体分布形状、集中趋势和离散程度。
kdeplot() (核密度估计图): 是一种非参数的估计数据概率密度函数的方法。它通过平滑数据点,生成一条连续的曲线来估计数据的分布形态。相比直方图,KDE 图更加平滑,能够更好地展现数据的潜在分布趋势,尤其是在数据量较大时。
ecdfplot() (经验累积分布函数图): 展示了数据集中小于或等于某个值的观测值的比例。ECDF 图以阶梯状的曲线展示数据的累积分布情况,可以帮助我们了解数据在不同取值范围内的累积概率,对于比较不同数据集的分布差异非常有用。
rugplot() (地毯图): 在数轴上用垂直的短线标记出每个数据点的具体位置。地毯图本身并不能直接展示分布形状,但它可以与直方图、KDE 图等结合使用,更精细地展示数据的分布情况,特别是可以直观地看到数据的密度集中区域。
可以用 Mermaid 的 graph TD 图来概括这些单变量分布图之间的关系:
2.1.1 histplot():直方图的实践与详解
histplot() 函数是 Seaborn 中用于绘制直方图的核心函数。它提供了丰富的参数来控制直方图的各个方面,例如 bin 的数量、柱状的样式、统计量的选择等。
基本用法:
首先,我们需要导入必要的库:
import seaborn as sns import matplotlib.pyplot as plt # 加载示例数据集 (例如:tips 数据集) tips = sns.load_dataset('tips')
最简单的 histplot() 用法只需要指定要绘制的变量:
sns.histplot(data=tips, x='total_bill') plt.show()
这段代码会生成一个关于 tips 数据集中 total_bill 变量的直方图。
核心参数详解:
data: 指定要使用的数据集,通常是一个 Pandas DataFrame。
x: 指定要绘制直方图的变量名(列名)。
y: 在绘制双变量直方图时使用,此处单变量分布图我们主要关注 x。
hue: 指定分组变量,可以根据不同的组别绘制不同的直方图,并用颜色区分。
weights: 指定权重变量,可以对数据点进行加权。
bins: 控制直方图的柱状数量(bin 的数量)。可以是一个整数(指定 bin 的数量),也可以是一个 bin 边界的列表。
整数值: 例如 bins=30,Seaborn 会自动将数据范围划分为 30 个等宽的 bin。
bin 边界列表: 例如 bins=[0, 10, 20, 30, 40, 50],可以自定义 bin 的边界。
binwidth: 指定 bin 的宽度,与 bins 参数互斥,不能同时使用。
binrange: 指定 bin 的范围,只考虑在这个范围内的数据。
cumulative: 布尔值,如果设置为 True,则绘制累积直方图,展示累积频数或频率。
stat: 指定直方图柱状的高度表示的统计量。常用的选项包括:
'count' (默认值): 表示每个 bin 内的观测计数(频数)。
'frequency': 表示每个 bin 内的观测频率(频数除以总观测数)。
'density': 表示概率密度,直方图的总面积积分为 1。
'probability': 表示概率,直方图的总高度之和为 1。
element: 控制直方图的柱状表现形式。
'bars' (默认值): 标准的柱状图。
'step': 阶梯状的直方图,只显示柱状的边界线。
'poly': 多边形填充的直方图。
fill: 布尔值,控制是否填充柱状的颜色,默认为 True。
kde: 布尔值,如果设置为 True,则在直方图上方叠加核密度估计曲线。
line_kws: 字典,用于设置 KDE 曲线的线条属性,例如颜色、线型、线宽等。
color: 指定直方图柱状的颜色。
palette: 指定调色板,用于当使用 hue 参数进行分组时,控制不同组别的颜色。
alpha: 设置柱状的透明度,取值范围为 0 到 1。
edgecolor: 设置柱状边缘的颜色。
linewidth: 设置柱状边缘的线宽。
label: 设置图例标签。
代码示例:不同参数的实践
plt.figure(figsize=(12, 5)) # 设置画布大小 plt.subplot(1, 2, 1) # 创建子图 sns.histplot(data=tips, x='total_bill', bins=15, color='skyblue') plt.title('Bins = 15') plt.subplot(1, 2, 2) # 创建子图 sns.histplot(data=tips, x='total_bill', binwidth=5, color='lightcoral') plt.title('Binwidth = 5') plt.tight_layout() # 调整子图布局,避免重叠 plt.show()
这段代码对比了使用 bins 参数和 binwidth 参数的效果。bins=15 将数据范围划分为 15 个 bin,而 binwidth=5 则指定了每个 bin 的宽度为 5 个单位。不同的 bin 设置会影响直方图的细节展示。
stat 统计量:plt.figure(figsize=(15, 5)) plt.subplot(1, 3, 1) sns.histplot(data=tips, x='total_bill', stat='count', color='lightgreen') plt.title('Stat = Count (频数)') plt.subplot(1, 3, 2) sns.histplot(data=tips, x='total_bill', stat='frequency', color='gold') plt.title('Stat = Frequency (频率)') plt.subplot(1, 3, 3) sns.histplot(data=tips, x='total_bill', stat='density', color='plum') plt.title('Stat = Density (密度)') plt.tight_layout() plt.show()
这段代码展示了 stat 参数的不同取值对直方图纵轴刻度的影响。'count' 显示频数,'frequency' 显示频率,'density' 显示概率密度。选择合适的 stat 取决于分析的目的。
plt.figure(figsize=(12, 5)) plt.subplot(1, 2, 1) sns.histplot(data=tips, x='total_bill', cumulative=True, element='step', fill=False, color='dodgerblue') plt.title('Cumulative Histogram (Step)') plt.subplot(1, 2, 2) sns.histplot(data=tips, x='total_bill', cumulative=True, element='poly', fill=True, color='orange', alpha=0.6) plt.title('Cumulative Histogram (Poly)') plt.tight_layout() plt.show()
这段代码展示了累积直方图 (cumulative=True),并使用了 element 参数改变了柱状的样式,'step' 是阶梯状,'poly' 是多边形填充。
hue 参数):sns.histplot(data=tips, x='total_bill', hue='sex', palette='viridis', multiple='stack') # multiple='stack' 堆叠显示 plt.title('Grouped Histogram by Sex') plt.show()
使用 hue='sex' 可以根据 sex 变量对数据进行分组,绘制分组直方图。palette='viridis' 指定了调色板,multiple='stack' 将不同组别的柱状堆叠显示。
直方图的应用场景:
初步了解数据分布: 直方图可以快速展示数据的分布形状,帮助我们判断数据是否近似正态分布、是否存在偏态等。
比较不同组别的数据分布: 通过分组直方图,可以比较不同组别数据分布的差异。
检查数据异常值: 直方图中远离主体分布的柱状可能指示异常值的存在。
作为其他高级分析的基础: 直方图可以作为进一步统计分析和建模的基础,例如,判断数据是否满足某些统计模型的假设条件。
2.1.2 kdeplot():核密度估计图的实践与详解
kdeplot() 函数用于绘制核密度估计图,通过平滑数据点来估计数据的概率密度函数。相比直方图,KDE 图更加平滑连续,能够更好地展现数据的潜在分布趋势。
基本用法:
sns.kdeplot(data=tips, x='total_bill') plt.show()
核心参数详解:
data,x,hue,weights: 与 histplot() 中的参数含义相同。
y: 在绘制双变量 KDE 图时使用,此处单变量分布图我们主要关注 x。
cumulative: 布尔值,如果设置为 True,则绘制累积分布函数 (CDF) 的 KDE 图。
bw_method: 指定带宽 (bandwidth) 的计算方法,带宽控制 KDE 曲线的平滑程度。常用的选项包括:
'scott' (默认值): Scott's rule of thumb,一种常用的自动带宽选择方法。
'silverman': Silverman's rule of thumb,另一种常用的自动带宽选择方法。
数值: 可以直接指定带宽的值,例如 bw_method=2。较小的带宽会使曲线更精细,可能过度拟合;较大的带宽会使曲线更平滑,可能丢失细节。
bw_adjust: 一个比例因子,用于调整 bw_method 计算出的带宽。例如 bw_adjust=0.5 会将带宽减半,使曲线更精细。
kernel: 指定核函数类型,核函数决定了如何对数据点进行平滑。常用的选项包括:
'gaussian' (默认值): 高斯核,最常用的核函数。
'linear','polynomial','radial basis function','sigmoid' 等其他核函数。
cut: 控制 KDE 曲线向数据范围外延伸的距离,默认为 3,表示向数据范围外延伸 3 个带宽的距离。
clip: 一个元组 (lower, upper),用于限制 KDE 曲线的绘制范围。
fill: 布尔值,控制是否填充 KDE 曲线下方的区域,默认为 False。
color,palette,alpha,linewidth,linestyle,label: 与 histplot() 中的参数含义类似,用于控制曲线的颜色、样式等。
代码示例:不同参数的实践
plt.figure(figsize=(12, 5)) plt.subplot(1, 2, 1) sns.kdeplot(data=tips, x='total_bill', bw_method='scott', color='purple') plt.title('BW Method = Scott') plt.subplot(1, 2, 2) sns.kdeplot(data=tips, x='total_bill', bw_method=0.8, color='darkgreen') # 手动指定带宽 plt.title('BW Method = 0.8') plt.tight_layout() plt.show()
这段代码对比了使用 bw_method='scott' 自动计算带宽和手动指定带宽 bw_method=0.8 的效果。手动调整带宽可以更精细地控制曲线的平滑程度。
sns.kdeplot(data=tips, x='total_bill', fill=True, color='teal', alpha=0.5, linestyle='--', linewidth=2) plt.title('Filled KDE with Style') plt.show()
这段代码填充了 KDE 曲线下方的区域 (fill=True),并调整了颜色 (color='teal')、透明度 (alpha=0.5)、线型 (linestyle='--') 和线宽 (linewidth=2)。
hue 参数):sns.kdeplot(data=tips, x='total_bill', hue='smoker', palette='Set1', fill=True) # fill=True 填充不同组别曲线下方的区域 plt.title('Grouped KDE by Smoker') plt.show()
使用 hue='smoker' 可以根据 smoker 变量对数据进行分组,绘制分组 KDE 图。palette='Set1' 指定了调色板,fill=True 填充了不同组别曲线下方的区域,更清晰地展示了组间分布的差异。
KDE 图的应用场景:
估计数据的概率密度函数: KDE 图提供了一种平滑的数据分布估计,可以更好地展现数据的潜在分布形态,尤其是在数据量较大时。
比较不同组别的数据分布: 分组 KDE 图可以直观地比较不同组别数据分布的差异,例如,比较不同性别、不同年龄段人群的收入分布。
发现数据的多模态性: KDE 图可以帮助我们发现数据是否具有多个峰值(模态),指示数据可能来源于多个不同的潜在分布。
作为非参数统计分析的基础: KDE 图可以作为非参数统计分析的基础,例如,用于非参数密度估计、非参数回归等。
2.1.3 ecdfplot():经验累积分布函数图的实践与详解
ecdfplot() 函数用于绘制经验累积分布函数 (Empirical Cumulative Distribution Function, ECDF) 图。ECDF 图展示了数据集中小于或等于某个值的观测值的比例,以阶梯状的曲线展示数据的累积分布情况。
基本用法:
sns.ecdfplot(data=tips, x='total_bill') plt.show()
核心参数详解:
data,x,hue,weights: 与 histplot() 和 kdeplot() 中的参数含义相同。
y: 在绘制双变量 ECDF 图时使用,此处单变量分布图我们主要关注 x。
complementary: 布尔值,如果设置为 True,则绘制互补累积分布函数 (Survival Function),展示数据集中大于某个值的观测值的比例。
stat: 指定 ECDF 图纵轴表示的统计量。常用的选项包括:
'proportion' (默认值): 表示比例(累积概率),纵轴刻度范围为 0 到 1。
'count': 表示计数(累积频数)。
estimator: 指定累积分布函数的估计方法,默认为 'ecdf' (经验累积分布函数)。
cdots: 布尔值,如果设置为 True,则在 ECDF 阶梯的拐点处绘制点标记。
color,palette,linewidth,linestyle,label: 与之前的函数类似,用于控制曲线的颜色、样式等。
代码示例:不同参数的实践
sns.ecdfplot(data=tips, x='total_bill', complementary=True, color='firebrick') plt.title('Complementary ECDF (Survival Function)') plt.show()
这段代码设置 complementary=True,绘制了互补累积分布函数,纵轴表示 total_bill 大于某个值的概率。
stat 统计量和添加拐点标记:plt.figure(figsize=(12, 5)) plt.subplot(1, 2, 1) sns.ecdfplot(data=tips, x='total_bill', stat='proportion', color='mediumseagreen', linestyle='-', linewidth=1.5, cdots=True) plt.title('Stat = Proportion (比例)') plt.subplot(1, 2, 2) sns.ecdfplot(data=tips, x='total_bill', stat='count', color='slateblue', linestyle='--', linewidth=2, cdots=True) plt.title('Stat = Count (计数)') plt.tight_layout() plt.show()
这段代码对比了 stat='proportion' (比例) 和 stat='count' (计数) 的效果,并使用 cdots=True 在阶梯拐点处添加了点标记。
hue 参数):sns.ecdfplot(data=tips, x='total_bill', hue='day', palette='tab10') plt.title('Grouped ECDF by Day') plt.show()
使用 hue='day' 可以根据 day 变量对数据进行分组,绘制分组 ECDF 图,比较不同日期消费金额的累积分布情况。
ECDF 图的应用场景:
比较不同数据集的分布差异: ECDF 图可以直观地比较不同数据集的分布差异,例如,比较不同地区居民的收入分布、不同品牌产品的寿命分布等。
判断数据是否符合特定分布: 可以将 ECDF 图与理论分布的 CDF 图进行比较,判断数据是否符合特定的理论分布,例如正态分布、指数分布等。
估计数据的百分位数: 通过 ECDF 图,可以方便地估计数据的百分位数,例如,找到数据集中位数、四分位数等。
生存分析和可靠性分析: 互补累积分布函数 (Survival Function) 在生存分析和可靠性分析中非常重要,用于描述事件发生的时间分布。
2.1.4 rugplot():地毯图的实践与详解
rugplot() 函数用于在数轴上用垂直的短线标记出每个数据点的具体位置。地毯图本身并不能直接展示分布形状,但它可以与直方图、KDE 图等结合使用,更精细地展示数据的分布情况,特别是可以直观地看到数据的密度集中区域。
基本用法:
sns.rugplot(data=tips, x='total_bill') plt.show()
核心参数详解:
data,x,hue,weights: 与之前的函数参数含义相同。
y: 在绘制双变量地毯图时使用,此处单变量分布图我们主要关注 x。
height: 控制地毯图中短线的长度,取值范围为 0 到 1,默认为 0.025。
axis: 指定要绘制地毯图的轴,默认为 None,表示自动选择轴。
color,palette,linewidth,linestyle,label: 与之前的函数类似,用于控制短线的颜色、样式等。
代码示例:不同参数的实践
sns.rugplot(data=tips, x='total_bill', height=0.1, color='darkorange', linewidth=0.8) plt.title('Rugplot with Adjusted Height and Color') plt.show()
这段代码调整了地毯图中短线的高度 (height=0.1)、颜色 (color='darkorange') 和线宽 (linewidth=0.8)。
hue 参数):sns.rugplot(data=tips, x='total_bill', hue='time', palette='Set2') plt.title('Grouped Rugplot by Time') plt.show()
使用 hue='time' 可以根据 time 变量对数据进行分组,绘制分组地毯图,不同组别的短线用不同颜色区分。
rugplot() 与其他分布图:sns.histplot(data=tips, x='total_bill', kde=True, color='lightskyblue') # 绘制直方图和 KDE 图 sns.rugplot(data=tips, x='total_bill', color='navy') # 叠加地毯图 plt.title('Histplot + KDE + Rugplot') plt.show()
这段代码将 rugplot() 与 histplot() 和 kdeplot() 结合使用,在直方图和 KDE 图的下方叠加了地毯图,更精细地展示了数据的分布情况和密度集中区域。
地毯图的应用场景:
精细展示数据点分布: 地毯图可以直观地展示每个数据点的具体位置,避免了直方图 binning 带来的信息损失。
与直方图、KDE 图等结合使用: 地毯图通常与其他分布图结合使用,增强对数据分布细节的理解。
检查数据密度集中区域: 地毯图可以帮助我们直观地看到数据的密度集中区域,辅助判断数据的分布形态。
可视化小样本数据集: 对于小样本数据集,地毯图可以有效地展示所有数据点,避免因 binning 导致的信息丢失。
总结与展望
本篇文章深入探讨了 Seaborn 提供的单变量分布图,包括 histplot()、kdeplot()、ecdfplot() 和 rugplot() 四种核心函数。我们详细讲解了每种函数的原理、核心参数和代码实践,并通过丰富的示例展示了如何利用这些工具有效地探索和呈现数据的单变量分布特征。
单变量分布图是数据分析和可视化的基础工具,它们能够帮助我们快速了解数据的整体特征和潜在规律,为后续的数据分析和建模奠定坚实的基础。Seaborn 提供的这些函数不仅功能强大,而且易于使用,可以帮助我们高效地进行数据探索和可视化工作。
在实际应用中,我们可以根据具体的数据类型和分析目的,选择合适的单变量分布图类型。例如,当需要直观展示频数分布时,可以选择直方图;当需要估计概率密度函数时,可以选择 KDE 图;当需要比较累积分布情况时,可以选择 ECDF 图;当需要精细展示数据点分布时,可以结合使用地毯图。
掌握 Seaborn 的单变量分布图绘制技巧,将使您在数据探索和可视化领域如虎添翼,能够更加深入地理解数据、发现数据中的模式和规律,并有效地将数据洞见传达给他人。希望这篇文章能够帮助您更好地理解和应用 Seaborn 的单变量分布图,在数据分析的道路上更进一步。