有时,当我使用seaborn的displot函数创建直方图时,norm_hist = True,y轴小于PDF预期的1。其他时候,它取的值大于1。
例如,如果我运行
sns.set();
x = np.random.randn(10000)
ax = sns.distplot(x)
然后,直方图上的y轴将按预期的那样从0.0变为0.4,但是如果数据不是正常的,则即使norm_hist = True,y轴也可能高达30。
我对直方图函数的归一化参数缺少什么,例如nors_hist for sns.distplot?即使我自己通过以下方式创建新变量来规范化数据:
new_var = data/sum(data)
,以便数据求和为1,无论norm_hist参数是否为True,y轴仍将显示远大于1的值(例如30)。
当y轴的范围如此之大时,我能给出什么解释?
我认为正在发生的事情是我的数据紧密集中在零附近,因此为了使数据的面积等于1(例如,在kde以下),直方图的高度必须大于1。但是既然概率不能大于1,那么结果意味着什么?
此外,如何获得这些函数以在y轴上显示概率?
答案 0 :(得分:3)
规则不是所有的小节都应加一。规则是所有条形的所有面积之和应为一。当条形图非常窄时,尽管它们的面积之和为1,但它们的总和可能会很大。条形的高度乘以它的宽度是一个值将全部处于该范围内的概率。要使高度等于概率,您需要宽度为1的条形。
这里是一个示例,说明发生了什么情况。
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
fig, axs = plt.subplots(ncols=2, figsize=(14, 3))
a = np.random.normal(0, 0.01, 100000)
sns.distplot(a, bins=np.arange(-0.04, 0.04, 0.001), ax=axs[0])
axs[0].set_title('Measuring in meters')
axs[0].containers[0][40].set_color('r')
a *= 1000
sns.distplot(a, bins=np.arange(-40, 40, 1), ax=axs[1])
axs[1].set_title('Measuring in milimeters')
axs[1].containers[0][40].set_color('r')
plt.show()
左侧的图使用0.001
米宽的垃圾箱。最高料仓(红色)大约高40
。值落入该bin的概率为40*0.001 = 0.04
。
右图使用完全相同的数据,但以毫米为单位。现在,垃圾箱的宽度为1 mm
。最高料仓约为0.04
高。由于0.04
的bin宽度,值落入该bin的概率也为1
。
PS:作为概率密度函数具有大于1的区域的分布的示例,请参见Pareto distribution和α = 3
。