59doit

[ R ] EDA 표본추출 본문

Programming/R

[ R ] EDA 표본추출

yul_S2 2022. 11. 21. 15:33
반응형

표본추출

샘플링(sampling): 정제한 데이터셋에서 표본으로 사용할 데이터를 추출

 

cleanData.csv
0.01MB

 

 

(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
Comments