# TIMSS2011のデータで遊んでみる(4)

いよいよ分析

理科学校平均,標準偏差,ランク別割合データとの結合

使うデータの読み込み

data <- read.csv("data.csv")
class.rika <- read.csv("class.rika.csv")

# リンクファイルの読み込み
astjpnm5 <- read.csv("astjpnm5.csv")

# リンクファイルの加工
id.table.u <- astjpnm5[c("IDCLASS","IDTEACH")]
id.table.u <- unique(id.table.u)
colnames(id.table.u) <- c("idclass","idteach")

# 学校学級データとリンクファイルの結合
data.d <- data[,c(-1)]
data.link <- merge(data.d, id.table.u, by="idteach")

class.rika.d <- class.rika[,c(-1)]
timss <- merge(data.link, class.rika.d, by="idclass")
timss <- timss[,c(-12)]

# 欠損値の処理
timss$ses.hi[timss$ses.hi==9] <- NA
timss$ses.lo[timss$ses.lo==9] <- NA
timss$jap.moth.tg[timss$jap.moth.tg==9] <- NA
timss$jap.konnan[timss$jap.konnan==999] <- NA

# 念のため保存
write.csv(timss,"timss.csv")

head(timss)
##   idclass idteach idschool sc.n.pupil gr.n.pupil ses.lo ses.hi jap.moth.tg
## 1     104     101        1       1059        189      2     NA           1
## 2     204     201        2        957        158      2      2           1
## 3     305     301        3        847        142      1      4           1
## 4     401     401        4        845        141      1      4           1
## 5     501     501        5        724        137      3      1           1
## 6     601     601        6        788        132      1      1           1
##   jinko chiiki shotoku keiken t.kyodo.1 t.kyodo.2 t.kyodo.3 t.kyodo.4
## 1     2      1       2      3         3         3         2         2
## 2     1      1       2      5         4         3         3         2
## 3     1      1       1     18         2         3         3         1
## 4     1      1       1      3         3         3         2         1
## 5     1      1       3     28         2         2         4         1
## 6     1      1       2     19         3         3         3         2
##   t.kyodo.5 cl.n.pupil uchi.4nen jap.konnan tch.sbj.koku tch.sbj.san
## 1         2         37        37         NA            1           1
## 2         1         32        32         NA            1           1
## 3         2         30        30         NA            1           1
## 4         2         35        35         NA            1           1
## 5         2         33        33         NA            1           1
## 6         2         33        33         NA            1           1
##   tch.sbj.rika gr.n.cl cs.kijun rika.mean  rika.sd        lv1        lv2
## 1            1       5       40  569.8817 53.97667 0.00000000 0.02702703
## 2            1       5       35  564.3780 54.67014 0.00000000 0.03225806
## 3            1       5       35  576.2101 61.08431 0.00000000 0.03571429
## 4            1       4       40  597.7882 55.92306 0.00000000 0.02857143
## 5            1       4       40  547.6221 77.69665 0.06060606 0.09090909
## 6            1       4       40  566.7242 71.60676 0.03571429 0.03571429
##         lv3       lv4       lv5   lo.prop
## 1 0.3513514 0.4594595 0.1621622 0.3783784
## 2 0.2903226 0.5483871 0.1290323 0.3225806
## 3 0.3571429 0.3214286 0.2857143 0.3928571
## 4 0.1142857 0.5142857 0.3428571 0.1428571
## 5 0.2727273 0.4545455 0.1212121 0.4242424
## 6 0.1785714 0.6071429 0.1428571 0.2500000

あれこれやってみよう

まずは学級規模と理科得点の学校平均の関係

plot(timss$cl.n.pupil, timss$rika.mean)

cor(timss$cl.n.pupil, timss$rika.mean)
## [1] 0.1688964
  • 特に関係なし

では,学級規模と理科得点の標準偏差の関係ならどうかな

plot(timss$cl.n.pupil, timss$rika.sd)

cor(timss$cl.n.pupil, timss$rika.sd)
## [1] 0.01940805
  • もっと関係なし・・・(>_<)

やはりSESがきいているんか?

plot(timss$ses.hi, timss$rika.mean)

cor(timss$ses.hi, timss$rika.mean, use="pairwise")
## [1] 0.2895114
plot(timss$ses.lo, timss$rika.mean)

cor(timss$ses.lo, timss$rika.mean, use="pairwise")
## [1] -0.2587414
plot(timss$shotoku, timss$rika.mean)

cor(timss$shotoku, timss$rika.mean)
## [1] -0.351869
  • どうやら平均所得で層別に分析した方が良さそうですね。

ということは,日本語母語児童の少ない学校とかは除外する必要がありますね。

table(timss$jap.moth.tg)
## 
##   1   2 
## 125   1
  • 一校だけ日本語以外の母語の児童が25%以上の学校を発見
  • 分析データから削除しよう。
timss <- subset(timss, jap.moth.tg==1)
nrow(timss)
## [1] 125

学校の平均所得階層別に分析しよう

サブセットを作るよ

timss.ses.hi <- subset(timss, shotoku==1)
timss.ses.mid <- subset(timss, shotoku==2)
timss.ses.lo <- subset(timss, shotoku==3)

nrow(timss.ses.hi)
## [1] 11
nrow(timss.ses.mid)
## [1] 97
nrow(timss.ses.lo)
## [1] 17

ses.hi

plot(timss.ses.hi$cl.n.pupil, timss.ses.hi$rika.mean)

cor(timss.ses.hi$cl.n.pupil, timss.ses.hi$rika.mean)
## [1] -0.5860547
plot(timss.ses.hi$cl.n.pupil, timss.ses.hi$rika.sd)

cor(timss.ses.hi$cl.n.pupil, timss.ses.hi$rika.sd)
## [1] -0.328518
plot(timss.ses.hi$cl.n.pupil, timss.ses.hi$lo.prop)

cor(timss.ses.hi$cl.n.pupil, timss.ses.hi$lo.prop)
## [1] 0.3532275

ses.mid

plot(timss.ses.mid$cl.n.pupil, timss.ses.mid$rika.mean)

cor(timss.ses.mid$cl.n.pupil, timss.ses.mid$rika.mean)
## [1] 0.1869622
plot(timss.ses.mid$cl.n.pupil, timss.ses.mid$rika.sd)

cor(timss.ses.mid$cl.n.pupil, timss.ses.mid$rika.sd)
## [1] 0.03146559
plot(timss.ses.mid$cl.n.pupil, timss.ses.mid$lo.prop)

cor(timss.ses.mid$cl.n.pupil, timss.ses.mid$lo.prop)
## [1] -0.2178488

ses.lo

plot(timss.ses.lo$cl.n.pupil, timss.ses.lo$rika.mean)

cor(timss.ses.lo$cl.n.pupil, timss.ses.lo$rika.mean)
## [1] 0.5028253
plot(timss.ses.lo$cl.n.pupil, timss.ses.lo$rika.sd)

cor(timss.ses.lo$cl.n.pupil, timss.ses.lo$rika.sd)
## [1] 0.168337
plot(timss.ses.lo$cl.n.pupil, timss.ses.lo$lo.prop)

cor(timss.ses.lo$cl.n.pupil, timss.ses.lo$lo.prop)
## [1] -0.5467852
  • まぁ,そんなもんだろう。
  • それにしても学級規模が大きいほど下位層が少ないって出てるよ・・・

地域類型で見たらどうなんだろう?

tapply(timss$rika.mean, timss$chiiki, mean)
##        1        2        3        4 
## 566.6555 563.6579 559.1527 547.5105
  • 町の規模が小さくなるほど点数が低くなる傾向があるんですね。

内訳は?

table(timss$chiiki)
## 
##  1  2  3  4 
## 22 24 64 15
  • さらなる層化をしてみるか・・・
table(timss$chiiki,timss$shotoku)
##    
##      1  2  3
##   1  4 14  4
##   2  2 21  1
##   3  5 50  9
##   4  0 12  3
  • 地域類型別に平均所得中くらいを取り出してみようかな。
  • ここで正気に戻る。

学級規模と学年学級数とでカテゴリ分けしてみよう

切り口を決めよう

table(timss$gr.n.cl,timss$cl.n.pupil)
##    
##     21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
##   1  1  0  0  3  0  0  0  0  1  0  1  0  0  0  0  0  2  1  2  0
##   2  3  2  1  1  1  1  5  1  2  1  4  1  4  1  3  1  2  2  0  2
##   3  0  0  0  0  0  2  3  2  1  4  2  7  4  5  2  0  4  5  1  0
##   4  0  0  0  0  0  0  0  0  2  1  3  4  4  3  3  0  1  1  0  1
##   5  0  0  0  1  0  0  0  0  0  2  1  2  2  0  0  0  2  0  0  0
##   6  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0
  • 学級規模を32以下と32以上で,学年学級数を3以下と4以上で分けると良さそうだ。
  • エクセルでデータ作った
timss2 <- read.csv("timss2.csv")
  • とはいえ,所得は無視できないから,クロス集計してみる。
table(timss2$shotoku,timss2$cat.csns)
##    
##     11 12 21 22
##   1  1  2  5  4
##   2 41 15 30 12
##   3  8  0  8  1
  • 小少で低所得,大多で高所得という関係がありそうで。 #### 単学級サンプルは抜いた方がよさそうなので。
timss2.1 <- subset(timss2, gr.n.cl>1)

少人数学級実施校は抜いた方がよさそうなので。

timss2.1 <- subset(timss2.1, cs.kijun>35)
table(timss2.1$cs.kijun)
## 
##  40 
## 106

小さな町村は学力が低い傾向にあるので除外。

timss2.2 <- subset(timss2.1, chiiki==3)

平均所得は中くらいの学校に限定

tim <- subset(timss2, shotoku==2)
table(tim$shotoku)
## 
##  2 
## 98

バランスはどうなっているかな

table(tim$cat.csns)
## 
## 11 12 21 22 
## 41 15 30 12
  • 悪くはなさそうです。

得点の平均の比較

tapply(tim$rika.mean, tim$cat.csns, mean)
##       11       12       21       22 
## 556.4677 561.3257 559.0337 566.0654

得点の標準偏差の比較

tapply(tim$rika.sd, tim$cat.csns, mean)
##       11       12       21       22 
## 61.04954 58.45276 63.84131 56.93858

下位層の割合の比較

tapply(tim$lo.prop, tim$cat.csns, mean)
##        11        12        21        22 
## 0.4208365 0.4084519 0.4071225 0.3559835
  • 過去の学力データがあると違うのだが・・・
  • ちょっとした演習用には悪くないデータかもしれない