Okul ortamının maliyeti olan girdiler ve okulların ürettiği çıktının ise öğrenci öğrenimidir.

Eğitim üretimi araştırmalarında önemli bir soru, maliyetlerine karşılık olarak hangi girdilerin en fazla öğrenmeyi sağladığıdır. Sınıf büyüklüğü, daha fazla öğretmen işe alarak sadece daha küçük sınıfların elde edilebileceği için en pahalı girdilerden biridir. Bu nedenle, daha küçük sınıfların masrafının başarıda bir getirisi olup olmadığını bilmek önemlidir.

STAR deneyi, bu soruya cevap vermek için tasarlanmıştır.

Geleneksel olmayan verilerden eğitim üretimi üzerine yapılan birçok çalışma, sınıf büyüklüğü ile öğrenci öğrenimi arasında zayıf veya hiçbir bağlantı olmadığını göstermektedir. Bu nedenle, okul sistemleri daha az öğretmen işe alarak maliyet tasarrufu yapabilirler ve başarıda bir azalma olmaz. Ancak, zayıf öğrenciler genellikle bilinçli bir şekilde daha küçük sınıflara gruplandırıldığı için sınıf büyüklüğü ile öğrenci başarısı arasındaki gözlemlenen ilişkiye yüzde yüz güvenilmemelidir. Randomize bir deney, farklı büyüklükteki sınıflara atanmış öğrencilerin aynı özelliklere sahip olduğunu sağlayarak bu sorunu ortadan kaldırır.

library(sandwich)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.1     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

Stata veri setini R’a yüklemek için haven paketini indirdik Daha sonra haven paketini library fonksiyonu yardımıyla çalıştırdık.

library(haven)

Veri seti Kruger (1999)’den indirilmiştir.

webstar <- read_dta("C:/Users/User1/Downloads/webstar.dta")

Veri setini indirdikten sonra veri setinin ilk 6 satrını görebilmek için head fonksiyonu kullanılmıştır.

head(webstar)
## # A tibble: 6 × 53
##   newid ssex    srace   sbirthq sbirthy stark   star1   star2   star3   cltypek 
##   <dbl> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+lb>
## 1 1122  2 [fem… 2 [bla… 3 [3rd… 1979    2 [no]  2 [no]  2 [no]  1 [yes] NA      
## 2 1137  2 [fem… 1 [whi… 1 [1st… 1980    1 [yes] 1 [yes] 1 [yes] 1 [yes]  1 [sma…
## 3 1143  2 [fem… 2 [bla… 4 [4th… 1979    1 [yes] 1 [yes] 1 [yes] 1 [yes]  1 [sma…
## 4 1160  1 [mal… 1 [whi… 4 [4th… 1979    2 [no]  2 [no]  2 [no]  1 [yes] NA      
## 5 1183  1 [mal… 2 [bla… 1 [1st… 1980    1 [yes] 2 [no]  2 [no]  2 [no]   3 [reg…
## 6 1195  1 [mal… 1 [whi… 3 [3rd… 1979    2 [no]  2 [no]  1 [yes] 1 [yes] NA      
## # ℹ 43 more variables: cltype1 <dbl+lbl>, cltype2 <dbl+lbl>, cltype3 <dbl+lbl>,
## #   schtypek <dbl+lbl>, hdegk <dbl+lbl>, cladk <dbl+lbl>, totexpk <dbl+lbl>,
## #   tracek <dbl+lbl>, treadssk <dbl>, tmathssk <dbl>, sesk <dbl+lbl>,
## #   schtype1 <dbl+lbl>, trace1 <dbl+lbl>, hdeg1 <dbl+lbl>, clad1 <dbl+lbl>,
## #   totexp1 <dbl+lbl>, treadss1 <dbl>, tmathss1 <dbl>, ses1 <dbl+lbl>,
## #   schtype2 <dbl+lbl>, trace2 <dbl+lbl>, hdeg2 <dbl+lbl>, clad2 <dbl+lbl>,
## #   totexp2 <dbl+lbl>, treadss2 <dbl>, tmathss2 <dbl>, ses2 <dbl+lbl>, …

Webstar veri setinin içindeki cltypek, cltype1, cltype2, cltype3 sırasıyla anaokulu, 1. sınıf, 2. sınıf ve 3. sınıf için sınıf tipini gösteren faktörlerden oluşuyor: normal (regular class), küçük (small class) veya yardımcılı normal (regular + aide class). Değişkenlerde boş satır (NA), hiçbir STAR sınıfına katılmadığını gösteriyor.

head(webstar[,c("cltypek", "cltype1", "cltype2", "cltype3")])
## # A tibble: 6 × 4
##   cltypek                   cltype1          cltype2                   cltype3  
##   <dbl+lbl>                 <dbl+lbl>        <dbl+lbl>                 <dbl+lbl>
## 1 NA                        NA               NA                         2 [regu…
## 2  1 [small class]           1 [small class]  1 [small class]           1 [smal…
## 3  1 [small class]           1 [small class]  3 [regular + aide class]  3 [regu…
## 4 NA                        NA               NA                         1 [smal…
## 5  3 [regular + aide class] NA               NA                        NA       
## 6 NA                        NA                2 [regular class]         2 [regu…

Webstar veri setinin içindeki cltypek, cltype1, cltype2, cltype3 sırasıyla anaokulu, 1. sınıf, 2. sınıf ve 3. sınıf için sınıf tipini gösteren faktörlerden oluşuyor: normal (regular class), küçük (small class) veya yardımcılı normal (regular + aide class). Değişkenlerde boş satır (NA), hiçbir STAR sınıfına katılmadığını gösteriyor.

Veri setinde yer alan NA değişkenleri sorununu çözmek adına aşağıdaki işlemi uygulaya biliriz.

webstar verisetinde bulunan cltypek treadssk (total reading scaled score) değişkenlerine değişikler yapılmalı. cltypek değişkeninin açıklamarı:

label cltypek 1 small class 2 regular class 3 regular + aide class

stark (attend project star class in kindergarten) değişkeni açıklamaları.

label stark

1 yes 2 no 3 missing + aide class

Daha sonra veri setimize ait değişkenlerin son altı satrını görmek için tail fonksiyonu kullanılmıştır.

tail(webstar)
## # A tibble: 6 × 53
##   newid     ssex       srace     sbirthq sbirthy stark   star1   star2   star3  
##   <dbl+lbl> <dbl+lbl>  <dbl+lbl> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l>
## 1 186634    1 [male]   1 [white] 3 [3rd… 1980    1 [yes] 1 [yes] 1 [yes] 1 [yes]
## 2 186650    1 [male]   1 [white] 3 [3rd… 1979    1 [yes] 1 [yes] 1 [yes] 1 [yes]
## 3 186665    2 [female] 1 [white] 3 [3rd… 1980    1 [yes] 1 [yes] 1 [yes] 1 [yes]
## 4 186687    1 [male]   1 [white] 1 [1st… 1980    2 [no]  1 [yes] 1 [yes] 1 [yes]
## 5 186705    2 [female] 2 [black] 1 [1st… 1980    1 [yes] 1 [yes] 1 [yes] 1 [yes]
## 6 186718    1 [male]   2 [black] 2 [2nd… 1980    1 [yes] 1 [yes] 1 [yes] 1 [yes]
## # ℹ 44 more variables: cltypek <dbl+lbl>, cltype1 <dbl+lbl>, cltype2 <dbl+lbl>,
## #   cltype3 <dbl+lbl>, schtypek <dbl+lbl>, hdegk <dbl+lbl>, cladk <dbl+lbl>,
## #   totexpk <dbl+lbl>, tracek <dbl+lbl>, treadssk <dbl>, tmathssk <dbl>,
## #   sesk <dbl+lbl>, schtype1 <dbl+lbl>, trace1 <dbl+lbl>, hdeg1 <dbl+lbl>,
## #   clad1 <dbl+lbl>, totexp1 <dbl+lbl>, treadss1 <dbl>, tmathss1 <dbl>,
## #   ses1 <dbl+lbl>, schtype2 <dbl+lbl>, trace2 <dbl+lbl>, hdeg2 <dbl+lbl>,
## #   clad2 <dbl+lbl>, totexp2 <dbl+lbl>, treadss2 <dbl>, tmathss2 <dbl>, …

Bir sorunumuzda verisetimiz, havenly labelled yani stata veriseti üzerinden R’a yüklenmiş ve açıklamaları ona uygun yazılmış. Olası hatalardan kurtulmak için bu labelları kaldırmamız gerekir.

labelled paketi yüklendikten sonra library fonksiyonu yardımıyla çalıştırılır.

library(labelled)
webstar <- unlabelled(webstar)

Daha sonra veritabanımızı oluşturmak için data.frame fonksiyonu kullanabiliriz.

webstar <- data.frame(webstar)

Artık aynı kodu tekrarlarsak faktörlerin açıklamalı yazıldığını görebiliriz.

Daha sonra faktörlerin açıklamalı yazdığını göre bilmemiz için head fonksiyonunu kullanarak tekrardan veri setinin ilk altı fonksiyonunu görebiliriz.

head(webstar[,c("cltypek", "cltype1", "cltype2", "cltype3")])
##                cltypek     cltype1              cltype2              cltype3
## 1                 <NA>        <NA>                 <NA>        regular class
## 2          small class small class          small class          small class
## 3          small class small class regular + aide class regular + aide class
## 4                 <NA>        <NA>                 <NA>          small class
## 5 regular + aide class        <NA>                 <NA>                 <NA>
## 6                 <NA>        <NA>        regular class        regular class

Tabloda, Attrition rate (katılımcı kaybı)’nı ölçebilmek için anaokulu sınıfında bir sınıf tipine kayıtlı olan herhangi bir katılımcının diğer üç sınıfa geçtiğinde herhangi bir sınıf tipinde boş bırakılıp bırakılmadığı sorusuna cevap verebilmemizi gerektiriyor. Bu yüzden attr diye bir değişken hesaplayacağız. Bu değişken veri setine bakıp eğer cltypek sütununda bulunan öğrenci herhangi bir sınıf tipine atanmışsa, diğer üç sınıfta da başka ya da aynı belirli bir sınıf türüne atanıp atanmadığına bakacak ve bu üç sınıftan herhangi birinde bir sınıf tipi atanmamışsa attr evet (TRUE) değilse FALSE olacak şekilde yazılacak. Eğer anaokulunda satır boşsa (NA), bu durumda attr boş bırakılacak.

Yukarıda bahsettiğimiz gibi veri setimize yeni değişken eklenmesi gerekmektedir. Bunun için mutate fonksiyonu kullanılmıştır.

webstar <- webstar %>%
  mutate(Attrition = if_else(cltypek %in% c('small class', 'regular class', 'regular + aide class'),
                          is.na(cltype1) | is.na(cltype2) | is.na(cltype3),
                          NA))

Ardından tekrar değişkenlere ait veri setine değişken eklendikten sonraki ilk altı satrını kontrol edebilmek adına head fonksyionu kullanılmıştır.

head(webstar[,c("Attrition", "cltypek", "cltype1", "cltype2", "cltype3")])
##   Attrition              cltypek     cltype1              cltype2
## 1        NA                 <NA>        <NA>                 <NA>
## 2     FALSE          small class small class          small class
## 3     FALSE          small class small class regular + aide class
## 4        NA                 <NA>        <NA>                 <NA>
## 5      TRUE regular + aide class        <NA>                 <NA>
## 6        NA                 <NA>        <NA>        regular class
##                cltype3
## 1        regular class
## 2          small class
## 3 regular + aide class
## 4          small class
## 5                 <NA>
## 6        regular class

Bu değişken ile attrition rate hesaplanabilir. Yapmamız gereken, anaokulunda sınıf tiplerine göre verisetimizi gruplandırmak ve kaç tanesinde TRUE olduğunu hesaplamak ve o gruptaki toplam gözlem sayısını bölmek. Böylece anaokulunda bir sınıf tipine atanmış öğrencilerden yüzde kaçı deney süresince kayboluyor öğrenmiş olabiliriz.

pivot_wider: Verileri genişletir, sütun sayısını artırır ve satır sayısını azaltır. summarise: Yeni bir veri çerçevesi oluşturur

webstar %>%
  group_by(cltypek) %>%
  summarise(Attrition_rate = mean(Attrition, na.rm = TRUE)) %>%
  select(cltypek, Attrition_rate) %>% drop_na() %>%
  pivot_wider(names_from = cltypek, values_from = Attrition_rate)
## # A tibble: 1 × 3
##   `small class` `regular class` `regular + aide class`
##           <dbl>           <dbl>                  <dbl>
## 1         0.487           0.518                  0.528

Tabloda attrition rate dışında, son harfi k, 1, 2 ve 3 sınıf seviyelerine ayrılmış olan, ses (öğrencinin ücretsiz öğle yemeğine hak kazanıp kazanmadığını gösteren faktör, Free Lunch) ve tmathss, treadss (matematik ve okuma için toplam Stanford Achievement Tests sonuçları), ve seviyelere ayrılamayacak olan srace (“white” (beyaz), “black” (Afrikalı-Amerikalı), “asian” (Asyalı), “hispanic” (İspanyol), “am. indian” (Amerikan-Hintli) veya “other” (diğer) düzeyleriyle öğrencinin etnik kökenini gösteren faktör), sbirthy (öğrencinin doğum yılı) gibi değişkenlerle hazırlanmış olan başka satırlar da var.

Bu satırlar Free Lunch (her bir sınıfta ücretsiz öğle yemeği alan öğrencilerin oranı), White/Asian (Sınıfta bulunan beyaz ve asyalı öğrencilerin toplamının oranı), Age in 1985 (Anaokulu sınıf seviyesinde bulunan öğrencilerin 1985 yılındaki yaş ortalamaları), Attrition rate (üçüncü sınıfı tamamlamadan önce takipte kaybedilen oranı), Class size in kindergarten (anaokulu sınıf seviyesinde sınıf sınıf büyüklükleri), Percentile score in kindergarten (üç Stanford Başarı Testindeki ortalama yüzdelik puan)’ları üç farklı sınıf tipine (cltype) göre gösteriyor ve son sütunda üç grubun tamamında değişken ortalamalarının eşitlik F testi için P değerini gösteriyor (P-value for equality across groups).

Söz konusu değişkenler için tablo oluşturulursa

webstar <- webstar %>%
  mutate(Free_Lunch = case_when(sesk == "free lunch" ~ 1, 
                                sesk == "non-free lunch" ~ 0))
webstar <- webstar %>%
  mutate(White_Asian = case_when(srace == "white" | srace == "asian"  ~ 1, 
                                srace == "black"  | srace == "hispanic" | srace == "am. indian" | srace == "other" ~ 0))
webstar <- webstar %>%
  mutate(Age_in_1985 =  1985 - sbirthy)
webstar <- webstar %>%
  mutate(Average_Test_score_in_k =  (tmathssk + treadssk)/2)

Yukarıdaki işlemleri uyguladıktan sonra değişkenlerin tümünün ilk altı satrını görebilmemiz için head fonksiyonu kullandık.

head(webstar[,c("sesk", "Free_Lunch", "srace", "White_Asian", "sbirthy", "Age_in_1985", "tmathssk", "treadssk", "Average_Test_score_in_k")])
##             sesk Free_Lunch srace White_Asian sbirthy Age_in_1985 tmathssk
## 1           <NA>         NA black           0    1979           6       NA
## 2 non-free lunch          0 white           1    1980           5      473
## 3 non-free lunch          0 black           0    1979           6      536
## 4           <NA>         NA white           1    1979           6       NA
## 5     free lunch          1 black           0    1980           5      463
## 6           <NA>         NA white           1    1979           6       NA
##   treadssk Average_Test_score_in_k
## 1       NA                      NA
## 2      447                     460
## 3      450                     493
## 4       NA                      NA
## 5      439                     451
## 6       NA                      NA
A <- webstar %>%
  group_by(cltypek) %>%
  summarise(
    across(
      .cols = c(
        Free_Lunch, White_Asian, 
        Age_in_1985, Attrition, 
        Average_Test_score_in_k
        ),
      .fns = c(
       kindergarten = \(x) mean(x, na.rm = TRUE)
      ))) %>% drop_na() 
A<- as.data.frame(t(A))
names(A) <- A[1,]
A <- A[-1,]
A <- mutate_all(A, function(x) as.numeric(as.character(x)))

Tabloyu daha düzenli sunabilmemiz için kableExtra paketini yüklenmiştir.

library(kableExtra)
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
A %>% kbl(digits = 2) %>%
  kable_classic_2(full_width = F)
small class regular class regular + aide class
Free_Lunch_kindergarten 0.47 0.48 0.50
White_Asian_kindergarten 0.68 0.68 0.66
Age_in_1985_kindergarten 5.26 5.24 5.24
Attrition_kindergarten 0.49 0.52 0.53
Average_Test_score_in_k_kindergarten 465.97 459.02 459.18

Verilen p değerleri one-way ANOVA testi ile bulunabilir. One-way ANOVA testi ya da tek yönlü varyans analizi, bağımsız grupların ortalamaları arasında istatistiksel olarak anlamlı fark olup olmadığının test edilmesinde kullanılan bir araçtır.

One-way ANOVA testinin hipotezi, gruplar arasındaki ortalamalar aynıdır olarak özetlenebilir. Verilen P değeri ne kadar büyükse bu üç grup ortalamasının istatistiksel olarak o kadar aynı olduğu varsayımını reddetmeyi beceremiyoruz anlamı çıkar.

K <- webstar %>% drop_na(c(cltypek,Average_Test_score_in_k)) %>% select(cltypek,Average_Test_score_in_k)
ggplot(K, aes(x = cltypek, y = Average_Test_score_in_k, fill = cltypek)) +
    geom_boxplot() +
    theme_classic()

ATS <- aov(Average_Test_score_in_k ~ cltypek, data= K)
summary(ATS)
##               Df  Sum Sq Mean Sq F value  Pr(>F)    
## cltypek        2   57418   28709   21.26 6.3e-10 ***
## Residuals   5783 7808100    1350                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Sınav ortalamaları için, p değeri çok düşük çıktı. Burdan ortalamaların aynı olduğu hipotezini reddetmek için güçlü bir kanıtımız olduğu ortaya çıkar.

Diğer özellikler için ANOVA p değerlerini bulun.

FK <- webstar %>% drop_na(c(cltypek,Free_Lunch)) %>% select(cltypek,Free_Lunch)
FL <- aov(Free_Lunch ~ cltypek, data = FK)
summary(FL)
##               Df Sum Sq Mean Sq F value Pr(>F)  
## cltypek        2    1.2  0.5978   2.394 0.0913 .
## Residuals   6298 1572.5  0.2497                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
WAK <- webstar %>% drop_na(c(cltypek,White_Asian)) %>% select(cltypek,White_Asian)
WA <- aov(White_Asian ~ cltypek, data = WAK)
summary(WA)
##               Df Sum Sq Mean Sq F value Pr(>F)
## cltypek        2    0.6  0.3044   1.381  0.251
## Residuals   6319 1393.0  0.2205
A85K <- webstar %>% drop_na(c(cltypek,Age_in_1985))  %>% select(cltypek,Age_in_1985)
A85 <- aov(Age_in_1985 ~ cltypek, data = A85K)
summary(A85)
##               Df Sum Sq Mean Sq F value Pr(>F)
## cltypek        2    0.3  0.1595   0.797  0.451
## Residuals   6314 1263.8  0.2002
ATTK <- webstar %>% drop_na(c(cltypek,Attrition))  %>% select(cltypek,Attrition)
ATT <- aov(Attrition ~ cltypek, data = ATTK)
summary(ATT)
##               Df Sum Sq Mean Sq F value Pr(>F)  
## cltypek        2    1.9  0.9400   3.765 0.0232 *
## Residuals   6322 1578.4  0.2497                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1