regression: линейная и нелинейная регрессия

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

Регрессия применяется для:

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

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


Базовый принцип работы

Регрессия вычисляет зависимость:

[ y = f(x)]

где:

  • x — независимая переменная;
  • y — зависимая переменная.

На вход подаются обычные данные точечной диаграммы, а Vega-Lite автоматически вычисляет новую серию точек, представляющих линию регрессии.


Простейшая линейная регрессия

Исходные данные:

const data = [
  {x: 1, y: 1.2},
  {x: 2, y: 2.1},
  {x: 3, y: 2.9},
  {x: 4, y: 4.2},
  {x: 5, y: 5.1}
];

Построение scatter plot с линией регрессии:

const spec = {
  data: {
    values: data
  },

  layer: [
    {
      mark: "point",

      encoding: {
        x: {field: "x", type: "quantitative"},
        y: {field: "y", type: "quantitative"}
      }
    },

    {
      transform: [
        {
          regression: "y",
          on: "x"
        }
      ],

      mark: {
        type: "line",
        color: "red"
      },

      encoding: {
        x: {field: "x", type: "quantitative"},
        y: {field: "y", type: "quantitative"}
      }
    }
  ]
};

Как работает regression

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

Параметр Назначение
regression Поле зависимой переменной
on Поле независимой переменной
method Тип регрессии
order Степень полинома
extent Диапазон X
groupby Группировка
params Возврат коэффициентов

Линейная регрессия

Линейная модель описывается уравнением:

genui{“math_block_widget_always_prefetch_v2”:{“content”:“y=ax+b”}}

где:

  • a — коэффициент наклона;
  • b — смещение.

Линейная регрессия используется чаще всего, поскольку:

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

Явное указание метода

По умолчанию Vega-Lite использует линейную регрессию, однако метод можно указать явно.

{
  transform: [
    {
      regression: "y",
      on: "x",
      method: "linear"
    }
  ]
}

Нелинейная регрессия

Vega-Lite поддерживает несколько типов моделей:

Метод Описание
linear Линейная
log Логарифмическая
exp Экспоненциальная
pow Степенная
quad Квадратичная
poly Полиномиальная

Логарифмическая регрессия

Используется для процессов, быстро растущих в начале и замедляющихся далее.

Математическая форма:

genui{“math_block_widget_always_prefetch_v2”:{“content”:“y=a+b(x)”}}

Пример:

{
  transform: [
    {
      regression: "y",
      on: "x",
      method: "log"
    }
  ]
}

Типичные сценарии:

  • насыщение аудитории;
  • замедление роста;
  • diminishing returns;
  • обучение моделей.

Экспоненциальная регрессия

Используется при экспоненциальном росте или распаде.

Формула:

genui{“math_block_widget_always_prefetch_v2”:{“content”:“y=ae^{bx}”}}

Пример:

{
  transform: [
    {
      regression: "y",
      on: "x",
      method: "exp"
    }
  ]
}

Подходит для:

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

Степенная регрессия

Модель вида:

genui{“math_block_widget_always_prefetch_v2”:{“content”:“y=ax^b”}}

Пример:

{
  transform: [
    {
      regression: "y",
      on: "x",
      method: "pow"
    }
  ]
}

Используется:

  • в физике;
  • инженерных расчётах;
  • биомеханике;
  • анализе масштабирования.

Квадратичная регрессия

Квадратичная модель:

genui{“math_block_widget_always_prefetch_v2”:{“content”:“y=ax^2+bx+c”}}

Пример:

{
  transform: [
    {
      regression: "y",
      on: "x",
      method: "quad"
    }
  ]
}

Подходит для:

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

Полиномиальная регрессия

Полиномиальная модель позволяет задавать произвольную степень полинома.

Общий вид:

y=a_0+a_1x+a_2x2++a_nxn


Использование method: poly

{
  transform: [
    {
      regression: "y",
      on: "x",
      method: "poly",
      order: 3
    }
  ]
}

Здесь:

  • order: 3 означает кубическую регрессию;
  • модель будет учитывать изгибы кривой.

Полный пример полиномиальной регрессии

const spec = {
  data: {
    values: [
      {x: 0, y: 1},
      {x: 1, y: 2},
      {x: 2, y: 5},
      {x: 3, y: 10},
      {x: 4, y: 17},
      {x: 5, y: 26}
    ]
  },

  layer: [
    {
      mark: "point",

      encoding: {
        x: {
          field: "x",
          type: "quantitative"
        },

        y: {
          field: "y",
          type: "quantitative"
        }
      }
    },

    {
      transform: [
        {
          regression: "y",
          on: "x",
          method: "poly",
          order: 2
        }
      ],

      mark: {
        type: "line",
        color: "green",
        strokeWidth: 3
      },

      encoding: {
        x: {
          field: "x",
          type: "quantitative"
        },

        y: {
          field: "y",
          type: "quantitative"
        }
      }
    }
  ]
};

Параметр order

order определяет степень полинома.

Значение Тип
1 Линейная
2 Квадратичная
3 Кубическая
4+ Более сложные кривые

Опасность переобучения

Слишком высокая степень полинома приводит к переобучению.

Признаки:

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

Например:

{
  method: "poly",
  order: 10
}

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


Управление диапазоном через extent

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

Параметр extent ограничивает область вычислений:

{
  regression: "y",
  on: "x",
  extent: [0, 100]
}

Возврат коэффициентов модели

Параметр params: true возвращает параметры регрессии вместо линии.

Пример:

{
  transform: [
    {
      regression: "y",
      on: "x",
      params: true
    }
  ]
}

Результат содержит:

  • коэффициенты;
  • R²;
  • степень полинома;
  • информацию о модели.

Использование params с Vega

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

Пример структуры результата:

[
  {
    coef: [1.02, 0.95],
    rSquared: 0.98
  }
]

Коэффициент детерминации R²

R² показывает качество аппроксимации.

Диапазон:

Значение Интерпретация
1.0 Идеальное совпадение
0.8+ Хорошая модель
0.5 Средняя
< 0.3 Слабая зависимость

Групповая регрессия

groupby строит отдельные регрессии для разных категорий.

Исходные данные:

[
  {x: 1, y: 2, category: "A"},
  {x: 2, y: 3, category: "A"},
  {x: 1, y: 5, category: "B"},
  {x: 2, y: 8, category: "B"}
]

Спецификация:

{
  transform: [
    {
      regression: "y",
      on: "x",
      groupby: ["category"]
    }
  ]
}

Визуализация нескольких регрессий

const spec = {
  data: {
    values: data
  },

  layer: [
    {
      mark: "point",

      encoding: {
        x: {field: "x", type: "quantitative"},
        y: {field: "y", type: "quantitative"},
        color: {field: "category", type: "nominal"}
      }
    },

    {
      transform: [
        {
          regression: "y",
          on: "x",
          groupby: ["category"]
        }
      ],

      mark: "line",

      encoding: {
        x: {field: "x", type: "quantitative"},
        y: {field: "y", type: "quantitative"},
        color: {field: "category", type: "nominal"}
      }
    }
  ]
};

Комбинирование regression и calculate

Регрессионные данные можно дополнительно обрабатывать.

Пример:

{
  transform: [
    {
      regression: "y",
      on: "x"
    },

    {
      calculate: "datum.y * 1.1",
      as: "adjusted"
    }
  ]
}

Использование regression с интерактивностью

Регрессия может пересчитываться динамически через параметры и фильтры.

{
  params: [
    {
      name: "threshold",
      value: 10,
      bind: {
        input: "range",
        min: 0,
        max: 100
      }
    }
  ],

  transform: [
    {
      filter: "datum.x > threshold"
    },

    {
      regression: "y",
      on: "x"
    }
  ]
}

Стилизация линии регрессии

Часто линию тренда выделяют визуально.

Пример:

mark: {
  type: "line",
  color: "#ff0000",
  strokeDash: [6, 4],
  strokeWidth: 3,
  opacity: 0.8
}

Отображение доверительных интервалов

В Vega-Lite встроенной поддержки confidence interval для regression нет, однако её можно реализовать:

  • через предварительную обработку;
  • через Vega transforms;
  • через дополнительные вычисления;
  • через layering.

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

Линейная регрессия вычисляется быстро даже на больших объёмах данных.

Однако:

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

Особенности regression в Vega-Lite

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

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

Отличия Vega и Vega-Lite

В Vega-Lite:

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

В Vega:

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

Практический пример: анализ продаж

const sales = [
  {month: 1, sales: 120},
  {month: 2, sales: 135},
  {month: 3, sales: 160},
  {month: 4, sales: 180},
  {month: 5, sales: 210},
  {month: 6, sales: 260}
];

Линейный тренд:

{
  transform: [
    {
      regression: "sales",
      on: "month"
    }
  ]
}

Полиномиальный тренд:

{
  transform: [
    {
      regression: "sales",
      on: "month",
      method: "poly",
      order: 2
    }
  ]
}

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

const users = [
  {day: 1, users: 10},
  {day: 2, users: 15},
  {day: 3, users: 22},
  {day: 4, users: 35},
  {day: 5, users: 55}
];

Экспоненциальная модель:

{
  transform: [
    {
      regression: "users",
      on: "day",
      method: "exp"
    }
  ]
}

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

Неподходящий метод регрессии

Например:

method: "linear"

для явно нелинейных данных.


Слишком высокий order

{
  method: "poly",
  order: 12
}

Почти всегда приводит к переобучению.


Нехватка данных

Полиномиальная регрессия требует достаточного числа точек.

Плохой пример:

[
  {x: 1, y: 2},
  {x: 2, y: 5},
  {x: 3, y: 9}
]

для полинома 5-й степени.


Неверный масштаб данных

Экспоненциальные и степенные модели чувствительны к:

  • нулям;
  • отрицательным значениям;
  • огромному разбросу.

Рекомендации по выбору модели

Ситуация Метод
Простая зависимость linear
Ускоряющийся рост exp
Замедляющийся рост log
Параболическая форма quad
Сложная кривая poly
Масштабирование pow

Архитектурные преимущества declarative regression

Подход Vega-Lite позволяет:

  • описывать аналитику декларативно;
  • хранить вычисления внутри спецификации;
  • избегать ручного расчёта коэффициентов;
  • синхронизировать визуализацию и обработку данных;
  • уменьшать объём imperative JavaScript-кода.