Vzorec Pearsonova korelačního koeficientu v SQL
Jak jsme diskutovali na naší stránce „Using the PostgreSQL Correlation Function“, použití korelace vám může ukázat, jak spolu souvisí dvě řady čísel. Buď jejich síla jako pozitivní korelace, nebo jejich síla jako negativní korelace a jakékoli množství síly mezi tím, včetně žádné korelace.
Abychom si trochu shrnuli korelační koeficient:
Korelační koeficient je široce používaná metoda stanovení síly vztahu mezi dvěma čísly nebo dvěma sadami čísel. Tento koeficient se vypočítá jako číslo mezi -1 a 1. 1 je nejsilnější možná pozitivní korelace a -1 je nejsilnější možná negativní korelace.
Kladná korelace znamená, že jak se jedno číslo zvyšuje, druhé číslo se také zvyšuje.
Záporná korelace znamená, že jak se jedno číslo zvyšuje, druhé číslo klesá.
Zda je nebo není výsledek druhého čísla ZPŮSOBEN tím prvním, zde není určeno, pouze to, že výsledky dvou čísel jsou ve vzájemné shodě.
Pokud vzorec vrátí 0, pak mezi těmito dvěma sadami čísel neexistuje absolutně ŽÁDNÁ korelace.
Pearsonův vzorec vypadá takto:
Jak bylo nastíněno, existují způsoby, jak vypočítat Pearsonův vzorec pro sadu čísel v SQL.
Udělali jsme to zde na počtu souborů z našeho demo zdroje dat, který je zdarma ke zkušební verzi.
Ten vzorec v SQL vypadá takto:
((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)))
A používá se v celém dotazu, jako je tento:
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
Z tohoto dotazu bychom viděli přesně to, co bychom viděli pomocí funkce corr() v PostgreSQL: