# try_ft01.rb.txt ruby script (encoding: Windows-31J) # 統計解析のF検定とt検定の例(data_ft.csvを読み込んで分析) # 男女間で、身長と体重に違いがあるか否かを検証する # 解析結果をhtmlとして書き出す(z_ft01.htm) # 文書先頭に目次を付加 # 散布図(z_ft.png)も書き出す require "rpt" require "erb" # Rプログラム&markdown原稿の調整 prog_markdown = DATA.read # Rプログラムとmarkdown原稿の読み込み prog_markdown = Rrx::erb_three(prog_markdown) rpro, mkd_str = prog_markdown.split(/\n####[^\n]+\n+/) # R, markdownの分割 # Rの実行と結果の取り込み fff_png = "z_ft.png" if test(?e, fff_png) File.unlink(fff_png) end rpro = ERB.new(rpro).result(binding) hs = Rrx.rexec(rpro) # Rの実行 # Rプログラムの実行結果を取り込んで、markdown生成の準備 xx = hs["xx"] tbl = xx["tbl"] ff = {} tt = {} %w(身長 体重).each do |item| wff = xx[item]["ff"] ff[item] = [["項目", "値"]] wff.each do |key, val| if val.class == Array val = val.join(" | ") end ff[item] << [key, val] end wtt = xx[item]["tt"] tt[item] = [["項目", "値"]] wtt.each do |key, val| if val.class == Array val = val.join(" | ") end tt[item] << [key, val] end end height_fp = xx["身長"]["ff"]["p.value"] height_tp = xx["身長"]["tt"]["p.value"] weight_fp = xx["体重"]["ff"]["p.value"] weight_tp = xx["体重"]["tt"]["p.value"] # markdown原稿の生成 mkd_str = ERB.new(mkd_str, nil, '-').result(binding) html_str = Rrx::kramdown_html(mkd_str, :s) File.open("z_ft01.htm", "w") {|ff| ff.write html_str} __END__ # Rプログラム dtf <- read.csv("data_ft.csv", header=T, na.strings="") dtf$性別 <- factor(dtf$性別, c("m","f"), c("男性","女性")) # 男女別に、身長と体重それぞれについて、平均と標準偏差の表を作成 targets <- c("身長", "体重") tbl1 <- va1(dtf, "性別", targets, function(x) sprintf("%.1f(sd %.2f)", mean(x), sd(x))) tbl2 <- va1(dtf, "性別", targets, function(x) sprintf("%.1f〜%.1f", min(x), max(x))) tbl <- cbind(tbl1, tbl2) colnames(tbl) <- c("身長の平均値等", "体重の平均値等", "身長の最小値等", "体重の最小値等") xx <- list(tbl=tbl) # 男性・女性の分類 male <- subset(dtf, 性別 == "男性") # 男性の抽出 female <- subset(dtf, 性別 == "女性") # 女性の抽出 # F検定とt検定 for (trg in targets) { ff <- var.test(male[[trg]], female[[trg]]) # F検定 flag <- (ff$p.value >= 0.05) # 等分散ならtrue tt <- t.test(male[[trg]], female[[trg]], var.equal=flag) # t検定 xx[[trg]] <- list(ff=ff, tt=tt) } robj(xx, "xx") # 散布図の作成 weight_range <- c(min(dtf$体重), max(dtf$体重)) height_range <- c(min(dtf$身長), max(dtf$身長)) png(file = "fff_png") par(family = "Japan1GothicBBB") # 日本語フォントにゴチックを指定 plot(male$体重, male$身長, type="p", xlim = weight_range, ylim = height_range, xlab="体重", ylab="身長", col = "blue") par(new = T) # 上書き plot(female$体重, female$身長, type="p", xlim = weight_range, ylim = height_range, xlab="", ylab="", col = "red") dev.off() #### 以降は markdownの原稿 <%= Rrx::kramdown_contents("<目次>") %> ---------------- # はじめに  身長と体重について、男女それぞれ5人づつ(合計10人)のデータがある。  これを基に、男女間で身長と体重に有意な違いがあるかどうかを検定する。  まず、身長と体重の各々に関して、男女それぞれの値が等分散か否かをF検定によって確認する。  次に、t検定によって男女間に有意な違いがあるかどうかを見る。  統計解析ソフトRの検定結果を一通り示す。 ---------------- # 基本的な集計表  統計的検定を行う前に、平均値・標準偏差および最小値・最大値の算出結果を表の形で示す。  括弧内のsdが標準偏差の値。これが大きいほど、ばらつきが大きいことになる。 <%= Rrx::matrix2table(tbl) %> ---------------- # 散布図  横軸を体重、縦軸を身長とする散布図を掲げる。  男性を青、女性を赤で示した。 ![散布図](fff_png) ---------------- # 身長に関する検定結果  まず、F検定の結果は次のとおり。 <%= Rrx::matrix2table(ff["身長"]) %>  上記の p.value の値(今回は <%= height_fp %>)が0.05以上であれば 等分散と判断する。等分散か否かによってt検定の方法が少し違ってくる。  次にt検定の結果を示す。 <%= Rrx::matrix2table(tt["身長"]) %>  上記の p.value の値(今回は <%= height_tp %>)が0.05未満であれば、 有意差があると判断する。つまり、男女間で「身長」に違いがあると見る。  p.valueが0.05以上の時は、有意差があるとは判断しない。つまり、男女間で「身長」に違いがあるとは言いきれないと見る。 ---------------- # 体重に関する検定結果  F検定の結果は次のとおり。 <%= Rrx::matrix2table(ff["体重"]) %>  次にt検定の結果を示す。 <%= Rrx::matrix2table(tt["体重"]) %> <% if weight_tp < 0.05 then -%> <%= sprintf(" t検定におけるp.value(%g)<0.05なので、男女間で体重に有意な違いがあると見る。", weight_tp) %> <% else -%> <%= sprintf(" t検定におけるp.value(%g)>=0.05なので、男女間で体重に有意な違いがあるとは言いきれないと見る。", weight_tp) %> <% end -%> ----------------