Veri Setinin Yüklenmesi ve Doğruluk Kontrolü

Yükleme

library(haven)
veri <- read_sav("C:/Users/Lenovo/Desktop/bsgturm4.sav")

İlk 5 satırın incelenmesi

head(veri, 5)
## # A tibble: 5 × 6
##   IDSTUD BS4GSEX   BSMMAT01 BSDMPATM  BSDMSVM   BSDMSCM  
##    <dbl> <dbl+lbl>    <dbl> <dbl+lbl> <dbl+lbl> <dbl+lbl>
## 1  10111 1 [GIRL]      709. 1 [HIGH]  1 [HIGH]   1 [HIGH]
## 2  10125 1 [GIRL]      661. 1 [HIGH]  1 [HIGH]   1 [HIGH]
## 3  20207 2 [BOY]       729. 1 [HIGH]  1 [HIGH]   1 [HIGH]
## 4  30111 2 [BOY]       802. 1 [HIGH]  1 [HIGH]   1 [HIGH]
## 5  40105 2 [BOY]       374. 3 [LOW]   1 [HIGH]  NA

Veri yapısı

str(veri, list.len = 2)
## tibble [323 × 6] (S3: tbl_df/tbl/data.frame)
##  $ IDSTUD  : num [1:323] 10111 10125 20207 30111 40105 ...
##   ..- attr(*, "label")= chr "STUDENT ID"
##   ..- attr(*, "format.spss")= chr "F8.0"
##   ..- attr(*, "display_width")= int 9
##  $ BS4GSEX : dbl+lbl [1:323] 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, ...
##    ..@ label        : chr "GEN\\SEX OF STUDENT"
##    ..@ format.spss  : chr "F1.0"
##    .. [list output truncated]
##   [list output truncated]

Labellerin temizlenmesi

library(sjlabelled)
veri <- remove_all_labels(veri)

Değişken isimlerinin değiştirilmesi

library(magrittr)
veri <- veri %>%
  dplyr::rename(
    cinsiyet = BS4GSEX,
    basari = BSMMAT01,
    tutum = BSDMPATM,
    deger = BSDMSVM,
    guven = BSDMSCM)

İstatistiksel özet

library(reactable)
library(magrittr)

veri %>%
  dplyr::select(2:6) %>%
  summarytools::descr(transpose = TRUE) %>%
  as.data.frame() %>%
  reactable()

ID 400707 nolu öğrenci cinsiyette 22, ID 680204 nolu öğrenci ise değerde 11 olarak hatalı kodlama yapmıştır. Bu nedenle bu iki gözlemi sileceğim.

veri <- veri %>%
  dplyr::filter(!(IDSTUD == 400707 & cinsiyet == 22)) %>%
  dplyr::filter(!(IDSTUD == 680204 & deger == 11))

6 değişken 321 gözlem ile çalışmaya devam edeceğim.

TERS KODLAMAYI HESABA KATARAK DEVAM ETMEK İÇİN AŞAĞIDAKİ KODLARI KULLANACAĞIM. DEĞİŞKENLER 1,2,3 OLARAK KODLANMIŞ 1 YÜKSEK 3 DÜŞÜK OLARAK VERİLMİŞ. 1 LERİ 3 / 3LERİ 1 YAPARAK DEVAM EDECEĞİM

library(dplyr)
veri <- veri %>%
  mutate(
    tutum = 4 - tutum,
    deger = 4 - deger,
    guven = 4 - guven)

Kayıp Veri Analizi

library(magrittr)
library(dplyr)
library(tidyr)
library(kableExtra)
missing_summary <- veri %>% dplyr::select(-IDSTUD) %>%
  dplyr::summarise_all(~ sum(is.na(.))) %>%
  pivot_longer(cols = everything(), names_to = "Degisken", values_to = "Eksik_Deger") %>%
  mutate(Oran = round(100 * Eksik_Deger / nrow(veri), 2))

kable(missing_summary, caption = "Kayip Veri Analizi") %>% 
  kable_styling(full_width = T, position = "center") %>%
  column_spec(1, bold = TRUE) %>%
  column_spec(2, color = "red") %>%
  column_spec(3, color = "blue") %>%
  kable_styling(latex_options = c("striped", "hold_position")) %>%
  row_spec(0, bold = TRUE, background = "#D9EAD3") %>%
  row_spec(1:nrow(missing_summary), background = "#F6F6F6")
Kayip Veri Analizi
Degisken Eksik_Deger Oran
cinsiyet 0 0.00
basari 0 0.00
tutum 23 7.17
deger 7 2.18
guven 21 6.54

Cinsiyet ve başarı değişkenlerinde kayıp veri yoktur. Tutumda 23, değer değişkeninde 7 ve güven değişkeninde 21 gözlem kaybı vardır. Bu kayıpşarın oranları sırasıyla %7.17, %2.18 ve %6.54’tür. Kayıpları grafikle göstereceğim.

library(ggplot2)
library(naniar)
veri %>%
  dplyr::select(-IDSTUD) %>%
  naniar::gg_miss_var() +
  labs(title = "Kayıp Veri Analizi")

vis_miss(veri)

Kayıp veri, veri setinin %2.6 sını kaplamaktadır. Karar vermeden önce Little’s MCAR testini uygulayacağım.

library(MissMech)
TestMCARNormality(veri)
## Call:
## TestMCARNormality(data = veri)
## 
## Number of Patterns:  3 
## 
## Total number of cases used in the analysis:  310 
## 
##  Pattern(s) used:
##           IDSTUD   cinsiyet   basari   tutum   deger   guven   Number of cases
## group.1        1          1        1       1       1       1               286
## group.2        1          1        1       1       1      NA                11
## group.3        1          1        1      NA       1       1                13
## 
## 
##     Test of normality and Homoscedasticity:
##   -------------------------------------------
## 
## Hawkins Test:
## 
##     P-value for the Hawkins test of normality and homoscedasticity:  1.463842e-06 
## 
##     Either the test of multivariate normality or homoscedasticity (or both) is rejected.
##     Provided that normality can be assumed, the hypothesis of MCAR is 
##     rejected at 0.05 significance level. 
## 
## Non-Parametric Test:
## 
##     P-value for the non-parametric test of homoscedasticity:  0.4193982 
## 
##     Reject Normality at 0.05 significance level.
##     There is not sufficient evidence to reject MCAR at 0.05 significance level.

MCAR testi sonucunda üç farklı eksik veri deseni tespit edilmiştir. Hawkins testi sonucunda normallik veya homojenlik varsayımı reddedilmiş ve MCAR varsayımı 0.05 anlamlılık düzeyinde reddedilmiştir. Ancak parametrik olmayan test sonucunda, homojenlik varsayımı reddedilmemiştir ve bu test temel alındığında MCAR varsayımı reddedilmemektedir. Bu durum, verilerin MCAR olup olmadığına dair farklı testlerin farklı sonuçlar verebildiğini göstermektedir. Bu nedenle, eksik veri analizinde hangi varsayımların sağlandığına dikkat edilerek karar verilmelidir. Ben Non-Parametric Test başlığındaki p değerinin (0.419) eksik verilerin tamamen rastgele dağılmış olduğunu doğruladığını ve verinin MCAR olduğunu kabul edip basit yöntemlerle (liste silme, ortalama ile doldurma) eksik veriyle başa çıkmayı deneyeceğim. Bu sefer kayıp verileri ortalama ile dolduracağım.

veri <- veri %>%
  mutate(
    tutum = ifelse(is.na(tutum), mean(tutum, na.rm = TRUE), tutum),
    deger = ifelse(is.na(deger), mean(deger, na.rm = TRUE), deger),
    guven = ifelse(is.na(guven), mean(guven, na.rm = TRUE), guven)
  )

Veri setinin son hali

sum(is.na(veri))
## [1] 0

Veri setinde kayıp veri kalmamıştır. Şimdi uç değerleri inceleyeceğim. Uç değerleri belirlemek için z-skoru yöntemini kullanacağım.

Uç Değer Analizi

Tek Değişkenli Uç Değer Analizi

library(dplyr)
library(tidyr)

numeric_vars <- veri %>%
  dplyr::select(where(is.numeric)) %>%
  dplyr::select(-IDSTUD, -cinsiyet, -basari)

z_scores <- numeric_vars %>%
  mutate(across(everything(), ~scale(.)[,1]))

outliers <- z_scores %>%
  mutate(row_id = row_number()) %>%
  pivot_longer(-row_id, names_to = "variable", values_to = "z_score") %>% filter(abs(z_score) > 3)

print(outliers) %>% 
  kable(caption = "Uç Değer Analizi") %>%
  kable_styling(full_width = T, position = "center")
## # A tibble: 25 × 3
##    row_id variable z_score
##     <int> <chr>      <dbl>
##  1      5 tutum      -3.15
##  2     11 tutum      -3.15
##  3     45 deger      -4.90
##  4     68 tutum      -3.15
##  5     68 deger      -4.90
##  6     75 tutum      -3.15
##  7     77 tutum      -3.15
##  8     90 tutum      -3.15
##  9    108 tutum      -3.15
## 10    111 tutum      -3.15
## # ℹ 15 more rows
Uç Değer Analizi
row_id variable z_score
5 tutum -3.147744
11 tutum -3.147744
45 deger -4.901934
68 tutum -3.147744
68 deger -4.901934
75 tutum -3.147744
77 tutum -3.147744
90 tutum -3.147744
108 tutum -3.147744
111 tutum -3.147744
113 tutum -3.147744
121 tutum -3.147744
157 tutum -3.147744
197 tutum -3.147744
208 tutum -3.147744
215 deger -4.901934
217 tutum -3.147744
221 tutum -3.147744
229 deger -4.901934
240 tutum -3.147744
241 tutum -3.147744
254 tutum -3.147744
283 tutum -3.147744
317 tutum -3.147744
321 deger -4.901934

Tespit ettiğim uç değerlerin tamamını veri setinden çıkartacağım.

ucdegersatirlari <- z_scores %>%
  mutate(row_id = row_number()) %>%
  pivot_longer(-row_id, names_to = "variable", values_to = "z_score") %>%
  filter(abs(z_score) > 3) %>%
  pull(row_id) %>%
  unique()


veri2 <- veri[-ucdegersatirlari, ]

24 gözlem silindi. Veri setinde şu anda 297 gözlem var. Şimdi çok değişkenli uç değer analizi yapacağım. Çok değişkenli uç değer analizi için Mahalanobis mesafesini kullanacağım.

Çok Değişkenli Uç Değer Analizi

cov_mat <- cov(veri2[, 3:5], use = "pairwise.complete.obs")

center <- colMeans(veri2[, 3:5], na.rm = TRUE)

mahal <- mahalanobis(veri2[, 3:5], center, cov_mat)

cutoff <- qchisq(0.975, df = ncol(veri2[, 3:5]))

veri2$multivariate_outlier <- mahal > cutoff

sum(veri2$multivariate_outlier, na.rm = TRUE)
## [1] 31

31 adet çok değişkenli uç değer tespit ettim. Bunları da veri setinden çıkaracağım.

veri3 <- veri2 %>%
  filter(!multivariate_outlier) %>%
  dplyr::select(-multivariate_outlier)

6 değişken 266 gözlem ile çalışmaya devam edeceğim. Şimdi veri setinin normal dağılımını kontrol edeceğim.

Normallik ve Varyans Homojenliği Testi

Tek ve Çok Değişkenli Normallik Testi

Bu varsayım için skewness ve kurtosis değerlerini kullanacağım. Skewness değeri 0’a yakınsa dağılım simetrik, kurtosis değeri ise 3’e yakınsa normal dağılım gösterir. Bu nedenle bu iki değerin mutlak değerinin 1’den küçük olması yeterlidir. Bir de histogram grafiği çizeceğim. Histogram grafiği ile dağılımın normal dağılıma ne kadar yakın olduğunu görebilirim.

library(tidyverse)
library(moments)
library(kableExtra)

veri3 %>%
  summarise(across(tutum:guven, list(
    Skewness = ~ skewness(., na.rm = TRUE),
    Kurtosis = ~ kurtosis(., na.rm = TRUE)
  ))) %>%
  pivot_longer(cols = everything(),
               names_to = c("Variable", "Measure"),
               names_sep = "_") %>%
  pivot_wider(names_from = Measure, values_from = value) %>%
  mutate(across(c(Skewness, Kurtosis), ~ round(., 2))) %>%
  kable(format = "html", caption = "Çarpıklık ve Basıklık (Zayıf Normallik Göstergeleri)") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"), position = "center")
Çarpıklık ve Basıklık (Zayıf Normallik Göstergeleri)
Variable Skewness Kurtosis
tutum -2.32 6.65
deger -5.92 36.03
guven -0.72 2.13
library(tidyverse)

veri3 %>%
  dplyr::select(tutum, deger, guven) %>%
  pivot_longer(cols = everything(), names_to = "variable", values_to = "value") %>%
  ggplot(aes(x = value)) +
  geom_density(color = "red", size = 1) +
  facet_wrap(~ variable, scales = "free") +
  labs(title = "Tutum, Deger ve Guven icin Yogunluk Grafikleri", 
       x = "Deger", 
       y = "Yogunluk") +
  theme_minimal()

Skewness - kurtosis değerlerine baktığımda adece güven değişkeninin normal dağılıma yakın olduğunu söyleyebilirim. Diğer değişkenler normal dağılım göstermiyor. Grafiklerde ise normal dağılımdan çok uzak oluğu net şekilde belli.

Artıkların normal dağılımını kontrol etmek için Q-Q plot grafiği çizeceğim. Q-Q plot grafiği, gözlemlenen değerlerin normal dağılım altında beklenen değerlerle karşılaştırılmasını sağlar. Eğer noktalar 45 derecelik bir çizgi boyunca sıralanıyorsa, veri normal dağılım göstermektedir. Aksi takdirde, veri normal dağılım göstermiyor demektir.

library(tidyverse)

veri3 %>%
  dplyr::select(tutum, deger, guven) %>%
  pivot_longer(cols = everything(), 
               names_to = "variable", 
               values_to = "value") %>%
  ggplot(aes(sample = value)) +
  stat_qq(color = "blue") +
  stat_qq_line(color = "red") +
  facet_wrap(~ variable, scales = "free") +
  labs(title = "Tutum, Deger ve Guven icin QQ Plot (Normallik Kontrolu)",
       x = "Beklenen Degerler (Normal Dağılım)",
       y = "Gozlenen Degerler") +
  theme_minimal()

Grafiklerde görüldüğü gibi tutum ve değer değişkenleri normal dağılım göstermiyor. Güven artıkları ise normal dağılıma yakın. Ancak bu yeterli değil. Çok değişkenli normallik testi yapacağım. Çok değişkenli normallik testi için Henze-Zirkler testi kullanacağım. Bu test, çok değişkenli normal dağılım varsayımını test etmek için kullanılır. Testin sonuçları, çok değişkenli normal dağılım varsayımının sağlanıp sağlanmadığını belirlemek için kullanılır. Eğer p değeri 0.05’ten küçükse, çok değişkenli normal dağılım varsayımı sağlanmamaktadır.

library(MVN)
mvn(data = veri3[, c("tutum", "deger", "guven")], 
    mvnTest = "hz", 
    multivariatePlot = "qq") %>% kable(caption = "Henze-Zirkler Testi")

Henze-Zirkler Testi
Test HZ p value MVN
Henze-Zirkler 60.77456 0 NO
Test Variable Statistic p value Normality
Anderson-Darling tutum 71.5937 <0.001 NO
Anderson-Darling deger 99.6024 <0.001 NO
Anderson-Darling guven 26.5091 <0.001 NO
n Mean Std.Dev Median Min Max 25th 75th Skew Kurtosis
tutum 266 2.872281 0.3130055 3 2.000000 3 3 3 -2.3094863 3.6007142
deger 266 2.996480 0.0214514 3 2.866242 3 3 3 -5.8850207 32.7566563
guven 266 2.353947 0.7519133 3 1.000000 3 2 3 -0.7124773 -0.8905315

Test sonuçlarına göre Çok değişkenli normallik de sağlanamadı. Bu nedenle logaritmik dönüşüm uygulayacağım. Logaritmik dönüşüm uyguladıktan sonra normallik testini tekrar yapacağım.

veri4 <- veri3 %>%
  mutate(across(c(tutum, deger, guven), ~ log(. + 1)))
mvn(data = veri4[, c("tutum", "deger", "guven")], 
    mvnTest = "hz", 
    multivariatePlot = "qq") %>% kable(caption = "Henze-Zirkler Testi")

Henze-Zirkler Testi
Test HZ p value MVN
Henze-Zirkler 64.38472 0 NO
Test Variable Statistic p value Normality
Anderson-Darling tutum 72.4496 <0.001 NO
Anderson-Darling deger 99.6024 <0.001 NO
Anderson-Darling guven 28.1735 <0.001 NO
n Mean Std.Dev Median Min Max 25th 75th Skew Kurtosis
tutum 266 1.350097 0.0898332 1.386294 1.0986123 1.386294 1.386294 1.386294 -2.3413256 3.7186199
deger 266 1.385399 0.0054546 1.386294 1.3522830 1.386294 1.386294 1.386294 -5.8850207 32.7566563
guven 266 1.180554 0.2543853 1.386294 0.6931472 1.386294 1.098612 1.386294 -0.9545855 -0.4478075

Logaritmik dönüşüm sonrası yine normal dağılım sağlanamadı. Bu nedenle veri setini normal dağılım varsayımını sağlamayan veri seti olarak kabul edeceğim.

Aslında, regresyon analizinde sıkça karşılaşılan yanlış kanılardan biri, bağımsız değişkenlerin normal dağılması gerektiğidir. Ancak bu, klasik regresyon varsayımları arasında yer almaz. Tabachnick & Fidell (2013) ile Hair vd. (2010) gibi temel kaynaklar bu noktada nettir. Regresyon analizinde normal dağılım varsayımı artıklar (residuals) içindir, bağımsız değişkenler için değil. Bu durum, modelin tahmin doğruluğu ve geçerliliği açısından önemli bir ayrımı ifade eder. Öte yandan, artıkların da %100 normal dağılması beklenmez. Özellikle örneklem büyüklüğü arttıkça, artıkların dağılımı normalden sapma gösterse bile tahminlerin güvenilirliği korunur. Field (2013) gibi kaynaklar da bu görüşü destekleyerek, normal dağılım varsayımının özellikle büyük örneklemlerde esnetilebileceğini belirtir.

Varyans Homojenliği Testi

veri3 ile devam edeceğim ve Levene testi uygulayacağım.

library(car)
library(dplyr)
library(tidyr)
library(knitr)
library(kableExtra)

long_data1 <- veri3 %>%
  pivot_longer(
    cols = c(tutum, deger, guven),
    names_to = "grup",
    values_to = "puan")
levene_test <- leveneTest(puan ~ grup, data = long_data1)
kable(levene_test, caption = "Levene Testi Sonuçları") %>%
  kable_styling(full_width = T, position = "center")
Levene Testi Sonuçları
Df F value Pr(>F)
group 2 139.6394 0
795 NA NA

Levene testi sonucuna göre, gruplar arası varyans farkı istatistiksel olarak anlamlı bulunmuştur (p < 0.05). Bu durum, varyansların homojenliği varsayımının ihlal edildiğini gösterir.

Hangi dalı tutsak elimizde kaldığı için analizlerde varyans homojenliği varsayımını gerektiren yöntemler yerine robust testler tercih edeceğim.

Değişkenler Arası Korelasyon Analizi

library(ggcorrplot)
correlation_matrix <- cor(veri3[, c("tutum", "deger", "guven", "basari")], use = "pairwise.complete.obs")
ggcorrplot(correlation_matrix, 
           method = "circle", 
           type = "lower", 
           lab = TRUE, 
           title = "Korelasyon Matrisi", 
           colors = c("red", "white", "blue"), 
           tl.cex = 12, 
           tl.col = "black") +
  theme(plot.title = element_text(hjust = 0.5))

Korelasyon matrisine göre “başarı” değişkeni ile “güven” arasında orta düzeyde pozitif bir ilişki vardır (r = 0.51), bu durum başarı düzeyi arttıkça güven düzeyinin de arttığını göstermektedir. “Başarı” ile “değer” (r = 0.19) ve “tutum” (r = 0.20) arasında zayıf düzeyde pozitif ilişkiler mevcuttur. “Tutum” ile “güven” arasında zayıf düzeyde pozitif bir ilişki gözlenmiştir (r = 0.22). “Tutum” ile “değer” arasındaki ilişki çok zayıf düzeydedir (r = 0.05). Son olarak, “değer” ile “güven” arasındaki korelasyon da çok zayıf pozitif düzeydedir (r = 0.06). Tüm korelasyon değerleri istatistiksel olarak anlamlıdır. Bu bulgulara göre en güçlü ilişki başarı ile güven arasındadır.

Çoklu Bağıntılılık Testi

Multicollinearity testi için VIF (Variance Inflation Factor) değerlerini kullanacağım. VIF değeri 1’den büyükse, değişkenler arasında çoklu bağlantılılık olduğunu gösterir. VIF değeri 10’dan büyükse, çoklu bağlantılılık sorunu ciddi bir sorun haline gelir. Tolerans değerlerine de bakacağım. Tolerans değeri 0.1’den küçükse, çoklu bağlantılılık sorunu vardır.

library(car)
vif_model <- lm(basari ~ tutum + deger + guven, data = veri3)
vif_values <- vif(vif_model) 
tolerance_values <- 1 / vif_values
vif_results <- data.frame(
  Degisken = names(vif_values),
  VIF = round(vif_values, 2),
  Tolerans = round(tolerance_values, 2)
) 
vif_results %>%
  kable(caption = "VIF ve Tolerans Değerleri") %>%
  kable_styling(full_width = T, position = "center") %>%
  column_spec(1, bold = TRUE) %>%
  column_spec(2, color = "red") %>%
  column_spec(3, color = "blue") %>%
  kable_styling(latex_options = c("striped", "hold_position")) %>%
  row_spec(0, bold = TRUE, background = "#D9EAD3") %>%
  row_spec(1:nrow(vif_results), background = "#F6F6F6")
VIF ve Tolerans Değerleri
Degisken VIF Tolerans
tutum tutum 1.05 0.95
deger deger 1.00 1.00
guven guven 1.06 0.95

Vif ve tolerans değerlerine göre çoklu bağlantılılık sorunu yoktur. VIF değerleri 10’dan küçük ve tolerans değerleri 0.1’den büyüktür. Bu nedenle regresyon analizi yapabilirim.

Regresyon Analizi

Bazı varsayımları karşılayamadığım için robust yöntemler kullanacağım. Bu analiz varsayımların karşılanmadığı durumlarda kullanılan güçlü yöntemler.

  • Önce tüm denemek istediğim modelleri tek tek kuracağım.

  • Sonra model karşılaştırmaları yaparak en iyi modeli seçeceğim.

  • Son olarak seçtiğim modelin sonuçlarını yorumlayacağım.

Başlamadan cinsiyeti dummy değişken olarak kodlamam gerekiyor. Cinsiyet değişkeni 1 ve 2 olarak kodlanmış. 1’i referans grup alacağım.

veri3$cinsiyet <- factor(veri3$cinsiyet,
                         levels = c(1, 2),       
                         labels = c("Kiz", "Erkek")) 
veri3$cinsiyet <- relevel(veri3$cinsiyet, ref = "Kiz")
library(MASS)

Model 1: Basari ~ Cinsiyet + Tutum + Değer + Güven

model1 <- rlm(basari ~ tutum + guven + deger + cinsiyet, data = veri3)

Model 2: Tutum + Değer

model2 <- rlm(basari ~ tutum + deger, data = veri3)

Model 3: Güven + Değer

model3 <- rlm(basari ~ guven + deger, data = veri3)

Model 4: Tutum + Güven + Cinsiyet

model4 <- rlm(basari ~ tutum + guven + cinsiyet, data = veri3)

Model 5: Etkileşimli Model (Tutum x Cinsiyet)

model5 <- rlm(basari ~ tutum * cinsiyet + guven + deger, data = veri3)

Model 6: Stepwise seçilmiş formül ile robust model

adim <- lm(basari ~ tutum + guven + deger + cinsiyet, data = veri3)
step_selected <- stepAIC(adim, direction = "both", trace = FALSE)
model6 <- rlm(formula(step_selected), data = veri3)

Regresyon Tabloları

library(modelsummary)
library(performance)
library(broom)
library(kableExtra)
library(dplyr)
library(purrr)
model_list <- list(
  "Model 1: Tamamı" = model1,
  "Model 2: Tutum + Değer" = model2,
  "Model 3: Güven + Değer" = model3,
  "Model 4: Tutum + Güven + Cinsiyet" = model4,
  "Model 5: Etkileşimli" = model5,
  "Model 6: Stepwise" = model6
)

modelsummary(
  model_list,
  output = "kableExtra",
  statistic = "({std.error})", 
  stars = TRUE,                
  gof_omit = "IC|R2",          
  coef_rename = c(
    "tutum" = "Tutum",
    "guven" = "Güven",
    "deger" = "Değer",
    "cinsiyetErkek" = "Cinsiyet (Erkek)",
    "tutum:cinsiyetErkek" = "Tutum × Cinsiyet"
  )
) %>%
  kable_styling(full_width = TRUE, position = "center") %>%
  column_spec(1, bold = TRUE)
Model 1: Tamamı &nbsp;Model 2: Tutum + Değer &nbsp;Model 3: Güven + Değer &nbsp;Model 4: Tutum + Güven + Cinsiyet &nbsp;Model 5: Etkileşimli &nbsp;Model 6: Stepwise
(Intercept) −2451.892** −2674.126* −2348.884* 164.022** −2323.645* −2451.892**
(921.385) (1040.798) (909.716) (63.004) (921.365) (921.385)
Tutum 28.292 66.674** 31.027 1.299 28.292
(21.609) (23.832) (22.127) (29.873) (21.609)
Güven 76.624*** 80.211*** 77.917*** 77.672*** 76.624***
(9.004) (8.670) (9.217) (8.987) (9.004)
Değer 876.429** 978.089** 870.575** 858.665** 876.429**
(307.896) (347.743) (303.898) (306.562) (307.896)
Cinsiyet (Erkek) 26.619* 25.264+ −136.947 26.619*
(13.163) (13.484) (121.552) (13.163)
Tutum × Cinsiyet 56.793
(42.053)
Num.Obs. 266 266 266 266 266 266
Log.Lik. −1601.815 −1640.364 −1605.536 −1606.535 −1600.721 −1601.815
F 25.046 8.291 48.564 29.271 20.672 25.046
RMSE 99.78 115.34 101.18 101.56 99.37 99.78
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
safe_perf <- safely(performance::model_performance)

loglik_safe <- function(m) {
  ll <- tryCatch(logLik(m), error = function(e) NA)
  if (is.numeric(ll)) round(ll[1], 1) else NA
}

loglik_info <- lapply(model_list, function(m) {
  data.frame(LogLik = loglik_safe(m))
})

loglik_df <- bind_rows(loglik_info, .id = "Model")

knitr::kable(loglik_df, caption = "Modellerin Log-Likelihood Değerleri") %>%
  kable_styling(full_width = TRUE, position = "center") %>%
  row_spec(0, bold = TRUE, background = "#FCE5CD")
Modellerin Log-Likelihood Değerleri
Model LogLik
Model 1: Tamamı -1601.8
Model 2: Tutum + Değer -1640.4
Model 3: Güven + Değer -1605.5
Model 4: Tutum + Güven + Cinsiyet -1606.5
Model 5: Etkileşimli -1600.7
Model 6: Stepwise -1601.8
  • Model seçiminde, yorumlanabilirlik ve model sadelik açısından Model 6: daha uygun görünüyor.

  • İstatistiksel anlamda en iyi uyum değerlerini Model 4 sağlıyor.

  • RMSE (tahmin hatası) VE Log Likelihood değeri en düşük model ise Model 5 ancak tutum × cinsiyetErkek katsayısının güvenirliği sorgulanmalı.

  • Güven değişkeni tüm modellerde başarıyı en güçlü etkileyen değişkendir. Bu, öğrencinin kendine güveninin başarıda kilit rol oynadığını gösteriyor. Değer değişkeni de başarıya anlamlı katkı sağlamaktadır. Tutum, güven ve değer* gibi diğer değişkenlerle birlikte değerlendirildiğinde etkisi daha dengeli hale gelmektedir. Cinsiyet, başarı üzerinde doğrudan etkili görünmektedir ancak bu etki, tutum ile birlikte değerlendirildiğinde daha karmaşık hale geliyor.

  • Model 5, hem açıklayıcılık hem de istatistiksel uygunluk bakımından en iyi model gibi gözüküyor. Bu model, cinsiyetin tutum üzerindeki etkisini dikkate aldığı için daha gerçekçi ve anlamlı sonuçlar sunmaktadır.

Model 7: Aracı etki

model7 <- '
  guven ~ a*tutum
  basari ~ b*guven + c*tutum

  indirect := a*b
  total := c + (a*b)
'
library(lavaan)
fit <- sem(model7, data = veri3)

library(dplyr)
library(gt)

parameterEstimates(fit, standardized = TRUE) %>%
  filter(op %in% c("~", ":=", "~~")) %>%
  dplyr::select(lhs, op, rhs, est, se, z, pvalue, std.all) %>%
  rename(
    Bagimli = lhs,
    Opr = op,
    Bagimsiz = rhs,
    B = est,
    SE = se,
    Z = z,
    `p` = pvalue,
    `Std. Beta` = std.all
  ) %>%
  gt() %>%
  tab_header(title = "Araci Etki Modeli Sonuclari") %>%
  fmt_number(columns = c(B, SE, Z, `p`, `Std. Beta`), decimals = 3) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_column_labels(everything()))
Araci Etki Modeli Sonuclari
Bagimli Opr Bagimsiz B SE Z p Std. Beta
guven ~ tutum 0.538 0.144 3.749 0.000 0.224
basari ~ guven 77.989 8.586 9.083 0.000 0.490
basari ~ tutum 33.234 20.625 1.611 0.107 0.087
guven ~~ guven 0.535 0.046 11.533 0.000 0.950
basari ~~ basari 10,490.594 909.650 11.533 0.000 0.734
tutum ~~ tutum 0.098 0.000 NA NA 1.000
indirect := a*b 41.968 12.111 3.465 0.001 0.110
total := c+(a*b) 75.202 23.009 3.268 0.001 0.196

Model 7’ye göre tutum, güven ve başarı değişkenleri arasında anlamlı ve dikkat çekici ilişkiler bulunmaktadır.

Tutum → Güven: Tutumun güven üzerindeki etkisi orta düzeyde ve istatistiksel olarak anlamlıdır (β = 0.224, p < .001). Bu bulgu, öğrencilerin olumlu tutumlarının, güven düzeylerini anlamlı biçimde artırdığını göstermektedir.

Güven → Başarı: Güvenin başarı üzerindeki etkisi oldukça güçlü ve anlamlıdır (β = 0.490, p < .001). Bu, öğrencilerin öz güven düzeyleri arttıkça akademik başarılarının da anlamlı şekilde yükseldiğini ortaya koymaktadır.

Tutum → Başarı (Doğrudan Etki): Tutumun başarı üzerindeki doğrudan etkisi zayıf olup istatistiksel olarak anlamlı değildir (β = 0.087, p = .107). Bu, tutumun başarıya doğrudan katkısının sınırlı olduğunu ve güven gibi bir aracı olmadan bu ilişkinin güçlü olmadığını göstermektedir.

Dolaylı Etki (Tutum → Güven → Başarı): Tutumun başarı üzerindeki dolaylı etkisi anlamlıdır (β = 0.110, p = .001). Bu, güvenin bu ilişkiyi taşıyan etkili bir aracı değişken olduğunu kanıtlamaktadır. Yani, tutumun başarıya olan etkisi, büyük ölçüde güven yoluyla gerçekleşmektedir.

Toplam Etki (Doğrudan + Dolaylı): Tutumun başarı üzerindeki toplam etkisi anlamlıdır (β = 0.196, p = .001). Bu bulgu, tutumun genel olarak başarıya etkili olduğunu; ancak bu etkinin önemli bir kısmının güven aracılığıyla oluştuğunu göstermektedir.

Bu aracı etki modeli, güven değişkeninin, tutumun başarı üzerindeki etkisinde güçlü ve anlamlı bir aracı rol oynadığını göstermektedir. Tutumun doğrudan etkisi zayıf ve anlamsızken, dolaylı etki güçlü ve anlamlıdır. Bu da, öğrencilerin tutumlarını güçlendirmenin, güven düzeylerini artırarak akademik başarılarını dolaylı şekilde destekleyebileceğini ortaya koyar.

Model 5 ve Model 7 R² Karşılaştırması

library(lavaan)
lm_model5 <- lm(basari ~ tutum * cinsiyet + guven + deger, data = veri)
r2_model5 <- summary(lm_model5)$r.squared
adj_r2_model5 <- summary(lm_model5)$adj.r.squared

r2_model7 <- lavInspect(fit, "r2")

r2_karsilastirma <- tibble(
  Model = c("Model 5: Etkilesimli Regresyon", "Model 7: Araci Model"),
  R2_Basari = c(r2_model5, r2_model7["basari"]),
  R2_Guven = c(NA, r2_model7["guven"])
)

library(gt)

library(gt)

r2_karsilastirma %>%
  gt() %>%
  tab_header(title = "Model 5 ve Model 7 R2 Karşılaştırması") %>%
  fmt_number(columns = c(R2_Basari, R2_Guven), decimals = 3) %>%
  cols_label(
    R2_Basari = "R2 (Basari)",
    R2_Guven = "R2 (Guven)"
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_column_labels(everything())
  )
Model 5 ve Model 7 R2 Karşılaştırması
Model R2 (Basari) R2 (Guven)
Model 5: Etkilesimli Regresyon 0.201 NA
Model 7: Araci Model 0.266 0.050
  • Model 5 (Etkileşimli Regresyon) yalnızca “başarı” değişkenini açıklamak için kurulmuştur. Bu modelde R² değeri 0.201’dir. Yani model, başarıdaki toplam değişimin yaklaşık %20’sini açıklayabilmektedir. Bu orta düzeyde bir açıklayıcılık sağlar. Etkileşimli bir yapı (tutum × cinsiyet) içermesi, bireysel farklılıkların modele katkısını ortaya koymaktadır.

  • Model 7 **(Aracı Model*) hem başarıyı hem de güveni açıklamaktadır. Başarı için R² değeri 0.266, yani başarı değişiminin yaklaşık %27’si bu model tarafından açıklanabilmektedir. Bu, Model 5’e göre daha yüksektir; yani Model 7 başarıyı daha iyi açıklamaktadır. Ayrıca, bu modelde “guven” değişkeni için de R² hesaplanmıştır: 0.046, yani “tutum” değişkeni “guven” değişkenindeki değişimin yakşalık %5’ini açıklayabilmektedir. Bu oran düşük olsa da, istatistiksel olarak anlamlı bir aracılık etkisi** olduğu zaten modelde görülmektedir.