1 ÖDEV 2

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

library(dplyr)
library(missForest)
library(psych)
library(kableExtra)
library(knitr)
library(naniar)
library(mice)

1.1 a)

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

veriseti <- readRDS("data/TRUSA.RDS")
veriseti <- expss::drop_var_labs(veriseti)

1.2 b)

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

#is.na(veriseti)
sum(is.na(veriseti))
## [1] 0

1.3 c)

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

veriseti <- veriseti %>%
  mutate(toplampuan = rowSums(select(., starts_with("M0")), na.rm = TRUE))

1.4 d)

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

istatistikler <- veriseti %>%
  group_by(CNT) %>%
  summarise(
    Ortalama = mean(toplampuan),
    Medyan = median(toplampuan),
    Minimum = min(toplampuan),
    Maksimum = max(toplampuan),
    StandartSapma = sd(toplampuan),
    GozlemSayısı = n()
  )
istatistikler

1.5 e)

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

TUR_ABD <- veriseti %>%
  filter(CNT %in% c("USA", "TUR"))

TURpuan <- TUR_ABD$toplampuan[TUR_ABD$CNT == "TUR"]
ABDpuan <- TUR_ABD$toplampuan[TUR_ABD$CNT == "USA"]

# t testi
t_test <- t.test(TURpuan, ABDpuan)

print(t_test)
## 
##  Welch Two Sample t-test
## 
## data:  TURpuan and ABDpuan
## 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

Sonuçlar incelendiğinde Türkiye puanının ABD puanına göre anlamlı düzeyde düşük olduğu görülmektedir.

1.6 f)

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

Bu verisetinde eksik veri hazırlayan “eksilt” isimli minik tatlı bir fonksiyon hazırlayalım

eksilt <- function(data, eksiltmeorani) {
  veriyeni <- data
  maddeler <- select(data, starts_with("M0"))
  maddelerNA <- prodNA(maddeler, noNA = eksiltmeorani)
  
  veriyeni[, names(maddeler)] <- maddelerNA
  return(veriyeni)
}

Fonksiyonu işe koşma zamanı

eksik5 <- eksilt(veriseti, 0.05)
eksik10 <- eksilt(veriseti, 0.10)
eksik15 <- eksilt(veriseti, 0.15)

eksik veriseti miktarını söyleyen bir fonksiyon daha yazacak olursak

eksikyuzdesi <- function(data) {
  veri_seti_adi <- deparse(substitute(data))  # Bu kısım benim için de yeni oldu. Biraz uğraştırdı
  toplam_hucre <- nrow(data) * ncol(select(data, starts_with("M0")))
  eksik_hucre <- sum(is.na(select(data, starts_with("M0"))))
  eksik_oran <- round((eksik_hucre / toplam_hucre) * 100, 2)
  
  return(data.frame(VeriSeti = veri_seti_adi, EksikGozlemSayisi = eksik_hucre, EksikVeriOrani = paste0(eksik_oran, "%")))
}

Bu fonksiyonu da işe koşarsak…

eksiktablosu <- bind_rows(eksikyuzdesi(eksik5),
eksikyuzdesi(eksik10),
eksikyuzdesi(eksik15))

#Ödevdeki eksiklerin üstünü örtmek için küçük bir dokunuş. Ama çok küçük

eksiktablosu %>%
  kable("html", caption = "Eksik Veri Miktarları") %>% 
  kable_styling(full_width = FALSE)
Table 1.1: Eksik Veri Miktarları
VeriSeti EksikGozlemSayisi EksikVeriOrani
eksik5 2014 5%
eksik10 4028 10%
eksik15 6042 15%

1.7 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çiyoruz
mcar_test_5 <- mcar_test(select(eksik5, starts_with("M0")))
## Warning in norm::prelim.norm(data): NAs introduced by coercion to integer range
mcar_test_10 <- mcar_test(select(eksik10, starts_with("M0")))
## Warning in norm::prelim.norm(data): NAs introduced by coercion to integer range
mcar_test_15 <- mcar_test(select(eksik15, starts_with("M0")))
## Warning in norm::prelim.norm(data): NAs introduced by coercion to integer range
bind_rows(
print(mcar_test_5),
print(mcar_test_10),
print(mcar_test_15))
## # A tibble: 1 × 4
##   statistic    df p.value missing.patterns
##       <dbl> <dbl>   <dbl>            <int>
## 1     2727. 18794       1              583
## # A tibble: 1 × 4
##   statistic    df p.value missing.patterns
##       <dbl> <dbl>   <dbl>            <int>
## 1     3125. 31248       1             1004
## # A tibble: 1 × 4
##   statistic    df p.value missing.patterns
##       <dbl> <dbl>   <dbl>            <int>
## 1  2008478. 33803       0             1139

Eksik veriler rastgele dağılmaktadır.

Liste bazında silme

eksik5temiz <- na.omit(eksik5)
eksik10temiz <- na.omit(eksik10)
eksik15temiz <- na.omit(eksik15)

cat("Tam veri seti gözlem sayısı:", nrow(veriseti), "\n")
## Tam veri seti gözlem sayısı: 1151
cat("%5 eksik veri temizlendikten sonra:", nrow(eksik5temiz), "\n")
## %5 eksik veri temizlendikten sonra: 201
cat("%10 eksik veri temizlendikten sonra:", nrow(eksik10temiz), "\n")
## %10 eksik veri temizlendikten sonra: 27
cat("%15 eksik veri temizlendikten sonra:", nrow(eksik15temiz), "\n")
## %15 eksik veri temizlendikten sonra: 2

liste bazında silme bizi üzdü :)

Türkiye ve ABD arasında t testi yapan bir fonksiyon yazacak olursak

tmaker <- function(data) {
  veri_seti_adi <- deparse(substitute(data))
  TUR_ABD <- data %>% filter(CNT %in% c("USA", "TUR"))
  
  TURpuan <- TUR_ABD$toplampuan[TUR_ABD$CNT == "TUR"]
  ABDpuan <- TUR_ABD$toplampuan[TUR_ABD$CNT == "USA"]
  
  t_test <- t.test(TURpuan, ABDpuan)
  
  sonuc_tablosu <- data.frame(
    VeriSeti = veri_seti_adi,
    n = nrow(data),
    t = t_test$statistic,
    P = t_test$p.value,
    Ortalama_Farki = t_test$estimate[1] - t_test$estimate[2]
  )
  
  return(sonuc_tablosu)
}

Fonksiyon yeniden işe koşulacak olursa

t_testleri <- bind_rows(
  tmaker(veriseti),
  tmaker(eksik5temiz),
  tmaker(eksik10temiz)
  #tmaker(eksik15temiz) bununla çalışmıyor, iki gruptan birinde veri kalmadı :)
)

#azıcık şekillendirerek...
t_testleri %>%
  kable("html", caption = "T-Testi Sonuçları (Eksik Veri ile Karşılaştırma)") %>%
  kable_styling(full_width = FALSE)
Table 1.2: T-Testi Sonuçları (Eksik Veri ile Karşılaştırma)
VeriSeti n t P Ortalama_Farki
t…1 veriseti 1151 -7.824222 0.0000000 -3.593216
t…2 eksik5temiz 201 -4.615712 0.0000079 -4.771641
t…3 eksik10temiz 27 -1.144753 0.2651908 -3.379121

Yüzde 5 kayıp verinin liste bazında silindiği t testinin sonuçları anlamlılık açısından farklı değildir fakat t değeri etkilenmiştir. Yüzde 10 kayıp veri silinerek gerçekleştirilen testte ise iki grup arasında anlamlı düzeyde fark çıkmamaktadır. Yüzde 15 kayıp veri liste bazında silindiğinde ise t testi gruplardan birinde veri kalmadığı için gerçekleştirilememektedir.

1.8 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.

predictive mean matching yöntemini kullanacağım

tamamveri5  <- complete(atama5)
tamamveri10 <- complete(atama10)
tamamveri15 <- complete(atama15)

toplam sütunları eklenen hali

tamamveri5 <- tamamveri5 %>%
  mutate(toplampuan = rowSums(select(., starts_with("M0"))))

tamamveri10 <- tamamveri10 %>%
  mutate(toplampuan = rowSums(select(., starts_with("M0"))))

tamamveri15 <- tamamveri15 %>%
  mutate(toplampuan = rowSums(select(., starts_with("M0"))))

head(tamamveri5)
head(tamamveri10)
head(tamamveri15)

t testlerine eski fonksiyonumuzu yazarak devam ediyoruz

t_testleri <- bind_rows(
  tmaker(veriseti),
  tmaker(tamamveri5),
  tmaker(tamamveri10),
  tmaker(tamamveri15)
)

t_testleri %>%
  kable("html", caption = "T-Testi Sonuçları (Atama Yöntemi ile Karşılaştırma)") %>%
  kable_styling(full_width = FALSE)
Table 1.3: T-Testi Sonuçları (Atama Yöntemi ile Karşılaştırma)
VeriSeti n t P Ortalama_Farki
t…1 veriseti 1151 -7.824222 0 -3.593216
t…2 tamamveri5 1151 -7.822661 0 -3.585244
t…3 tamamveri10 1151 -7.868404 0 -3.615154
t…4 tamamveri15 1151 -7.772396 0 -3.574331

pmm yöntemi ile atama yaptıktan sonra elde edilen sonuçlar incelendiğinde t testlerinin her kayıp veri düzeyinde (%0, %5, %10, %15) birbiri ile oldukça uyumlu olduğu, t değerinin ikinci ondalık basamakta farklılaştığı görülmektedir.

1.9 i)

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

Eksik veri oranının uygulanan yönteme etkisi, aslında yine uygulanan yönteme göre farklılaşmıştır. Bu verilere göre inceleme yapıldığında liste bazlı silme yöntemi ile kayıp vri miktarı arttıkça sonuçlar oldukça fazla etkilenmiştir. Yüzde 15 kayıp verinin bulunduğu verisetinde katılımcı verileri silindiğinde t testi yapacak verinin kalmadığı görülmüştür. Predictive mean matching yöntemi ise kayıp veri miktarından çok etkilenmemiş ve eksik olmayan veri ile tutarlı sonuçlar vermiştir. Kayıp veri miktarı daha da artırılarak sonuçların yeniden incelenmesinde fayda görülmektedir.