컴퓨터 오라클 SQL에서 정규분포식 구현 3 - 누적확률 함수 (소수 6째자리까지 정밀도)
2015.07.28 23:36
앞에서처럼 컴퓨터를 노가다 뛰게 하는 SQL을 만들고서는 어떻게 하면 속도를 개선할까, 정밀도를 높일까... 했는데... 이게 근사식을 만드는 공식이 있었다. 그것도 아주 여러 레코드(Row)를 SUM 하지 않고서도 한 번에 계산이 되는.
애초에 누적정규분포를 구하는 공식은 아래와 같은 적분식인데...
이 적분을 나타나게 해주는 일반적인 식이 없다...라는 게 인터넷 검색 결과였는데... 근사식은 있었던 거...
자 공식 한 번 보자.

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 을 변환해도 상관없고.
결과나 보자.

엑셀 결과는 아래와 같다.

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


여기서는 소수점 이하 6째 자리까지만 맞다.
이와 같이 이 SQL은 이후에 나올 정밀도 높은 거보다는 길이가 짧고, 바탕 수식도 이해하기 쉬워서 소수점 이하 6째 자리 정도로만 해도 충분할 경우에는 (고등학교 통계 시간에 본 정규분포표도 소수점 이하 4째 자리까지만 나온다) 저걸로 써도 된다.
하지만 소수점 이하 10째 자리 이상의 정밀도가 필요할 경우에는 다음 글의 SQL을 사용해야 한다.
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 | 추천 수 |
|---|---|---|---|---|---|
| 835 | 예송논쟁 | RanomA | 2003.01.14 | 3938 | 0 |
| 834 | 갑자사화와 연산군식의 개혁 | RanomA | 2003.01.14 | 2297 | 0 |
| 833 | 이인화와 영원한 제국 | RanomA | 2003.01.14 | 1636 | 0 |
| 832 |
이상한 신문...
| RanomA | 2003.01.14 | 1023 | 10 |
| 831 | 필요한 건 상상력과 꼼꼼함... 그리고 긴 호흡... | RanomA | 2003.02.02 | 1249 | 0 |
| 830 | 일단 1권 다 읽었음... | RanomA | 2003.02.03 | 1398 | 0 |
| 829 | 추가로 영화와 책의 차이점. | RanomA | 2003.02.04 | 1327 | 0 |
| 828 | 성종이 어우동에게 느꼈던 분노감 | RanomA | 2003.02.11 | 2450 | 0 |
| 827 | 비둘기 가족을 부른 이석이라는 사람... | RanomA | 2003.02.16 | 1571 | 0 |
| 826 | 대한민국의 맘에 안드는 점 하나... | RanomA | 2003.02.19 | 1284 | 0 |
| 825 | 저는 오늘 꽃을 받았어요. [3] | RanomA | 2003.02.23 | 1516 | 0 |
| 824 | 난방보다 냉방이 어려운 이유... | RanomA | 2003.02.24 | 1911 | 0 |
| 823 | 그들이 하고픈 말은... [1] | RanomA | 2003.03.04 | 1210 | 0 |
| 822 | 제로보드와 내 홈피 게시판의 차이... | RanomA | 2003.03.09 | 2271 | 0 |
| 821 |
자료실의 첨부파일 개수가 무한대로...
| RanomA | 2003.03.26 | 1157 | 0 |
| 820 | MySQL 백업관련 명령어 몇 개 | RanomA | 2003.03.28 | 1123 | 0 |
| 819 |
MySQL 매뉴얼
| RanomA | 2003.03.28 | 936 | 14 |
| 818 |
Informix FAQ for Monitor, Tune, Support
| RanomA | 2003.04.08 | 926 | 11 |
| 817 | '근로자의 날'보다는 '노동절'이라고 칭합시다. | RanomA | 2003.04.29 | 981 | 0 |
| 816 | 나이수~~~ 유시민~~~ [2] | RanomA | 2003.04.29 | 1047 | 0 |






