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