IDL/Math

누적형(cumulative) 히스토그램의 구현 및 활용

이상우_IDL 2015. 7. 10. 16:08
728x90

우리가 분포도라고 부르는 히스토그램(histogram)에는 원래 두가지 유형이 있습니다. 하나는 일반형(ordinary)으로 우리가 흔히 사용하는 방식입니다. 즉 각 구간(bin)별로 빈도수를 측정하는 방식으로 얻어집니다. 또 하나는 누적형(cumulative)으로 일반형 히스토그램에서 얻어진 구간별 빈도수를 이전 구간들의 값을 모두 누적시키는 방식으로 얻습니다. 따라서 일반형 히스토그램의 경우는 모든 구간별 빈도값들을 합하면 전체 갯수가 나오는 반면, 누적형 히스토그램에서는 마지막 구간의 값이 바로 전체 갯수가 됩니다. 물론 누적형의 경우 구간별 값을 전체 갯수로 나눠서 0~1 사이로 표준화된 값으로 나타내기도 합니다.


IDL에서는 일정 갯수의 값들로 구성된 배열에 대하여 HISTOGRAM이라는 내장함수를 사용하면 일반형 히스토그램에 해당되는 분포 결과를 쉽게 얻을 수 있습니다. 그러나 누적형 히스토그램의 경우는 구하는 방법이 잘 알려져 있지가 않습니다. 그냥 프로그래밍에의하여 해결할 수도 있겠지만, 좀 더 간단한 팁이 있습니다. 설명을 위하여 다음과 같이 예제 데이터를 만들어봅시다. 이 data라는 배열에는 10만개의 값들이 존재하며, 그 범위는 대략 0~30 정도에 해당됩니다.


data = RANDOMN(seed, 100000)+15.5+3*RANDOMN(seed, 100000)

PRINT, MIN(data), MAX(data)


먼저 구간을 0~1, 1~2, 2~3, ...., 29~30과 같은 방식으로 설정하여 히스토그램을 얻고 이 결과를 그림으로 그리는 방법은 다음과 같습니다. 그러면 다음 그림과 같은 일반형 히스토그램을 볼 수 있습니다.


bsz = 1

h = HISTOGRAM(data, MIN=0, MAX=30, BINSIZE=bsz, LOCATION=xloc)

win1 = WINDOW(DIMENSIONS=[600, 500])

p1 = BARPLOT(xloc+bsz/2., h, FILL_COLOR='orange', /CURRENT)



이번에는 같은 데이터를 대상으로 누적형 히스토그램을 얻는 방법입니다. 다음과 같이 TOTAL 함수를 /CUMULATIVE 키워드와 함께 사용하면 됩니다. N_ELEMENTS(data)로 나눠주는 것은 값을 0~1 범위로 맞춰주기 위함입니다. 이렇게 하면 다음 그림과 같은누적형 히스토그램을 쉽게 얻을 수 있습니다.


c = TOTAL(h, /CUMULATIVE)/N_ELEMENTS(data)

win2 = WINDOW(DIMENSIONS=[600, 500])

p2 = BARPLOT(xloc+bsz/2., c, FILL_COLOR='green', /CURRENT)



이와 같이, 누적형 히스토그램을 얻으려면 일단 HISTOGRAM 함수를 사용하여 일반형 히스토그램 결과를 먼저 얻은 다음 TOTAL 함수에 투입하는 방법을 사용하면 간단하게 해결이 됩니다. 사실 이런 방법을 잘 응용하면 또 다른 팁이 나오는데요. 바로 집단내에서 상위 또는 하위 몇 % 이내에 속하는 값들의 경계값을 얻을 수 있습니다. 흔히 통계에서 종종 언급되는 "몇 분위 수"와 같은 값을 산출하는 방법이 될텐데요. 이를 위해서는 위와 비슷한 과정이 또 나오는데 세부 내용은 다음과 같이 약간 다릅니다.


h = HISTOGRAM(data, NBINS=1000, LOCATION=xloc)

c = TOTAL(h, /CUMULATIVE)/N_ELEMENTS(data)


즉 여기서의 차이점은 HISTOGRAM 함수의 사용에 있어서 구간을 인위적으로 설정해주는 것이 아니라, 그냥 전체 구간의 시작은 최소값이고 끝은 최대값이 되도록 하되 그 사이 구간들의 갯수만 정해주는 방식을 사용했다는 점입니다. 그리고 바로 이어서 얻은 누적형 히스토그램 결과값을 이용하면 되는데요. 예를 들어서, 하위 5% 및 상위 5%의 경계값을 구하는 경우라면 다음과 같이 계산하면 됩니다.


PRINT, xloc[VALUE_LOCATE(c, [0.05, 0.95])]

      10.2621      20.6824

좀 더 확장해서 하위 5%, 10%, 20%, 상위 20%, 10%, 5%의 순서로 값을 얻고자 한다면 다음과 같이 하면 되겠지요.


PRINT, xloc[VALUE_LOCATE(c, [0.05, 0.10, 0.20, 0.80, 0.90, 0.95])]

      10.2621      11.4230      12.8050      18.1395      19.5216      20.6824


물론 이렇게 산출되는 값은 HISTOGRAM 함수에서 NBINS 키워드의 값(구간 갯수)에 따라 약간 달라질 수 있습니다. 위에서는 이 값을 1000으로 설정하고 결과를 산출했지만, 이 값을 원본 데이터의 갯수인 100000으로 설정해주면 어쩌면 더 정확한 결과값들은 나올 수도 있을겁니다. 어차피 이 값은 목적에 맞게 설정하면 됩니다.

LIST