IDL/Math

사분위수(Quartile) 값의 계산

이상우_idl 2019. 2. 25. 13:34
728x90
반응형

오늘은 IDL에서 사분위수(Quartile) 값을 계산하는 방법을 알아보겠습니다. 사분위수라는 것은 어떤 집단의 값들을 오름차순 즉 낮은 값에서부터 높은 값의 순서로 정렬하여 순위를 4등분하여 얻는 값으로서, 25%에 해당되는 값은 1/4분위수(Lower Quartile)이고 75%에 해당되는 값은 3/4분위수(Upper Quartile)가 됩니다. 50%에 해당되는 것이 중간값(Median)입니다. 물론 이러한 기본 원리를 그대로 적용하여 직접 값들을 크기 순으로 정렬(Sorting)하고 사분위수들을 직접 산출하는 것도 가능하겠지만, IDL에서는 이러한 사분위수 산출에 사용 가능한 내장함수가 지원됩니다. 다만 이 내장함수의 이름이 다소 길고 생뚱맞기도 한데, 바로 CREATEBOXPLOTDATA라는 함수입니다. 사실 이렇게 요상한 이름을 갖게 된 것은 BOXPLOT이라는 그래픽 함수의 기능과 연관된 부분이 있기 때문인데요. 먼저 예제 데이터를 사용하여 CREATEBOXPLOTDATA 함수의 사용법부터 살펴보겠습니다. 첫번째 예제 데이터는 다음과 같이 정의합니다.


data1 = FINDGEN(101)


이 데이터는 0으로 시작하고 1씩 증가하여 100으로 끝나는 총 101개의 실수값들로 구성됩니다. 이 데이터에 대하여 다음과 같이 함수를 적용하고 결과를 출력해 봅시다.


result1 = CREATEBOXPLOTDATA(data1)

HELP, result1

PRINT, result1, FORMAT='(5F10.2)'


출력된 결과는 다음과 같습니다.


RESULT1         DOUBLE    = Array[1, 5]

      0.00     24.50     50.00     75.50    100.00


원래 CREATEBOXPLOTDATA 함수는 총 5종의 값들을 얻게 되어 있으며 그 값들은 순서대로 다음과 같습니다.


최소값(Minimum), 1/4분위수(Lower Quartile), 중간값(Median), 3/4분위수(Upper Quartile), 최대값(Maximum)


따라서 위의 출력 결과에 나오는 5개의 값들은 순서대로 이러한 값들에 해당되며, 1/4분위수와 3/4분위수는 각각 24.5와 75.5임을 알 수 있습니다. 중간값은 50.0으로 산출되었습니다. 분위수 및 중간값의 산출 알고리즘에 대해서는 이 함수에 대한 세부 내용을 IDL 도움말에서 찾아보면 확인이 가능합니다. 그 내용은 다음과 같습니다.


  • The position of the lower quartile (Q1) is 0.25 * (n + 1). If this position is not an integer then the weighted average of the two surrounding positions is used.
  • The position of the median is 0.50 * (n + 1). If this position is not an integer then the weighted average of the two surrounding positions is used.
  • The position of the upper quartile (Q3) is 0.75 * (n + 1). If this position is not an integer then the weighted average of the two surrounding positions is used.


만약 다음과 같이 1로 시작하고 1씩 증가하여 99로 끝나는 값들로 구성된 예제 데이터를 사용할 경우에는 어떤 결과가 나올까요?


data2 = FINDGEN(99)+1

result2 = CREATEBOXPLOTDATA(data2)

PRINT, result2, FORMAT='(5F10.2)'


산출된 결과는 다음과 같습니다.


      1.00     25.00     50.00     75.00     99.00


같은 요령으로 다음과 같이 또 다른 예제 데이터들을 사용해 봅시다.


data3 = [15, 20, 35, 40, 50]

data4 = RANDOMU(seed, 1000, /NORMAL)*10+50


여기서 data4는 평균이 50이고 표준편차가 10인 정규분포를 따르는 1000개의 난수값들로 구성된 배열입니다. 다음과 같이 결과값들을 출력해 봅시다.


result3 = CREATEBOXPLOTDATA(data3)

PRINT, result3, FORMAT='(5F10.2)'

result4 = CREATEBOXPLOTDATA(data4)

PRINT, result4, FORMAT='(5F10.2)'


출력된 결과는 다음과 같습니다.


     15.00     17.50     35.00     45.00     50.00

     22.27     42.94     50.42     56.80     83.71


이와 같은 방식으로 CREATEBOXPLOTDATA 함수를 이용하면 됩니다. 이러한 결과들을 그림으로 표출하는 것도 가능합니다. 이를 위하여 사용 가능한 그래픽 함수가 바로 BOXPLOT 함수입니다. 앞서 얻은 result1부터 result4까지의 결과 배열들을 적절히 합쳐서 BOXPLOT 함수의 인수로 사용하면 됩니다. 그 내용은 다음과 같습니다.


results = [result1, result2, result3, result4]

HELP, results

nums = INDGEN(4)+1

win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)

p = BOXPLOT(nums, results, THICK=2, BACKGROUND_COLOR='linen', $

  FILL_COLOR='magenta', COLOR='blue', FONT_SIZE=11, $

  XTITLE='Data Number', YTITLE='Value', CLIP=0, /CURRENT)


여기서 한가지 주목해야 할 점은 result1부터 result4까지 4개의 배열들을 합성하여 results라는 배열을 만들어서 BOXPLOT 함수에 투입했다는 것입니다. 원래 CREATEBOXPLOTDATA 함수에서 산출된 결과 배열 각각은 1x5의 형태를 갖는데, 이들을 위와 같이 합성하여 4x5의 형태를 갖는 배열로 만들었습니다. 이것은 BOXPLOT 함수에 투입되는 인수는 Mx5의 형태를 갖는 배열이어야 하기 때문입니다. 여기서 M은 데이터의 종류의 갯수에 해당되는데, 지금의 예제에서는 data1부터 data4까지 총 4종이었기 때문입니다. 이렇게 BOXPLOT 함수에서받아들일 수 있는 인수의 형태로 결과를 산출하는 함수가 바로 CREATEBOXPLOTDATA입니다. 이름이 서로 연관성이 있는 것도 이러한 이유라고 보면 됩니다. 어쨌든 이렇게 얻은 그림은 다음과 같습니다.



CREATEBOXPLOTDATA 함수에서 사용되는 계산 알고리즘은 앞서 소개한 바와 같습니다. 제가 알기로는 통계학에서 주로 사용되는 알고리즘을 따르고 있는 것 같습니다. 만약 이와 다른 알고리즘을 사용해야 할 경우에는 SORT 함수를 사용하여 데이터의 값들을 정렬을 한 다음 직접 계산하는 방식으로 작업을 해야 할 것입니다.

반응형