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: