データ分析メモと北欧生活

旧Untitled Note. データ分析、計量経済・統計とR、水産管理、英語勉強、海外生活などについて備忘録や自分の勉強のOutputの場所として

MENU

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 

各カテゴリーで同じ数だけサンプリングできている。