[oracle] 선형회귀 함수

재현·2024년 6월 12일
post-thumbnail

🔍 선형회귀 함수

✍ 선형회귀는 데이터를 기반으로 선형 관계를 찾고, 이를 바탕으로 미래의 값을 예측하거나 현재의 데이터를 분석하는데 독립 변수와 종속 변수 간의 선형 관계를 모델링하는 기법

🔍 선형회귀 함수 기본 형식

✍ y=mx+b

위치설명
y종속 변수
m독립 변수
x기울기 및 경사도
by-절편

🔍 REGR_AVGX 함수

✍ 두 개의 숫자 입력을 사용하여 회귀 직선의 두 번째 인수(독립 변수)의 평균을 계산, AVG(X)와 같다.

SELECT AVG(SALARY)
FROM EMPLOYEES
WHERE COMMISSION_PCT IS NOT NULL; -- 8900 출력

-- REGR_AVGX(Y, X) = 두 번쨰 인수의 평균을 계산한다. 인수가 null인 값 쌍을 무시한다. 
-- 즉 Y가 NULL이 아니라면 X의 평균을 구한다.
SELECT
    AVG(SALARY),
    REGR_AVGX(COMMISSION_PCT, SALARY)
FROM EMPLOYEES; -- COMMISSION_PCT가 NULL이 아닌 경우에만 SALARY의 평균을 구한다.

🔍 REGR_AVGY 함수

✍ 두 개의 숫자 입력을 사용하여 회귀 직선의 첫 번째 인수(종속 변수)의 평균을 계산, AVG(Y)와 같다.

-- REGR_AVGY(Y, X) = 첫 번쨰 인수의 평균을 계산한다. 인수가 null인 값 쌍을 무시한다. 
-- 즉 X가 NULL이 아니라면 Y의 평균을 구한다.
SELECT
    AVG(SALARY),
    REGR_AVGY(SALARY, COMMISSION_PCT)
FROM EMPLOYEES; -- COMMISSION_PCT가 NULL이 아닌 경우에만 SALARY의 평균을 구한다.

🔍 REGR_COUNT 함수

✍ 첫 번째 인수(종속 변수)의 값이 NULL값이 아닌 두 번째 인수(독립 변수)의 개수를 반환

SELECT * FROM EMPLOYEES 
WHERE MANAGER_ID IS NULL; -- 90번 부서 100번 사원의 매니저 아이디는 null

SELECT COUNT(*) 
FROM EMPLOYEES 
WHERE DEPARTMENT_ID = 90; -- 90번 부서는 3명

-- REGR_COUNT(Y, X) = 두 인수의 값이 NOT NULL인 쌍 수를 계산합니다. 
-- (Y의 값이 NULL이 아닌 X의 갯수를 구하는)
-- MANAGER_ID가 NULL이 아닌 DEPARTMENT_ID의 갯수를 구하는 쿼리
-- 자세히 보면 90번 부서의 갯수가 2인 것을 보아하니 MANAGER_ID가 NULL인 값을 제외되었다.
SELECT DISTINCT DEPARTMENT_ID,
        REGR_COUNT(MANAGER_ID, DEPARTMENT_ID) 
            OVER(PARTITION BY DEPARTMENT_ID) REGR_COUNT 
FROM EMPLOYEES
ORDER BY DEPARTMENT_ID;

🔍 REGR_SLOPE 함수

✍ 회귀 직선의 기울기 측정(REGR_SLOPE), 계산 공식은 COVAR_POP(y, x) / VAR_POP(x)

-- REGR_SLOPE(Y, X) = 회귀 직선의 기울기를 측정하는 데 사용된다. 
-- REGR_INTERCEPT(Y, X) = 회귀 직선의 Y절편을 반환한다.
SELECT JOB_ID, EMPLOYEE_ID, SALARY,
    ROUND(SYSDATE-HIRE_DATE) WORKING_DAY,
    ROUND(REGR_SLOPE(SALARY, SYSDATE-HIRE_DATE)
            OVER(PARTITION BY JOB_ID), 2) REGR_SLOPE,
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 80
ORDER BY JOB_ID, EMPLOYEE_ID;

🔍 REGR_INTERCEPT 함수

✍ Y절편 반환(REGR_INTERCEPT), 계산 공식은 AVG(y) - REGR_SLOPE(y, x) * AVG(x)

-- REGR_INTERCEPT(Y, X) = 회귀 직선의 Y절편을 반환한다.
SELECT JOB_ID, EMPLOYEE_ID, SALARY,
    ROUND(SYSDATE-HIRE_DATE) WORKING_DAY,
    ROUND(REGR_INTERCEPT(SALARY, SYSDATE-HIRE_DATE)
            OVER(PARTITION BY JOB_ID), 2) REGR_INTERCEPT
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 80
ORDER BY JOB_ID, EMPLOYEE_ID;

🔍 REGR_R2 함수

✍ 회귀 분석에 대한 결정 계수를 반환

-- REGR_R2(Y, X) = 회귀 분석에 대한 결정 계수를 반환, 종속, 독립 변수간의 상관관계가 높을 수록 1에 가까워진다.
SELECT DISTINCT JOB_ID,
    ROUND(REGR_SLOPE(SALARY, SYSDATE-HIRE_DATE)
        OVER(PARTITION BY JOB_ID), 2) REGR_SLOPE,
    ROUND(REGR_INTERCEPT(SALARY, SYSDATE-HIRE_DATE)
        OVER(PARTITION BY JOB_ID), 2) REGR_INTERCEPT,
    ROUND(REGR_R2(SALARY, SYSDATE-HIRE_DATE)
        OVER(PARTITION BY JOB_ID), 2) REGR_R2
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 80;

📖 reference

https://atotw.tistory.com/21
인프런 오라클 데이터베이스 강의

profile
운동과 코딩

0개의 댓글