Scatter и overplotting: когда точки сливаются

На больших данных scatter превращается в чёрное пятно — и приёмы спасения от этого.

Overplotting — наложение точек диаграммы рассеяния друг на друга, из-за чего плотные области сливаются в сплошное пятно и теряется информация о концентрации.

Scatter — король зависимостей

Диаграмма рассеяния кодирует две числовые переменные позицией по X и Y — двумя самыми точными каналами. Поэтому для вопроса «как связаны A и B?» scatter почти всегда лучший выбор: видны тренд, разброс, кластеры, выбросы, нелинейность. Но у него есть враг — overplotting.

Проблема наложения

Когда точек тысячи, в плотных областях они садятся друг на друга. Глаз видит сплошную чёрную кляксу и не может оценить, где концентрация выше: 100 точек в пикселе выглядят так же, как 5. Информация о плотности теряется именно там, где она важнее всего. Есть четыре основных приёма борьбы.

ПриёмИдеяКогда
Прозрачность (alpha)точки полупрозрачны, плотность = темнотадо ~10k точек
Джиттерлёгкий случайный сдвиг разлепляет совпадениядискретные/округлённые значения
Hexbinплоскость в шестиугольники, цвет = счётчикдесятки тысяч+ точек
Контуры плотности2D-KDE, линии уровнягладкие распределения

Прозрачность: считаем эффект

Идея alpha: если в одном месте наложилось $k$ точек с прозрачностью $\alpha$, итоговая непрозрачность равна $1 - (1-\alpha)^k$ — она растёт с числом точек, так что плотные зоны темнее. Посчитаем.

alpha = 0.1
for k in [1, 2, 5, 10, 30]:
    opacity = 1 - (1 - alpha) ** k
    bar = '#' * int(opacity * 30)
    print(f"{k:2d} точек -> непрозрачность {opacity:.2f} {bar}")

Вывод:

 1 точек -> непрозрачность 0.10 ##
 2 точек -> непрозрачность 0.19 #####
 5 точек -> непрозрачность 0.41 ############
10 точек -> непрозрачность 0.65 ###################
30 точек -> непрозрачность 0.96 ############################

Одна точка едва видна, а скопление из 30 почти чёрное — так глаз считывает плотность. Подбор alpha — это подгонка под типичную кратность наложения.

Hexbin: биннинг плоскости

Когда точек слишком много даже для alpha, плоскость разбивают на шестиугольные ячейки и красят каждую по числу попавших точек — это 2D-гистограмма. Шестиугольники предпочтительнее квадратов: у них меньше искажений на границах и нет «решётчатого» артефакта. Hexbin превращает миллион точек в читаемое поле плотности.

scatter (overplot)      hexbin (плотность цветом)
  все точки чёрным         . : o # # o :
  ███████                  : # @ @ # : .
  ██████ <- клякса         o # @ @ # o
  ███████                  : # @ # : .
                           легенда: . низк  @ выс

Линия тренда

К scatter часто добавляют линию тренда — она помогает увидеть зависимость сквозь шум. Но осторожно: линейный тренд предполагает линейную связь (вспомните набор II квартета Энскомба!). Всегда проверяйте, что тренд осмыслен, и не экстраполируйте его за пределы данных.

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

Overplotting — это потеря информации из-за конечного разрешения экрана и непрозрачности маркеров: пиксель может быть либо «закрашен», либо нет, а сколько точек его закрасило — теряется. Alpha решает это, делая закраску аддитивной (приближённо), hexbin — явным подсчётом. По сути все приёмы восстанавливают третье измерение — плотность — которое scatter по умолчанию выбрасывает.

Третье измерение, которое теряет scatter

Полезно осознать, что у плотного scatter есть скрытое третье измерение — локальная плотность точек, — и все приёмы борьбы с overplotting по сути восстанавливают именно его. Прозрачность кодирует плотность яркостью, hexbin — явным цветом ячейки, контуры 2D-KDE — линиями уровня. Выбор между ними — вопрос масштаба: до тысяч точек хватает alpha, на десятках тысяч лучше hexbin, для гладких распределений выразительнее контуры. Нередко их совмещают: полупрозрачные точки плюс несколько контуров плотности сверху дают и отдельные наблюдения, и общую картину концентрации.

Отдельная разновидность проблемы — дискретные или округлённые данные. Если величины принимают мало различных значений (оценки по 5-балльной шкале, годы, целые счётчики), точки садятся ровно друг на друга, и даже alpha не спасает — в одной координате могут быть сотни наблюдений. Здесь помогает джиттер: крошечный случайный сдвиг разлепляет совпадения, не искажая смысла. Главное — делать сдвиг достаточно малым, чтобы он не выглядел как реальный разброс, и упоминать о нём в подписи.

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

  • Непрозрачные точки на больших данных — чёрная клякса без информации о плотности.
  • Слишком крупные маркеры — усиливают наложение; на плотных данных делайте точки мелкими.
  • Игнорировать дискретность — округлённые значения садятся в одни точки; нужен джиттер.
  • Линейный тренд на нелинейных данных — вводит в заблуждение, как в квартете Энскомба.

Итог

  • Scatter — лучший выбор для зависимости двух величин.
  • Overplotting прячет плотность; борются alpha, джиттером, hexbin, контурами.
  • Прозрачность делает плотные зоны темнее по закону $1-(1-\alpha)^k$.
  • Линию тренда добавляйте осознанно и не экстраполируйте.
Проверьте себя
1. Что такое overplotting?
AОшибка в данных
BНаложение точек, из-за которого теряется информация о плотности в скоплениях
CСлишком много осей
DЛишние подписи
2. Как прозрачность (alpha) помогает против overplotting?
AДелает график цветным
BПлотные области становятся темнее, так как непрозрачность растёт с числом наложенных точек
CУдаляет лишние точки
DУменьшает размер файла
3. Когда лучше использовать hexbin вместо обычного scatter?
AКогда точек очень много (десятки тысяч и больше)
BКогда точек всего пять
CКогда нужен 3D
DНикогда