【问题标题】:Why are Pandas and Seaborn producing different KDE Plot for same data?为什么 Pandas 和 Seaborn 为相同的数据生成不同的 KDE Plot?
【发布时间】:2020-09-22 09:21:31
【问题描述】:

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

+-------+-------+
| 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 没有捕捉到值的初始集中,但对其余的值表现出更多的“敏感性”

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

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

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

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

提前非常感谢您!

【问题讨论】:

    标签: python pandas seaborn kde


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢@JohanC,您所指出的关于连续变量和离散变量是正确的,但我希望以图形方式“了解”分布,尽管不正确,但我认为它可以给我一个提示。我已经对这些参数进行了一些尝试,并且确实得到了相似的形状,但我仍然找不到确切的参数化来获得相等的图(不是我需要它,只是出于好奇)再次感谢!
    • 通常Scott's rule用于估计带宽。哪个是n**(-1./(d+4))n 是数据点的数量(1622?),d 是维度(1),所以大约是0.228。 Seaborn 使用了轻微的variation to Scott's rule "scott" - 1.059 * A * nobs ** (-1/5.),其中Amin(std(X),IQR/1.34),在这种情况下效果不佳。
    猜你喜欢
    • 2016-10-18
    • 1970-01-01
    • 2019-08-29
    • 2020-12-13
    • 2015-07-31
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多