← Назад к вопросам

В чём разница между корреляцией и причинно-следственной связью?

1.0 Junior🔥 232 комментариев
#Статистика и A/B тестирование

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Корреляция vs Причинно-следственная связь

Основное различие

Корреляция — это статистическая связь между двумя переменными, означающая, что они изменяются вместе.

Причинно-следственная связь (Causation) — это реальное влияние одной переменной на другую, где изменение одной ВЫЗЫВАЕТ изменение другой.

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

Ложная корреляция: Количество пожарников на пожаре коррелирует с размером ущерба от пожара. Но пожарники не ВЫЗЫВАЮТ ущерб — оба факта объясняются третьей переменной: размером пожара.

Типы корреляций

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import pearsonr

# Пример 1: Реальная причинно-следственная связь
# Количество часов обучения → результаты экзамена
hours_studied = np.array([1, 2, 3, 4, 5, 6, 7, 8])
exam_score = hours_studied * 10 + np.random.normal(0, 5, len(hours_studied))

corr, pval = pearsonr(hours_studied, exam_score)
print(f"Корреляция обучения-результата: {corr:.3f}, p-value: {pval:.4f}")
# Корреляция: 0.99 (очень сильная)
# Причинность: ДА, обучение вызывает улучшение результата

# Пример 2: Ложная корреляция (общий причинитель)
# Мороженое продажи коррелируют с утопающими
icecream_sales = np.array([10, 15, 20, 25, 30, 25, 20, 15])
drowning_deaths = np.array([5, 8, 12, 15, 18, 16, 12, 8])

corr2, pval2 = pearsonr(icecream_sales, drowning_deaths)
print(f"Корреляция мороженого-утопающих: {corr2:.3f}, p-value: {pval2:.4f}")
# Корреляция: 0.95 (сильная)
# Причинность: НЕТ. Оба зависят от ТЕМПЕРАТУРЫ (скрытая переменная)

# Пример 3: Случайная корреляция
noise1 = np.random.randn(100)
noise2 = np.random.randn(100)

corr3, pval3 = pearsonr(noise1, noise2)
print(f"Корреляция случайного шума: {corr3:.3f}, p-value: {pval3:.4f}")
# Корреляция: ~0 (нет связи)
# Причинность: НЕТ (просто случайность)

Визуализация: Анскомбе квартет

Знаменитый пример Фрэнсиса Анскомба показывает 4 набора данных с ОДИНАКОВОЙ корреляцией, но совершенно разными паттернами:

import pandas as pd
import matplotlib.pyplot as plt

# Данные Анскомбе
data = {
    'x1': [10, 8, 13, 9, 11, 14, 6, 4, 12, 7, 5],
    'y1': [8.04, 6.95, 7.58, 8.81, 8.33, 9.96, 7.24, 4.26, 10.84, 4.82, 5.68],
    
    'x2': [10, 8, 13, 9, 11, 14, 6, 4, 12, 7, 5],
    'y2': [9.14, 8.14, 8.74, 8.77, 9.26, 8.1, 6.13, 3.1, 9.13, 7.26, 4.74],
    
    'x3': [10, 8, 13, 9, 11, 14, 6, 4, 12, 7, 5],
    'y3': [7.46, 6.77, 12.74, 7.11, 7.81, 8.84, 6.08, 5.39, 8.15, 6.42, 5.73],
    
    'x4': [8, 8, 8, 8, 8, 8, 8, 19, 8, 8, 8],
    'y4': [6.58, 5.76, 7.71, 8.84, 8.47, 7.04, 5.25, 12.5, 5.56, 7.91, 6.89]
}

df = pd.DataFrame(data)

# Все четыре набора имеют ОДИНАКОВЫЙ результат статистики:
print("Означаемые X: все ≈ 9.0")
print(f"X1: {df['x1'].mean():.2f}, X2: {df['x2'].mean():.2f}, X3: {df['x3'].mean():.2f}, X4: {df['x4'].mean():.2f}")

print("\nОжидаемые Y: все ≈ 7.5")
print(f"Y1: {df['y1'].mean():.2f}, Y2: {df['y2'].mean():.2f}, Y3: {df['y3'].mean():.2f}, Y4: {df['y4'].mean():.2f}")

print("\nКорреляция: все ≈ 0.816")
for i in range(1, 5):
    corr = df[f'x{i}'].corr(df[f'y{i}'])
    print(f"Корреляция {i}: {corr:.3f}")

print("\nНО визуально:")
print("1. Линейная связь")
print("2. Нелинейная кривая")
print("3. Идеальная линия с одним выбросом")
print("4. Вертикальная линия с одной точкой в стороне")

Критерии для выявления причинности (Грэнджер)

Критерии Брэдфорда Хилла (в эпидемиологии, применимо к Data Science):

  1. Сила связи — сильная корреляция более правдоподобна
  2. Консистентность — результат повторяется в разных исследованиях
  3. Специфичность — причина вызывает конкретный эффект
  4. Временная последовательность — причина ПРЕДШЕСТВУЕТ следствию
  5. Биологический градиент — дозозависимый эффект
  6. Правдоподобность — есть механизм, объясняющий связь
  7. Альтернативные объяснения исключены — контроль конфаундеров
# Пример проверки временной последовательности
import pandas as pd

# Данные временного ряда
df = pd.DataFrame({
    'date': pd.date_range('2020-01-01', periods=12, freq='M'),
    'marketing_spend': [1000, 1500, 2000, 2500, 3000, 3500, 3000, 2500, 2000, 1500, 1000, 500],
    'sales': [5000, 5500, 6000, 6800, 7500, 8200, 7800, 7200, 6500, 5800, 5000, 4000]
})

# Проверить: маркетинг в месяц T коррелирует с продажами в месяц T+1?
# Если ДА → есть временная последовательность (более вероятна причинность)

df['marketing_lag'] = df['marketing_spend'].shift(1)

corr_same_month = df['marketing_spend'].corr(df['sales'])
corr_next_month = df['marketing_lag'].corr(df['sales'].shift(-1))

print(f"Корреляция маркетинг(t) ← продажи(t): {corr_same_month:.3f}")
print(f"Корреляция маркетинг(t-1) → продажи(t): {corr_next_month:.3f}")

if corr_next_month > corr_same_month:
    print("ПРИЗНАК причинности: маркетинг влияет на будущие продажи")
else:
    print("Может быть обратная связь или общий причинитель")

Методы для выявления причинности

1. Рандомизированные управляемые эксперименты (RCT)

  • Gold standard для причинности
  • Случайно распределить группы на контрольную и тестовую
import numpy as np
from scipy import stats

# Эксперимент: влияет ли новый алгоритм на конверсию?
n_users = 1000

# Контрольная группа (старый алгоритм)
control = np.random.binomial(1, 0.05, n_users // 2)  # 5% конверсия

# Тестовая группа (новый алгоритм)
treatment = np.random.binomial(1, 0.08, n_users // 2)  # 8% конверсия

# t-test
t_stat, p_value = stats.ttest_ind(control, treatment)
print(f"p-value: {p_value:.4f}")
if p_value < 0.05:
    print("Разница СТАТИСТИЧЕСКИ ЗНАЧИМА → алгоритм влияет на конверсию")

2. Причинный вывод (Causal Inference)

  • DAG (Directed Acyclic Graph) — граф причинных связей
  • Методы: Propensity Score Matching, Instrumental Variables

3. Грэнджер причинность (для временных рядов)

from statsmodels.tsa.stattools import grangercausalitytests

# X грэнджер-вызывает Y, если прошлые значения X улучшают предсказание Y
data = np.column_stack([marketing_spend, sales])
grangercausalitytests(data, max_lag=3)

Примеры ложных корреляций

  • Мороженое и утопающие → оба зависят от ТЕМПЕРАТУРЫ
  • Обувь и рак лёгкого → оба зависят от ВОЗРАСТА (старые люди больше обув)
  • Рост и математические навыки у детей → оба зависят от ВОЗРАСТА
  • Ночные совы и депрессия → ночные совы могут иметь другие стрессоры

Правило для Data Scientist

Корреляция ≠ Причинность

Это главное правило машинного обучения и статистики. Статистическая связь НЕ доказывает влияние одной переменной на другую.

Практические рекомендации

  1. Всегда визуализируй данные (не полагайся только на коэффициент корреляции)
  2. Ищи скрытые переменные (конфаундеры) — часто есть третья переменная
  3. Проверяй временную последовательность — причина должна предшествовать следствию
  4. Используй эксперименты когда возможно — это лучший способ доказать причинность
  5. Консультируйся с экспертами — они могут помочь идентифицировать истинные причины

Заключение

Корреляция показывает связь между переменными, но НЕ доказывает причинность. Причинность требует более глубокого анализа, контроля конфаундеров и часто — проведения экспериментов. Data Scientist должен всегда помнить, что statistically significant correlation может быть совершенно бессмысленной без понимания реального механизма воздействия.