サンプリングは統計分析の重要な機能です。通常、データのサイズを減らし、意味のある作業を実行するためにデータをサンプリングします。Rでは、通常、サンプリングするには、データをメモリーにロードする必要があります。ただし、データが非常に大きい場合、それは不可能です。
Oracle R Enterpriseでは、データベースからデータをプルしてサンプリングするかわりに、データベースで直接サンプリングしてそのサンプル部分であるレコードのみをプルできます。データベースでサンプリングすることで、データの移動を最小化するため、より大きなデータセットで作業できます。これは、この機能を可能にする透過層での順序付けフレームワークの整数行の索引付けであることに注意してください。
注意:
サンプリングには、「順序付けられたおよび順序付けられていないore.frameオブジェクトの作成」で説明する順序付けられたore.frameオブジェクトを使用する必要があります。
この項の例に、いくつかのサンプリング手法を示します。同様の例は、sampling.R
のスクリプト例にあります。
例3-10 簡単なランダム・サンプリング
この例では、行をランダムに簡単に選択する方法を示します。この例では、小規模なdata.frame
オブジェクトを作成し、それをデータベースにプッシュしてore.frame
オブジェクトであるMYDATA
を作成します。20行のうちの5行をサンプリングします。Rのsample
関数を使用して、MYDATA
からサンプルを取得するために使用する索引のランダムなセットを生成します。このサンプル(simpleRandomSample
)はore.frame
オブジェクトです。
set.seed(1) N <- 20 myData <- data.frame(a=1:N,b=letters[1:N]) MYDATA <- ore.push(myData) head(MYDATA) sampleSize <- 5 simpleRandomSample <- MYDATA[sample(nrow(MYDATA), sampleSize), , drop=FALSE] class(simpleRandomSample) simpleRandomSample例3-10のリスト
R> set.seed(1) R> N <- 20 R> myData <- data.frame(a=1:N,b=letters[1:N]) R> MYDATA <- ore.push(myData) R> head(MYDATA) a b 1 1 a 2 2 b 3 3 c 4 4 d 5 5 e 6 6 f R> sampleSize <- 5 R> simpleRandomSample <- MYDATA[sample(nrow(MYDATA), sampleSize), , drop=FALSE] R> class(simpleRandomSample) [1] "ore.frame" attr(,"package") [1] "OREbase" R> simpleRandomSample a b 2 2 b 7 7 g 10 10 j 12 12 l 19 19 s
例3-11 分割データ・サンプリング
この例では、トレーニング・セットおよびテスト・セットへのデータのランダムなパーティショニングを示します。このデータの分割は通常、新しいデータに対するモデルの効果を評価するために、分類および回帰で行われます。この例では、例3-10で作成したMYDATA
オブジェクトを使用します。
この例では、テスト・データセットとして使用するための索引のサンプル・セットを生成します。次に、論理ベクターgroup
を作成します(索引がサンプルにある場合はTRUE
、そうでない場合はFALSE
)。次に、行の索引付けを使用して、トレーニング・セット(groupがFALSE
)およびテスト・セット(groupがTRUE
)を生成します。sample
関数の呼出し時に指定したとおり、トレーニング・セットの行数は15でテスト・セットの行数は5であることに注意してください。
set.seed(1) sampleSize <- 5 ind <- sample(1:nrow(MYDATA), sampleSize) group <- as.integer(1:nrow(MYDATA) %in% ind) MYDATA.train <- MYDATA[group==FALSE,] dim(MYDATA.train) MYDATA.test <- MYDATA[group==TRUE,] dim(MYDATA.test)例3-11のリスト
R> set.seed(1) R> sampleSize <- 5 R> ind <- sample(1:nrow(MYDATA), sampleSize) R> group <- as.integer(1:nrow(MYDATA) %in% ind) R> MYDATA.train <- MYDATA[group==FALSE,] dim(MYDATA.train) [1] 15 2 R> MYDATA.test <- MYDATA[group==TRUE,] R> dim(MYDATA.test) [1] 5 2
例3-12 系統的サンプリング
この例では、定期的に行が選択される系統的サンプリングを示します。この例では、seq
関数を使用して、2から始まり3ずつ増加する一連の値を作成します。この順序の値の数はMYDATA
の行数と同じです。MYDATA
オブジェクトは例3-10で作成しています。
set.seed(1) N <- 20 myData <- data.frame(a=1:20,b=letters[1:N]) MYDATA <- ore.push(myData) head(MYDATA) start <- 2 by <- 3 systematicSample <- MYDATA[seq(start, nrow(MYDATA), by = by), , drop = FALSE] systematicSample例3-12のリスト
R> set.seed(1) R> N <- 20 R> myData <- data.frame(a=1:20,b=letters[1:N]) R> MYDATA <- ore.push(myData) R> head(MYDATA) a b 1 1 a 2 2 b 3 3 c 4 4 d 5 5 e 6 6 f R> start <- 2 R> by <- 3 R> systematicSample <- MYDATA[seq(start, nrow(MYDATA), by = by), , drop = FALSE] systematicSample a b 2 2 b 5 5 e 8 8 h 11 11 k 14 14 n 17 17 q 20 20 t
例3-13 層別サンプリング
この例では、行が各グループ内で選択される層別サンプリングを示します(グループは、特定の列の値によって決まります)。この例では、各行がグループに割り当てられているデータセットを作成します。関数rnorm
はランダムの正規値を生成します。引数4は分布の目標平均です。グループに応じてデータを分割し、各パーティションに比例してサンプリングします。最後に、サブセットore.frame
オブジェクトのリストを1つのore.frame
オブジェクトに行バインドし、結果の値stratifiedSample
を表示します。
set.seed(1) N <- 200 myData <- data.frame(a=1:N,b=round(rnorm(N),2), group=round(rnorm(N,4),0)) MYDATA <- ore.push(myData) head(MYDATA) sampleSize <- 10 stratifiedSample <- do.call(rbind, lapply(split(MYDATA, MYDATA$group), function(y) { ny <- nrow(y) y[sample(ny, sampleSize*ny/N), , drop = FALSE] })) stratifiedSample例3-13のリスト
R> set.seed(1) R> N <- 200 R> myData <- data.frame(a=1:N,b=round(rnorm(N),2), + group=round(rnorm(N,4),0)) R> MYDATA <- ore.push(myData) R> head(MYDATA) a b group 1 1 -0.63 4 2 2 0.18 6 3 3 -0.84 6 4 4 1.60 4 5 5 0.33 2 6 6 -0.82 6 R> sampleSize <- 10 R> stratifiedSample <- do.call(rbind, + lapply(split(MYDATA, MYDATA$group), + function(y) { + ny <- nrow(y) + y[sample(ny, sampleSize*ny/N), , drop = FALSE] + })) R> stratifiedSample a b group 173|173 173 0.46 3 9|9 9 0.58 4 53|53 53 0.34 4 139|139 139 -0.65 4 188|188 188 -0.77 4 78|78 78 0.00 5 137|137 137 -0.30 5
例3-14 クラスタ・サンプリング
この例では、グループ全体がランダムに選択されるクラスタ・サンプリングを示します。この例では、グループに応じてデータを分割してから、グループ内でサンプリングし、1つのore.frame
オブジェクトに行バインドします。生成されるサンプルには、6および7の2つのクラスタのデータが含まれます。
set.seed(1) N <- 200 myData <- data.frame(a=1:N,b=round(runif(N),2), group=round(rnorm(N,4),0)) MYDATA <- ore.push(myData) head(MYDATA) sampleSize <- 5 clusterSample <- do.call(rbind, sample(split(MYDATA, MYDATA$group), 2)) unique(clusterSample$group)例3-14のリスト
R> set.seed(1) R> N <- 200 R> myData <- data.frame(a=1:N,b=round(runif(N),2), + group=round(rnorm(N,4),0)) R> MYDATA <- ore.push(myData) R> head(MYDATA) a b group 1 1 0.27 3 2 2 0.37 4 3 3 0.57 3 4 4 0.91 4 5 5 0.20 3 6 6 0.90 6 R> sampleSize <- 5 R> clusterSample <- do.call(rbind, + sample(split(MYDATA, MYDATA$group), 2)) R> unique(clusterSample$group) [1] 6 7
例3-15 割当てサンプリング
この例では、サンプルとして連続したレコード番号が選択される割当てサンプリングを示します。この例では、head
関数を使用してサンプルを選択します。tail
関数も使用できます。
set.seed(1) N <- 200 myData <- data.frame(a=1:N,b=round(runif(N),2)) MYDATA <- ore.push(myData) sampleSize <- 10 quotaSample1 <- head(MYDATA, sampleSize) quotaSample1例3-15のリスト
R> set.seed(1) R> N <- 200 R> myData <- data.frame(a=1:N,b=round(runif(N),2)) R> MYDATA <- ore.push(myData) R> sampleSize <- 10 R> quotaSample1 <- head(MYDATA, sampleSize) R> quotaSample1 a b 1 1 0.15 2 2 0.75 3 3 0.98 4 4 0.97 5 5 0.35 6 6 0.39 7 7 0.95 8 8 0.11 9 9 0.93 10 10 0.35