OLC731-ARASINAV

Soru-1:

Standart sapma R’da “sd()” fonksiyonu ile hesaplanır. Sizden beklenen (sd1) adlı kişisel bir fonksiyon oluşturmanız. Oluşturduğunuz fonksiyon örneklem için standart sapmayı aşağıdaki denkleme göre hesaplasın (“sd()” fonksiyonunu kullanmayınız). Oluşturduğunuz fonksiyona yuvarla isminde ondalık sayıları kaç ondalığa yuvarlayacağını belirten bir argüman tanımlayın ve bu argümanın olağan değeri 3 olsun. Fonksiyonu kendi ürettiğiniz üç farklı vektör üzerinde sd() fonksiyonu ile karşılaştırarak test ediniz. Kendiniz vektör oluştururken rep,seq,rnorm gibi fonksiyonlar kullanabilirsiniz.

Örneklem standart sapmasının (s) formülü aşağıdaki gibidir:

\[ s = \sqrt{\frac{\sum_{i=1}^{n} (x_i - \bar{x})^2}{\,n - 1\,}} \] Burada: \[\begin{align*} x_i &: \text{Veri setindeki her bir gözlem değeri} \\ \bar{x} &: \text{Veri setinin aritmetik ortalaması} \\ n &: \text{Örneklem büyüklüğü} \end{align*}\] anlamına gelmektedir.

Bu bölümde, örneklem için standart sapmayı sd() fonksiyonunu kullanmadan, verilen formül yardımıyla manuel olarak hesaplayan bir fonksiyon oluşturulacaktır.
Fonksiyonun adı sd1() olacak ve yuvarla isimli bir argümanla
ondalık sayıları belirli bir basamağa kadar yuvarlama özelliği bulunacaktır.
Varsayılan yuvarlama değeri 3’tür.

formülün oluşturulması

Aşağıdaki formül, örneklem standart sapmasını hesaplamak için kullanılan klasik tanımdır. Standart sapma, verilerin ortalama etrafında ne kadar saçıldığını gösteren bir değişkenlik ölçüsüdür.

\[ s = \sqrt{\frac{\sum_{i=1}^{n}(x_i - \bar{x})^2}{n - 1}} \]

Burada:
- \(x_i\): Her bir gözlem değeri
- \(\bar{x}\): Örneklem ortalaması
- \(n\): Örneklem büyüklüğü

fonksiyonun tanımlanması ve çalıştırılması

Fonksiyonu test etmek için rastgele üretilmiş vektörler kullanılmıştır. Bu sayede sd1() fonksiyonunun R’ın kendi sd() fonksiyonuyla benzer sonuçlar üretip üretmediği kontrol edilmiştir.

sd1 <- function(x, yuvarla = 3) {
  n <- length(x)                   # örneklem büyüklüğü
  x_ort <- mean(x)                 # ortalama
  fark_kare <- (x - x_ort)^2       # her bir farkın karesi
  s <- sqrt(sum(fark_kare) / (n - 1))  # formüle göre standart sapma
  return(round(s, yuvarla))        # yuvarlama işlemi
}

fonksiyonun test edilmesi

Aşağıda, oluşturulan sd1() fonksiyonunun farklı türde veri vektörleri üzerinde test edilmesi amaçlanmıştır. Her bir vektör farklı dağılım özellikleri taşıdığı için fonksiyonun genel geçerliliği kontrol edilir.

set.seed(123)  # Tekrarlanabilirlik için sabit tohum

# Normal dağılımlı rastgele veri
v1 <- rnorm(10, mean = 50, sd = 10)

# 1'den 20'ye kadar 2'şer artan sayılar
v2 <- seq(1, 20, by = 2)

# Tekrarlanan sabit değerler
v3 <- rep(c(3, 5, 7), times = 4)

karşılaştırma

Aşağıda her bir vektör için önce sd1() fonksiyonunun ürettiği standart sapma değeri, ardından R’ın kendi sd() fonksiyonunun ürettiği değer verilmiştir. Bu sayede oluşturulan fonksiyonun doğruluğu test edilir.

# v1 için
sd1(v1); sd(v1)
## [1] 9.538
## [1] 9.537841
# v2 için
sd1(v2); sd(v2)
## [1] 6.055
## [1] 6.055301
# v3 için
sd1(v3); sd(v3)
## [1] 1.706
## [1] 1.705606

Sonuçlar karşılaştırıldığında, sd1() fonksiyonunun R’ın kendi sd() fonksiyonu ile küçük yuvarlama farkları dışında aynı sonucu verdiği görülmektedir. Bu durum fonksiyonun doğru şekilde çalıştığını göstermektedir.

Soru-2:

Ölçmenin standart hatasının formülü aşağıdaki gibidir. Kullanıcı test toplam puanlarını vektör olarak girdiğinde ve test güvenirlik değerleri verildiğinde ölçmenin standart hatasını üç ondalıkla hesaplayan bir fonksiyon yazınız. Yazdığınız fonkisyonu aşağıdaki bir puan vektörü ve 0.90 güvenirlik değeri için test ediniz. Puanları kendiniz üretiniz ve nasıl ürettiğinizi açıklayınız.

Ölçmenin Standart Hatası ( ) formülü aşağıdaki gibidir:

\[ SE_m = s_x \sqrt{\,1 - r_{xx}\,} \]

Burada:

\(SE_m\) : Ölçmenin standart hatası

\(s_x\) : Test toplam puanlarının standart sapması

\(r_{xx}\) : Testin güvenirlik katsayısı

anlamına gelmektedir.

Bu bölümde, test toplam puanlarının standart sapması (sₓ) ve güvenirlik katsayısı (rₓₓ) kullanılarak ölçmenin standart hatası (SEₘ) hesaplanacaktır.
Formül aşağıda verilmiştir:

\[ SE_m = s_x \times \sqrt{1 - r_{xx}} \]

Fonksiyon üç ondalığa kadar yuvarlama yapacak biçimde oluşturulacaktır.

fonksiyonun tanımlanması

Aşağıdaki fonksiyon toplam puan vektörü ve güvenirlik katsayısını kullanarak sem değerini üç ondalık olacak şekilde hesaplar.

sem_fonksiyon <- function(x, rxx, yuvarla = 3) 
  {
  sx <- sd(x)                   # Test puanlarının standart sapması
  sem <- sx * sqrt(1 - rxx)     # Ölçmenin standart hatası formülü
  return(round(sem, yuvarla))   # Yuvarlanmış sonucu döndürme
}

test verisinin oluşturulması

Bu aşamada test toplam puanlarını temsil eden bir vektör oluşturulmuştur.

rnorm(30, mean = 70, sd = 10) fonksiyonu: 30 gözlem üretir, bu gözlemler normal dağılıma göre oluşturulur.

Not: Bu aşamada set.seed() fonksiyonunun bilgisayarın rastgele sayı üretim mekanizmasına verilen bir başlangıç değeri olduğunu öğrendim. Her çalıştığında rastgele farklı bir veri seti oluşturmaması adına set.seed() yazarak hep aynı puanları üretmesini sağladık.

set.seed(42)  # Tekrarlanabilirlik için sabit tohum
puanlar <- round(rnorm(30, mean = 70, sd = 10))  # 30 öğrencilik örneklem
head(puanlar)
## [1] 84 64 74 76 74 69

fonksiyonun test edilmesi

Güvenirlik katsayısı (rₓₓ) 0.90 olarak alınmıştır.

sem_fonksiyon(puanlar, rxx = 0.90)
## [1] 3.979

Soru-3:

200 gözlem ve 23 değişkeden oluşan “sinav_veri.csv” dosyasını okuyarak sinav_veri nesnesine atayınız. Değişkenler sırası ile öğrencilerin düzeyleri (1-4 arası), öğrencilerin bulundukları şubeler (A ve B olmak üzere), öğrencilerin cinsiyeti, öğrencilerin 20 maddeye verdikleri cevaplardan oluşmaktadır.

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Dosyanın okunması
sinav_veri <- read.csv("sinav_veri.csv", header = TRUE)

# Veri yapısının incelenmesi
str(sinav_veri)
## 'data.frame':    199 obs. of  1 variable:
##  $ X1.A.kiz.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0: chr  "1;A;kiz;0;0;1;1;0;0;1;1;1;1;0;1;0;0;0;1;0;1;0;0" "1;A;erkek;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1" "1;A;erkek;0;1;0;1;1;1;0;0;1;0;1;0;1;0;0;0;0;0;0;0" "1;A;kiz;0;0;1;1;0;1;1;1;0;0;1;1;1;1;0;1;0;1;1;1" ...
head(sinav_veri)
##    X1.A.kiz.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0
## 1   1;A;kiz;0;0;1;1;0;0;1;1;1;1;0;1;0;0;0;1;0;1;0;0
## 2 1;A;erkek;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1
## 3 1;A;erkek;0;1;0;1;1;1;0;0;1;0;1;0;1;0;0;0;0;0;0;0
## 4   1;A;kiz;0;0;1;1;0;1;1;1;0;0;1;1;1;1;0;1;0;1;1;1
## 5   1;B;kiz;0;0;0;0;0;1;0;0;0;1;0;0;1;1;0;0;1;0;0;0
## 6 1;B;erkek;0;0;0;0;0;1;1;1;0;0;0;0;0;0;1;0;0;0;0;0

sinav_veri.csv dosyası, değişkenlerin noktalı virgülle ayrıldığı bir formatta kaydedildiği için read.csv() fonksiyonu veriyi tek sütun hâlinde okumaktadır. Bu nedenle ; karakterini varsayılan ayraç olarak kabul eden read.csv2() fonksiyonu kullanılmıştır. Böylece veri seti doğru şekilde sütunlarına ayrılmıştır.

sinav_veri <- read.csv2("sinav_veri.csv", header = FALSE)
head(sinav_veri)
##   V1 V2    V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21
## 1  1  A   kiz  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0   0
## 2  1  A   kiz  0  0  1  1  0  0   1   1   1   1   0   1   0   0   0   1   0   1
## 3  1  A erkek  0  0  0  1  0  0   0   0   0   0   0   0   0   0   0   0   0   0
## 4  1  A erkek  0  1  0  1  1  1   0   0   1   0   1   0   1   0   0   0   0   0
## 5  1  A   kiz  0  0  1  1  0  1   1   1   0   0   1   1   1   1   0   1   0   1
## 6  1  B   kiz  0  0  0  0  0  1   0   0   0   1   0   0   1   1   0   0   1   0
##   V22 V23
## 1   1   0
## 2   0   0
## 3   0   1
## 4   0   0
## 5   1   1
## 6   0   0

a) sinav_veri nesnesinin değişkenlerini duzey, sube, cinsiyet ve madde_1’den madde_20’ye kadar isimlendiriniz.

Bu adımda veri setinde yer alan 23 sütun yeniden isimlendirilmiştir. İlk üç sütun öğrencilerin düzeyi, şubesi ve cinsiyetini; sonraki 20 sütun ise test maddelerine verilen cevapları temsil ettiği için paste0 () ile madde_1–madde_20 biçiminde yeniden adlandırılmıştır.

# Değişkenlerin İsimlendirilmesi
colnames(sinav_veri) <- c("duzey", "sube", "cinsiyet",
                           paste0("madde_", 1:20))
head(sinav_veri)
##   duzey sube cinsiyet madde_1 madde_2 madde_3 madde_4 madde_5 madde_6 madde_7
## 1     1    A      kiz       0       0       0       0       0       0       0
## 2     1    A      kiz       0       0       1       1       0       0       1
## 3     1    A    erkek       0       0       0       1       0       0       0
## 4     1    A    erkek       0       1       0       1       1       1       0
## 5     1    A      kiz       0       0       1       1       0       1       1
## 6     1    B      kiz       0       0       0       0       0       1       0
##   madde_8 madde_9 madde_10 madde_11 madde_12 madde_13 madde_14 madde_15
## 1       0       0        0        0        0        0        0        0
## 2       1       1        1        0        1        0        0        0
## 3       0       0        0        0        0        0        0        0
## 4       0       1        0        1        0        1        0        0
## 5       1       0        0        1        1        1        1        0
## 6       0       0        1        0        0        1        1        0
##   madde_16 madde_17 madde_18 madde_19 madde_20
## 1        0        0        0        1        0
## 2        1        0        1        0        0
## 3        0        0        0        0        1
## 4        0        0        0        0        0
## 5        1        0        1        1        1
## 6        0        1        0        0        0
names(sinav_veri)
##  [1] "duzey"    "sube"     "cinsiyet" "madde_1"  "madde_2"  "madde_3" 
##  [7] "madde_4"  "madde_5"  "madde_6"  "madde_7"  "madde_8"  "madde_9" 
## [13] "madde_10" "madde_11" "madde_12" "madde_13" "madde_14" "madde_15"
## [19] "madde_16" "madde_17" "madde_18" "madde_19" "madde_20"

b) sinav_veri nesnesinin ilk sütununa id isimde bir değişken ekleyip değerlerini id_1’den id_200’e kadar oluşturunuz.

id Değişkeninin Eklenmesi

Bu aşamada veri setinin başına id isimli bir değişken eklenecektir.
Bu değişkende her bireye "id_1"’den "id_200"’e kadar kimlik değerleri atanacaktır. paste0("id_", 1:nrow(sinav_veri)) komutu veri setindeki gözlem sayısını otomatik olarak algılar ve her gözleme sıralı biçimde bir kimlik değeri atar. cbind() ise yeni oluşturulan id değişkenini veri setinin en başına sütun olarak ekler.

# id değişkenini oluşturma
id <- paste0("id_", 1:nrow(sinav_veri))

# verinin ilk sütununa ekleme
sinav_veri <- cbind(id, sinav_veri)

# kontrol
head(sinav_veri)
##     id duzey sube cinsiyet madde_1 madde_2 madde_3 madde_4 madde_5 madde_6
## 1 id_1     1    A      kiz       0       0       0       0       0       0
## 2 id_2     1    A      kiz       0       0       1       1       0       0
## 3 id_3     1    A    erkek       0       0       0       1       0       0
## 4 id_4     1    A    erkek       0       1       0       1       1       1
## 5 id_5     1    A      kiz       0       0       1       1       0       1
## 6 id_6     1    B      kiz       0       0       0       0       0       1
##   madde_7 madde_8 madde_9 madde_10 madde_11 madde_12 madde_13 madde_14 madde_15
## 1       0       0       0        0        0        0        0        0        0
## 2       1       1       1        1        0        1        0        0        0
## 3       0       0       0        0        0        0        0        0        0
## 4       0       0       1        0        1        0        1        0        0
## 5       1       1       0        0        1        1        1        1        0
## 6       0       0       0        1        0        0        1        1        0
##   madde_16 madde_17 madde_18 madde_19 madde_20
## 1        0        0        0        1        0
## 2        1        0        1        0        0
## 3        0        0        0        0        1
## 4        0        0        0        0        0
## 5        1        0        1        1        1
## 6        0        1        0        0        0

c) Her bir birey için 20 maddeden toplam puan alarak “toplam” değişkeni veri setine sütun olarak ekleyiniz.

Toplam Puan Değişkeninin Eklenmesi

Bu adımda her bireyin testten aldığı toplam puan oluşturulmuştur. Veri setinde madde_1 ile madde_20 arasındaki sütunlar 0–1 puanlamasına sahip maddeleri temsil etmektedir. Bu maddelerin rowSums() fonksiyonu ile satır bazında toplanmasıyla bireyin testte elde ettiği toplam puan hesaplanmıştır.

# Toplam puanı hesaplama ve yeni sütun olarak ekleme
sinav_veri <- sinav_veri %>%
  mutate(toplam = rowSums(select(., starts_with("madde_"))))

# Kontrol
head(sinav_veri[, c("id", "toplam")])
##     id toplam
## 1 id_1      1
## 2 id_2      9
## 3 id_3      2
## 4 id_4      7
## 5 id_5     13
## 6 id_6      5

d) A ve B şubelerindeki kız ve erkek öğrencilerin toplam puanlarının ortalamalarını tek bir komutla hesaplayınız.

Bu bölümde A ve B şubelerindeki kız ve erkek öğrencilerin toplam puan ortalamaları tek bir komut içinde hesaplanmıştır. Hem group_by() hem de summarise() fonksiyonları birlikte kullanılarak ortalama puanlar elde edilmiştir.

ortalama_sonuc <- sinav_veri %>%
  group_by(sube, cinsiyet) %>%
  summarise(ortalama_toplam = mean(toplam))
## `summarise()` has grouped output by 'sube'. You can override using the
## `.groups` argument.
ortalama_sonuc
## # A tibble: 4 × 3
## # Groups:   sube [2]
##   sube  cinsiyet ortalama_toplam
##   <chr> <chr>              <dbl>
## 1 A     erkek               8.52
## 2 A     kiz                 8.64
## 3 B     erkek               9.84
## 4 B     kiz                10.9

e) Öğrencileri toplam puana göre 0 ile 6 arasını alt grup, 7 ile 12 arasını orta grup, 13 ile 20 arasını ise ust grup olacak şekilde gruplandırınız. Gruplama değişkeninize grup adını verip “sinav_order” nesnesine yeni bir sütun olarak ekleyiniz. Alt, orta ve ust grupta kaçar öğrenci yer almaktadır. Tek bir komutla hesaplayınız.

Öğrencilerin Toplam Puanlarına Göre Gruplandırılması

Bu aşamada öğrenciler toplam puanlarına göre üç kategoriye ayrılacaktır:

- Alt grup: 0–6 puan

- Orta grup: 7–12 puan

- Üst grup: 13–20 puan

Gruplandırma işlemi case_when() fonksiyonu ile yapılmış ve elde edilen grup bilgisi veri setine yeni bir sütun olarak eklenmiştir. Ardından her grubun kaç kişiden oluştuğu group_by() ve summarise() fonksiyonlarıyla tek bir komutta hesaplanmıştır.

# Gruplama değişkenini oluşturma ve sinav_order isimli yeni bir nesneye kaydetme
sinav_order <- sinav_veri %>%
  mutate(grup = case_when(
    toplam >= 0 & toplam <= 6 ~ "alt",
    toplam >= 7 & toplam <= 12 ~ "orta",
    toplam >= 13 & toplam <= 20 ~ "ust"
  ))

# Her gruptaki öğrenci sayısını bulma
grup_sayilari <- sinav_order %>%
  group_by(grup) %>%
  summarise(ogrenci_sayisi = n())

grup_sayilari
## # A tibble: 3 × 2
##   grup  ogrenci_sayisi
##   <chr>          <int>
## 1 alt               60
## 2 orta              86
## 3 ust               54

Sonuç olarak öğrencilerin %30’u (n=60) alt grupta, %43’ü (n=86) orta grupta ve %27’si (n=54) üst grupta yer almaktadır.

Soru-4:

Maddenin ayırt ediciliğinin göstergesi olarak madde puanları ve toplam puanlar arasındaki korelasyon katsayısı hesaplanabilir. İki kategorili puanlanan bir madde için ise değişkenlerden birisi iki kategorili olduğunda, Pearson momentler çarpımı korelasyon katsayısının özel bir durumu olarak kullanılan nokta çift-serili korelasyon katsayısından (point biserial correlation coefficient) veya çift-serili korelasyon katsayısından (biserial correlation coefficient) yararlanılabilir. Nokta çift-serili korelasyon katsayısı, iki kategorili değişken için gerçekte iki kategori söz konusu olduğu durumda kullanılır. Bir j maddesi için nokta çift serili korelasyon katsayısı (ρ_pbis) aşağıdaki formül aracılığıyla hesaplanabilir:

\[ \rho_{pbis} = \frac{\mu_{+} - \mu_{X}} {\sigma_{X}} \sqrt{\frac{p_j}{q_j}} \]

Burada,

\(\mu_{+}\) : Maddeyi doğru yanıtlayan bireylerin ortalama toplam test puanı

\(\mu_{X}\) : Tüm grup için ortalama toplam test puanı

\(\sigma_{X}\) : Tüm grubun toplam test puanlarının standart sapması

\(p_j\) : j maddesinin güçlüğü (maddeyi doğru yanıtlayanların oranı)

\(q_j = 1 - p_j\) : Maddeyi yanlış yanıtlayanların oranı

anlamına gelmektedir.

sinav_veri nesnesinde yer alan 20 maddenin (5*6)

a) tüm grup üzerinden madde ayırt edicilik indeksini (rj) verilen formüle göre hesaplayınız.

Aşağıdaki hesaplamalarda her bir maddenin ayırt ediciliğini ölçmek için nokta çift-serili korelasyon katsayısı (point-biserial correlation) kullanılmıştır. Bu katsayı, iki kategorili puanlanan maddeler için toplam puan ile madde puanı arasındaki ilişkiyi ifade eder.

Nokta cift-serili korelasyon katsayısı (ρₚbᵢₛ) formülü:

\[ ρ_{pbis} = \frac{(\mu_+ - \mu_X)}{σ_X} \times \sqrt{\frac{p_j}{q_j}} \]

Burada:
- \(\mu_+\): maddeyi doğru yanıtlayanların ortalama toplam puanı
- \(\mu_X\): tüm grubun ortalama toplam puanı
- \(σ_X\): toplam puanların standart sapması
- \(p_j\): madde güçlüğü (maddeyi doğru yanıtlayanların oranı)
- \(q_j = 1 - p_j\)

Bu formül her madde için aynı yapıyla hesaplanabildiğinden kod kısmında bir döngü kullanılarak 20 maddenin tamamı için otomatik hesaplama yapılmıştır.

# a) Tüm grup için nokta çift-serili korelasyon (manuel formülle)

# Boş bir vektör oluşturma (20 madde için)
rj_tum <- numeric(20)

# Tüm grup için ortalama ve sd
mu_X <- mean(sinav_veri$toplam)
sigma_X <- sd(sinav_veri$toplam)

# Döngü ile her madde için hesaplama
for (j in 1:20) {
madde <- sinav_veri[[paste0("madde_", j)]]

# Maddeyi doğru yanıtlayanların ortalama toplam puanı
mu_plus <- mean(sinav_veri$toplam[madde == 1])

# Madde güçlüğü (doğru yanıt oranı)
p_j <- mean(madde)
q_j <- 1 - p_j

# Nokta çift-serili korelasyon formülü
rj_tum[j] <- ((mu_plus - mu_X) / sigma_X) * sqrt(p_j / q_j)
}

# Sonuçları bir tabloya dönüştürme
rj_tum_df <- data.frame(
madde = paste0("madde_", 1:20),
rj_tum = round(rj_tum, 3)
)

rj_tum_df
##       madde rj_tum
## 1   madde_1  0.611
## 2   madde_2  0.553
## 3   madde_3  0.333
## 4   madde_4  0.525
## 5   madde_5  0.465
## 6   madde_6  0.344
## 7   madde_7  0.542
## 8   madde_8  0.455
## 9   madde_9  0.385
## 10 madde_10  0.378
## 11 madde_11  0.588
## 12 madde_12  0.603
## 13 madde_13  0.362
## 14 madde_14  0.595
## 15 madde_15  0.351
## 16 madde_16  0.269
## 17 madde_17  0.547
## 18 madde_18  0.478
## 19 madde_19  0.430
## 20 madde_20  0.502

Değerlerin yorumlanmasında aşağıdaki ölçütler kullanılır:

0.40 ve üzeri : çok iyi ayırt edicilik

0.30–0.39 : iyi

0.20–0.29 : orta

0.19 ve altı : zayıf

Maddelerin büyük çoğunluğunun ayırt edicilik değeri 0.40 üzerinde olduğunda oldukça iyi ayırt edicilik gösterdiği söylenebilir.

madde_3, madde_6, madde_9, madde_10, madde_13 ve madde_15 iyi düzeyde;

madde_16 (0.269) orta düzeydedir.

b) kiz ve erkek öğrenciler için madde ayırt edicilik indeksini (rj) verilen formüle göre hesaplayınız.

Bu bölümde nokta çift-serili korelasyon katsayısı (ρₚbᵢₛ) aynı formül kullanılarak kız ve erkek öğrenciler için ayrı ayrı hesaplanmıştır. Maddelerin ayırt edicilik özelliklerinin cinsiyet grupları arasında farklılık gösterip göstermediğini incelemek için hesaplamalar, a şıkkında tanımlanan formülün her iki alt grup için uygulanmasıyla yapılmıştır. Bu formül her madde için aynı yapıda hesaplandığından, işlemi tekrarlamamak adına bir yardımcı fonksiyon (hesapla_rj) kullanılmıştır. Fonksiyon, kendisine verilen alt grup (kızlar veya erkekler) üzerinde 20 maddenin tamamı için ayırt edicilik katsayılarını üretir.

# cinsiyet düzeylerine göre boş veri çerçevesi oluşturma
rj_cinsiyet <- data.frame(
madde = paste0("madde_", 1:20),
kiz = NA,
erkek = NA
)

# Fonksiyonu tanımlama
hesapla_rj <- function(veri){
mu_X <- mean(veri$toplam)
sigma_X <- sd(veri$toplam)
sapply(1:20, function(j){
madde <- veri[[paste0("madde_", j)]]
mu_plus <- mean(veri$toplam[madde == 1])
p_j <- mean(madde)
q_j <- 1 - p_j
((mu_plus - mu_X) / sigma_X) * sqrt(p_j / q_j)
})
}

# Kızlar ve erkekler için ayrı ayrı hesaplama
rj_cinsiyet$kiz <- round(hesapla_rj(filter(sinav_veri, cinsiyet == "kiz")), 3)
rj_cinsiyet$erkek <- round(hesapla_rj(filter(sinav_veri, cinsiyet == "erkek")), 3)

rj_cinsiyet
##       madde   kiz erkek
## 1   madde_1 0.587 0.633
## 2   madde_2 0.650 0.475
## 3   madde_3 0.272 0.396
## 4   madde_4 0.579 0.467
## 5   madde_5 0.532 0.405
## 6   madde_6 0.400 0.282
## 7   madde_7 0.591 0.488
## 8   madde_8 0.475 0.428
## 9   madde_9 0.361 0.422
## 10 madde_10 0.367 0.415
## 11 madde_11 0.700 0.443
## 12 madde_12 0.614 0.587
## 13 madde_13 0.386 0.358
## 14 madde_14 0.642 0.559
## 15 madde_15 0.417 0.254
## 16 madde_16 0.266 0.258
## 17 madde_17 0.546 0.547
## 18 madde_18 0.567 0.369
## 19 madde_19 0.401 0.463
## 20 madde_20 0.562 0.434

c) ilk iki seçenekte yaptığınız işlemler CTT paketinin ilgili fonksiyonlarını kullanarak hesaplayınız.

NOT : CTT paketi düzeltilmiş nokta çift-serili korelasyon katsayısı hesapladığı için sonuçlar aynı çıkmayacaktır.

Aynı analiz bu bölümde CTT paketinin itemAnalysis() fonksiyonu kullanılarak yapılmıştır.CTT paketindeki itemAnalysis() fonksiyonu madde ayırt ediciliği ve madde güçlüğünü otomatik olarak hesaplar. itemAnalysis() fonksiyonu düzeltilmiş nokta çift-serili korelasyon katsayısı hesaplamaktadır. Bu nedenle manuel olarak hesapladığımız değerlerle tam olarak aynı sonuçlar elde edilmez çünkü düzeltilmiş korelasyonlar toplam puandan madde puanı çıkartılarak hesaplanır ve bu işlem katsayının değişmesine yol açabilir dolayısıyla sonuçlar küçük farklar gösterebilir.

library(CTT)

# CTT analizine uygun şekilde yalnızca madde sütunlarının seçilmesi
madde_veri <- sinav_veri %>% select(starts_with("madde_"))

# itemAnalysis 
ctt_sonuc <- itemAnalysis(madde_veri)

# Madde ayırt edicilik değerleri (r.drop) ve güçlük (p)
names(ctt_sonuc$itemReport)
## [1] "itemName"       "itemMean"       "pBis"           "bis"           
## [5] "alphaIfDeleted"
# CTT sonuçlarının ilgili sütunlarını görüntüleme
ctt_sonuc$itemReport[, c("itemName", "itemMean", "pBis")]
##    itemName itemMean      pBis
## 1   madde_1     0.47 0.5354616
## 2   madde_2     0.53 0.4707659
## 3   madde_3     0.55 0.2299700
## 4   madde_4     0.36 0.4430028
## 5   madde_5     0.37 0.3759047
## 6   madde_6     0.82 0.2667077
## 7   madde_7     0.71 0.4664061
## 8   madde_8     0.57 0.3627846
## 9   madde_9     0.30 0.2945506
## 10 madde_10     0.52 0.2775098
## 11 madde_11     0.40 0.5108272
## 12 madde_12     0.58 0.5274432
## 13 madde_13     0.62 0.2640013
## 14 madde_14     0.52 0.5175262
## 15 madde_15     0.38 0.2519119
## 16 madde_16     0.32 0.1701400
## 17 madde_17     0.41 0.4648960
## 18 madde_18     0.32 0.3938428
## 19 madde_19     0.33 0.3402452
## 20 madde_20     0.40 0.4147055

CTT paketinden elde edilen itemMean değerleri, maddelerin doğru cevaplanma oranını (madde güçlüğünü) gösterirken,
pBis sütunundaki değerler maddelerin ayırt ediciliğini (nokta çift-serili korelasyon) göstermektedir.
Manuel hesaplamalarla elde edilen değerlerle küçük farklar bulunması beklenir, çünkü CTT paketi düzeltilmiş korelasyon kullanır.

pBis değerleri genel olarak orta ile yüksek aralıklarda olup maddelerin büyük kısmının iyi ayırt edicilik gösterdiğini doğrulamaktadır. Özellikle madde_1, madde_11, madde_12, madde_14 yüksek ayırt edicilik katsayılarına sahiptir. En düşük ayırt edicilik madde_16 (0.170) için bulunmuştur; bu madde hem manuel hesaplamada hem CTT’de düşük ayırt edicilik göstermektedir.

Soru-5:

34 bireye bir testin A ve B formları uygulanmıştır. A ve B formlarında yer alan sorular aynı olmakla birlikte, soru numaraları farklıdır. Soru numaraları karşılıkları aşağıda verilmiştir.  Örneğin A kitapçığındaki birinci soru, b kitapçığında 2. soru olarak verilmiştir. (15p)

A B
1 2
2 3
3 1
4 5
5 6
6 7
7 8
8 4
9 9
10 11
11 10

FORMAB.xlsx dosyasında her iki kitapçık türünün cevap anahtarı bireylerin idleri, aldıkları kitapçık türleri ve 11 maddeye verdikleri cevaplar yer almaktadır. Sizden istenilen B kitapçığını alan kişilerin madde cevaplarını A kitapçığına dönüştürerek (dplyr paket fonksiyonlarını kullanabilirsiniz), 34 bireyin hepsini A kitapçığını almış gibi veri dosyasını kaydetmenizdir. (20 puan)

Bu soruda A ve B kitapçıklarında yer alan maddeler farklı sırada olduğu için, önce B formunu A formundaki madde sırasına uyarlamak gereklidir. Böylece tüm öğrencilerin yanıtları aynı biçimde (A formu gibi) düzenlenebilir ve analiz edilebilir. Ardından 1-0 puanlaması yapılıp madde güçlüğü hesaplanacaktır.

a) Bireylerin puanlarını A kitapçığının cevap anahtarını kullanarak 1-0 dönüştürünüz.  FORMAB-10 adı ile “.csv” uzantılı olacak şekilde kaydediniz. (CTT ve ya dplyr paket fonksiyonlarını kullanabilirsiniz).

Verinin Okunması

Bu kısımda şöyle bir hata verdi.

in filter(): ℹ In argument: kitapcik == "B". Caused by error: ! object ‘kitapcik’ not found Run rlang::last_trace() to see where the error occurred.

Veri setini kontrol ettiğimde ilk iki satırı, verinin parçası değil de sütun isimleri gibi okuduğunu fark ettim. Dolayısıyla kitapcik sütununu bulamıyordu. 2 satır atlaması için skip=2 yazdım.

library(readxl)
library (dplyr)


FORMAB <- read_excel("FORMAB.xlsx", skip = 2)
names (FORMAB)
##  [1] "id"       "kitapcik" "m1"       "m2"       "m3"       "m4"      
##  [7] "m5"       "m6"       "m7"       "m8"       "m9"       "m10"     
## [13] "m11"
head (FORMAB)
## # A tibble: 6 × 13
##   id    kitapcik m1    m2    m3    m4    m5    m6    m7    m8    m9    m10  
##   <chr> <chr>    <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 id1   B        C     B     D     B     A     E     E     D     A     E    
## 2 id2   B        C     B     D     B     A     B     E     D     A     E    
## 3 id3   A        B     D     C     A     E     E     E     B     A     E    
## 4 id4   A        E     D     C     E     E     E     D     B     A     E    
## 5 id5   A        B     D     C     A     E     E     E     B     A     C    
## 6 id6   B        C     B     D     B     A     E     E     B     A     E    
## # ℹ 1 more variable: m11 <chr>
# Soru eşleştirme
eslestirme <- c(2, 3, 1, 5, 6, 7, 8, 4, 9, 11, 10)

B Formundaki Soru Numaralarını A Formuna Dönüştürme

Bu aşamada B kitapçığını alan bireylerin madde yanıtları, A kitapçığındaki madde sırasına dönüştürülmüştür. Analizin tek bir ortak form üzerinden yürütülebilmesi için B formu yeniden düzenlenmelidir.

# B formunu A form sırasına göre yeniden adlandırma
FORMAB_B <- FORMAB %>%
filter( kitapcik == "B") %>%
mutate(across(starts_with("m"), as.character)) %>%
select(id, kitapcik, all_of(paste0("m", eslestirme)))

# Yeni sütun adlarını A formuna göre düzenle
colnames(FORMAB_B)[3:13] <- paste0("m", 1:11)

# A formundakileri olduğu gibi alma
FORMAB_A <- FORMAB %>% 
  filter(kitapcik == "A")

# İki formu birleştirme
FORMAB_son <- bind_rows(FORMAB_A, FORMAB_B)

paste0("m", eslestirme) ifadesi B formundaki maddelerin A formunda karşılık geldiği sırayı oluşturur. select() bu sırayı kullanarak B formunu yeniden düzenler. colnames(FORMAB_B)[3:13] <- paste0("m", 1:11) ile maddeler yeni dizilişe göre A formunun adlarını alır. Son adımda A formu + dönüştürülmüş B formu birleşerek herkes A formunu çözmüş gibi tek bir veri seti oluşur.

1–0 Puanlaması ve CSV Kaydı

Bu aşamada A formuna dönüştürülmüş cevaplar, verilen cevap anahtarına göre 1–0 puanlamasına dönüştürülmüştür. Her madde için:

Cevap anahtarı ile aynı seçenek verilmişse 1,

Yanlışsa 0 puan atanmıştır.

# Cevap anahtarını tanımlama
cevap_anahtari <- c("B", "C", "D", "A", "B", "A", "E", "E", "D", "A", "E")

# Her bireyin cevaplarını 1–0 olarak puanlama
puanlanmis <- FORMAB_son %>%
  mutate(across(starts_with("m"),
                ~ ifelse(.x == cevap_anahtari[as.numeric(gsub("m", "", cur_column()))], 1, 0)))

# CSV olarak kaydetme
write.csv(puanlanmis, "FORMAB-10.csv", row.names = FALSE)

gsub("m", "", cur_column()) sütun adındaki “m” harfini kaldırır ve madde numarasını çıkarır. Örneğin “m3” - “3” olur. Bu sayı cevap anahtarındaki ilgili maddeyi seçmek için kullanılır. ifelse(.x == doğru_cevap, 1, 0) ile puanlama yapılır. Son olarak sonuçlar “FORMAB-10.csv” dosyasına kaydedilmiş olur.

b) Son olarak her bir maddenin doğru cevaplanma oranını/madde güçlüğünü hesaplayınız. (34 kişi üzerinden)

Madde güçlüğü, bir maddenin doğru cevaplanma oranıdır (doğru sayısı / toplam kişi sayısı).

madde_gucluk <- colMeans(select(puanlanmis, starts_with("m")), na.rm = TRUE)
madde_gucluk_df <- data.frame(
madde = names(madde_gucluk),
gucluk = round(madde_gucluk, 3)
)

madde_gucluk_df
##     madde gucluk
## m1     m1  0.909
## m2     m2  0.000
## m3     m3  0.000
## m4     m4  0.941
## m5     m5  0.029
## m6     m6  0.000
## m7     m7  0.138
## m8     m8  0.000
## m9     m9  0.000
## m10   m10  0.000
## m11   m11  0.970

Soru-6:

pisa2015.csv dosyasını okuyunuz. Okuduğunuz dosyanın ST001D01T:ST129Q08TA arasındaki değişkenler ve PV1SCIE (fen okuryazarlık) değişkeninden oluşan yeni bir veri seti oluşturunuz.

# Öncelikle gerekli tüm paketleri aktifleştiriyoruz.
library(dplyr)
library (tibble)
library(readr)
library(ggplot2)
# veri okuma ve alt veri seti oluşturma
pisa2015 <- read_csv("pisa2015.csv")
## New names:
## Rows: 5895 Columns: 223
## ── Column specification
## ──────────────────────────────────────────────────────── Delimiter: "," chr
## (2): CNT, STRATUM dbl (221): ...1, CNTRYID, CNTSCHID, CNTSTUID, BOOKID,
## W_FSTUWT, W_FSTURWT1, ...
## ℹ Use `spec()` to retrieve the full column specification for this data. ℹ
## Specify the column types or set `show_col_types = FALSE` to quiet this message.
## • `` -> `...1`
head (pisa2015)
## # A tibble: 6 × 223
##    ...1 CNT   CNTRYID CNTSCHID CNTSTUID BOOKID W_FSTUWT W_FSTURWT1 W_FSTURWT2
##   <dbl> <chr>   <dbl>    <dbl>    <dbl>  <dbl>    <dbl>      <dbl>      <dbl>
## 1     1 TUR       792 79200001 79200939     31     193.       290.       296.
## 2     2 TUR       792 79200001 79206774     96     193.       290.       296.
## 3     3 TUR       792 79200001 79204670     43     193.       290.       296.
## 4     4 TUR       792 79200001 79201647     32     193.       290.       296.
## 5     5 TUR       792 79200001 79203718     89     193.       290.       296.
## 6     6 TUR       792 79200001 79204968     91     193.       290.       296.
## # ℹ 214 more variables: W_FSTURWT3 <dbl>, W_FSTURWT4 <dbl>, W_FSTURWT5 <dbl>,
## #   W_FSTURWT6 <dbl>, W_FSTURWT7 <dbl>, W_FSTURWT8 <dbl>, W_FSTURWT9 <dbl>,
## #   W_FSTURWT10 <dbl>, W_FSTURWT11 <dbl>, W_FSTURWT12 <dbl>, W_FSTURWT13 <dbl>,
## #   W_FSTURWT14 <dbl>, W_FSTURWT15 <dbl>, W_FSTURWT16 <dbl>, W_FSTURWT17 <dbl>,
## #   W_FSTURWT18 <dbl>, W_FSTURWT19 <dbl>, W_FSTURWT20 <dbl>, W_FSTURWT21 <dbl>,
## #   W_FSTURWT22 <dbl>, W_FSTURWT23 <dbl>, W_FSTURWT24 <dbl>, W_FSTURWT25 <dbl>,
## #   W_FSTURWT26 <dbl>, W_FSTURWT27 <dbl>, W_FSTURWT28 <dbl>, …
# İstenen değişken aralığını ve PV1SCIE'yi seçme
pisa_sel <- pisa2015 %>%
select(ST001D01T:ST129Q08TA, PV1SCIE, ESCS, MISCED, FISCED, STRATUM, ST004D01T)

Bu soruda PISA 2015 veri setinden belirli değişkenler seçilerek yeni bir çalışma nesnesi oluşturulmuştur. Veri ilk olarak read_csv() fonksiyonu ile okunmuştur. Daha sonra yönergede belirtilen şekilde ST001D01T–ST129Q08TA arasındaki tüm maddeler ile fen okuryazarlığını temsil eden PV1SCIE değişkeni seçilmiştir. Ayrıca sosyo-ekonomik düzey (ESCS), anne eğitimi (MISCED), baba eğitimi (FISCED), bölge bilgileri (STRATUM) ve cinsiyet (ST004D01T)… değişkenleri de analize dahil edilmiştir.

a) Oluşturduğunuz nesnede ST094 ile başlayan maddelerin türünü numeric’ten factor’e dönüştürünüz. Faktör düzeylerini 1-4’den “Kesinlikle katılmıyorum”, “Katılmıyorum”, “Katılıyorum”, ”Kesinlikle katılıyorum” olacak şekilde yeniden isimlendiriniz.

Bu adımda ST094 ile başlayan tüm maddeler sayısal (numeric) yapıdan çıkarılarak kategori değişkenine (factor) dönüştürülmüştür.

pisa_sel <- pisa_sel %>%
mutate(across(starts_with("ST094"),
~ factor(.x,
levels = 1:4,
labels = c("Kesinlikle katılmıyorum",
"Katılmıyorum",
"Katılıyorum",
"Kesinlikle katılıyorum"))))

b) Oluşturduğunuz nesnedeki değişkenleri Türkçe değişken isimleri ile değiştiriniz. (dplyr paketi rename ve varyasyonlarını kullanınız. Tüm değişken isimlerini büyük harflerden oluşturunuz. Değişken adları aşağıda yer alan tabloda bulunmaktadır.

Orijinal değişken Türkçe adı
ST001D01T ÖĞRENCİ_ID
ST004D01T CİNSİYET
STRATUM BÖLGE
MISCED ANNE_EĞİTİMİ
FISCED BABA_EĞİTİMİ
IMMIG GÖÇMEN_DURUMU
LANGN EVDE_KONUŞULAN_DİL
ESCS SOSYO_EKONOMİK_DÜZEY
JOYSCIE FEN_KEYİFİ
SCIEEFF FEN ÖZYETERLİK
ST094Q01NA–ST094Q05NA (Likert maddeleri)
ST129Q01TA–ST129Q08TA (Okul algısı maddeleri)
PV1SCIE FEN_OKURYAZARLIK

Bu adımda PISA veri setindeki değişkenler yeniden isimlendirilmiştir. dplyr paketinin rename() fonksiyonu her bir değişkene yeni ad atamak için kullanılmıştır. Ek olarak maddelerin bulunduğu ST094 ve ST129 serisindeki değişkenler Likert tipi ifadeleri temsil ettikleri için aynı isimleri korunmuş; yalnızca diğer temel değişkenler Türkçeleştirilmiştir.

pisa2015_tr <- pisa_sel %>%
  rename(
    OGRENCI_ID           = ST001D01T,
    CINSIYET             = ST004D01T,
    BOLGE                = STRATUM,
    ANNE_EGITIMI         = MISCED,
    BABA_EGITIMI         = FISCED,
    GOCMEN_DURUMU        = IMMIG,
    EVDE_KONUSULAN_DIL   = LANGN,
    SOSYO_EKONOMIK_DUZEY = ESCS,
    FEN_KEYFI            = JOYSCIE,
    FEN_OZ_YETERLIK      = SCIEEFF,
    FEN_OKURYAZARLIK     = PV1SCIE  
  )

c) STRATUM BOLGE değişkenin değerleri aşağıdaki tablodaki gibidir. Değişkenin 36 değeri bulunmaktadır. Ancak bu değişken içerisinde tanımlı 12 bölge bulunmaktadır. 36 kategorili değişkeni kullanılarak 12 kategorili BOLGE2 değişkeni düzeyleri ile oluşturunuz.

Bu adımda doğrusal olmayan bu eşleşmeyi kolaylaştırmak için bir lookup tablosu (bolge_lookup) oluşturulmuş ve left_join() ile ana veri setine yeni bir değişken olarak eklenmiştir.

# STRATUM - 12 Bölge eşlemesi
bolge_lookup <- tribble(
  ~BOLGE,        ~BOLGE2,
  "TUR0101",     "TR1_ISTANBUL",
  "TUR0102",     "TR1_ISTANBUL",
  "TUR0103",     "TR1_ISTANBUL",
  
  "TUR0104",     "TR2_BATI_MARMARA",
  "TUR0105",     "TR2_BATI_MARMARA",
  "TUR0106",     "TR2_BATI_MARMARA",
  
  "TUR0107",     "TR3_EGE",
  "TUR0108",     "TR3_EGE",
  "TUR0109",     "TR3_EGE",
  
  "TUR0110",     "TR4_DOGU_MARMARA",
  "TUR0111",     "TR4_DOGU_MARMARA",
  "TUR0112",     "TR4_DOGU_MARMARA",
  
  "TUR0213",     "TR5_BATI_ANADOLU",
  "TUR0214",     "TR5_BATI_ANADOLU",
  "TUR0215",     "TR5_BATI_ANADOLU",
  
  "TUR0216",     "TR6_AKDENIZ",
  "TUR0217",     "TR6_AKDENIZ",
  "TUR0218",     "TR6_AKDENIZ",
  
  "TUR0219",     "TR7_ORTA_ANADOLU",
  "TUR0220",     "TR7_ORTA_ANADOLU",
  "TUR0221",     "TR7_ORTA_ANADOLU",
  
  "TUR0222",     "TR8_BATI_KARADENIZ",
  "TUR0223",     "TR8_BATI_KARADENIZ",
  "TUR0224",     "TR8_BATI_KARADENIZ",
  
  "TUR0225",     "TR9_DOGU_KARADENIZ",
  "TUR0226",     "TR9_DOGU_KARADENIZ",
  "TUR0227",     "TR9_DOGU_KARADENIZ",
  
  "TUR0228",     "TRA_KUZEYDOGU_ANADOLU",
  "TUR0229",     "TRA_KUZEYDOGU_ANADOLU",
  "TUR0230",     "TRA_KUZEYDOGU_ANADOLU",
  
  "TUR0231",     "TRB_ORTADOGU_ANADOLU",
  "TUR0232",     "TRB_ORTADOGU_ANADOLU",
  "TUR0233",     "TRB_ORTADOGU_ANADOLU",
  
  "TUR0234",     "TRC_GUNEYDOGU_ANADOLU",
  "TUR0235",     "TRC_GUNEYDOGU_ANADOLU",
  "TUR0236",     "TRC_GUNEYDOGU_ANADOLU"
)

# Orjinal veri setine ekleme
pisa2015_tr <- pisa2015_tr %>%
  left_join(bolge_lookup, by = "BOLGE")

d) CINSIYET değişkenini kullanarak, öğrencilerin FEN_OKURYAZARLIK (PV1SCIE) puanlarının dağılımını gösteren bir kutu grafiği (Box Plot) oluşturunuz. Her bir kutu grafiğine ek olarak, ortalama fen okuryazarlık puanını gösteren bir nokta ekleyiniz.

Bu aşamada öğrencilerin fen okuryazarlık düzeylerinin (PV1SCIE) cinsiyete göre nasıl dağıldığını incelemek amacıyla bir boxplot oluşturulmuştur. Öncelikle cinsiyet değişkeni 1 ve 2 kodlarından çıkarılarak “Kız” ve “Erkek” etiketleriyle faktör değişkene dönüştürülmüştür. Kutu grafiği her grubun dağılımını gösterirken, her kutunun üzerine yerleştirilen nokta o gruptaki ortalama fen okuryazarlık puanını temsil etmektedir. Grafikle ilgili biçimsel düzenlemeler de bu aşamada yapılmıştır.

# Cinsiyet değişkenini faktör olarak ekleme 
pisa2015_tr <- pisa2015_tr %>%
  mutate(CINSIYET = factor(CINSIYET,
                           levels = c(1, 2),
                           labels = c("Kız", "Erkek")))

# Boxplot + ortalama noktası
ggplot(pisa2015_tr, aes(x = CINSIYET, y = FEN_OKURYAZARLIK)) +
  geom_boxplot(fill = "#e0eee0", alpha = 0.7) +
  stat_summary(fun = mean,
               geom = "point",
               shape = 21,
               size = 3.5,
               fill = "#228b22",
               color = "black") +
  labs(
    x = "Cinsiyet",
    y = "Fen Okuryazarlık Puanı (PV1SCIE)",
    title = "Cinsiyete Göre Fen Okuryazarlık Puanlarının Dağılımı"
  ) +
  theme_minimal(base_size = 11)

e) BOLGE2 değişkenini kullanarak, her bir bölgenin ortalama FEN_OKURYAZARLIK (PV1SCIE) puanını hesaplayınız. Bu ortalamaları büyükten küçüğe sıralayarak gösteren ve bölgeleri X ekseninde, ortalama puanı Y ekseninde gösteren bir çubuk grafiği (Bar Plot) oluşturunuz.

Bu adımda öğrencilerin fen okuryazarlık puanlarının (PV1SCIE), oluşturulan BOLGE2 değişkenine göre nasıl farklılaştığı incelenmektedir. İlk olarak her bölgenin ortalama fen okuryazarlık puanı group_by() ve summarise() fonksiyonlarıyla hesaplanmış, ardından bu ortalamalar büyükten küçüğe sıralanmıştır. Elde edilen sonuçlar bir çubuk grafik (bar plot) ile görselleştirilmiştir. Grafikte bölgeler X ekseninde, ortalama fen okuryazarlık puanları ise Y ekseninde yer almaktadır.

# Her bölgenin ortalama FEN_OKURYAZARLIK puanı
bolge2_ort <- pisa2015_tr %>%
  group_by(BOLGE2) %>%
  summarise(ORT_FEN = mean(FEN_OKURYAZARLIK, na.rm = TRUE)) %>%
  arrange(desc(ORT_FEN))
bolge2_ort     
## # A tibble: 12 × 2
##    BOLGE2                ORT_FEN
##    <chr>                   <dbl>
##  1 TR2_BATI_MARMARA         438.
##  2 TR3_EGE                  437.
##  3 TR5_BATI_ANADOLU         435.
##  4 TR1_ISTANBUL             434.
##  5 TR6_AKDENIZ              433.
##  6 TR4_DOGU_MARMARA         430.
##  7 TR7_ORTA_ANADOLU         416.
##  8 TR8_BATI_KARADENIZ       412.
##  9 TR9_DOGU_KARADENIZ       409.
## 10 TRA_KUZEYDOGU_ANADOLU    404.
## 11 TRC_GUNEYDOGU_ANADOLU    388.
## 12 TRB_ORTADOGU_ANADOLU     382.
ggplot(bolge2_ort, aes(x = reorder(BOLGE2, ORT_FEN), y = ORT_FEN)) +
  geom_col(fill = "#e0eee0") +
  labs(
    x = "Bölge",
    y = "Ortalama Fen Okuryazarlık (PV1SCIE)",
    title = "BÖLGE2'ye Göre Ortalama Fen Okuryazarlık Puanları"
  ) +
  theme_minimal(base_size = 9) +
   theme(axis.text.x = element_text(angle = 45, hjust = 1)) # yazıların okunaklı olması için

f) FEN_OKURYAZARLIK (PV1SCIE) ile SOSYO_EKONOMIK_DUZEY (ESCS) değişkenleri arasındaki Pearson korelasyon katsayısını hesaplayınız. Ayrıca, bu iki değişken ve ANNE_EGITIMI (MISCED) ile BABA_EGITIMI (FISCED) değişkenlerini de içeren bir korelasyon matrisi oluşturup bu matrisi yuvarlayarak gösteriniz.

Bu bölümde, öğrencilerin fen okuryazarlık puanları (PV1SCIE) ile sosyo-ekonomik düzeyleri (ESCS) arasındaki ilişki Pearson korelasyon katsayısı ile incelenmiştir. Pearson korelasyonu doğrusal ilişkiyi ölçen bir katsayıdır ve -1 ile +1 arasında değer alır.

# Pearson korelasyonu: cor () yerine cor.test () kullanarak katsayının yanında p-değerini, güven aralığını ve test istatistiğini de elde ettik
cor_test_sonuc <- cor.test(
  pisa2015_tr$FEN_OKURYAZARLIK,
  pisa2015_tr$SOSYO_EKONOMIK_DUZEY,
  method = "pearson",
  use = "pairwise.complete.obs" # eksik veriler için
)

cor_test_sonuc
## 
##  Pearson's product-moment correlation
## 
## data:  pisa2015_tr$FEN_OKURYAZARLIK and pisa2015_tr$SOSYO_EKONOMIK_DUZEY
## t = 23.153, df = 5857, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.2659325 0.3128542
## sample estimates:
##       cor 
## 0.2895673

Elde edilen Pearson korelasyon katsayısına göre fen okuryazarlık puanı ile sosyo-ekonomik düzey arasındaki ilişki 0.29’dur. Bu değer pozitif yönlü ve orta düzeyin altında bir ilişki olduğunu gösterir. Sosyo-ekonomik düzey arttıkça fen okuryazarlık puanlarının da yükselme eğiliminde olduğu ancak ilişkinin çok güçlü olmadığı anlaşılmaktadır.

4 Değişkenlik Korelasyon Matrisi için Kullanılacak değişkenler:

  • FEN_OKURYAZARLIK

  • SOSYO_EKONOMIK_DUZEY

  • ANNE_EGITIMI

  • BABA_EGITIMI

# Seçili dört değişkeni bir matrise dönüştürme
kor_mat <- pisa2015_tr %>%
  select(FEN_OKURYAZARLIK,
         SOSYO_EKONOMIK_DUZEY,
         ANNE_EGITIMI,
         BABA_EGITIMI) %>%
  cor(use = "pairwise.complete.obs")

# Yuvarlanmış hâli
round(kor_mat, 3)
##                      FEN_OKURYAZARLIK SOSYO_EKONOMIK_DUZEY ANNE_EGITIMI
## FEN_OKURYAZARLIK                1.000                0.290        0.099
## SOSYO_EKONOMIK_DUZEY            0.290                1.000        0.662
## ANNE_EGITIMI                    0.099                0.662        1.000
## BABA_EGITIMI                    0.170                0.778        0.560
##                      BABA_EGITIMI
## FEN_OKURYAZARLIK            0.170
## SOSYO_EKONOMIK_DUZEY        0.778
## ANNE_EGITIMI                0.560
## BABA_EGITIMI                1.000

Dört değişkenlik korelasyon matrisi ise bu ilişkinin daha geniş formunu ortaya koymaktadır: SOSYO_EKONOMIK_DUZEY, ANNE_EGITIMI (0.662) ve BABA_EGITIMI (0.778) ile yüksek düzeyde ilişkilidir. Bu durum sosyo-ekonomik düzeyin büyük ölçüde ebeveyn eğitim düzeyiyle bağlantılı olduğunu gösterir.

FEN_OKURYAZARLIK, ANNE_EGITIMI (0.099) ve BABA_EGITIMI (0.170) ile düşük düzeyde pozitif ilişki göstermektedir. Ebeveyn eğitim düzeyi arttıkça öğrencinin fen performansı da artma eğilimindedir ancak bu ilişki belirgin düzeyde değildir.

FEN_OKURYAZARLIK ile en yüksek ilişki SOSYO_EKONOMIK_DUZEY (0.290) ile görülmektedir.

g) Basit doğrusal regresyon analizi kullanarak, SOSYO_EKONOMIK_DUZEY (ESCS) değişkeninin FEN_OKURYAZARLIK (PV1SCIE) puanını ne ölçüde yordadığını inceleyiniz. Elde ettiğiniz regresyon modelinin özetini (summary) görüntüleyiniz ve regresyon denklemini yorumlayınız.

Regresyon modelinin kurulması

# Basit doğrusal regresyon
model <- lm(FEN_OKURYAZARLIK ~ SOSYO_EKONOMIK_DUZEY, data = pisa2015_tr)
summary(model)
## 
## Call:
## lm(formula = FEN_OKURYAZARLIK ~ SOSYO_EKONOMIK_DUZEY, data = pisa2015_tr)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -254.267  -51.435   -2.633   51.343  241.124 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          450.4508     1.5393  292.64   <2e-16 ***
## SOSYO_EKONOMIK_DUZEY  19.1735     0.8281   23.15   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 73.9 on 5857 degrees of freedom
##   (36 observations deleted due to missingness)
## Multiple R-squared:  0.08385,    Adjusted R-squared:  0.08369 
## F-statistic: 536.1 on 1 and 5857 DF,  p-value: < 2.2e-16
# regresyon katsayısının standardize hali
model_beta <- lm(scale(FEN_OKURYAZARLIK) ~ scale(SOSYO_EKONOMIK_DUZEY), data = pisa2015_tr)
summary(model_beta)
## 
## Call:
## lm(formula = scale(FEN_OKURYAZARLIK) ~ scale(SOSYO_EKONOMIK_DUZEY), 
##     data = pisa2015_tr)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.2968 -0.6669 -0.0341  0.6657  3.1264 
## 
## Coefficients:
##                             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 0.003154   0.012518   0.252    0.801    
## scale(SOSYO_EKONOMIK_DUZEY) 0.289848   0.012519  23.153   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9582 on 5857 degrees of freedom
##   (36 observations deleted due to missingness)
## Multiple R-squared:  0.08385,    Adjusted R-squared:  0.08369 
## F-statistic: 536.1 on 1 and 5857 DF,  p-value: < 2.2e-16
b0 <- coef(model)[1]  # sabit terim
b1 <- coef(model)[2]  # eğim

Model sonuçları sosyo-ekonomik düzeyin (ESCS) fen okuryazarlık puanını pozitif ve anlamlı biçimde yordadığını göstermektedir (p < .001). Elde edilen katsayılar:

  • b₀ = 450.45 (sabit terim)

  • b₁ = 19.17 (eğim katsayısı)

Bu sonuç ESCS değerindeki her bir birimlik artışın, fen okuryazarlık puanında ortalama 19 puanlık bir artışla ilişkili olduğunu göstermektedir. Modelin açıklama gücü R² = 0.084 olup ESCS’nin fen başarısındaki varyansın yaklaşık %8’ini açıkladığını göstermektedir. Bu oran düşük olmakla birlikte başarı çok boyutlu bir yapı olduğu için tek bir değişkenin başarı üzerindeki etkisinin sınırlı olması beklendiktir. Standardize edilmiş katsayı β = 0.29 olup etkinin küçük–orta düzeyde olduğunu göstermektedir. Genel olarak model, sosyo-ekonomik düzeyin fen okuryazarlığıyla anlamlı biçimde ilişkili olduğunu, düzey yükseldikçe fen performansının artma eğiliminde olduğunu göstermektedir.