[R] 데이터 샘플링 (Data Sampling)

r-data-sampling

해당 포스트에서는 R에서 랜덤 데이터 샘플링(추출)방법에 대해 설명합니다.

1. INTRO

R에서 랜덤 데이터 추출이 필요한 경우, 내장 함수인 sample()dplyr 패키지의 sample_n(), sample_frac() 함수를 사용할 수 있습니다. 아래에서 각 함수의 설명과 사용법을 설명하니 상황에 따라 필요한 함수를 사용하시면 됩니다.

참고
아래 예시에서 설명하는 함수들은 무작위 추출되기에 출력 결과가 다를 수 있는 점 참고 부탁드립니다.

2. sample()

sample()은 R에서 제공되는 내장 함수로 별도의 설치가 필요하지 않습니다. sample() 함수는 난수를 추출해주는 함수로 입력 인자값 차이에 따라 각각 다른 결과값을 리턴합니다. 아래 3가지 예시를 준비하였으니 보시고 사용법을 참고하시면 좋겠습니다.

1) n개의 난수 생성

sample(n)의 형태로 사용하는 경우, 1:n까지의 수를 랜덤하게 비복원 추출하여 결과를 리턴합니다. 아래 결과를 보시면 1부터 10까지의 수가 뒤섞여 추출된 것을 볼 수 있습니다.

참고
랜덤 추출이기에 출력 결과가 저와 같지 않을 수 있습니다.

sample(10)
[1]  9  5  2 10  1  4  3  8  6  7

2) n개의 난수에서 k개 추출

sample(n, k)의 형태로 사용하는 경우, 1:n까지의 수에서 k개의 숫자를 랜덤 비복원 추출합니다. 아래 결과를 보시면 1부터 100까지의 수에서 10개의 수가 랜덤 추출된 것을 볼 수 있습니다.

sample(100, 10)
[1] 83 51  1 50 78 75 40 11 45 82

3) mtcars 데이터에서 랜덤 추출하기

R 내장 데이터셋 중 하나인 mtcars를 이용하여 랜덤하게 데이터를 추출해 보겠습니다.

아래 코드는 위에서 설명한 sample(n,k) 방식을 이용하여 n값 대신에 mtcars 데이터셋 행의 수를 입력하였습니다. 즉, 1부터 mtcars 행의 수까지의 숫자 중에서 10개를 랜덤 추출하여 출력해주는 코드라고 생각하시면 됩니다.

mtcars[sample(nrow(mtcars), 10),]
                   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Merc 280C         17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Merc 450SLC       15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
Ferrari Dino      19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
Datsun 710        22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Lotus Europa      30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
AMC Javelin       15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
Merc 230          22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1

3. sample_n(), sample_frac()

데이터에서 임의로 샘플 데이터를 추출할 때는 dplyr 패키지의 sample_n() 함수와 sample_frac() 함수를 사용합니다.

sample_n() 함수는 전체 데이터에서 샘플 데이터를 개수 기준으로 추출해주며, sample_frac() 함수는 전체 데이터에서 샘플 데이터를 비율 기준으로 추출합니다.

아래에서는 두 함수의 사용 예시를 설명하겠습니다.

1) 샘플 데이터 n개 추출하기

sample_n(n) 함수는 n개의 샘플 데이터를 추출하는데 사용됩니다. 아래 예시는 mtcars 데이터셋에서 10개의 샘플 데이터를 추출합니다.

library(dplyr)

sample_n(mtcars, 10)
                   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Camaro Z28        13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
Toyota Corona     21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
Fiat 128          32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
AMC Javelin       15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Ferrari Dino      19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
Chrysler Imperial 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Toyota Corolla    33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Honda Civic       30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2

2) 샘플 데이터 p% 추출하기

sample_frac(p) 함수는 전체 데이터에서 p만큼의 샘플 데이터를 추출합니다. p0부터 1사이의 값을 가지며, 10%의 데이터를 추출하고자 한다면 0.1을 입력해주면 됩니다. 아래 예시는 mtcars 데이터셋에서 50%의 샘플 데이터를 추출합니다.

library(dplyr)

sample_frac(mtcars, 0.5)
                    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Hornet Sportabout  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Honda Civic        30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
Cadillac Fleetwood 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
Datsun 710         22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Merc 450SLC        15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
Ford Pantera L     15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
Chrysler Imperial  14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Maserati Bora      15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
Mazda RX4          21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Merc 450SE         16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
Lotus Europa       30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
Fiat 128           32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
Merc 240D          24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Duster 360         14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Ferrari Dino       19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
Mazda RX4 Wag      21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4


추출된 데이터 개수를 비교해 보면 전체 32개의 데이터 중에 16개의 데이터가 추출된 것을 볼 수 있습니다.

nrow(mtcars);nrow(sample_frac(mtcars, 0.5));
[1] 32
[1] 16

4. 관련 링크

[1] [R] R에서 반응 변수 비율에 맞춰 데이터셋 분할하기 (15회 ADP 실기 기출)
[2] [R] 연산자(Operator) 종류 및 사용법 - 초급편

banner-request-analysis