Bu ödevde, TIMSS 2015 uygulamasına ait bir kitapçığın Türkiye ve Amerika verilerini kullanacaksınız.

a) Veri seti adı: “TRUSA.RDS”. Bu veri setini R ortamına aktarınız.

veri_seti <- readRDS("TRUSA.RDS")
veri_seti <- expss::drop_var_labs(veri_seti)

b) Veri setinde eksik veri olup olmadığını kontrol ediniz.

library(naniar)
any_na(veri_seti)
## [1] FALSE

c) Kitapçıktaki 35 maddenin toplamını hesaplayarak veri setine yeni bir sütun olarak ekleyiniz.

library(dplyr)
veri_seti <- veri_seti %>%
  mutate(toplam = rowSums(select(., -c(IDSTUD, IDBOOK, CNT))))

head(veri_seti)

d) Toplam puanın her iki ülkeye göre betimsel istatistiklerini hesaplayınız.

betimsel <- veri_seti %>%
  group_by(CNT) %>%
  summarise(
    N = n(),
    Ortalama = mean(toplam),
    Medyan = median(toplam),
    Sd = sd(toplam),
    Min = min(toplam),
    Max = max(toplam)) %>% 
  ungroup()
knitr::kable(betimsel,
             digits = 2,
             caption = "Ülkelere Göre Toplam Puanın Betimsel İstatistikleri")
Table 1: Ülkelere Göre Toplam Puanın Betimsel İstatistikleri
CNT N Ortalama Medyan Sd Min Max
TUR 435 13.45 11 7.57 2 32
USA 716 17.05 17 7.53 1 34

e) Toplam puanın, Türkiye ve ABD örneklemlerinde farklılaşıp farklılaşmadığını t testi ile test ediniz.

veri_seti <- veri_seti %>% mutate(CNT = recode(CNT, "TUR" = 1, "USA" = 2))

turkiye_toplam <- veri_seti %>% 
    filter(CNT==1) %>% 
    select(toplam)
abd_toplam <- veri_seti %>% 
    filter(CNT==2) %>% 
    select(toplam)

t_testi <- t.test(turkiye_toplam,abd_toplam)
t_testi
## 
##  Welch Two Sample t-test
## 
## data:  turkiye_toplam and abd_toplam
## t = -7.8242, df = 912.31, p-value = 1.41e-14
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -4.494510 -2.691921
## sample estimates:
## mean of x mean of y 
##  13.45287  17.04609
t_testi_sonuc <- data.frame(
  "t" = t_testi$statistic,
  "sd" = t_testi$parameter,
  "p" = t_testi$p.value,
  "Turkiye ortalama" = t_testi$estimate[1],
  "ABD ortalama" = t_testi$estimate[2],
  "Ortalama Fark" = diff(t_testi$estimate),
  "Lower" = t_testi$conf.int[1],
  "Upper" = t_testi$conf.int[2])

knitr::kable(t_testi_sonuc, digits = 2)
t sd p Turkiye.ortalama ABD.ortalama Ortalama.Fark Lower Upper
t -7.82 912.31 0 13.45 17.05 3.59 -4.49 -2.69

f) Veri setinde %5, %10 ve %15 oranında eksik veriler oluşturunuz.

Veri setindeki öğrenci id(1), kitapçık id(2), CNT(38) ve toplam(39) sütunlarını silerek yeni bir veri seti oluşturdum.

veri_yeni<-veri_seti[,-c(1,2,38,39)]

Oluşturduğum bu yeni veri setiyle %5, %10 ve %15 eksik veriler oluşturdum. Bunun için missForest paketini aktive etmem gerekti.

library(missForest)
eksik_5  <- prodNA(veri_yeni, noNA = 0.05)
eksik_10 <- prodNA(veri_yeni, noNA = 0.10)
eksik_15 <- prodNA(veri_yeni, noNA = 0.15)

eksik veriler oluşturduğum bu yeni veri setlerini daha önce kaldırdığım sütunlarla tekrar birleştirdim.

eksik_5<- cbind(veri_seti[,c(1,2,38,39)],eksik_5)
eksik_10<- cbind(veri_seti[,c(1,2,38,39)],eksik_10)
eksik_15<- cbind(veri_seti[,c(1,2,38,39)],eksik_15)

Oluşturduğum veri setlerindeki eksik veri sayılarını bulmak için şu adımları takip ettim:

eksik_veri_sayisi <- function(data) sum(!is.na(data))

eksik_veri <- data.frame(
  Veriler = c("Tam", "%5 Eksik", "%10 Eksik", "%15 Eksik"),
  Toplam_veri = c(eksik_veri_sayisi(veri_yeni), 
             eksik_veri_sayisi(eksik_5), 
             eksik_veri_sayisi(eksik_10), 
             eksik_veri_sayisi(eksik_15)),
  Eksik_veri = c(sum(is.na(veri_yeni)), 
                        sum(is.na(eksik_5)), 
                        sum(is.na(eksik_10)), 
                        sum(is.na(eksik_15)))
)

knitr::kable(eksik_veri, digits = 0, caption = "Eksik Veriler")
Table 2: Eksik Veriler
Veriler Toplam_veri Eksik_veri
Tam 40285 0
%5 Eksik 42875 2014
%10 Eksik 40861 4028
%15 Eksik 38847 6042

g) Oluşturulan eksik veri setlerinde önce eksik verinin rasgele olup olmadığını test ediniz. Ardından, liste bazında silme yöntemiyle eksik verileri temizleyerek e seçeneğinde gerçekleştirdiğiniz t testini tekrarlayınız. Tam veri ile elde edilen sonuçlarla karşılaştırınız.

MCAR testi

# yalnuzca maddeleri seçmeliyiz
mcar5 <- mcar_test(select(eksik_5, starts_with("M0")))
mcar10 <- mcar_test(select(eksik_10, starts_with("M0")))
mcar15 <- mcar_test(select(eksik_15, starts_with("M0")))
bind_rows(
print(mcar5),
print(mcar10),
print(mcar15))
## # A tibble: 1 × 4
##   statistic    df p.value missing.patterns
##       <dbl> <dbl>   <dbl>            <int>
## 1     1528. 18462       1              573
## # A tibble: 1 × 4
##   statistic    df p.value missing.patterns
##       <dbl> <dbl>   <dbl>            <int>
## 1     4013. 31382       1             1008
## # A tibble: 1 × 4
##   statistic    df p.value missing.patterns
##       <dbl> <dbl>   <dbl>            <int>
## 1     8916. 33769       1             1138

%5, %10 ve %15 eksik veri durumlarında p-değeri 1 olarak hesaplandı. Bu durumda eksik verilerin rastgele dağıldığı kabul edilebilir.

liste bazında silme

eksik_5temiz <- na.omit(eksik_5)
eksik_10temiz <- na.omit(eksik_10)
eksik_15temiz <- na.omit(eksik_15)
son_durum <- data.frame(
  Veriler = c("Tam Veri", "%5 Eksik Veri Temizlenmiş", "%10 Eksik Veri Temizlenmiş", "%15 Eksik Veri Temizlenmiş"),
  Gozlem_Sayisi = c(nrow(veri_yeni), nrow(eksik_5temiz), nrow(eksik_10temiz), nrow(eksik_15temiz)))

knitr::kable(son_durum, digits = 0, caption = "Eksik Veri Temizlendikten Sonra Gözlem Sayıları")
Table 3: Eksik Veri Temizlendikten Sonra Gözlem Sayıları
Veriler Gozlem_Sayisi
Tam Veri 1151
%5 Eksik Veri Temizlenmiş 187
%10 Eksik Veri Temizlenmiş 22
%15 Eksik Veri Temizlenmiş 2

Eksik veriler liste bazlı silme işlemi ile silindikten sonra veri setimizde gözlem sayıları oldukça azaldı.

eksik_5_5 <- eksik_5temiz %>%
  mutate(toplam = rowSums(across(5:39), na.rm = TRUE))

eksik_10_10 <- eksik_10temiz %>%
  mutate(toplam = rowSums(across(5:39), na.rm = TRUE))

eksik_15_15 <- eksik_15temiz %>%
  mutate(toplam = rowSums(across(5:39), na.rm = TRUE))
turkiye_tamveri <- veri_seti %>% filter(CNT == 1)
abd_tamveri    <- veri_seti %>% filter(CNT == 2)

turkiye_5  <- eksik_5_5 %>% filter(CNT == 1)
abd_5      <- eksik_5_5 %>% filter(CNT == 2)

turkiye_10 <- eksik_10_10 %>% filter(CNT == 1)
abd_10     <- eksik_10_10 %>% filter(CNT == 2)

turkiye_15 <- eksik_15_15 %>% filter(CNT == 1)
abd_15     <- eksik_15_15 %>% filter(CNT == 2)
t_test_tam  <- t.test(turkiye_tamveri$toplam, abd_tamveri$toplam)
t_test_5  <- t.test(turkiye_5$toplam, abd_5$toplam)
t_test_10  <- t.test(turkiye_10$toplam, abd_10$toplam)
#t_test_15  <- t.test(turkiye_15$toplam, abd_15$toplam) yeterli gözlem yok dedi

t_testi_sonuc2 <- data.frame(
  Veriler = c("Tam Veri", "%5 Eksik Veri", "%10 Eksik Veri", "%15 Eksik Veri"),
  t = c(t_test_tam$statistic, t_test_5$statistic, t_test_10$statistic, NA),
  p = c(t_test_tam$p.value, t_test_5$p.value, t_test_10$p.value, NA),        
  sd = c(t_test_tam$parameter, t_test_5$parameter, t_test_10$parameter, NA), 
  Ortalama_Fark = c(diff(t_test_tam$estimate),
                    diff(t_test_5$estimate),
                    diff(t_test_10$estimate), 
                    NA),  
  Ortalama_TUR = c(mean(turkiye_tamveri$toplam, na.rm = TRUE),
                   mean(turkiye_5$toplam, na.rm = TRUE),
                   mean(turkiye_10$toplam, na.rm = TRUE),
                   NA),  
  Ortalama_USA = c(mean(abd_tamveri$toplam, na.rm = TRUE),
                   mean(abd_5$toplam, na.rm = TRUE),
                   mean(abd_10$toplam, na.rm = TRUE),
                   NA))



knitr::kable(t_testi_sonuc2, digits = 4, caption = "T-Testi Tam ve Eksik Veri Karşılaştırma Sonuçları")
Table 4: T-Testi Tam ve Eksik Veri Karşılaştırma Sonuçları
Veriler t p sd Ortalama_Fark Ortalama_TUR Ortalama_USA
Tam Veri -7.8242 0.0000 912.3141 3.5932 13.4529 17.0461
%5 Eksik Veri -2.3835 0.0184 144.4604 2.8488 14.0580 16.9068
%10 Eksik Veri -2.8153 0.0108 19.6652 7.7810 11.2857 19.0667
%15 Eksik Veri NA NA NA NA NA NA

Yüzde 5 oranında kayıp verinin liste bazında silindiği t testinin sonuçları tam veri ile karşılaştırıldığında anlamlılık açısından farklı değildir fakat t değeri düşmüştür. Yüzde 10 oranında kayıp veri silinerek gerçekleştirilen testte ise iki grup arasında anlamlı fark çıkmadığı söylenebilir. Yüzde 15 kayıp veri liste bazında silindiğinde ise t testi gruplardan birinde yeterli gözlem kalmadığı için uygulanamamıştır. Eksik veri oranı arttıkça test sonuçlarının değiştiği, istatistiksel gücün azaldığı ve elde edilen bulguların güvenirliğinin azaldığı söylenebilir.

h) f seçeneğinde oluşturulan veri setlerindeki eksik verileri, belirlediğiniz bir kayıp veri atama yöntemiyle doldurunuz. Daha sonra, e seçeneğinde gerçekleştirdiğiniz t testini tekrar ediniz ve tam veri ile elde edilen sonuçlarla karşılaştırınız.

pmm: Sürekli değişkenler için Predictive Mean Matching

# Eksik verileri doldurma
library(mice)
imputed_5  <- mice(eksik_5, m = 5, method = "pmm", seed = 123)
imputed_10 <- mice(eksik_10, m = 5, method = "pmm", seed = 123)
imputed_15 <- mice(eksik_15, m = 5, method = "pmm", seed = 123)
eksik_5_filled  <- complete(imputed_5)
eksik_10_filled <- complete(imputed_10)
eksik_15_filled <- complete(imputed_15)
#toplam sütununu ekleme islemi
veri_seti$toplam <- rowSums(veri_seti[, 3:37], na.rm = TRUE)
eksik_5_filled$toplam  <- rowSums(eksik_5_filled[, 5:39], na.rm = TRUE)
eksik_10_filled$toplam <- rowSums(eksik_10_filled[, 5:39], na.rm = TRUE)
eksik_15_filled$toplam <- rowSums(eksik_15_filled[, 5:39], na.rm = TRUE)

Imputasyon sonrası 5 yeni veri seti oluşturuyoruz. Her bir veri ile ayrı ayrı T testi yaparak sonuçlarını birleştiriyoruz. Bu işlemi derste göstermiştiniz pool fonksiyonu ile yapılıyor diye.

pooled_t_test_5  <- with(eksik_5_filled, t.test(toplam ~ CNT))
pooled_t_test_10 <- with(eksik_10_filled, t.test(toplam ~ CNT))
pooled_t_test_15 <- with(eksik_15_filled, t.test(toplam ~ CNT))

pooled_results_5  <- tidy(pooled_t_test_5)
pooled_results_10 <- tidy(pooled_t_test_10)
pooled_results_15 <- tidy(pooled_t_test_15)


t_testi_birlesim <- data.frame(
  veriler = c("Tam Veri", "%5 Eksik Veri", "%10 Eksik Veri", "%15 Eksik Veri"),
  t = c(t.test(veri_seti$toplam ~ veri_seti$CNT)$statistic, pooled_results_5$statistic[1],pooled_results_10$statistic[1], pooled_results_15$statistic[1]),
  p = c(t.test(veri_seti$toplam ~ veri_seti$CNT)$p.value, pooled_results_5$p.value[1],
               pooled_results_10$p.value[1], pooled_results_15$p.value[1])
)

knitr::kable(t_testi_birlesim, digits = 9, caption = "Pooled T-Test Sonuçları")
Table 5: Pooled T-Test Sonuçları
veriler t p
Tam Veri -7.824222 0
%5 Eksik Veri -7.800468 0
%10 Eksik Veri -7.820689 0
%15 Eksik Veri -7.774372 0

i) Eksik veri oranının uygulanan yöntemlerin performansına etkisini açıklayınız.

Liste bazlı silme yöntemi kullanıldığında kayıp veri miktarı arttıkça sonuçlar oldukça fazla etkilenmiştir. Yüzde 15 kayıp verinin bulunduğu veri setinde ise veriler silindiğinde t testi yapacak gözlem kalmadığı görülmüştür. “Predictive mean matching(pmm)” yöntemi ise kayıp veri miktarından çok etkilenmemiş ve tam veri ile uyumlu sonuçlar çıkmıştır. pmm yöntemi, eksik verileri tamamlamak için etkili bir yöntem olarak görülmektedir ancak analiz sonuçlarında tam veri ile elde edilen farkı tam olarak koruyamamıştır.

ödev çoook zamanımı aldı :/ ve chatgpt’den oldukça yardım aldım, konu anlatım dosyanızdan da çok yararlandım, doğru mu yaptım bilemiyorum ama bu ödeve akşam 23.00 ile sabah 7.00 arasındaki tüm vaktimi harcadım.