Многие из тех, кто только поверхностно знаком со сферой туризма и продажей авиабилетов в частности, могут искренне удивиться, зачем вообще здесь Data Science (набор конкретных дисциплин из разных направлений, отвечающих за анализ данных и поиск оптимальных решений на их основе — прим. ред.) — берешь все доступные билеты (туры, отели) и продаешь.
Но все, как известно, кроется в деталях. Именно Data Science может вам помочь сделать решающий прорыв там, где вы, казалось, уже все перепробовали.
В tripmydream мы используем Data Science для разных целей:
Каждая модель строится на данных, алгоритмах и нашем понимании бизнеса, в данном случае путешествий.
Мы начали развивать Data Science инструменты в tripmydream сразу, как только основали этот стартап. В январе 2013 года мы с женой проводили время на итальянском горнолыжном курорте. Там я в очередной раз столкнулся с отсутствием единого источника достоверной и полезной информации для путешественников.
Я провел несколько исследований и пришел к выводу, что более чем половине путешественников трудно найти подходящие цены на отель и перелёт. Чтобы запланировать и выгодно оплатить поездку, им приходится посещать десятки сайтов в течение 20–30 дней. Эта проблема и подтолкнула создать сервис, который взял бы на себя эту работу.
Партнером по бизнесу стал Тарас Полищук, талантливый программист. А первыми инвестициями стали деньги, полученные от продажи квартиры в Киеве. Сервис мы разрабатывали больше года — писали код, внедряли алгоритмы, рисовали дизайн и собирали информацию о городах и курортах.
В базу данных «забивали» буквально все, что может заинтересовать путешественника: начиная от стоимости чашки кофе, условия работы подъемников на горнолыжном курорте, какой пляж на морском курорте — песок или галька, какая будет температура воды, когда турист туда приедет.
Сервис tripmydream мы запустили в мае 2015 года, первыми клиентами были мои друзья, а потом заработало «сарафанное радио» и социальные сети. Меньше чем через год ежемесячная посещаемость сайта составила треть миллиона человек.
Теперь туристу не нужно было выискивать билеты под нужные даты, читать на форумах отзывы об отелях — он лишь указывал дату и бюджет поездки, а программа сама формировала наиболее оптимальные варианты путешествия и еще с погрешностью в 10% определяла его стоимость.
Вот эта модель рекомендации самого выгодного пакета «перелет + отель» и модель прогноза цены на перелет стали нашими первыми AI-фишками (Artificial Intelligence, искусственный интеллект — прим. ред.). Именно с ними мы выиграли свою первую награду — в 2016 году tripmydream признали лучшим трэвел-стартапом на международном конкурсе Seedstars Summit 2016, который проходил в Швейцарии.
Когда вы только начинаете планировать свой отпуск, часто начинаете с вопроса «Куда лететь?». Наш сервис сразу может помочь ответить на этот вопрос.
Рекомендационная модель обрабатывала данные о том, что раньше чаще всего выбирали пользователи tripmydream, ранжировала на лету около миллиона предложений:
Система предлагала лучшие варианты, клиент мог применять разные фильтры. Так мы помогали пользователю определиться с выбором.
Как показал А/В тест в дальнейшем, конверсия в переход на страницу покупки билетов, когда рекомендованные предложения отображались по умолчанию, была в среднем на 10% выше, чем при отображении самых дешевых. Сейчас модифицированная версия этой модели используется для рекомендации при поиске авиабилетов.
Гораздо более комплексной задачей оказалось прогнозировать цены на авиабилеты.
Для начала вкратце расскажу, что не так с ценами на авиабилеты и зачем вообще их прогнозировать, если они, казалось бы, легкодоступны.
Все регулярные авиакомпании хранят свои тарифы и правила ценообразования в глобальных системах бронирования GDS (Global Distribution System), таких как Galileo, Amadeus, Sabre и других. В момент, когда пользователь ищет билет, на сайте сервиса-агрегатора билетов инициируется запрос в GDS, который на лету формирует список всех доступных вариантов перелета между двумя городами на заданные даты.
Количество таких вариантов — несколько тысяч на один запрос. И, самое важное, — вы не можете одновременно запросить цены на диапазон дат или на список направлений. Одно направление на одну пару дат (дата вылета туда и дата вылета обратно или же просто дата вылета туда в случае перелета в одну сторону) — один запрос. Хотите получить цены на другие даты — новый запрос.
Каждый такой запрос для GDS порождает нагрузку на серверные и вычислительные мощности, поэтому они строго следят за тем, как сервисы, которые продают билеты, используют эти запросы и устанавливают лимиты на соотношение количества запросов к количеству продаж.
Условно говоря, если у вас на сайте 1 000 пользователей сделали по одному поисковому запросу (на конкретные даты и направление), вы должны продать минимум один билет. На 10 000 запросов — 10 билетов и так далее. Если за месяц ваше соотношение проданных билетов к количеству запросов в GDS меньше требуемого, вам могут снизить размер комиссии, наложить штрафы или вообще отключить от системы, в зависимости от условий договора.
Поэтому, если мы хотим предложить пользователям выбор из разных направлений, пусть даже на фиксированные даты, мы не можем сделать одновременно 1 000 запросов. И тут на помощь нам приходит прогнозирование.
Начинали мы с простой модели линейной регрессии, которая использовала такие параметры: сезонность, время до вылета, дни недели вылета и возвращения, авиакомпания, количество стыковок. Модель могла прогнозировать почти любые направления, но имела точность всего около 70 % (под точностью мы подразумеваем погрешность прогноза не более 10 % от реальной цены).
На этом этапе мы определили ключевые проблемы, с которыми не могла совладать модель:
Кроме этого, анализ поведения и потребностей пользователей сервиса дал нам еще один важный вывод: многим путешественникам важно знать детали перелета уже тогда, когда они подбирают варианты на разные даты, поэтому наш прогноз самого дешевого билета уже становился не актуальным.
В новой версии сервиса, которая увидела свет в мае 2019 года и предлагала поиск билетов на гибкие даты и направления, мы решили отказаться от старой модели прогноза и начать работу над новой — моделью прогноза цены на конкретный билет.
Ключевая задача — покрыть ценами максимально возможное количество потенциальных запросов от пользователей. Сначала мы хотели покрыть вообще все варианты, но по ходу работы цель немного изменилась.
Цены мы получали помимо прогноза и из других источников:
Но именно прогноз помог нам увеличить количество доступных вариантов в 10 раз.
Мы начали с мозгового штурма по всем известным нам принципам ценообразования и выделили больше 100 возможных фичей, среди которых были даже стоимость топлива, количество мест в самолете и расстояние между аэропортами по прямой. Еще мы накопили и загрузили в модель больше 10 млрд. цен на авиабилеты.
Через две недели мы уже получили первые результаты — модель на основе алгоритма Random Forest («Случайный Лес». Больше деревьев — более устойчивый лес. Так же алгоритм создает деревья решений для выборок данных, получает прогноз по каждой из них и выбирает лучшее решение, — прим. ред.) выполняла один цикл обучения и прогноза на 200 направлений примерно за 10 часов с точностью около 60 %.
Мы поняли, что прогнозировать все не получится, потому что сам процесс прогноза не происходит мгновенно, и нам придется искать баланс между затратами на вычислительные мощности и количеством спрогнозированных цен.
Мы оптимизировали код и сократили время выполнения вдвое, что позволило нам увеличить количество дат и авиакомпаний в прогнозе. Но с количеством направлений мы решили остановиться на числе 200. Финальная версия отрабатывает 8 часов и генерирует 40 млн. цен за сутки с точностью около 85 %.
Прежде всего, это прогнозирование цен на лоукосты. Характер ценообразования для лоукост-авиакомпаний отличается от регулярных прежде всего по двум пунктам:
В процессе анализа нашей модели мы пришли к выводу, что нельзя одной моделью покрыть и регулярные, и лоукост рейсы. Поэтому для прогноза лоукостов мы построили отдельную модель, которая прогнозировала исключительно прямые рейсы в один конец.
Кроме того, точность прогноза зависела от направления перелета и объема тренировочной выборки по нему. На каждом направлении есть своя специфика ценообразования (продолжительность маршрута, авиакомпании, имеющие квоту на перелеты, в том числе лоукосты, стоимость аэропортовых сборов). Мы разбили тренировочную и тестовую выборки по направлениям и запускали модель для каждого направления отдельно.
Для более популярных направлений у нас было больше поисков в истории и, соответственно, больше цен в тренировочной выборке. Мы обратили внимание на то, что для направлений, по которым у нас было меньше данных, точность была очень низкой и нас не устраивала. Экспериментальным путем мы определили минимальный лимит в 10 000 цен в тренировочной выборке за две недели.
При выборе направлений для прогноза учитывались два фактора — сколько у нас есть по нему цен и насколько хорошо это направление продается. Эти показатели коррелируют между собой, но они не равны.
Есть направления, на которых преобладают лоукосты, и на них много не заработаешь. А есть более дорогие направления, где один проданный билет может окупить 10 других направлений с тем же количеством поисков. Поэтому, если у нас в список направлений для прогноза попадало потенциально прибыльное направление, по которому на нашем сайте было сравнительно немного поисков, мы задействовали другие каналы получения данных — кэш других провайдеров и самостоятельное комбинирование билетов.
Типичный пример такого направления — Киев-Денпасар (Бали) или Киев-Бангкок. Увеличение объема данных в тренировочной выборке с 5 до 15 тысяч записей в таких случаях давало в среднем повышение точности прогноза на 5–10 %.
Большое значение в работе над моделью сыграла очистка данных. Как бы ни было у нас автоматизировано получение цен от провайдеров, их обработка и сохранение, всегда есть риск получить некорректные цены (сбой в работе API, технические ошибки в тарифах, которые быстро исправлялись, завышенные тарифы от одного из провайдеров). Поэтому мы разработали алгоритм подсчета вероятности корректности цены, который позволял отфильтровать «подозрительные» цены.
Последним элементом пазла модели стал микро-сервис «Расписание». Чтобы прогнозировать цену на билет, нужно понимать, какие вообще есть билеты — какой рейс, по каким дням и в какое время летит.
На основании все тех же данных о билетах на будущие рейсы и информации обо всех совершенных коммерческих перелетах в мире за прошедший день мы построили еще одну модель, которая с точностью в 98 % предсказывает, когда и во сколько будет лететь определенный рейс — даже на даты, на которые у нас раньше не было поисков.
Все эти модели в комплексе дали нам дополнительно, как я уже упоминал выше, около 40 млн. новых цен в сутки, что позволило увеличить количество живых поисков на сайте (на конкретное направление и даты) на 20%.
Как и в случае с перелетами, мы решили помочь пользователям с ответом на еще один важный вопрос — когда же ехать на отдых. Предположим, мы уже знаем, куда хотим отправиться, но все еще гибки в вопросе выбора дат. Если у вас есть диапазон в месяц, в обычных условиях вам нужно сделать 30 отдельных запросов. Но когда у вас нет времени и ресурсов делать запросы на все даты и направления, на помощь опять приходит модель прогноза.
Мы пошли по проторенной предыдущей моделью дорожке. И в случае с отелями результат получился даже более высоким. С одной стороны, сыграло роль то, что цены на подавляющее большинство отелей в отличие от перелетов не меняются так часто. Но с другой — мы в очередной раз убедились, как важно понимать, как работает бизнес в сфере, где вы пытаетесь что-то прогнозировать. И что один из важнейших этапов в построении модели — feature engineering (конструирование признаков).
В случае с отелями создание одной новой «фичи» путем простой арифметической операции над двумя уже существующими позволило сразу поднять точность модели на 20 %. В финальном варианте модель за два часа прогнозирует пять млн. предложений с точностью 90 % на погрешности 10 % и с точностью 85 % на погрешности 5 %.
А что, если путешественник знает, куда лететь, когда лететь, но предложенная цена кажется завышенной? И на этот вопрос мы также стараемся дать ответ. Мы уже начали работу над новой моделью, которая может спрогнозировать, как изменится цена на конкретный авиабилет в ближайшие 14 дней — вырастет, упадет или останется неизменной.
К сожалению, почти полная остановка полетов лишила нас данных, поэтому работу над моделью пришлось приостановить, но мы с оптимизмом смотрим на ее перспективы уже в ближайшем будущем.
Мы регулярно анализируем поведение и потребности наших пользователей. И в какой-то момент решили, что нужно это делать в режиме реального времени. Для этого мы начали работать над моделью предсказания поведения пользователей. Когда мы будем понимать, насколько близок пользователь к покупке, сможем правильно выстроить коммуникацию с ним, чтобы подвести к покупке или сохранить его лояльность на будущее. Эта задача свелась к прогнозированию вероятности того, что пользователь совершит целевое действие. В нашем случае целевое действие — это покупка авиабилета или перенаправление на сайт партнера.
Начали с простого: собрали всю информацию о пользователях, которая у нас есть. Это история поисков и покупок каждого пользователя, все его клики на сайте, девайс и источник, откуда пользователь попал на сайт.
Мы сразу определили, что для настройки дальнейшего взаимодействия с пользователем может потребоваться несколько моделей. Первая модель будет предсказывать вероятность, с которой клиент будет совершать целевое действие в реальном времени, а вторая будет предсказывать, что пользователь вернется совершить целевое действие не более чем через N дней. Соответственно, для каждой из этих моделей подход немного отличается, но в целом суть не меняется.
На этапе анализа данных мы сразу столкнулись с проблемой, что у нас очень много новых пользователей. Это в первую связано с тем, что каждому новому устройству мы присваивали новый хэш (англ. hash function от hash — «превращать в фарш». Преобразует массив входных данных произвольной длины в выходную строку установленной длины, — прим. ред.), а ведь один и тот же пользователь может заходить с разных устройств и браузеров.
Мы начали разрабатывать алгоритм, как можно объединить заходы пользователя с разных устройств. Для пользователей, которые активно пользуются сервисом, подписываются на рассылки и оповещения о новых ценах, нам удалось идентифицировать несколько их устройств. В итоге, для 40 % хэшей удалось найти как минимум еще одно совпадение, благодаря чему мы получили более полную картину поведения пользователей.
На основе наших данных нам удалось построить базовую модель предсказания вероятности, с которой пользователь совершить целевое действие в ближайшие N дней. Возник вопрос: как оценивать модель?
Оценивать по обычной точности мы не можем, наши классы очень несбалансированные (до этапа покупки билета доходит небольшая часть пользователей). В нашей задаче не так страшно совершить ошибку второго рода (предсказать что пользователь не купит билет, а он в итоге его купит), поэтому можно в самом простом варианте оценивать, какое количество верно положительных прогнозов среди общего количества положительных прогнозов. На первом этапе этот показатель составлял около 75 %.
Результат был неудовлетворительным. Мы проанализировали, на чем модель чаще всего ошибалась, и обнаружили, что есть существенная разница между поведением пользователя, который переходит на сайт партнера с лоукост-тарифами и пользователя, который собирается купить несколько билетов для семьи на другой континент. И время, которое им требуется для принятия решения также разное.
Первые были более склонны к покупке, но почти не приносили прибыли. Вторые покупали в среднем после пяти заходов на сайт, но их средний чек был существенно выше. Поэтому мы решили разделить пользователей на категории по «прибыльности» (не приносят прибыль, средний чек в среднем до $100, средний чек $100-300, средний чек 300-500$, средний чек $500–1 000, средний чек свыше $1 000) и переопределить свою целевую переменную – теперь мы прогнозируем, в какую категорию попадет наш пользователь.
Так мы подобрали свою целевую переменную, которая лучше описывалась исходными данными, при этом не допуская переобучения. В конечном итоге наша точность прогнозирования в среднем составила 85 %.
Data Science — это не панацея от всех бед и не решит все ваши проблемы, но вполне может умножить в разы ваши достоинства. Грамотное использование инструментов Data Science поможет вам найти ответы на многие вопросы, обогатить свои данные и получить новые выводы, которые трансформируются в сэкономленные средства или дополнительную прибыль.
Открыть успешный бизнес в Америке довольно просто. Это ежегодно делают сотни тысяч иммигрантов. В этой…
Если бы вы спросили об оценке кампаний в социальных медиа несколько лет назад, то, вероятно,…
В начале 2023 года на Etsy было зарегистрировано более 55 тыс. предпринимателей из Украины. Но,…
Сейчас моя компания делает бриллиантовые украшения для более ста магазинов по Украине. У нас есть…
Привлекательность Китая падает, а мировые фонды избегают Поднебесной во всех классах активов – об этом…
Вера Ворон, соосновательница MC.today, сейчас развивает агентство Creators Agency по продуктовому маркетингу для IT и…