Как мы сервис помощник для водителей такси разрабатывали

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

В закладки

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

Не так давно наш основной конкурент опубликовал анонс супер умного помощника для водителей такси.

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

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

Иначе водители начинают кучковаться в более крупных районах города и из-за этого страдает вывоз остальных районов.

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

Хотя я думаю, что наш конкурент помимо анализа данных также отслеживает перемещение своих клиентов по gps, пока приложение не активно, но на мой взгляд основные данные он получает все-таки на основе прошлых поездок.

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

1. Анализ данных.

Мы начали вручную анализировать и проверять данные о заказах. Гипотеза подтвердилась. При отсутствии погодных аномалий и общественных событий ( о них чуть позже) распределение заказов в каждый день недели на 80% повторяет такой же день недели на прошлой недели.

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

2. Суть скрипта.

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

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

Например, делая запрос в четверг в 18:15, водитель получит данные о распределении заказов по городу в прошлый четверг в период с 18:15 по 18:35, для водителя это выглядит как прогноз распределения заказов на ближайшее 20 минут.

3. Отображение информации.

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

Всего было задействовано 7 цветов.

Красный, оранжевый, желтый, желто-зеленый, зеленый, темно-зеленый и фиолетовый. (про фиолетовый чуть позже).

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

4. День ночь и районы города.

Под каждый район города мы задали собственную сетку распределения цветов.

Так как в центре города машин всегда больше и 50-60 заказов за 15 минут это нормальный показатель, а 10 заказов за 15 минут - это крайне мало, чего не скажешь про какой-нибудь малонаселенный район города, в котором и машин и клиентов меньше, так мы избежали проблемы, в которой все машины начнут стекаться в центр города за максимальной активностью.

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

5. Аномалии и фиолетовый цвет.

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

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

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

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

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

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

Например: Если водитель делает запрос в четверг 16 мая, помощник обратится за данными для прогноза к 9 мая. На 9 мая у нас есть запись, для помощника это означает, что он обратится к следующему четвергу 2 мая, на котором также присутствует запись, следовательно прогноз будет строиться по данным за 25 апреля.

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

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

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

6. Тестирование и первые результаты.

К тестированию мы подключили небольшую группу из 55 водителей.

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

Точность прогнозов 70-80% в ночное время суток. (по нашим прогнозам это люди работающие в ночную смену, либо заканчивающие работу поздно ночью).

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

Через неделю доделаем записи аномалий и подключим к помощнику все остальные города.

Если интересно - напишу вторую часть, когда выкатим продукт для всех.

Вопросы asneggov@mail.ru

Телеграм alex_sneggov

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

Написать
{ "author_name": "Alex Emelianenko", "author_type": "self", "tags": [], "comments": 7, "likes": 3, "favorites": 5, "is_advertisement": false, "subsite_label": "marketing", "id": 80488, "is_wide": false, "is_ugc": true, "date": "Sun, 25 Aug 2019 10:00:56 +0300", "is_special": false }
0
{ "id": 80488, "author_id": 239473, "diff_limit": 1000, "urls": {"diff":"\/comments\/80488\/get","add":"\/comments\/80488\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/80488"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199113, "last_count_and_date": null }
7 комментариев
Популярные
По порядку
Написать комментарий...
3

"Всем привет, думаю многие знают, что я на основной своей работе занимаюсь развитием транспортной компании"
Зря так думаешь, вообще-то.

Ответить
0

Конечно зря. Как будто все на vc знают о его бизнесе.

Ответить
0

Ждём второй статьи!

Ответить
0

Как же много у людей свободного времени и ресурсов (

Ответить
0

Я бы купил, если не дорого.

Ответить
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "Article Branding", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cfovx", "p2": "glug" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Баннер в ленте на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "disable": true, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ] { "page_type": "default" }