yunsh206

회원가입로그인

앞에서처럼 컴퓨터를 노가다 뛰게 하는 SQL을 만들고서는 어떻게 하면 속도를 개선할까, 정밀도를 높일까... 했는데... 이게 근사식을 만드는 공식이 있었다. 그것도 아주 여러 레코드(Row)를 SUM 하지 않고서도 한 번에 계산이 되는.

 

애초에 누적정규분포를 구하는 공식은 아래와 같은 적분식인데...누적 정규분포 적분식.jpg

이 적분을 나타나게 해주는 일반적인 식이 없다...라는 게 인터넷 검색 결과였는데... 근사식은 있었던 거...

 

자 공식 한 번 보자.

 

 

누적정규분포 근사식(소수 6째자리).jpg

 

 

 

 

a0 = 0.2316419
a1 = 0.319381530
a2 = –0.356563782
a3 = 1.781477937
a4 = –1.821255978
a5 = 1.330274429

 

근사식만 봐도 골치아플 거 같다. 이해하기 싫으면 그냥 아래 SQL을 퍼가기만 하자.

 

 

SELECT  CASE
            WHEN :InpVal >= :mean THEN 1 - FX_VAL /* 입력값이 평균보다 이상일 경우 */
            ELSE FX_VAL                           /* 입력값이 평균보다 작을 경우 */
        END AS REGULAR_DISTRIBUTE
FROM
    (
        SELECT  (
                    (A1 * Y)
                  + (A2 * POWER(Y, 2))
                  + (A3 * POWER(Y, 3))
                  + (A4 * POWER(Y, 4))
                  + (A5 * POWER(Y, 5))
                )
                *
                  ----------------------------
                  -- 아래는 위 수식의 f(x) 부분
                  ----------------------------
                  (   EXP( -1 * POWER(X, 2) / 2)
                    / SQRT( 2 * ACOS(-1) )        /* SQRTPI(2) */
                  )
                AS FX_VAL
        FROM
            (
                SELECT   A0
                       , A1
                       , A2
                       , A3
                       , A4
                       , A5
                       , X
                       , 1 / (1 + (A0 * X)) AS Y
                FROM
                    (
                        SELECT    0.2316419     AS A0
                                , 0.319381530   AS A1
                                , -0.356563782  AS A2
                                , 1.781477937   AS A3
                                , -1.821255978  AS A4
                                , 1.330274429   AS A5
                                , ABS( :InpVal - :mean ) / :stdv AS X   /* 표준정규분포 변환식 */
                        FROM    DUAL
                    )
           )
     )
;


SQL 의 주석이랑 수식을 비교해보면 대충 감이 올 거다. 안오면 할 수 없고. 위의 SQL은 표준정규분포의 누적함수 개념을 차용했지만, 변환식을 중간에 넣어놨기 때문에 사용자가 입력값들을 표준정규분포로 변환할 필요는 없다. 물론 평균 0, 표준편차 1로 하는 걸로 :InpVal 을 변환해도 상관없고.

 

결과나 보자.

 

누적정규분포 근사 SQL(소수 6째자리) 결과 01.jpg

 

엑셀 결과는 아래와 같다.

 

 

상당히 많이 근접했다. 이 케이스의 경우 소수점 이하 8째 자리까지이지만 일반적으로는 6째 자리까지라고 한다.

 

 

 

그럼 다른 케이스를 검증해보자.

 

누적정규분포 근사 SQL(소수 6째자리) 결과 02.jpg

 

누적정규분포 근사 SQL(소수 6째자리) 결과 02 (엑셀).jpg

 

여기서는 소수점 이하 6째 자리까지만 맞다.

 

이와 같이 이 SQL은 이후에 나올 정밀도 높은 거보다는 길이가 짧고, 바탕 수식도 이해하기 쉬워서 소수점 이하 6째 자리 정도로만 해도 충분할 경우에는 (고등학교 통계 시간에 본 정규분포표도 소수점 이하 4째 자리까지만 나온다) 저걸로 써도 된다.

 

하지만 소수점 이하 10째 자리 이상의 정밀도가 필요할 경우에는 다음 글의 SQL을 사용해야 한다.

 

 

 

번호 제목 글쓴이 날짜 조회 수 추천 수
835 리눅스 새 하드 장착하기 RanomA 2021.12.01 599 0
834 리눅스 SSH Network error: Software caused connection abort RanomA 2021.05.29 2017 0
833 인터넷 기본 설정 복원 창 띄우는 방법들 file RanomA 2021.05.01 1022 0
832 리눅스 디렉토리별 압축 파일 생성 쉘 스크립트 RanomA 2021.04.04 830 0
831 Javascript 숫자에 끊어 읽기 컴마(,) 추가 RanomA 2020.11.27 751 0
830 Javascript 문자열을 포맷 맞춰 날짜로, 날짜를 포맷 맞춘 문자열로 변환 RanomA 2020.11.26 718 0
829 Javascript 날짜 더하기 RanomA 2020.11.26 450 0
828 Javascript 해당 연월의 마지막 날짜 가져오기 RanomA 2020.11.25 364 0
827 Javascript isNullOrEmpty RanomA 2020.11.25 685 0
826 Javascript 전화번호 포매팅 RanomA 2020.11.25 2308 0
825 Javascript IN RanomA 2020.11.18 260 0
824 Javascript LPAD RanomA 2020.11.17 581 0
823 Adobe Creative Cloud 업데이트 실패 184(혹은 C184) 오류 file RanomA 2020.09.08 1070 0
822 오라클 테이블 레이아웃 조회 Query RanomA 2020.01.13 2063 0
821 SQL Developer의 폰트 설정에서 폰트 목록이 안나타날 때 [6] file RanomA 2019.12.30 4869 0
820 Underscore( _ 문자)를 카멜 케이스(Camel Case)로 변환하기 RanomA 2019.12.06 1814 0
819 라이트룸(Adobe Lightroom) 한자/일본어용 폰트 변경 file RanomA 2018.06.06 2142 0
818 마녀의 빗자루와 악마와의 파티 RanomA 2018.03.23 890 0
817 크레인 안전 점검이 허술해진 게 이명박 때가 아니다? RanomA 2018.01.06 708 0
816 인도 중국의 분쟁 지역 file RanomA 2017.08.17 1293 0