R、統計学、機械学習と競馬予想

学んだことを面白くメモするブログ

Rでサンプルデータを作成するのが難しかったので、作ってみた

一昨日の勉強会で、参加者全員でモデルに当てはまるサンプルデータをRで作ってみようとなった時になかなか良いサンプルを作れなかったので、落ち着いて作ってみる。 data-refinement.connpass.com

 勉強会の内容と作成するモデル

勉強会の内容は、発表者のSSAS3さんが書いてくれたこれ。ランダム化実験が驚くほどよくわかってすごかった。 qiita.com

作りたいサンプルは以下の条件を満たすことだけで、あとは適当でOKという条件(少し勉強会のときから条件を変えています)

Y1(任意) Y2(ランダム)
作業手伝いなし a b
作業手伝いあり A B

a,b,A,Bはテストの点数の平均。

  • a<A
    • 任意にやらせると、準備が整っている生徒が作業をするので、作業ありの方が点数が高くなる
  • b>B
    • ランダムで作業をやらせると、作業なしグループは準備ができるので点数が高くなる

使う関数の候補

関数 概要
rnorm 正規分布に従う乱数を発生
runif 一様分布に従う乱数を発生
sumple 無作為抽出
round 少数点以下を丸める
floor 少数点以下を繰り下げ
ceiling 小数点以下を繰り上げ

練習

n <- 10 # クラスの人数を10人とする
pre <- runif(n,min=-1,max=1) # 一様分布から乱数を作成
ceiling(pre) # preを切り上げて、0と1にする
sample(c(1,0),size=n,replace=TRUE) #ランダムでトリートメントグループとコントロールグループに分ける 
sample(rep(c(1,0),times=n/2),size=n) # 半分ずつトリートメントグループとコントロールグループに分ける
sample(rep(c(1,0),times=c(10,30)),size=n) #10人、30人のトリートメントグループとコントロールグループに分ける

サンプルデータ作成

library(dplyr)

set.seed(2)

NO <- 1:40 # 出席番号
pre <- runif(40,-1,1) #  準備ができているか
Tvol <- ceiling(pre) #  準備ができていれば1で作業を手伝う、できていなければ0で作業を手伝わない
y1 <- round(pre*20+70) +(1-Tvol)*sample(1:5,40,replace=TRUE) # 1回目の点数

Trand <-sample(c(0,1),40,replace = TRUE) # ランダムに作業手伝いを決める
y2 <- round(pre*20+70)+(1-Trand)*sample(1:5,40,replace=TRUE) # 2回目の点数

sample1 <- data.frame(出席番号=NO,Tvol,y1,Trand,y2) # データフレームを作成


# 1回目の小テストをクロス集計
sample1 %>%
group_by(Tvol) %>%
summarise(n=length(y1),mean=mean(y1))


# 2回目のテストをクロス集計
sample1 %>%
 group_by(Trand) %>%
 summarise(n=length(y2),mean=mean(y2))

jupyterのファイルを下記にあげています。 他にもやり方が色々あるだろうから、コメントとか次の勉強会で教えてください。

github.com