Время прочтения: 10 мин.

Доброго времени суток, Дамы и Господа!

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

ИМХО: компаниям из этой отрасли пришлось тяжелее всего.

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

  • Индекс OCR (Occupancy Cost Ratio) – это соотношение арендной платы к товарообороту. Согласно значения индекса OCR арендаторов делят на отдельные категории. Индекс OCR от 0 до 15 показывает, что арендатор прекрасно чувствует себя в торговом центре, арендаторы обозначаются зеленым цветом. Индекс от 15 до 30 показывает, что считается средним и обозначается желтым, а все, что выше этого показателя попадает в «красную зону». Красная зона сигнализирует о потенциальной дебиторской задолженности и возможной ротации оператора. Если арендатор на протяжении нескольких месяцев попадает в «красную зону», то существует большая вероятность его ухода из ТЦ.

Карта может представлять собой, как план ТЦ с раскрашенными арендаторами (выглядит красочно и наглядно, для собственника),

так и табличные данные (которые также раскрашиваются для наглядности).

Но раскрашивать и сравнивать арендаторов вручную не наш метод.

Рассмотрим, как на основе алгоритма машинного обучения можно провести предиктивный анализ «бегства» арендаторов из вашего ТЦ.

Строить модель будем на основе одного из трех простых алгоритмов: ближайших соседей, опорных векторов и XGBoost с использованием Python и библиотеки pandas, numpy, openpyxl, matplotlib, sklearn, xgboost.

Сначала необходимо подготовить выборку для обучения, у нас это OCR карты, построенные на основе арендного плана за 5 лет. В обучающую выборку включаем данные только по 12 месяцам, это обусловлено необходимостью подать равнозначное количество данных как в обучающую, так и в валидационную выборку. В датасет для обучения включены OCR-карты, построенные на исторических данных арендных планов, с исключением COVID-ного локдауна, с добавлением столбца «Для модели», в котором помечены закрытые торговые точки арендаторов цифрой «0», а работающие — «1», распределение закрытых и работающих торговых точек 50 на 50. Такое распределение задали, выбрав из OCR коэффициентов по торговым точкам арендаторов на данных арендного плана за 5 лет работы торгового центра.

При анализе ошибок первого и второго рода для бизнеса остановился именно на таком распределении потому, что ложноположительные предсказания ухода арендаторов не окажут вреда ТЦ. Поэтому разработанная модель будет предсказывать не уход конкретного арендатора, а что он останется в ТЦ. В итоге для обучения получился набор данных из 1500 строк (OCR-коэффициенты по 1500 арендаторам за 12 месяцев).

Импортируем библиотеки:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import openpyxl
from sklearn import svm

Загружаем и подготавливаем данные:

x = pd.read_excel("/home/…/для модели.xlsx")
y = pd.read_excel("/home/…/для модели.xlsx")
x_train = x
del x_train['id']
del x_train['Для модели']
x_train = x_train.fillna('0')

y_train=y[['Для модели']]
y_train = y_train.fillna('0')

x_train = x_train.values
y_train = np.array([y[0] for y in y_train.values])

Использование разных алгоритмов машинного обучения в коде отличается не значительно.

#метод опорных векторов
from sklearn import svm
#Задаем параметры модели
model = svm.SVC(kernel='linear', degree=2, C=1)
#Обучаем модель
model.fit(x_train, y_train)

#метод ближайших соседей
from sklearn.neighbors import KNeighborsClassifier
#Задаем параметры модели
model = KNeighborsClassifier()
#Обучаем модель
model.fit(x_train, y_train)
 
#Метод xgboost
import xgboost
#Задаем параметры модели
model = xgboost.XGBClassifier()
#Обучаем модель
model.fit(x_train, y_train)

Для сравнения алгоритмов машинного обучения рассчитали метрики и построили ROC-кривые. Код для построения ROC-кривых. Там же на этом сайте вы можете пополнить свои знания по библиотеке sklearn.

ROC-кривая (Receiver Operation Characteristic Рабочие характеристики модели)– это кривая вероятности, которая отображает отношение TPR (чувствительность/доля верно классифицированных положительных наблюдений = TP/(TP+FN)) к FPR (специфичность/доля неверно классифицированных негативных наблюдений = FP/(FP+TN)) при различных пороговых значениях. Площадь под кривой (AUC – Area Under Curve) является мерой способности классификатора различать классы. Чем выше площадь под кривой, тем лучше производительность модели.

Для теста модели был подготовлен датасет с OCR-картами за 5 лет работы торгового центра, с исключением пустых значений из-за различных локдаунов (OCR-коэффициенты по более 8000 арендаторам за 60 месяцев). В модель подавали данные карт за 12 месяцев, двигаясь по временной шкале от начала работы ТЦ, до предыдущего месяца от текущей даты. Это позволило нам хорошо протестировать модель и установить временной лаг предсказания. Лучше всего на тестовой выборке показывает себя алгоритм ближайших соседей, но все-таки задача спрогнозировать отток арендаторов из ТЦ, поэтому остановимся на методе опорных векторов, так как он предсказывает больше всего верных ответов по закрывающимся торговым точкам. Протестируем данный алгоритм на исторических данных по OCR картам, построенных на арендных планах по ТЦ в валидационной выборке, обучая на тестовой.

Загружаем данные для предсказания:

val = pd.read_excel("/home/…/OCR_2021_итог.xlsx")
#Удаляем не нужные столбцы (можно удалить и заранее)
del val['id']
del val['ИНН']
del val['Наименование арендатора']
# Предсказываем
val = val.fillna('0')
val = val.values
y_pred = model.predict(val)
pred2 = pd.DataFrame(y_pred)
pred2 = pd.DataFrame(y_pred)
pred1 = pd.DataFrame(val)
pred = pred1.join(pred2)
pred.to_excel('итог.xlsx', index= False)

Метрики на валидационной выборке по историческим данным получились следующие:

Как видно из метрик сильно просела полнота, и нам необходимо наложить предсказание на арендный план и посмотреть, какие ответы модель не смогла угадать.

ИМХО: анализ без визуализации – не анализ.

P.s.: График был построен для эстетических целей.

Для построения графика использовал две точечные диаграммы с наложением их одина на другую.  В качестве значения оси Х был выбран номер арендатора по порядку, в качестве оси Y – среднее значение коэффициента OCR, значения одинаковы для двух диаграмм. Первая диаграмма строится с цветовым обозначением фактических данных по закрытым и работающим торговым точкам (светло зеленым – работающие, прозрачным цветом — закрытые) Вторая диаграмма строился с цветовым обозначением предсказания модели по торговым точкам арендаторов (зеленым цветом – работает, красным – закроется). Очередность построения не будет иметь значения если задать цвет в формате RGB с указанием прозрачности в альфа канале — #33DD11AA. Эстетически мне больше понравилось, как выглядит наложение графиков:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel("Граф.xlsx")
plt.figure(figsize=(20,10))
colors_1 = np.where(df['Предсказание']=='Работает','green','red')
colors_2 = np.where(df['Факт']=='Работает','lightgreen', ' #33DD1100')
plt.scatter(x = df['№ п/п'], y = df['Средний OCR'],c = colors_2,s = 150)
plt.scatter(x = df['№ п/п'], y = df['Средний OCR'],c = colors_1,)
plt.show()

Так как загружаемые в модель данные основаны на простых показателях – выручке и арендных платежах арендаторов, то предсказания по работающим торговым точкам, с OCR-картами в диапазоне 1-10 и более 21, модель угадывает очень хорошо. Проблемы с предсказанием у модели возникают в диапазоне 11-20 значений OCR-карт в большинстве ошибкой второго рода (ложноотрицательная). Детально анализируя данные ошибки выявилась закономерность в части арендаторов, крупных федеральных сетей. Из-за конкуренции между собой многие сетевые магазины будут держать убыточную торговую точку, чтобы не пустить на это место конкурента.

(По сети гуляет фото, где две торговые точки одной федеральной сети расположены рядом друг с другом).

А также фирм, которые скрывают свою выручку перед арендодателем умышлено занижая ее, для уменьшения переменной части арендной платы.

Для исправления ошибки с сетевыми торговыми точками ввели коэффициент торговой сети, разбив всех арендаторов на 3 группы: федеральные, региональные и местные. Скорректировали OCR-карты на эти коэффициенты, уменьшив значение показателя OCR у федеральных и региональных арендаторов. Коэффициенты подбирались дольше, чем весь анализ. (Раскроем секрет: у местных коэффициент – 1, по региональным — 0,8, федеральным – 0,7).

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

После всех манипуляций наши метрики значительно улучшились:

Так как период данных для анализа был большой (более 5 лет), тестировали мы модель достаточно долго в разных временных промежутках, что позволило установить временной лаг предсказания. Модель предсказывает, что арендатор уйдет в течении 3-х месяцев, при увеличении лага – точность начинает падать. Метрики разнились в пределах 1-2%, что говорит – модель успешно справляется со своей задачей.

В конечном итоге загрузив данные OCR-карт, построенных на арендном плане за последние 12 месяцев мы получили предсказания ухода из нашего ТЦ 9 арендаторов в течении 3-х месяцев, с арендными платежами, которые составляют 8% от всего арендного потока. Данное предсказание дает нам время предпринять меры для сохранения арендного потока в полном объеме.

Так для чего нужна данная модель арендодателю, если по OCR-картам и так видно, как чувствует себя арендатор в ТЦ. Но изначально показатель OCR преследует 2 цели: поиск потенциальных арендаторов на еще занятое место в ТЦ и увеличение прибыли. Если индекс OCR низкий, то следует пересмотреть арендную ставку для этого арендатора в сторону повышения, также и в обратную сторону, при высоком значении индекса. При помощи модели мы можем виртуально менять арендную плату и смотреть как будет модель реагировать по данному арендатору, тем самым в непростой экономической ситуации максимизировать прибыль без значительного риска потерять часть потоков от арендных платежей.

В итоге, изменяя у некоторых арендаторов арендную ставку, модель предсказала, что мы можем увеличить арендный поток на 5% без риска оттока клиентов из нашего ТЦ.

Также модель позволяет обработать большой объем информации за очень короткое время, менее 5 минут потребовалось модели для прогнозирования по более 8 тыс. арендаторам, вручную провести анализ по тем же данным человеку потребуется значительно большее количество времени.

Позже модель была протестирована и на других ТЦ, метрики различались в пределах 1-2%, также подошли и коэффициенты, которые подбирались для сетевых арендаторов, что позволило сразу загружать данные в модель без предварительной настройки.

Так запустив модель 1 раз в месяц, мы получаем прогноз «бегства» арендаторов из всех наших ТЦ.

Успехов в решении задач!