La formule du coefficient de corrélation de Pearson en SQL
Comme nous en avons discuté sur notre page "Utilisation de la fonction de corrélation PostgreSQL", l'utilisation de la corrélation peut vous montrer comment deux séries de nombres sont liées. Soit leur force en tant que corrélation positive, soit leur force en tant que corrélation négative, et toute force entre les deux, y compris aucune corrélation.
Pour récapituler un peu sur le coefficient de corrélation :
Le coefficient de corrélation est une méthode largement utilisée pour déterminer la force de la relation entre deux nombres ou deux ensembles de nombres. Ce coefficient est calculé comme un nombre compris entre -1 et 1. 1 étant la corrélation positive la plus forte possible et -1 étant la corrélation négative la plus forte possible.
Une corrélation positive signifie qu'à mesure qu'un nombre augmente, le deuxième nombre augmentera également.
Une corrélation négative signifie qu'à mesure qu'un nombre augmente, le deuxième nombre diminue.
Que le résultat du deuxième nombre soit CAUSE ou non par le premier n'est pas déterminé ici, juste que les résultats des deux nombres se produisent de concert.
Si la formule renvoie 0, il n'y a absolument AUCUNE corrélation entre les deux ensembles de nombres.
La formule de Pearson ressemble à ceci :
Comme indiqué, il existe des moyens de calculer la formule de Pearson pour un ensemble de nombres en SQL.
Nous l'avons fait ici sur un nombre défini à partir de notre source de données de démonstration, qui est gratuite avec un essai.
Cette formule en SQL ressemble à ceci :
((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)))
Et utilisé dans une requête entière comme celle-ci :
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
Ce que nous verrions à partir de cette requête est exactement ce que nous verrions en utilisant la fonction corr() dans PostgreSQL :