sql >> Database >  >> RDS >> PostgreSQL

De Pearson-correlatiecoëfficiëntformule in SQL

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:


  1. Help alstublieft de SQL Server-statistieken te verbeteren!

  2. Hoe maak je een kolom uniek in SQL?

  3. Wat is Java's JPA-technologie?

  4. Hoe vind je vergelijkbare resultaten en sorteer je op overeenkomst?