ESPN DeportesKawhi Leonard: ¿Cómo será recordado cuando finalice su carrera?Daily MaverickTHE GATHERING 2026: Fixing failing cities is in business’s own interest, leaders sayESPN'Gonna let them do them': Cunningham ignoring Kanter Freedom, Whiteוואלהחיל האוויר בגל תקיפות נגד יעדי טרור בדרום לבנוןRTP DesportoPortugal perde com Espanha e falha meias da Liga Europeia de futebol de praiaInquirerBojie Dy hails Pisa improvement: ‘It’s a welcome news’BlickVon Pfäffikon ZH über Siders VS bis Susch GR: Das sind die schlimmsten Busunglücke der Schweiz20 Minuten«Wir sind ein gutes Team»: Annemarie Carpendale lobt ihren WayneAntara NewsIndian envoy: BRICS agenda aligns with Indonesia bilateral focusBillboardFlavor Flav Shares Personal 9/11 Memory & Honors ‘Heroes Who Ran Toward Danger’ on 25th AnniversaryGlobal News13-year-old charged after firearm seized at Ajax hotel: Durham policeComplete Sports2026 US Open Final: Rybakina, Sabalenka Target Grand Slam Title
The Daily Newsstand · Free, Always
Friday, September 11, 2026

Цифровой двойник трафика всей страны, чтобы сэкономить 30% на наружной рекламе

Translate

Медиапланер вручную подбирает 20–30 поверхностей под задачу (например, «максимальный охват» или «частота 5+»). Для этого открываются Яндекс Карты, на глаз прикидываются трафик и видимость щитов, а затем подборка проверяется через сервисы мониторинга вроде Admetrix на предмет свободных дат, реального охвата и пересечений.

На один крупный город уходит несколько рабочих дней, а сборка федеральной кампании может затянуться на месяц.

При этом крупный бизнес и агентства хотя бы тратят на это время, а малый и средний бизнес из-за нехватки ресурсов и вовсе закупает рекламу «на глазок», без какого-либо анализа.

0. Откуда все началось

В Statzilla наш основной профиль это маркетинг аналитика. И конечно, регулярный крик души от коллег по цеху нам хорошо знаком «Вот список из 200 билбордов, а можем из этого собрать идеальный набор под максимальный охват?» и все, что тут можно сделать - выбрать максимальный OTS - «opportunity to see» (увидел рекламу) за минимум денег. Звучит как классическая задача комбинаторной оптимизации. Но есть нюанс: данных о том, сколько уникальных людей проезжает мимо каждой поверхности просто нет, все что мы знаем это "сколько машин в час" - трафик, в котором один и тот же водитель на маршруте «дом–работа» проезжает мимо четырёх ваших билбордов, и вы честно платите за четыре контакта с одним человеком.

Из решений тут AdMetrix, который даёт прекрасный мониторинг, но не умеет оптимизировать выбор. Есть "калькуляторы" на платформах/DSP наружки, вроде Omni360, правда — только с цифровыми экранами. А остальное — это Excel, интуиция медиапланера и 2–3 рабочих дня на сбор пазла.

Тогда мы решили построить своё. Но не просто выбирать билборды, а в идеале уметь считать пересечения аудиторий между поверхностями, по настоящему оптимизировать охваты, контролировать частоту и сравнивать сценарии перед запуском.

Так родилась агентная модель городского трафика. Сейчас она покрывает 17 городов, 40 000+ поверхностей, и мы валидируем её по независимым счётчикам ДПТ, с точностью 11%. Но обо всём по порядку.

Небольшое отступление! Если для кого-то это актуальная задача, и техническая сторона не особо интересна, то воспользоваться можно здесь Купи.баннер, или почитать кейс использования на vc.ru. (А еще, пока идете анализ, можно смотреть на капибару)

1. Где взять данные?

Чтобы честно посчитать охват и частоту для комбинации из десятков билбордов, нам нужны данные о реальных перемещениях людей, а не просто абстрактные цифры трафика. И здесь мы упираемся в три проблемы классических источников:

  • Проблема 1: Трафик ≠ Уникальные люди. Обычные замеры (счётчики, датчики, закупка OTS) показывают только количество проезжающих машин за час. Они не видят, что один и тот же водитель проезжает мимо трёх ваших баннеров по дороге на работу. В итоге вы платите за три контакта, думая, что охватили троих разных людей.

  • Проблема 2: Прошлое ≠ Будущее. Исторические данные и отчёты о прошлых размещениях показывают факты прошлого, а нам нужен инструмент планирования. Если клиент спросит: «А что будет, если мы заменим 5 щитов на ТТК на 3 на Ленинградке?» — исторические отчёты не ответят, потому что именно такой комбинации еще не было.

  • Проблема 3: Геолокация без контекста. Сырые мобильные данные (GDR/CDR) дают точки на карте, но не объясняют поведение. Модели важно понимать не просто «устройство X было в точке Y», а паттерн: едет ли человек на работу к 9:00 ежедневно или это случайная поездка в ТЦ в субботу. Именно паттерны определяют реальную частоту контакта с рекламой.

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

2. Архитектура модели

2.1 Город как граф

Первый слой — дорожный граф. Вершины — перекрёстки, жилые кварталы, ТЦ, бизнес-центры, вокзалы. Рёбра — дороги с атрибутами: Длина дороги, скорость, кол-во полос, направление, тип дороги, наличие светофора.

Источник — OpenStreetMap, но с небольшой доработкой: мы исправляли развязки, где OSM давал нереалистичные манёвры (например кольцо, с которого можно только съехать, а заехать никак), частично добавляли ребра, где были вершины без выезда (дом без дороги). Вес ребра в графе — не просто длина, а ожидаемое время проезда с учётом типа дороги. Динамическую составляющую (пробки) мы добавляем позже.

2.2 Население по узлам

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

Для расчёта весов мы объединяем несколько разнородных источников:

  • Базовое население: данные Росстата и муниципальной статистики по районам.

  • Пространственное распределение: этажность, плотность и тип застройки (жилая / коммерческая / промзоны) на основе OSM.

  • Точки притяжения: данные о посещаемости коммерческих объектов (ТЦ, бизнес-центры, логистические парки, транспортные хабы).

На основе этих источников для каждого узла формируется два ключевых показателя:

  1. P_{home}(v_i) — ночной потенциал (сколько людей здесь «ночует» и откуда начинают утренний маршрут).

  2. P_{work}(v_i) — дневной потенциал (емкость рабочих мест и точек дневного притяжения).

Эти величины задают «магниты» для нашей агентной модели: они определяют, с какой вероятностью агент выберет узел v_i в качестве начальной или конечной точки своего дневного маршрута.

2.3 Роли и паттерны движения

Ключевая идея агентной модели: люди ездят не случайно, их паттерн зависит от определяется ролью.

Мы выделили 5 базовых ролей, каждая со своим расписанием и маршрутом:

Роль

Утро

День

Вечер

Поездок/день

Офисный работник

Дом→Офис

Офис→Дом

2

Работяга

Дом→Работа (пром. сектор)

Работа→Дом→Работа (смена)

Работа→Дом

2/4

Мотается по городу

Дом→Офис

Офис→Встречи×2-3

Встреча→Дом

4–6

Домохозяйка

Дом→Школа

Дом→Магазин

Дом

2–3

Сервисный работник

Дом→Дом2

Дом2→Дом3
х3-4

ДомХ→Дом

3–5

Маршрут вых. дня

Дом→Магазин/ТЦ

Парк→Дом

2–4

Каждому агенту при старте назначается роль с вероятностью, соответствующей доле в экономически активном населении города.

2.4 Генерация маршрутов

Для каждого агента генерируется цепочка поездок на день. Каждая поездка — это пара (пункт отбытия, место назначения), где финальная точка выбирается случайно 1 раз на месяц симуляции, или каждый день в зависимости от роли агента. Вероятность пропорциональна типу помещений определенного типа в конкретном узле:

P(\text{dest} = v_j) = \frac{P(v_j)}{\sum_{k} P(v_k)}

При этом мы учитываем «притяжение» по типу роли: офисный работник с высокой вероятностью едет в узел с высокой концентрацией офисов, а не в жилой массив.

Маршрут строится алгоритмом Дейкстры по взвешенному графу. Но здесь есть сложность: если все агенты будут ехать по кратчайшему пути, мы получим абсурдную картину, где все едут по одной дороге, а параллельные улицы пустые.

Мы добавили стохастическую маршрутизацию: с некоторой вероятностью \alpha агент выбирает не кратчайший, а «почти кратчайший» путь, где вес ребра слегка рандомизируется. Это даёт реалистичное распределение потоков по параллельным магистралям.

2.5 Временная динамика

Модель дискретна с шагом 15 минут. В каждый тик симуляции агент находится в одном из состояний: "в точке" (работа, дом, магазин) или "в движении".

Время ожидания в точке назначения зависит от ее типа:

  • Работа: нормальное распределение \mathcal{N}(8, 1) часов

  • Магазин: экспоненциальное, \lambda = 0.5 часа

  • Встреча: \mathcal{N}(1.5, 0.5) часа

Это нужно, чтобы вечерний трафик из центра начинался не мгновенно в 18:00, а растягивался по времени.

3. Подсчёт контактов с рекламой

3.1 Привязка поверхностей к графу

Каждая рекламная поверхность привязана к ребру графа. У неё есть:

  • Координаты (lat, lon)

  • Угол обзора (для билбордов обычно 60–90°)

  • Зона видимости — расстояние вдоль дороги длиной, равной времени восприятия при скорости потока. Это для того, чтобы успеть посмотреть рекламу на диджитальном мониторе.

3.2 Проехал мимо ≠ увидел рекламу

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

При этом можно ехать в час пик по коротким улицам с плотным движением, а можно по просторной улице когда вокруг пусто, и очевидно, что чаще заметишь рекламу ты во втором случае, поэтому каждый проезд не является гарантированным OTS, а он зависит от нескольких факторов.

P = (P_0 + f(d))*P_{сторона, θ}**SOV

где, d(м) - расстояние до светофорора от 0 до 200 метров, сторона билборда А/B/C, θ - уголь обзора, SOV = длительность рекламы/длительность блока (для цифровой рекламы, для статика 1)

3.3 От OTS к Reach

Теперь, зная все "успешные" просмотры рекламы - OTS, группируем поagent_idи можем считать не только индивидуальный reach каждой поверхности, но и пересечение аудиторий между ними. Если два билборда стоят на одном маршруте, их совместный reach может быть почти равен reach одного из них.

Мы также считаем частоту контакта на агента: сколько раз конкретный человек видел рекламу за кампанию. Это позволяет строить планы не только под максимальный охват (reach 1), но и под выдержанную частоту (reach 3–5).

3.4 Масштабирование и производительность

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

Для справки - симуляция одного города миллионника занимает несколько часов вычислительного времени.

4. Валидация: а модель-то врёт?

Любая симуляция — это упрощение. Вопрос: насколько оно адекватно?

Мы валидируем модель по трём независимым источникам:

  1. Счётчики ДПТ (дорожно-патрульная техника). Открытая база дорожного фонда РФ - СКДФ. Сравниваем интенсивность движения на 200 ключевых проспектах, бульварах и средних. Среднее отклонение — ±11%.

  2. Мониторинг - AdMetrix. Выборочно строим адресные программы от 3-х до 30-и поверхностей на город миллионник и сравниваем метрики: OTS, reach1+, reach3+, средняя частота, тут похуже точность 82-85%.

  3. Пост-кампейн аудит. Для нескольких пилотов сравнивали прогнозируемый reach с данными мобильных операторов после размещения. Совпадение — 89–94%.

При этом надо понимать что такое точно ±10-15% — это погрешностью самих измерительных и мониторинговых систем, поставили человека, он отвернулся, постоял час усреднил результат. Повесили датчик, он посчитал мотоциклиста, машину и автобус за 1 единицу, считали MAC адреса по WiFi еще одна погрешность, в общем, мы решили так, для задачи планирования — вполне приемлемо.

5. Оптимизация: как выбрать набор поверхностей

Задача: при заданном бюджете B выбрать подмножество поверхностей S, максимизирующее reach:

\max_{S \subseteq \text{All}} \left| \bigcup_{b \in S} \text{Reach}(b) \right|\text{s.t.} \sum_{b \in S} \text{Price}(b) \leq B

Это классическая NP-полная задача и для условной Москвы с порядка 20 тыс доступных поверхностей полный перебор невозможен. Поэтому есть буквально пара вариантов:

Жадный алгоритм (baseline): Пока бюджет есть, тратим на "самый полезный баннер" (дающий наибольший охват), потом удаляем все машинки которые мы затронули и повторяем процедуру. Если нужно гарантировать 3 или 5 или 10 касаний, то убираем машинку только тогда, когда они достигла нужного кол-ва касаний.

А можно и немного заморочиться, чтобы получить прирост в 10-15% точности. Генетический алгоритм: подбирает оптимальный набор рекламных щитов по принципу естественного отбора. Вместо полного перебора миллиардов комбинаций он «выращивает» эффективный медиаплан за несколько сотен шагов.

  • Формат решения (Хромосома): Каждый вариант размещения кодируется битовой цепочкой, где 1 означает покупку конкретного щита, а 0 — отказ от него.

  • Оценка эффективности (Фитнес-функция): Алгоритм рассчитывает ценность каждого варианта по соотношению «охват к стоимости». Чем выше чистый охват аудитории (с учетом требований к числу касаний), тем выше балл. Если вариант вылез за рамки бюджета, алгоритм автоматически накладывает штраф, искусственно снижая его рейтинг.

  • Скрещивание (Кроссовер): Наиболее удачные наборы щитов объединяются между собой. Алгоритм берет первую половину одного успешного плана и вторую половину другого, формируя новое решение из сильных элементов.

  • Точечная проверка (Мутация): Алгоритм случайно меняет 1–2 щита в наборе (включает или выключает их). Это не дает системе «застрять» на одном среднем варианте и помогает находить не очевидные эффективные связки.

  • Эволюция: Процесс повторяется 500 поколений на популяции из 100 вариантов. Слабые медиапланы отсеиваются, а перспективные — постоянно дорабатываются.

На выходе за секунды получаем сбалансированное решение, близкое к математическому максимуму по охвату и вписанное в бюджет.

Результат: для типового бюджета 3–5 млн ₽ оптимизированный набор даёт на 20–35% больше уникального reach, чем эвристика вроде «топ-N по OTS», и уж тем более не стоит сравнивать с решение в виде "тут 2 штуки куплю, и здесь штук 5".

6. Что мы не учитываем (пока)

  • Пешеходные зоны. Модель заточена под автомобильный трафик. Пешеходы у ситибордов — отдельная история, которую мы пока не покрываем.

  • Погода и сезонность. Сейчас модель использует среднегодовые параметры. Дождливый ноябрь и сухой июль — пока одинаковы.

  • Программатик DOOH - именно динамический контент, его по факту нужно наложить на уже сформированные модели, перемножать вероятность контакта, учитывать расписание, но пока это не наш фокус. Стандартные барабанные DOOH запуски отлично моделируем за счет временного слота в окне показа, никакой разницы со статичной поверхностью.

7. Отличная инструкция, а можно повторить? Где код?

Какой код в 2026 году, о чем речь??? Вот инструкция всего на 2 шага:

  • Шаг 1. Копируем ссылку на статью, скидываем в ChatGPT, а лучше сразу в Claude Code/Codex или Cursor с запросом "напиши весь код" (да, этой статьи вполне достаточно, чтобы все заработало, мы проверяли :-)

  • Шаг 2. Получаем профит - оптимизируем свой рекламный бюджет или продаем услуги другим

Но всегда есть одно НО - внимательный читатель уже заметил, что в статье есть куча параметров:

  • Веса групп населения - каких сколько людей в городе

  • Сценарии их поездок - кто откуда и куда ездит, сколько раз

  • Как видят рекламу - от чего зависит кто и как увидел рекламу

И все неопределенные величины формируют многомерное пространство параметров, которых у нас получилось под 20 штук. Каждый параметр меняется в некоторых разумных пределах и с разумным шагом (например какова доля офисных сотрудников, как часто люди едут в ТЦ), это 10-20 итераций на каждый параметр, итого уже видно что набегает минимум 100, а то и все 500 итераций, и напомню, что каждая из них это несколько часов только вычислений, потому что промежуточный итог нам проверить не на чем, мы должны всю симуляю довести до сборки адресной программы и сравнить OTS/reach с медиаметриками из адресной программы Admetrix, и трафик по некоторым выбранным улицам города...

По итогу, в купе с прочими техническими сложностями, идеями к их решению это все заняло у нас добрые 7 месяцев работы, пока мы наконец не получили одну заветную картинку...

Reach-curve, сколько людей сколько раз видели рекламу

Reach-curve, сколько людей сколько раз видели рекламу

Эта кривулька называется "Reach-curve" она показывает какая доля населения города увидит размещенную рекламу определенное кол-во раз за срок размещения 1 месяц, вот например эту адресную программу "на 5 щитов" 15 раз увидит 12% населения 18+. Совпадение этой кривой во всей области означает что мы достаточно точно описали все перемещения города, какие люди как ездят, сколько дней остаются дома, как часто едут в рандомное место, или в ТЦ по выходным. (Обратите внимание на название финальной модели "Привилегия рабочего класса" - и да, рабочий класс в городе превалирует)

Скажем если бы люди ездили всегда работа -> дом, ровно 21 рабочий день в месяц, всегда по одному маршруту и смотрели бы всегда на все щиты, то график выглядел бы вот так. Т.е 46 % людей строго 21 раз и остальные вообще не видели.

Такого не бывает

Такого не бывает

Все это к чему, повторить всю логику можно, написать весь код можно за считанные часы, а вот построить модель движения города это и есть главная ценность, которую мы получили и будем развивать.

8. Выводы

Мы начали с простого вопроса: «А сколько уникальных людей проедет мимо?» — и пришли к необходимости строить полноценный цифровой двойник городского движения.

Агентное моделирование здесь работает не как замена реальным данным, а как инструмент предиктивной аналитики отвечающий на вопрос "а что если купить другие 2 щита, или увеличить бюджет еще на 100 тыс?", что позволяет тестировать сценарии до старта кампании.

На среднего размера адресных программах это позволяет эконом 20–35% бюджета за счёт устранения дублей и выбора «неочевидных» поверхностей с высоким локальным reach.

View the original on Хабр

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.

Цифровой двойник трафика всей страны, чтобы сэкономить 30% на наружной рекламе — KioskNews