Всем привет! Меня зовут Саша и я занимаюсь продуктовой аналитикой в Циан. В этой статье я расскажу, как аналитик без привлечения ML может создать ключевую ценность для информационного SaaS-продукта.    В Циан я пришел в конце 2020 в направление коммерческой недвижимости. За несколько месяцев до этого команда начала работу над амбициозной задачей – разработкой нового продукта CRE.Space (commercial real estate space) для профессионалов рынка коммерческой недвижимости, который позволил бы пользователям получать самую полную и достоверную информацию об объектах: технические характеристики, прямые контакты собственников и управляющих компаний,  вакантные площади и др. Над продуктом уже трудились 2 команды: разработчики и операционная команда. Операционщики уже несколько месяцев собирали данные по офисам и складам в Москве и МО для запуска MVP. Когда данные были собраны, мы увидели, что из них можно извлечь дополнительную ценность для клиентов. Мы изучили международные бенчмарки, провели UX-исследования и выделили 3 ключевые аналитические задачи: мониторинг изменений стоимости объекта, подбор похожих объектов (с возможностью сравнивать динамику цен), анализ эффективности собственных размещений пользователя на рынке и сравнение с конкурентами. Кроме данных, нам также были необходимы простые и понятные инструменты, которые позволили бы нашим клиентам получать аналитические выводы в пару кликов. Уже в первом приближении стало понятно, что нам понадобятся ресурсы аналитиков и ML, чтобы прописать логику и алгоритмы для решения этих задач. Но выделить дополнительные ресурсы под задачи стартапа, который находится на этапе MVP, внутри крупной компании (Циан) – это долго и дорого. Тогда я решил взять  эти задачи на себя, хоть они и сильно отличались от моего основного фокуса в компании (я же все-таки продуктовый аналитик =) ). Мне давно хотелось сделать что-то, что могло бы принести ценность напрямую конечным пользователям. Мою инициативу поддержали. Для меня эти задачи стали новым вызовом, а CRE.Space мой вклад помог быстрее зарелизить новый крутой функционал. Не буду детально останавливаться на технической реализации, чтобы не превращать статью в лонгрид. В каждой задаче были свои тонкости, но в целом никакого rocket science не было. Давайте просто пробежимся по задачам на уровне идей. Для решения этой задачи нужно было по координатам смапить объявления, опубликованные на Циан, с объектами СRE.Space. Кроме того, следовало взять медианную цену из всех активных объявлений, которые получилось привязать к объекту, и предварительно очистить от выбросов относительно рыночных цен (т.е. цен из всех активных объявлений на период в определенной категории). Категория объявлений представляет собой набор из четырех параметров: тип сделки (аренда / продажа), тип объекта (офис / склад), класс объекта (A / B / C / без класса) и регион. Например, аренда офисов класса А в Москве. Каждой категории соответствует диапазон цен, которые изменяются в динамике вместе с рынком. Соответственно, для каждой категории требовалось разработать свой алгоритм очистки от выбросов. Что и было сделано 😎. Пообщавшись с клиентами, мы выяснили, что расположение объектов в непосредственной близости друг от друга является для них обязательным («строгим») критерием «похожести».  Чтобы определить кластеры из ближайших по координатам объектов, вначале я применил DBSCAN-кластеризацию. Но это было только начало. Следующий шаг – найти наиболее похожие друг на друга объекты внутри каждого кластера. Для этого нужно было определить фичи для выделения похожих объектов, применить к ним one-hot encoding и посчитать матрицу расстояний между всеми элементами каждого кластера. Отмечу, что ранее я использовал методы из sklearn для задач продуктовой аналитики (например, k-means для сегментации пользователей). Но это были коробочные истории. Здесь же пришлось погрузиться глубже и фактически написать кастомную кластеризацию на numpy. В итоге я узнал, как изнутри работают некоторые функции sklearn. Например, что находится под капотом у pairwise_distances() и что такое расстояние Минковского.  Так как наша операционная команда собрала максимально полные данные по каждому объекту, у нас чесались руки заложить их все в получившийся алгоритм. Но когда мы в первый раз прогнали алгоритм из 20+ критериев (технических характеристик), мы столкнулись с проблемой размерности матрицы: из-за использования большого количества фич менее значимые критерии перебивали более значимые. Например, схожие «высота потолков» и «тип перегородок в здании» вместе перебивали такой важной критерий, как «расстояние до метро».  Мы решили сократить размерность матрицы путём отбора наиболее информативных и ценных для юзеров признаков. Признаки выбирали экспертно и из UX-интервью. Сократив количество признаков и уменьшив размерность матрицы, мы получили эффективный алгоритм, который на выходе отдавал по каждому объекту вектор из id наиболее похожих на него объектов. Кроме того, перед нами стоял моральный выбор, добавлять ли в алгоритм «цену» как один из критериев «похожести». С одной стороны, «цена» – очень важный критерий, но с другой – его использование в алгоритме не позволило бы сравнивать между собой объекты по цене (так как в каждой группе похожих уже и так были бы объекты с похожей ценой). В итоге решили не добавлять «цену» в список фичей, а дать пользователям дополнительный функционал, объединив алгоритм поиска похожих объектов с динамикой медианной цены (из задачи 1). Это позволило пользователям сравнивать, как отличается цена объекта от средней медианной цены объектов, похожих на него по другим критериям. Мы хотели дать расширенную статистику пользователям в профессиональном личном кабинете, при этом добавить агрегацию по субаккаунтам на уровне мастер-аккаунтов, чтобы руководитель агентства недвижимости мог видеть общую эффективность по всем своим сотрудникам. Такого функционала сильно не хватало на основном Циан.  Кроме того, мы решили добавить анализ эффективности (стоимость просмотров и других целевых действий) и дать возможность сравнить эффективность по обычным объявлениям и по объявлениям с продвижением. Это тоже было суперполезно для пользователей.  Следующий этап – дать клиентам киллер-фичу. Такой фичей стало «сравнение с конкурентами», т. е. возможность сравнивать свою эффективность по объявлениям со средними показателями в сегменте. Тут недостаточно было использовать сегментацию просто по типу сделки, типу объекта, классу и региону.  Важно было сравнивать сравнимых между собой пользователей: крупных игроков с крупными, а частных маклеров и представителей SMB-сегмента с частными игроками и smb. Для этого добавили еще бакетирование (Bucketing) по количеству объявлений в каждом сегменте.  Чтобы определить сегмент в каждой категории и выводить для каждого клиента средние данные в сегменте, к которому он относится, мы выделили пять параметров: тип сделки, тип объекта, класс объекта, регион пользователя и бакет, в который попадает пользователь с точки зрения количества размещенных объявлений в категории.   Чтобы минимизировать трудозатраты разработчиков, я поставил свои скрипты для всех трех задач на расписание через Bitbucket. И теперь новые данные ежедневно записываются в соответствующие витрины в Hive. Таким образом, на бэке оставалось только реализовать ручку, которая будет регулярно забирать данные из моих витрин. А вся логика и алгоритмы были реализованы на уровне моих скриптов, что позволило на несколько месяцев сократить time-to-market нового функционала.   В этой статье я не рассказываю о каких-то прорывных аналитических методах и алгоритмах. Главная мысль, которую я хочу донести, – не нужно бояться проявлять инициативу и брать на себя задачи, которыми вы никогда не занимались или которые выходят за рамки вашего основного функционала. Это будет полезно и вам, и компании. Лично для меня задачи, которые я решал в рамках этого проекта, помогли сильно прокачать продуктовое мышление и вырасти как продуктовому аналитику. Потому что все эти задачи требовали встать на точку зрения конечного пользователя, а не просто твоего бизнес-заказчика. Считаю, что для продуктового аналитика это крайне важный скилл в современных реалиях – быть полноценным игроком в продуктовой команде. Не просто обрабатывать данные, считать циферки и строить графики, а мыслить в категориях продукта и понимать его ценность для клиента. В итоге CRE.Space успешно запустился в июне 2021, активно наращивает аудиторию, а в декабре того же года даже начал приносить первую выручку. И я очень горжусь, что внес вклад в создание крутого продукта, аналогов которому пока нет на российском рынке.