Hafta_4 Birleştirme ve Ölçek Puanlama

Yazar

Enes Cetinkaya

Yayınlanma Tarihi

22 Ekim 2026

Veri Hazırlığı

Kod
library(readr)
library(dplyr)
library(tidyr)
library(stringr)
library(haven)
library(here)

# temizlenmiş veri
ogrenci <- readRDS(here("veri", "OKUL2026_temiz.rds"))

# 1. yinelenen kayıtlar
ogrenci_v1 <- ogrenci %>% distinct(ogrenci_id, .keep_all = TRUE)

# 5.1 aralık dışı değerler
ogrenci_v1 <- ogrenci_v1 %>%
  mutate(across(oz1:oz8, ~ if_else(. < 1 | . > 5, NA_real_, .)))

# 5.2 ters maddeler
ogrenci_v2 <- ogrenci_v1 %>%
  mutate(across(c(kay2, kay4, kay6, aid3), ~ 6 - .))

# 5.3 ölçek puanları
ogrenci_v2 <- ogrenci_v2 %>%
  mutate(
    oz_puan  = rowMeans(across(oz1:oz8),   na.rm = TRUE),
    kay_puan = rowMeans(across(kay1:kay6), na.rm = TRUE),
    aid_puan = rowMeans(across(aid1:aid5), na.rm = TRUE),
    dst_puan = rowMeans(across(dst1:dst5), na.rm = TRUE)
  )

Görev 1 - Birleştirme denetimi

Kod
okul <- read_csv(here("veri", "OKUL2026_okul.csv"))

birlesik <- ogrenci_v1 %>%
  left_join(okul, by = "okul_id")

# 1. satır sayısı
nrow(ogrenci_v1)
[1] 18000
Kod
nrow(birlesik)
[1] 18000
Kod
# 2. okul_id tekil mi
n_distinct(okul$okul_id) == nrow(okul)
[1] TRUE
Kod
# 3. okulu bulunamayan öğrenci
nrow(anti_join(ogrenci_v1, okul, by = "okul_id"))
[1] 0
  • Birleştirmeden önce ve sonra satır sayıları aynı.

  • Kod TRUE verdi okul dosyasında okul kimlikleri tekil.

  • Okulu bulunamayan herhangi bir öğrenci yok.

Görev 2 - Tek bir ters madde ne değiştirir?

Kod
cevrilmeden <- ogrenci_v1 %>%
  mutate(aid_puan = rowMeans(across(aid1:aid5), na.rm = TRUE))

cevrilerek <- ogrenci_v2   # aid_puan burada aid3 çevrilmiş hâliyle hesaplandı

tibble(
  hesaplama = c("aid3 çevrilmeden", "aid3 çevrilerek"),
  ortalama  = c(mean(cevrilmeden$aid_puan), mean(cevrilerek$aid_puan)),
  ss        = c(sd(cevrilmeden$aid_puan),   sd(cevrilerek$aid_puan)),
  r_mat     = c(cor(cevrilmeden$aid_puan, cevrilmeden$mat_puan),
                cor(cevrilerek$aid_puan,  cevrilerek$mat_puan))
)
# A tibble: 2 × 4
  hesaplama        ortalama    ss r_mat
  <chr>               <dbl> <dbl> <dbl>
1 aid3 çevrilmeden     2.99 0.676 0.168
2 aid3 çevrilerek      2.99 0.942 0.202
  • Ortalama değerlerine bakıldığında aid3’ü ters puanladığımızda ve puanlamadığımızda neredeyse aynı değerlere sahip. Hata fark edilemezdi. Korelasyon değerlerinde bir değişim olmakla birlikte standart sapmalarına baktığımızda farkın en net görüldüğü değer bu noktada.

Görev 3 - Uzun biçim

Kod
uzun <- birlesik %>%
  select(ogrenci_id, cinsiyet, donem1, donem2, donem3) %>%
  pivot_longer(
    cols      = starts_with("donem"),
    names_to  = "donem",
    values_to = "not"
  ) %>%
  mutate(donem = as.integer(str_remove(donem, "donem")))

uzun %>%
  group_by(donem, cinsiyet) %>%
  summarise(ort = mean(not), .groups = "drop") %>%
  pivot_wider(names_from = cinsiyet, values_from = ort) %>%
  mutate(fark = Kiz - Erkek)
# A tibble: 3 × 4
  donem   Kiz Erkek  fark
  <int> <dbl> <dbl> <dbl>
1     1  62.1  61.9 0.151
2     2  63.3  63.0 0.232
3     3  64.4  64.2 0.270
  • Üç dönemde de kızların ortalaması erkeklerden biraz yüksek, fark hep kızlar lehine aynı yönde. Fark ufak ufak büyüyor. 0,15’ten 0,23’e, sonra 0,27’ye. Yine de fark çok küçük.

Görev 4 - PISA’da okul bilgisi ve aidiyet puanı

Kod
library(haven)
pisa      <- readRDS(here("veri", "PISA2025_TR_stu.rds"))
pisa_okul <- readRDS(here("veri", "PISA2025_TR_sch.rds"))
Kod
pisa_birlesik <- pisa %>%
  left_join(pisa_okul, by = "CNTSCHID")

# 1. satır sayısı
nrow(pisa)
[1] 7702
Kod
nrow(pisa_birlesik)
[1] 7702
Kod
# 2. CNTSCHID okul dosyasında tekil mi
n_distinct(pisa_okul$CNTSCHID) == nrow(pisa_okul)
[1] TRUE
Kod
# 3. okulu bulunamayan öğrenci
anti_join(pisa, pisa_okul, by = "CNTSCHID")
# A tibble: 0 × 61
# ℹ 61 variables: CNTSCHID <chr>, CNTSTUID <chr>, W_FSTUWT <dbl>,
#   PROGN <chr+lbl>, ST004D01T <dbl+lbl>, ST001D01T <dbl>, AGE <dbl>,
#   IMMIG <dbl+lbl>, ST022Q01TA <dbl+lbl>, ESCS <dbl>, HISCED <dbl+lbl>,
#   ST255Q01JA <dbl+lbl>, REPEAT <dbl+lbl>, SKIPPING <dbl+lbl>,
#   EXPECEDU <dbl+lbl>, ST034Q01TA <dbl+lbl>, ST034Q02TA <dbl+lbl>,
#   ST034Q03TA <dbl+lbl>, ST034Q04TA <dbl+lbl>, ST034Q05TA <dbl+lbl>,
#   ST034Q06TA <dbl+lbl>, BELONG <dbl>, BULLIED <dbl>, TEACHSUP <dbl>, …
Kod
pisa_birlesik %>%
  group_by(okul_turu = as_factor(PRIVATESCH)) %>%
  summarise(
    okul = n_distinct(CNTSCHID),
    ogr  = n(),
    mat  = mean(PV1MATH)
  )
# A tibble: 2 × 4
  okul_turu  okul   ogr   mat
  <fct>     <int> <int> <dbl>
1 Public      178  6889  467.
2 Private      25   813  455.
  • Birleştirme kontrolleri yapıldı. Birleştirmeden önce ve sonra satır sayısı aynı. Okul dosyası tekil. Okulu bulunmayan öğrenci yok.

  • PISA’da devlet okullarının mat ortalaması (466,6) özel okullardan (454,9) yaklaşık 12 puan yüksek. Sonuç örneklemdeki öğrenciler için geçerli. Yalnızca PV1MATH kullandım.

Hatalı Çıktılar

Kod
deneme <- ogrenci %>%
  mutate(kaygi = rowMeans(across(kay1:kay6)))

cor(deneme$kaygi, deneme$mat_puan)
[1] -0.01751105
  1. Sonuç sıfıra yakın çıktı çünkü kaygı ölçeğindeki ters maddeler çevrilmeden ortalama hesaplanmış. Kaygılı bir öğrenci düz maddelere yüksek, ters maddelere düşük puan veriyor ve ikisi birbirini götürüyor. Bu yüzden matematik ile ilişkisi görünmüyor.

  2. Kod kitabından ters maddeler kontrol edilmeliydi. Standart sapmalara bakabilirdi.

  3. Korelasyon -0.33 çıkıyor. Kaygı ile matematik başarısı arasında negatif ve orta düzeyde bir ilişki var diyebiliriz.

    Kod
    cor(ogrenci_v2$kay_puan, ogrenci_v2$mat_puan)
    [1] -0.3294677