статистикаpythonpandasкорреляцияанализ данных

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

2026-07-10 11 мин

Коротко: корреляция Пирсона измеряет силу *линейной* связи и очень чувствительна к выбросам и ненормальным распределениям; корреляция Спирмена работает с рангами и ловит любую *монотонную* связь, поэтому устойчива к выбросам и не требует нормальности. Если данные чистые и связь на глаз прямая — берите Пирсона. Если есть длинные хвосты, выбросы или связь монотонная, но кривая — берите Спирмена. Оба считаются одной строкой в pandas: df.corr(method='pearson') и df.corr(method='spearman').

Расхождение между этими двумя цифрами — не баг, а сигнал. Оно почти всегда говорит вам что-то важное про форму данных. Разберём, что именно, на одном датасете, где Пирсон покажет 0.68, а Спирмен — 0.94.

Что вообще показывает коэффициент корреляции?

Коэффициент корреляции — это число от -1 до +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, чтобы величина не зависела от единиц измерения (рубли, секунды, штуки — неважно).

Три вещи, которые нужно помнить про Пирсона:

Пирсон — правильный выбор, когда переменные примерно нормально распределены, связь на глаз прямая, и в данных нет диких хвостов. Если вы только осваиваете разведочный анализ, начните с pandas с нуля — там разбираются describe, распределения и первые графики, без которых корреляцию считать вслепую.

Чем ранговая корреляция Спирмена отличается от Пирсона?

Корреляция Спирмена (обозначают rho, ρ) — это тот же коэффициент Пирсона, но посчитанный не по значениям, а по их рангам. Ранг — это позиция значения в отсортированном ряду: самое маленькое получает ранг 1, следующее — 2, и так далее.

Алгоритм в три шага:

Что даёт переход к рангам:

Простой пример на пальцах. Пусть 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]

Результат:

Вот почему расхождение диагностично. Если Пирсон заметно ниже Спирмена — почти наверняка в данных есть выбросы или тяжёлые хвосты, которые бьют по Пирсону, но не трогают ранги. Обратная ситуация (Пирсон выше Спирмена) встречается реже и обычно означает несколько экстремальных точек, которые случайно легли ровно на прямую и надули 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():

Если хотите ещё и p-value (проверить, значима ли корреляция статистически), pandas его не даёт — берите scipy.stats.pearsonr и scipy.stats.spearmanr. Про то, как читать p-value и не попасться, есть отдельный разбор: p-value простыми словами. А базовую работу с массивами и агрегациями, на которых стоит весь этот расчёт, удобно подтянуть в numpy с нуля.

Когда выбирать Пирсона, а когда Спирмена?

Практическое правило: если сомневаетесь — считайте оба и сравнивайте. Но если нужно выбрать один заранее, ориентируйтесь на таблицу.

СитуацияМетодПочему
Данные примерно нормальные, связь прямаяПирсонизмеряет линейность напрямую, максимальная мощность
Есть выбросы или тяжёлые хвостыСпирменранги не чувствительны к экстремальным значениям
Связь монотонная, но кривая (лог, степень)Спирменловит монотонность любой формы
Порядковые данные (оценки 1–5, грейды)Спирменк рангам такие шкалы приводятся естественно
Нужна интерпретация «на сколько единиц»Пирсонближе к регрессии и наклону прямой
Маленькая выборка с шумомСпирмен / Кендаллустойчивее к случайным выбросам

Пошаговый чек-лист перед тем, как доверять цифре:

Отдельно про выбор графика для шага 1 — что рисовать, scatter или что-то ещё, разбирается в гайде какой график выбрать. Корреляции и их визуализация — частый блок на собеседованиях аналитика; чтобы прокачать теорию системно, посмотрите главные вопросы по статистике на собесе.

Почему корреляция не равна причинности?

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

Скрытая третья переменная. Продажи мороженого коррелируют с числом утоплений. Мороженое никого не топит — обе величины гонит вверх жара. Такую переменную называют конфаундером, и без неё вывод «мороженое опасно» абсурден. В продуктовой аналитике конфаундеры повсюду: активные пользователи и покупают больше, и заходят чаще — но причина обоих часто в том, что это просто платёжеспособный сегмент.

Обратная причинность. Вы видите, что активные пользователи чаще держат Pro-подписку, и делаете вывод «подписка повышает активность». Может быть наоборот: активные и так были вовлечены, поэтому и купили. Корреляция симметрична, направление она не показывает.

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

Что с этим делать аналитику:

Корреляция — рабочий инструмент разведки: быстро показывает, где искать. Но перепрыгивать от неё сразу к «X влияет на Y» — самая частая ошибка в отчётах, и на собеседовании её ловят в первую очередь.

Как это отработать на практике?

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

В Python-тренажёре есть задачи на разведочный анализ прямо в браузере: pandas и numpy подгружаются автоматически, ничего ставить не нужно. Первые пять задач в каждом блоке открыты бесплатно — этого хватает, чтобы понять, ваш формат или нет, дальше уже по Pro. Кто больше живёт в базах — те же связи можно щупать и в SQL-тренажёре на оконных функциях и агрегатах.

Дальше по маршруту:

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

Потренируй корреляции на реальных данных
В тренажёре есть Python-задачи на разведочный анализ: посчитать Пирсона и Спирмена, найти выбросы, объяснить расхождение. Первые 5 задач открыты бесплатно, дальше — Pro.
Открыть Python-тренажёр →