{"id":14276,"url":"\/distributions\/14276\/click?bit=1&hash=721b78297d313f451e61a17537482715c74771bae8c8ce438ed30c5ac3bb4196","title":"\u0418\u043d\u0432\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0439 \u0442\u043e\u0432\u0430\u0440 \u0438\u043b\u0438 \u0443\u0441\u043b\u0443\u0433\u0443 \u0431\u0435\u0437 \u0431\u0438\u0440\u0436\u0438","buttonText":"","imageUuid":""}

Улучшение поиска врачей на сайте DocDoc

Привет! Я Женя Гурьянов, Chief Product Officer в компании DocDoc. В своих статьях я рассказываю, как внедрять и развивать «поиск» в продуктах. В этой статье я расскажу, как мы улучшали поисковую выдачу врачей на сайте DocDoc.

В первой статье я рассказываю про то, как наполнять бэклог развития «поиска» в продукте и как приоритизировать поисковые задачи.

Во второй статье я даю ответы на вопросы:

  • Что такое релевантность?
  • Как построить поиск книг в электронной библиотеке?
  • Как построить поиск объявлений в онлайн-классифайде?

В третьей статье мы разбираемся с метриками поисковой выдачи, офлайн- и онлайн-оценками выдачи.

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

Поиск врачей на сайте DocDoc

Для читателей, которые не знакомы с продуктом DocDoc Запись к Врачу, я немного расскажу про него ниже.

Допустим вы хотите найти Невролога в Москве.

Вы заходите на сайт.

Вводите специальность врача - [невролог]. Можете выбрать метро, но пока ограничимся поиском по всей Москве.

Итак, в Москве найдено 3619 неврологов:

Вот так выглядит выдача:

Поставим продуктовые цели

Давайте сейчас с вами попробуем спроектировать Лучшую выдачу для пользователя!

Цель: помогать пользователям находить врача эффективнее.

Но какой показатель нам скажет о том, что пользователи стали более успешно находить врачей? Конверсия из трафика в запись к врачу.

Приоритизация доработки

Допустим, мы посмотрели, какой процент пользователей сайта и приложений пользуется поиском - 60-70% от всего трафика на сайт.

Также мы посмотрели, какой процент записей приходит с выдачи врачей - 70-80% от всех записей.

Кажется, что тема довольно-таки приоритетная.

Для наилучшего понимания поведения пользователей посмотрим, какой процент пользователей использует поиск только по специальности без дальнейшего уточнения запроса. Это 50% пользователей. Другая половина пользователей уточняет запрос: гео, детские врачи, выезд на дом, сортировки (стаж, отзывы, рейтинг).

Какие факторы могут влиять на выбор врача

Факторы, влияющие на конверсию пользователя из поиска врача в запись:

  • Фото
  • Пол врача
  • Цена приема
  • Рейтинг
  • Есть ли научная степень у врача
  • Опыт в годах
  • Отзывы о враче
  • Бренд клиники
  • Доступное время приёма
  • Расположение клиники (гео)
  • Стаж врача
  • Удобство записи (есть врачи с онлайн слотами, есть с отправкой формы-заявки, также записаться можно, позвонив по телефону)
  • Скидка
  • ещё что-то, о чем мы не знаем

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

Построение модели

Наша модель должна принять на вход для каждого запроса и врача набор признаков, взвесить эти признаки и на выходе выдать некий ранк (скоринг) для врача.

По сути, модель должна предсказывать конверсию в запись к данному врачу.

Будем использовать линейную регрессию:

Самое главное теперь - это найти и подготовить данные для обучения. А конкретнее: поставить в соответствие Входным данным (признакам) - Выходные данные (реальные исторические конверсии по специальностям).

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

Так как 25% пользователей записываются с первой позиции и 50% с первых трех, мы решили для упрощения задачи брать данные при записи с первой позиции. То есть если при запросе специальности врач с конкретными характеристиками был на первой позиции, то смотрим какой процент пользователей записался к нему (конверсия с первой позиции).

Трудности и допущения

  • У нас в базе хранится состояние рейтинга врача на сегодня. Мы не знаем исторические данные по рейтингу. Предположение: рейтинг меняется медленно (на самом деле это так).
  • Мы не храним исторические данные по количеству отзывов. Только состояние на сегодня. Предположение: количество отзывов меняется медленно и накопившаяся за полгода дельта повлияла не сильно.
  • Не храним историю по скидкам на первичный прием. Решение: используем цены без скидок (предполагаем, что на длительном лаге влияние сгладится).

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

Решение: кластеризуем врачей по похожести друг на друга в терминах ранее обозначенных признаков. Получаем 70 кластеров врачей.

Вот пример врачей, которые попали в 1 кластер:

Мужчины, дешёвый приём, мало отзывов, средний стаж, средний рейтинг, без учёной степени...

Далее смотрим на конверсию по таким вот кластерам. Обучаем модель.

При обучении модели на вход подаются признаки врача, на выход - конверсия по кластеру.

В итоге имеем обученную регрессионную модель для предсказания по признакам конверсии в запись для каждого из врачей.

Офлайн проверка

В процессе обучения мы что-то откинули, что-то упростили. Теперь нам очень интересно, отражает ли полученная нами модель реальность. Для этого мы использовали попарное сравнения врачей с помощью асессоров в Яндекс.Толоке. В одной из предыдущих статей я уже писал про офлайн проверку, в частности, про попарный подход.

Мы создали задание для асессоров, которое выглядело следующим образом:

Каждую пару оценивали 100 асессоров.

По итогу офлайн проверки оказалось, что вероятность выбора определенного врача оказывается пропорциональной его скору в модели. То есть наши предсказания совпали с оценкой асессоров. Коэффициент детерминации R^2>0,9.

Что дальше?

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

Сейчас мы уже проводим онлайн тестирование полученной нами модели на реальных пользователях. В АБ тесте мы разделили пользователей на 2 группы:

  • контрольную 50%
    видят старую выдачу, в которой руками на основе экспертного мнения прописано последовательное бинарное влияние нескольких факторов:
    - если признак 1 равен определенному набору значений, то такие врачи выше в выдаче, остальные идут вниз
    - переходим ко второму признаку; если признак 2 равен определенному набору значений, то такие врачи становятся выше среди тех, кто прошел вверх по признаку 1 и тд
    Это некое дерево решений, построенное экспертом.
    К сожалению, все нюансы текущей выдачи раскрывать не могу.
  • тестовую 50%
    видят новую выдачу, описанную в статье выше.

Будем сравнивать в первую очередь конверсию в запись к врачу.

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

Ждите новых продуктовых историй!

0
1 комментарий
Denis Kiselev

Обычная история такая - у пациента есть симптомы, какая то проблема - но он не до конца уверен к какому врачу следует идти.

Ответить
Развернуть ветку
-2 комментариев
Раскрывать всегда