PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

La formula del coefficiente di correlazione di Pearson in SQL

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: