В статистике биннинг — это процесс помещения числовых значений в бины .
Наиболее распространенная форма биннинга известна как биннинг равной ширины , при которой мы делим набор данных на 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, но каждая ячейка не содержит одинакового количества наблюдений. Например:
- Первый бин простирается от -2,3015387 до -1,8528279 и содержит 3 наблюдения.
- Второй бин простирается от -1,8528279 до -1,40411588 и содержит 1 наблюдение.
- Третий бин простирается от -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.]))

Каждый бин не имеет одинаковой ширины, но каждый бин содержит одинаковое количество наблюдений. Например:
- Первый бин простирается от -2,3015387 до -0,93576943 и содержит 10 наблюдений.
- Второй бин простирается от -0,93576943 до -0,67124613 и содержит 10 наблюдений.
- Третий бин простирается от -0,67124613 до -0,37528495 и содержит 10 наблюдений.
И так далее.
Из гистограммы видно, что каждый бин явно не одинаковой ширины, но каждый бин содержит одинаковое количество наблюдений, что подтверждается тем фактом, что высота каждого бина одинакова.