← Назад к вопросам
Какую зависимость ищет корреляция?
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 → корреляция может быть случайной