Задача для аналитиков: повысить эффективность поиска

С объявлением итогов конкурса.

Материал подготовлен при поддержке сервиса Юла

«Юла» — это сервис, где пользователи выкладывают свои объявления. На нём продаются квартиры и самодельные украшения, готовый бизнес или услуги — практически что угодно.

Поиск — один из самых важных продуктов сервиса. К поисковой выдаче относятся как запросы с текстовым поиском, так и запросы на выдачу объявлений в определённой категории и подкатегории.

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

Взглянуть, как это работает, можно на сайте или приложениях iOS и Android.

В чём задача

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

В архиве — три CSV-таблицы. Это сырые логи запросов пользователей: как они искали объявления, какими фильтрами пользовались и связались ли с продавцами.

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

Расшифровка столбцов в таблицах

Условия и призы

На решение есть две недели: закончим принимать работы 28 октября в 23:59. Оценивать работы будет Егор Данилов, директор по продукту «Юлы». Он определит три лучших решения, прокомментирует свой выбор, а их авторы разделят призовой фонд следующим образом:

  • Первое место — 300 тысяч рублей.
  • Второе место — 200 тысяч рублей.
  • Третье место — 100 тысяч рублей.

Что конкретно делать

В этой задаче нет правильного ответа. Вам нужно представить собственное видение в виде текста на одну-две страницы. Можете добавить в него таблицы или иллюстрации, дать ссылки на код, а затем загрузить в эту форму:

или
Приём работ завершён
(function(d, w, ver) { var s = d.createElement('script'); s.src = 'https://www.google.com/recaptcha/api.js?' + ver; s.async = true; var container = d.getElementById('ula-form-wrapper'); if (container) { s.onload = function() { var ulaForm = d.querySelector('[data-ula-form]'), ulaFile = d.querySelector('[data-ula-file]'); if (!ulaForm) return false; var ulaInputs = [].slice.call(ulaForm.querySelectorAll('input')).slice(0, 3), ulaSubmitBtn = ulaForm.querySelector('[type="submit"]'); ulaInputs.forEach(function(ulaInput) { ulaInput.addEventListener('change', function(e) { ulaInput.parentElement.classList.remove('is-error'); }); }); ulaFile.addEventListener('change', function(e) { var textSpan = ulaFile.parentElement.children[1].children[0], svgIcon = ulaFile.parentElement.querySelector('svg'); textSpan.innerText = getFileName(ulaFile); if (svgIcon) svgIcon.remove(); }); ulaForm.addEventListener('submit', function(e) { e.preventDefault(); var response = (grecaptcha) ? grecaptcha.getResponse() : ''; if (!response.length) return false; if (ulaSubmitBtn.className.indexOf('is-loading') !== -1) { return false; } if (ulaSubmitBtn.innerText === 'Готово!') { ulaSubmitBtn.innerText = 'Отправить'; return false; } for (let i = 0; i < ulaInputs.length; i++) { ulaInputs[i].parentElement.classList.remove('is-error'); if (ulaInputs[i].value.length === 0) { ulaInputs[i].parentElement.classList.add('is-error'); ulaInputs[i].focus(); return false; } } ulaSubmitBtn.classList.add('is-loading'); var formData = new FormData(ulaForm); Promise.all([wait(), ajax(ulaForm.getAttribute('action'), formData)]).then(function(data) { var res = data[1]; ulaSubmitBtn.classList.remove('is-loading'); if (res && res.rm === 'Success') { ulaSubmitBtn.innerText = 'Готово!'; } else { } }).catch(function() { ulaSubmitBtn.classList.remove('is-loading'); }); }); function ajax(url, data) { return new Promise(function(resolve, reject) { var request = new XMLHttpRequest(); request.open('POST', url, true); request.setRequestHeader('X-This-Is-CSRF', 'THIS IS SPARTA!'); request.onload = function() { if (this.status >= 200 && this.status < 400) { var resp = this.response; resolve(JSON.parse(resp)); } else { reject(); } }; request.onerror = function() { reject(); }; request.send(data); }); } function getFileName(input) { var fullPath = input.value; if (fullPath) { var startIndex = (fullPath.indexOf('\\') >= 0 ? fullPath.lastIndexOf('\\') : fullPath.lastIndexOf('/')); var filename = fullPath.substring(startIndex); if (filename.indexOf('\\') === 0 || filename.indexOf('/') === 0) { filename = filename.substring(1); } return filename.slice(0, ); } } function wait() { return new Promise(function(resolve, reject) { setTimeout(function() { resolve(); }, 1000); }); } }; } d.body.appendChild(s); })(document, window, 5);

Помимо изменений, опишите, как будете оценивать результат эксперимента — на какие метрики будете смотреть и почему. Ещё нужно рассказать, что вы предпримите, если эксперимент уменьшит количество контактов по объявлениям.

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

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

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

  • Анализ данных.
  • Умение построить гипотезы на основе данных.
  • Аргументация решения, исходя из данных.
  • Визуализация предложенного решения.
  • Решение на случай, если предложенный эксперимент уменьшит количество контактов.

В результате в конкурсе победили:

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

Несколько комментариев по присланным работам:

  • Задача была для аналитиков. Отличных идей было много, но предпочтение отдавалось решениям, где данные стали основой. Неважно, это анализ датасета или опрос знакомых — приоритет таких работ был выше, чем у построенных на личном опыте.
  • Не все предложили сценарий на случай просадки метрик: часто озвучивался простой откат эксперимента. Но анализ неудачного эксперимента может дать хорошую пищу для дальнейших размышлений.
  • Многие справедливо писали, что ключевая метрика успеха – сделки, а не контакты. Но для анализа влияния на сделки участникам нужно было бы потратить значительно больше времени, поэтому мы упростили задание.
  • Многие уделили внимание технической стороне, но не менее важно понятно защитить свое решение: визуализировать его или логично вывести из анализа данных.

Общий срок проведения конкурса: с 14.10.19 по 18.11.2019 (регистрация участников до 28.10.19). Информация об организаторе, правилах, количестве призов, сроках, месте и порядке их получения — на этой странице.

0
239 комментариев
Написать комментарий...
Данил Черепанов

Интересно было бы посмотреть запросы которые задают пользователи, но 1) ексель пишет что файл слишком большой и открывается только его часть, и 2)
вот так выглядят строки в файле "D09AD180D0B0D181D0BDD0BED0B4D0B0D180D181D0BAD0B8D0B920D0BAD180D0B0D0B9 30313632666265376337646262666661 6637303136663335373937336235666230306430396564313862383039646332 5 1F6 other 1,0 1,0 " - так и должно быть?

Ответить
Развернуть ветку
Vladimir Galler

1) запросы обезличены, но запрос '123' == '123', и '23133324234534' != '12123', больше вам не хотят показывать
2) У  csv  фаилов надо обозначать разделитель, может у вас сбилось это 
3) Измените использование памяти excel или воспользуйтесь другими инструментами, чтобы открыть этот фаил

Ответить
Развернуть ветку
Stas Kostenkov

разделитель в файлах - знак таббуляции, в pandas будет sep='\t'

Ответить
Развернуть ветку
Антон Романов

А я думал запросы закодированы, т.к. region_id явно url кодировка.

Ответить
Развернуть ветку
Vladimir Galler

может быть, но по большому счету, какая разница?

Ответить
Развернуть ветку
Антон Романов

да, разницы никакой

Ответить
Развернуть ветку
Vladimir Galler

Хмм

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