# try_chi02.rb.txt ruby script (encoding: Windows-31J) # Excelファイルを読み込んでカイ二乗検定を行う # markdownを生成し、それをhtmlおよびワード文書に変換 # cccなどの三重変数名をmarkdownに簡単に盛り込むための仕組みを利用 # 別のファイルを読み込む時にも応用できるように工夫(汎用性を追求) require "rrx" require "erb" require "spreadsheet" # Rプログラム&markdown原稿の調整(rrrなどを置換) prog_markdown = DATA.read # Rプログラムとmarkdown原稿の読み込み prog_markdown = Rrx::erb_three(prog_markdown) # xxxなど三重変数名の置換 rpro, mkd_str = prog_markdown.split(/\n####[^\n]+\n+/) # R, markdownの分割 # xlsファイルをcsvに変換 xls_file = "data_chi02.xls" # 素材Excelファイルの名前 sheets = Rrx::xls2ary(xls_file) # Excelファイルを配列に変換 tcsv = Rrx::temp_make(sheets[0], ".csv") # 第1ワークシートをcsvとして出力 fff_csv = tcsv.path # csvファイル(テンポラリファイル)のフルパス名 fff_png = "z_chi02.png" # グラフ画像ファイルの名前 rrr = "性別" # 注目フィールドその1 ccc = "意見" # 注目フィールドその2 # Rプログラムの実行 if test(?e, fff_png) # グラフ画像ファイルが既にあるなら削除 File.unlink(fff_png) end rpro = ERB.new(rpro).result(binding) hs = Rrx.rexec(rpro) # Rの実行 tcsv.unlink # テンポラリファイル(csvファイル)を削除 # Rプログラムの実行結果を取り込んで、markdown生成の準備 xx = hs["xx"] yy = hs["yy"] zz = hs["zz"] hhh = xx["header"].join(",") ccc2 = xx["colnames"].join(",") rrr2 = xx["rownames"].join(",") nnn_e = xx["tbl2"].last.last # 有効回答総数 nnn_t = xx["nrow"] # 無効回答を含む総回答数 uuu = "人" # 素材データの度数の単位 chi_result = [%w(カイ二乗値 自由度 有意確率 クラメール係数), [zz["statistic"], zz["parameter"], zz["p.value"], zz["cramer"]]] # markdown原稿の生成 mkd_str = ERB.new(mkd_str, nil, '-').result(binding) str = mkd_str.gsub(/カイ二乗/, '$$ \chi^{2} $$') # カイ二乗 → χ^2 html_str = Rrx::kramdown_html(str, :s, :table, :mathjax) # 表罫線付加、数式対応 File.open("z_chi02.htm", "w") {|ff| ff.write html_str} docx_str = Rrx::pandoc_docx(str) # docx生成 File.open("z_chi02.docx", "wb") {|ff| ff.write docx_str} __END__ # Rプログラム library(graphics) dtf <- read.csv("fff_csv", header=T, na.strings="") if (!is.null(dtf$性別) && levels(dtf$性別) == c("女性","男性")) { dtf$性別 <- factor(dtf$性別, c("男性","女性"), c("男性","女性")) } xx <- sa1(dtf, "rrr", "ccc") # 無効回答を除くクロス集計 xx$header <- colnames(dtf) xx$nrow <- nrow(dtf) xx$colnames <- colnames(xx$tbl1) xx$rownames <- rownames(xx$tbl1) robj(xx, "xx") mm <- xx$tbl1 # カイ二乗検定の素材クロス集計表 yy <- sa3(dtf, "rrr", "ccc") # 有効回答と無効回答を含むクロス集計 yy$join <- join.tbl(yy$tbl1, yy$pct1, "%d(%.1f)") robj(yy, "yy") # モザイク・グラフの作成 png(file = "fff_png") par(family = "Japan1GothicBBB") # 日本語フォントにゴチックを指定 mosaicplot(mm) dev.off() # カイ二乗検定 zz <- chisq.test(mm) # カイ2乗検定の実施 zz <- append.cramer(zz) # クラメール係数を追加 tt <- c("observed", "expected", "residuals", "stdres") # 表形式の項目 for (i in tt) { zz[[i]] <- round(zz[[i]], 3) # 小数点3桁でのまるめ処理 } robj(zz, "zz") #### 以降は markdownの原稿 # カイ二乗検定の例・その2  「hhh」の項目からなるnnn_t(uuu)のデータがある。  このうち、次の2つの項目に着目してクロス集計を行った。 - rrr: rrr2 - ccc: ccc2  無効回答(無回答)を除く有効回答nnn_e(uuu)のデータについてカイ二乗検定にかけた結果を示す。 ---------------- ## 集計結果  rrrとcccのクロス集計は次のとおり(単位:uuu、%)。 <%= Rrx::matrix2table(yy["join"]) %>  この集計結果のうち、有効回答に着目してモザイクプロットしてみると下のようになる。 ![モザイクプロット](fff_png) ## カイ二乗検定の結果  ピアソンのカイ二乗検定を行ったところ、次の値を得た。 <%= Rrx::matrix2table(chi_result) %> <% if zz["p.value"] < 0.05 then -%> <%= sprintf(" 有意確率(%g)<0.05なので、有意性が認められると判断する。つまり「%s」と「%s」の間には何らかの有意な関係があると見る。", zz["p.value"], rrr, ccc) %> <% else -%> <%= sprintf(" 有意確率(%g)>=0.05なので、有意性が認められないと判断する。つまり「%s」と「%s」とは独立であると見る。", zz["p.value"], rrr, ccc) %> <% end -%> <% if zz["p.value"] < 0.05 then -%> <%= " 調整済み残差は次のとおり。\n" %> <%= Rrx::matrix2table(zz["stdres"]) %> <%= " 一般に、調整済み残差の値が -1.96 より小さければその欄は有意に小さく、1.96 より大きければ有意に大きい。" %> <% end -%>  なお、クラメール係数(<%= zz["cramer"] %>)は、「rrr」と「ccc」の連関の程度を示す数値で、0〜1の範囲の値をとる。1に近いほど連関の程度が強い。