Python 中的等频分箱


在统计学中,分组是将数值分组的过程。

最常见的聚类形式称为等宽聚类,其中我们将数据集划分为k 个等宽的组。

一种不太常用的聚类形式称为等频聚类,其中我们将数据集分为k 个组,所有组都具有相同的频率数。

本教程介绍如何在 python 中执行等频聚类。

Python 中的等频分箱

假设我们有一个包含 100 个值的数据集:

 import numpy as np
import matplotlib.pyplot as plt

#create data
np.random.seed(1)
data = np.random.randn(100)

#view first 5 values
data[:5]

array([ 1.62434536, -0.61175641, -0.52817175, -1.07296862, 0.86540763])

等宽分组:

如果我们创建一个直方图来显示这些值,Python 将默认为等宽分组:

 #create histogram with equal-width bins
n, bins, patches = plt.hist(data, edgecolor='black')
plt.show()

#display bin boundaries and frequency per bin 
bins, n

(array([-2.3015387 , -1.85282729, -1.40411588, -0.95540447, -0.50669306,
        -0.05798165, 0.39072977, 0.83944118, 1.28815259, 1.736864,
         2.18557541]),
 array([ 3., 1., 6., 17., 19., 20., 14., 12., 5., 3.]))

每个组的宽度相等,约为 0.4487,但每个组包含的观测值数量不同。例如:

  • 第一个 bin 从 -2.3015387 延伸到 -1.8528279,包含 3 个观测值。
  • 第二个 bin 从 -1.8528279 延伸到 -1.40411588,包含 1 个观测值。
  • 第三个 bin 从 -1.40411588 延伸到 -0.95540447,包含 6 个观测值。

等等。

等频分组:

要创建包含相同数量观测值的存储桶,我们可以使用以下函数:

 #define function to calculate equal-frequency bins 
def equalObs(x, nbin):
    nlen = len(x)
    return np.interp(np.linspace(0, nlen, nbin + 1),
                     np.arange(nlen),
                     np.sort(x))

#create histogram with equal-frequency bins 
n, bins, patches = plt.hist(data, equalObs(data, 10), edgecolor='black')
plt.show()

#display bin boundaries and frequency per bin 
bins, n

(array([-2.3015387 , -0.93576943, -0.67124613, -0.37528495, -0.20889423,
         0.07734007, 0.2344157, 0.51292982, 0.86540763, 1.19891788,
         2.18557541]),
 array([10., 10., 10., 10., 10., 10., 10., 10., 10., 10.])) 

Python中的等频分组示例

每个组的宽度不相等,但每个组包含等量的观察值。例如:

  • 第一个 bin 从 -2.3015387 延伸到 -0.93576943,包含 10 个观测值。
  • 第二个 bin 从 -0.93576943 延伸到 -0.67124613,包含 10 个观测值。
  • 第三个 bin 从 -0.67124613 延伸到 -0.37528495,包含 10 个观测值。

等等。

从直方图中我们可以看到,每个 bin 的宽度显然不一样,但是每个 bin 包含相同数量的观测值,每个 bin 的高度相等这一事实证实了这一点。

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注