Корреляция может пригодиться в разных сценариях, например, когда мы строим модели линейной регрессии, отбираем признаки или бизнесово смотрим какие метрики линейно связаны ⛓️
Кажется, что
np.corrcoef(a, b)[0,1] достаточно. Ну или аналог ниже 🔽
import numpy as np
r = (np.cov([a,b], bias=True) / np.sqrt(np.var(a) * np.var(b)))[0][1]
Это хорошо, мы можем посчитать точечную оценку на выборке. Но! Мы же не знаем истинного значения коэффициента корреляции генеральной совокупности (также, как и средние, например). Выход: мы обычно строим доверительные интервалы на уровне значимости
alpha. Корреляция 0.8 звучит уверенно, но насколько мы в ней уверены статистически?
Когда это нам может пригодиться?
1. Аналитические исследования: насколько сильно линейно связаны метрики в продукте, для первой итерации по поиску прокси-метрик в 🆎
2. Сравнение корреляций между сегментами.
3. В 💻 насколько фича связана с целевой метрикой...
4. Мониторинг стабильности метрик. Если начала связь разъезжаться, возможно, поведение пользователей поменялось.
Ниже преобразование Фишера, которое делает распределение ближе к нормальному. Сгенерируем две случайные величины с корреляцией, равной 0.8. Для них посчитаем доверительный интервал Фишера на Python 🐍
from scipy.stats import norm
import numpy as np
np.random.seed(42)
n = 10000
rho = 0.8
mean = [0, 0]
cov = [[1, rho],
[rho, 1]]
x, y = np.random.multivariate_normal(mean, cov, size=n).T
r = np.corrcoef(x, y)[0, 1]
def fisher_ci(r, n, alpha=0.05):
z = np.arctanh(r)
se = 1/np.sqrt(n-3)
z_crit = norm.ppf(1-alpha/2)
lo = np.tanh(z - z_crit*se)
hi = np.tanh(z + z_crit*se)
return lo, hi
lo, hi = fisher_ci(r, n)
print(f"Доверительный интервал корреляции Пирсона: [{lo:.3f}, {hi:.3f}]")
Для Спирмена или Кендалла можно использовать бутстрап или другие приближения...
Если хотите разбор — какие вообще тесты (например для 🆎) бывают и когда какой использовать — ставьте 100 🕺, соберу подборку с примерами
А еще недавно у меня закончился ИС в 🛍, если вам интересно про это почитать, ставьте 100 😎
@zasql_python
