Что такое корреляция и причинно-следственная связь? Почему их нельзя путать?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Корреляция vs Причинно-следственная связь
Корреляция — это статистическая зависимость (две переменные меняются вместе). Причинно-следственная связь (каузальность) — это когда одна переменная ПРИЧИНА, другая СЛЕДСТВИЕ. Это фундаментальное различие, которое часто путают, приводя к неверным выводам.
Определение корреляции
Корреляция измеряет, как две переменные двигаются вместе:
import numpy as np
import pandas as pd
from scipy.stats import pearsonr
# Пример: ледяное мороженое и утопления
ice_cream_sales = [100, 120, 150, 180, 200, 210, 190, 160, 130, 110]
drowing_deaths = [10, 12, 15, 18, 20, 21, 19, 16, 13, 11]
# Коэффициент корреляции Пирсона
corr, p_value = pearsonr(ice_cream_sales, drowning_deaths)
print(f"Корреляция: {corr:.3f}") # 0.998 (очень сильная!)
print(f"P-value: {p_value:.6f}") # < 0.001 (статистически значима)
# Вывод: ледяное мороженое и утопления сильно коррелируют!
Но это НЕ означает, что мороженое вызывает утопления!
Типы корреляции
Положительная корреляция:
# Обе переменные растут вместе
# Пример: опыт работы и зарплата
experience = [0, 1, 2, 3, 4, 5]
salary = [30000, 35000, 40000, 48000, 55000, 65000]
corr = np.corrcoef(experience, salary)[0, 1] # 0.99 (сильная положительная)
print(f"Корреляция: {corr:.3f}")
Отрицательная корреляция:
# Когда одна растёт, другая падает
# Пример: цена товара и количество продаж
price = [100, 120, 140, 160, 180]
quantity_sold = [1000, 800, 600, 400, 200]
corr = np.corrcoef(price, quantity_sold)[0, 1] # -0.99 (сильная отрицательная)
print(f"Корреляция: {corr:.3f}")
Нулевая корреляция:
# Переменные не связаны
# Пример: номер месяца и случайное число
month = [1, 2, 3, 4, 5, 6]
random_num = [42, 7, 81, 15, 99, 3]
corr = np.corrcoef(month, random_num)[0, 1] # ~0 (нет связи)
print(f"Корреляция: {corr:.3f}")
Причинно-следственная связь
Причинно-следственная связь означает, что изменение X ВЫЗЫВАЕТ изменение Y:
Причина (X) → Следствие (Y)
Примеры:
- Больше учёбы → Выше оценки
- Больше удобрений → Больше урожая
- Более высокая температура → Больше пота
Но корреляция ≠ каузальность!
Основные ошибки: три сценария корреляции БЕЗ каузальности
Сценарий 1: Скрытая переменная (Confounding variable)
Оба явления вызваны третьей переменной:
ЛЕДЯНОЕ МОРОЖЕНОЕ → УТОПЛЕНИЯ ✗ (корреляция, но нет причины)
↓ ↓
└─ ЛЕТО ─┘ (скрытая причина!)
Летом:
- Люди едят больше мороженого (потому что жарко)
- Люди плавают больше (потому что жарко)
- Поэтому больше утоплений
Лед ≠ причина утоплений!
Сценарий 2: Обратная причинность (Reverse causality)
Мы думаем: A → B
Но на самом деле: B → A
Пример: Люди с высокой зарплатой покупают дорогие машины
Мы думаем: Дорогая машина → Высокая зарплата ✗
На самом деле: Высокая зарплата → Дорогая машина ✓
Корреляция есть, но направление другое!
Сценарий 3: Чистая случайность
Полная независимость, но случайное совпадение
Пример: Количество буквы "К" в заголовках газет
vs Цена акций
Нет причинно-следственной связи, просто случайность.
Если проверить 1000 пар переменных, некоторые будут коррелировать
полностью случайно (p-hacking).
Практические примеры из реальной жизни
Пример 1: Обучение и спорт
# Данные: часов учёбы vs результаты по математике
study_hours = [1, 2, 3, 4, 5]
math_score = [50, 60, 70, 80, 90]
corr = np.corrcoef(study_hours, math_score)[0, 1] # 1.0 (идеальная корреляция)
# Вывод: "Больше учёбы → Выше оценки" ✓ (разумная причина-следствие)
Пример 2: Количество пожарных и ущерб от пожара
# Корреляция между числом пожарных и ущербом: очень высокая (0.95)
fire_fighters = [5, 10, 20, 50, 100]
fire_damage = [10000, 20000, 50000, 150000, 300000]
# Наивный вывод: "Больше пожарных → Больше ущерба" ✗
# Правильное объяснение: Больше пожарных отправляют на БОЛЬШИЕ пожары
# Скрытая переменная: размер пожара
Пример 3: Социальная сеть и депрессия
# Исследование: коррелирует ли время в TikTok с депрессией? Да!
# correlation = 0.45
# Но почему?
# Вариант 1: TikTok вызывает депрессию (наивный взгляд)
# Вариант 2: Люди с депрессией больше сидят в TikTok (обратная причина)
# Вариант 3: Низкая самооценка → Больше TikTok И депрессия (скрытая переменная)
# Вариант 4: Осведомлённость о проблемах → Больше TikTok контента о депрессии
# Корреляция найдена, но причина неясна!
Как доказать причинно-следственную связь?
Рандомизированный контролируемый эксперимент (RCT)
# Пример: проверить, повышает ли новая программа обучения оценки
# Контрольная группа: старая программа
control_group = [70, 72, 68, 71, 69] # mean = 70
# Экспериментальная группа: новая программа (случайно выбраны)
treatment_group = [85, 88, 82, 87, 86] # mean = 85.6
# T-тест
t_stat, p_value = stats.ttest_ind(control_group, treatment_group)
if p_value < 0.05:
print("Новая программа статистически значимо повышает оценки!")
print("И это ДА является причинно-следственной связью!")
print("Потому что группы случайно выбраны (контролируем смешанные переменные)")
Почему это работает:
- Случайное назначение → избегаем смешанных переменных
- Контрольная группа → сравниваем с baseline
- Изолированное вмешательство → меняем только одно
Критерии для установления причинно-следственности (Hill's Criteria)
То, что нужно проверить для более надёжного вывода:
- Сила связи — насколько сильна корреляция?
- Консистентность — повторяется ли результат в разных исследованиях?
- Специфичность — А вызывает именно В (не что-то другое)?
- Временность — причина идёт ДО следствия (X → Y, а не Y → X)?
- Биологический механизм — есть ли логический механизм?
- Dose-response — больше X → больше Y?
- Экспериментальное свидетельство — подтверждается экспериментом?
# Пример проверки временности:
# ✗ Неправильно: зарплата в 2024 и опыт в 2025
# Зарплата не может быть следствием будущего опыта!
# ✓ Правильно: опыт в 2024 и зарплата в 2025
# Логичный порядок: опыт → потом зарплата
Инструменты для анализа
1. Корреляционная матрица (сначала смотрим)
import pandas as pd
df = pd.DataFrame({
'age': [25, 30, 35, 40, 45],
'salary': [50000, 60000, 70000, 80000, 90000],
'years_exp': [2, 5, 8, 11, 14]
})
print(df.corr())
# age salary years_exp
# age 1.000 0.999 0.998 ← Все коррелируют!
# salary 0.999 1.000 0.998
# years_exp 0.998 0.998 1.000
2. Диаграмма разброса (scatter plot)
import matplotlib.pyplot as plt
plt.scatter(age, salary)
plt.title('Зарплата vs Возраст')
plt.show()
# Смотрим паттерн:
# - Линейный тренд → скорее всего есть связь
# - Облако точек → скорее всего нет связи
# - Несколько изолированных точек → выбросы
3. Регрессионный анализ
from sklearn.linear_model import LinearRegression
X = df[['age']].values
y = df['salary'].values
model = LinearRegression()
model.fit(X, y)
print(f"Коэффициент: {model.coef_[0]:.2f}")
# Интерпретация: за каждый год возраста
# зарплата растёт на X долларов
# Но это может быть из-за опыта (скрытая переменная)!
Практический чеклист при анализе
- Вычислил корреляцию
- Проверил статистическую значимость (p-value)
- Посмотрел диаграмму разброса
- Подумал о скрытых переменных
- Проверил направление причины (временность)
- Не путаю корреляцию с причинностью в выводах
- Документирую, что это корреляция, а не причина
Итог
Корреляция:
- Две переменные меняются вместе
- Может быть найдена через статистику
- НЕ означает причину
Причинно-следственная связь:
- Одна переменная ВЫЗЫВАЕТ другую
- Требует экспериментального доказательства
- Или очень сильной логики и исключения альтернатив
Золотое правило: Корреляция — это гипотеза для дальнейшего изучения, а не вывод. Всегда спрашивай себя: "А может ли быть третья переменная?" и "А может быть обратная причина?"