Почему вы едете именно в этот магазин?
Представьте утро пятницы. Вам нужно купить продукты на выходные. В вашем районе есть три супермаркета: один совсем рядом, но маленький и с унылым ассортиментом; второй покрупнее, но до него нужно ехать минут двадцать; третий – настоящий гипермаркет с широким выбором, но добираться туда придётся через весь город. Куда вы поедете?
Скорее всего, вы не будете строить уравнения в голове. Вы просто почувствуете, что один вариант лучше другого. Но если разобраться, что именно вы взвешиваете, окажется, что в вашей голове работает самая настоящая математическая модель. И у неё есть имя – модель Хаффа.
Дэвид Хафф сформулировал её в 1964 году, и с тех пор она не устарела. Более того, она стала одним из главных инструментов для всех, кто решает, где открыть магазин, поликлинику или школу. А теперь, в 2020-х годах, её реализовали в виде открытого программного пакета на языке Python, который называется huff. Именно об этом инструменте и пойдёт речь – но начнём мы, как всегда, с самого главного: с идеи.
Гравитация в мире покупок 🛒
Исаак Ньютон описал гравитацию так: два тела притягиваются тем сильнее, чем они массивнее, и тем слабее, чем дальше друг от друга находятся. Дэвид Хафф применил ту же логику к людям и магазинам. Звучит, может, странно, но работает удивительно хорошо.
В его модели «масса» магазина – это его привлекательность: площадь торгового зала, ассортимент, репутация. А «расстояние» – это не только километры, но и время в пути, пробки, неудобные пересадки. Чем привлекательнее магазин и чем он ближе – тем выше вероятность, что вы окажетесь именно там в эту пятницу.
Ключевое слово здесь – вероятность. Модель Хаффа не говорит: «Этот потребитель пойдёт в магазин А». Она говорит: «Этот потребитель с вероятностью 60% выберет магазин А, с вероятностью 30% – магазин Б, и с вероятностью 10% – магазин В». Это честнее, потому что реальные люди непредсказуемы. Но если взять тысячи людей, математика начинает работать безупречно: 60% из них действительно окажутся в магазине А.
Что стоит за формулой
Я обещал минимум формул – и сдержу слово. Но один принцип объяснить необходимо, потому что именно он делает модель такой мощной.
Представьте, что у каждого магазина есть своего рода «притяжение» – число, которое зависит от двух вещей: насколько магазин хорош и насколько до него далеко. Привлекательность тянет потребителя к магазину, расстояние – от него. Вероятность посещения конкретного магазина – это его «притяжение», делённое на сумму «притяжений» всех магазинов в округе. То есть модель всегда оценивает не магазин сам по себе, а магазин в сравнении с конкурентами.
В этой логике есть два числовых параметра, которые настраивают модель под реальность. Один из них отвечает за то, насколько важна привлекательность: люди едут за тридцать километров ради огромного торгового центра или предпочитают скромный, но близкий магазин? Второй отвечает за чувствительность к расстоянию: как быстро падает интерес потребителя с увеличением пути? В городе с хорошим транспортом люди спокойно едут далеко. В регионе, где добраться куда-либо непросто, даже пять лишних километров резко снижают вероятность поездки.
Эти параметры не выдумываются – они оцениваются по реальным данным. Если мы знаем, куда люди ездили в прошлом, модель подбирает параметры так, чтобы максимально точно воспроизвести наблюдаемое поведение. А дальше её можно использовать для предсказания: что изменится, если открыть новый магазин? Или закрыть старый? Или улучшить дорогу?
Зоны притяжения: невидимые границы на карте
Каждый магазин, каждая больница, каждая школа имеет свою «зону влияния» – территорию, жители которой с наибольшей вероятностью пользуются именно этим учреждением. Это называется зоной обслуживания, или зоной притяжения.
Интересно, что эти зоны не имеют чётких границ. В отличие от административных районов, нарисованных на карте прямыми линиями, реальные зоны влияния – размытые, пересекающиеся, похожие на облака. Житель дома на границе двух районов может с равной вероятностью ехать в любой из двух ближайших супермаркетов. Это и есть математика модели Хаффа: не жёсткие границы, а плавные вероятности.
Именно поэтому модель так полезна при планировании. Если вы рисуете жёсткие круги вокруг магазина на карте и считаете, что все внутри круга – ваши клиенты, а все снаружи – нет, вы сильно ошибаетесь. Реальность гораздо тоньше. И модель Хаффа её улавливает.
От супермаркетов к больницам: когда математика спасает жизни
Пока мы говорили о магазинах и покупателях. Но та же самая логика работает в совершенно другом контексте – и там цена вопроса значительно выше.
Представьте регион, где нужно оценить, насколько хорошо население обеспечено медицинской помощью. Где не хватает врачей? Какие районы фактически отрезаны от поликлиник из-за плохих дорог или большого расстояния? Где открыть новую больницу, чтобы она помогла максимальному числу людей, а не дублировала уже существующие?
Это задачи пространственной доступности. И модель Хаффа справляется с ними ничуть не хуже, чем с анализом розничных сетей. Только вместо площади магазина мы берём количество врачей или больничных коек, а вместо желания купить товар – потребность населения в медицинской помощи.
Для такого анализа разработан специальный подход, который называется двухшаговая плавающая зона обслуживания (англ. Two-Step Floating Catchment Area, сокращённо 2SFCA). Название звучит устрашающе, но идея проста. На первом шаге мы смотрим на каждую поликлинику и считаем, сколько людей находится в пределах досягаемости. На втором – смотрим на каждый жилой район и суммируем доступность всех поликлиник, до которых можно добраться. В результате мы получаем карту: где медицина доступна, а где люди живут в «пустыне» без нормальной помощи рядом.
Такие карты – не абстракция. Они помогают принимать реальные решения о том, куда направить ресурсы, где строить новые учреждения и как перераспределить нагрузку между существующими.
Пакет huff: инструментарий для пространственного мышления
Описанная математика существует уже шесть десятилетий. Но чтобы применить её на практике, нужны данные, вычисления и умение всё это связать воедино. Именно для этого и создан Python-пакет huff – открытый инструмент, доступный через стандартный репозиторий Python-библиотек (PyPI) и поддерживаемый в открытом репозитории на GitHub.
Давайте пройдёмся по тому, что этот пакет умеет делать – без программного кода, просто по шагам.
Шаг первый: данные о людях и местах
Для начала нужно знать две вещи: где живут люди и где находятся объекты (магазины, больницы, школы). Людей можно описать как районы города с численностью населения. Объекты – как точки на карте с указанием их привлекательности (площадь, количество врачей, любой другой показатель мощности).
Пакет huff работает с геопространственными данными в стандартном формате, совместимом с библиотекой GeoPandas – одной из самых популярных Python-библиотек для работы с картографическими данными. Это означает, что загрузить можно практически любой привычный формат геоданных: Shapefile, GeoJSON и другие.
Шаг второй: матрица затрат
Теперь нужно выяснить, как далеко каждый район от каждого объекта. На выходе получается таблица: строки – районы, столбцы – объекты, в ячейках – время в пути или километры. Её называют матрицей затрат.
Пакет huff умеет строить такую матрицу разными способами. Самый простой – прямое расстояние по прямой линии, как будто местность идеально ровная и дорог нет. Это подходит для грубых оценок. Более реалистичный способ – использовать реальную дорожную сеть из открытых данных OpenStreetMap. Тогда матрица будет учитывать реальные маршруты, объезды и тупики.
Шаг третий: запуск модели
Теперь в дело вступает собственно модель Хаффа. Пакет берёт данные о людях, данные об объектах и матрицу затрат – и вычисляет вероятности. Каждому жилому району назначается набор вероятностей: с какой долей вероятности жители этого района поедут в каждый из объектов.
Если у нас есть реальные данные о поведении людей – например, данные о поездках – пакет умеет автоматически подобрать параметры модели так, чтобы она наилучшим образом воспроизводила наблюдаемую реальность. Это называется калибровкой модели, и это принципиально важный шаг: модель, не настроенная под конкретный регион, может давать сильно искажённые результаты.
Шаг четвёртый: визуализация результатов
Цифры в таблицах – это хорошо. Но карта убедительнее сотни таблиц. Пакет huff генерирует несколько типов карт:
- Карты рыночных долей – показывают, какую часть потребительского потока каждый объект забирает из каждого района.
- Карты доступности – показывают, насколько хорошо каждый район обеспечен объектами (особенно полезно для здравоохранения и социальных услуг).
- Схемы потоков – визуализируют направление и интенсивность движения потребителей от мест проживания к объектам.
Всё это строится с помощью стандартных Python-библиотек визуализации – Matplotlib и GeoPandas, – что означает полную совместимость с привычными рабочими средами аналитиков и исследователей.
Три истории о том, как это работает в жизни
История первая: куда поставить новый магазин
Представьте розничную сеть, которая планирует открыть новую точку в крупном городе. У них уже есть несколько магазинов, и они хотят расширяться – но при этом не «съедать» собственных клиентов. Ведь если новый магазин откроется слишком близко к существующему, он просто перетянет к себе тех же людей, а не привлечёт новых. Этот эффект называется каннибализацией.
С помощью модели Хаффа можно смоделировать несколько потенциальных мест для нового магазина и сравнить, как изменится распределение клиентского потока в каждом случае. Где новый магазин добавит охват? Где он лишь перераспределит уже существующих клиентов? Результат – не гадание, а математически обоснованный выбор.
История вторая: белые пятна на медицинской карте
Региональное министерство здравоохранения хочет понять, где жители испытывают нехватку медицинской помощи. Они знают, сколько врачей работает в каждой поликлинике и где живёт население. Но как связать эти данные?
С помощью метода 2SFCA, реализованного в пакете huff, можно рассчитать индекс доступности для каждого района. На карте сразу станет видно: вот районы с хорошей обеспеченностью, а вот – «медицинские пустыни», где ближайшая поликлиника находится слишком далеко и обслуживает слишком много людей. Это прямое руководство к действию: строить новую поликлинику нужно здесь, а не там.
История третья: маркетинг с пространственным умом
Маркетологи крупного торгового центра хотят понять, как рекламная кампания повлияет на их долю рынка. Логика здесь такая: успешная реклама увеличивает воспринимаемую привлекательность объекта в глазах потребителей. Это можно смоделировать, просто повысив параметр привлекательности в модели Хаффа – и пересчитав вероятности. Результат покажет, из каких районов и за счёт каких конкурентов торговый центр выиграет в клиентском потоке.
Это не магия. Это математика, поставленная на службу здравому смыслу.
Почему это важно: пространственное мышление как навык
Мы привыкли думать о данных как о таблицах и графиках. Но данные существуют в пространстве. Каждый человек живёт где-то. Каждый магазин стоит где-то. Расстояние между ними – не абстракция, а реальное препятствие или возможность.
Модель Хаффа и инструменты вроде пакета huff напоминают нам об этом. Они говорят: прежде чем принять решение, посмотри на карту. Не просто нарисуй круг и скажи «это наша зона охвата». Спроси, с какой вероятностью каждый человек в этом круге действительно выберет тебя, а не конкурента. Учитывай расстояние. Учитывай привлекательность. Учитывай конкуренцию.
Пакет huff – это инструмент с открытым исходным кодом, доступный любому исследователю, планировщику или аналитику. Он предназначен для специалистов в экономической географии, региональном планировании, маркетинге и здравоохранении. Но его логика универсальна: везде, где люди выбирают между местами, работает пространственная математика.
Данные не лгут. Они умеют шептать на языке, который нужно учиться слышать. А карта – один из лучших переводчиков.