Отто · операционный директор доставки «Гонец»
Хочу формулу для диспетчеров: заказ на столько-то километров везём столько-то минут. И ещё. ВИЗ и Широкая Речка опаздывают одинаково, около 22%, так что новых курьеров получит тот, кто громче просит. Или я что-то упускаю?
В прошлом уроке мы сравнивали группы: маги против магов, 1.3 против 1.4. Отто спрашивает о другом: как одна величина меняется вместе с другой. Расстояние растёт, а время? Сегодня меряем такую связь, строим по ней прямую и разбираемся, когда связь обманывает.
Работаем с базой courier, как в боссе про опоздания. Напомню ловушку из урока про часовые пояса: created_at записан в местном времени Екатеринбурга, а delivered_at в UTC. Во всех числах ниже пояса уже сведены через AT TIME ZONE 'Asia/Yekaterinburg'.
Облако точек
За март-июнь 2026 «Гонец» доставил 39 343 заказа. Нарисуем каждый точкой: по горизонтали расстояние, по вертикали минуты от заказа до доставки. Такой график называют диаграммой рассеяния:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.scatter(orders["distance_km"], orders["minutes"], s=2, alpha=0.2)
ax.set_xlabel("Расстояние, км")
ax.set_ylabel("Минут от заказа до доставки")
Облако выходит странным. Основная масса прижата к полу: медиана 32 минуты. Но над ней висит редкий хвост: 1552 заказа, почти 4%, ждали доставки дольше трёх часов, рекорд 1355 минут. Это вечерние очереди, когда курьеров на зону не хватает: заказ ждёт, пока кто-то освободится. От расстояния такие ожидания почти не зависят.
Пирсон и Спирмен
Силу связи меряют одним числом от −1 до 1. Самое известное это корреляция Пирсона: насколько точки ложатся на прямую.
from scipy import stats
stats.pearsonr(orders["distance_km"], orders["minutes"]).statistic # 0.104
stats.spearmanr(orders["distance_km"], orders["minutes"]).statistic # 0.281
Пирсон даёт 0,10, почти ноль. Неужели расстояние не влияет? Виноват хвост. Пирсон работает с самими минутами, и заказ на 1355 минут для него весит как сорок обычных. Полторы тысячи таких точек, разбросанных по всем расстояниям, и прямая теряется.
Корреляция Спирмена сначала заменяет значения рангами: самый короткий заказ получает ранг 1, следующий 2 и так далее. Заказ на 1355 минут теперь просто последний в списке, на один ранг дальше предпоследнего. Спирмен даёт 0,28: связь есть, слабая, но есть. Разница между двумя числами сама по себе подсказка: в данных выбросы, и на них стоит посмотреть.
Правило простое. Пирсон, когда связь похожа на прямую и выбросов нет. Спирмен, когда хвосты длинные или связь кривая, но монотонная.
урок из курса
Урок из курса «Аналитика данных с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.