더북(TheBook)

계통 추출

아침부터 밤까지 특정한 지역을 지나간 차량의 번호를 모두 조사한 뒤 이들로부터 조사 대상을 뽑는 경우를 가정해보자. 가장 간단한 단순 임의 추출을 적용하여 차량 번호를 뽑는다면 우연히 아침 시간에 지나간 차량을 더 많이 뽑거나, 저녁 시간에 지나간 차량을 더 많이 뽑는 편향bias이 발생할 수 있다. 계통 추출Systematic Sampling은 이런 상황에서 해결책이 될 수 있다.

계통 추출은 모집단의 임의 위치에서 시작해 매 k번째 항목을 표본으로 추출하는 방법이다. 예를 들어, 1, 2, 3, …, 10의 수에서 3개의 표본을 뽑는다고 가정해보자. 10 / 3 = 3.33333…이므로 k = 3으로 놓는다. 표본 추출 시작 위치를 잡기 위해 1 ~ k 사이의 수 하나를 뽑는다. 이 수가 2라 하자. 나머지 두 수를 뽑기 위해 2 + k에 해당하는 5를 뽑는다. 다음, 5 + k에 해당하는 8을 뽑는다. 그러면 최종적으로 표본 2, 5, 8을 얻는다.

매우 단순한 방법이지만 데이터가 임의로 분포된 경우에는 단순 임의 추출 방법과 동일한 효과를 보이고, 데이터가 순서대로 나열된 순서 모집단Ordered Population(예를 들면, 1, 2, 3, …, 10과 같이 순서대로 나열된 모집단)의 경우 단순 임의 추출보다 좋은 표본을 추출한다.5 하지만 데이터에 일종의 주기성이 존재한다면(예를 들면, 데이터가 1, 2, 3, 1, 2, 3, …과 같이 주기적으로 반복되는 경우) 편향된 추정값6 을 얻게 된다. 이에 대한 자세한 분석은 참고자료 [4]를 보기 바란다.

계통 추출은 doBy 패키지의 sampleBy(formula, frac=0.1, replace=FALSE, data=parent.frame( ), systematic=FALSE) 함수를 사용하여 수행할 수 있다(‘4.5.3 sampleBy( )’ 절 참고). 계통 추출을 하려면 systematic 인자에 TRUE를 지정한다.

다음 예는 1:10을 저장한 데이터 프레임에서 3개의 표본을 계통 추출로 뽑는 예다. 코드에서 sampleBy( )의 첫 번째 인자는 ‘~ 1’이다. 그 이유는 첫 번째 인자가 표본을 추출할 그룹을 지정하는 포뮬러기 때문이다. 만약 그룹별로 데이터를 뽑는 층화 임의 추출이라면 그룹을 뜻하는 표현을 적어야 하지만, 여기서는 그룹의 구분이 없으므로 상수 1을 사용했다. 실행 결과 ‘1, 4, 7’ 3개의 표본이 뽑혔다.

> (x <- data.frame(x=1:10))
    x
1   1
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
10 10
> sampleBy(~1, frac=.3, data=x, systematic=TRUE)
  [,1] [,2] [,3]
1    1    4    7

5 이 경우 계통 추출이 단순 임의 추출에 비해 추정값(예를 들면, 평균)의 분산이 작다. 이를 ‘더 효율적이다’라고 말한다.

6 편향(biased)되었다는 말은 추정의 기댓값이 실제 측정하고자 하는 값과 다르다는 의미다. 예를 들어, 표본으로부터 평균을 계산하여 모집단의 평균을 추정할 때 표본 평균의 기댓값이 모집단의 평균과 다르다면 편향되었다고 말한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.