首页 > 解决方案 > 为什么 Pandas 和 Seaborn 为相同的数据生成不同的 KDE Plot?

问题描述

我正在尝试查看具有以下值的变量的分布..

+-------+-------+
| Value | Count |
+-------+-------+
| 0.0   |   355 |
| 1.0   |   935 |
| 2.0   |     1 |
| 3.0   |     2 |
| 4.0   |     1 |
+-------+-------+

该表继续使用高达 1000 的值,但非常稀疏(总观测值 = 1622,几乎所有观测值都落在 0 或 1 中)

所以在绘图时我做了:

sns.distplot(kde=True, a = df.loc[(df.class == 1)].variable_of_interest)

产生以下红色分布

使用 seaborn 绘制 KDE 绘图

Seaborn 没有捕捉到值的初始集中,而是对其余的值表现出更多的“敏感性”

然后我想起来pd.DataFrame.plot.kde()了,所以我试了一下,它产生了这个捕捉注意力的情节

df.loc[(df.class== 1)].variable_of_interest.plot.kde()

Pandas KDE 发行版

重要提示:对于那些可能注意到 X 轴差异的人,我确实尝试使用 xlims(-500, 1000) 使用 seaborn,但情节仍然完全相同

你知道他们为什么会产生如此不同的情节吗?这与他们处理数据的方式有关,还是我做错了什么?

非常感谢您!

标签: pythonpandasseabornkde

解决方案


出了问题的是kde主要用于连续数据,而您似乎正在处理离散数据。一个重要的参数是bandwidth:它越小,曲线越接近数据,越宽越好表示一般形式。

似乎 seaborn 和 pandas 在这里使用不同的方法来估计“良好”的带宽。使用seaborn,您可以设置固定带宽sns.kdeplot(..., bw=0.5)左右。或seaborn.distplot(..., kde=True, kde_kws={'bw': 0.5})。与熊猫 df.plot.kde(bw_method=0.5, ...)。请注意,“完美”带宽并不存在,它取决于数据、样本数量以及您对底层分布的了解。默认的 seaborn 和 pandas 选择只是一个经验法则,它可能对您的数据有用或无用。未来的版本可能会使用不同的经验法则。

下图显示了不同带宽如何影响 kdeplot:

kdeplot 不同的带宽


推荐阅读