【第2章因果関係】練習問題2.8.1「初期教育における少人数クラスの有効性」
1.データセット・元論文の紹介
(1)データセット
・第2章の練習問題に取り組む際に必要になるデータセットは、第1章の練習問題と同様に以下のリンク先からダウンロードできる。
(2)元論文
・本章の練習問題からは問題を作成するにあたって参考とした論文が脚注で紹介されている。練習問題を解き、興味が湧いて元論文を読みたいと思う方もいると思うので、参考のためリンクを貼っておく。
2.練習問題2.8.1「初期教育における少人数クラスの有効性」
(1)因子変数の作成
①幼稚園のクラスタイプ(classtype)に応じてkinder変数を設定。
②また、人種(race)に応じてrace.facter変数を設定。
> star <- read.csv("STAR.csv")
> dim(star)
[1] 6325 6
> summary(star)
race classtype yearssmall hsgrad g4math g4reading
Min. :1.000 Min. :1.000 Min. :0.0000 Min. :0.000 Min. :487.0 Min. :528.0
1st Qu.:1.000 1st Qu.:1.000 1st Qu.:0.0000 1st Qu.:1.000 1st Qu.:688.0 1st Qu.:696.0
Median :1.000 Median :2.000 Median :0.0000 Median :1.000 Median :710.0 Median :723.0
Mean :1.341 Mean :2.052 Mean :0.9542 Mean :0.833 Mean :708.8 Mean :721.2
3rd Qu.:2.000 3rd Qu.:3.000 3rd Qu.:2.0000 3rd Qu.:1.000 3rd Qu.:732.5 3rd Qu.:750.0
Max. :6.000 Max. :3.000 Max. :4.0000 Max. :1.000 Max. :821.0 Max. :836.0
NA's :3 NA's :3278 NA's :3930 NA's :3972
> star$kinder <- ifelse(star$classtype == 1,"small",ifelse(star$classtype == 2,"normal","support"))
> star$kinder <- as.factor(star$kinder)
> class(star$kinder)
[1] "factor"
> star$race.facter[star$race == 1] <- "white"
> star$race.facter[star$race == 2] <- "black"
> star$race.facter[star$race == 4] <- "hispanic"
> star$race.facter[(star$race != 1) & (star$race != 2) & star$race != 4] <- "others"
> star$race.facter <- as.factor(star$race.facter)
> class(star$race.facter)
[1] "factor"
> summary(star)
race classtype yearssmall hsgrad g4math g4reading
Min. :1.000 Min. :1.000 Min. :0.0000 Min. :0.000 Min. :487.0 Min. :528.0
1st Qu.:1.000 1st Qu.:1.000 1st Qu.:0.0000 1st Qu.:1.000 1st Qu.:688.0 1st Qu.:696.0
Median :1.000 Median :2.000 Median :0.0000 Median :1.000 Median :710.0 Median :723.0
Mean :1.341 Mean :2.052 Mean :0.9542 Mean :0.833 Mean :708.8 Mean :721.2
3rd Qu.:2.000 3rd Qu.:3.000 3rd Qu.:2.0000 3rd Qu.:1.000 3rd Qu.:732.5 3rd Qu.:750.0
Max. :6.000 Max. :3.000 Max. :4.0000 Max. :1.000 Max. :821.0 Max. :836.0
NA's :3 NA's :3278 NA's :3930 NA's :3972
kinder race.facter
normal :2194 black :2058
small :1900 hispanic: 5
support:2231 others : 25
white :4234
NA's : 3
(2)4年生時の算数・読解の成績への影響(平均・標準偏差)
①算数について
1)幼稚園のクラスタイプが少人数クラスの場合、平均値は709.2点。
一方、標準クラスは709.5点のため、平均値の差は殆ど無い。
2)少人数クラスと標準クラスの標準偏差には2.5点程度の差がある。
②読解について
1)幼稚園のクラスタイプが少人数クラスの場合、平均値は723.4点。
一方、標準クラスは719.9.点のため、3.5点ほど平均値に差がある。
2)少人数クラスと標準クラスの標準偏差には1.6点程度の差がある。
> tapply(star$g4math,star$kinder,summary)
$normal
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
487.0 688.0 710.0 709.5 731.8 821.0 1352
$small
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
487.0 686.8 710.0 709.2 736.2 821.0 1160
$support
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
487.0 688.0 710.0 707.6 732.0 821.0 1418
> tapply(star$g4math,star$kinder,sd,na.rm = TRUE)
normal small support
41.02063 43.57318 44.74373
> tapply(star$g4reading,star$kinder,summary)
$normal
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
528.0 693.0 723.0 719.9 749.2 836.0 1358
$small
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
528.0 697.0 724.0 723.4 750.0 836.0 1174
$support
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
528.0 697.5 722.0 720.7 750.0 836.0 1440
> tapply(star$g4reading,star$kinder,sd,na.rm = TRUE)
normal small support
53.16788 51.54494 52.44263
(3)4年生時の算数・読解の成績への影響(分位値トリートメント効果)
①算数について
1) 33%タイルは標準クラス696、少人数クラス694と2点の差がある。
2)66%タイルは標準クラス724、少人数クラス726と2点の差がある。
②読解について
1) 33%タイルは標準クラス705、少人数クラス705と差が無い。
2)66%タイルは標準クラス740、少人数クラス741と1点の差がある。
> quantile(star$g4math[star$kinder == "normal"],probs = seq(from = 0.33,to = 0.66,by = 0.11),na.rm = TRUE)
33% 44% 55% 66%
696 705 714 724
> quantile(star$g4math[star$kinder == "small"],probs = seq(from = 0.33,to = 0.66,by = 0.11),na.rm = TRUE)
33% 44% 55% 66%
694 705 715 726
> quantile(star$g4reading[star$kinder == "normal"],probs = seq(from = 0.33,to = 0.66,by = 0.11),na.rm = TRUE)
33% 44% 55% 66%
705 717 728 740
> quantile(star$g4reading[star$kinder == "small"],probs = seq(from = 0.33,to = 0.66,by = 0.11),na.rm = TRUE)
33% 44% 55% 66%
705 719 731 741
(4)少人数クラス在籍年数別の4年生時の算数・読解の成績への影響
<少人数クラスの在籍年数について>
①4年間継続して少人数クラスだった子供は857人
(kinder=small かつ yearsmall=4)
②4年間で一度も少人数クラスを経験していない子供は3,957人
(kinder=normal または support かつ yearsmall=0)
③4年間で最低1年間は少人数クラスだった子供は1,511人
(上記1),2)の条件に該当しない子供全て)
<少人数クラスの在籍年数の長さによる成績の違い>
①算数について
1)グラフではクラスタイプが少人数・標準については少人数クラス
の在籍年数の長さに応じで平均値・中央値ともに高くなる傾向が
あるように思われる(但し、単調増加では無い)。
2)一方、クラスタイプが補助指導付きは、少人数や標準よりも、
傾向が弱くなっているように思われる。
②読解について
・少人数クラスの在籍年数の長さに応じて、平均値・中央値が
必ずしも増加していないため、読解の成績に関して大きな変化は
みられない。
> table(kinder = star$kinder,yearssmall = star$yearssmall)
yearssmall
kinder 0 1 2 3 4
normal 1961 95 58 80 0
small 0 576 272 195 857
support 1996 97 60 78 0
> g4math_normal_yearsmall <- tapply(star$g4math[star$kinder=="normal"],star$yearssmall[star$kinder=="normal"],mean,na.rm=TRUE)
> g4math_small_yearsmall <- tapply(star$g4math[star$kinder=="small"],star$yearssmall[star$kinder=="small"],mean,na.rm=TRUE)
> g4math_support_yearsmall <- tapply(star$g4math[star$kinder=="support"],star$yearssmall[star$kinder=="support"],mean,na.rm=TRUE)
> g4math_normal_yearsmall_median <- tapply(star$g4math[star$kinder=="normal"],star$yearssmall[star$kinder=="normal"],median,na.rm=TRUE)
> g4math_small_yearsmall_median <- tapply(star$g4math[star$kinder=="small"],star$yearssmall[star$kinder=="small"],median,na.rm=TRUE)
> g4math_support_yearsmall_median <- tapply(star$g4math[star$kinder=="support"],star$yearssmall[star$kinder=="support"],median,na.rm=TRUE)
> par(mfrow = c(2,3))
> plot(g4math_normal_yearsmall,type = "b",ylim = c(695,720),ylab="score",xlab = "yearsmall",main = "g4math_normal_mean")
> plot(g4math_small_yearsmall,type = "b",ylim = c(695,720),ylab="score",xlab = "yearsmall",main = "g4math_small_mean")
> plot(g4math_support_yearsmall,type = "b",ylim = c(695,720),ylab="score",xlab = "yearsmall",main = "g4math_support_mean")
> plot(g4math_normal_yearsmall_median,type = "b",ylim = c(695,720),ylab="score",xlab = "yearsmall",main = "g4math_normal_median")
> plot(g4math_small_yearsmall_median,type = "b",ylim = c(695,720),ylab="score",xlab = "yearsmall",main = "g4math_small_median")
> plot(g4math_support_yearsmall_median,type = "b",ylim = c(695,720),ylab="score",xlab = "yearsmall",main = "g4math_support_median")
> g4reading_normal_yearsmall <- tapply(star$g4reading[star$kinder=="normal"],star$yearssmall[star$kinder=="normal"],mean,na.rm=TRUE)
> g4reading_small_yearsmall <- tapply(star$g4reading[star$kinder=="small"],star$yearssmall[star$kinder=="small"],mean,na.rm=TRUE)
> g4reading_support_yearsmall <- tapply(star$g4reading[star$kinder=="support"],star$yearssmall[star$kinder=="support"],mean,na.rm=TRUE)
> g4reading_normal_yearsmall_median <- tapply(star$g4reading[star$kinder=="normal"],star$yearssmall[star$kinder=="normal"],median,na.rm=TRUE)
> g4reading_small_yearsmall_median <- tapply(star$g4reading[star$kinder=="small"],star$yearssmall[star$kinder=="small"],median,na.rm=TRUE)
> g4reading_support_yearsmall_median <- tapply(star$g4reading[star$kinder=="support"],star$yearssmall[star$kinder=="support"],median,na.rm=TRUE)
> par(mfrow = c(2,3))
> plot(g4reading_normal_yearsmall,type = "b",ylim = c(700,735),ylab="score",xlab = "yearsmall",main = "g4reading_normal_mean")
> plot(g4reading_small_yearsmall,type = "b",ylim = c(700,735),ylab="score",xlab = "yearsmall",main = "g4reading_small_mean")
> plot(g4reading_support_yearsmall,type = "b",ylim = c(700,735),ylab="score",xlab = "yearsmall",main = "g4reading_support_mean")
> plot(g4reading_normal_yearsmall_median,type = "b",ylim = c(700,735),ylab="score",xlab = "yearsmall",main = "g4reading_normal_median")
> plot(g4reading_small_yearsmall_median,type = "b",ylim = c(700,735),ylab="score",xlab = "yearsmall",main = "g4reading_small_median")
> plot(g4reading_support_yearsmall_median,type = "b",ylim = c(700,735),ylab="score",xlab = "yearsmall",main = "g4reading_support_median")
(5)少人数クラスの人種間の学力差への影響
①算数について
1)幼稚園時のクラスタイプが標準の場合、白人の平均点は711.4、
マイノリティの平均点は698.5となり、その差は12.9である。
2)幼稚園時のクラスタイプが少人数の場合、白人の平均点は711.2、
マイノリティの平均点は698.2となり、その差は13である。
3)人種間の平均点の差の差は0.1しか違わないため、少人数クラスの
効果で人種間の学力差が縮まったと言えない。
②読解について
1)幼稚園時のクラスタイプが標準の場合、白人の平均点は725.1、
マイノリティの平均点は689.4となり、その差は35.7である。
2)幼稚園時のクラスタイプが少人数の場合、白人の平均点は727.8、
マイノリティの平均点は699.3となり、その差は28.5である。
3)人種間の平均点の差の差は7.2あるため、少人数クラスの効果により
人種間の学力差が多少縮まる可能性がある。
> star.normal <- star[star$kinder == "normal",]
> star.small <- star[star$kinder == "small",]
> star.normal$race.facter2 <- as.factor(star.normal$race.facter2)
> star.normal$race.facter2 <- NA
> star.normal$race.facter2[star.normal$race == 1] <- "white"
> star.normal$race.facter2[star.normal$race == 2 | star.normal$race == 4 ] <- "minority"
> star.normal$race.facter2[(star.normal$race != 1) & (star.normal$race != 2) & star.normal$race != 4] <- "others"
> star.normal$race.facter2 <- as.factor(star.normal$race.facter2)
> star.small$race.facter2 <- NA
> star.small$race.facter2[star.small$race == 1] <- "white"
> star.small$race.facter2[star.small$race == 2 | star.small$race == 4 ] <- "minority"
> star.small$race.facter2[(star.small$race != 1) & (star.small$race != 2) & star.small$race != 4] <- "others"
> star.small$race.facter2 <- as.factor(star.small$race.facter2)
> tapply(star.normal$g4math,star.normal$race.facter2,summary)
$minority
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
547.0 671.8 698.5 698.5 727.0 821.0 586
$others
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
694.0 701.5 713.5 713.0 725.0 731.0 6
$white
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
487.0 690.2 712.0 711.4 734.5 821.0 758
> tapply(star.small$g4math,star.small$race.facter2,summary)
$minority
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
545.0 678.0 696.0 698.2 726.0 821.0 480
$others
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
698 713 728 728 743 758 6
$white
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
487.0 689.0 713.0 711.2 739.0 821.0 673
> tapply(star.normal$g4reading,star.normal$race.facter2,summary)
$minority
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
528.0 671.5 695.5 689.4 721.0 836.0 586
$others
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
684.0 729.0 750.0 741.5 762.5 782.0 6
$white
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
528.0 699.0 726.0 725.1 750.0 836.0 764
> tapply(star.small$g4reading,star.small$race.facter2,summary)
$minority
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
528.0 674.0 699.5 699.3 731.0 836.0 481
$others
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
703.0 736.2 769.5 769.5 802.8 836.0 6
$white
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
528.0 701.0 729.0 727.8 756.0 836.0 686
(6)少人数クラスの長期的な学業(高校卒業率)への影響
<全人種対象の場合>
①幼稚園時のクラスタイプが標準の場合、高校卒業率は0.825。
一方で少人数の場合、0.836であり、その差は0.011程度。
②少人数クラスの在籍期間別では0年の場合、高校卒業率は0.828。
一方で4年間の場合、0.877であり、その差は0.05程度と大きい。
> tapply(star$hsgrad,star$kinder,mean,na.rm=TRUE)
normal small support
0.8251619 0.8359202 0.8392857
> tapply(star$hsgrad,star$yearssmall,mean,na.rm=TRUE)
0 1 2 3 4
0.8286020 0.7910448 0.8131868 0.8324607 0.8775510
<人種別に影響を見た場合>
①幼稚園時のクラスタイプが標準の場合、白人の高校卒業率は0.856、
一方マイノリティは0.739であり、その差は0.117になる
②クラスタイプが少人数の場合、白人の高校卒業率は0.867、一方で
マイノリティは0.744であり、その差は0.123になる。
③クラスタイプ別の人種間の高校卒業率の差の差は0.006 のため、
殆ど差が無いと思われる。
> tapply(star.normal$hsgrad,star.normal$race.facter2,mean,na.rm = TRUE)
minority others white
0.7395833 0.6666667 0.8569620
> tapply(star.small$hsgrad,star.small$race.facter2,mean,na.rm = TRUE)
minority others white
0.7446809 1.0000000 0.8674699
3.練習問題を解いた感想
・観察対象を問題意識に応じて部分集合化して、シンプルな記述統計で仮説を検証していく過程は面白い。
・相変わらず、tapply関数と可視化に頼っている。大学生の頃はRでグラフを作成することが殆どなかったので、なかなか作り方が身につかなかった。
・練習問題を解きつつ、自分からグラフ化した方がわかりやすいな、どのグラフを使おうかなと考えながら試行錯誤した方が当たり前だけど使い方が身に付くのでよかった。もっと見やすいグラフの作り方を学びたい。
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?