logo
07 Авг 2020
5269

Чтобы выгодно спланировать поездку, нужен месяц: как в tripmydream решили эту проблему

Андрей Буренок BLOG

Основатель сервиса по поиску авиабилетов tripmydream

Многие из тех, кто только поверхностно знаком со сферой туризма и продажей авиабилетов в частности, могут искренне удивиться, зачем вообще здесь 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 % от реальной цены).

На этом этапе мы определили ключевые проблемы, с которыми не могла совладать модель:

  • Мы прогнозировали просто минимальную цену на заданный набор дат. При этом в эти даты авиакомпания могла выполнять несколько рейсов (или даже несколько десятков, если рейсы стыковочные), что значительно повышало разброс в данных.
  • Цена на авиабилет существенно зависела от открытых в продаже тарифов (эконом, эконом премиум, бизнес и так далее). Особенно влияли лоукост-тарифы МАУ, на которые цена отличалась в среднем в 3–5 раз относительно следующего тарифа по сетке. И такие тарифы могли открываться и закрываться довольно часто, при этом мы не учитывали этот признак тарифа.
  • Модель плохо предсказывала цены на маршрутах с нерегулярным расписаниям рейсов (когда авиакомпания летала только по определенным дням недели).

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

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

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

Цены мы получали помимо прогноза и из других источников:

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

Но именно прогноз помог нам увеличить количество доступных вариантов в 10 раз.

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

Через две недели мы уже получили первые результаты — модель на основе алгоритма Random Forest («Случайный Лес». Больше деревьев — более устойчивый лес. Так же алгоритм создает деревья решений для выборок данных, получает прогноз по каждой из них и выбирает лучшее решение, — прим. ред.) выполняла один цикл обучения и прогноза на 200 направлений примерно за 10 часов с точностью около 60 %.

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

Мы оптимизировали код и сократили время выполнения вдвое, что позволило нам увеличить количество дат и авиакомпаний в прогнозе. Но с количеством направлений мы решили остановиться на числе 200. Финальная версия отрабатывает 8 часов и генерирует 40 млн. цен за сутки с точностью около 85 %.

С чем мы столкнулись 

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

  • Цены могут меняться намного чаще и более гибко реагировать на статус заполненности того или иного рейса.
  • Стоимость рейса в обе стороны всегда состоит из суммы отдельных билетов в один конец туда и обратно.

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

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

Для более популярных направлений у нас было больше поисков в истории и, соответственно, больше цен в тренировочной выборке. Мы обратили внимание на то, что для направлений, по которым у нас было меньше данных, точность была очень низкой и нас не устраивала. Экспериментальным путем мы определили минимальный лимит в 10 000 цен в тренировочной выборке за две недели.

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

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

Типичный пример такого направления — Киев-Денпасар (Бали) или Киев-Бангкок. Увеличение объема данных в тренировочной выборке с 5 до 15 тысяч записей в таких случаях давало в среднем повышение точности прогноза на 5–10 %. 

Большое значение в работе над моделью сыграла очистка данных. Как бы ни было у нас автоматизировано получение цен от провайдеров, их обработка и сохранение, всегда есть риск получить некорректные цены (сбой в работе API, технические ошибки в тарифах, которые быстро исправлялись, завышенные тарифы от одного из провайдеров). Поэтому мы разработали алгоритм подсчета вероятности корректности цены, который позволял отфильтровать «подозрительные» цены.

Последним элементом пазла модели стал микро-сервис «Расписание». Чтобы прогнозировать цену на билет, нужно понимать, какие вообще есть билеты — какой рейс, по каким дням и в какое время летит.

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

Все эти модели в комплексе дали нам дополнительно, как я уже упоминал выше, около 40 млн. новых цен в сутки, что позволило увеличить количество живых поисков на сайте (на конкретное направление и даты) на 20%.

Разве Booking.com не дает цены сразу на все отели?

Как и в случае с перелетами, мы решили помочь пользователям с ответом на еще один важный вопрос — когда же ехать на отдых. Предположим, мы уже знаем, куда хотим отправиться, но все еще гибки в вопросе выбора дат. Если у вас есть диапазон в месяц, в обычных условиях вам нужно сделать 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 — это не панацея от всех бед и не решит все ваши проблемы, но вполне может умножить в разы ваши достоинства. Грамотное использование инструментов Data Science поможет вам найти ответы на многие вопросы, обогатить свои данные и получить новые выводы, которые трансформируются в сэкономленные средства или дополнительную прибыль. 

 

Этот материал – не редакционный, это – личное мнение его автора. Редакция может не разделять это мнение.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Вакансии компаний

РАЗМЕСТИТЬ ВАКАНСИЮ
ЗА 1600 ГРН

Директор по маркетингу и продажам

Компьютерная Академия ШАГ, Одесса

Scala Engineer

TRANZZO, Киев

ЕЩЕ 22 ВАКАНСИИ

Вдохновляющие компании

«Биосфера»

Мы производим и продаём почти все известные вам украинские товары для уборки, приготовления и хранения пищи и личной гигиены: от салфеток до таблеток для посудомоечных машин

AMC Bridge

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

AMC Bridge

Вакансии компаний

РАЗМЕСТИТЬ ВАКАНСИЮ
ЗА 1600 ГРН

Директор по маркетингу и продажам

Компьютерная Академия ШАГ, Одесса

Scala Engineer

TRANZZO, Киев

ЕЩЕ 22 ВАКАНСИИ

Спецпроект

Вдохновляющие компании-работодатели

ABM Cloud
«БИОСФЕРА»

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: