Seaborn数据分布可视化完全指南
数据分布可视化的重要性
在数据分析或建模的初期阶段,理解变量的分布情况是至关重要的第一步。通过可视化技术,我们可以快速回答许多关键问题:观测值的范围是什么?它们的集中趋势如何?是否存在明显的偏斜?是否有双峰分布的迹象?是否存在显著的异常值?这些问题的答案是否会随着其他变量的变化而变化?
Seaborn作为Python中强大的数据可视化库,提供了一系列专门用于探索数据分布的函数。本文将深入讲解如何使用Seaborn进行数据分布可视化。
准备工作
在开始之前,我们需要导入必要的库并设置主题样式:
import seaborn as sns
sns.set_theme()
单变量直方图
直方图是最常见的数据分布可视化方法之一。Seaborn中可以使用displot()
或histplot()
函数来绘制直方图。
基础直方图
penguins = sns.load_dataset("penguins")
sns.displot(penguins, x="flipper_length_mm")
通过这个简单的直方图,我们可以立即获得关于企鹅鳍肢长度的一些洞察。例如,最常见的鳍肢长度约为195毫米,但分布呈现双峰形态。
分箱(bin)大小的选择
分箱大小是直方图的重要参数,错误的分箱大小可能会掩盖数据的重要特征或产生虚假模式。
- 直接设置分箱宽度:
sns.displot(penguins, x="flipper_length_mm", binwidth=3)
- 指定分箱数量:
sns.displot(penguins, x="flipper_length_mm", bins=20)
处理离散变量
当变量取较少的整数值时,默认分箱可能会产生不自然的间隙:
tips = sns.load_dataset("tips")
sns.displot(tips, x="size")
解决方法:
- 明确指定分箱边界:
sns.displot(tips, x="size", bins=[1, 2, 3, 4, 5, 6, 7])
- 使用离散模式:
sns.displot(tips, x="size", discrete=True)
分类变量的直方图
sns.displot(tips, x="day", shrink=.8)
基于其他变量的条件分布
理解变量分布后,下一步通常是探索该分布是否随其他变量而变化。
使用色调(hue)区分
sns.displot(penguins, x="flipper_length_mm", hue="species")
不同的可视化方式
- 阶梯图:
sns.displot(penguins, x="flipper_length_mm", hue="species", element="step")
- 堆叠图:
sns.displot(penguins, x="flipper_length_mm", hue="species", multiple="stack")
- 并列图:
sns.displot(penguins, x="flipper_length_mm", hue="sex", multiple="dodge")
使用分面(facet)展示
sns.displot(penguins, x="flipper_length_mm", col="sex")
归一化直方图统计
当子集的观测数量不等时,比较它们的计数分布可能不太理想。可以使用归一化:
- 密度归一化:
sns.displot(penguins, x="flipper_length_mm", hue="species", stat="density")
- 独立归一化:
sns.displot(penguins, x="flipper_length_mm", hue="species", stat="density", common_norm=False)
- 概率归一化:
sns.displot(penguins, x="flipper_length_mm", hue="species", stat="probability")
核密度估计(KDE)
核密度估计提供了另一种可视化数据分布的方法,它不使用离散的分箱,而是使用高斯核平滑观测值,生成连续的密度估计。
基础KDE图
sns.displot(penguins, x="flipper_length_mm", kind="kde")
平滑带宽的选择
带宽选择对KDE的准确性至关重要:
- 较小带宽:
sns.displot(penguins, x="flipper_length_mm", kind="kde", bw_adjust=.25)
- 较大带宽:
sns.displot(penguins, x="flipper_length_mm", kind="kde", bw_adjust=2)
条件KDE
sns.displot(penguins, x="flipper_length_mm", hue="species", kind="kde")
填充KDE曲线
sns.displot(penguins, x="flipper_length_mm", hue="species", kind="kde", fill=True)
KDE的局限性
KDE假设基础分布是平滑且无界的,这在某些情况下会导致问题:
- 自然有界变量:
sns.displot(tips, x="total_bill", kind="kde")
- 使用cut参数限制范围:
sns.displot(tips, x="total_bill", kind="kde", cut=0)
- 离散数据问题:
diamonds = sns.load_dataset("diamonds")
sns.displot(diamonds, x="carat", kind="kde")
直方图与KDE结合
sns.displot(diamonds, x="carat", kde=True)
经验累积分布函数(ECDF)
ECDF绘制了一条单调递增的曲线,其中曲线高度反映了观测值的比例。
总结
Seaborn提供了多种可视化数据分布的方法,每种方法都有其优缺点。直方图直观但受分箱影响大;KDE平滑连续但对边界和离散数据敏感;ECDF保留了所有数据点但可能不如前两者直观。在实际应用中,应根据数据特性和分析目标选择合适的方法,有时结合多种方法能获得更全面的理解。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考