sample: случайная выборка

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

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


Назначение трансформации sample

Основные задачи случайной выборки:

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

Особенно актуальна случайная выборка для:

  • scatter plot с сотнями тысяч точек;
  • потоковых данных;
  • логов;
  • телеметрии;
  • аналитических панелей реального времени;
  • больших CSV-файлов.

Принцип работы

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

Если количество элементов в данных меньше указанного размера выборки, возвращаются все записи.

Синтаксически трансформация располагается внутри массива transform.


Sample в Vega-Lite

Базовый синтаксис

{
  "transform": [
    {
      "sample": 100
    }
  ]
}

Число 100 означает:

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

Простейший пример

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

[
  {"x": 5, "y": 10},
  {"x": 15, "y": 20},
  {"x": 25, "y": 30}
]

Vega-Lite

{
  "$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"
    }
  }
}

Что делает этот код

Последовательность обработки:

  1. Загружается файл cars.json.
  2. Из всего набора случайно выбираются 50 строк.
  3. На график выводятся только выбранные записи.
  4. Каждое обновление страницы может показывать разные точки.

Влияние sample на производительность

Без sample

При отображении 500 000 точек возникают:

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

С sample

После выборки:

{
  "sample": 5000
}

нагрузка резко снижается:

  • уменьшается объём DOM/SVG/Canvas;
  • ускоряется рендеринг;
  • повышается отзывчивость интерфейса;
  • упрощается визуальный анализ.

Особенности случайной выборки

Нерепродуцируемость

Каждая новая генерация создаёт другую выборку.

Например:

{
  "sample": 100
}

может вернуть:

Запуск 1 → записи 2, 5, 8, 10 ...
Запуск 2 → записи 1, 7, 9, 15 ...

Это означает, что:

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

Когда sample полезен

Исследовательский анализ

При первичном просмотре огромного набора данных:

{
  "sample": 1000
}

визуализация строится быстро и позволяет:

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

Scatter plot

Особенно полезно для диаграмм рассеяния.

Без выборки:

  • точки накладываются;
  • график превращается в сплошную массу.

С выборкой:

  • сохраняется структура распределения;
  • уменьшается переуплотнение.

Потоковые данные

При визуализации потоков:

  • логов;
  • телеметрии;
  • событий;
  • метрик;

sample позволяет отображать только часть событий.


Комбинирование sample с transform

Трансформации выполняются последовательно сверху вниз.


Filter + Sample

Сначала фильтрация, потом выборка

{
  "transform": [
    {
      "filter": "datum.Horsepower > 100"
    },
    {
      "sample": 50
    }
  ]
}

Последовательность:

  1. Отбираются автомобили мощнее 100 HP.
  2. Из них случайно выбираются 50 строк.

Sample + Calculate

{
  "transform": [
    {
      "sample": 100
    },
    {
      "calculate": "datum.Horsepower / datum.Weight_in_lbs",
      "as": "power_ratio"
    }
  ]
}

Сначала уменьшается объём данных, затем вычисляется новое поле.

Это эффективнее, чем вычислять поле для всего набора.


Sample + Aggregate

{
  "transform": [
    {
      "sample": 1000
    },
    {
      "aggregate": [
        {
          "op": "mean",
          "field": "Horsepower",
          "as": "avg_hp"
        }
      ]
    }
  ]
}

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


Ошибки статистической интерпретации

Sample уменьшает точность анализа.

Например:

{
  "sample": 100
}

для набора из миллиона строк может:

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

Репрезентативность выборки

Случайная выборка обычно сохраняет общую структуру данных, но:

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

Проблема редких категорий

Предположим:

Категория Количество
A 990000
B 10000

При:

{
  "sample": 100
}

категория B может:

  • почти исчезнуть;
  • оказаться недостаточно представленной;
  • полностью отсутствовать.

Sample и визуальная плотность

Для scatter plot выборка часто сохраняет форму облака точек.

Например:

{
  "sample": 3000
}

обычно достаточно для:

  • оценки корреляции;
  • анализа кластеров;
  • обнаружения аномалий.

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

Быстрые dashboard

В аналитических панелях sample помогает:

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

Пример интерактивного scatter plot

{
  "$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"
    }
  }
}

Sample в Vega

В Vega используется аналогичная трансформация.

Синтаксис

{
  "type": "sample",
  "size": 100
}

Пример Vega

{
  "$schema": "https://vega.github.io/schema/vega/v5.json",

  "data": [
    {
      "name": "table",

      "url": "data/cars.json",

      "transform": [
        {
          "type": "sample",
          "size": 100
        }
      ]
    }
  ]
}

Отличие Vega от Vega-Lite

Vega-Lite

{
  "sample": 100
}

Использует сокращённый декларативный синтаксис.


Vega

{
  "type": "sample",
  "size": 100
}

Требует явного указания типа трансформации.


Внутренняя логика работы

Алгоритм:

  1. Получает поток данных.
  2. Генерирует случайные индексы.
  3. Формирует подмножество.
  4. Передаёт данные следующим transform.

Sample и поток обработки данных

Трансформация влияет только на последующие этапы pipeline.

Например:

{
  "transform": [
    {
      "sample": 500
    },
    {
      "window": [
        {
          "op": "rank",
          "as": "rank"
        }
      ]
    }
  ]
}

Ранжирование выполняется только для выбранных строк.


Оптимизация больших визуализаций

Практический сценарий

Исходный CSV:

5 000 000 строк

Без выборки:

  • браузер зависает;
  • SVG перегружается;
  • масштабирование тормозит.

С выборкой:

{
  "sample": 10000
}

визуализация становится пригодной для работы.


Когда sample использовать нельзя

Финансовая аналитика

Случайная выборка может скрыть:

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

Медицинские данные

Нельзя терять:

  • редкие диагнозы;
  • исключения;
  • критические случаи.

Точные статистические расчёты

Sample не подходит для:

  • финальных отчётов;
  • точных агрегатов;
  • официальной аналитики.

Размер выборки

Маленькая выборка

{
  "sample": 10
}

Плюсы:

  • максимальная скорость.

Минусы:

  • сильные искажения;
  • потеря структуры.

Средняя выборка

{
  "sample": 1000
}

Баланс между:

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

Большая выборка

{
  "sample": 50000
}

Плюсы:

  • высокая точность.

Минусы:

  • меньший выигрыш по производительности.

Практические рекомендации

Для scatter plot

Рекомендуемые размеры:

Объём данных Sample
100 000 2 000–5 000
1 000 000 5 000–20 000
10 000 000 20 000–100 000

Для dashboard

Обычно достаточно:

{
  "sample": 1000
}

или:

{
  "sample": 5000
}

Влияние на визуальное восприятие

Выборка:

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

Сравнение с filter

Filter

{
  "filter": "datum.value > 10"
}

Удаляет данные по условию.


Sample

{
  "sample": 100
}

Удаляет данные случайным образом.


Сравнение с aggregate

Aggregate

Сводит множество строк к агрегированным значениям.


Sample

Сохраняет оригинальные строки, но уменьшает их количество.


Сравнение с bin

Bin

Группирует значения по интервалам.


Sample

Не изменяет структуру данных.


Полный пример Vega-Lite

{
  "$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"
      }
    ]
  }
}

Ключевые свойства sample

Свойство Vega-Lite Vega
Тип transform transform
Синтаксис "sample": N "type": "sample"
Назначение случайное подмножество случайное подмножество
Изменяет структуру нет нет
Удаляет строки да да
Сохраняет поля да да

Основные преимущества

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

Основные недостатки

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