4.2 类别分布图


文档摘要

4.2 类别分布图 Seaborn类别分布图详解:深入探索数据背后的故事 Seaborn,作为Python数据可视化库中的佼佼者,构建于Matplotlib之上,提供了更高级别的接口,专注于统计图形的绘制。在Seaborn的分类图 (Categorical Plots) 家族中,类别分布图 (Categorical Distribution Plots) 占据着重要的地位。它们能够帮助我们深入理解分类变量如何影响数值变量的分布,揭示数据中隐藏的模式和规律。 4.2 类别分布图:探索分类变量下的数值分布 类别分布图旨在可视化一个或多个分类变量对数值变量分布的影响。它们通过在不同类别之间比较数值变量的分布特征,帮助我们回答诸如: 不同组别之间,数值变量的中心趋势(例如中位数)是否存在差异?

4.2 类别分布图

Seaborn类别分布图详解:深入探索数据背后的故事

Seaborn,作为Python数据可视化库中的佼佼者,构建于Matplotlib之上,提供了更高级别的接口,专注于统计图形的绘制。在Seaborn的分类图 (Categorical Plots) 家族中,类别分布图 (Categorical Distribution Plots) 占据着重要的地位。它们能够帮助我们深入理解分类变量如何影响数值变量的分布,揭示数据中隐藏的模式和规律。

4.2 类别分布图:探索分类变量下的数值分布

类别分布图旨在可视化一个或多个分类变量对数值变量分布的影响。它们通过在不同类别之间比较数值变量的分布特征,帮助我们回答诸如:

  • 不同组别之间,数值变量的中心趋势(例如中位数)是否存在差异?

  • 不同组别之间,数值变量的离散程度(例如四分位距)是否存在差异?

  • 不同组别之间,数值变量的分布形状是否存在差异?

  • 是否存在异常值,以及异常值在不同组别之间的分布情况?

Seaborn 提供了三种主要的类别分布图,它们各有侧重,适用于不同的分析场景:

  • boxplot() (箱线图): 经典且简洁,侧重于展示数据的四分位数中位数异常值

  • violinplot() (小提琴图): 结合了箱线图和核密度估计,更详细地展示数据的分布形状,尤其适用于展示多模态分布

  • boxenplot() (盒形图增强版,也称Letter-value plot): 扩展了箱线图,更精细地展示数据的尾部分布,尤其适用于大型数据集需要关注极端值的情况。

接下来,我们将逐一深入探讨这三种类别分布图。

4.2.1 boxplot():简洁明了的箱线图

原理与解读:

箱线图 (Box Plot),又称盒须图,是一种用于展示数值数据分布的标准化方法。它通过五个关键统计量来概括数据的分布特征:

  1. 最小值 (Minimum): 通常指小于下四分位数 (Q1) 1.5倍四分位距 (IQR) 的最小值。

  2. 下四分位数 (Q1): 将数据集分成前25%和后75%的数值点。

  3. 中位数 (Median): 数据集的中间值,将数据集分成两半。

  4. 上四分位数 (Q3): 将数据集分成前75%和后25%的数值点。

  5. 最大值 (Maximum): 通常指大于上四分位数 (Q3) 1.5倍四分位距 (IQR) 的最大值。

箱线图的主体是一个矩形框 (Box),框的上下边缘分别对应Q1和Q3,框内的横线代表中位数。从箱体上下边缘延伸出去的线条称为须 (Whiskers),通常延伸至最小值和最大值。超出须范围的点通常被视为异常值 (Outliers),并单独绘制。

代码实践:

首先,我们需要导入必要的库:

import seaborn as sns import matplotlib.pyplot as plt # 加载示例数据集 (例如:tips数据集) tips = sns.load_dataset("tips")

基本箱线图:

使用 sns.boxplot() 函数,最简单的用法只需要指定 x (分类变量) 和 y (数值变量):

sns.boxplot(x="day", y="total_bill", data=tips) plt.title("不同星期总账单金额箱线图") plt.show()

这段代码会生成一个箱线图,x轴表示星期 (day),y轴表示总账单金额 (total_bill)。图中会显示每个星期对应的总账单金额的箱线图,方便我们比较不同星期账单金额的分布情况。

添加 hue 分类:

hue 参数允许我们引入第三个分类变量,进一步细分数据。例如,我们可以根据性别 (sex) 将箱线图分组:

sns.boxplot(x="day", y="total_bill", hue="sex", data=tips) plt.title("按性别分组的不同星期总账单金额箱线图") plt.show()

现在,每个星期对应的箱线图会根据性别被分为两组,方便我们比较在不同星期和不同性别下的账单金额分布。

调整箱线图外观:

Seaborn 提供了丰富的参数来调整箱线图的外观,例如:

  • color: 设置箱体的颜色。

  • palette: 设置不同组别的颜色调色板。

  • width: 设置箱体的宽度。

  • linewidth: 设置箱体边框的线宽。

  • fliersize: 设置异常值点的大小。

  • flierprops: 设置异常值点的属性 (例如颜色、形状)。

  • whis: 控制须的长度,默认值为 1.5,可以设置为数值或 'range' (延伸到数据的极值)。

  • orient: 设置箱线图的方向,'v' (垂直,默认) 或 'h' (水平)。

例如,我们可以自定义颜色、调色板和异常值样式:

sns.boxplot(x="day", y="total_bill", hue="sex", data=tips, palette="Set2", # 使用 Set2 调色板 boxprops={'facecolor':'#9999ff', 'color':'black'}, # 箱体颜色和边框颜色 whiskerprops={'color':'black'}, # 须的颜色 capprops={'color':'black'}, # 箱体顶端和底端横线的颜色 medianprops={'color':'red'}, # 中位数的颜色 flierprops={"marker": "o", "markersize": 8, "linestyle": "none", 'markerfacecolor':'pink'}) # 异常值样式 plt.title("自定义样式的箱线图") plt.show()

解读箱线图:

通过观察箱线图,我们可以获得以下信息:

  • 中位数位置: 箱体内的横线位置反映了数据的中位数,可以比较不同组别之间的中心趋势。

  • 箱体高度: 箱体的高度 (Q3 - Q1) 表示四分位距 (IQR),反映了数据的中间 50% 的离散程度。箱体越高,数据越分散。

  • 须的长度: 须的长度大致反映了数据的整体分布范围,但容易受到异常值的影响。

  • 异常值: 箱线图上的点表示异常值,可以帮助我们识别数据中的极端值。

  • 组间比较: 通过并排比较不同组别的箱线图,可以直观地看出不同组别之间数值变量分布的差异。

适用场景:

  • 快速概览数据分布: 箱线图简洁明了,能够快速展示数据的中心趋势、离散程度和异常值。

  • 比较不同组别的数据分布: 并排箱线图非常适合比较不同组别之间数值变量的分布差异。

  • 识别异常值: 箱线图能够清晰地标示出异常值,方便进行异常值检测和处理。

局限性:

  • 无法展示分布形状: 箱线图只展示了五分位数等统计量,无法展示数据的具体分布形状,例如是否为正态分布、是否为多模态分布等。

  • 对于大型数据集,箱线图可能会显得拥挤: 当数据量很大时,箱线图上的异常值点可能会重叠,难以清晰展示。

4.2.2 violinplot():优雅展示分布形状的小提琴图

原理与解读:

小提琴图 (Violin Plot) 是箱线图的升级版,它结合了箱线图的优点,并引入了核密度估计 (Kernel Density Estimation, KDE),从而能够更详细地展示数据的分布形状

小提琴图的主体形状类似于小提琴,对称地展示了数据的核密度估计曲线。中间部分通常会包含一个箱线图 (可以关闭),用于展示四分位数和中位数。小提琴的宽度代表了数据在该数值范围内的密度,越宽表示数据越集中。

代码实践:

使用 sns.violinplot() 函数,基本用法与 boxplot() 类似:

sns.violinplot(x="day", y="total_bill", data=tips) plt.title("不同星期总账单金额小提琴图") plt.show()

这段代码会生成一个小提琴图,展示不同星期总账单金额的分布形状。

添加 hue 分类:

同样可以使用 hue 参数添加第三个分类变量:

sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True) # split=True 使同一类别的不同 hue 分组的小提琴图左右对称 plt.title("按性别分组的不同星期总账单金额小提琴图 (split=True)") plt.show()

split=True 参数在 hue 分类只有两种时非常有用,它会将同一类别下不同 hue 分组的小提琴图左右对称地绘制,更方便比较。

调整小提琴图外观和内部元素:

violinplot() 也提供了丰富的参数来调整外观和内部元素:

  • color, palette, width, linewidth 等参数与 boxplot() 类似,用于调整整体外观。

  • inner: 控制小提琴图内部元素的显示方式,可选值包括:

    • "box" (默认): 显示箱线图。

    • "quartile": 显示四分位数线。

    • "point": 显示每个数据点 (可能导致图表过于拥挤)。

    • "stick": 显示每个数据点位置的短棒。

    • None: 不显示内部元素。

  • inner_kws: 用于设置内部元素的属性,例如颜色、线宽等。

  • density_kws: 用于设置核密度估计的属性,例如带宽、核函数等。

  • cut: 控制核密度估计曲线向数据范围外延伸的距离,默认为 2。

  • scale: 控制小提琴图宽度的缩放方式,可选值包括:

    • "area" (默认): 所有小提琴图面积相同。

    • "count": 小提琴图宽度与数据点数量成比例。

    • "width": 所有小提琴图最大宽度相同。

  • scale_hue: 是否在 hue 分组内进行缩放,仅当 scale"count""width" 时有效。

例如,我们可以修改内部元素为四分位数线,并调整颜色和宽度:

sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True, inner="quartile", # 内部元素显示四分位数线 palette="pastel", # 使用 pastel 调色板 linewidth=2, # 小提琴图边框线宽 inner_kws={'color': 'gray', 'linewidth': 1}) # 四分位数线样式 plt.title("自定义内部元素的小提琴图") plt.show()

解读小提琴图:

通过观察小提琴图,我们可以获得比箱线图更丰富的信息:

  • 分布形状: 小提琴的形状直观地展示了数据的分布形态,例如是否为单峰、双峰、偏态等。

  • 数据密度: 小提琴的宽度反映了数据在该数值范围内的密度,宽度越大,数据越集中。

  • 中心趋势和离散程度: 通过内部的箱线图或四分位数线,仍然可以获得数据的中位数、四分位数等信息,用于比较不同组别之间的中心趋势和离散程度。

  • 组间比较: 并排小提琴图可以直观地比较不同组别之间数值变量分布形状的差异。

适用场景:

  • 展示数据分布形状: 小提琴图能够清晰地展示数据的分布形状,尤其适用于展示非正态分布和多模态分布的数据。

  • 比较不同组别的数据分布形状: 并排小提琴图非常适合比较不同组别之间数值变量分布形状的差异。

  • 需要更详细了解数据分布的情况: 当箱线图无法满足需求,需要更深入了解数据分布细节时,小提琴图是一个很好的选择。

局限性:

  • 比箱线图更复杂: 小提琴图比箱线图更复杂,对于不熟悉核密度估计的用户来说,可能需要一定的学习成本才能理解其含义。

  • 对于小型数据集,小提琴图可能不够稳定: 核密度估计对于小型数据集可能不够稳定,小提琴图的形状可能会受到随机波动的影响。

  • 异常值信息不如箱线图直观: 小提琴图虽然也显示了数据范围,但异常值信息不如箱线图那样明确突出。

4.2.3 boxenplot():精细展示尾部分布的盒形图增强版

原理与解读:

boxenplot(),也称为 Letter-value plot (字母值图),是箱线图的进一步扩展,尤其适用于大型数据集。它通过绘制多层嵌套的箱体,更精细地展示数据的尾部分布,并减少了对异常值的过度强调。

boxenplot() 的核心思想是Letter Values (字母值)。它不仅仅关注四分位数,而是计算一系列更精细的分位数 (例如八分位数、十六分位数等),并用嵌套的箱体来表示这些分位数范围。最内层的箱体仍然表示四分位距 (IQR),外层箱体则逐渐向数据的尾部延伸,每一层箱体都代表了数据分布的不同百分比范围。

代码实践:

使用 sns.boxenplot() 函数,基本用法与 boxplot()violinplot() 类似:

sns.boxenplot(x="day", y="total_bill", data=tips) plt.title("不同星期总账单金额盒形图增强版") plt.show()

这段代码会生成一个盒形图增强版,展示不同星期总账单金额的尾部分布。

添加 hue 分类和调整外观:

boxenplot() 同样支持 hue 分类和各种外观调整参数,例如 palette, color, width, linewidth 等,用法与 boxplot()violinplot() 类似。

sns.boxenplot(x="day", y="total_bill", hue="sex", data=tips, palette="viridis") plt.title("按性别分组的不同星期总账单金额盒形图增强版") plt.show()

解读 boxenplot():

通过观察 boxenplot(),我们可以获得以下信息:

  • 尾部分布细节: 多层嵌套的箱体更精细地展示了数据的尾部分布,我们可以看到数据在不同百分比范围内的分布情况。

  • 中心趋势和离散程度: 最内层的箱体仍然可以提供类似于箱线图的四分位数和中位数信息。

  • 异常值弱化: 由于 boxenplot() 更关注整体分布,异常值的影响被相对弱化,更适合关注数据的主要分布特征。

  • 组间比较: 并排 boxenplot() 可以比较不同组别之间数值变量尾部分布的差异。

适用场景:

  • 大型数据集: boxenplot() 尤其适用于大型数据集,能够更有效地展示数据的整体分布,避免异常值过度影响视图。

  • 关注尾部分布: 当分析重点在于数据的尾部分布,例如需要了解极端值的分布情况,或者需要更精细地比较不同组别在尾部分布上的差异时,boxenplot() 是一个很好的选择。

  • 减少异常值干扰: 当数据中存在较多异常值,且不希望异常值过度影响视图时,boxenplot() 可以提供更稳健的分布展示。

局限性:

  • 比箱线图和violinplot更复杂: boxenplot() 比箱线图和 violinplot 更复杂,理解其原理和解读可能需要一定的学习成本。

  • 分布形状展示不如violinplot直观: 虽然 boxenplot() 展示了尾部分布,但对于整体分布形状的直观展示不如 violinplot()

  • 对于小型数据集,可能不够必要: 对于小型数据集,箱线图或小提琴图可能已经足够展示数据分布,使用 boxenplot() 可能显得过于复杂。

4.2.4 如何选择合适的类别分布图?

选择哪种类别分布图取决于你的分析目标和数据特点:

  • boxplot(): 如果你需要快速概览数据分布比较不同组别的中心趋势和离散程度,或者识别异常值boxplot() 是一个简洁有效的选择。

  • violinplot(): 如果你需要详细展示数据分布形状比较不同组别的分布形态,或者需要更深入了解数据分布细节violinplot() 是一个更强大的工具。

  • boxenplot(): 如果你的数据集很大关注数据的尾部分布,或者希望减少异常值对视图的影响boxenplot() 是一个更合适的选择。

通常情况下,可以根据以下步骤进行选择:

  1. 初步探索: 先使用 boxplot() 快速了解数据的基本分布特征,例如中心趋势、离散程度和异常值。

  2. 深入分析分布形状: 如果需要更详细了解数据分布形状,可以使用 violinplot()

  3. 大型数据集或关注尾部分布: 如果数据集很大,或者分析重点在于尾部分布,可以考虑使用 boxenplot()

在实际应用中,可以尝试多种类别分布图,并根据可视化效果和分析目标选择最合适的图表。

总结

Seaborn 的类别分布图为我们提供了强大的工具,用于探索分类变量对数值变量分布的影响。boxplot(), violinplot(), 和 boxenplot() 各有特点,适用于不同的分析场景。掌握它们的使用方法和解读技巧,能够帮助我们更深入地理解数据,发现数据中隐藏的模式和规律,从而做出更明智的决策。

希望本文能够帮助读者深入理解 Seaborn 类别分布图,并在实际数据分析中灵活运用,挖掘数据背后的价值。


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