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

Задача, которая здесь описана может быть хорошим упражнением для начинающих аналитиков. Тут будет всё: и python c pandas и парсинг HTML и регулярные выражегия и базы данных c SQL.

Добываем информацию

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

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

После выбора нужных писем, а именно тех, что пришли от отправителя taxi.yandex.ru сразу сталкиваемся с проблемой. Яндекс периодически меняет структуру своих отчетов. Однако, глобально структура поменялась один раз, в этом году. До этого вся информация о поездке была просто в виде сплошного текста, сейчас она сформирована в виде таблицы. Поэтому пришлось написать две отдельных функции для извлечения информации: если письмо содержит информацию в виде сплошного текста, просто находим нужные сведения с помощью регулярных выражений по маскам; если в виде таблицы, то парсим HTML код письма с помощью beautiful soup. Полученные данные загружаем в датафрейм и облачную базу данных для того, чтобы потом не приходилось при каждом запуске заново шерстить весь ящик.

Смотрим поездки

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

На графике ниже видно, как поездки со временем дорожают.

Изменение стоимости поездок со временем
Изменение стоимости поездок со временем

А на графике ниже изображена гистограмма поездок по времени вызова. Видно, что на такси я обычно еду либо на работу, либо с работы, но если на работу я всегда выезжаю в одно и то же время, то с нее я уезжаю по-разному.

Узкий пик - выезд на работу, широкий - с работы.
Узкий пик - выезд на работу, широкий - с работы.

А на следующем графике видна интенсивность пользования сервисом за всё время. Видны просадки количества поездок летом и в январе.

Самая популярная марка в такси - Киа.

Видимо это из-за того, что она популярна и в комфорте, и в экономе. В комфорте оптима, в экономе сид и рио.

Совпадение? Не думаю!

Затем я задался вопросом, сколько раз я ездил с одним водителем или на одной и той же машине?

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

Теперь несколько интересных наблюдений:

Мамука возил меня целых 3 раза, а до этого я уже ездил на этой машине, но с другим водителем.

DATE

NAME

CAR

CAR_MODEL

NUMBER

NAME_HASH

2020-06-23

Мамука

Toyota

Camry

МР37077

-2596682743997844296

2020-06-17

Мамука

Toyota

Camry

МР37077

-2596682743997844296

2020-06-05

Мамука

Toyota

Camry

МР37077

-2596682743997844296

2019-11-27

Давид

Toyota

Camry

МР37077

-1058569546058211362

Еще есть два случая, когда я ездил с водителем классом эконом, а через два-три года с этим же водителем, но уже комфортом. Поскольку хэши ФИО одинаковые, видно, что это одни и те же люди.

DATE

TARIF

NAME

CAR

CAR_MODEL

NUMBER

NAME_HASH

2017-10-11

Эконом

Игорь

Hyundai

i40

ВЕ20377

7008433025181534578

2020-04-16

Комфорт+

Игорь

Toyota

Camry

МТ67877

7008433025181534578

2018-04-11

Эконом

Иван

Kia

Rio

РС67077

-2646868843695703984

2020-04-17

Комфорт+

Иван

Kia

Optima

МН58777

-2646868843695703984

А если проанализировать сколько обычно дней проходит между поездками с одним водителем можно заметить, что если водитель приезжает второй раз, то это происходит в течение 150-200 дней. Видимо в такси люди долго не задерживаются.

Распределение промежутков между поездками с повторяющимся водителем
Распределение промежутков между поездками с повторяющимся водителем

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

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

Распределение промежутков между поездками с повторяющимся машинами
Распределение промежутков между поездками с повторяющимся машинами

Попробуем извлечь дополнительную информацию

Два основных утверждения:

Если pc - вероятность сломаться в течение 1 дня, то вероятность совершить поездку в день номер m 

P = \frac{1}{N}(1-p_c)^m

тогда, суммируя ряд, получаем вероятность совершить поездку на машине в принципе

\frac{1}{N * p_c} = \frac{29}{1346}

Где 29 - количество повторяющихся поездок, а 1346 - общее количество поездок.

Аналогично, вероятность совершить поездку в промежутке с дня m по день m+n:

P_{m, m+n} = \frac{(1-p_c)^m}{N}*\frac{1-(1-p_c)^{m+n}}{p_c}

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

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

Аппроксимируя имеющиеся данные, получаем вероятность pc = 0.0062, это позволяет сделать следующие выводы:

  • Время службы одной машины в такси - 257 дней

  • Количество машин в Москве - 7194

При этом количество машин - это не общее число машин, а среднее число между количеством машин в экономе и классе комфорт+. Т.е. можно ожидать, что реально такси более чем в 2 раза больше нашей оценки.

Аналогичные рассуждения можно провести и для водителей:

Имеем вероятность pc = 0.0076. Эта цифра дает следующие результаты:

  • Количество водителей в Москве - 7039

  • Один водитель держится - 209 дней

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

Для тех, кому интересно посмотреть код, или составить свою сводку, ссылка на ноутбук: https://colab.research.google.com/drive/1eltee0HilqqVQxpreC9-0w4b08EpMAgM?usp=sharing