Скрипичная диаграмма (violin plot)

Скрипичная диаграмма представляет собой расширение ящичной диаграммы (box plot), объединённое с оценкой плотности распределения данных. В контексте визуализации данных в Vega и Vega-Lite она используется для отображения формы распределения числовой переменной в различных категориях, сочетая в себе элементы ядерной оценки плотности (KDE) и симметричного отображения вокруг центральной оси.


Структура скрипичной диаграммы

Основой violin plot является сглаженная функция плотности распределения. Она зеркально отражается относительно вертикальной или горизонтальной оси, образуя характерный «силуэт», напоминающий музыкальный инструмент.

Ключевые компоненты:

  • Ось категорий — дискретные группы данных
  • Ось значений — числовая шкала распределения
  • Плотность распределения — сглаженная оценка вероятности
  • Симметрия — зеркальное отображение плотности
  • Дополнительные элементы — медиана, квартили, точки наблюдений (опционально)

Основные принципы построения в Vega-Lite

В Vega-Lite violin plot обычно реализуется через трансформации данных, включающие оценку плотности и последующее построение симметричной области.

Базовая концепция состоит из двух шагов:

  1. Вычисление KDE (kernel density estimation)
  2. Построение области (area mark) с отражением по оси

Базовая реализация violin plot

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "data": {
    "values": [
      {"group": "A", "value": 10},
      {"group": "A", "value": 12},
      {"group": "A", "value": 14},
      {"group": "B", "value": 20},
      {"group": "B", "value": 22},
      {"group": "B", "value": 25}
    ]
  },
  "transform": [
    {
      "density": "value",
      "groupby": ["group"],
      "extent": [0, 30]
    }
  ],
  "mark": {
    "type": "area"
  },
  "encoding": {
    "x": {
      "field": "value",
      "type": "quantitative"
    },
    "y": {
      "field": "density",
      "type": "quantitative"
    },
    "color": {
      "field": "group",
      "type": "nominal"
    }
  }
}

В этом примере используется трансформация density, которая генерирует значения плотности для каждой группы. Однако такой вариант пока не даёт симметричной формы — он представляет только половину распределения.


Симметричная скрипичная диаграмма

Для получения классического violin plot требуется зеркальное отображение плотности. В Vega-Lite это достигается через дублирование данных и смещение по оси.

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "data": {
    "values": [
      {"group": "A", "value": 10},
      {"group": "A", "value": 12},
      {"group": "A", "value": 14},
      {"group": "A", "value": 16},
      {"group": "B", "value": 20},
      {"group": "B", "value": 22},
      {"group": "B", "value": 24},
      {"group": "B", "value": 26}
    ]
  },
  "transform": [
    {
      "density": "value",
      "groupby": ["group"],
      "extent": [0, 30]
    },
    {
      "calculate": "-datum.density",
      "as": "density_neg"
    }
  ],
  "mark": "area",
  "encoding": {
    "x": {
      "field": "value",
      "type": "quantitative",
      "scale": {"zero": false}
    },
    "y": {
      "field": "density",
      "type": "quantitative"
    },
    "y2": {
      "field": "density_neg"
    },
    "color": {
      "field": "group",
      "type": "nominal"
    }
  }
}

Здесь ключевую роль играет вычисляемое поле density_neg, создающее зеркальную часть распределения.


Использование Vega (низкоуровневая реализация)

Vega предоставляет более гибкий контроль над построением violin plot через явные вычисления и примитивы.

Основные этапы:

  • агрегация данных
  • kernel density estimation через transforms
  • построение path/area mark
  • зеркальное отражение через signal или expression

Пример концептуальной структуры:

{
  "data": [{"name": "table"}],
  "transform": [
    {
      "type": "kde",
      "field": "value",
      "bandwidth": 1.5
    }
  ],
  "marks": [
    {
      "type": "area",
      "from": {"data": "table"},
      "encode": {
        "enter": {
          "x": {"scale": "x", "field": "value"},
          "y": {"scale": "y", "field": "density"},
          "y2": {"scale": "y", "value": 0}
        }
      }
    }
  ]
}

Vega позволяет более точно контролировать форму распределения, но требует ручной настройки симметрии и масштабирования.


Ядерная оценка плотности (KDE) в контексте violin plot

Плотность распределения вычисляется по формуле:

  • каждое наблюдение заменяется «колоколом» (kernel function)
  • все функции суммируются
  • результат нормализуется

Типичные ядра:

  • гауссово ядро
  • эпанечниково ядро
  • треугольное ядро

В Vega/Vega-Lite используется встроенная реализация, скрывающая математическую часть, но параметры bandwidth напрямую влияют на форму:

  • малый bandwidth → шумная, детализированная форма
  • большой bandwidth → сглаженная, обобщённая форма

Комбинирование violin plot с box plot

Часто скрипичная диаграмма дополняется элементами box plot для отображения статистических характеристик:

  • медиана
  • межквартильный размах
  • выбросы

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

Пример наложения слоёв:

{
  "layer": [
    {
      "mark": "area",
      "encoding": {
        "x": {"field": "value", "type": "quantitative"},
        "y": {"field": "density", "type": "quantitative"}
      }
    },
    {
      "mark": "rule",
      "encoding": {
        "x": {"aggregate": "median", "field": "value"},
        "size": {"value": 2}
      }
    }
  ]
}

Категориальные распределения

При работе с несколькими группами violin plot становится инструментом сравнения распределений.

Особенности:

  • каждая категория имеет собственную KDE
  • масштабирование может быть независимым или общим
  • ширина области может кодировать плотность или количество наблюдений

Типичная ошибка — нормализация каждой группы отдельно, что скрывает различия в объёме данных.


Масштабирование и интерпретация ширины

Ширина violin plot может интерпретироваться двумя способами:

  • фиксированная ширина — отражает только форму распределения
  • масштабированная ширина — отражает плотность или количество наблюдений

В Vega-Lite это управляется через:

  • stack
  • normalize
  • дополнительные вычисляемые поля

Настройка внешнего вида

Ключевые параметры визуализации:

  • stroke — контур области
  • fill — цвет распределения
  • opacity — прозрачность
  • interpolate — тип сглаживания (monotone, basis и др.)

Пример стилизации:

{
  "mark": {
    "type": "area",
    "opacity": 0.6,
    "interpolate": "monotone"
  }
}

Ограничения модели violin plot в Vega-Lite

Несмотря на гибкость, существуют ограничения:

  • отсутствие встроенной симметрии в базовой конструкции area
  • ограниченные средства контроля KDE без низкоуровневых трансформаций
  • сложность комбинирования с интерактивными элементами
  • чувствительность к выбору bandwidth

Интерактивность

Vega поддерживает интерактивные элементы, которые могут быть добавлены к violin plot:

  • hover tooltips
  • выделение групп
  • фильтрация диапазонов
  • zoom по оси значений

Пример селекции:

"selection": {
  "grid": {
    "type": "interval",
    "bind": "scales"
  }
}

Практические сценарии применения

Скрипичная диаграмма особенно эффективна в задачах:

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

Отличия от box plot

Характеристика Box plot Violin plot
Медиана Да Да (опционально)
Квартили Да Да (опционально)
Форма распределения Нет Да
Плотность Нет Да
Интерпретация Простая Более детальная

Геометрическая интерпретация

Violin plot можно рассматривать как:

  • функцию плотности вероятности
  • симметричную область вокруг центральной оси
  • геометрическое отображение статистического распределения

Формально:

  • ось X — значения переменной
  • ось Y — оценка плотности
  • площадь под кривой нормирована

Поведение при малом объёме данных

При малом числе наблюдений:

  • KDE становится нестабильной
  • появляются локальные пики
  • форма теряет гладкость

В таких случаях violin plot может вводить в заблуждение, визуально создавая ложную «структуру» распределения.


Масштабируемость и производительность

При больших наборах данных:

  • KDE становится вычислительно затратной
  • Vega-Lite оптимизирует расчёты через агрегацию
  • рекомендуется предварительная обработка данных

Особенно критично при интерактивных дашбордах с десятками тысяч точек.


Связь с вероятностными моделями

Violin plot фактически является визуализацией эмпирической оценки плотности распределения, что связывает его с:

  • статистическим выводом
  • байесовскими моделями распределений
  • анализом неопределённости

Форма диаграммы может интерпретироваться как приближение функции вероятности наблюдаемой переменной.