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
# 또는
1:5] %>% sample_n(10) Cars93[,
## 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
1:5] %>% sample_n(10) Cars93[,
## 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
# 또는
1:5] %>% sample_frac(0.1) Cars93[,
## 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
c("Manufacturer", "Model", "Origin")] %>%
Cars93[ , 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 에 대해서는 다음번 포스팅에서 별도로 소개하겠으니 지금 궁금하시더라도 조금만 참아주세요. ^^;