La formula del coefficiente di correlazione di Pearson in SQL
Come abbiamo discusso nella nostra pagina "Utilizzo della funzione di correlazione PostgreSQL", l'utilizzo della correlazione può mostrarti come due serie di numeri sono correlate. O la loro forza come correlazione positiva o la loro forza come correlazione negativa e qualsiasi quantità di forza nel mezzo, inclusa nessuna correlazione.
Per ricapitolare un po' il coefficiente di correlazione:
Il coefficiente di correlazione è un metodo ampiamente utilizzato per determinare la forza della relazione tra due numeri o due insiemi di numeri. Questo coefficiente è calcolato come un numero compreso tra -1 e 1. 1 è la correlazione positiva più forte possibile e -1 è la correlazione negativa più forte possibile.
Una correlazione positiva significa che all'aumentare di un numero aumenterà anche il secondo numero.
Una correlazione negativa significa che all'aumentare di un numero, il secondo numero diminuisce.
Qui non viene determinato se l'esito del secondo numero sia CAUSATO o meno dal primo, solo che gli esiti dei due numeri accadono di concerto tra loro.
Se la formula restituisce 0, allora NON c'è assolutamente alcuna correlazione tra i due insiemi di numeri.
La formula di Pearson si presenta così:
Come è stato delineato, ci sono modi per calcolare la formula di Pearson per un insieme di numeri in SQL.
L'abbiamo fatto qui su un numero impostato dalla nostra fonte di dati demo, che viene fornito gratuitamente con una prova.
Quella formula in SQL è simile a questa:
((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 utilizzato in un'intera query come questa:
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
Quello che vedremmo da questa query è esattamente quello che vedremmo usando la funzione corr() in PostgreSQL: