Случайная выборка (sample) используется для уменьшения
объёма данных перед визуализацией. Трансформация особенно полезна при
работе с большими наборами данных, когда отображение всех записей
приводит к снижению производительности, перегрузке графика или
затрудняет визуальный анализ.
В Vega-Lite трансформация sample выбирает случайное
подмножество строк из входного потока данных. В Vega аналогичная логика
реализуется через трансформацию sample.
Основные задачи случайной выборки:
Особенно актуальна случайная выборка для:
Трансформация случайным образом выбирает фиксированное количество строк из исходного набора данных.
Если количество элементов в данных меньше указанного размера выборки, возвращаются все записи.
Синтаксически трансформация располагается внутри массива
transform.
{
"transform": [
{
"sample": 100
}
]
}
Число 100 означает:
[
{"x": 5, "y": 10},
{"x": 15, "y": 20},
{"x": 25, "y": 30}
]
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"data": {
"url": "data/cars.json"
},
"transform": [
{
"sample": 50
}
],
"mark": "point",
"encoding": {
"x": {
"field": "Horsepower",
"type": "quantitative"
},
"y": {
"field": "Miles_per_Gallon",
"type": "quantitative"
}
}
}
Последовательность обработки:
cars.json.При отображении 500 000 точек возникают:
После выборки:
{
"sample": 5000
}
нагрузка резко снижается:
Каждая новая генерация создаёт другую выборку.
Например:
{
"sample": 100
}
может вернуть:
Запуск 1 → записи 2, 5, 8, 10 ...
Запуск 2 → записи 1, 7, 9, 15 ...
Это означает, что:
При первичном просмотре огромного набора данных:
{
"sample": 1000
}
визуализация строится быстро и позволяет:
Особенно полезно для диаграмм рассеяния.
Без выборки:
С выборкой:
При визуализации потоков:
sample позволяет отображать только часть событий.
Трансформации выполняются последовательно сверху вниз.
{
"transform": [
{
"filter": "datum.Horsepower > 100"
},
{
"sample": 50
}
]
}
Последовательность:
{
"transform": [
{
"sample": 100
},
{
"calculate": "datum.Horsepower / datum.Weight_in_lbs",
"as": "power_ratio"
}
]
}
Сначала уменьшается объём данных, затем вычисляется новое поле.
Это эффективнее, чем вычислять поле для всего набора.
{
"transform": [
{
"sample": 1000
},
{
"aggregate": [
{
"op": "mean",
"field": "Horsepower",
"as": "avg_hp"
}
]
}
]
}
Среднее значение вычисляется только по случайной выборке.
Sample уменьшает точность анализа.
Например:
{
"sample": 100
}
для набора из миллиона строк может:
Случайная выборка обычно сохраняет общую структуру данных, но:
Предположим:
| Категория | Количество |
|---|---|
| A | 990000 |
| B | 10000 |
При:
{
"sample": 100
}
категория B может:
Для scatter plot выборка часто сохраняет форму облака точек.
Например:
{
"sample": 3000
}
обычно достаточно для:
В аналитических панелях sample помогает:
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"data": {
"url": "data/cars.json"
},
"transform": [
{
"sample": 150
}
],
"mark": {
"type": "point",
"tooltip": true
},
"encoding": {
"x": {
"field": "Horsepower",
"type": "quantitative"
},
"y": {
"field": "Acceleration",
"type": "quantitative"
},
"color": {
"field": "Origin",
"type": "nominal"
}
}
}
В Vega используется аналогичная трансформация.
{
"type": "sample",
"size": 100
}
{
"$schema": "https://vega.github.io/schema/vega/v5.json",
"data": [
{
"name": "table",
"url": "data/cars.json",
"transform": [
{
"type": "sample",
"size": 100
}
]
}
]
}
{
"sample": 100
}
Использует сокращённый декларативный синтаксис.
{
"type": "sample",
"size": 100
}
Требует явного указания типа трансформации.
Алгоритм:
Трансформация влияет только на последующие этапы pipeline.
Например:
{
"transform": [
{
"sample": 500
},
{
"window": [
{
"op": "rank",
"as": "rank"
}
]
}
]
}
Ранжирование выполняется только для выбранных строк.
Исходный CSV:
5 000 000 строк
Без выборки:
С выборкой:
{
"sample": 10000
}
визуализация становится пригодной для работы.
Случайная выборка может скрыть:
Нельзя терять:
Sample не подходит для:
{
"sample": 10
}
Плюсы:
Минусы:
{
"sample": 1000
}
Баланс между:
{
"sample": 50000
}
Плюсы:
Минусы:
Рекомендуемые размеры:
| Объём данных | Sample |
|---|---|
| 100 000 | 2 000–5 000 |
| 1 000 000 | 5 000–20 000 |
| 10 000 000 | 20 000–100 000 |
Обычно достаточно:
{
"sample": 1000
}
или:
{
"sample": 5000
}
Выборка:
{
"filter": "datum.value > 10"
}
Удаляет данные по условию.
{
"sample": 100
}
Удаляет данные случайным образом.
Сводит множество строк к агрегированным значениям.
Сохраняет оригинальные строки, но уменьшает их количество.
Группирует значения по интервалам.
Не изменяет структуру данных.
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"width": 700,
"height": 400,
"data": {
"url": "data/cars.json"
},
"transform": [
{
"filter": "datum.Horsepower != null"
},
{
"sample": 200
},
{
"calculate": "datum.Horsepower / datum.Weight_in_lbs",
"as": "power_ratio"
}
],
"mark": {
"type": "circle",
"opacity": 0.7,
"size": 80
},
"encoding": {
"x": {
"field": "Horsepower",
"type": "quantitative"
},
"y": {
"field": "Miles_per_Gallon",
"type": "quantitative"
},
"color": {
"field": "Origin",
"type": "nominal"
},
"tooltip": [
{
"field": "Name"
},
{
"field": "Horsepower"
},
{
"field": "Miles_per_Gallon"
},
{
"field": "power_ratio"
}
]
}
}
| Свойство | Vega-Lite | Vega |
|---|---|---|
| Тип | transform | transform |
| Синтаксис | "sample": N |
"type": "sample" |
| Назначение | случайное подмножество | случайное подмножество |
| Изменяет структуру | нет | нет |
| Удаляет строки | да | да |
| Сохраняет поля | да | да |