Python 为什么熊猫和Seaborn为相同的数据生成不同的KDE图?
我想看看具有以下值的变量的分布Python 为什么熊猫和Seaborn为相同的数据生成不同的KDE图?,python,pandas,seaborn,kde,Python,Pandas,Seaborn,Kde,我想看看具有以下值的变量的分布 +-------+-------+ | Value | Count | +-------+-------+ | 0.0 | 355 | | 1.0 | 935 | | 2.0 | 1 | | 3.0 | 2 | | 4.0 | 1 | +-------+-------+ 该表继续显示最大为1000的值,但非常稀疏(总观察值=1622,几乎所有观察值均为0或1) 所以当我策划时: sns.distplot(kde
+-------+-------+
| 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)]。感兴趣的变量)
这将产生以下红色分布
Seaborn没有捕捉到价值的初始集中,但对其他价值表现出更多的“敏感性”
然后我想起了pd.DataFrame.plot.kde()
,所以我尝试了一下,它生成了这个捕获浓度的图
df.loc[(df.class==1)].variable\u of\u interest.plot.kde()
重要提示:对于那些可能注意到X轴不同的人,我确实尝试了带有XLIM(-5001000)的seaborn,但情节仍然完全相同
你知道为什么它们会生成如此不同的图吗?
这与他们处理数据的方式有关,还是我做错了什么?
提前非常感谢 问题在于,主要用于连续数据,而您似乎在处理离散数据。一个重要的参数是
带宽
:它越小,曲线越接近数据,越宽越好表示一般形式
似乎seaborn和pandas在这里使用不同的方法来估计“良好”带宽。使用,您可以设置固定带宽sns.kdeplot(…,bw=0.5)
左右。或使用df.plot.kde(bw_方法=0.5,…)
。请注意,“完美”带宽并不存在,它取决于数据、样本数量以及您对底层分布的了解。默认的seaborn和pandas选项只是一个经验法则,可能对您的数据有用,也可能不有用。未来的版本可能会使用不同的经验法则
下图显示了不同带宽如何影响kdeplot:
谢谢@JohanC,你所指出的关于连续变量和离散变量的观点是正确的,但我希望以图形的方式获得分布的“感觉”,尽管不正确,但我认为这可以给我一个提示。我已经玩了一点这些参数,我确实得到了类似的形状,但我仍然找不到精确的参数化来获得相同的绘图(不是我需要它,只是出于好奇),再次感谢!通常,用于估计带宽。这将是
n**(-1./(d+4))
和n
数据点的数量(1622?),以及d
维度(1),因此大约0.228
。Seaborn使用了一个轻微的“scott”-1.059*a*nobs**(-1/5.)
,其中a
是min(std(X),IQR/1.34)
,在本例中效果不佳。