Формулата на коефициента на корелация на Pearson в SQL
Както обсъдихме на нашата страница „Използване на корелационната функция на PostgreSQL“, използването на корелацията може да ви покаже как са свързани две серии от числа. Или тяхната сила като положителна корелация, или силата им като отрицателна корелация и всякаква сила между тях, включително никаква корелация.
За да обобщим малко коефициента на корелация:
Коефициентът на корелация е широко използван метод за определяне на силата на връзката между две числа или два набора от числа. Този коефициент се изчислява като число между -1 и 1. 1 е възможно най-силната положителна корелация, а -1 е възможно най-силната отрицателна корелация.
Положителната корелация означава, че с увеличаване на едно число, второто число също ще се увеличава.
Отрицателна корелация означава, че с увеличаване на едно число, второто число намалява.
Тук не се определя дали резултатът от второто число е ПРИЧИНЕН или не от първото, просто резултатите от двете числа се случват съвместно един с друг.
Ако формулата върне 0, тогава няма абсолютно НИКАКВА корелация между двата набора от числа.
Формулата на Пиърсън изглежда така:
Както беше очертано, има начини за изчисляване на формулата на Пиърсън за набор от числа в SQL.
Направихме го тук с номер, зададен от източник на демонстрационни данни, който идва безплатно с пробен период.
Тази формула в SQL изглежда така:
((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)))
И се използва в цяла заявка като тази:
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
Това, което ще видим от тази заявка, е точно това, което ще видим с помощта на функцията corr() в PostgreSQL: