주가정보를 통해 EDF를 산출해서 그 기업의 부도위험을 구하는... 어쩌고 저쩌고...가 있는데...


거기에 정규분포 함수를 사용해야 한다고 하는데 오라클에는 그 함수가 없다고 한다.


응?


고등학교 때 배웠던 통계의 정규분포를 이용한 확률을 구하는 거, 그거 엑셀에서 본 적 있는데, 그게 오라클에서 없다고??? 삼각함수, 로그함수 등등 많이 있던 걸로 기억하는데 정규분포가 없다고?


참고로 엑셀에서는 아래와 같은 함수로 구한다.


=NORMDIST(입력값, 평균, 표준편차, 누적여부) /* 요건 Excel 2007과 그 이전까지 */

=NORM.DIST(입력값, 평균, 표준편차, 누적여부) /* 요건 Excel 2010 이후 */


근데 저게 오라클에 없다고?


흠...


뒤져보니 사실이었다... 어쨌거나 업무상 구현은 해야 하니, 인터넷을 뒤져서 오라클에서 정규분포 함수를 구현해보기로 했...


사실 이게 처음부터 최적 솔루션을 찾기는 했는데 당췌 숫자를 이해를 못해서 그냥 지나쳤는데, 시행착오 끝에 결국 맨 처음에 검색했던 게 적당한 거라는 걸 알게 됐다.


지금부터 나가는 얘기는 그 삽질의 시작...


일단 정규분포식의 그래프와 공식을 보자.



정규분포 확률 밀도.jpg





본 적은 있지만, 이해는 해본 적 없는 공식...


어떤 집단이 평균이 μ 이고, σ 가 표준편차인 정규분포를 따른다고 할 때에... 통계적인 내용은 나도 기억 안나고 그때도 이해 못했으니, 이하 자세한 설명은 생략한다. 여튼 저 무시무시한 함수에 x 를 집어넣으면 나오는 값은 그래프의 빨간색 점선, 즉 높이라고 생각하면 된다.


저 함수에 x, μ (평균), σ (표준편차)를 입력했을 때 값이 나오게 하는 SQL은 찬찬히 뜯어 보면 의외로 쉽다.


먼저 저 식의 첫 부분은 아래와 같다.


정규분포 확률 밀도 부분 1.jpg


σ (표준편차) 는 입력되어야 하는 값으료 :stdv 변수로 치환한다.


1 / ( :stdv * SQRT( 2 * ACOS( -1 ) ) )


SQRT 는 루트를 씌우는 함수인데 중간에 ACOS( -1 ) 가 원주율 π 를 뜻한다.


COS 함수와 ACOS 함수는 서로 역함수로 COS( x ) = y 이면 ACOS( y ) = x 라는 관계가 성립한다. 고로 COS(π) = –1 이기 때문에 ACOS(–1)은 π 가 된다.



정규분포 확률 밀도 부분 2.jpg


나머지 뒷 부분은 자연로그의 밑수 e 의 지수함수 형태인데 이건 오라클과 엑셀 등에서는 EXP 함수를 쓴다.


그리고 나머지 제곱 부분은 POWER (세제곱, 4제곱 모두 사용 가능)를 이용한다.


x 는 입력값이므로 :InpVal, μ (평균)은 :mean 변수로 치환한다.


EXP(-   POWER( ( :InpVal - :mean ), 2 )
         /      ( 2 * POWER( :stdv, 2 ) )
      )



최종적으로 나타낸 식은 다음과 같다.


SELECT 1 /
          ( :stdv * SQRT( 2 * ACOS( -1 ) ) )
       *  EXP( - POWER( ( :InpVal - :mean ), 2 )
                 / ( 2 * POWER( :stdv, 2 ) )
             )
FROM DUAL
;


평균이 50이고, 표준편차가 20인 정규분포집단에서 40일 경우 확률밀도함수의 값은?


정규분포 확률 밀도 결과 01.jpg



엑셀에서는 어떤가 볼까.


정규분포 확률 밀도 결과 01 (엑셀).jpg



간단하게 구현됐다.


그 다음은 표준정규분포 확률밀도 함수 파트이다.


다양한 정규 분포.png


사실 정규분포는 평균과 표준편차에 따라 다양하게 나타날 수 있다. 가운데 길쭉 솟은 놈과 역시 가운데이기는 하지만 파란색의 그래프는 평균은 같은데 표준편차가 다른 놈, 그리고 그 놈과 높이는 같은데 중심이 좌우로 되어 있는 건 표준편차는 같은데 평균은 다른 놈들...


표준정규분포라는 건, 정규분포 중에서도 μ (평균)이 0, σ (표준편차)가 1인 정규분포를 가리킨다. (위의 여러 정규분포곡선 중에서 가운데의 낮은 파란색의 그래프)


이 경우 위의 정규분포 확률밀도 함수가 더 간단해진다.


표준정규분포 확률 밀도.jpg




이에 따른 SQL은 다음과 같이 나온다.


SELECT 1 /
          ( SQRT( 2 * ACOS( -1 ) ) )
       *  EXP( - POWER( ( :InpVal ), 2 )
                 / ( 2 )
             )
       AS STD_RGL
FROM DUAL
;


표준정규분포에서 입력값이 1일 경우 확률밀도 함수의 값은?


표준정규분포 확률 밀도 결과 01.jpg



엑셀로 검증해보자.


표준정규분포 확률 밀도 결과 01 (엑셀).jpg


NORMDIST 함수로 입력값 1, 평균 0, 표준편차 1로 계산해볼 수도 있고, 아예 표준정규분포용 함수인 NORM.S.DIST(입력값, 누적 여부) 를 설정해서 볼 수도 있다. (2010 버전 이후부터)


여튼 SQL이나 엑셀이나 똑같이 나왔다. 일단 정규분포의 확률밀도 함수는 간단하게 해결된 거 같다.


하지만 이렇게 간단하다면 사람들이 그런 반응을 보였을리가 없을 것이다. 왜 간단하지 않은 걸까. 사실은 우리가 원하는 건 저 확률밀도 함수가 아니라 누적함수를 원하기 때문...


자세한 건 다음 삽질기록으로.

profile

이브리타, 나의 에뜨와르
너와 내가 공유하는 추억
너와 내가 만들 추억