library(tidyverse)      
library(haven)          
library(knitr)          
library(kableExtra)
theme_set(theme_minimal(base_size = 12))

1 Veri Seti

Bu notları tutarken geçen hafta yaptığım regresyon ödevinde kullandığım TIMSS 2023 veri setinden faydalanıyorum. O ödevde olduğu gibi yine özetlediğim verileri kullanacağım. Veriyi yükleyip kısaca tanıtmak istiyorum.

timss_kisa <- readRDS("data/timss_kisa.rds")

1.1 Veri Seti Hakkında Bilgiler

Değişken Açıklama Kodlar (1-2-3)
Başarı Puanları Matematik Başarısı (Plausible Values) mat_basari1 - mat_basari5 (Sürekli Puan)
Cinsiyet Öğrenci Cinsiyeti 1: Kız, 2: Erkek
Ev Kaynakları Evdeki imkanların durumu 1: Çok, 2: Orta, 3: Az
Özgüven Matematik Özgüveni 1: Yüksek, 2: Orta, 3: Düşük
Sevme Matematiği Sevme Durumu 1: Çok Seviyor, 2: Biraz, 3: Sevmiyor
Aidiyet Okula Aidiyet Hissi 1: Yüksek, 2: Orta, 3: Düşük

Önemli Not: Duyuşsal değişkenlerde “1” değeri en olumlu durumu temsil ederken, sayısal değer arttıkça durum olumsuzlaşmaktadır.

2 Fonksiyonlar

2.1 Temel Çalışma Mantığı

Fonksiyonlar, belirli bir işlemi tekrar tekrar yapmak yerine tek seferde tanımlayıp daha sonra farklı değerlerle istediğimiz kadar kullanmamızı sağlayan kod bloklarıdır. Bu yüzden işlerimizi hızlandırmak için kullanılabilir. Aşağıda öğrencilerin punalrına göre hangi başarı seviyesinde olduğunu belirleyen basari_seviyesi isimli bir fonksiyon oluşturdum. Buradaki örnekte mat_basari1puanına göre seviyeleri belirledim.

basari_seviyesi <- function(puanlar) {
  library(knitr)
  library(kableExtra)
  
  sonuclar <- sapply(puanlar, function(p) {
    if(p >= 625) return("İleri")
    else if(p >= 550) return("Yüksek")
    else if(p >= 475) return("Orta")
    else if(p >= 400) return("Düşük")
    else return("Çok Düşük")
  })
  
  df <- data.frame(
    Puan = puanlar,
    Seviye = sonuclar
  )
  
  kable(df, align = "c") %>%
    kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover")) %>%
    row_spec(which(df$Seviye == "İleri"), background = "#d4edda", color = "#155724") %>%
    row_spec(which(df$Seviye == "Yüksek"), background = "#d1ecf1", color = "#0c5460") %>%
    row_spec(which(df$Seviye == "Orta"), background = "#fff3cd", color = "#856404") %>%
    row_spec(which(df$Seviye == "Düşük"), background = "#ffe5cc", color = "#8b4000") %>%
    row_spec(which(df$Seviye == "Çok Düşük"), background = "#f8d7da", color = "#721c24")
}

Fonksiyonun doğru çalışıp çalışmadığını bir kaç örnekle test ettim.

basari_seviyesi(325)
Puan Seviye
325 Çok Düşük
basari_seviyesi(502)
Puan Seviye
502 Orta
basari_seviyesi(680)
Puan Seviye
680 İleri
basari_seviyesi(574)
Puan Seviye
574 Yüksek

Daha sonra betimsel istatistikleri hesaplayan betimsel_istatistik isimli bir fonksiyon yazdım ve test ettim.

betimsel_istatistik <- function(veri, degisken) {
  library(kableExtra)
  
  istatistikler <- data.frame(
    "Değişken" = degisken,
    "N" = length(veri[[degisken]]),
    "Ortalama" = round(mean(veri[[degisken]], na.rm = TRUE), 2),
    "Std. Sapma" = round(sd(veri[[degisken]], na.rm = TRUE), 2),
    "Minimum" = round(min(veri[[degisken]], na.rm = TRUE), 2),
    "Maksimum" = round(max(veri[[degisken]], na.rm = TRUE), 2),
    "Medyan" = round(median(veri[[degisken]], na.rm = TRUE), 2)
  )
  
  tablo <- kable(istatistikler, 
                 align = "c",
                 caption = "Betimsel İstatistikler") %>%
    kable_styling(
      bootstrap_options = c("striped", "hover", "condensed"),
      full_width = FALSE,
      position = "center",
      font_size = 14
    ) %>%
    row_spec(0, bold = TRUE, color = "white", background = "#4CAF50") %>%
    column_spec(1, bold = TRUE, color = "#2c3e50") %>%
    add_header_above(c(" " = 1, "Merkezi Eğilim ve Yayılım Ölçüleri" = 6),
                     bold = TRUE, 
                     color = "white", 
                     background = "#2c3e50")
  
  return(tablo) 
}

mat_basari1 ve mat_basari2 değişkenleri kullanarak betimsel_istatistik fonksiyonunu test ettim.

betimsel_istatistik(timss_kisa, "mat_basari1")
Betimsel İstatistikler
Merkezi Eğilim ve Yayılım Ölçüleri
Değişken N Ortalama Std..Sapma Minimum Maksimum Medyan
mat_basari1 4925 504,18 110,64 216,03 851,1 502,87

3 Kontrol Operatörleri

3.1 if - else

Bu yapı bir durumun belirlenen şartı karşılayıp karşılamadığını kontrol eden temel bir karar mekanizmasıdır. Koşul sağlanıyorsa (bir işlemi, sağlanmıyorsa diğer işlemi yapar. Aşağıda mat_basari1 puanı 500 üzeri olan öğrenci için “ortalama üstü” değilse “ortalama altı” şeklinde ayıracak bir kod yer almaktadır. Kodda 250. öğrenci için sorgulama yapılmıştır.

library(kableExtra)

ogrenci_puan <- timss_kisa$mat_basari1[250]  

if(ogrenci_puan >= 500) {
  sonuc <- data.frame(
    Durum = "Bu öğrenci ortalama üstü",
    Puan = ogrenci_puan
  )
  
  kable(sonuc, align = "c") %>%
    kable_styling(full_width = FALSE, 
                  bootstrap_options = "bordered") %>%
    row_spec(0, bold = TRUE, color = "white", background = "#28a745") %>%
    row_spec(1, background = "#d4edda", color = "#155724", font_size = 16)
  
} else {
  sonuc <- data.frame(
    Durum = "Bu öğrenci ortalama altı",
    Puan = ogrenci_puan
  )
  
  kable(sonuc, align = "c") %>%
    kable_styling(full_width = FALSE, 
                  bootstrap_options = "bordered") %>%
    row_spec(0, bold = TRUE, color = "white", background = "#dc3545") %>%
    row_spec(1, background = "#f8d7da", color = "#721c24", font_size = 16)
}
Durum Puan
Bu öğrenci ortalama altı 425,5405

3.2 ifelse

Veri setindeki tüm değerlerin belirlenen şartı karşılayıp karşılamadığını tek seferde kontrol eden temel bir karar mekanizmasıdır. Koşul sağlanıyorsa belirlenen ilk işlemi, sağlanmıyorsa diğer işlemi tüm veri setine uygular. Aşağıda mat_basari1 değeri 500 üstü olanlar “Üst Grup” altında olanlar “Alt Grup” olarak gruplanmıştır. İlk 60-75 sıradaki öğrenciler kontrol edilmiştir.

timss_kisa$basari_durumu <- ifelse(timss_kisa$mat_basari1 >= 500, 
                                    "Üst Grup", 
                                    "Alt Grup")

orneklem <- timss_kisa[60:75, c("mat_basari1", "basari_durumu")]

colnames(orneklem) <- c("Matematik Başarısı", "Başarı Durumu")

kable(orneklem, 
      align = "c",
      row.names = FALSE,
      caption = "İlk 10 Öğrencinin Başarı Durumu") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  ) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#3498db") %>%
  row_spec(which(orneklem$`Başarı Durumu` == "Üst Grup"), 
           background = "#d4edda", color = "#155724") %>%
  row_spec(which(orneklem$`Başarı Durumu` == "Alt Grup"), 
           background = "#f8d7da", color = "#721c24") %>%
  column_spec(1, bold = TRUE, width = "10em") %>%
  column_spec(2, bold = TRUE, width = "10em")
İlk 10 Öğrencinin Başarı Durumu
Matematik Başarısı Başarı Durumu
771,8119 Üst Grup
630,9607 Üst Grup
775,2622 Üst Grup
359,2683 Alt Grup
306,3927 Alt Grup
439,1558 Alt Grup
457,4357 Alt Grup
325,0238 Alt Grup
282,5262 Alt Grup
332,8487 Alt Grup
455,6493 Alt Grup
454,2457 Alt Grup
467,0325 Alt Grup
555,7074 Üst Grup
508,7265 Üst Grup
522,4856 Üst Grup

3.3 all & any

all tüm öğrenciler için bir koşulun sağlanıp sağlanmadığını kontrol eder. Aşağıda tüm öğrencilerin puanlarının 200’den veya 600’den büyük olduğu kontrol edilmiştir.

all(timss_kisa$mat_basari1 > 200, na.rm = TRUE)
## [1] TRUE
all(timss_kisa$mat_basari1 > 600, na.rm = TRUE)
## [1] FALSE

any en az bir öğrenci için koşulun sağlanıp sağlanmadığını kontrol eder. Aşağıda 700’den büyük veya 200’den küçük öğrenci puanı olup olmadığı kontrol edilmiştir.

any(timss_kisa$mat_basari1 > 700, na.rm = TRUE)
## [1] TRUE
any(timss_kisa$mat_basari1 <200, na.rm = TRUE)
## [1] FALSE

4 for Döngüsü

Aynı işi birden fazla kez tekrarlamak için kullanılır. Mesela 5 matematik sınav sonucunun hepsinin ortalamasını hesaplamak istiyorsak, aynı hesabı 5 kere elle yazmak yerine bilgisayara “1’den 5’e kadar say, her sayıda bu hesabı yap” deriz. aşağıda olası matematik puanlarının hepsini tek kod ile hesaplamak için bir örnek verilmiştir.

for(i in 1:5) {
  degisken <- paste0("mat_basari", i)
  ortalama <- mean(timss_kisa[[degisken]])
  print(paste(degisken, "ortalaması:", round(ortalama, 2)))
}
## [1] "mat_basari1 ortalaması: 504,18"
## [1] "mat_basari2 ortalaması: 505,84"
## [1] "mat_basari3 ortalaması: 505,45"
## [1] "mat_basari4 ortalaması: 505,08"
## [1] "mat_basari5 ortalaması: 505,46"

5 while Döngüsü

Belirli bir koşul sağlandığı sürece tekrar eden bir döngüdür. For döngüsünde “5 kere tekrarla” derken, while’da “ortalama 500’ün üstüne çıkana kadar tekrarla” deriz- yani kaç kere döneceğini önceden bilmezsiniz. Koşul doğru olduğu sürece döner, koşul yanlış olunca durur. Aşağıda puanları 300’den az olan ve 700’den fazla olan öğrencilerin sayısı ve puan ortalmaları while ile yazdırılmıştır.

yuksek_puanli <- c()
dusuk_puanli <- c()
satir <- 1

while(satir <= nrow(timss_kisa)) {
  puan <- timss_kisa$mat_basari1[satir]
  
  if(puan > 700) {
    yuksek_puanli <- c(yuksek_puanli, puan)
  }
  
  if(puan < 300) {
    dusuk_puanli <- c(dusuk_puanli, puan)
  }
  
  satir <- satir + 1
}

sonuc_tablo <- data.frame(
  Kategori = c("Çok Yüksek (700+)", "Çok Düşük (300-)"),
  Ogrenci_Sayisi = c(length(yuksek_puanli), length(dusuk_puanli)),
  Ortalama_Puan = c(
    ifelse(length(yuksek_puanli) > 0, round(mean(yuksek_puanli), 2), NA),
    ifelse(length(dusuk_puanli) > 0, round(mean(dusuk_puanli), 2), NA)
  ),
  Min_Puan = c(
    ifelse(length(yuksek_puanli) > 0, min(yuksek_puanli), NA),
    ifelse(length(dusuk_puanli) > 0, min(dusuk_puanli), NA)
  ),
  Max_Puan = c(
    ifelse(length(yuksek_puanli) > 0, max(yuksek_puanli), NA),
    ifelse(length(dusuk_puanli) > 0, max(dusuk_puanli), NA)
  ),
  Yuzde = c(
    round(length(yuksek_puanli) / nrow(timss_kisa) * 100, 1),
    round(length(dusuk_puanli) / nrow(timss_kisa) * 100, 1)
  )
)

colnames(sonuc_tablo) <- c("Kategori", "Öğrenci Sayısı", "Ortalama", "Minimum", "Maksimum", "Yüzde (%)")

# Güzel tablo oluştur
kable(sonuc_tablo, 
      align = "c",
      caption = "Uç Değer Analizi: Çok Yüksek ve Çok Düşük Puanlı Öğrenciler") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center",
    font_size = 14
  ) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#3498db") %>%
  row_spec(1, background = "#d4edda", color = "#155724", bold = TRUE) %>%
  row_spec(2, background = "#f8d7da", color = "#721c24", bold = TRUE) %>%
  column_spec(1, bold = TRUE, width = "12em") %>%
  add_header_above(c(" " = 1, "Betimsel İstatistikler" = 4, " " = 1),
                   bold = TRUE, 
                   color = "white", 
                   background = "#2c3e50")
Uç Değer Analizi: Çok Yüksek ve Çok Düşük Puanlı Öğrenciler
Betimsel İstatistikler
Kategori Öğrenci Sayısı Ortalama Minimum Maksimum Yüzde (%)
Çok Yüksek (700+) 163 734,03 700,0615 851,0999 3,3
Çok Düşük (300-) 117 276,04 216,0320 299,5806 2,4

6 apply Grubu

6.1 apply()

Matris veya data frame’in satırlarına veya sütunlarına aynı fonksiyonu uygular. Her öğrencinin PV (satır) ve her bir PV’nin (sütun) ortalmaları hesplanmıştır. İlk 10 öğrencinin sonuçları ve tüm PV’lerin istatistikleri gösterilmiştir.

Satırlar üzerinde uygulama:

mat_ort <- apply(timss_kisa[, 4:8], 1, mean)

ogrenci_tablosu <- data.frame(
  Ogrenci_No = 60:75,
  PV1 = timss_kisa$mat_basari1[60:75],
  PV2 = timss_kisa$mat_basari2[60:75],
  PV3 = timss_kisa$mat_basari3[60:75],
  PV4 = timss_kisa$mat_basari4[60:75],
  PV5 = timss_kisa$mat_basari5[60:75],
  Ortalama = round(mat_ort[60:75], 2)
)

colnames(ogrenci_tablosu) <- c("Öğrenci No", "PV-1", "PV-2", "PV-3", "PV-4", "PV-5", "Ortalama")

kable(ogrenci_tablosu, 
      align = "c",
      caption = "Öğrencilerin(60-75) 5 Plausible Value Ortalaması") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center",
    font_size = 13
  ) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#3498db") %>%
  column_spec(1, bold = TRUE, background = "#ecf0f1", width = "8em") %>%
  column_spec(7, bold = TRUE, color = "white", background = "#e74c3c", width = "8em") %>%
  add_header_above(c(" " = 1, "Plausible Values" = 5, " " = 1),
                   bold = TRUE, 
                   color = "white", 
                   background = "#2c3e50") %>%
  add_footnote("PV = Plausible Value (Olası Değer)", 
               notation = "none")
Öğrencilerin(60-75) 5 Plausible Value Ortalaması
Plausible Values
Öğrenci No PV-1 PV-2 PV-3 PV-4 PV-5 Ortalama
60 771,8119 746,0206 706,9220 778,5674 703,4882 741,36
61 630,9607 672,2058 619,1211 656,7280 657,6517 647,33
62 775,2622 759,6980 777,2164 790,8458 793,7985 779,36
63 359,2683 350,1783 356,1444 341,2752 341,9066 349,75
64 306,3927 384,8287 375,9053 388,2260 368,2095 364,71
65 439,1558 387,4789 450,5636 390,6736 411,8018 415,93
66 457,4357 489,4100 435,7737 490,4268 494,0229 473,41
67 325,0238 407,7418 321,2674 331,8170 359,7358 349,12
68 282,5262 413,0886 287,5822 272,8727 340,2687 319,27
69 332,8487 307,7007 335,0669 269,3545 367,8482 322,56
70 455,6493 489,6976 419,2530 415,8496 446,9941 445,49
71 454,2457 476,7451 505,7791 413,1066 488,9072 467,76
72 467,0325 410,9109 471,2360 451,4779 441,5116 448,43
73 555,7074 458,5578 486,7002 509,0737 502,1806 502,44
74 508,7265 486,1329 497,5825 508,1327 499,4473 500,00
75 522,4856 475,4186 534,0928 532,7842 509,4524 514,85
PV = Plausible Value (Olası Değer)

Sütunlar üzerinde uygulama:

pv_ort <- apply(timss_kisa[, 4:8], 2, mean)
pv_ss <- apply(timss_kisa[, 4:8], 2, sd)
pv_min <- apply(timss_kisa[, 4:8], 2, min)
pv_max <- apply(timss_kisa[, 4:8], 2, max)


pv_tablosu <- data.frame(
  PV = c("PV-1", "PV-2", "PV-3", "PV-4", "PV-5"),
  Ortalama = round(pv_ort, 2),
  Std_Sapma = round(pv_ss, 2),
  Minimum = round(pv_min, 2),
  Maksimum = round(pv_max, 2),
  Aralik = round(pv_max - pv_min, 2)
)

kable(pv_tablosu, 
      align = "c",
      row.names = FALSE,
      caption = "5 Plausible Value Istatistikleri") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center",
    font_size = 14
  ) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#3498db") %>%
  column_spec(1, bold = TRUE, background = "#ecf0f1") %>%
  column_spec(2:3, background = "#fff3cd") %>%
  column_spec(4:5, background = "#d1ecf1") %>%
  column_spec(6, bold = TRUE, background = "#d4edda")
5 Plausible Value Istatistikleri
PV Ortalama Std_Sapma Minimum Maksimum Aralik
PV-1 504,18 110,64 216,03 851,10 635,07
PV-2 505,84 112,19 187,94 877,67 689,74
PV-3 505,45 112,95 139,24 843,08 703,84
PV-4 505,08 113,71 129,53 854,14 724,61
PV-5 505,46 112,45 148,90 855,26 706,35

6.2 sapply()

Liste veya vektörün her elemanına fonksiyon uygular, mümkünse vektör döner. Olası matmatik punalrının (PV) hepsine aynı işlemlerin uygulandığı bir örnek aşağıda sunulmuştur.

library(kableExtra)

pv_ort <- sapply(timss_kisa[, 4:8], mean)
pv_ss <- sapply(timss_kisa[, 4:8], sd)
pv_min <- sapply(timss_kisa[, 4:8], min)
pv_max <- sapply(timss_kisa[, 4:8], max)

pv_istatistik <- data.frame(
  Degisken = c("PV-1", "PV-2", "PV-3", "PV-4", "PV-5"),
  Ortalama = round(pv_ort, 2),
  Std_Sapma = round(pv_ss, 2),
  Min = round(pv_min, 2),
  Max = round(pv_max, 2)
)

colnames(pv_istatistik) <- c("Degisken", "Ortalama", "Std. Sapma", "Minimum", "Maksimum")

kable(pv_istatistik, 
      align = "c",
      row.names = FALSE,
      caption = "5 Plausible Value Istatistikleri (sapply)") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center",
    font_size = 14
  ) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#9b59b6") %>%
  column_spec(1, bold = TRUE, background = "#ecf0f1", width = "10em") %>%
  column_spec(2:3, background = "#fff3cd") %>%
  column_spec(4:5, background = "#d1ecf1")
5 Plausible Value Istatistikleri (sapply)
Degisken Ortalama Std. Sapma Minimum Maksimum
PV-1 504,18 110,64 216,03 851,10
PV-2 505,84 112,19 187,94 877,67
PV-3 505,45 112,95 139,24 843,08
PV-4 505,08 113,71 129,53 854,14
PV-5 505,46 112,45 148,90 855,26

6.3 lapply()

liste veya vektörün her elemanına aynı fonksiyonu uygular ve sonucu liste olarak döner. sapply vektör dönerken lapply her zaman liste döner. Aşağıda olası matematik puanlarının ortalaması bu fonksiyon ile gösterilmiştir.

pv_ortalamalari <- lapply(timss_kisa[, 4:8], mean)

lapply_tablo <- data.frame(
  Plausible_Value = c("PV-1", "PV-2", "PV-3", "PV-4", "PV-5"),
  Ortalama = round(unlist(pv_ortalamalari), 2)
)

colnames(lapply_tablo) <- c("Olası Puan", "Ortalama")

# Güzel tablo oluştur
kable(lapply_tablo, 
      align = "c",
      row.names = FALSE,
      caption = "Olası Değer Ortalamaları") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center",
    font_size = 16
  ) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#e74c3c") %>%
  column_spec(1, bold = TRUE, background = "#ecf0f1", width = "12em") %>%
  column_spec(2, bold = TRUE, color = "white", background = "#f39c12", width = "10em")
Olası Değer Ortalamaları
Olası Puan Ortalama
PV-1 504,18
PV-2 505,84
PV-3 505,45
PV-4 505,08
PV-5 505,46

6.4 tapply()

Bir değişkeni gruplara böler ve her gruba aynı fonksiyonu uygular. “Cinsiyete göre ortalama”, “ev kaynaklarına göre ortalama” gibi grup karşılaştırmaları için kullanılır.

cinsiyet_ortalama <- tapply(timss_kisa$mat_basari1, timss_kisa$cinsiyet, mean)

tapply_tablo <- data.frame(
  Cinsiyet = names(cinsiyet_ortalama),
  Ortalama_Puan = round(cinsiyet_ortalama, 2),
  Ogrenci_Sayisi = as.numeric(table(timss_kisa$cinsiyet))
)


colnames(tapply_tablo) <- c("Cinsiyet", "Ortalama Puan", "Ögrenci Sayısı")

kable(tapply_tablo, 
      align = "c",
      row.names = FALSE,
      caption = "Cinsiyete Gore Matematik Basarisi (tapply)") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center",
    font_size = 15
  ) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#16a085") %>%
  column_spec(1, bold = TRUE, background = "#ecf0f1", width = "10em") %>%
  column_spec(2, bold = TRUE, color = "white", background = "#3498db", width = "12em") %>%
  column_spec(3, background = "#d5f4e6", width = "12em")
Cinsiyete Gore Matematik Basarisi (tapply)
Cinsiyet Ortalama Puan Ögrenci Sayısı
1 504,54 2437
2 503,83 2488

6.5 mapply()

Birden fazla vektörü paralel olarak işler, her vektörden aynı sıradaki elemanları birlikte kullanır. “Vize %40 + Final %60” gibi çoklu vektör hesaplamalarında kullanılır.

yeni_mat_notu <- mapply(
  function(pv1, pv2) pv1 * 0.30 + pv2 * 0.70,
  timss_kisa$mat_basari1,
  timss_kisa$mat_basari2
)

ogrenci_tablo <- data.frame(
  Ogrenci_No = 1:10,
  Mat_Basari1 = round(timss_kisa$mat_basari1[1:10], 2),
  Mat_Basari2 = round(timss_kisa$mat_basari2[1:10], 2),
  Yeni_Matematik = round(yeni_mat_notu[1:10], 2)
)

colnames(ogrenci_tablo) <- c("Ögrenci No", "PV-1 (30%)", "PV-2 (70%)", "Ağırlıklı Ortalama")

kable(ogrenci_tablo, 
      align = "c",
      row.names = FALSE,
      caption = "Ağırlıklı Ortalama Hesaplama") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center",
    font_size = 14
  ) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#8e44ad") %>%
  column_spec(1, bold = TRUE, background = "#ecf0f1", width = "9em") %>%
  column_spec(2, background = "#ffeaa7", width = "10em") %>%
  column_spec(3, background = "#74b9ff", width = "10em") %>%
  column_spec(4, bold = TRUE, color = "white", background = "#00b894", width = "12em") %>%
  add_header_above(c(" " = 1, "Plausible Values" = 2, "Sonuc" = 1),
                   bold = TRUE, 
                   color = "white", 
                   background = "#2c3e50")
Ağırlıklı Ortalama Hesaplama
Plausible Values
Sonuc
Ögrenci No PV-1 (30%) PV-2 (70%) Ağırlıklı Ortalama
1 310,97 325,01 320,80
2 399,64 440,00 427,90
3 517,34 504,59 508,41
4 344,48 252,83 280,32
5 479,47 410,80 431,40
6 382,51 338,74 351,87
7 429,39 407,78 414,26
8 459,13 463,96 462,51
9 536,61 550,43 546,28
10 479,04 460,53 466,08

7 Simülasyon Denemesi

Buraya bu haftaki konularla ilgili bir infografik ve simülasyon ekledim. Ancak gömülü dosya ile birlikte RPubs yayınlamama izin vermiyor. Dosaynın tam halini mailinize ilettim.