Коротко: корреляция Пирсона измеряет силу *линейной* связи и очень чувствительна к выбросам и ненормальным распределениям; корреляция Спирмена работает с рангами и ловит любую *монотонную* связь, поэтому устойчива к выбросам и не требует нормальности. Если данные чистые и связь на глаз прямая — берите Пирсона. Если есть длинные хвосты, выбросы или связь монотонная, но кривая — берите Спирмена. Оба считаются одной строкой в pandas: df.corr(method='pearson') и df.corr(method='spearman').
Расхождение между этими двумя цифрами — не баг, а сигнал. Оно почти всегда говорит вам что-то важное про форму данных. Разберём, что именно, на одном датасете, где Пирсон покажет 0.68, а Спирмен — 0.94.
Что вообще показывает коэффициент корреляции?
Коэффициент корреляции — это число от -1 до +1, которое отвечает на вопрос: когда одна переменная растёт, вторая тоже растёт, падает или ведёт себя независимо?
+1— идеальная положительная связь: одна вверх, вторая строго вверх.0— связи нет, переменные не двигаются согласованно.-1— идеальная отрицательная связь: одна вверх, вторая строго вниз.
На практике вы почти никогда не увидите ровно 1 или 0. Увидите что-то вроде 0.73 или -0.21, и нужно уметь читать эти цифры. Грубая шкала для интерпретации силы связи:
| Модуль коэффициента | Как читать |
|---|---|
| 0.0 – 0.2 | связи практически нет |
| 0.2 – 0.4 | слабая |
| 0.4 – 0.6 | умеренная |
| 0.6 – 0.8 | сильная |
| 0.8 – 1.0 | очень сильная |
Важная оговорка: шкала контекстна. В физике 0.6 — это «шумно», в поведенческой аналитике 0.6 между двумя продуктовыми метриками — уже отличная находка. И главное: корреляция описывает согласованность движения, но не форму связи и не причину. Про это — в последнем разделе.
Проверять связи между метриками приходится постоянно: коррелирует ли частота захода с удержанием на 7-й день, связан ли средний чек с пожизненной ценностью клиента. Ответ почти всегда начинается с корреляции.
Как устроена корреляция Пирсона?
Коэффициент корреляции Пирсона (обозначают r) измеряет линейную связь. По-простому: насколько хорошо облако точек ложится на прямую линию.
Формула обычным текстом:
r = ковариация(X, Y) / (std(X) * std(Y))
ковариация(X, Y) = среднее произведения отклонений от средних
= mean( (X - mean(X)) * (Y - mean(Y)) )
Ковариация в числителе ловит, движутся ли переменные согласованно относительно своих средних. Деление на произведение стандартных отклонений нормирует результат в диапазон от -1 до +1, чтобы величина не зависела от единиц измерения (рубли, секунды, штуки — неважно).
Три вещи, которые нужно помнить про Пирсона:
- Он работает с самими значениями, а не с их порядком. Замена одного значения с 100 на 10000 сдвинет результат заметно.
- Он предполагает линейность. Если связь есть, но она параболическая или логарифмическая, Пирсон её недооценит или вовсе покажет около нуля.
- Он чувствителен к выбросам. Одна аномальная точка может как надуть, так и обнулить коэффициент.
Пирсон — правильный выбор, когда переменные примерно нормально распределены, связь на глаз прямая, и в данных нет диких хвостов. Если вы только осваиваете разведочный анализ, начните с pandas с нуля — там разбираются describe, распределения и первые графики, без которых корреляцию считать вслепую.
Чем ранговая корреляция Спирмена отличается от Пирсона?
Корреляция Спирмена (обозначают rho, ρ) — это тот же коэффициент Пирсона, но посчитанный не по значениям, а по их рангам. Ранг — это позиция значения в отсортированном ряду: самое маленькое получает ранг 1, следующее — 2, и так далее.
Алгоритм в три шага:
- Заменить каждое значение X на его ранг внутри X.
- Заменить каждое значение Y на его ранг внутри Y.
- Посчитать обычную корреляцию Пирсона по этим рангам.
Что даёт переход к рангам:
- Абсолютные величины больше не важны — важен только порядок. Значение 10000 и значение 101 превращаются в соседние ранги, если между ними никого нет. Так убивается влияние выбросов.
- Ловится любая монотонная связь, не только линейная. Если Y всегда растёт вслед за X — пусть и по кривой — ранги обеих переменных идут в ногу, и Спирмен будет близок к 1.
- Не нужна нормальность. Ранги — это по сути равномерно распределённые числа, распределение исходных данных не мешает.
Простой пример на пальцах. Пусть X = [1, 2, 3, 4, 5], а Y = [1, 4, 9, 16, 100] (это X в квадрате, плюс последняя точка задрана). Связь строго монотонная, но сильно нелинейная. Спирмен даст ровно 1.0 — потому что ранги Y это [1, 2, 3, 4, 5], идеально совпадают с рангами X. А Пирсон покажет что-то около 0.9 и ниже, потому что по значениям облако точек на прямую не ложится.
Спирмена часто называют непараметрическим методом: он не завязан на конкретную форму распределения. По той же причине его любят на собеседованиях гонять в паре с t-критерием и проверкой нормальности — понимание, когда параметрика не применима, отличает джуна от миддла.
Почему выбросы и ненормальность ломают Пирсона?
Потому что Пирсон считается по отклонениям от среднего, а отклонения возводятся в произведение — и одна далёкая точка вносит непропорционально большой вклад. Разберём на числах.
Возьмём почти идеальную линейную связь из 10 точек:
X = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Y = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
Здесь Y = 2X, связь идеальная. И Пирсон, и Спирмен дадут 1.0.
Теперь испортим одну точку — заменим последний Y с 20 на 2 (сбой выгрузки, аномальный клиент, опечатка в данных):
X = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Y = [2, 4, 6, 8, 10, 12, 14, 16, 18, 2]
Результат:
- Пирсон падает примерно до 0.55 — одна точка развернула картину, «сильная линейная связь» превратилась в «умеренную».
- Спирмен остаётся высоким, около 0.75 — потому что для рангов эта точка просто уехала с ранга 10 на ранг 1, а остальные девять пар как шли по порядку, так и идут.
Вот почему расхождение диагностично. Если Пирсон заметно ниже Спирмена — почти наверняка в данных есть выбросы или тяжёлые хвосты, которые бьют по Пирсону, но не трогают ранги. Обратная ситуация (Пирсон выше Спирмена) встречается реже и обычно означает несколько экстремальных точек, которые случайно легли ровно на прямую и надули r.
Практический вывод: увидели большой разрыв между двумя коэффициентами — не выбирайте «который больше нравится», а идите смотреть на распределение и на диаграмму рассеяния. Скорее всего, найдёте выброс, который стоит либо объяснить, либо вычистить. Про то, как выбросы искажают и другие сводные величины, есть отдельный разбор: медиана и перцентили против среднего.
Как посчитать обе корреляции через pandas .corr()?
В pandas это буквально один аргумент. Метод .corr() считает попарную корреляцию всех числовых колонок, а параметр method переключает формулу.
import pandas as pd
import numpy as np
# Датасет: выручка с клиента и число заходов в приложение за месяц.
# 12 обычных клиентов + 1 кит-выброс (последняя строка).
data = {
"visits": [3, 5, 6, 8, 9, 11, 12, 14, 15, 17, 19, 21, 22],
"revenue": [120, 180, 210, 260, 300, 360, 380, 450, 470, 540, 600, 660, 9800],
}
df = pd.DataFrame(data)
pearson = df["visits"].corr(df["revenue"], method="pearson")
spearman = df["visits"].corr(df["revenue"], method="spearman")
print(f"Пирсон: {pearson:.2f}")
print(f"Спирмен: {spearman:.2f}")
Вывод:
Пирсон: 0.68
Спирмен: 0.94
Один и тот же датасет, а картина разная. Спирмен видит почти идеальную монотонность: больше заходов — больше выручки, порядок соблюдается по всем 13 клиентам. Пирсон же придавлен китом на 9800 — эта точка настолько выбивается по значению, что линейная подгонка «размазывается».
Чтобы увидеть всю матрицу сразу, вызывайте .corr() на всём датафрейме:
# Матрица корреляций по всем числовым колонкам
print(df.corr(method="pearson").round(2))
print(df.corr(method="spearman").round(2))
Полезные детали про .corr():
- По умолчанию
method="pearson". Доступны также"spearman"и"kendall"(тау Кендалла — ещё один ранговый метод, устойчивее Спирмена на очень малых выборках, но медленнее). - Пропуски (
NaN) отбрасываются попарно: для каждой пары колонок берутся только строки, где оба значения не пустые. Это удобно, но означает, что разные ячейки матрицы могут быть посчитаны по разному числу наблюдений — держите в голове. - Нечисловые колонки игнорируются автоматически.
Если хотите ещё и p-value (проверить, значима ли корреляция статистически), pandas его не даёт — берите scipy.stats.pearsonr и scipy.stats.spearmanr. Про то, как читать p-value и не попасться, есть отдельный разбор: p-value простыми словами. А базовую работу с массивами и агрегациями, на которых стоит весь этот расчёт, удобно подтянуть в numpy с нуля.
Когда выбирать Пирсона, а когда Спирмена?
Практическое правило: если сомневаетесь — считайте оба и сравнивайте. Но если нужно выбрать один заранее, ориентируйтесь на таблицу.
| Ситуация | Метод | Почему |
|---|---|---|
| Данные примерно нормальные, связь прямая | Пирсон | измеряет линейность напрямую, максимальная мощность |
| Есть выбросы или тяжёлые хвосты | Спирмен | ранги не чувствительны к экстремальным значениям |
| Связь монотонная, но кривая (лог, степень) | Спирмен | ловит монотонность любой формы |
| Порядковые данные (оценки 1–5, грейды) | Спирмен | к рангам такие шкалы приводятся естественно |
| Нужна интерпретация «на сколько единиц» | Пирсон | ближе к регрессии и наклону прямой |
| Маленькая выборка с шумом | Спирмен / Кендалл | устойчивее к случайным выбросам |
Пошаговый чек-лист перед тем, как доверять цифре:
- Постройте диаграмму рассеяния. Глаз ловит нелинейность и выбросы быстрее любого коэффициента.
- Посмотрите распределение каждой переменной (
df.describe(), гистограмма). Длинные хвосты — сигнал в пользу Спирмена. - Посчитайте оба коэффициента. Совпали — берите Пирсона, он информативнее. Разошлись — разбирайтесь почему.
- Если разрыв большой — ищите выбросы и решайте, чистить их или оставлять с оговоркой.
Отдельно про выбор графика для шага 1 — что рисовать, scatter или что-то ещё, разбирается в гайде какой график выбрать. Корреляции и их визуализация — частый блок на собеседованиях аналитика; чтобы прокачать теорию системно, посмотрите главные вопросы по статистике на собесе.
Почему корреляция не равна причинности?
Потому что корреляция измеряет только согласованность движения двух переменных, а причина этой согласованности может быть какой угодно. Классических ловушек три.
Скрытая третья переменная. Продажи мороженого коррелируют с числом утоплений. Мороженое никого не топит — обе величины гонит вверх жара. Такую переменную называют конфаундером, и без неё вывод «мороженое опасно» абсурден. В продуктовой аналитике конфаундеры повсюду: активные пользователи и покупают больше, и заходят чаще — но причина обоих часто в том, что это просто платёжеспособный сегмент.
Обратная причинность. Вы видите, что активные пользователи чаще держат Pro-подписку, и делаете вывод «подписка повышает активность». Может быть наоборот: активные и так были вовлечены, поэтому и купили. Корреляция симметрична, направление она не показывает.
Случайное совпадение. На больших количествах переменных всегда найдутся пары, которые коррелируют без всякого смысла — просто по совпадению. Чем больше признаков вы гоняете через матрицу корреляций, тем выше шанс наткнуться на ложную связь.
Что с этим делать аналитику:
- Корреляция — это гипотеза, а не вывод. Она говорит «тут стоит копнуть», а не «вот причина».
- Причинность проверяется экспериментом. Золотой стандарт — A/B-тест; как считать его результаты, разбирается в A/B-тестах на Python и scipy.
- Когда эксперимент невозможен, есть квазиэкспериментальные методы, например difference-in-differences.
- Осторожнее с агрегированными данными: направление связи может перевернуться при разбивке на группы — это парадокс Симпсона.
Корреляция — рабочий инструмент разведки: быстро показывает, где искать. Но перепрыгивать от неё сразу к «X влияет на Y» — самая частая ошибка в отчётах, и на собеседовании её ловят в первую очередь.
Как это отработать на практике?
Теорию корреляций держат в голове все, а вот на данных её ломают быстро. Лучший способ — прогнать несколько задач руками: посчитать оба коэффициента, специально подложить выброс, увидеть, как расходятся цифры, и объяснить почему.
В Python-тренажёре есть задачи на разведочный анализ прямо в браузере: pandas и numpy подгружаются автоматически, ничего ставить не нужно. Первые пять задач в каждом блоке открыты бесплатно — этого хватает, чтобы понять, ваш формат или нет, дальше уже по Pro. Кто больше живёт в базах — те же связи можно щупать и в SQL-тренажёре на оконных функциях и агрегатах.
Дальше по маршруту:
- SQL-задачи из реальных собеседований — блок со статистикой и продуктовыми метриками.
- AI-собеседование — потренировать формулировки вслух: чем Пирсон отличается от Спирмена и когда какой брать, спрашивают почти всегда.
- Смежная теория: как проверить нормальность распределения и t-критерий Стьюдента простыми словами.
Коротко на прощание: считайте оба коэффициента, смотрите на график, а расхождение читайте как подсказку про форму данных, а не как повод выбрать цифру покрасивее.