Трансформация 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 |
Поле зависимой переменной |
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"
}
]
}
Типичные сценарии:
Используется при экспоненциальном росте или распаде.
Формула:
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
{
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 определяет степень полинома.
| Значение | Тип |
|---|---|
| 1 | Линейная |
| 2 | Квадратичная |
| 3 | Кубическая |
| 4+ | Более сложные кривые |
Слишком высокая степень полинома приводит к переобучению.
Признаки:
Например:
{
method: "poly",
order: 10
}
Такая модель может быть статистически бессмысленной при небольшом количестве точек.
По умолчанию регрессия строится по всему диапазону данных.
Параметр extent ограничивает область вычислений:
{
regression: "y",
on: "x",
extent: [0, 100]
}
Параметр params: true возвращает параметры регрессии
вместо линии.
Пример:
{
transform: [
{
regression: "y",
on: "x",
params: true
}
]
}
Результат содержит:
В чистом Vega можно использовать результаты регрессии для динамических вычислений и кастомной логики.
Пример структуры результата:
[
{
coef: [1.02, 0.95],
rSquared: 0.98
}
]
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"}
}
}
]
};
Регрессионные данные можно дополнительно обрабатывать.
Пример:
{
transform: [
{
regression: "y",
on: "x"
},
{
calculate: "datum.y * 1.1",
as: "adjusted"
}
]
}
Регрессия может пересчитываться динамически через параметры и фильтры.
{
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-Lite:
В Vega:
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"
для явно нелинейных данных.
{
method: "poly",
order: 12
}
Почти всегда приводит к переобучению.
Полиномиальная регрессия требует достаточного числа точек.
Плохой пример:
[
{x: 1, y: 2},
{x: 2, y: 5},
{x: 3, y: 9}
]
для полинома 5-й степени.
Экспоненциальные и степенные модели чувствительны к:
| Ситуация | Метод |
|---|---|
| Простая зависимость | linear |
| Ускоряющийся рост | exp |
| Замедляющийся рост | log |
| Параболическая форма | quad |
| Сложная кривая | poly |
| Масштабирование | pow |
Подход Vega-Lite позволяет: