Course
Пытались когда-нибудь визуализировать распределение и получали гистограмму, форма которой меняется каждый раз, когда вы меняете размер бина?
Обычно это выглядит так. Вы выбираете 10 бинов — кривая кажется гладкой. Переключаете на 30 — появляется несколько пиков. Данные остаются теми же, но разное число бинов даёт разные интерпретации. Это главная проблема гистограмм: они показывают не само распределение, а лишь одну его версию. И эта версия зависит от параметра, который вы задаёте произвольно.
KDE предлагает другой подход. Вместо разбиения данных на бины, она накладывает небольшую гладкую кривую на каждую точку данных и суммирует их. Это даёт единую непрерывную оценку скрытого распределения.
В этой статье вы получите интуитивное понимание KDE, разбор формулы, объяснение того, как ширина окна управляет гладкостью, и практические примеры на Python и R.
Вы только знакомитесь с гистограммами? Вот подробное руководство по частотным гистограммам, которое поможет вам начать.
Что такое оценка плотности ядра?
Оценка плотности ядра — это непараметрический метод оценки функции плотности вероятности по набору данных.
Именно непараметричность делает её иной.
В параметрических методах вы предполагаете, что данные следуют конкретному распределению — нормальному, экспоненциальному — и подбираете параметры под него. Если предположение неверно, неверна и модель. KDE таких предположений не делает. Она позволяет данным «говорить самим за себя» и строит оценку лежащего в основе распределения прямо по наблюдениям.
Результат — гладкая кривая, показывающая, где вероятнее всего встречаются значения — и насколько велика эта вероятность. Высокие точки кривой означают плотные области. Низкие — разреженные.
Зачем использовать оценку плотности ядра?
Гистограммы — инструмент по умолчанию для визуализации распределений, но у них есть проблема: форма зависит от выбранного числа бинов. И этот параметр вы выбираете сами. Два человека могут смотреть на один и тот же набор данных и прийти к разным выводам, просто выбрав разное количество бинов.
С KDE вместо того, чтобы загонять данные в бины, вы получаете гладкую непрерывную кривую, которая не меняется из‑за произвольного параметра, выбранного заранее.
Это полезно для нескольких задач:
- Визуализация общей формы распределения без смещения из‑за размера бина
- Обнаружение паттернов, таких как множественные пики, асимметрия или тяжёлые хвосты
- Сравнение распределений по группам на одном графике
- Получение более чистого представления о данных перед моделированием
Интуиция, лежащая в основе KDE
Вы берёте каждую точку данных и накладываете на неё небольшую гладкую кривую. Эта кривая называется ядром. Затем просто суммируете все эти отдельные кривые в одну.
В итоге получается единая гладкая кривая, показывающая плотность ваших данных. Там, где точки сгруппированы, множество ядер перекрываются и накапливаются, и кривая поднимается. Там, где данных мало, ядра почти не перекрываются, и кривая остаётся низкой. Каждый пункт вносит равный вклад в итоговую оценку.
Представьте, что вы записали итоговые оценки за экзамен для класса студентов. Вместо разбиения их на гистограмму, KDE накладывает небольшую гладкую кривую на каждую оценку. Там, где оценки сгруппированы — скажем, около 70–75 — кривые наслаиваются, и оценка растёт. Один студент с результатом 95 добавляет лишь небольшой бугорок на хвосте.
На визуализации ниже показано именно это. Большинство студентов получили баллы около среднего, и один студент набрал значительно выше:

Визуализация KDE
Формула оценки плотности ядра
Формула KDE выглядит страшнее, чем есть на самом деле.

Формула KDE
Вот что означает каждая часть:
-
n— количество точек данных -
x_i— отдельные наблюдения в вашем наборе данных -
K— ядровая функция, гладкая кривая, накладываемая на каждую точку -
h— ширина окна (bandwidth), определяет, насколько широко растянуто каждое ядро -
x— точка, в которой вы оцениваете плотность
Проще говоря, формула говорит: для любой точки x посмотрите, насколько близка к ней каждая точка данных x_i, взвесьте эту близость с помощью ядровой функции K и усредните результат по всем n точкам. Делая это для каждого x на диапазоне, вы получаете полную кривую плотности.
Ширина окна h стоит в знаменателе дроби внутри K. Меньшее h сужает ядро, так что на оценку влияют только очень близкие точки. Большее h расширяет область влияния. Об этом подробнее далее в статье.
Что такое ядровая функция?
Ядро — это гладкая кривая, которую вы накладываете на каждую точку данных. Оно определяет, как влияние этой точки распространяется на соседние.
Каждое ядро центрировано в точке данных и присваивает веса в зависимости от расстояния. Точки рядом с центром получают большой вес. Далёкие точки — малый или вовсе нулевой. Точная форма взвешивания зависит от выбранного вами ядра.
Чаще всего выбирают одно из трёх:
- Гауссовское: колоколообразная кривая. Назначает вес каждой точке в наборе, и влияние спадает с расстоянием. Это значение по умолчанию в большинстве библиотек и хорошо работает на практике
- Равномерное: плоский прямоугольник. Каждая точка в пределах фиксированного расстояния получает одинаковый вес, а всё, что вне — нулевой. Просто, но даёт менее гладкие оценки
- Ядро Эпанечникова: параболическая форма, математически оптимальная по среднеквадратичной ошибке. Эффективнее гауссовского, но на практике редко даёт заметную разницу.
В большинстве случаев выбор ядра мало влияет на результат. Два разных ядра, применённые к одним и тем же данным с одной и той же шириной окна, дадут почти идентичные кривые. Гораздо важнее ширина окна — и к ней мы сейчас перейдём.
Роль ширины окна в KDE
Ширина окна — единственный параметр, который оказывает наибольшее влияние на результат KDE, даже больше, чем выбор ядра.
Она определяет ширину каждого ядра. Узкое ядро учитывает влияние только близлежащих точек. Широкое — распространяет влияние на гораздо больший диапазон. В результате вы получаете либо кривую, тесно следующую за данными, либо сглаживающую их.
Маленькая ширина окна
Маленькая ширина делает каждое ядро узким и плотным. Оценка остро реагирует на каждую точку данных, а значит, улавливает реальную структуру, но и шум тоже.
На практике это выглядит как «колючая» кривая с множеством небольших пиков. Некоторые из них отражают реальные кластеры в данных. Другие — лишь артефакты недостаточного сглаживания. Трудно понять, где что, и в этом проблема.

KDE с маленькой шириной окна
Большая ширина окна
Большая ширина растягивает каждое ядро. Соседние ядра сильно перекрываются, и итоговая кривая получается гладкой.
Если сглаживание чрезмерно, вы начинаете терять реальную структуру. Два отдельных кластера могут слиться в одну кривую. Распределение с тяжёлым хвостом может выглядеть симметричным. Визуализация может скрывать от вас важные вещи.

KDE с большой шириной окна
Как подобрать подходящую ширину
Универсально правильной ширины не существует. Цель — найти значение, которое достаточно сглаживает шум, но не настолько, чтобы уничтожать реальные паттерны.
Большинство библиотек используют автоматический выбор ширины окна. Правило Сильвермана — самое распространённое. Оно выбирает ширину на основе размера выборки и стандартного отклонения ваших данных. Хорошо работает для примерно нормальных распределений, но может чрезмерно сглаживать мультимодальные.
Если вы не уверены, попробуйте несколько значений ширины и сравните кривые. Различия многое расскажут о ваших данных.
KDE vs. гистограмма
И гистограммы, и KDE показывают распределение данных — но делают это по‑разному.
Гистограмма
Гистограмма разбивает данные на дискретные бины и считает, сколько точек попало в каждый. Это быстро, наглядно и легко объяснить не технической аудитории.
Проблема — чувствительность к числу бинов. Измените их количество — изменится и форма. Объективно правильного числа бинов нет, значит, два человека могут по одному и тому же набору данных сделать разные выводы, просто из‑за этого выбора.
Гистограммы дают ступенчатую, разрывную форму. Для быстрого взгляда это нормально, но истинное распределение может скрываться.
KDE
KDE даёт гладкую непрерывную кривую без бинов. Она лучше раскрывает реальную форму распределения — такие вещи, как асимметрия, множественные пики или тяжёлые хвосты, которые гистограмма может пропустить или исказить в зависимости от выбора бинов.
Обратная сторона — у KDE есть свой параметр — ширина окна — и она требует больше вычислений. Её также сложнее объяснить, поскольку ось Y показывает плотность вероятности, а не счётчики, что может запутать читателей, незнакомых с понятием.
Когда что использовать
Используйте гистограмму, когда нужен быстрый, легко интерпретируемый обзор данных или когда ваша аудитория не знакома с оценками плотности. Используйте KDE, когда важна форма распределения — например, при сравнении групп или попытке обнаружить несколько мод в данных.

Сравнение гистограммы и KDE
На практике их часто используют вместе: гистограмма для счётчиков, кривая KDE — сверху для формы.
Оценка плотности ядра в Python
В Python есть несколько способов вычислить и построить KDE — в зависимости от того, нужен ли вам быстрый график или больший контроль над самой оценкой.
Визуализация KDE с помощью seaborn
Самый быстрый способ получить график KDE — seaborn.kdeplot(). Этого достаточно:
import seaborn as sns
import numpy as np
np.random.seed(42)
scores = np.concatenate([
np.random.normal(65, 4, 60),
np.random.normal(80, 3, 40)
])
sns.kdeplot(scores, bw_adjust=1)

KDE в seaborn
Параметр bw_adjust масштабирует автоматически выбранную ширину окна. Значения ниже 1 делают кривую более «тугой», значения выше 1 — более сглаженной. Это множитель поверх той ширины, которую seaborn выбирает внутри себя, так что вам не нужно вручную задавать «сырое» значение ширины.
Ось Y показывает плотность вероятности, а не счётчики. Кривая говорит, насколько вероятно значение относительно остальной части распределения. Выше — значит, больше данных сосредоточено там.
Вычисление KDE с помощью scipy
Если вам нужны собственно значения плотности, а не только график, используйте scipy.stats.gaussian_kde. Это даёт вызываемый объект, который можно оценивать в любой точке.
from scipy.stats import gaussian_kde
import numpy as np
import matplotlib.pyplot as plt
kde = gaussian_kde(scores, bw_method="scott")
x = np.linspace(45, 100, 500)
density = kde(x)
plt.plot(x, density)
bw_method="scott" использует правило Скотта для автоматического выбора ширины. Это хороший вариант по умолчанию для большинства случаев. Можно также передать число, чтобы задать ширину вручную.

KDE со scipy и matplotlib
Оценка плотности ядра в R
В R KDE встроена в базовый язык. Никаких дополнительных пакетов не требуется.
Вычисление KDE с помощью density()
Функция density() принимает числовой вектор и возвращает объект KDE.
set.seed(42)
scores <- c(rnorm(60, mean = 65, sd = 4),
rnorm(40, mean = 80, sd = 3))
kde <- density(scores, bw = "SJ")
Аргумент bw управляет выбором ширины окна. "SJ" использует метод Шизера–Джонса, который лучше справляется с мультимодальными распределениями, чем значение по умолчанию. Можно также передать числовое значение для ручной настройки ширины.
Результат — это список с двумя ключевыми компонентами:
kde$x: последовательность точек, в которых оценивалась плотностьkde$y: соответствующие значения плотности
Построение кривой
Просто передайте результат напрямую в plot().
plot(kde,
main = "Exam Score Distribution",
xlab = "Score",
ylab = "Density")

KDE в R
Чтобы наложить KDE на гистограмму, сначала используйте hist() с freq = FALSE, затем добавьте кривую с помощью lines().
hist(scores, freq = FALSE, main = "Histogram + KDE", xlab = "Score")
lines(kde, col = "blue", lwd = 2)

Гистограмма с KDE в R
freq = FALSE масштабирует гистограмму к плотности, чтобы столбики и кривая имели общую ось Y.
Преимущества и ограничения KDE
KDE — действительно полезный визуальный инструмент, но, как и у любого другого, у него есть компромиссы, о которых стоит знать, прежде чем заменять им гистограммы.
Преимущества
Главное достоинство в том, что KDE не делает предположений о распределении ваших данных. Вам не нужно заранее решать, нормальные ли это данные, экспоненциальные или какие-то ещё. Форма следует из самих данных, что делает KDE достаточно гибкой для мультимодальных распределений и всего, что не вписывается в стандартные параметрические формы.
Результат — гладкая непрерывная кривая, а не ступенчатая аппроксимация. Это упрощает обнаружение паттернов — таких как множественные пики или длинные хвосты — которые гистограмма может скрыть в зависимости от выбора бинов.
И поскольку KDE работает с «сырыми» данными без предварительной подгонки модели, это хороший первый шаг в любой разведывательной аналитике.
Ограничения
Подбор ширины окна — основная слабость. Если ошибиться, оценка либо гоняется за шумом, либо сглаживает реальные паттерны в данных. Автоматические методы, такие как правило Сильвермана, хорошо работают для примерно нормальных данных, но могут вводить в заблуждение при сложных распределениях. Часто нужно вручную проверить несколько значений ширины, прежде чем доверять результату.
Производительность может стать проблемой на больших объёмах. KDE вычисляет ядровую функцию для каждой точки данных в каждой точке оценки, поэтому объём вычислений быстро растёт с размером набора. Для большинства разведочных задач это не критично, но на сотнях тысяч наблюдений может быть медленно.
Пограничные эффекты — более тонкая проблема. Стандартная KDE предполагает, что данные могут простираться бесконечно в обе стороны. Когда у данных есть жёсткая граница — например, значения не могут быть меньше нуля — оценка «утекает» за пределы допустимого диапазона, из‑за чего кривая искусственно занижена у края. Существуют погранично‑скорректированные версии KDE, но они реже реализованы в стандартных библиотеках.
Заключение
KDE даёт более чистый способ посмотреть на распределение ваших данных, чем гистограммы. Нет выбора бинов и параметрических предположений — только гладкая кривая, показывающая то, что действительно есть в наборе данных.
Ширина окна — единственный параметр, который действительно важен. Попробуйте несколько значений, сравните кривые, используйте автоматические варианты и убедитесь, что оценка соответствует вашим знаниям о данных, прежде чем делать выводы.
Лучший способ развить интуицию для KDE — запустить её на реальных данных. Возьмите знакомый вам набор, примените KDE и сравните с гистограммой, чтобы увидеть, что вы упускали.
Интересует визуализация данных? Посмотрите наш курс по визуализации данных с Seaborn, если вы используете Python, или визуализации данных с ggplot2, если вы используете R.
FAQs
Для чего используется оценка плотности ядра?
KDE используют для оценки распределения вероятностей набора данных без предположений о конкретной форме, такой как нормальная или экспоненциальная. Она распространена в разведочном анализе данных, когда вы хотите визуализировать распределение перед моделированием. Также применяется для обнаружения аномалий, сравнения распределений между группами и как этап сглаживания в статистических конвейерах.
Чем KDE отличается от гистограммы?
Гистограмма разбивает данные на дискретные бины и считает, сколько точек попало в каждый. Получаемая форма зависит от выбранного числа бинов, что делает её чувствительной к произвольному параметру. KDE избегает этого, накладывая гладкую кривую на каждую точку данных и суммируя их, что даёт непрерывную оценку, не зависящую от числа бинов.
Нужен ли большой набор данных, чтобы использовать KDE?
KDE работает и на малых наборах данных, но оценки менее надёжны, когда точек совсем мало. При ограниченном количестве данных отдельные наблюдения сильно влияют на итоговую кривую, и становится труднее отделять реальную структуру от шума. По мере роста набора данных оценка стабилизируется и точнее отражает истинное распределение.
Что будет, если выбрать неправильную ширину окна?
Слишком маленькая ширина окна даёт «колючую» кривую, реагирующую на каждую отдельную точку, из‑за чего сложно увидеть общую форму данных. Слишком большая ширина чрезмерно сглаживает оценку и может сливать отдельные пики в один «горб», скрывая реальную структуру. В большинстве библиотек есть автоматический выбор ширины, например правило Сильвермана, как отправная точка, но полезно вручную проверить пару значений перед выводами.
Хорошо ли работает KDE у границ данных?
Стандартная KDE предполагает, что данные могут простираться бесконечно в обе стороны, что вызывает проблемы, когда у переменной есть жёсткая нижняя или верхняя граница — как возраст, доход или любые счётчики, не могущие быть ниже нуля. Рядом с такими границами оценка «утекает» за пределы допустимого диапазона, и кривая становится искусственно низкой у краёв. Существуют погранично‑скорректированные методы KDE, но они есть не во всех библиотеках и требуют дополнительной настройки.