Раздел 42 · Аналитика данных с нуля

Корреляция и регрессия: Пирсон, Спирмен, прямая и парадокс Симпсона

middle~20 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Отто · операционный директор доставки «Гонец»

Хочу формулу для диспетчеров: заказ на столько-то километров везём столько-то минут. И ещё. ВИЗ и Широкая Речка опаздывают одинаково, около 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 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.