Параллельные координаты и временные ряды

Параллельные координаты показывают десяток измерений на плоскости, а временные ряды требуют своих приёмов.

Параллельные координаты — способ показать много переменных сразу: каждая переменная — своя вертикальная ось, а объект — ломаная линия, пересекающая все оси на своих значениях. Временной ряд — данные, упорядоченные по времени, со своими задачами визуализации: тренд, сезонность, выбросы.

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

На scatter влезает 2 переменные, на фасетки — 3–4. А если их 7? Параллельные координаты ставят оси рядом, параллельно, и каждый объект становится ломаной. Похожие объекты дают похожие ломаные (пучки), кластеры видны как жгуты, а пересечения линий между двумя осями указывают на отрицательную корреляцию этих переменных.

  V1    V2    V3    V4
  |     |     |     |
 8+  ___+_____+__   +     объект X: 8,2,7,5
  | /   |\    |  \ /|
 5+/    | \  _+_  X +     объект Y: 3,6,4,7
  |     |  \/ |  / \|
 2+_____+__/\_+_/   +
  |     |     |     |
 пересечение V1-V2 = антикорреляция

Нормировка осей обязательна

Переменные имеют разный масштаб (рост в см, вес в кг, доход в рублях). Чтобы ломаные были осмысленны, каждую ось нормируют в общий диапазон $[0, 1]$ — иначе ось с большими числами «придавит» остальные. Посчитаем нормировку для многомерного объекта.

cols = {
    "рост":  [150, 160, 170, 180, 190],
    "вес":   [50, 60, 70, 80, 95],
    "доход": [30, 45, 50, 80, 200],
}
def norm(col):
    lo, hi = min(col), max(col)
    return [round((v-lo)/(hi-lo), 2) for v in col]

obj_idx = 3   # четвёртый объект
print("объект:", {k: v[obj_idx] for k, v in cols.items()})
print("его координаты на параллельных осях (0..1):")
for k, col in cols.items():
    print(f"  {k:6s}: {norm(col)[obj_idx]}")

Вывод:

объект: {'рост': 180, 'вес': 80, 'доход': 80}
его координаты на параллельных осях (0..1):
  рост  : 0.75
  вес   : 0.67
  доход : 0.29

После нормировки видно: по росту и весу объект высоко (0,75), а по доходу — низко (0,29). Без нормировки доход (числа до 200) визуально подавил бы рост (числа около 180 в других единицах).

Временные ряды: что показывать

Время почти всегда кладут на ось X (слева направо — это сильное соглашение, нарушать нельзя). Точки соединяют линией: связность подчёркивает непрерывность процесса. Главные задачи — показать тренд (общее направление), сезонность (периодические колебания) и выбросы/события. Полезные приёмы: сглаживание скользящим средним для тренда, выравнивание циклов друг под другом для сезонности, аннотации ключевых событий прямо на линии.

Ловушки временных рядов

Неравномерные интервалы между точками рисуют как равномерные — искажается скорость изменения; нужно ставить точки по реальному времени. Логарифмическая ось Y уместна, если ряд растёт мультипликативно (тогда постоянный темп роста — прямая). И помните про обрезанную ось Y (следующий раздел) — на временных рядах ею злоупотребляют чаще всего.

Как работает под капотом

Параллельные координаты — это проекция многомерного пространства, где каждая ось ортогональна остальным, но нарисована параллельно. Информация о корреляции переходит в характер пересечений: коррелирующие переменные дают параллельные «гладкие» переходы, антикоррелирующие — пучок пересечений (X-образный узор). Временной ряд же эксплуатирует связность по гештальту: линия превращает дискретные замеры в воспринимаемый непрерывный процесс.

Кластеры и порядок осей

На параллельных координатах важная деталь — порядок осей. Соседние оси сравниваются напрямую через наклон соединяющих отрезков, а несоседние — нет. Поэтому переменные, чью связь вы хотите показать, ставьте рядом. Перестановка осей может проявить структуру, незаметную при исходном порядке: коррелирующие признаки рядом дают гладкий пучок параллельных линий, антикоррелирующие — характерный жгут пересечений. Интерактивные инструменты позволяют перетаскивать оси и подсвечивать подмножества линий (brushing), что превращает параллельные координаты в мощный инструмент разведки многомерных данных.

Для временных рядов отдельная большая тема — сезонность. Чтобы её увидеть, ряд раскладывают на компоненты: тренд (медленное направление), сезонную составляющую (повторяющийся цикл) и остаток. Визуально сезонность хорошо показывает приём наложения циклов: например, нарисовать каждый год отдельной линией поверх общей оси «месяц» — и сразу видно, повторяется ли годовой узор. Это перекликается с small multiples и со спектральным анализом из курса по обработке сигналов, где периодичность ищут уже в частотной области.

Частые ошибки

  • Параллельные координаты без нормировки осей — крупномасштабная переменная подавляет остальные.
  • Слишком много объектов на параллельных координатах — сплошная заливка; нужен alpha или выделение групп.
  • Неравномерное время как равномерное — искажает скорость изменения.
  • Время справа налево или по Y — нарушает сильнейшее соглашение, читатель запутается.

Итог

  • Параллельные координаты показывают много переменных как ломаные по параллельным осям.
  • Оси обязательно нормировать; пересечения = антикорреляция.
  • Время — всегда по X слева направо; линия передаёт непрерывность.
  • Для временных рядов важны тренд, сезонность и честные интервалы.
Проверьте себя
1. Что представляет один объект на графике параллельных координат?
AТочку
BЛоманую линию, пересекающую все параллельные оси на своих значениях
CСтолбец
DСектор круга
2. Почему оси параллельных координат нужно нормировать?
AДля красоты
BИначе переменная с большими числами визуально подавит остальные
CЧтобы убрать выбросы
DЭто ускоряет рендеринг
3. Как принято располагать ось времени на временном ряде?
AПо вертикали
BПо горизонтали слева направо
CСправа налево
DПо кругу