De Pearson Correlatiecoëfficiënt-formule in SQL
Zoals we hebben besproken op onze pagina "De PostgreSQL-correlatiefunctie gebruiken", kan het gebruik van de correlatie u laten zien hoe twee reeksen getallen aan elkaar gerelateerd zijn. Ofwel hun kracht als een positieve correlatie of hun kracht als een negatieve correlatie, en elke hoeveelheid kracht daartussenin, inclusief helemaal geen correlatie.
Om een klein beetje samen te vatten over de correlatiecoëfficiënt:
De correlatiecoëfficiënt is een veelgebruikte methode om de sterkte van de relatie tussen twee getallen of twee reeksen getallen te bepalen. Deze coëfficiënt wordt berekend als een getal tussen -1 en 1. waarbij 1 de sterkst mogelijke positieve correlatie is en -1 de sterkst mogelijke negatieve correlatie.
Een positieve correlatie betekent dat als een getal stijgt, het tweede getal ook toeneemt.
Een negatieve correlatie betekent dat als één getal toeneemt, het tweede getal afneemt.
Of de uitkomst van het tweede nummer wel of niet wordt VEROORZAAKT door het eerste, wordt hier niet bepaald, alleen dat de uitkomsten van de twee nummers samen plaatsvinden.
Als de formule 0 retourneert, is er absoluut GEEN correlatie tussen de twee reeksen getallen.
De formule van Pearson ziet er als volgt uit:
Zoals werd geschetst, zijn er manieren om de Pearson-formule voor een reeks getallen in SQL te berekenen.
We hebben het hier gedaan op een nummerset uit onze demo-gegevensbron, die gratis wordt geleverd bij een proefversie.
Die formule in SQL ziet er als volgt uit:
((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)))
En gebruikt in een hele zoekopdracht zoals deze:
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
Wat we uit deze query zouden zien, is precies wat we zouden zien met de functie corr() in PostgreSQL: