はじめに
こちらの記事で作成したデータをもっと扱いやすいデータフレームにきちんとまとめようと思い執筆。男女の割合をデータ数に反映する事など改良を行った。データ生成の参考文献については、記事末尾に記載した。
※追記:2021/02/18 コメントで頂いた通り、性別と血液型の生成に sample
関数を使う場合のコードも示した。
データ生成
$N$人についてランダムサンプルを行った際の性別、身長、体重、血液型の模擬データの作成コードを以下に示す。最初の変数指定でデータのパラメータが調整可能なようにした。
###パラメータ
#人口の男女比
male <- 6143 #万人
female <- 6480 #万人
#男女の身長、BMIの値
male.height.mean <- 171.7 #cm
male.height.sd <- 6.6 #cm
male.bmi.mean <- 23.12
male.bmi.sd <- 4.24
female.height.mean <- 158.3 #cm
female.height.sd <- 5.7 #cm
female.bmi.mean <- 20.82
female.bmi.sd <- 3.42
#血液型の割合
A <- 0.39
B <- 0.22
O <- 0.29
AB <- 0.10
#データ数
N <- 1000
###男女のベクトルを作成
mf <- c()
for(i in 1:N){
tmp <- runif(1)
if (tmp < (male/(male+female))) mf <- c(mf, "male")
else mf <- c(mf, "female")
}
###血液型のベクトルを作成
bt <- c()
for(i in 1:N){
tmp <- runif(1)
if (tmp < A) bt <- c(bt, "A")
else if (A <= tmp & tmp < (A+B)) bt <- c(bt, "B")
else if ((A+B) <= tmp & tmp < (A+B+O)) bt <- c(bt, "O")
else bt <- c(bt, "AB")
}
###身長、体重のベクトルを作成
h <- c()
w <- c()
for (i in 1:N) {
if (mf[i] == "male") {
height <- rnorm(n=1,mean=male.height.mean,sd=male.height.sd)
bmi <- rnorm(n=1,mean=male.bmi.mean,sd=male.bmi.sd)
} else {
height <- rnorm(n=1,mean=female.height.mean,sd=female.height.sd)
bmi <- rnorm(n=1,mean=female.bmi.mean,sd=female.bmi.sd)
}
weight <- (height * 0.01)^2 * bmi
h <- c(h, height)
w <- c(w, weight)
}
###data.frame化
df <- data.frame(SEX=mf,HEIGHT=h,WEIGHT=w,BLOOD=bt)
生成されたデータを見てみると…、
コード
head(df)
出力
SEX HEIGHT WEIGHT BLOOD
1 female 158.4726 40.46012 B
2 male 178.1273 68.64015 A
3 male 176.7241 65.13530 O
4 female 166.6573 44.02083 A
5 male 168.1153 57.24288 A
6 male 179.5274 82.10058 A
となる。一応できてそう。
sample
関数を使った場合
上記のコードの26行目から42行目を下記の様に書き換える。
###男女のベクトルを作成
mf <- sample(c("male","female"), N, replace = TRUE, prob = c(male, female))
###血液型のベクトルを作成
bt <- sample(c("A","B","O","AB"), N, replace = TRUE, prob = c(A,B,O,AB))
こうすると1行で書けるのでだいぶすっきりする。コメントありがとうございました!
データの可視化
作成したデータの可視化についてはこちらの記事でいろいろなプロットを作ってみる事とする。