sql >> Base de Datos >  >> RDS >> PostgreSQL

La fórmula del coeficiente de correlación de Pearson en SQL

La fórmula del coeficiente de correlación de Pearson en SQL

Como discutimos en nuestra página "Uso de la función de correlación de PostgreSQL", el uso de la correlación puede mostrarle cómo se relacionan dos series de números. Ya sea su fuerza como una correlación positiva o su fuerza como una correlación negativa, y cualquier cantidad de fuerza intermedia, incluida la ausencia total de correlación.

Para recapitular un poco sobre el coeficiente de correlación:

El coeficiente de correlación es un método ampliamente utilizado para determinar la fuerza de la relación entre dos números o dos conjuntos de números. Este coeficiente se calcula como un número entre -1 y 1. 1 es la correlación positiva más fuerte posible y -1 es la correlación negativa más fuerte posible.

Una correlación positiva significa que a medida que un número aumenta, el segundo número también aumentará.

Una correlación negativa significa que a medida que un número aumenta, el segundo número disminuye.

Aquí no se determina si el resultado del segundo número es CAUSADO por el primero, solo que los resultados de los dos números suceden en conjunto.

Si la fórmula devuelve 0, entonces NO hay absolutamente ninguna correlación entre los dos conjuntos de números.

La fórmula de Pearson se ve así:

Como se describió, hay formas de calcular la fórmula de Pearson para un conjunto de números en SQL.

Lo hicimos aquí en un conjunto de números de nuestra fuente de datos de demostración, que viene gratis con una prueba.

Esa fórmula en SQL se ve así:

((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)))

Y se usa en una consulta completa 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

Lo que veríamos de esta consulta es exactamente lo que veríamos usando la función corr() en PostgreSQL: