Плотность и тепловые карты

Урок объясняет, как тысячи разрозненных точек превратить в наглядную карту плотности — «тепловую карту» — и реализует простейший вариант через подсчёт по сетке.

Карта плотности (тепловая карта) показывает, насколько густо точки расположены в каждой части территории, превращая дискретные события в непрерывное поле.

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

Самый простой способ: сетка-подсчёт

Накроем территорию равномерной сеткой ячеек и в каждой посчитаем, сколько точек в неё попало. Получится растр, где значение ячейки — число точек. Это уже примитивная тепловая карта:

from collections import Counter

points = [(1, 1), (1.5, 1.2), (1.2, 0.9), (2, 8),
          (7, 7), (7.5, 7.5), (7.2, 6.8), (8, 7)]
cell = 5  # размер ячейки

grid = Counter((int(x // cell), int(y // cell)) for x, y in points)
for key in sorted(grid):
    cx, cy = key
    print(f"ячейка ({cx},{cy}): {grid[key]} точек")

hottest = max(grid, key=grid.get)
print(f"Горячая ячейка: {hottest} ({grid[hottest]} точек)")

Вывод:

ячейка (0,0): 3 точек
ячейка (0,1): 1 точек
ячейка (1,1): 4 точек
Горячая ячейка: (1, 1) (4 точек)

Зачем нужна ядерная оценка (KDE)

У сетки-подсчёта есть изъян: результат скачкообразный и зависит от того, где провести границы ячеек — сдвиг сетки на полклетки меняет картину. Более гладкий метод — ядерная оценка плотности (Kernel Density Estimation). Идея: вокруг каждой точки «размазывается» колоколообразное пятнышко (ядро), и в каждом месте карты плотность — это сумма вкладов всех соседних точек, причём дальние точки вносят меньше. Чем больше точек рядом, тем выше суммарный «холм».

  Сетка-подсчёт:        Ядерная оценка (KDE):
  |2|0|3|               плавные изолинии
  |1|4|1|               вокруг сгущений
  резкие границы        гладкое поле

Параметр KDE — радиус сглаживания (bandwidth): маленький делает карту «пятнистой» вокруг отдельных точек, большой — слишком размытой. Его подбирают под масштаб задачи.

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

Формально KDE в точке $(x, y)$ — это $\frac{1}{n h^2}\sum_i K\!\left(\frac{r_i}{h}\right)$, где $r_i$ — расстояние до $i$-й точки, $h$ — радиус сглаживания, $K$ — ядро (часто гауссово). Вычисляют KDE на сетке: для каждой ячейки растра суммируют вклады всех точек. Наивно это $O(\text{ячеек} \times \text{точек})$ — дорого, поэтому используют отсечение по радиусу (дальние точки игнорируют) и быстрые свёртки. В вебе тепловые карты рисует, например, плагин Leaflet.heat, в Python — функции seaborn/scipy, а в больших ГИС — встроенный инструмент Heatmap.

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

  • Считать плотность в градусах. Ячейки сетки должны быть в метрах, иначе «плотность на градус» искажена широтой.
  • Брать слишком большой радиус сглаживания. Карта превратится в одно размытое пятно без полезных деталей.
  • Путать плотность с количеством. Плотность — это число на единицу площади; без деления на площадь сравнивать ячейки разного размера нельзя.

Как тепловая карта обманывает и как не обмануться

Тепловая карта — мощный, но коварный инструмент визуализации, и понимать её ловушки так же важно, как уметь строить. Главная ловушка: плотность точек часто отражает не изучаемое явление, а просто плотность населения. «Горячая точка» ДТП в центре города может означать не опасный перекрёсток, а то, что машин там в принципе в десять раз больше. Честный анализ нормирует: делит число событий на «знаменатель» — население, трафик, длину дорог, — и тогда карта показывает относительный риск, а не банальную скученность людей. Без нормировки тепловая карта почти всегда «переоткрывает» карту плотности населения и вводит в заблуждение.

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

Итог

  • Тепловая карта переводит россыпь точек в непрерывное поле плотности.
  • Простейший метод — подсчёт точек по ячейкам сетки.
  • KDE даёт гладкий результат, «размазывая» ядро вокруг каждой точки.
  • Радиус сглаживания (bandwidth) определяет детальность карты.
Проверьте себя
1. Зачем строят тепловую карту вместо показа всех точек?
AТочки нельзя рисовать
BМножество точек сливается в кашу; карта плотности наглядно показывает сгущения
CТак быстрее загружается
DЧтобы скрыть данные
2. В чём недостаток простого подсчёта точек по сетке?
AОн слишком точный
BРезультат скачкообразный и зависит от того, где проведены границы ячеек
CОн не считает точки
DОн работает только с одной точкой
3. Что задаёт радиус сглаживания (bandwidth) в KDE?
AЦвет карты
BНасколько широко «размазывается» вклад каждой точки — детальность поля плотности
CЧисло точек
DСистему координат