Сколько столбцов должно быть в гистограмме
Ты знаешь правильный ответ)
Что такое гистограмма знают даже школьники. Это аналог bar-чарта (столбчатой диаграммы), только по оси X отложены интервалы (bins). По оси Y также прямоугольники высотой, пропорциональной частоты встречаемости значения интервала в данных (плотность вероятности). Это удобный способ представления данных, который мы можно использовать например для сегментации.
Но на сколько интервалов нужно разбивать ось Х?
Мотивация
Пример 1
Итак, возьмем простой пример и построим гистограмму.
import matplotlib.pyplot as plt
import numpy as np
arr = np.array([20.13, 19.94, 20.03, 20.06, 20.04, 19.98, 20.15, 19.99, 20.20, 19.99, 20.13, 20.22, 19.86, 19.97, 19.98, 20.06,
29.97, 29.73, 29.75, 30.13, 29.96, 29.82, 29.98, 30.12, 30.18, 29.95, 29.97, 29.82, 30.04, 29.93, 30.04, 30.07,
40.10, 39.93, 40.05, 39.82, 39.92, 39.91, 39.75, 40.00, 40.02, 39.96, 40.07, 39.92, 39.86, 40.04, 39.91, 40.14,
49.95, 50.06, 50.03, 49.92, 50.15, 50.06, 50.00, 50.02, 50.06, 50.00, 49.70, 50.02, 49.96, 50.01, 50.05, 50.13])
plt.hist(arr) # plt.hist(arr,bins=5)
Видим, что получилось 4 красивых столбика (левая часть картинки 1). По умолчания matplotlit разбивает выборку на 10 бинов. Кажется, что это излишне, и мы можем выставить количество бинов равно 5. К сожалению, получим то что на картинке 1 справа. Более того, если мы выберем кол-во бинов равное 4, то на matplotlib нарисует всего 1 широкий прямоугольник.
Исходя из примера выше, мы постулируем: для построения гистограммы нужно выбирать достаточное количество бинов!
Пример 2
Возьмем 500 чисел из нормального распределение так, чтобы квантили были распределены равномерно. Построив гистограмму, мы должны получить нормальное распределение.
Картинка 2 показывает, что гистограмма сильно зависит от количества бинов. Если их кол-во больше чем размер выборки (пример слева), получим совершенно необъективную картину (почти равномерное распределение вместо нормального). При кол-ве бинов равному размеру выборки распределение уже больше походит на колокол, но все еще имеет большие разрывы и ступенчатость, что нехарактерно для нормального распределения. Показательна здесь гистограмма справа со стандартным кол-вом бинов, т.е. 10. Она похоже на нормальное распределение, но слишком ступенчатая.
Немного о том, как сгенерировать такое распределение.
Возьмем интервал числе от 0 до 1 включительно с шагом 0.002, всего 501 число. Далее, для каждого числа посчитаем квантильную функцию (или percent point function) нормального распределения, т.е. обратную к кумулятивной функции распределения (т.н. преобразование Смирнова), как это считается для получения порогов статистик при расчете стат-значимости). График такой функции для нормального распределения можно посмотреть тут.
Код для получения графика выше:
%pylab inline
import pandas as pd
from scipy.stats import norm
import matplotlib
l = [item/500 for item in range(501)]
df = pd.DataFrame({"percentile": l, "z_score": norm.ppf(l)})
df.replace([np.inf, -np.inf], np.nan).z_score.hist(bins=1000)
Вывод: слишком большое кол-во интервалов/бинов — это тоже очень плохо, мы увидим распределение очень далекое от реального и примем неправильное решение.
Автоматизированный расчет
Ответ на вопрос сколько должно быть бинов в гистограмме понятен. Нужно перепробовать несколько и выбрать тот, который как кажется максимально хорошо представляет данные. Более того, нужное представление зависит от задачи, и часто даже не лучший вариант может быть подходящим под нее (понять границы распределения, найти выбросы или моды, посчитать количество мод, нахождение сложных патернов и тд.).
Однако представим, что мы делаем автоматизированную систему (например, платформа расчета А/В-тестов), и в коде должно быть зашито либо количество столбцов, либо алгоритму по его выбору. Очевидно, что алгоритм должен зависеть от самих данных, которые мы подаем на вход. Ниже мы разберем несколько таких алгоритмов.
Правило Стёрджеса (Sturges’ formula)
Есть несколько простых эвристик, учитывающих размер выборки. Больше элементов — больше бинов, что логично. Однако, мы уже знаем, что слишком большое количество бинов (например, равное размеру выборки N) делает с гистограммой то, что в англоязычном мире называется misleading. Можно взять функцию от N, меньшую чем N. Например, квадратный корень из N (это правило использует Excel).
Обычно в современном дата-анализе при работе с биг-датой даже подобное число столбцов будет слишком большим, поэтому можно взять другую степень у корня. Правило Риса (Rice rule)— удвоенный корень третьей степени.
Даже в этом случае кол-во бинов может оказаться слишком большим, поэтому можно воспользоваться правилом Стёрджеса, при котором используется логарифм, а логарифмическая функция растет медленнее любой степенной функции. В качестве обоснования метода можно предложить идею, что на каждый непустой интервал приходилось в среднем не меньше одного значения, и чтобы понять какой интервал надо воспользоваться методом половинного деления.
Если размер выборки наоборот не велик, или наше распределение мультимодально и нам нужна большая точность (предыдущие методы плохо работает с n<40, т.к. покажут меньше 7 бинов), можно воспользоваться показательной функцией, т.к она всегда растет быстрее чем степенная и тем более логарифмическая. Это утверждение, как и прошлое с курсивом, легко проверяются разложением по формуле Тейлора.
Зависимость от формы распределения
Предложенные методы можно улучшить, взяв во внимание параметры распределения. Например, для известных распределений вероятностей можно найти такое кол-во бинов, при котором разница между ним и гистограммой будет минимальна.
Примером такого подхода является метод Скотта. Он рассчитывает ширину бина h на основе 𝜎 (std выборки) и затем высчитывает кол-во бинов, деля весь диапозон данных на h (см. картинку 4).
Подход Скотта является оптимальным только для нормально распределенных данных (как и Стёрджес), но плохо работает для скошенных данных. В таком случае требуется гораздо больше бинов, чтобы увеличить точность в местах, далеких от длинного хвоста.
Для скошенных данных можно использовать подход Доана. Это модификация формулы Стёрджеса, но с дополнительным слагаемым, содержащим в себе коэффициент асимметрии. Однако, этот подход критикуют за то что он все еще не решает проблему слишком сглаженных распределений.
Другой популярный подход для данных с длинными хвостами — метод Дьякониса. Он не учитывает скошенность, а модифицирует метод Скотта, используя в качестве меры разброса не дисперсию, а интерквартильный размах, и поэтому меньше подвержен выбросам.
Если в формуле Дьякониса заменить 2 на 2.59, то при нормальном распределении он асимптотически сходится к методу Скотта.
Общие правила
Существует большое кол-во методов, помимо уже перечисленных (можно посмотреть английскую википедию или вопрос на cross-validated). Так какой же использовать? Как было сказано, желательно попробовать несколько, учитывая знания о выборке: размер, ожидаемая форма и тд.
Также, совсем необязательно использовать бины одинаковой ширины. Гораздо лучше, если столбцы не отличаются по высоте на порядки, и для этого на концах распределения можно делать более широкие бины. В таком случае уже не высота столбца должна быть пропорциональна частотности, а площадь прямоугольника. Если интервалы разные, то все еще могут работать подходы с кубическим корнем от размеры выборки (читай обоснование).
Для того, чтобы не сделать неправильных выводов, можно соблюдать следующие правила:
- Кол-во бинов не должно быть слишком большим (сотни и тысячи).
- Бины должно содержать соизмеримое кол-во семплов (не различаться на несколько порядков).
- Стоит учитывать кол-во мод в распределении. В первом примере было 4 моды, и если брать кол-во бинов кратное 3, гистограмма выдавала плохой результат.
Также, не стоит забыть рисовать density поверх гистограммы. Для ее подсчета используются разные kernel-методы. К слову, в них тоже есть похожий параметр h, называемый bandwidth, и к нему также можно применять свой собственный метод Скотта и другие, но это уже отдельная история.
P.S.: Расширение гистограммы для более сложных визуализаций можно посмотреть в этой статье.
P.P.S.: Если тебе понравилась стать, в качестве благодарности можешь купить мне кофе на https://www.donationalerts.com/r/stats_data_ninja или https://buymeacoffee.com/koch.