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)
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)
Veri setinde eksik veri olup olmadığını kontrol ediniz.
#is.na(veriseti)
sum(is.na(veriseti))
## [1] 0
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))
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
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.
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)
| VeriSeti | EksikGozlemSayisi | EksikVeriOrani |
|---|---|---|
| eksik5 | 2014 | 5% |
| eksik10 | 4028 | 10% |
| eksik15 | 6042 | 15% |
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)
| 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.
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)
| 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.
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.