Rのdplyrで層化サンプリング
手元のラップトップで扱うにはあまりにでかいデータを扱うことになって困っている。
とりあえず大学に使えるサーバーとか無い?と連絡しているが、当面は手元でやるしかなさそうなので、ランダムサンプリングしてデータを小さくして分析することにした。
単純サンプリングでもいいのだが、各年ごとと各カテゴリーごとに層化したサンプリングのほうがいいなぁと思っていたのだが、dplyrの中で簡単にできそうだったので試した。以下はその備忘録である。
層化サンプリングは層別サンプリング、層化抽出法とか英語ではstratified samplingとか言われるようですが、グループに分けてグループ内でサンプルする方法。
たとえばある個人データをサンプルしたいときに、母集団の男女比をキープしてサンプリングしたい場合に、男女をグループに分けてからその中でサンプリングするとかね。
データのサンプリングにはsample_nかsample_fracを使う。例えば各カテゴリー30個のサンプルサイズがほしければsample_n(30)とすればよい。
元のデータのサンプルサイズの20%がほしければsample_frac(0.2)とする。
単純サンプリング
なにも層化せずにサンプリングすると以下のようになる。
irisデータを使ってサンプリングし、種類ごとの数を下のテーブルで示している。
元は各種類50ずつのサンプルがあるのだが、下の例ではサンプルサイズは各種で一様になってない。
library(dplyr) set.seed(3) # set random seed df1 <- iris %>% sample_frac(0.2)
>table(df1$Species) setosa versicolor virginica 10 13 7
層化サンプリング
次に、種類で層化してサンプリングした例を示す。
シンプルにgroup_byで分けた後にサンプルするだけ。
set.seed(3) df2 <- iris %>% group_by(Species) %>% sample_frac(0,2) ungroup()
table(df2$Species) setosa versicolor virginica 10 10 10
各カテゴリーで同じ数だけサンプリングできている。