A fórmula do coeficiente de correlação de Pearson em SQL
Como discutimos em nossa página “Usando a função de correlação do PostgreSQL”, usar a correlação pode mostrar como duas séries de números estão relacionadas. Ou sua força como uma correlação positiva ou sua força como uma correlação negativa, e qualquer quantidade de força entre elas, incluindo nenhuma correlação.
Para recapitular um pouco sobre o Coeficiente de Correlação:
O Coeficiente de Correlação é um método amplamente utilizado para determinar a força da relação entre dois números ou dois conjuntos de números. Este coeficiente é calculado como um número entre -1 e 1. 1 sendo a correlação positiva mais forte possível e -1 sendo a correlação negativa mais forte possível.
Uma correlação positiva significa que, à medida que um número aumenta, o segundo número também aumenta.
Uma correlação negativa significa que, à medida que um número aumenta, o segundo número diminui.
Se o resultado do segundo número é ou não CAUSADO pelo primeiro não está sendo determinado aqui, apenas que os resultados dos dois números acontecem em conjunto um com o outro.
Se a fórmula retornar 0, então não há absolutamente nenhuma correlação entre os dois conjuntos de números.
A Fórmula de Pearson se parece com isso:
Como foi descrito, existem maneiras de calcular a Fórmula Pearson para um conjunto de números em SQL.
Fizemos isso aqui em um conjunto de números de nossa fonte de dados de demonstração, que vem de graça com um teste.
Essa fórmula no SQL se parece com isso:
((tot_sum - (amt_sum * act_sum / _count)) / sqrt((amt_sum_sq - pow(amt_sum, 2.0) / _count) * (act_sum_sq - pow(act_sum, 2.0) / _count)))
E usado em uma consulta inteira como esta:
SELECT
((tot_sum - (amt_sum * act_sum / _count)) / sqrt((amt_sum_sq - pow(amt_sum, 2.0) / _count) * (act_sum_sq - pow(act_sum, 2.0) / _count))) AS "Corr Coef Using Pearson"
FROM(
SELECT
sum("Amount") AS amt_sum,
sum("Activities") AS act_sum,
sum("Amount" * "Amount") AS amt_sum_sq,
sum("Activities" * "Activities") AS act_sum_sq,
sum("Amount" * "Activities") AS tot_sum,
count(*) as _count
FROM(
SELECT
DATE_TRUNC('day', p.payment_date)::DATE AS "Day",
SUM(p.amount) AS "Amount",
COUNT(DISTINCT a.activity_id) AS "Activities"
FROM
public.payments p
INNER JOIN public.subscriptions s ON p.subscription_id = s.subscription_id
INNER JOIN public.users u ON s.user_id = u.user_id
INNER JOIN public.activity a ON a.user_id = u.user_id
GROUP BY 1) as a
) as b
GROUP BY tot_sum, amt_sum, act_sum, _count, amt_sum_sq, act_sum_sq
O que veríamos dessa consulta é exatamente o que veríamos usando a função corr() no PostgreSQL: