sql >> Databasteknik >  >> RDS >> PostgreSQL

Pearsons korrelationskoefficientformel i SQL

Pearsons korrelationskoefficientformel i SQL

Som vi diskuterade på vår sida "Använda PostgreSQL-korrelationsfunktionen" kan du med hjälp av korrelationen visa hur två serier av tal är relaterade. Antingen deras styrka som en positiv korrelation eller deras styrka som en negativ korrelation, och vilken styrka som helst däremellan, inklusive ingen korrelation alls.

För att sammanfatta lite om korrelationskoefficienten:

Korrelationskoefficienten är en allmänt använd metod för att bestämma styrkan av sambandet mellan två tal eller två uppsättningar tal. Denna koefficient beräknas som ett tal mellan -1 och 1. 1 är den starkaste möjliga positiva korrelationen och -1 är den starkast möjliga negativa korrelationen.

En positiv korrelation betyder att när ett tal ökar kommer även det andra talet att öka.

En negativ korrelation betyder att när ett tal ökar minskar det andra talet.

Huruvida resultatet av det andra numret orsakas av det första bestäms inte här, bara att resultaten av de två numren sker i samverkan med varandra.

Om formeln returnerar 0 så finns det absolut INGEN korrelation mellan de två uppsättningarna av siffror.

Pearsons formel ser ut så här:

Som beskrivits finns det sätt att beräkna Pearson-formeln för en uppsättning tal i SQL.

Vi gjorde det här på ett antal uppsättningar från demodatakällan, som kommer gratis med en testversion.

Den formeln i SQL ser ut så här:

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

Och används i en hel fråga som denna:

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

Det vi skulle se från den här frågan är exakt vad vi skulle se med funktionen corr() i PostgreSQL:


  1. Var är mina patchar?

  2. Finns det något sätt att inaktivera uppdateringar/borttagningar men ändå tillåta triggers att utföra dem?

  3. Vad betyder ORDER BY (SELECT NULL)?

  4. Förstå transaktioner i SQL