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

Какую зависимость ищет корреляция?

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

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

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

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

Какую зависимость ищет корреляция?

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

Определение корреляции

Коэффициент корреляции Пирсона (Pearson Correlation Coefficient):

r = Σ((X - μ_X) * (Y - μ_Y)) / √(Σ(X - μ_X)² * Σ(Y - μ_Y)²)

или в нормализованной форме:

r = cov(X, Y) / (σ_X * σ_Y)

где:
- r ∈ [-1, 1]
- cov(X, Y) — ковариация
- σ_X, σ_Y — стандартные отклонения

Интерпретация коэффициента корреляции

r = +1    → Идеальная положительная корреляция (все точки на прямой, растёт)
r = +0.7  → Сильная положительная корреляция
r = +0.3  → Слабая положительная корреляция
r = 0     → Нет линейной корреляции
r = -0.3  → Слабая отрицательная корреляция
r = -0.7  → Сильная отрицательная корреляция
r = -1    → Идеальная отрицательная корреляция (все точки на прямой, падает)

Визуализация разных коэффициентов корреляции

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 3, figsize=(12, 8))

# Данные
np.random.seed(42)
X = np.random.randn(100)

# Разные корреляции
correlations = [
    (1.0, "r = 1.0 (идеальная положительная)"),
    (0.7, "r = 0.7 (сильная положительная)"),
    (0.0, "r = 0.0 (нет корреляции)"),
    (-0.7, "r = -0.7 (сильная отрицательная)"),
    (-1.0, "r = -1.0 (идеальная отрицательная)"),
]

for idx, (corr, title) in enumerate(correlations):
    ax = axes[idx // 3, idx % 3]
    
    # Генерируем Y с заданной корреляцией
    Y = corr * X + np.sqrt(1 - corr**2) * np.random.randn(100)
    
    ax.scatter(X, Y, alpha=0.6)
    ax.set_title(title)
    ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

Практическое вычисление в Python

import numpy as np
import pandas as pd
from scipy.stats import pearsonr

# Создаём данные
data = pd.DataFrame({
    'height': [160, 165, 170, 175, 180, 185, 190],
    'weight': [55, 62, 70, 78, 85, 92, 100]
})

# Способ 1: pandas
correlation = data['height'].corr(data['weight'])
print(f"Корреляция (pandas): {correlation:.4f}")

# Способ 2: scipy (с p-value)
corr_coefficient, p_value = pearsonr(data['height'], data['weight'])
print(f"Корреляция (scipy): {corr_coefficient:.4f}")
print(f"p-value: {p_value:.6f}")

# Способ 3: numpy
correlation_numpy = np.corrcoef(data['height'], data['weight'])[0, 1]
print(f"Корреляция (numpy): {correlation_numpy:.4f}")

# Результат: 0.9987 (очень сильная положительная корреляция)

Матрица корреляции (Correlation Matrix)

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# Создаём датасет
data = pd.DataFrame({
    'age': [25, 30, 35, 40, 45, 50, 55],
    'salary': [30, 40, 50, 60, 70, 80, 90],
    'experience': [1, 5, 10, 15, 20, 25, 30],
    'education_years': [16, 16, 17, 18, 18, 19, 20]
})

# Вычислить матрицу корреляции
correlation_matrix = data.corr()
print(correlation_matrix)
#                    age   salary  experience  education_years
# age            1.000000  0.981652    0.978373         0.571429
# salary         0.981652  1.000000    0.989552         0.612372
# experience     0.978373  0.989552    1.000000         0.532806
# education_years 0.571429  0.612372    0.532806        1.000000

# Визуализировать heatmap
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0)
plt.show()

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

1. Корреляция Пирсона (Pearson) — ЛИНЕЙНАЯ

from scipy.stats import pearsonr

X = np.array([1, 2, 3, 4, 5])
Y = np.array([2, 4, 6, 8, 10])  # Y = 2*X (идеальная линейная)

corr, pval = pearsonr(X, Y)
print(f"Пирсон: {corr:.4f}")  # 1.0000

2. Корреляция Спирмена (Spearman) — МОНОТОННАЯ

from scipy.stats import spearmanr

X = np.array([1, 2, 3, 4, 5])
Y = np.array([2, 4, 5, 4, 10])  # монотонная, но не линейная

corr, pval = spearmanr(X, Y)
print(f"Спирмен: {corr:.4f}")  # более высокая, чем Пирсон

3. Корреляция Кендалла (Kendall Tau)

from scipy.stats import kendalltau

X = np.array([1, 2, 3, 4, 5])
Y = np.array([2, 4, 5, 4, 10])

corr, pval = kendalltau(X, Y)
print(f"Кендалл: {corr:.4f}")

Критическое предупреждение: Корреляция != Причинность

# Пример 1: Ложная корреляция
years = np.arange(2000, 2020)
nicolas_cage_movies = np.array([1, 3, 3, 2, 2, 1, 2, 7, 5, 4, 6, 3, 3, 3, 1, 0, 2, 1, 2, 3])
swimming_pool_deaths = np.array([109, 102, 102, 98, 98, 85, 95, 56, 62, 112, 72, 55, 73, 75, 87, 95, 86, 79, 98, 123])

correlation = np.corrcoef(nicolas_cage_movies, swimming_pool_deaths)[0, 1]
print(f"Корреляция: {correlation:.3f}")  # 0.666

# Очевидно, что это совпадение, не причинность!

Когда корреляция может быть ненадёжной

1. Нелинейные связи

X = np.linspace(-3, 3, 100)
Y = X**2  # нелинейная зависимость

corr = np.corrcoef(X, Y)[0, 1]
print(f"Корреляция Пирсона: {corr:.4f}")  # близко к 0
# Но связь ОЧЕНЬ сильная! Просто не линейная.

2. Выбросы (Outliers)

X = np.array([1, 2, 3, 4, 100])
Y = np.array([2, 4, 6, 8, 9])

corr = np.corrcoef(X, Y)[0, 1]
print(f"Корреляция с выбросом: {corr:.4f}")  # сильно искажена

3. Гетероскедастичность

Y может зависеть от X, но разброс может быть неоднородным
→ Пирсон может не уловить сложную связь

p-value в корреляции

from scipy.stats import pearsonr

X = np.random.randn(100)
Y = np.random.randn(100)  # совершенно независимы

corr, p_value = pearsonr(X, Y)
print(f"Корреляция: {corr:.4f}, p-value: {p_value:.4f}")

# Интерпретация p-value:
# p-value < 0.05 → корреляция статистически значимо отличается от нуля
# p-value >= 0.05 → корреляция может быть случайной