Rのsample()を使用して、サンプルをどのように取るのか?
Rの中でよく使われる関数のひとつ、sample()を理解しましょう。データ分析では、データのサンプルを取ることがアナリストによって最も一般的なプロセスです。データを研究し理解するために、サンプルを取ることが最善の方法であり、特にビッグデータの場合にはほとんど真実です。
Rでは、データセットからサンプルを抽出するための標準関数sample()が提供されています。多くのビジネスやデータ分析の問題では、データからサンプルを抽出する必要があります。このプロセスでは、置換を用いたランダムデータの生成が行われます。以下のセクションで詳しく説明されています。
さぁ、話題に入っていきましょう!
Rのsample()の構文
sample(x, size, replace = FALSE, prob = NULL)
- x – vector or a data set.
- size – sample size.
- replace – with or without replacement of values.
- replace – with or without replacement of values.
- prob – probability weights
日本語でその表現のパラフレーズを示すことができます。選択肢は次のとおりです:
– 置換を含むサンプルを取る
「置き換えてサンプルを取る」とは、何を意味するのか疑問に思うかもしれません。 (Okikaete sanpuru o toru to wa, nani o imi suru no ka gimon ni omou kamoshiremasen.)
リストやデータからサンプルを取る場合、replace=TRUEまたはTを指定すると、関数は値の繰り返しを許可します。
以下の例を参考にして、ケースを明確に説明します。
#sample range lies between 1 to 5
x<- sample(1:5)
#prints the samples
x
Output -> 3 2 1 5 4
#samples range is 1 to 5 and number of samples is 3
x<- sample(1:5, 3)
#prints the samples (3 samples)
x
Output -> 2 4 5
#sample range is 1 to 5 and the number of samples is 6
x<- sample(1:5, 6)
x
#shows error as the range should include only 5 numbers (1:5)
Error in sample.int(length(x), size, replace, prob) :
cannot take a sample larger than the population when 'replace = FALSE'
#specifing replace=TRUE or T will allow repetition of values so that the function will generate 6 samples in the range 1 to 5. Here 2 is repeated.
x<- sample(1:5, 6, replace=T)
Output -> 2 4 2 2 4 3
「Rでの非復元抽出のサンプル」
この場合、無重複でサンプルを取ります。全体のコンセプトは以下の通りです。
同様の場合、置換なしの関数replace=Fが使用され、値の繰り返しを許しません。
#samples without replacement
x<-sample(1:8, 7, replace=F)
x
Output -> 4 1 6 5 3 2 7
x<-sample(1:8, 9, replace=F)
Error in sample.int(length(x), size, replace, prob) :
cannot take a sample larger than the population when 'replace = FALSE'
#here the size of the sample is equal to range 'x'.
x<- sample(1:5, 5, replace=F)
x
Output -> 5 4 1 3 2
関数set.seed()を使用してサンプルを取得する。
サンプルを取る際には、毎回ランダムに変わる可能性があることを経験するかもしれません。毎回異なるサンプルを避けたい場合、set.seed()関数を利用することができます。
set.seed() – set.seed関数は、実行すると常に同じシーケンスを生成します。
以下はこの場合の具体例です。毎回同じランダムサンプルを取得するために、以下のコードを実行してください。
#set the index
set.seed(5)
#takes the random samples with replacement
sample(1:5, 4, replace=T)
2 3 1 3
set.seed(5)
sample(1:5, 4, replace=T)
2 3 1 3
set.seed(5)
sample(1:5, 4, replace=T)
2 3 1 3
データセットからサンプルを取る
このセクションでは、Rstudioでデータセットからサンプルを生成します。
このコードは、データセット「ToothGrowth」から10行をサンプルとして取り出して表示します。これにより、データセットから必要なサイズのサンプルを取ることができます。
#reads the dataset 'Toothgrwoth' and take the 10 rows as sample
df<- sample(1:nrow(ToothGrowth), 10)
df
--> 53 12 16 26 37 27 9 22 28 10
#sample 10 rows
ToothGrowth[df,]
len supp dose
53 22.4 OJ 2.0
12 16.5 VC 1.0
16 17.3 VC 1.0
26 32.5 VC 2.0
37 8.2 OJ 0.5
27 26.7 VC 2.0
9 5.2 VC 0.5
22 18.5 VC 2.0
28 21.5 VC 2.0
10 7.0 VC 0.5
データセットからset.seed()関数を使ってサンプルを取る。
このセクションでは、set.seed()関数を使用してデータセットからサンプルを取得します。
set.seed()を使用してデータセットからサンプルを生成するために、以下のコードを実行してください。
#set.seed function
set.seed(10)
#taking sample of 10 rows from the iris dataset.
x<- sample(1:nrow(iris), 10)
x
--> 137 74 112 72 88 15 143 149 24 13
#displays the 10 rows
iris[x, ]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
137 6.3 3.4 5.6 2.4 virginica
74 6.1 2.8 4.7 1.2 versicolor
112 6.4 2.7 5.3 1.9 virginica
72 6.1 2.8 4.0 1.3 versicolor
88 6.3 2.3 4.4 1.3 versicolor
15 5.8 4.0 1.2 0.2 setosa
143 5.8 2.7 5.1 1.9 virginica
149 6.2 3.4 5.4 2.3 virginica
24 5.1 3.3 1.7 0.5 setosa
13 4.8 3.0 1.4 0.1 setosa
同じコードを複数回実行すると、同じ行が得られます。値はset.seed()関数を使用しているため変わりません。
Rでsample()を使ってランダムなサンプルを生成する。
それでは、この概念がわかりやすいように、問題を使って説明しましょう。
問題:ある雑貨店は、お客様の中の一人にサプライズの贈り物をすることに決定しました。そのために、いくつかの名前を集めました。問題は、リストの中からランダムな名前を選ぶことです。
以下の文章を日本語で自然な言葉で言い換えてください。オプションは一つだけで大丈夫です。
ヒント:sample() 関数を使ってランダムなサンプルを生成してください。
下記の通り、このコードを実行するたびに参加者名のランダムなサンプルが生成されます。
#creates a list of names and generates one sample from this list
sample(c('jack','Rossie','Kyle','Edwards','Joseph','Paloma','Kelly','Alok','Jolie'),1)
--> "Rossie"
sample(c('jack','Rossie','Kyle','Edwards','Joseph','Paloma','Kelly','Alok','Jolie'),1)
--> "Jolie"
sample(c('jack','Rossie','Kyle','Edwards','Joseph','Paloma','Kelly','Alok','Jolie'),1)
--> "jack"
sample(c('jack','Rossie','Kyle','Edwards','Joseph','Paloma','Kelly','Alok','Jolie'),1)
--> "Edwards"
sample(c('jack','Rossie','Kyle','Edwards','Joseph','Paloma','Kelly','Alok','Jolie'),1)
--> "Kyle"
確率を設定してサンプルを取ること。
上記の例と概念の助けを借りて、データセットからランダムなサンプルを生成し、特定のデータを抽出する方法を理解しました。
簡単な例を用いて、Rを利用することで確率を設定することができるため、多くの問題が解決できると言えば、皆さんの中にはリラックスできる方もいるかもしれません。それでは、具体的な例を通してRがどのように機能するのか見てみましょう。
10個の時計を製造する会社について考えましょう。この10個の時計のうち、20%が不良品と判明しました。以下のコードを使ってこれを説明しましょう。
#creates a probability of 80% good watches an 20% effective watches.
sample (c('Good','Defective'), size=10, replace=T, prob=c(.80,.20))
"Good" "Good" "Good" "Defective" "Good" "Good"
"Good" "Good" "Defective" "Good"
以下に示すように、異なる確率の調整も試すことができます。
sample (c('Good','Defective'), size=10, replace=T, prob=c(.60,.40))
--> "Good" "Defective" "Good" "Defective" "Defective" "Good"
"Good" "Good" "Defective" "Good"
まとめる (Matomeru)
このチュートリアルでは、データセット、ベクトル、またはリストを使って、置換の有無にかかわらず、サンプルを生成する方法を学びました。 set.seed()関数は、同じサンプルのシーケンスを生成する際に役立ちます。
Rで利用可能なさまざまなデータセットからサンプルを取得してみてください。また、CSVファイルをインポートして確率調整を行いながらサンプルを取ることもできます。
もっと勉強:Rのドキュメント