yunsh206

회원가입로그인

주가정보를 통해 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이나 엑셀이나 똑같이 나왔다. 일단 정규분포의 확률밀도 함수는 간단하게 해결된 거 같다.

 

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

 

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

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