[R] 표본 추출

반응형

1. Sampling

  • 전체 데이터(모집단) 중 일부를 샘플(표본)로 추출하는 작업은 데이터에 분석에서 필수적 입니다.
  • 또한 표본추출은 훈련 데이터(Training data)와 테스트 데이터(Test data)의 분리에서도 중요한 역할을 합니다.
    • 데이터를 분리하지 않고 전체 데이터를 모델링 하여 모델 평가에 사용하게 되면
      데이터에 내재하는 실제적 특징 외에 우연히 포함된 노이즈까지 반영한 모델링을 할 위험이 있습니다. (과적합, overfitting)
    • 모형이 과적합하게 되는 경우 예측력이 떨어지는 위험성이 존재하게 됩니다.
  • 이번 포스팅에서는 전체 데이터로부터 표본을 추출하는 방법으로 단순임의추출, 층화임의추출, 계통추출에 대해서 말씀드리겠습니다.



1. 1. Simple random sampling

  • 단순임의추출(simple random sampling)은 전체 데이터에서 각 데이터를 추출할 확률을 동일하게 하여 표본을 추출하는 방법입니다.
  • 여기서 데이터를 추출하는 방법에는 복원추출(Sampling with replacement)과 비복원추출(Sampling without replacement)이 있습니다.
  • 복원추출은 한 번 추출된 표본을 다시 추출할 수 있는 것이 가능한 경우를 뜻하며,
    비복원추출은 한 번 추출한 표본은 다시 선택할 수 없는 경우를 말합니다.
  • R에서 기본적으로 내장되어 있는 함수로는 sample() 함수를 이용하여 단순임의추출을 시행할 수 있습니다.
    • x : 표본
    • size : 표본의 크기
    • replace = FALSE : 이 논리값을 TRUE로 할 경우 복원추출을 시행합니다.
    • prob : 데이터가 뽑힐 가중치
sample(
  x, 
  size, 
  replace = FALSE, 
  prob
)
  • 아래는 비복원추출의 예시입니다.
lotto <- 1:45
sample(lotto, size = 6, replace = FALSE)
## [1] 13 29 24 19 26 31

 

  • 가중치를 고려한 표번 추출을 하고 싶을 경우 prob arguments를 이용합니다.
  • 아래 예시를 보면 1에서부터 10까지의 수에거 각각 1에서부터 10까지 가중치를 주어 비복원추출한 경우
    가중치가 더 큰 표본들이 뽑히는 경향을 보입니다.
x <- 1:10
sample(x, size = 5, prob = 1:10)
## [1]  4  9 10  2  7



1. 2. Stratified random sampling

  • 데이터가 중첩 없이 분할될 수 있는 경우, 그리고 각 분할의 성격이 명확히 이질적인 경우 층화임의추출(Stratified random sampling)을 수행하여 더 정확한 분석 결과를 얻을 수 있습니다.
  • 층화임의추출은 sampling 라이브러리 안에 내장되어 있는 strata() 함수를 이용할 수 있습니다.
    • data: 데이터 프레임 또는 행렬
    • stratanames: 층화추출에 사용될 변수들
    • size: 각 층의 크기
    • method: “srswor” 비복원 단순임의추출, “srswr” 복원 단순임의추출, “poisson” 포아송 추출, “systematic” 계통 추출
    • pik: 각 데이터를 표본에 포함할 확률
    • description = FALSE: 이 논리값이 TRUE이면 표본의 크기와 모집단의 크기를 출력합니다.
library(sampling)
strata(
  data, 
  stratanames = NULL, 
  size, 
  method, 
  pik, 
  description = FALSE
)
  • 아래 예시는 벤치마크 데이터인 iris 데이터를 활용한 예시입니다.
m <- strata(
  data = iris, 
  stratanames = "Species", 
  size = c(3, 3, 3), 
  method = "srswor"
)

m
##        Species ID_unit Prob Stratum
## 6       setosa       6 0.06       1
## 32      setosa      32 0.06       1
## 37      setosa      37 0.06       1
## 77  versicolor      77 0.06       2
## 83  versicolor      83 0.06       2
## 90  versicolor      90 0.06       2
## 117  virginica     117 0.06       3
## 118  virginica     118 0.06       3
## 150  virginica     150 0.06       3
  • 저장된 객체를 데이터 프레임으로 값을 추출하는 함수는 getdata() 함수입니다.
getdata(iris, m)
##     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species ID_unit Prob
## 6            5.4         3.9          1.7         0.4     setosa       6 0.06
## 32           5.4         3.4          1.5         0.4     setosa      32 0.06
## 37           5.5         3.5          1.3         0.2     setosa      37 0.06
## 77           6.8         2.8          4.8         1.4 versicolor      77 0.06
## 83           5.8         2.7          3.9         1.2 versicolor      83 0.06
## 90           5.5         2.5          4.0         1.3 versicolor      90 0.06
## 117          6.5         3.0          5.5         1.8  virginica     117 0.06
## 118          7.7         3.8          6.7         2.2  virginica     118 0.06
## 150          5.9         3.0          5.1         1.8  virginica     150 0.06
##     Stratum
## 6         1
## 32        1
## 37        1
## 77        2
## 83        2
## 90        2
## 117       3
## 118       3
## 150       3



1. 3. Systematic sampling

  • 계통추출은 모집단의 임의 위치에서 시작해 매 k번째 항목을 표본으로 추출하는 단순한 방법입니다.
  • 이 방법은 doBy 라이브러리 안에 내장되어 있는 sampleBy() 함수를 사용하여 수행할 수 있습니다.
    • formula: ~ 우측에 나열한 이름에 따라 데이터가 그룹으로 묶입니다.
    • frac: 추출할 샘플의 비율이며 기본값으로는 10% 입니다.
    • replace = FALSE: 복원추출 여부
    • data: 계통추출할 데이터
library(doBy)
sampleBy(
  formula, 
  frac = 0.1, 
  replace = FALSE, 
  data, 
  systematic = TRUE
)
temp <- data.frame(x = 1:10)

sampleBy(
  formula  = ~1,
  frac = 0.3, 
  data = temp,
  systematic = TRUE
)
##   [,1] [,2] [,3]
## 1    1    4    7

 

반응형

'Basic' 카테고리의 다른 글

[R] 적합도 검정  (0) 2017.07.04
[R] 범주형 자료에서 독립성 검정  (0) 2017.07.04
[R] 난수생성과 기초통계량  (0) 2017.07.03
[R] 기본 plot 함수  (1) 2017.07.03
[R] 데이터 불러오기  (0) 2017.07.02
TAGS.

Comments