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.
b) Veri setinde eksik veri olup olmadığını kontrol ediniz.
## [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()| 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.
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")| 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")))## # 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ı")| 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ı")| 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ı")| 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.