Rで何かをしたり、読書をするブログ

政府統計の総合窓口のデータや、OECDやUCIやのデータを使って、Rの練習をしています。ときどき、読書記録も載せています。

東京都の児童・生徒の体力テストの調査結果のデータの分析3 - R の infer パッケージを利用して、2009年と2022年の比較をする

Bing Image Creator で生成: Close up of a pink Rhododendron flower, background is  blue clear sky, photo
www.crosshyou.info

の続きです。前回はおおまかな分析で2009年と2022年の体力テストの結果を比較して、2009年のほうがテスト結果が良いようだとわかりました。

今回は、もう少しちゃんと分析してみます。

前回は、学年の違いや男女の別を考慮せずに、2009年の平均値と2022年の平均値を計算しました。

今回は、学年の違いと男女の別考慮して分析してみます。

infer という統計的推論のパッケージを使用します。

Tidy Statistical Inference • infer  <<< このサイトに詳しい使い方があります。

まず、infer パッケージを library() 関数で読み込みましょう。

year は 2009 と 2022 の二つの値しかないので、ファクター型に変換しておきます。

そうしたら、spceify() 関数と fit() 関数を使い、observed fit を求めます。

year2022 の係数は -0.0154 です。つまり、学年や男女差を考慮しても、2022年のほうが2009年よりも体力テストの結果は 0.0154 低いということです。

これが、統計的に有意に 0 と違うのかどうかが問題です。

ブートストラップ法で、いまの作業を 1000 回繰り返します。

year の係数だけ抜き出してみましょう。

1 回目の推計では、係数がプラスです。2 回目から 10回目はマイナスで推計されました。

95%信頼区間を求めます。

year2022 の 95% 信頼区間は -0.0529 ~~ 0.0218 です。0 を含んでいますから、学年と男女別を考慮した後では、2009 年と 2022 年では統計的に有意な違いは認められない、ということですね。

ということで、学年、男女の別を考慮した状況で 2009 年と 2022 年の体力測定の結果は、平均すると、2022 年のほうが悪いけど、統計的に有意な違いとは言えないということがわかりました。

もちろん、これは、1 学年、男子、女子 一人だけの結果とみなしたものです。

実際は、多数の児童・生徒の平均値がこのデータになっているので、2022年のほうが体力テストの結果は悪くなっているのでしょうね。

なので、仮想の多数の児童・生徒のデータセットを作って同じことをやってみます。

まず、仮想のデータセットを作ります。

生徒の数は 1,0000 人にしてみました。東京都の生徒・児童数は小学生は 60 万人、中学生は 20万人 ぐらいだそうですが、データ数を多いと計算時間も長くなりそうなので、とりあえず、このくらいでやってみます。

あとは、同じ作業を繰り返すだけです。

observed fit を求めて、

ブートストラップ法で繰り返して、

信頼区間を求めます。

year2022 の係数の 95% 信頼区間は、-0.0256 ~~ -0.00739 と 0 を含んでいません。つまり、2022年 は有意に体力テストの結果は 2009年と比較して悪い、ということです。

今回は以上です。

初めから読むには、

www.crosshyou.info

です。

今回のコードは以下になります。

#
# infer パッケージを読み込む
library(infer)
#
# year をファクター型の変数に変換しておく
df <- df |> 
  mutate(year = factor(year))
df
#
# データから観測されたモデル
obs_fit <- df |> 
  specify(scaled ~ year + grade + gender) |> 
  fit()
obs_fit
#
# ブートストラップ法
set.seed(113)
boot_dist <- df |> 
  specify(scaled ~ year + grade + gender) |> 
  generate(reps = 1000, type = "bootstrap") |> 
  fit()
#
# year の係数だけ表示
boot_dist |> 
  filter(term == "year2022")
#
# 95%信頼区間
conf_ints <- get_confidence_interval(
  boot_dist,
  level = 0.95,
  type = "percentile",
  point_estimate = obs_fit
)
conf_ints
#

# 仮想の個人個人のデータを作る
set.seed(137)
index <- sample(1:nrow(df), size = 10000, replace = TRUE)
df2 <- df[index, ]
df2
#
# observed fit 
obs_fit2 <- df2 |> 
  specify(scaled ~ year + grade + gender) |> 
  fit()
obs_fit2
#
# ブートストラップ法
set.seed(149)
boot_dist2 <- df2 |> 
  specify(scaled ~ year + grade + gender) |> 
  generate(reps = 1000, type = "bootstrap") |> 
  fit()
#
# 95% 信頼区間
conf_ints2 <- get_confidence_interval(
  boot_dist2,
  level = 0.95,
  type = "percentile",
  point_estimate = obs_fit2
)
conf_ints2
#