Wzór na współczynnik korelacji Pearsona w SQL
Jak omówiliśmy na naszej stronie „Używanie funkcji korelacji PostgreSQL”, użycie korelacji może pokazać, jak dwie serie liczb są powiązane. Albo ich siła jako korelacja dodatnia, albo siła jako korelacja ujemna i dowolna siła pomiędzy nimi, w tym brak korelacji w ogóle.
Podsumowując współczynnik korelacji:
Współczynnik korelacji to szeroko stosowana metoda określania siły związku między dwiema liczbami lub dwoma zestawami liczb. Współczynnik ten jest obliczany jako liczba od -1 do 1,1 oznacza najsilniejszą możliwą korelację dodatnią, a -1 oznacza najsilniejszą możliwą korelację ujemną.
Dodatnia korelacja oznacza, że wraz ze wzrostem jednej liczby, druga liczba również wzrośnie.
Ujemna korelacja oznacza, że wraz ze wzrostem jednej liczby druga liczba maleje.
To, czy wynik drugiej liczby jest SPOWODOWANY przez pierwszą, nie jest tutaj określane, po prostu wyniki dwóch liczb są ze sobą zgodne.
Jeśli formuła zwraca 0, to nie ma absolutnie ŻADNEJ korelacji między dwoma zestawami liczb.
Formuła Pearsona wygląda tak:
Jak już wspomniano, istnieją sposoby na obliczenie wzoru Pearsona dla zestawu liczb w SQL.
Zrobiliśmy to tutaj na zestawie liczbowym z naszego źródła danych demonstracyjnych, które jest dostępne bezpłatnie wraz z wersją próbną.
Ta formuła w SQL wygląda tak:
((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)))
I używane w całym zapytaniu, tak jak to:
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
To, co zobaczylibyśmy z tego zapytania, jest dokładnie tym, co zobaczylibyśmy za pomocą funkcji corr() w PostgreSQL: