<표본 추출법 - Types of Sampling>
모집단을 대표할 표본을 추출할 방법인 표본추출법(Types of sampling)은 확률적 표본 추출법과 비확률적 표본 추출법으로 나뉩니다.
양적 연구(quantitative research)에 주로 쓰이는, 확률적 표본 추출법은 다음 네가지 방법으로 세분화되죠.
단순 임의 추출(Simple Random Sampling), 체계적 추출(Systematic Sampling), 층화 임의 추출(Stratified Random Sampling) 그리고 군집 추출(Cluster Sampling)이 세분화된 확률적 표본 추출법이라고 할 수 있습니다.
단순 임의 추출 | 모집단으로부터 뽑힐 확률이 균등한 샘플을 무작위 추출 |
체계적 추출 | 표집간격(sampling interval) 배수만큼 떨어져 있는 요인들을 추출 |
층화 임의 추출 | 모집단을 몇가지 특징을 기준으로 서브그룹으로 나누어, 각 그룹의 원소로부터 임의로 추출하는 법 |
군집 추출 | 모집단이 몇가지의 군집(cluster, block)으로 이루어져 있을때, 군집을 무작위로 선택 한 후, 군집에서 표본을 추출하는 방법입니다 |
각각의 표본추출법에 대한 자세한 설명은 https://jangpiano-science.tistory.com/131 를 참고해주세요:)
오늘은, 이 확률적 추출 방법들을 R로 구현해보는 시간을 갖도록 할게요:)
<단순 임의 추출 - R>
R에 내장되어 있는 sample()함수는, 주어진 범위 내에서, n개의 표본을 무작위(randomly)로 뽑습니다.
아래의 예시에서는, 1부터 10까지의 수 중에서, 5개의 수가 무작위로 뽑히게 되죠.
함수 내에 replace를 설정해줌으로써, 비복원 추출(replace = FALSE) 과, 복원 추출(replace = TRUE)을 구현할 수 잇습니다.
디폴트 값이라고 불리는, 함수 내 설정값은 replace = FALSE 입기 때문에, 복원 추출을 의도하고 싶을땐, replace = TRUE 를 함수 내에 설정해주셔야 합니다.
#simple random sampling : sample()
sample(1:10, 5, replace = FALSE) #비복원추출
sample(1:10, 5, replace = TRUE) #복원추출
> sample(1:10, 5, replace = TRUE)
[1] 10 6 10 7 9
> sample(1:10, 5, replace = FALSE)
[1] 5 10 1 8 6
단순 임의 추출을 MASS 패키지의 painters 데이터 프레임에 적용시켜 봅시다.
library(MASS)
head(painters)
'''
Composition Drawing Colour Expression School
Da Udine 10 8 16 3 A
Da Vinci 15 16 4 14 A
Del Piombo 8 13 16 7 A
Del Sarto 12 16 9 8 A
Fr. Penni 0 15 8 0 A
Guilio Romano 15 16 4 14 A
'''
dim(painters) #몇개의 객체(row), 몇개의 특성(column)
#[1] 54 5
#1부터 nrow(painters)까지의 숫자중에, 5개의 숫자를 임의로 뽑음
sim_ran <- sample(1:nrow(painters), 5)
painters_sr <- painters[sim_ran, ] #무작위로 뽑은 5개의 객체 (row)
painters_sr
'''
Composition Drawing Colour Expression School
The Carraci 15 17 13 13 E
Bourdon 10 8 8 4 H
Pourbus 4 15 6 6 F
Guilio Romano 15 16 4 14 A
Bellini 4 6 14 0 D
'''
sample() 함수를 이용해, 1부터 객체의 수(number of rows)까지의 숫자중에 5개를 임의 추출한 후, 이 숫자들의 painters의 rows 들에 적용 시켜, 위에서 뽑힌 숫자번째 row 들만 추출한 예시를 보실 수 있습니다.
모집단을 대표할 표본은, The Carraci, Bourdon, Pourbus, Guilio Romano, Bellini 로 추출된것을 볼 수 있습니다.
<체계적 추출 - R>
체계적 추출(Systematic Sampling)을 하기 위해 설정되어야 할 값은, 표집간격(sampling interval)이 있습니다. 물론, 다른 표본추출에 필요한 정보인 모집단의 크기와, 표본의 크기는 당연히 명시되어야하죠.
표집간격(k)은, 주로 '모집단의 크기(N)/표본의 크기(n)' 값으로 설정하고, 이보다 큰값으로는 설정하지 않습니다.
체계적 추출에서는 시작점(starting point)만 임의 추출한 후, 이에 등간격으로 떨어진 요소들로 표본을 구성하는데요.
시작점(r)은, 표집간격보다 작은 수들 중에 하나의 수로 무작위 추출합니다. 체계적 추출에서, 무작위 추출의 대상이 되는것을 시작점이라고 할 수 있겠죠.
score_df <- data.frame(gender = rbinom(1000, 1, 0.5), age = sample(9:12, 1000, replace = TRUE), score = rnorm(1000, 75, 7))
head(score_df)
'''
gender age score
1 1 11 87.13071
2 0 11 74.55566
3 1 9 74.25122
4 0 9 65.06077
5 0 12 86.81098
6 1 10 74.86740
'''
dim(score_df) #1000, 3
N = nrow(score_df) #모집단의 크기
n = 100 #표본의 크기
k = N/n #표집 간격
r = sample(1:k-1, 1) #시작점 : 표집간격보다 작은 숫자
seq(r, N, by = k)
'''
[1] 9 19 29 39 49 59 69 79 89 99 109 119 129 139 149 159 169 179 189
[20] 199 209 219 229 239 249 259 269 279 289 299 309 319 329 339 349 359 369 379
[39] 389 399 409 419 429 439 449 459 469 479 489 499 509 519 529 539 549 559 569
[58] 579 589 599 609 619 629 639 649 659 669 679 689 699 709 719 729 739 749 759
[77] 769 779 789 799 809 819 829 839 849 859 869 879 889 899 909 919 929 939 949
[96] 959 969 979 989 999 '''
spe_sample = score_df[seq(r, N, by = k),] #등간격으로 객체 뽑기
dim(spe_sample) #100, 3
<층화 임의 추출 - R>
층화 임의 추출은 데이터의 column이 의미하는 특성에 의해 계층(stratum)을 나누고, 각각의 층에서 일정 수의 표본을 무작위 추출하는 방법입니다. 층화 임의 추출은 sampling 패키지에 내장되어 있는 strata를 이용해서 성립될 수 있습니다.
strata 함수에서 지정되어야할 argument 먼저 살펴보자면,
data | 모집단의 정보를 포함하고 있는 데이터 |
stratanames | 그룹을 나눌 기준이 될 개체의 특성(column) |
size | 각 층에서 몇개씩의 표본을 추출할 것인지 |
method | "srswor", "srswr", "poisson", "systematic" (디폴트 : srswor) srswor : simple random sampling without replacement (비복원 단순 임의 추출) srswr : simple random sampling with replacement (복원 단순 임의 추출) poisson: poisson sampling (포아송 추출) systematic : systematic sampling (체계적 추출) |
우선, 하나의 특성(gender)을 바탕으로 계층을 나눈 예시부터 살펴보시죠.
#하나의 특성에 의해 계층(stratum)을 나눔
score_df <- data.frame(gender = rbinom(1000, 1, 0.5), age = sample(9:12, 1000, replace = TRUE), score = rnorm(1000, 75, 7))
table(score_df$gender)
# 0 1
# 496 504
library(sampling)
str_sample<- strata(data = score_df, stratanames = "gender", size = c(3,3), method = "srswor")
#gender을 기준으로 나눈 각 집단에서 3개씩 표본 추출, 각 집단에서 표본추출방법은 simple random sampling without replacement
str_sample
'''
gender ID_unit Prob Stratum
19 1 19 0.005952381 1
468 1 468 0.005952381 1
907 1 907 0.005952381 1
69 0 69 0.006048387 2
764 0 764 0.006048387 2
897 0 897 0.006048387 2
'''
두개 이상의 특성(gender, age) 을 바탕으로 계층을 나눈 후 표본을 추출하는 방법을 찾아봅시다.
data.table을 이용하면, 특정 칼럼(gender, age)을 기준으로 나눈 각 계층별로 얼마나 많은 요소들을 포함하고 있는지를 파악 할 수 있기 때문에, data.frame 대신 data.table을 사용하도록 하겠습니다.
1. 모집단을 data.table으로 설정한다
2. 각각의 계층에 포함된 전체 요소의 개수를 확인한다 : score_dt[, .N, keyby = list(gender, age)]
--> gender, age 별로 계층을 나누고, 각 계층별 원소 개수를 data.table로 반환하기
3. strata() 함수 이용해서 각 계층에서 20개의 표본 추출
--> 계층의 개수가 8개이므로, size = rep(20, 8)로 설정
--> 각 계층에서 표본을 추출하는 방법 : srswor : simple random sampling without replacement
4. 각각의 계층에 포함된 표본 개수를 확인한다 : str_sam[, .N, keyby = list(gender, age)]
#성별, 연령대별로 계층(stratum)을 나누어, 임의 추출
install.packages("data.table")
library(data.table)
library(sampling)
score_dt<- data.table(gender = rbinom(1000, 1, 0.5), age = sample(9:12, 1000, replace = TRUE), score = rnorm(1000, 75, 7))
table(score_dt$gender)
# 0 1
#497 503
table(score_dt$age)
# 9 10 11 12
# 234 262 244 260
#각각의 계층에 몇개의 원소씩 포함되어있는지
score_dt[, .N, keyby = list(gender, age)]
'''
gender age N
1: 0 9 118
2: 0 10 132
3: 0 11 124
4: 0 12 123
5: 1 9 116
6: 1 10 130
7: 1 11 120
8: 1 12 137
'''
#strata 함수를 이용해 각 계층별 20명씩 층화 임의 추출
str_sam<-data.table(strata(score_dt, stratanames = c("gender", "age"), size = rep(20, 8), method = "srswor"))
str_sam
'''
gender age ID_unit Prob Stratum
1: 0 9 3 0.1694915 1
2: 0 9 5 0.1694915 1
3: 0 9 9 0.1694915 1
4: 0 9 11 0.1694915 1
5: 0 9 17 0.1694915 1
---
156: 1 12 966 0.1459854 8
157: 1 12 969 0.1459854 8
158: 1 12 989 0.1459854 8
159: 1 12 992 0.1459854 8
160: 1 12 994 0.1459854 8
'''
str_sam[, .N, keyby = list(gender, age)]
'''
gender age N
1: 0 9 20
2: 0 10 20
3: 0 11 20
4: 0 12 20
5: 1 9 20
6: 1 10 20
7: 1 11 20
8: 1 12 20
'''
<군집 추출 - R>
군집추출은 모집단을 구성하는 군집을 무작위로 추출하고, 군집(들)에서 표본을 추출하는 방법입니다.
하지만, 군집추출에는 한가지 중요한 조건이 있는데요, 각 군집(cluster)이 모집단을 대표할 수 있어야 합니다.
예를 들어 평준화 되어있는 학교들로 군집이 구성되어 있는경우, 군집 추출을 사용할 수 있지만,
실력에 의해, 또는 다른 특성을 바탕으로 학교들이 구분된다면, 군집 추출법을 사용할 수 없게 되는것이죠. 이러한 경우는, 층화 임의 추출이 더 적절하다고 말할 수 있습니다.
군집(들)이 추출되면, 추출된 군집 내 모든 요소를 표본으로 추출할수도, 혹은 그 군집 내에서 또 표본을 무작위로 추출할 수 도 있습니다.
MASS 패키지의 painters 데이터를 가지고, 각 학교를 군집으로 설정하려고 합니다.
군집 추출을 사용하기 위해서는 한가지 가정이 필요하겠죠? 각 학교가 평준화 되어있는 학교들이라는 가정(각 군집이 대표성을 지님)을 하고 표본추출을 진행해봅시다.
library(MASS)
str(painters)
'''
data.frame: 54 obs. of 5 variables:
$ Composition: int 10 15 8 12 0 15 8 15 4 17 ...
$ Drawing : int 8 16 13 16 15 16 17 16 12 18 ...
$ Colour : int 16 4 16 9 8 4 4 7 10 12 ...
$ Expression : int 3 14 7 8 0 14 8 6 4 18 ...
$ School : chr "A" "A" "A" "A" ...
'''
table(painters$School)
# A B C D E F G H
#10 6 6 10 7 4 7 4
sample(letters[1:8], 1) #군집 무작위 추출
#A
painters[painters$School == "A",]
'''
Da Udine 10 8 16 3 A
Da Vinci 15 16 4 14 A
Del Piombo 8 13 16 7 A
Del Sarto 12 16 9 8 A
Fr. Penni 0 15 8 0 A
Guilio Romano 15 16 4 14 A
Michelangelo 8 17 4 8 A
Perino del Vaga 15 16 7 6 A
Perugino 4 12 10 4 A
Raphael 17 18 12 18 A
'''