통계에서 매우 기본적인 내용이라 할 수 있는 정규 분포(Normal or Gaussian Distribution)라는 개념이 있습니다. 그리고 정규 분포 함수라는 것도 있는데, 당연히 정규 분포의 패턴을 식으로 나타낸 것입니다. 이 식은 다음과 같습니다.
이러한 함수를 통해서 정규 분포의 여러가지 특성들을 확인할 수 있는데요. 오늘은 이 함수 패턴을 그림으로 그려보고, 몇몇 특성값들을 직접 계산해보는 예제들을 소개하고자 합니다. 먼저 이 함수의 패턴을 그림으로 그려보기 위하여 다음과 같은 예제 코드를 작성해 보았습니다. 아래의 내용을 통째로 test_gaussian.pro 파일로 저장해두고 컴파일 및 실행을 해보시면 됩니다.
FUNCTION MY_GAUSSIAN, x
sigma = 1.0
p = EXP(-x^2/(2*sigma^2))/(sigma*SQRT(2*!pi))
RETURN, p
END
PRO test_gaussian
x = [-5:5:0.1];(FINDGEN(101)-50)/10
sigma = 1.0
y = MY_GAUSSIAN(x)
HELP, y
PRINT, MIN(y), MAX(y)
win = WINDOW(DIMENSIONS=[600, 500])
pl = PLOT(x, y, XRANGE=[-5, 5], YRANGE=[0, 1], THICK=2, COLOR='crimson', $
SYMBOL='circle', /SYM_FILLED, SYM_FILL_COLOR='crimson', SYM_SIZE=0.7, $
/FILL_BACKGROUND, FILL_COLOR='light green', /CURRENT)
END
여기서는 평균값이 0인 경우로 가정하였습니다. 다만 표준편차의 값은 몇가지 값들로 테스트해보기 위하여 sigma라는 변수에 담는 방식을 사용하였습니다. 함수 패턴을 PLOT 함수를 사용하여 그리기 위해서는 x, y 배열을 생성해야 하는데요. 먼저 x 배열은 편의상 -5로 시작하여 5로 끝나며 0.1 간격인 값들로 구성되도록 하였습니다. 위 예제 코드에서 이렇게 x를 정의한 부분을 보면 [-5:5:0.1]과 같이 적혀 있는데, 이 문법은 IDL 8.3부터만 사용 가능합니다. 그 이전 버전의 IDL이라면 바로 옆에 주석 처리된 부분과 같이 FINDGEN 함수를 사용하면 됩니다. 그리고 정규 분포 함수의 패턴을 반영하는 MY_GAUSSIAN이라는 함수 프로그램을 직접 만들어주고, x를 여기에 투입하여 y의 값들을 산출하였습니다. 이 내용은 정규 분포의 식을 IDL 문법으로 표현한 것입니다. 이와 같이 함수 프로그램을 따로 만들어서 사용하는 것은 이유가 있는데요. 아래에서 다시 언급하기로 하겠습니다.어쨌든 이와 같이 x, y 배열을 정의하고 PLOT 함수에 투입하여 적절한 방식으로 그림을 그려보면 그 모습은 다음과 같습니다.
이제 분포 함수의 적분값을 계산해보기로 합니다. 어차피 정규 분포 함수를 X축상의 전체 구간에 대하여 적분을 계산하면 1이 나온다는 것은 당연합니다. 그런 식으로 정의된 함수니까요. 여기서는 IDL의 적분 계산 기능을 사용하여 직접 계산해볼텐데, 이를 위하여 적분 계산용 내장함수인 QROMB, QROMO, INT_TABULATED 등을 사용하고자 합니다. 이를 위하여 위 예제 코드의 END 직전에 다음과 같은 내용을 추가합시다. 여기서는 총 5종의 적분값들을 계산하였는데, 각각의 의미는 이어서 설명해 보겠습니다.
s1 = QROMB('MY_GAUSSIAN', -4, 4, /DOUBLE)
s2 = QROMO('MY_GAUSSIAN', 0, /MIDEXP, /DOUBLE)
s3 = QROMB('MY_GAUSSIAN', -1*sigma, 1*sigma, /DOUBLE)
s4 = INT_TABULATED(x, y, /DOUBLE)
PRINT, s1, s2, s3, s4
가장 먼저 s1, s2의 계산을 위하여 사용된 QROMB 함수는 닫힌 구간에 대한 적분을 계산하는 역할을 하는데, 이 함수에 관해서는 제가 여기서 예전에 다룬 적이 있으므로 그 내용을 참조하셔도 좋습니다. 방금 언급했듯이 QROMB 함수를 사용할 경우에는 적분 구간의 시작과 끝 값을 반드시 설정해줘야 합니다. 물론 정규 분포 함수가 X축 상에서 양쪽으로 무한대로 뻗어있긴 하지만, 그냥 -4 부터 +4까지의 구간에 대하여 적분값을 계산해 보았습니다. 그 값이 s1입니다. 출력된 s1의 값은 아마 0.99993666과 같을텐데 사실상 1이라고 보면됩니다. 우리의 기대와 당연히 일치하는 값입니다.
그렇다면 무한대로 뻗어나가는 구간에 대한 적분도 가능할까요? 사실 이러한 역할을 하는 내장함수가 따로 지원되는데 바로 QROMO입니다. 위 코드에서 s2를 계산하는데 이 함수가 사용되었습니다. 다만 이 함수의 경우 시작값은 반드시 유한한 값을 지정해주도록 되어 있습니다. 따라서 위와 같이 적분 구간의 시작을 0으로 설정하였고, 끝은 무한대로 뻗어나가도록 하기 위하여 /MIDEXP라는 키워드를 사용하였습니다. 이 s2의 값은 정확히 0.500000과 같이 산출되는데, 이는 전체 구간의 절반에 해당되는 값입니다. 결국 전체 구간에 대한 적분값은 정확히 1이 된다고 보면 됩니다.
그리고 세번째 값인 s3은 분포 함수 상에서 표준편차의 1배 값까지의 적분값을 계산한 것인데, 결국 이 값이 소위 1-sigma 확률로서 약 68.3%라고 알려진 값에 해당됩니다. 이러한 값을 실제로 적분에 의하여 계산해본 것이 바로 s3입니다. 적분의 구간은 (-) 및 (+) 방향으로 1-sigma 만큼 떨어진 지점으로 설정하고 적분을 수행한 결과 그 값은 0.68268949 정도의 값으로 산출됩니다. 만약 코드의 해당 내용을 다음과 같이 수정하면, 2-sigma 확률의 계산도 가능합니다. 그 값은 0.95449974 정도의 값으로 산출되며 우리가 통계학에서 배운 내용과 일치합니다.
s3 = QROMB('MY_GAUSSIAN', -2*sigma, 2*sigma, /DOUBLE)
네번째 s4는 약간 다른 방식으로 산출된 적분값인데, INT_TABULATED라는 내장함수를 사용하였습니다. 이 함수에 대해서도 제가 예전에 이 블로그에서 소개해드린 적이 있으므로 자세한 내용은 여기를 참조하시면 됩니다. 이 함수는 앞서 소개한 QROMB, QROMO와는 달리 식(formula)이 아닌 그냥 x, y 배열 자체를 인자로 받습니다. 즉, 데이터 포인트들 자체를 직접 사용하여 적분값을 계산해주는 함수입니다. 사실 x, y로 구성된 데이터 포인트들은 위의 그림에서 보듯이 간격이 0.1인데 나름 촘촘하지만 그렇다고 아주 촘촘한 편도 아닙니다. 하지만 적분값으로 산출된 s4의 값은 0.99999943 정도로서 사실상 1이라고 볼 수 있는 값으로서 얻어집니다. 나름 꽤 정확하게 산출이 되는 셈입니다.
위에서 사용한 정규 분포 함수의 형태는 sigma 변수의 값을 다르게 설정하여 변경해볼 수도 있습니다. 만약 sigma = 1.0이라고 되어 있는 두 줄의 내용을 sigma = 2.0으로 바꾸게 되면 폭이 더 넓어지는데 그 모습은 다음 그림과 같습니다.
그리고 반대로 sigma = 0.5으로 바꾸면 폭이 더 좁아지며 그 모습은 다음 그림과 같습니다.
그렇지만 이렇게 분포 함수의 패턴이 표준편차 값에 의해 변형된다고 해도, 앞서 산출했던 s1~s4의 값들은 거의 변하지 않습니다. 각 경우마다 산출된 값들을 직접 보면 확인이 가능합니다. 이건 뭐 정규 분포 함수의 특성상 당연한 얘기입니다.
오늘은 우리가 너무나 잘 아는 정규 분포 함수의 정량적 특성들을 위와 같이 직접 계산해 보았습니다. 여기서 소개한 기법들은 다른 함수 패턴들에 대해서도 충분히 적용 가능하므로 잘 기억해두시면 여러모로 활용 가능성이 있을 것으로 기대해 봅니다.
'IDL > Math' 카테고리의 다른 글
| 시스템 변수 !EXCEPT 소개 (0) | 2016.11.23 |
|---|---|
| 다중 선형 회귀법(Multi-Linear Regression)의 사용법 및 예제 (0) | 2016.11.14 |
| RANDOMU 함수를 사용한 난수 생성 (Part 2) (0) | 2016.08.01 |
| RANDOMU 함수를 사용한 난수 생성 (Part 1) (0) | 2016.07.28 |
| TRIANGULATE 프로시저 및 TRIGRID 함수의 이해 [2] (0) | 2016.05.19 |