
前回までの分析で、交際・付き合いの平均時間は男性よりも女性のほうが長いことや年度を経るにつれて時間が短くなっていることが観察されました。今回は統計学的に有意にそれらのことが言えるのか、それとも誤差の範囲なのかを確認したいと思います。
まず、t.test()関数で理論ベース、公式ベースで男女の差が有意に0とは違うのかをみてみます。

男女差の平均値は1.744で、p-valueが2.653e-09となりました。0.05よりもずっと小さなp-valueです。つまり、男女の差が0であるとは言えない、ということですね。95%信頼区間は、1.20~2.29と0を含んでいません。どうやら男女差は有意に0ではないらしいです。
理論ベース・公式ベースでなくて、今度はシミュレーションベースでも検定してみます。inferパッケージを使ってやります。まずは、パッケージを読み込みます。

ここからは、
https://infer.netlify.app/articles/t_test
を参考にして進めていきます。
まずは、平均値オブジェクトを作成して保存します。

平均値は1.74です。t.test()関数で求めた平均値と(当然ですが)同じです。
次は、ブートストラップ法で平均値を何個も何個も計算します。

1000個のシミュレーションで平均値を計算しました。statの列が平均値です。
この1000個の仮想平均値か信頼区間を算出します。

95%信頼区間は、1.19~2.28でした。t.test()関数による公式ベースの信頼区間とほとんど同じですね。こちらのほうが0.01だけ0に近いです。シミュレーションベースでも男女差は有意に0とは違うという結果になりました。
グラフにしてみます。


続いて、年度によって交際・付き合いの平均時間が違うかを検証します。年度はカテゴリカル変数で3つの値を持ちます。交際・付き合いの平均時間は数値型の連続変数です。こういう場合はANOVA(ANalysis Of VAriance)ですね。
まずは、理論ベース・公式ベースのaov()関数で確かめます。

F値が3.171で、p値が0.045です。0.05よりも小さな値ですので、交際・付き合いの平均時間が年度によって違いが無いとは言えません、簡単に言えば違いがある、ということです。
このANOVAもシミュレーションベースで検証してみます。
https://infer.netlify.app/articles/anova
のサイトを参考にしてRを動かします。
まず、F値のオブジェクトを生成して保存します。

F値は3.17です。これはaov()関数で求めたF値と同じですね。
シミュレーションでこのF値を1000個生成します。交際・付き合いの平均時間と調査年度が関係ないという仮想のもとでのF値です。

statの列がF値です。
視覚化します。


赤い垂線が実際のF値の位置です。こうしてみると、実際のF値、3.17は結構珍しい値だとわかります。
p値を計算します。

p値は0.04です。aov()関数でのp値と同じで、0.05よりも小さな値です。シミュレーションベースでも調査年度によって交際・付き合いの平均時間に違いがあることが確認できました。
今回は以上です。
次回は、
です。
はじめから読むには、
です。
今回のコードは以下になります。
#
# diff: 女性 - 男性 は0ではないか?
# 公式ベース
# t 検定
t.test(df$diff)
#
# Simulation ベース
library(infer)
#
# 平均値を保存
x_bar <- df |>
specify(formula = diff ~ NULL) |>
calculate(stat = "mean")
x_bar
#
# ブートストラップ法で平均値をシミュレーション
set.seed(119)
boot_dist <- df |>
specify(formula = diff ~ NULL) |>
generate(reps = 1000, type = "bootstrap") |>
calculate(stat = "mean")
boot_dist
#
# パーセンタイル法で信頼区間を取得
percentile_ci <- get_ci(boot_dist,
level = 0.95,
type = "percentile")
percentile_ci
#
# 視覚化
boot_dist |>
visualize() +
shade_confidence_interval(endpoints = percentile_ci)
#
# 年度によってdiffに違いがあるか?
# 公式ベース(One Way ANOVA)
anova_res <- aov(diff ~ year, data = df)
summary(anova_res)
#
# シミュレーションベース
# F値を取得
F_hat <- df |>
specify(formula = diff ~ year) |>
calculate(stat = "F")
F_hat
#
# シミュレーションでF値を生成
set.seed(147)
null_dist <- df |>
specify(formula = diff ~ year) |>
hypothesize(null = "independence") |>
generate(reps = 1000, type = "permute") |>
calculate(stat = "F")
null_dist
#
# 視覚化
null_dist |>
visualize() +
shade_p_value(obs_stat = F_hat,
direction = "greater")
#
# p値
null_dist |>
get_p_value(obs_stat = F_hat,
direction = "greater")
#
(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは、Fine sensitive landscape of natural river side field, close up of white and red Lily flowers, under the blue high sky, Photo です。)