aggregate: агрегация и группировка

Агрегация в Vega-Lite представляет собой механизм преобразования исходного набора данных в обобщённые значения на основе заданных правил. Вместо отображения каждой отдельной записи система формирует сводные показатели: суммы, средние значения, количества, минимумы и максимумы, а также более сложные статистические функции.

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


Базовая модель агрегирования

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

Основные функции агрегации:

  • count — количество записей
  • sum — сумма значений
  • mean — среднее арифметическое
  • median — медиана
  • min — минимум
  • max — максимум
  • variance — дисперсия
  • stdev — стандартное отклонение

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


Группировка как основа агрегации

Группировка определяет, как именно разбивается исходный набор данных перед вычислением агрегатов. В Vega-Lite это реализуется через параметр groupby.

Группировка формирует категории, внутри которых вычисляются агрегированные значения.

Пример логики:

  • данные о продажах
  • группировка по region
  • вычисление суммы продаж в каждой группе

Агрегация через encoding

Наиболее компактный способ использования агрегирования — через encoding.

Пример:

{
  "data": {
    "values": [
      {"category": "A", "value": 10},
      {"category": "A", "value": 20},
      {"category": "B", "value": 5},
      {"category": "B", "value": 15}
    ]
  },
  "mark": "bar",
  "encoding": {
    "x": {"field": "category", "type": "nominal"},
    "y": {
      "field": "value",
      "type": "quantitative",
      "aggregate": "sum"
    }
  }
}

В этом примере:

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

Явная трансформация aggregate

Более гибкий способ — использование блока transform.

{
  "data": {
    "values": [
      {"city": "A", "sales": 100},
      {"city": "A", "sales": 150},
      {"city": "B", "sales": 80}
    ]
  },
  "transform": [
    {
      "aggregate": [
        {"op": "sum", "field": "sales", "as": "total_sales"}
      ],
      "groupby": ["city"]
    }
  ],
  "mark": "bar",
  "encoding": {
    "x": {"field": "city", "type": "nominal"},
    "y": {"field": "total_sales", "type": "quantitative"}
  }
}

Здесь происходит явное преобразование:

  • исходные записи группируются по city
  • вычисляется сумма sales
  • результат сохраняется в новое поле total_sales

Множественные агрегаты в одной трансформации

Vega-Lite позволяет вычислять сразу несколько агрегированных значений.

{
  "transform": [
    {
      "aggregate": [
        {"op": "sum", "field": "sales", "as": "total"},
        {"op": "mean", "field": "sales", "as": "average"},
        {"op": "max", "field": "sales", "as": "max_value"}
      ],
      "groupby": ["region"]
    }
  ]
}

Каждая группа получает набор вычисленных метрик одновременно.


Использование count для анализа распределений

Агрегация count часто применяется для построения распределений категорий.

{
  "mark": "bar",
  "encoding": {
    "x": {"field": "product", "type": "nominal"},
    "y": {"aggregate": "count", "type": "quantitative"}
  }
}

Особенность count:

  • не требует указания поля field
  • считает количество записей в группе

Комбинирование группировки и временных рядов

При работе с временными данными агрегация часто применяется совместно с датами.

{
  "transform": [
    {
      "timeUnit": "year",
      "field": "date",
      "as": "year"
    },
    {
      "aggregate": [
        {"op": "sum", "field": "value", "as": "total"}
      ],
      "groupby": ["year"]
    }
  ]
}

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


Различие между aggregate в encoding и transform

Агрегация в encoding:

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

Агрегация в transform:

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

Сортировка агрегированных данных

После агрегации часто требуется сортировка результата.

{
  "transform": [
    {
      "aggregate": [
        {"op": "sum", "field": "sales", "as": "total"}
      ],
      "groupby": ["category"]
    },
    {
      "sort": [
        {"field": "total", "order": "descending"}
      ]
    }
  ]
}

Сортировка применяется уже к агрегированному набору.


Многоуровневая агрегация

В Vega-Lite можно строить каскадные преобразования:

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

Пример сценария:

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

Агрегация и визуальные каналы

Агрегированные значения напрямую используются в каналах:

  • x — категории групп
  • y — агрегированные метрики
  • color — группировка по дополнительному признаку
  • size — агрегированные величины (например, count)

Пример:

{
  "mark": "point",
  "encoding": {
    "x": {"field": "category", "type": "nominal"},
    "y": {"aggregate": "mean", "field": "value"},
    "size": {"aggregate": "count"}
  }
}

Сочетание агрегации с фильтрацией

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

{
  "transform": [
    {
      "filter": "datum.value > 0"
    },
    {
      "aggregate": [
        {"op": "mean", "field": "value", "as": "avg"}
      ],
      "groupby": ["type"]
    }
  ]
}

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


Вложенные агрегации и композиция трансформаций

Vega-Lite поддерживает последовательные transform, где каждый шаг опирается на результат предыдущего:

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

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


Практические сценарии использования

Агрегация используется в типовых аналитических задачах:

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

В каждом случае агрегирование снижает уровень детализации и переводит данные в аналитическую форму.


Ограничения модели агрегирования

При работе с агрегацией в Vega-Lite важно учитывать:

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

Эти ограничения компенсируются предсказуемостью и декларативностью подхода.