59doit
[ R ] EDA 표본추출 본문
표본추출
샘플링(sampling): 정제한 데이터셋에서 표본으로 사용할 데이터를 추출
(1) 정제 데이터 저장
ex ) 정제된 데이터 저장
print(user_pay_data) write.csv(user_pay_data, "cleanData.csv", quote = F, row.names = F) data <- read.csv("C:/cleanData.csv", header = TRUE) data |
(2) 표본 샘플링
ex ) 표본 추출
#1 표본 추출하기
nrow(data) # [1] 217 choice1 <- sample(nrow(data), 30) choice1 # [1] 187 195 147 108 152 52 174 34 161 25 184 47 194 140 # [15] 193 131 70 153 5 91 138 101 150 133 15 18 166 139 # [29] 48 39 |
#2 50 ~ (data 길이) 사이에서 30개 행을 무작위 추출
choice2 <- sample(50:nrow(data), 30) choice2 # [1] 206 122 58 119 207 50 107 123 137 127 94 209 100 62 # [15] 193 147 59 109 117 67 210 169 173 154 132 53 56 175 # [29] 134 199 |
#3 50~100 사이에서 30개 행을 무작위 추출
choice3 <- sample(c(50:100), 30) choice3 # [1] 77 52 53 65 51 99 58 91 75 80 67 81 78 71 95 73 98 83 93 # [20] 57 54 62 85 90 64 74 94 89 86 70 |
#4 다양한 범위를 지정하여 무작위 샘플링
choice4 <- sample(c(10:50, 80:150, 160:190), 30) choice4 # [1] 107 44 124 136 122 81 80 108 12 47 84 25 101 17 # [15] 133 135 143 36 123 189 126 43 16 131 100 18 30 125 # [29] 144 31 |
#5 샘플링 데이터로 표본추출
data[choice1, ] # resident gender job age position price survey age2 age3 resident2 # 187 5 2 2 33 2 4.3 3 중년층 2 시구군 # 195 1 2 2 46 4 5.8 3 장년층 3 특별시 # 147 1 1 2 46 4 5.2 3 장년층 3 특별시 # 108 2 2 1 49 4 5.0 3 장년층 3 광역시 # 152 2 2 1 42 4 5.3 3 중년층 2 광역시 # 52 1 2 2 63 5 6.3 4 장년층 3 특별시 # ... ... |
sample()함수에 의해서 추출된 결과는 관측치 기준이 아니라 관측치를 추출할 수 있는 행 번호기준으로 무작위(random) 추출됨
ex ) iris 데이터 셋을 대상으로 7:3 비율로 데이터 셋 생성
#1 iris 데이터 셋의 관측치와 컬럼 수 확인
data("iris") dim(iris) # [1] 150 5 |
dim 함수사용
#2 학습 데이터(70%), 검정 데이터(30%)비율로 데이터 셋 구성
idx <-sample(1:nrow(iris), nrow(iris) * 0.7) training <- iris[idx, ] testing <- iris[-idx, ] dim(training) # [1] 105 5 |
(3) 교차 검정 샘플링
- 전통적인 검정방식(hold-out): 학습데이터와 검정데이터를 7:3 비율로 구성하여 학습데이 터로 모델을 생성하고 검정데이터로 모델을 평가
교차검정: 동일한 데이터 셋을 N등분하여 N-1개의 학습데이터로 모델을 생성하고 나머 지 1개를 검정데이터로 이용하여 모델을 평가하는 방식
1) Cross-Validation
: 1~n개의 데이터를 랜덤(무작위)하게 n등분하여, 데이터를 Training/Validation으로 나눈 다음 교차하여 확인하는 방법
- 전체 데이터 셋을 동일한 크기를 가진 2 개의 집합으로 분할하여 training set, validation set 을 만든다.
- 영향력이 큰 관측지가 어느 set 에 속하느냐에 따라 MSE 가 달라진다.
- 관측치의 일부만 train 에 속하여 높은 bias 를 갖는다.
2) K-Fold Cross Validation
: 데이터를 데이터를(Random)로 섞은 후 K등분한것중 하나를 검정(Validaton) Set으로사용하는방법
- 전체 데이터 셋을 k 개의 그룹으로 분할하여 한 그룹은 validation set, 나머지 그룹은 train set 으로 사용한다.
- k 번 fit 을 진행하여 k 개의 MSE 를 평균 내어 최종 MSE 를 계산한다.
- LOOCV 보다 연산량이 낮다.
- 중간 정도의 bias 와 variance 를 갖는다.
3) LOOCV(Leave-One-Out Cross-Validation)
: 데이터 중 하나만을 검정(Validation) Set으로 두고, 나머지를 학습(Training) Set으로 모델에 적합시키는 방법.
자료가n개인경우, 위 과정을 n번 반복후 결과치들의 평균을 도출하여 사용
- n 번 fitting 을 진행하고, n 개의 MSE 를 평균하여 최종 MSE 를 계산한다.
- n-1 개 관측값을 train 에 사용하므로 bias 가 낮다.
- overfitting 되어 높은 variance 를 갖는다.
- n 번 나누고 n 번 fit 하므로 랜덤성이 없다.
- n 번 fit 을 진행하므로 expensive 한다.
4) K겹 교차 검정 데이터 셋 생성 알고리즘 사용
- K개로 데이터를 분할(D1, D2, …, Dk)하여 D1은 검정데이터, 나머지는 학습데이터 생성
- 검정데이터의 위치를 하나씩 변경하고, 나머지 데이터를 학습데이터로 생성
- 위의 1단계와 2단계의 과정을 K번 만큼 반복
ex ) 데이터 셋을 대상으로 K겹 교차 검정 데이터 셋 생성
#1 데이터프레임 생성
name <- c('a', 'b','c', 'd', 'e', 'f') score <- c(90, 85, 99, 75, 65, 88) df <- data.frame(Name = name, Score = score) df # Name Score # 1 a 90 # 2 b 85 # 3 c 99 # 4 d 75 # 5 e 65 # 6 f 88 |
#2 교차 검정을 위한 패키지 설치
install.packages("cvTools") library(cvTools) |
- cvFolds()함수: K겹 교차 검정 데이터 셋을 생성
- cvFolds(n, K=5, R=1, type=c(“random”, “consecutive”, “interleaved”)
n: 데이터의 크기
K: K겹 교차 검증
R: R회 반복
#3 : K겹 교차 검정 데이터 셋 생성
cross <- cvFolds(n = 6, K = 3, R = 1, type = "random") cross # 3-fold CV: # Fold Index # 1 4 # 2 5 # 3 2 # 1 3 # 2 6 # 3 1 |
n: 데이터의 크기
K: K겹 교차 검증
R: R회 반복
에 따라서 데이터크기 6, 3겹 교차검증, 1회반복 교차검정 데이터 셋 생성
#4 : K겹 교차 검정 데이터 셋 구조 보기
str(cross) # List of 5 # $ n : num 6 # $ K : num 3 # $ R : num 1 # $ subsets: int [1:6, 1] 4 5 2 3 6 1 # $ which : int [1:6] 1 2 3 1 2 3 # - attr(*, "class")= chr "cvFolds" cross$which # [1] 1 2 3 1 2 3 |
- K겹 교차 검정 데이터 셋의 구조: 5개의 key로 구성된 List자료구조
- 결과에서 which는 Fold의 결과를 vector형태로 보관
- subsets는 index의 결과를 matrix형태로 보관
#5 : subsets 데이터 참조하기
cross$subsets[cross$which == 1, 1] # [1] 4 3 cross$subsets[cross$which == 2, 1] # [1] 5 6 cross$subsets[cross$which == 3, 1] # [1] 2 1 |
- 실제 관측치의 행 번호를 가지고 있는 subsets의 데이터는which를 이용하여 접근 가능
#6 : 데이터프레임의 관측치 적용
r = 1 K = 1:3 for(i in K) { datas_idx <- cross$subsets[cross$which == i, r] cat('K = ', i, '검정데이터 \n') print(df[datas_idx, ]) cat('K = ', i, '훈련데이터 \n') print(df[-datas_idx, ]) } # K = 1 검정데이터 # Name Score # 4 d 75 # 3 c 99 # K = 1 훈련데이터 # Name Score # 1 a 90 # 2 b 85 # 5 e 65 # 6 f 88 # K = 2 검정데이터 # Name Score # 5 e 65 # 6 f 88 # K = 2 훈련데이터 # Name Score # 1 a 90 # 2 b 85 # 3 c 99 # 4 d 75 # K = 3 검정데이터 # Name Score # 2 b 85 # 1 a 90 # K = 3 훈련데이터 # Name Score # 3 c 99 # 4 d 75 # 5 e 65 # 6 f 88 |
- ‘df[-datas_idx, ]는 검정데이터를 제외한 나머지 균등분할 데이터를 이용하여 학습데이터 를 생성
'Programming > R' 카테고리의 다른 글
[ R ] 데이터 시각화 #2 연속변수 시각화 (1) (0) | 2022.12.22 |
---|---|
[ R ] 데이터시각화 #1 이산변수 시각화 (0) | 2022.12.22 |
[ R ] EDA - 파생변수 (0) | 2022.11.21 |
[ R ]EDA 코딩변경 (0) | 2022.11.21 |
[ R ]EDA 결측치 & 극단치 (0) | 2022.11.20 |