4.8 무작위 표본 추출

4.8.1 정해진 갯수 만큼의 표본 무작위 추출

sample_n(dataframe, n)

  • dataframe : 데이터 세트
  • n : 무작위 추출할 표본의 갯수

Cars93 데이터 프레임애소 1~5번째 변수에 대해 10개의 관측치를 무작위로 추출해 보자.

# sample_n() : randomly sample rows for a fixed number 
sample_n(Cars93[, 1:5], 10)
##    Manufacturer        Model    Type Min.Price Price
## 1          Ford       Escort   Small       8.4  10.1
## 2       Lincoln     Town_Car   Large      34.4  36.1
## 3    Oldsmobile Eighty-Eight   Large      19.5  20.7
## 4         Acura       Legend Midsize      29.2  33.9
## 5       Pontiac     Firebird  Sporty      14.0  17.7
## 6     Chevrolet        Astro     Van      14.7  16.6
## 7          Ford      Mustang  Sporty      10.8  15.9
## 8       Pontiac       LeMans   Small       8.2   9.0
## 9        Toyota       Tercel   Small       7.8   9.8
## 10     Infiniti          Q45 Midsize      45.4  47.9
# random sampling one more time
sample_n(Cars93[, 1:5], 10)
##    Manufacturer          Model    Type Min.Price Price
## 1       Pontiac         LeMans   Small       8.2   9.0
## 2           BMW           535i Midsize      23.7  30.0
## 3     Chevrolet        Caprice   Large      18.0  18.8
## 4          Ford Crown_Victoria   Large      20.1  20.9
## 5         Dodge        Stealth  Sporty      18.5  25.8
## 6         Honda         Accord Compact      13.8  17.5
## 7         Eagle         Summit   Small       7.9  12.2
## 8         Acura         Legend Midsize      29.2  33.9
## 9       Lincoln    Continental Midsize      33.3  34.3
## 10      Mercury         Cougar Midsize      14.9  14.9
# 또는
Cars93[, 1:5] %>% sample_n(10)
##     Manufacturer    Model    Type Min.Price Price
## 1          Volvo      240 Compact      21.8  22.7
## 2          Honda   Accord Compact      13.8  17.5
## 3     Mitsubishi   Mirage   Small       7.7  10.3
## 4          Acura   Legend Midsize      29.2  33.9
## 5           Ford  Festiva   Small       6.9   7.4
## 6  Mercedes-Benz     300E Midsize      43.8  61.9
## 7      Chevrolet Cavalier Compact       8.5  13.4
## 8         Nissan   Altima Compact      13.0  15.7
## 9          Mazda      MPV     Van      16.6  19.1
## 10     Chevrolet   Lumina Midsize      13.4  15.9
Cars93[, 1:5] %>% sample_n(10)
##    Manufacturer      Model    Type Min.Price Price
## 1         Dodge    Caravan     Van      13.6  19.0
## 2          Ford    Festiva   Small       6.9   7.4
## 3        Toyota     Celica  Sporty      14.2  18.4
## 4     Chevrolet Lumina_APV     Van      14.7  16.3
## 5          Saab        900 Compact      20.3  28.7
## 6     Chevrolet   Corvette  Sporty      34.6  38.0
## 7         Volvo        240 Compact      21.8  22.7
## 8       Hyundai      Excel   Small       6.8   8.0
## 9          Ford     Escort   Small       8.4  10.1
## 10        Buick    LeSabre   Large      19.9  20.8
  • 전체 관측치 중에 10개의 관측치를 무작위로 표본을 추출해 준다.
  • sample_n() 함수를 실행할 때 마다 추출된 표본은 달라짐을 알 수 있다.

4.8.2 정해진 비율로 표본 무작위 추출

sample_frac(dataframe, p)

  • dataframe : 데이터 세트
  • p : 무작위 추출하고자하는 비율 (예, 0.1 -> 10%)

Cars93 데이터 프레임에서 1~5번째 변수에 대해 10%의 관측치를 무작위로 추출해 보자.

# sample_frac() : randomly sample rows for a fixed fraction 
nrow(Cars93)
## [1] 93
nrow(Cars93)*0.1
## [1] 9.3
sample_frac(Cars93[ , 1:5], 0.1)
##   Manufacturer         Model    Type Min.Price Price
## 1   Mitsubishi      Diamante Midsize      22.4  26.1
## 2        Volvo           850 Midsize      24.8  26.7
## 3        Dodge       Stealth  Sporty      18.5  25.8
## 4       Saturn            SL   Small       9.2  11.1
## 5        Dodge       Dynasty Midsize      14.8  15.6
## 6        Mazda          RX-7  Sporty      32.5  32.5
## 7      Pontiac       Sunbird Compact       9.4  11.1
## 8   Oldsmobile Cutlass_Ciera Midsize      14.2  16.3
## 9      Pontiac    Bonneville   Large      19.4  24.4
# 또는
Cars93[, 1:5] %>% sample_frac(0.1)
##   Manufacturer    Model    Type Min.Price Price
## 1        Eagle   Summit   Small       7.9  12.2
## 2       Suzuki    Swift   Small       7.3   8.6
## 3      Hyundai  Elantra   Small       9.0  10.0
## 4        Buick  LeSabre   Large      19.9  20.8
## 5     Chrylser Concorde   Large      18.4  18.4
## 6         Audi       90 Compact      25.9  29.1
## 7        Dodge  Stealth  Sporty      18.5  25.8
## 8       Subaru    Justy   Small       7.3   8.4
## 9       Nissan    Quest     Van      16.7  19.1
  • Cars93 데이터 프레임은 관측치가 93개 이며, 10%는 9.3개에 해당
  • sample_frac(Cars93, 0.1)은 총 9개의 무작위 샘플을 추출

4.8.3 정해진 갯수 만큼의 표본 복원 추출

smaple_n(dataframe, n, replace = TRUE)

  • dataframe : 데이터 세트
  • n : 추출하고자 하는 표본 갯수
  • replace = TRUE : 복원 추출

앞의 두 경우는 한번 추출한 표본은 다시 추출하지 않는 ’비복원 추출(sampling with replacement)’이었다(눈을 감고 주머니에서 한번 뽑았으면, 뽑힌 공은 다시 주머니에 넣지 않고 옆에 따로 빼어놓고, 다시 눈을 감고 주머니에서 공을 뽑음).

dplyr 패키지의 sample_n(), sample_frac() 함수의 디폴트는 비복원추출이며, 만약 ’복원추출(sampling with replacement, bootstrap sampling)’을 하고 싶다면 replace = TRUE 옵션을 설정해주면 된다(눈을 감고 주머니에서 공을 뽑고, 뽑힌 공을 다시 주머니에 넣은 후에, 눈을 감고 다시 주머니에서 공을 뽑음).

Cars93 데이터 프레임에서 1~5번까지 변수에 대해 20개의 관측치를 무작위로 복원 추출해보자.

# sample_n(dataframe, n, replace = TRUE) : random sampling with replacement 
# a bootstrap sample of 20 records
sample_n(Cars93[, 1:5], 20, replace = TRUE)     
##    Manufacturer          Model    Type Min.Price Price
## 1         Acura        Integra   Small      12.9  15.9
## 2           Geo          Metro   Small       6.7   8.4
## 3        Toyota         Tercel   Small       7.8   9.8
## 4       Lincoln       Town_Car   Large      34.4  36.1
## 5       Pontiac     Grand_Prix Midsize      15.4  18.5
## 6         Mazda            323   Small       7.4   8.3
## 7          Saab            900 Compact      20.3  28.7
## 8         Honda          Civic   Small       8.4  12.1
## 9      Cadillac        DeVille   Large      33.0  34.7
## 10       Subaru          Justy   Small       7.3   8.4
## 11     Cadillac        DeVille   Large      33.0  34.7
## 12    Chevrolet        Corsica Compact      11.4  11.4
## 13      Hyundai          Excel   Small       6.8   8.0
## 14        Mazda            323   Small       7.4   8.3
## 15         Ford Crown_Victoria   Large      20.1  20.9
## 16    Chevrolet        Corsica Compact      11.4  11.4
## 17       Nissan          Quest     Van      16.7  19.1
## 18        Dodge         Shadow   Small       8.4  11.3
## 19       Nissan         Sentra   Small       8.7  11.8
## 20          BMW           535i Midsize      23.7  30.0
  • 무작위 복원 추출을 하면 동일한 표본이 중복으로 추출될 수 있다.

4.8.4 집단별 층화 표본 추출

dataframe %>% group_by(factor_var) %>% sample_n(size)

  • dataframe : 데이터 세트
  • factor_var : 그룹으로 지정할 변수
  • size : 표본의 갯수

분석을 하다 보면 집단, 그룹별로 동일한 수의 표본을 무작위 추출해서 분석해야 하는 경우가 있다. 특히 분석 주제 혹은 분석에 큰 영향을 미치는 요인 변수에 대한 집단 분포(distribution)가 한쪽 그룹으로 심하게 편향된 모집단(biased, unbalanced population)의 경우 층화 무작위 표본 추출(stratified random sampling)이 필요합니다.

*[예제] Cars93 데이터 프레임에서 ‘제조국가_미국여부(Origin)’의 ’USA,’ ‘non-USA’ 요인 속성별로 각 10개씩의 표본을 무작위 비복원 추출하시오.*

# dataframe %>% 
#             group_by(factor_var) %>%  
#             sample_n(size) : random sampling by group 
Cars93[ , c("Manufacturer", "Model", "Origin")] %>% 
      group_by(Origin) %>% 
      sample_n(10)
## # A tibble: 20 x 3
## # Groups:   Origin [2]
##   Manufacturer Model          Origin
##   <fct>        <fct>          <fct> 
## 1 Saturn       SL             USA   
## 2 Ford         Crown_Victoria USA   
## 3 Dodge        Stealth        USA   
## # ... with 17 more rows

위의 ‘%>%’ (단축키 : shift + ctrl + M)의 chaining 에 대해서는 다음번 포스팅에서 별도로 소개하겠으니 지금 궁금하시더라도 조금만 참아주세요. ^^;