'stratified random sampling'에 해당되는 글 1건

  1. 2015.08.02 R 데이터 변환 : (4) 개수 축소 (Sampling) 14

데이터 변환 방법으로서

(1) 표준화

(2) 정규분포화

(3) 범주화

   - 이산형화

   - 이항변수화

(4) 개수 축소 (Sampling)

(5) 차원 축소

   - 주성분분석

   - 요인분석

(6) 시그널 데이터 압축

의 6개 구분 중에서

 

(4) 개수 축소 (Sampling)에 대해서 알아보겠습니다.

 

통계를 크게 두 축으로 나누자면 모집단으로 부터 표본을 추출해서 표본의 분포와 데이터 특성을 파악하는 기술통계(descriptive statistics)와 표본집단의 통계량을 통해 모집단의 모수(parameter)를 추정하고 가설을 검정(test)하는 추론통계(inferential statistics)로 구분합니다.  기술통계의 시작은 표본 추출 (Sampling)이라고 할 수 있겠습니다.  즉, 표본 추출이 모집단을 대표하지 못하게 되는 경우, 샘플링 이후의 모든 기술통계와 추론통계가 말짱 꽝이 되는 것입니다.  반면, 샘플링이 모집단을 잘 대표할 경우 엄청난 시간과 돈을 절약할 수 있는 통계의 무기를 획득할 수 있게 됩니다.

 

 

 R 데이터 변환 : (4) 개수 축소 (Sampling)

 

 

 

[ 데이터 변환 구조 ]

 

미국 대공황 시절에 루즈벨트 대통령이 뉴딜정책을 펼 때 경제정책의 기조를 의사결정하기 위해 실업율을 조사해야 했다고 합니다.  통계학자들은 잘 설계된 표본 추출기법을 통해 일부만 조사하고도 실업율을 파악할 수 있다고 한 반면에, 경제학자들은 전수조사를 해야한다고 우겼다고 하는군요.  그래서 샘플 조사도 하고 전수조사도 했다고 하는데요, 샘플 조사야 며칠 이면 끝나지만 전수조사는 몇 달이 걸렸다고 합니다.  전수 조사결과와 샘플 조사 결과를 비교해보니 오차가 무시할 수 있을 정도로 작았다고 했답니다. 이처럼 잘 설계된(!) 샘플링은 시간과 돈을 많이 절약해줄 수 있습니다. 

 

제품을 생산하는 제조공장에서도 품질검사를 위해 샘플링을 많이 사용합니다.  품질검사한다고 전수조사 했다가는 시장에 내다 팔 제품이 남아나지 않아서 공장 망하겠지요?  이럴 때는 어쩔 수 없이 샘플링을 해야만 하는데요, 샘플링을 너무 적게 하면 품질검사 결과를 신뢰할 수 없고, 그렇다고 너무 많이 하게 되면 품질검사 한다고 많은 멀쩡한 제품이 손상되어 손실을 보게 되겠지요. 

 

따라서 샘플링 기법의 종류와 개념에 대해서 명확히 이해하고, Biz. 상황과 분석의 목적에 맞는 샘플링 기법을 적용해야 하겠습니다. 확률표본 추출 기법에는 (a) 단순 임의 추출, (b) 체계적 추출, (c) 층화 임의 추출, (d) 군집 추출, (e) 다단계 추출의 5가지 나눌 수 있으며, 아래에 개념 설명과 도식을 참고하시기 바랍니다. (비 확률표본 추출 기법은 생략)

 

 

[ 확률표본 추출 기법 ]

 

 

 

 

저는 실무에서는 단순 임의 추출과 층화 임의 추출을 가장 많이 사용하기에 이번 포스팅에서는 이 두개에 대해서 R 사용법을 소개해드리도록 하겠습니다. 

 

 

(1) 단순 임의 추출 (simple random sampling) : sample()

 

먼저 1~10까지 정수 벡터에 대해서 5개 표본을 비복원, 복원추출로 단순 임의 추출해보겠습니다.

 

> sample(1:10, 5, replace = FALSE) # 비복원추출
[1] 9 6 5 7 3
> 
> sample(1:10, 5, replace = TRUE) # 복원추출
[1] 9 3 3 2 3

 

단순 임의 추출은 sample(x, size, replace = FALSE/TRUE) 함수를 사용해서 쉽게 실행할 수 있습니다.  위 예시의 첫번째는 비복원 추출 (한번 뽑으면 다시는 안뽑힘) 옵션을 부여한 것이고, 두번째 예시는 복원추출(한번 뽑혔더라도 다시 뽑힐 수도 있음) 예시가 되겠습니다.  복원추출의 경우 1~10중에서 3이 3번 중복해서 추출되었습니다.

 

> sample(1:10, 5, replace = TRUE)
[1] 10  6  9  7 10
> sample(1:10, 5, replace = TRUE)
[1] 1 4 1 4 3

 

똑같은 sample() 명령어인데도 매번 실행할 때마다 표본 추출되는 결과가 다름을 알 수 있습니다.  R 내부적으로 난수표를 생성하면서 무작위로 샘플링을 하기 때문에 그렇습니다.

 

 

다음으로 MASS 패키지에 있는 Cars93 데이터 프레임의 93개 모집단에서 5개 표본을 단순 임의 추출을 해보도록 하겠습니다.

 

> library(MASS)
> dim(Cars93)
[1] 93 27

>

> sim_ran_sam <- sample(1:nrow(Cars93), 5)

> Cars93_srs <- Cars93[sim_ran_sam, ]
> dim(Cars93_srs)
[1]  5 27
 

 

 

 

 

(2) 층화 임의 추출 (stratified random sampling) : strata()

 

다음으로 성별, 연령대별로 고객을 계층(stratum)을 나누어서 임의 추출을 해보도록 하겠습니다.  이를 위해 데이터 핸들링하는 data.table 패키지와 샘플링 하는 sampling 패키지 설치 및 호출이 필요합니다. 

 

> ## data.table 패키지, sampling 패키지 설치 및 호출

> install.packages("data.table")
> install.packages("sampling")
> require(data.table)
> require(sampling)

 

 

 

다음으로 1000명으로 구성된 모집단을 성별(1, 0), 연령대별(1, 2, 3, 4, 5), 재구매여부별(1, 0)로 3개의 변수에 대해서 각각 확률을 설정해주고 d.t 라는 이름의 data.table 을 생성해보겠습니다. 

 

> set.seed(1) > n <- 1000 > d.t <- data.table(gender = rbinom(n, 1 , .5), + age = sample(1:5, n, replace=TRUE), + rebuy_yn = rbinom(n, 1, .2))

 

 

 

 

 

data.table 에서는 data.frame과는 달리 특정 칼럼을 key값으로 색인을 지정(setkey)해주게 되고, 이 key값으로 정렬을 해주게 됩니다. (참고로, 속도가 data.frame보다 빠름)  data.table 의 group 별 집계하는 방식이 data.frame하고는 좀 달라서 낯설것 같은데요, 아래의 두번째 예시 참고하시기 바랍니다.

 

> ## Key 색인 지정, 정렬 > setkey(d.t, gender, age) >

 

 

 

> ## 성, 연령대 계층(stratum) 별로 모집단 원소 수 (총 1,000명)

> d.t[ , .N, keyby = list(gender, age)] gender age N 1: 0 1 113 2: 0 2 108 3: 0 3 93 4: 0 4 106 5: 0 5 100 6: 1 1 115 7: 1 2 86 8: 1 3 96 9: 1 4 73 10: 1 5 110

 

 

다음으로 strata() 함수를 사용해서 층화 임의 추출을 하면 됩니다.

 

> ## 성별, 연령대 계층별 각 20명씩 층화 임화 추출 > set.seed(2) > samp <- data.table(strata(d.t, c("gender", "age"), rep(20, 10), "srswor")) >

 

 

> ## 성별, 연령대 계층별 각 표본 개수 (각 20명 씩 표본 추출) > samp[ , .N, keyby = list(gender, age)] gender age N 1: 0 1 20 2: 0 2 20 3: 0 3 20 4: 0 4 20 5: 0 5 20 6: 1 1 20 7: 1 2 20 8: 1 3 20 9: 1 4 20 10: 1 5 20

 

 

strata() 함수의 사용법은 아래와 같으며, 위에서 method로 "srswor"을 사용했는데요, 이는 simple random sampling without replacement (디폴트) 가 되겠습니다.

 

> help(strata)

 

strata(data, stratanames=NULL, size, method=c("srswor","srswr","poisson", "systematic"), pik,description=FALSE)

-- 중략 --

method

method to select units; the following methods are implemented: simple random sampling without replacement (srswor), simple random sampling with replacement (srswr), Poisson sampling (poisson), systematic sampling (systematic); if "method" is missing, the default method is "srswor".

-- 중략 --

 


여러개의 변수를 가진 DataFrame에 대해서 층화 무작위 추출을 사용해서 Train, Test set 분할을 하는 방법은 아래의 포스팅을 참고하세요. 

==> https://rfriend.tistory.com/515



이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 

 

728x90
반응형
Posted by Rfriend
,