지난 회에서는 IDL에서 상관관계(Correlation)를 정량적으로 나타내는 상관계수(Correlation Coefficient)를 산출하고 그 신뢰성을 검정하는 방법을 소개하였습니다. 결국 이 작업은 X, Y 데이터를 서로 비교하여 상호간의 변동에 있어서 선형의 연관관계(Linear Correlation)가 어느 정도 강하게 나타나는가를 확인하는 것이라고 볼 수 있습니다. 오늘은 X, Y 데이터 사이의 이러한 연관관계를 가장 잘 대변하는 선형의 수식을 얻은 과정, 즉 선형회귀(Linear Regression)라는 작업을 IDL에서 수행하는 방법을 소개하겠습니다. IDL에서는 이러한 작업을 위한 내장함수들이 따로 지원이 되는데, 바로 LINFIT 함수와 REGRESS 함수입니다. 사실 그냥 직선의 식을 나타내는 계수들을 얻기만 해도 된다면 둘 중 어느 것을 사용해도 무방합니다. 다만 두 함수는 세부 기능 측면에서 서로 약간의 차이가 있습니다. 따라서 이후의 예제에서는 두 함수를 모두 사용해보고 서로간에 어떤 차이가 있는가에 대해서도 살펴보겠습니다. 이 내용을 보시면, 똑같이 선형회귀라는 작업을 할 경우라 하더라도 어떤 경우에 LINFIT 함수를 사용하는 것이 더 좋고 어떤 경우에 REGRESS 함수를 사용하는 것이 더 좋을지에 대하여 감을 잡으실수 있을 것입니다. 오늘은 먼저 LINFIT 함수의 사용법을 관련 예제와 함께 자세히 알아보겠습니다.
먼저 예제 데이터는 지난 회 게시물에서 사용했던 X, Y 데이터를 그대로 사용하겠습니다. 그래서 지난 회 게시물에서 해보았던 표출 작업까지 일사천리로 먼저 진행을 해보면 해당 코드는 다음과 같습니다.
x = [1, 1, 2, 3, 4, 4, 5, 6, 6, 7]
y = [2.1, 2.5, 3.1, 3.0, 3.8, 3.2, 4.3, 3.9, 4.4, 4.8]
win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
p_y = PLOT(x, y, SYMBOL='circle', /SYM_FILLED, LINESTYLE=6, $
XRANGE=[0, 8], YRANGE=[0, 6], $
XTITLE='X data', YTITLE='Y data', FONT_SIZE=11, /CURRENT)
그리고 이 내용을 실행하여 표출된 그림은 다음과 같습니다. 일단 데이터 포인트들만 점으로 표출된 상태이며, 지난 회 게시물에서 봤던 그림과 동일합니다.
그러면 이제부터 LINFIT 함수를 이용하여 선형 회귀식을 구해봅시다. 기본적인 사용법은 매우 간단합니다. 다음과 같이 X, Y 데이터를 차례로 인수로 부여하면 됩니다.
coeff = LINFIT(x, y)
PRINT, 'Coefficients :', coeff
LINFIT 함수는 선형 회귀식의 상수 및 기울기 값으로 구성된 배열을 돌려줍니다. 즉 산출된 회귀식이 Y = A+BX 일 경우 [A, B]와 같은 형태의 배열을 결과로 돌려줍니다. 따라서 위의 코드에서 coeff는 그러한 배열이 됩니다. 출력된 값들을 확인해보면 다음과 같습니다.
Coefficients : 2.00245 0.386552
따라서 선형 회귀식은 대략 Y = 2.00+0.39X와 같은 형태가 된다는 얘기입니다. 그러면 이 식에 해당되는 직선을 추가적으로 표출해보는 것이 좋을 것입니다. 두가지 방법이 있습니다. 첫번째 방법은 앞서 산출된 계수 값들을 활용하여 다음과 같이 직선상의 새로운 Y값들로 구성된 배열 yf를 계산하여 얻는 것입니다. 그런 다음 이 배열을 활용하여 직선 플롯을 중첩하여 표출하면 됩니다. 이를 위하여 다음과 같은 과정을 추가적으로 수행합니다.
yf = coeff[0]+coeff[1]*x
p_yf = PLOT(xf, yf, /OVERPLOT)
이렇게 하면 다음 그림과 같이 데이터 포인트들과 회귀식의 모습을 함께 볼 수 있습니다.
이와 같이 회귀식에 대응되는 배열 yf를 계수들(상수 및 기울기)을 이용하여 직접 산출할 수도 있는데요. 더 간단한 방법도 있습니다. 애초에 LINFIT 함수를 사용할 때 YFIT 키워드를 함께 사용하여 yf 배열을 바로 구할 수도 있습니다. 앞서 LINFIT 함수가 사용되었던 내용을 다음과 같이 대체하면 됩니다.
coeff = LINFIT(x, y, YFIT=yf)
이런 식으로 yf를 얻어서 표출을 해도 결과 그림은 어차피 똑같습니다. 따라서 선형 회귀식의 방정식을 얻고 그 결과를 중첩 표출하는 과정은 이와 같습니다. 사실 간단하게 작업할 경우에는 이 정도 선에서 마무리를 해도 크게 문제는 없습니다.
그런데 여기서 더 나아가본다면, 이렇게 얻은 선형 회귀식이 과연 어느 정도 믿을만한 결과인가에 대하여 정량적인 판단이 필요할 수도 있습니다. 이런 경우에는 선형 회귀식의 신뢰성을 정량적으로 산출하는 과정까지 가야 하는데, 그 방법을 여기서 한번 살펴보도록 합시다. 사실 앞서 언급되었던 LINFIT 함수에서는 이러한 목적으로 사용 가능한 키워드들이 지원이 되는데, 바로 CHISQ 및 PROB 키워드들입니다. 이 키워드들에 빈 변수를 인수로 부여하면 그 변수를 통하여 해당 값을 돌려받을 수 있습니다. 따라서 다음과 같이 LINFIT 함수에서 이 키워드들을 함께 사용하여 그 값들을 얻어서 출력해 봅시다.
coeff = LINFIT(x, y, CHISQ=chisq, PROB=prob)
PRINT, 'CHISQR and PROB :', chisq, prob
여기서 출력된 값들은 다음과 같습니다.
CHISQR and PROB : 0.737604 0.999425
여기서 CHISQ 키워드를 통하여 얻어진 0.738이란 값은 Chi-Square Statistic 값으로서, 카이제곱 검정(Chi-Square Test)에서 이 값을 사용하여 신뢰성을 나타내는 확률 p값을 산출하게 됩니다. 일단 간단하게 언급한다면, 0.738이라는 Chi-Square Statistic 값에 대응되는 확률 p값은 0.999라는 얘기이고, 이 것은 선형 회귀식이 실제 데이터와 유사한 정도를 0~100 범위의 확률로 매겨본다면 99.9%가 된다는 얘기입니다. 즉 우리가 얻은 직선의 식이 실제 데이터의 변동 패턴을 제대로 반영하는 유사성의 확률이 99.9%라는 얘기입니다. 결과를 거의 100% 믿어도 된다는 뜻인데 과연 그럴까요?
사실 이러한 해석에 있어서는 세심한 주의를 기울일 필요가 있습니다. 왜냐하면 Chi-Square Statistic 값을 얻는 과정에는 우리가 미처 보지 못했던 중요한 요소가 하나 숨어있기 때문입니다. 바로 표준 측정 오차(Standard Measurement Error)라는 것인데요. 이것은 실제 데이터의 각각의 Y값마다 가질 수 있는 측정 오차에 해당되는데, LINFIT 함수를 사용할 때 MEASURE_ERRORS 키워드를 통하여 우리가 직접 설정해줘야 하는 요소입니다. 이 키워드에 부여되는 인수는 배열 y를 구성하는 모든 값들 하나하나에 대한 오차값들로 구성된 배열이 되어야 합니다. 그런데 우리가 앞서 LINFIT 함수를 사용할 때에는 이 키워드를 전혀 고려하지 않았다는 점을 상기할 필요가 있습니다. 만약 사용자가 이와같이 MEASURE_ERRORS 키워드를 전혀 고려하지 않을 경우에는, N이 데이터 포인트 갯수라고 한다면 MEASURE_ERRORS 키워드에는 1.0이란 값들 N개로 구성된 배열이 부여됩니다. 이것이 MEASURE_ERRORS 키워드의 디폴트 값입니다. 그리고 이 값은 CHISQ 및 PROB 키워드로 산출되는 값들에도 직접 영향을 미칩니다. 그렇게 때문에 만약 MEASURE_ERRORS 키워드에 우리가 뭔가 다른 값을 부여하게 되면 결과는 달라지게 된다는 점을 반드시 유념해야 합니다. 확인을 위하여 다음과 같이 1.0 대신 0.5라는 값들 N개로 구성된 배열을 인위적으로 만들어서 MEASURE_ERRORS 키워드에 부여하고 그 결과를 봅시다.
errs = MAKE_ARRAY(n, VALUE=0.5)
coeff = LINFIT(x, y, CHISQ=chisq, PROB=prob, MEASURE_ERRORS=errs)
PRINT, 'CHISQR and PROB :', chisq, prob
이 때 산출된 결과값들은 다음과 같습니다.
CHISQR and PROB : 2.95042 0.937431
앞서 얻었던 결과와는 분명한 차이를 보입니다. 여기서는 유사성의 확률이 93.7%로 앞서 산출되었던 99.9%보다는 더 낮아졌습니다. 만약 MEASURE_ERRORS 키워드에 부여되는 오차의 값을 더 감소시키면 유사성 확률은 더 낮아질 것입니다. 실제로 오차 값을 0.4로 설정하면 유사성 확률은 79.8%가 되고, 0.3일 경우에는 41.5%로 현저히 낮아집니다. 정성적으로 생각해보면 측정오차의 값을 크게 잡을 경우에는 이론적인 값으로부터 실제 Y값이 벗어나도 되는 허용한계가 더 커지게 됩니다. 그러면 이론값과 실제값 사이의 차이가 좀 커도 서로 유사하다고 판정될 가능성이 높아집니다. 유사성 확률에 대하여 더 너그럽게 판정이 된다는 얘기입니다. 그렇기 때문에 측정 오차의 값을 크게 잡으면 유사성 확률이 높아지게 됩니다. 반대로 측정 오차의 값을 작게 잡을 경우에는 이론적인 값으로부터 실제 Y값이 벗어나도 되는 허용한계가 더 작아지게 됩니다. 그러면 이론값과 실제값 사이의 차이가 조금만 생겨도 서로 유사하지 않다고 판정될 가능성이 높아집니다. 그렇기 때문에 측정 오차의 값을 작게 잡을 경우에는 유사성 확률도 낮아지게 됩니다.
그리고 Chi-Square Statistic 값은 LINFIT 함수의 CHISQ 키워드를 사용하여 바로 얻을 수 있지만, 이 값을 다음과 같은 방법으로 직접 산출하는 것도 가능합니다.
chisq = TOTAL((y-yf)^2/errs^2)
PRINT, chisq
즉 이와 같이 계산해도 약 2.95라는 동일한 값이 산출됩니다. 이것은 Chi-Square Statistic 값을 산출하는 기본 이론에 바탕을 둔 것입니다. 그리고 이렇게 계산된 chisq 값에 대응되는 확률값은 역시 LINFIT 함수의 PROB 키워드를 사용하여 바로 구할 수 있지만, 직접 산출하는 것도 가능합니다. 이를 위해서는 카이제곱 분포 함수(Chi-Square Distribution Function)를 이용해야 하는데요. 여기서는 다음과 같이 카이제곱 분포 함수에 해당되는 IDL 내장함수인 CHISQR_PDF 함수를 사용하면 됩니다.
prob = 1-CHISQR_PDF(chisq, n-2)
PRINT, prob
이렇게 출력된 값은 약 0.937로서 PROB 키워드로 얻은 값과 같습니다. 여기서 n은 앞선 게시물에서 산출했던 값으로 데이터 총 갯수입니다. 그런데 여기서는 n-2라는 값이 CHISQR_PDF 함수에서 두번째 인수로 투입되었는데, 이 n-2는 자유도(Degree of Freedom)에 해당되는 값입니다. 즉 카이제곱 분포 함수에 카이제곱 값과 DoF값이 인수로서 사용되어 산출된 값을 1로부터 빼주면 바로 유사성 확률이 됩니다. 이 역시 카이제곱 검정 이론에 바탕을 둔 것입니다.
따라서 지금까지 소개된 내용을 다시 정리해본다면, 실제 데이터인 X와 Y 사이의 관계를 대변하는 선형 회귀선을 LINFIT 함수를 사용하여 쉽게 얻을 수 있고, 실제 데이터와 회귀선 사이의 유사성에 대한 각종 검정값들을 LINFIT 함수의 해당 키워드들을 간단하게 사용하여 쉽게 구할 수도 있습니다. 그리고 유사성에 대한 검정값들을 산출하는 과정은 카이제곱 검정(Chi-Square Test) 기법을 근거로 하는데, 이 기법의 특성상 검정값들은 각 포인트마다의 측정 오차를 어느 정도로 가정하느냐에 따라 좌우될 수 밖에 없다는 특성이 있습니다. 즉 측정 오차의 값을 제대로 알지 못한다면, 산출되는 유사성 확률이라는 값 자체를 과연 믿을 수 있는지에 대해서도 쉽게 판단하기 어려울 수도 있습니다. 따라서 뭔가 다른 검정법을 사용하는 것이 필요할 것으로 보이는데요. 이와 관련된 내용은 다음 회 게시물에서 REGRESS 함수를 소개하면서 언급하기로 하겠습니다.
'IDL > Math' 카테고리의 다른 글
중복되지 않는 난수들의 생성법 (업데이트) (0) | 2020.01.02 |
---|---|
상관관계 및 선형회귀 결과 산출 및 검정 [3] (0) | 2019.05.02 |
상관관계 및 선형회귀 결과 산출 및 검정 [1] (0) | 2019.04.18 |
IDL로 Monte Carlo 방법을 테스트해봅시다 (0) | 2019.03.18 |
사분위수(Quartile) 값의 계산 (0) | 2019.02.25 |