Корреляция — это не причинность

Самая важная и самая часто нарушаемая мысль во всём анализе данных. Запомните её раз и навсегда.

Корреляция ≠ причинность. То, что две величины меняются вместе, не значит, что одна вызывает другую.

Классический пример

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

from statistics import correlation

# Чем жарче, тем больше и мороженого, и утоплений
temperature = [15, 20, 25, 30, 35]
ice_cream   = [100, 200, 350, 500, 700]   # продажи
drownings   = [2, 4, 5, 8, 11]            # число утоплений

print("Мороженое vs утопления:", round(correlation(ice_cream, drownings), 3))
print("Температура vs мороженое:", round(correlation(temperature, ice_cream), 3))
print("Температура vs утопления:", round(correlation(temperature, drownings), 3))

Вывод:

Мороженое vs утопления: 0.992
Температура vs мороженое: 0.993
Температура vs утопления: 0.984

Корреляция «мороженое — утопления» высокая (0.992), но это иллюзия: настоящая причина — температура, которая сильно связана с обеими величинами. Такую третью переменную называют скрытой (confounding).

Три причины «ложной» корреляции

  • Скрытая переменная. Обе величины вызваны общей третьей (жара → мороженое и утопления).
  • Обратная причинность. Связь есть, но направление перепутано. «Пожарных на пожаре много → ущерб большой» — на самом деле большой пожар вызывает и то, и другое; больше пожарных не увеличивают ущерб.
  • Случайное совпадение. При переборе множества пар что-то да скоррелирует чисто случайно (число фильмов с неким актёром и потребление сыра по годам).

Совпадение по чистой случайности

Если перебирать достаточно много несвязанных рядов, какие-то из них «совпадут» случайно. Сгенерируем 1000 пар абсолютно независимых случайных рядов и поищем максимальную корреляцию.

import random
from statistics import correlation
random.seed(2)

max_corr = 0
for _ in range(1000):
    a = [random.random() for _ in range(8)]
    b = [random.random() for _ in range(8)]   # b никак не связан с a
    c = abs(correlation(a, b))
    if c > max_corr:
        max_corr = c

print("Максимальная случайная |корреляция| из 1000 пар:", round(max_corr, 3))

Вывод:

Максимальная случайная |корреляция| из 1000 пар: 0.933

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

Как же установить причинность

Корреляция — повод выдвинуть гипотезу, но не доказательство. Причинность устанавливают иначе:

  • Контролируемый эксперимент (рандомизированный) — золотой стандарт. A/B-тест из следующего раздела именно про это: случайно делим пользователей на группы и меняем что-то одно.
  • Учёт скрытых переменных и теоретическое обоснование механизма.

Практическое правило аналитика: нашли корреляцию — спросите себя «а нет ли третьей переменной?» и «не перепутано ли направление?», прежде чем писать в отчёте слово «влияет».

Итог

  • Сильная корреляция не доказывает, что одна величина вызывает другую.
  • Частые причины ложной связи: скрытая переменная, обратная причинность, случайное совпадение.
  • При переборе многих пар высокие корреляции возникают случайно.
  • Причинность устанавливают экспериментом (A/B-тест), а не наблюдаемой корреляцией.
Проверьте себя
1. Продажи мороженого и число утоплений сильно коррелируют. Какой вывод верен?
AМороженое вызывает утопления
BЕсть скрытая переменная (жара), влияющая на обе величины
CУтопления вызывают спрос на мороженое
DКорреляция посчитана с ошибкой
2. Что НЕ является причиной ложной (не причинной) корреляции?
AСкрытая третья переменная
BОбратная причинность
CСлучайное совпадение при переборе многих пар
DКорректно проведённый рандомизированный эксперимент
3. Как надёжнее всего установить причинно-следственную связь?
AПосчитать корреляцию побольше
BПровести контролируемый рандомизированный эксперимент (например, A/B-тест)
CСобрать больше данных того же типа
DПоверить интуиции
Поддержать проект