Трансформация kde

Трансформация kde (Kernel Density Estimation) предназначена для построения оценки плотности распределения непрерывных данных. Она позволяет превратить набор отдельных числовых значений в сглаженную кривую распределения, отражающую концентрацию данных по диапазону значений.

Визуально результат напоминает сглаженную гистограмму, но в отличие от неё:

  • не использует жёсткие интервалы (bins);
  • создаёт непрерывную функцию плотности;
  • лучше показывает форму распределения;
  • удобна для анализа нескольких распределений одновременно.

В Vega-Lite kde особенно полезна при анализе:

  • распределения возрастов;
  • доходов;
  • времени отклика;
  • температуры;
  • результатов измерений;
  • вероятностных моделей.

Принцип работы KDE

Kernel Density Estimation вычисляет плотность вероятности по формуле сглаживания:

(x)=_{i=1}^{n}K()

Где:

  • (x_i) — точки исходных данных;
    1. — функция ядра;
    1. — ширина окна сглаживания (bandwidth);
    1. — количество наблюдений.

На практике 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}

Трансформация генерирует:

  • координаты по оси X;
  • вычисленные значения плотности.

Именно поэтому поле 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"
    }
  }
}

KDE с прозрачностью

При сравнении распределений удобно использовать прозрачность.

{
  "mark": {
    "type": "area",
    "opacity": 0.4
  }
}

Это позволяет видеть перекрытия распределений.


Нормализация распределения

Параметр counts меняет интерпретацию плотности.

Стандартное поведение

{
  "density": "value"
}

Площадь под кривой равна 1.


Режим counts: true

{
  "density": "value",
  "counts": true
}

Теперь KDE показывает:

  • приблизительное число элементов;
  • а не вероятность.

Такой режим полезен при сравнении реальных объёмов выборок.


Совмещение 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"
        }
      }
    }
  ]
}

KDE в Vega

В низкоуровневой Vega используется transform типа kde.

Пример

{
  "type": "kde",
  "field": "value"
}

Отличие Vega от Vega-Lite

Vega-Lite

Использует:

{
  "density": "value"
}

Vega

Использует:

{
  "type": "kde",
  "field": "value"
}

Vega предоставляет более низкоуровневый контроль:

  • над источниками данных;
  • потоками трансформаций;
  • сигналами;
  • интерактивностью.

KDE и выбросы

Оценка плотности чувствительна к экстремальным значениям.

Пример проблемы:

10, 11, 12, 13, 200

Выброс:

  • растягивает диапазон;
  • искажает форму;
  • уменьшает детализацию основной массы данных.

Способы борьбы с выбросами

Ограничение диапазона

{
  "extent": [0, 50]
}

Предварительная фильтрация

{
  "filter": "datum.value < 50"
}

Увеличение bandwidth

Сильное сглаживание уменьшает влияние одиночных экстремумов.


KDE и мультимодальные распределения

KDE особенно полезна при анализе нескольких пиков распределения.

Например:

10, 11, 12
50, 51, 52

Гистограмма может скрыть наличие двух групп, а KDE покажет:

  • два выраженных пика;
  • структуру распределения;
  • наличие кластеров.

KDE против гистограммы

KDE Гистограмма
Непрерывная Дискретная
Сглаженная Интервальная
Зависит от bandwidth Зависит от bin size
Лучше показывает форму Лучше показывает частоты
Подходит для сравнений Подходит для точных подсчётов

Производительность

KDE вычислительно дороже:

  • histogram;
  • binning;
  • aggregate.

Причины:

  • вычисление ядра для множества точек;
  • интерполяция;
  • сглаживание.

Оптимизация

Уменьшение steps

"steps": 50

Ограничение диапазона

"extent": [0, 100]

Предварительная агрегация

Полезна при очень больших наборах данных.


Типичные ошибки

Использование категориальных данных

Неверно:

{
  "density": "country"
}

KDE работает только с непрерывными числовыми значениями.


Слишком маленький bandwidth

Результат:

  • шум;
  • ложные пики;
  • нестабильная форма.

Слишком большой bandwidth

Результат:

  • потеря структуры;
  • исчезновение локальных максимумов;
  • чрезмерное сглаживание.

Несогласованные диапазоны

При сравнении нескольких KDE обязательно фиксировать extent.

Иначе:

  • распределения могут иметь разные масштабы;
  • сравнение станет некорректным.

Практический пример анализа времени ответа API

{
  "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"
    }
  }
}

Когда использовать KDE

Трансформация особенно эффективна:

  • при исследовательском анализе данных;
  • при сравнении распределений;
  • при поиске кластеров;
  • при анализе вероятностных моделей;
  • при выявлении асимметрии;
  • при поиске мультимодальности;
  • при анализе шумных данных.

Когда KDE подходит плохо

Менее эффективна:

  • для маленьких выборок;
  • для категориальных данных;
  • для точных количественных сравнений;
  • для отображения дискретных событий;
  • при необходимости строгих статистических интерпретаций без настройки параметров.

Ключевые параметры density

Параметр Назначение
density Поле исходных данных
bandwidth Степень сглаживания
steps Количество вычисляемых точек
extent Диапазон вычислений
groupby Разделение распределений
counts Использование абсолютных значений
as Имена выходных полей