Все материалы
Продуктовая аналитикаматериалстарт

Корреляция простыми словами: что значит «коррелирует» и как читать r

Что такое корреляция и что значит «коррелирует»: коэффициент Пирсона от −1 до 1, r², Спирмен, выбросы, общий тренд и уровень агрегации. Как посчитать корреляцию в SQL, Excel и pandas — на примерах с учебной базы.

КейсПрактика24 сентября 2026 г.11 мин

Коллега выгружает по дням два ряда — сколько событий сделали пользователи и сколько пришло оплат — и считает корреляцию. Получается 0,82. Вывод готов: «активность коррелирует с деньгами, давайте поднимать активность». Если в тех же данных посчитать корреляцию не самих значений, а их изменений от дня к дню, выйдет −0,07. Оба числа правильные. Чтобы понять, какое из них отвечает на вопрос коллеги, нужно знать, что именно измеряет корреляция.

Коротко

Корреляция — это согласованность, с которой меняются две величины: когда одна выше обычного, другая тоже чаще выше (или ниже) обычного. Её силу и направление измеряет коэффициент корреляции от −1 до 1. «Коррелирует» значит «меняется согласованно с», и ничего больше: ни причины, ни направления влияния это слово не утверждает.

  • r > 0 — величины растут вместе, r < 0 — одна растёт, когда другая падает, r около 0 — линейной связи нет.
  • Сила по модулю: границы «слабая», «умеренная», «сильная» — договорённость, а не закон.
  • r² — доля разброса одной величины, которую линейно описывает другая. При r = 0,2 это 4%.
  • Два ряда с общим трендом во времени коррелируют почти всегда, даже если не связаны.
  • Одна точка-выброс может создать корреляцию из ничего или уничтожить сильную.
  • Чем крупнее агрегация, тем выше r: средние по группам коррелируют сильнее, чем отдельные люди.

Что такое корреляция простыми словами

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

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

Что значит «коррелирует»

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

Чего слово не говорит: что трафик создаёт выручку, что друзья удерживают людей, и даже что связь хоть сколько-нибудь сильная. Корреляция 0,1 — тоже «коррелирует». Поэтому в отчёте рядом со словом всегда нужно число, количество точек и уровень, на котором считали: пользователи, дни, каналы.

Коэффициент корреляции Пирсона: как читать r

Обычно под «коэффициентом корреляции» имеют в виду коэффициент Пирсона. Он делит совместную изменчивость двух величин — ковариацию — на произведение их стандартных отклонений. Деление убирает единицы измерения: рубли, штуки и минуты превращаются в безразмерное число от −1 до 1.

Знак говорит о направлении, модуль — о тесноте. r = 1 — все точки ровно на возрастающей прямой, r = −1 — на убывающей. r = 0 значит только, что нет линейной связи. Нелинейная может быть сколь угодно сильной: для y = x² на точках от −3 до 3 коэффициент Пирсона ровно 0, хотя y полностью определяется x.

Для словесной оценки в русскоязычных учебниках часто используют шкалу Чеддока, в англоязычных — пороги Коэна 0,1, 0,3 и 0,5. Это соглашения, и одно и то же r в разных задачах значит разное: для двух замеров одной величины одним прибором 0,9 — мало, а для двух разных действий пользователей 0,3 — уже заметная связь.

Коэффициент корреляции Пирсона
r = cov(X, Y) / (σX × σY)

cov — ковариация, σ — стандартное отклонение. Результат не зависит от единиц измерения и лежит от −1 до 1.

Как словами описывают модуль r: шкала Чеддока, дополненная нижней строкой
|r|Словесная оценка
0–0,1связи практически нет
0,1–0,3слабая
0,3–0,5умеренная
0,5–0,7заметная
0,7–0,9высокая
0,9–1весьма высокая

Корреляция на учебной базе: заходы в приложение и деньги

Проверим гипотезу коллеги на уровне людей. Для каждого из 4613 пользователей учебной базы считаем, сколько дней он открывал приложение (событие app_open) и сколько всего заплатил. Корреляция — 0,197: слабая положительная связь.

r² — это 0,039. Разброс в суммах оплат лишь на 3,9% описывается прямой по числу заходов, остальные 96% — чем-то другим. У 3701 пользователя оплат нет вовсе, и облако выглядит как длинная полоса на нуле с редкими точками выше.

При этом связь статистически значима: при 4613 точках p-value для r = 0,197 порядка 10⁻⁴¹. Значимость говорит, что связь почти наверняка не нулевая, но не делает её сильной. На больших выборках значимыми оказываются и совсем крошечные корреляции.

Корреляция заходов и суммы оплат по пользователям: r = 0,197, r² = 0,039
with per_user as (
  select
    u.user_id,
    u.signup_date,
    (select count(*) from events as e
     where e.user_id = u.user_id and e.event_name = 'app_open') as opens,
    (select coalesce(sum(p.amount), 0) from payments as p
     where p.user_id = u.user_id) as paid
  from users as u
)
select
  count(*) as users,
  round(corr(opens, paid), 3) as r,
  round(regr_r2(paid, opens), 3) as r2
from per_user;

Откуда берётся корреляция: третья величина

Даже слабые 0,197 здесь частично объясняются не активностью. Пользователи зарегистрировались в разное время, с июня по конец августа. Кто пришёл раньше, успел и больше раз зайти, и заплатить не только первый раз, но и за продление. Срок жизни в данных двигает обе величины сразу.

Если считать корреляцию внутри месяца регистрации, где срок примерно одинаков, она падает: 0,044 у июньских пользователей, 0,087 у июльских, 0,177 у августовских. Для июня связь уже неотличима от нуля: p-value около 0,15. Если выровнять окна для всех — заходы за первые 14 дней и оплаты за первые 28 дней, для 2777 пользователей, пришедших до 2 августа, — r = 0,078.

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

Корреляция заходов и оплат внутри месяца регистрации
Месяц регистрацииПользователиЗаходов в среднемОплачено в среднемr
Июнь10429,011,80,044
Июль16767,07,20,087
Август18954,03,30,177
Все вместе46136,26,60,197

Почему корреляция по дням получилась 0,82: общий тренд

Вернёмся к вступлению. Продукт растёт: в первую неделю июня пользователи делали в среднем 106,9 события в день, в последнюю неделю августа — 573,4. Оплат в день было 0,4, стало 24,9. Оба ряда растут со временем: их корреляция с номером дня — 0,93 и 0,89.

Два ряда, которые растут со временем, коррелируют между собой почти автоматически. Так получаются и 0,82 между событиями и оплатами. Общий тренд связывает любые растущие величины, в том числе совсем чужие — число сотрудников компании и число кофейных стаканчиков в мусорке.

Простая проверка — посчитать корреляцию изменений от дня к дню. Тренд из приростов уходит, остаются колебания. Для событий и оплат корреляция приростов −0,07: в дни, когда событий больше обычного, оплат не становится больше. Связь в уровнях держится на общем росте, а не на том, что активный день приносит деньги в тот же день.

Корреляция уровней и корреляция приростов: 0,82 и −0,07
with daily as (
  select
    e.event_time::date as day,
    count(*) as events,
    (select count(*) from payments as p
     where p.paid_at = e.event_time::date) as payments
  from events as e
  group by day
),
diffs as (
  select
    events,
    payments,
    events - lag(events) over (order by day) as d_events,
    payments - lag(payments) over (order by day) as d_payments
  from daily
)
select
  count(*) as days,
  round(corr(events, payments), 2) as r_levels,
  round(corr(d_events, d_payments), 2) as r_changes
from diffs;

Как уровень агрегации меняет коэффициент

Возьмём ту же пару — заходы и оплаты — и посчитаем корреляцию не по людям, а по средним в группах. По 90 дням регистрации получается 0,737, по 13 неделям — 0,918, по четырём каналам — 0,998. Данные те же, меняется только то, что считается точкой.

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

Отсюда правило для отчёта: называйте уровень и число точек. «r = 0,998 по четырём каналам» и «r = 0,197 по 4613 пользователям» — разные утверждения о разных вещах. А по четырём точкам высокий r получается легко и почти ничего не доказывает.

Корреляция заходов и оплат при разном способе подсчёта

Учебная база SQL-курса, DuckDB. Первые четыре столбца — одна и та же пара величин на разных уровнях агрегации, последний — с одинаковым окном для всех пользователей.

Коэффициент r
Одна пара величин на четырёх уровнях агрегации
with per_user as (
  select
    u.user_id,
    u.signup_date,
    u.channel,
    (select count(*) from events as e
     where e.user_id = u.user_id and e.event_name = 'app_open') as opens,
    (select coalesce(sum(p.amount), 0) from payments as p
     where p.user_id = u.user_id) as paid
  from users as u
),
by_day as (
  select signup_date, avg(opens) as opens, avg(paid) as paid
  from per_user group by signup_date
),
by_week as (
  select date_trunc('week', signup_date) as wk, avg(opens) as opens, avg(paid) as paid
  from per_user group by wk
),
by_channel as (
  select channel, avg(opens) as opens, avg(paid) as paid
  from per_user group by channel
)
select 'пользователи' as level, count(*) as points, round(corr(opens, paid), 3) as r from per_user
union all
select 'дни регистрации', count(*), round(corr(opens, paid), 3) from by_day
union all
select 'недели регистрации', count(*), round(corr(opens, paid), 3) from by_week
union all
select 'каналы', count(*), round(corr(opens, paid), 3) from by_channel;

Как выбросы создают и разрушают корреляцию

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

В первой девять точек — шум без связи: r = −0,07. Добавляем десятую, (30, 30), далеко от остальных. Коэффициент становится 0,94: одна точка нарисовала «весьма высокую» корреляцию. Во второй девять точек почти на прямой, r = 0,98. Десятая точка (10, −20) опрокидывает коэффициент до −0,25.

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

Две выборки по десять точек: коэффициенты с выбросом и без
ВыборкаПирсон без выбросаПирсон с выбросомСпирмен с выбросом
Шум + точка (30, 30)−0,070,940,22
Почти прямая + точка (10, −20)0,98−0,250,44
Один выброс превращает −0,07 в 0,94
with pts(x, y) as (
  values (1, 5), (2, 3), (3, 6), (4, 2), (5, 5),
         (6, 4), (7, 6), (8, 3), (9, 4), (30, 30)
)
select
  round(corr(x, y) filter (where x < 30), 2) as r_without_outlier,
  round(corr(x, y), 2) as r_with_outlier
from pts;

Пирсон или Спирмен: какую корреляцию выбрать

Корреляция Спирмена считается так же, как Пирсона, только не по самим значениям, а по их рангам: самому маленькому значению ранг 1, следующему 2 и так далее. Выброс превращается просто в «самое большое значение», и его вес перестаёт зависеть от того, насколько он далёк от остальных.

В таблице выше видно, как это работает: в первой выборке Спирмен даёт 0,22 вместо 0,94, во второй — 0,44 вместо −0,25. Он не исправляет данные, но точка-великан уже не решает за всех.

Второй повод выбрать Спирмена — монотонная, но не прямая связь: величина растёт вместе с другой, но всё медленнее или всё быстрее. Пирсон такую связь занижает, Спирмен видит полностью. На учебной базе для заходов и оплат коэффициенты близки: 0,197 у Пирсона и 0,188 у Спирмена — сильных выбросов там нет. Близость двух чисел — хороший признак, что r не держится на нескольких точках.

Спирмен в SQL: корреляция рангов, связанным значениям — средний ранг
with pts(x, y) as (
  values (1, 5), (2, 3), (3, 6), (4, 2), (5, 5),
         (6, 4), (7, 6), (8, 3), (9, 4), (30, 30)
),
ranked as (
  select
    x, y,
    rank() over (order by x) + (count(*) over (partition by x) - 1) / 2.0 as rx,
    rank() over (order by y) + (count(*) over (partition by y) - 1) / 2.0 as ry
  from pts
)
select
  round(corr(x, y), 2) as pearson,
  round(corr(rx, ry), 2) as spearman
from ranked;

Как посчитать корреляцию в SQL, Excel и pandas

В SQL есть агрегатная функция corr(x, y) — в PostgreSQL, DuckDB, ClickHouse и BigQuery. Она считает Пирсона и, как любой агрегат, работает с group by: можно получить r отдельно по каждому каналу одним запросом. Строки, где хотя бы одно значение NULL, в расчёт не попадают — если пропуск означает ноль, подставьте coalesce, как в запросах выше. В PostgreSQL и DuckDB regr_r2(y, x) сразу возвращает r².

В Excel — функция КОРРЕЛ(диапазон1; диапазон2), в английской версии CORREL. PEARSON даёт то же число. Для Спирмена отдельной функции нет: сначала переведите значения в ранги через РАНГ.СР, потом посчитайте КОРРЕЛ по рангам.

В pandas — метод .corr(). У двух колонок он возвращает число, у таблицы — матрицу всех числовых колонок. По умолчанию это Пирсон, Спирмен включается параметром method='spearman'.

pythonКорреляция в pandas на первой игрушечной выборке
import pandas as pd

df = pd.DataFrame({
    'x': [1, 2, 3, 4, 5, 6, 7, 8, 9, 30],
    'y': [5, 3, 6, 2, 5, 4, 6, 3, 4, 30],
})

print(round(df['x'].corr(df['y']), 2))                      # Пирсон: 0.94
print(round(df['x'].corr(df['y'], method='spearman'), 2))   # Спирмен: 0.22
print(df.corr().round(2))                                    # матрица по всем числовым колонкам

Что проверить, прежде чем написать «коррелирует»

Большинство ошибок с корреляцией видно до всякой статистики, если задать себе несколько вопросов.

  • Что здесь точка: пользователь, день, канал? Сколько точек? На четырёх r почти ничего не значит.
  • Нет ли у обоих рядов общего тренда во времени? Если есть, посчитайте корреляцию приростов.
  • Нет ли третьей величины, которая двигает обе: срок жизни, канал, сезон, размер клиента? Посчитайте r внутри групп, где она примерно постоянна.
  • Как выглядит диаграмма рассеяния? Не держится ли r на одной-двух точках? Сравните Пирсона со Спирменом.
  • Сильная ли связь или только значимая? Посмотрите на r², а не на p-value.
  • Не написано ли в выводе «влияет», «приводит», «благодаря»? Для этих слов нужен эксперимент, а не корреляция.

Что почитать дальше

Все SQL-запросы из материала выполняются в песочнице курса на той же учебной базе. Попробуйте посчитать корреляцию заходов и оплат отдельно по каждому каналу через group by channel и сравнить с 0,197.

Продолжить чтение
Вся библиотека
Продуктовая аналитика24 сентября 2026 г.10 мин
Три потока разноцветных частиц сходятся в воронку и выходят ровными рядами

ETL: что это простыми словами, этапы и чем ETL отличается от ELT

ETL — процесс, который забирает данные из источников, приводит их в порядок и загружает в хранилище. Этапы extract, transform, load на примере продукта, разница ETL и ELT, инкрементальная загрузка, идемпотентность и SQL-проверки качества данных.

Читать материал
Продуктовая аналитика24 сентября 2026 г.10 мин
Слои полупрозрачных плит один над другим, верхняя разделена на аккуратные ячейки

DWH, витрина данных и data lake: что это и чем они отличаются

DWH — хранилище данных для анализа, витрина — готовая таблица под конкретную задачу, data lake — хранилище сырых файлов. Чем DWH отличается от базы приложения, из каких слоёв состоит, как выглядит витрина на SQL и почему в двух витринах бывают разные цифры.

Читать материал
Продуктовая аналитика24 сентября 2026 г.10 мин
Горизонтальные полосы-строки слева и вертикальные столбцы справа, между ними поток точек

OLAP и OLTP: в чём разница простыми словами

OLTP — системы, которые обслуживают работу продукта мелкими транзакциями, OLAP — системы для тяжёлых аналитических запросов. Чем они отличаются по запросам, схеме и хранению, почему отчёты не строят на рабочей базе и что такое OLAP-куб.

Читать материал