Пять демо, на которых geospatial data scientists зарабатывают в недвижимости — скоринг площадок, типология районов, декомпозиция цены метра, размещение бригад и живое доказательство утечки через географию, — плюс разбор реальных внедрений. Карты — на синтетическом городе; кейсы и коэффициенты настоящие, со ссылками на первоисточники.
Что показываем на карте
Под какую задачу ищем
Пресет расставляет веса. Дальше крутите руками — карта пересчитывается на каждом движении.
Веса факторов
Слои
Каждый гексагон — ячейка около 400 м поперёк, аналог сетки H3 (здесь своя реализация, чтобы файл работал без интернета). В режиме скоринга цвет — итоговый скор от 0 до 100 относительно лучшей ячейки в городе; в режиме «Вклад локации» — цена метра относительно медианы города. Тонкая чёрная обводка — топ-5, фиолетовая — выбранная. Веса слева — коэффициенты интерпретируемой модели скоринга: в бою их подбирают не рукой, а обучением на факте (выручка, темпы продаж), и тогда они становятся настоящей feature importance. Полупрозрачные ячейки — под ограничениями застройки: зона охраны наследия, приаэродромная территория и водоохранная полоса. Они исключены из рейтинга.
Честная оговорка про режим «Вклад локации». Коэффициент метро измерен на близости к станции — у КБ Стрелка это первые сотни метров. Здесь он линейно продолжен на всю карту, поэтому в дальних ячейках работает уже не измеренная зависимость, а искусственный пол −18%. Такие строки помечены словом «экстраполяция» в разборе ячейки, их . Это ровно та ошибка, за которую гедонические модели ругают чаще всего: коэффициент, вынесенный за диапазон, на котором его оценивали, перестаёт что-либо измерять.
Разбор ячейки
Топ-5 площадок
Скоринг отвечает на вопрос «где лучше». Кластеризация отвечает на другой: сколько вообще в городе типов территорий и какой из них рынок ещё не переоценил. Это разворот от «найти лучшую площадку» к «понять, где резерв» — тот самый разрыв между доступностью и ценой, на котором зарабатывают.
Метод
Агломеративная кластеризация Уорда по шести признакам района. Дерево строится один раз, без k на входе — а число кластеров выбирают потом, разрезая его там, где ветки расходятся далеко. Но выбрать k всё равно придётся, и это решение аналитика: подвигайте ползунок и убедитесь, что вывод от него не переворачивается.
Район здесь — блок 3×3 гексагона по индексам сетки, поэтому границы получаются ступенчатыми: у соседних рядов шестиугольники смещены на полклетки. В рабочей задаче на этом месте родительская ячейка H3 более грубого разрешения — иерархия сетки ровно для этого и придумана.
Параметры
Где резерв
Дендрограмма и линия разреза
По горизонтали — районы, по вертикали — z-расстояние, на котором они склеились. Признаки стандартизованы, и шкала — это длина вектора расхождений сразу по всем шести: единица означает суммарное расхождение в одно стандартное отклонение, а не сигму по одному признаку. Чем выше склейка, тем сильнее различаются объединяемые группы. Пунктир — текущий разрез.
Профили кластеров: отклонение от среднего по городу
Вправо — выше среднего по городу, влево — ниже. Так читается смысл кластера: «доступность высокая, цена низкая» — это резерв, куда рынок ещё не пришёл; «доступность высокая, цена высокая» — зрелый рынок, где вы покупаете вход дорого. Ровно этот приём применён в разборе Дубая: районы кластеризовали по доступности до моллов, насыщенности точками притяжения и медианной цене, а потом сравнили с картой уже идущих девелоперских проектов — и увидели, что стройка идёт либо в насыщенных зонах, либо на периферии, мимо кластера с ценой ниже и хорошей доступностью. Автор того разбора — Елена Скребкова, работа выполнена на курсе пространственного анализа Инессы Трегубовой.
Параметры объекта
Что рядом
Вклад факторов в цену метра: таблица Bonus / Malus
Это SHAP-подобная декомпозиция: базовая цена по городу плюс вклад каждого признака. В оценочной практике такую таблицу называют Bonus/Malus — она переводит вывод модели на язык сравнительного подхода, где оценщик обязан обосновать каждую корректировку, как того требуют стандарты IVS и RICS. Без неё банк, суд и налоговая на цифру из модели не опираются. Метка ГЕО — признак, который не спрашивают у продавца, а считают из данных: изохрона по графу улиц, буфер по полигонам OSM, дистанция до промзоны. Наведите на строку — покажу источник признака.
Точка отсчёта 210 000 ₽/м² — это не средняя цена по городу, а значение до применения поправок: от него отсчитываются все строки, поэтому они и складываются в итог ровно. Коэффициенты — порядок величин из публичных исследований, а не оценка вашей квартиры. Эффект метро (+1,5% в пятиминутной доступности и падение дальше 500 м) — из работы КБ Стрелка на выборке 71,2 тыс. московских квартир. Панорамный вид: риелторы «Миэль» оценивали наценку за панорамный вид в Москве в 10–15% — но это оценка 2013 года без опубликованной методики, поэтому здесь заложено консервативные 12%. И то же замечание, что на карте: ползунок «пешком до метро» уходит до 30 минут, а коэффициент измерялся на первых сотнях метров, так что правая половина шкалы — экстраполяция, а не измерение. В рабочей модели такие коэффициенты не проставляются руками — их достают из обученного бустинга через SHAP, и они разные для каждого района. И ещё честная оговорка: вклады здесь считаются последовательно, от накопленной цены, поэтому сумма зависит от порядка строк — настоящий SHAP аддитивен и от порядка не зависит.
Постановка задачи
Параметры
Что получилось
Нагрузка по бригадам
Три постановки дают три разных ответа на одной и той же карте. p-median (Hakimi, 1965) минимизирует суммарный взвешенный подъезд — хорош для экономики, но бросает окраины. p-center (Hakimi, 1964) режет худший случай — это про SLA «инженер на объекте за N минут». MCLP (Church, ReVelle, 1974) максимизирует долю объектов внутри норматива при фиксированном числе бригад: он честно признаёт, что покрыть всё бюджета не хватит. Дальше в реальном проекте добавляются ёмкость бригады, квалификации и маршрут снабжения на день — то есть VRP с временными окнами.
Та же математика в городской реновации. Закон о статусе столицы (ст. 7.3) требует предоставить равнозначное жильё в том же районе Москвы — исключение только для Зеленоградского, Троицкого и Новомосковского округов, там в границах округа. Плюс организационная схема программы: стартовая площадка → переселение → снос → следующий дом на освободившемся месте. Получается задача о назначении с расписанием: какие кварталы раскрывать первыми, какая площадка обслуживает какие дома, как уложить сводный график в годовой лимит ввода. Цена решения — срок программы, объём временного жилья и число людей, которых всё-таки пришлось увезти из своего района.
Кухня, которая стоит за первыми тремя вкладками: как сырые снимки и координаты превращаются в модель, и на чём эта модель чаще всего врёт.
Пайплайн: от снимка до решения
Утечка через географию
Классическая ловушка гео-ML. Если разбить выборку случайно, квартиры одного дома попадут и в обучение, и в тест — модель заучит цену дома, а не закономерность. Покрутите разброс между домами и посмотрите, как расходятся метрики.
Параметры эксперимента
Результат
Что делают ползунки. Разброс между домами задаёт, насколько дома отличаются друг от друга при прочих равных: на нуле цвет по карте меняется плавно, на максимуме каждый дом становится отдельным пятном — и именно это пятно потом утекает через случайный сплит. Соседей в kNN меняет число линий у выбранной точки: щёлкните по любой тестовой точке, чтобы посмотреть, откуда модель берёт свой ответ. В случайном сплите соседи оказываются в том же доме, в сплите по домам — приходится тянуться в чужие. Радиус тестовой точки — её ошибка предсказания.
Модель одна и та же — kNN по координатам, то есть ровно то, чем по факту работает любой бустинг с гео-признаками.
Меняется только способ разбиения выборки. При случайном сплите у каждой тестовой квартиры соседи по обучению стоят в том же подъезде, и модель просто копирует их цену: MAPE выглядит прекрасно.
Сплит по домам увозит в тест дом целиком — и остаётся честная ошибка на объекте, который модель раньше не видела. Поставьте разброс между домами в ноль: разрыв схлопнется с семи с лишним раз до двух-трёх, но в ноль не уйдёт — это и есть неустранимая ошибка интерполяции на незнакомой территории.
В проде это Spatial K-Fold: в фолд целиком уезжает дом или кластер DBSCAN. Блоки карты — следующий шаг, если модель поедет в незнакомый район. Только «нарезать блоками» — ещё не значит «проверить строго»: ниже посчитано, что даёт каждая из четырёх нарезок и где в них ловушка.
Ещё две проверки, которые экономят месяцы. Первая — линейный бейзлайн: в разборе рынка Кальяри на 1153 объявлениях нейросеть выиграла по метрикам, но отрыв от обычной линейной регрессии оказался мал, и авторы прямо пишут, что нелинейные модели не дали большого преимущества. Прежде чем защищать бюджет на бустинг, посчитайте, сколько он реально отыгрывает у регрессии. Вторая — пропуски. Незаполненные поля в объявлении не выбрасывают и не заполняют средним, а кодируют отдельной категорией «не указано»: умолчание продавца коррелирует с сегментом рынка. Если человек не написал состояние ремонта — это тоже признак.
Четыре нарезки фолдов — и почему «блоками» само по себе ничего не гарантирует
Здесь та же модель и те же 468 объявлений, но полная кросс-валидация: каждая точка ровно один раз оказывается в тесте, поэтому произвольный выбор «вот этот кусок отложим» из результата убран. Ползунки выше действуют и на эту таблицу — покрутите разброс между домами и посмотрите, как меняется порядок строк. Кнопки слева от карты показывают любую из четырёх нарезок на самой карте.
Сетка блоков у второй и третьей строки одна и та же — 4 × 2 на всю карту, восемь фолдов. Разница между ними в одном: куда относить дом, которому граница блока прошла по двору. При нарезке по точкам часть его квартир уезжает в тест, а часть остаётся в обучении, и у тестовых снова появляется сосед из своего же дома — тот самый механизм, которым обманывает случайный сплит, просто в меньшем масштабе. При нарезке по домам блок собирается из целых домов, и утечки нет: у первой строки соседей из своего дома почти пять из пяти, у второй уже около одного, у двух последних ровно ноль.
А вот сравнивать блоки с leave-one-building-out по принципу «что строже» бессмысленно, и это стоило мне переписанного абзаца в статье. Порядок двух последних строк меняется вместе с разбросом между домами, потому что промах складывается из двух разных вещей: из того, что модель не знает собственной надбавки нового дома, и из того, что она не знает, как устроена цена в этой части карты. Блок отодвигает соседей вдвое дальше и увеличивает вторую составляющую, но первая при этом чуть уменьшается, и в сумме они частично гасят друг друга — цифры в выводе выше пересчитываются на каждом положении ползунка. Так что нарезку выбирают не по фольклору, а под тот риск, который страшен: незнакомый дом в знакомом районе или незнакомый район целиком. Единственное, что не зависит ни от чего, — счётчик соседей из своей группы. Если он не ноль, проверка мерит не то, что вы думаете.