Трансформация kde (Kernel Density Estimation)
предназначена для построения оценки плотности распределения непрерывных
данных. Она позволяет превратить набор отдельных числовых значений в
сглаженную кривую распределения, отражающую концентрацию данных по
диапазону значений.
Визуально результат напоминает сглаженную гистограмму, но в отличие от неё:
bins);В Vega-Lite kde особенно полезна при анализе:
Kernel Density Estimation вычисляет плотность вероятности по формуле сглаживания:
(x)=_{i=1}^{n}K()
Где:
bandwidth);На практике Vega использует гауссово ядро, а пользователь управляет главным образом:
kdeВ Vega-Lite трансформация добавляется через массив
transform.
{
"data": {
"values": [
{"value": 10},
{"value": 12},
{"value": 15},
{"value": 16},
{"value": 17},
{"value": 20},
{"value": 22},
{"value": 25}
]
},
"transform": [
{
"density": "value"
}
],
"mark": "line",
"encoding": {
"x": {
"field": "value",
"type": "quantitative"
},
"y": {
"field": "density",
"type": "quantitative"
}
}
}
После выполнения density формируется новый поток
данных.
Исходные записи:
{"value": 10}
{"value": 12}
{"value": 15}
Преобразуются в:
{"value": 0, "density": 0.001}
{"value": 1, "density": 0.003}
{"value": 2, "density": 0.008}
Трансформация генерирует:
Именно поэтому поле density появляется
автоматически.
Для запуска KDE достаточно указать:
{
"density": "field_name"
}
Где:
density — поле с непрерывными числовыми
значениями.Параметр steps определяет число вычисляемых точек
функции.
{
"transform": [
{
"density": "value",
"steps": 200
}
]
}
stepsМалое значение:
"steps": 20
даёт:
Большое значение:
"steps": 500
даёт:
По умолчанию Vega автоматически определяет диапазон значений.
Для ручного контроля используется extent.
{
"transform": [
{
"density": "value",
"extent": [0, 100]
}
]
}
extentЯвное указание диапазона особенно важно:
Без фиксированного диапазона разные KDE могут иметь несовместимые масштабы.
bandwidthПараметр bandwidth — один из важнейших в KDE.
Он задаёт ширину ядра сглаживания.
{
"transform": [
{
"density": "value",
"bandwidth": 5
}
]
}
bandwidth"bandwidth": 1
Особенности:
bandwidth"bandwidth": 20
Особенности:
bandwidth{
"density": "value",
"bandwidth": 2
}
Результат:
{
"density": "value",
"bandwidth": 15
}
Результат:
Одно из главных преимуществ KDE — возможность строить несколько распределений одновременно.
Для этого используется groupby.
{
"transform": [
{
"density": "salary",
"groupby": ["department"]
}
]
}
{
"data": {
"values": [
{"salary": 50, "department": "IT"},
{"salary": 55, "department": "IT"},
{"salary": 60, "department": "IT"},
{"salary": 30, "department": "HR"},
{"salary": 35, "department": "HR"},
{"salary": 40, "department": "HR"}
]
},
"transform": [
{
"density": "salary",
"groupby": ["department"]
}
],
"mark": "line",
"encoding": {
"x": {
"field": "value",
"type": "quantitative"
},
"y": {
"field": "density",
"type": "quantitative"
},
"color": {
"field": "department",
"type": "nominal"
}
}
}
valueПосле KDE Vega-Lite создаёт два специальных поля:
| Поле | Назначение |
|---|---|
value |
координата X |
density |
значение плотности |
Это стандартные имена результата трансформации.
Через as можно назначить собственные имена.
{
"transform": [
{
"density": "salary",
"as": ["salary_value", "salary_density"]
}
]
}
Теперь используются:
"x": {"field": "salary_value"}
"y": {"field": "salary_density"}
KDE часто отображается через area.
{
"mark": "area"
}
Полная спецификация:
{
"transform": [
{
"density": "value"
}
],
"mark": "area",
"encoding": {
"x": {
"field": "value",
"type": "quantitative"
},
"y": {
"field": "density",
"type": "quantitative"
}
}
}
При сравнении распределений удобно использовать прозрачность.
{
"mark": {
"type": "area",
"opacity": 0.4
}
}
Это позволяет видеть перекрытия распределений.
Параметр counts меняет интерпретацию плотности.
{
"density": "value"
}
Площадь под кривой равна 1.
counts: true{
"density": "value",
"counts": true
}
Теперь KDE показывает:
Такой режим полезен при сравнении реальных объёмов выборок.
Очень распространённая техника визуализации.
layer){
"layer": [
{
"mark": "bar",
"encoding": {
"x": {
"bin": true,
"field": "value",
"type": "quantitative"
},
"y": {
"aggregate": "count",
"type": "quantitative"
}
}
},
{
"transform": [
{
"density": "value"
}
],
"mark": {
"type": "line",
"color": "red"
},
"encoding": {
"x": {
"field": "value",
"type": "quantitative"
},
"y": {
"field": "density",
"type": "quantitative"
}
}
}
]
}
В низкоуровневой Vega используется transform типа
kde.
{
"type": "kde",
"field": "value"
}
Использует:
{
"density": "value"
}
Использует:
{
"type": "kde",
"field": "value"
}
Vega предоставляет более низкоуровневый контроль:
Оценка плотности чувствительна к экстремальным значениям.
Пример проблемы:
10, 11, 12, 13, 200
Выброс:
{
"extent": [0, 50]
}
{
"filter": "datum.value < 50"
}
bandwidthСильное сглаживание уменьшает влияние одиночных экстремумов.
KDE особенно полезна при анализе нескольких пиков распределения.
Например:
10, 11, 12
50, 51, 52
Гистограмма может скрыть наличие двух групп, а KDE покажет:
| KDE | Гистограмма |
|---|---|
| Непрерывная | Дискретная |
| Сглаженная | Интервальная |
Зависит от bandwidth |
Зависит от bin size |
| Лучше показывает форму | Лучше показывает частоты |
| Подходит для сравнений | Подходит для точных подсчётов |
KDE вычислительно дороже:
Причины:
steps"steps": 50
"extent": [0, 100]
Полезна при очень больших наборах данных.
Неверно:
{
"density": "country"
}
KDE работает только с непрерывными числовыми значениями.
bandwidthРезультат:
bandwidthРезультат:
При сравнении нескольких KDE обязательно фиксировать
extent.
Иначе:
{
"data": {
"url": "response_times.json"
},
"transform": [
{
"density": "latency",
"groupby": ["service"],
"extent": [0, 500],
"steps": 200,
"bandwidth": 10
}
],
"mark": {
"type": "line"
},
"encoding": {
"x": {
"field": "value",
"type": "quantitative",
"title": "Время ответа"
},
"y": {
"field": "density",
"type": "quantitative",
"title": "Плотность"
},
"color": {
"field": "service",
"type": "nominal"
}
}
}
Трансформация особенно эффективна:
Менее эффективна:
density| Параметр | Назначение |
|---|---|
density |
Поле исходных данных |
bandwidth |
Степень сглаживания |
steps |
Количество вычисляемых точек |
extent |
Диапазон вычислений |
groupby |
Разделение распределений |
counts |
Использование абсолютных значений |
as |
Имена выходных полей |