Bu haftanın günlüğünde uç değerler, normallik, doğrusallık ve çoklu bağlantı konularına değinilmektedir.

1. Verinin Yüklenmesi ve Temizlenmesi

bfi veri seti, bireylerin kişilik özelliklerini değerlendiren Big Five anketinin sonuçlarını içerir. İlk olarak verinin yapısını ve özetini inceliyoruz.

data(bfi, package = "psych")
df <- as_tibble(bfi)

# İlk 10 satır ve yapı
glimpse(df)
## Rows: 2,800
## Columns: 28
## $ A1        <int> 2, 2, 5, 4, 2, 6, 2, 4, 4, 2, 4, 2, 5, 5, 4, 4, 4, 5, 4, 4, …
## $ A2        <int> 4, 4, 4, 4, 3, 6, 5, 3, 3, 5, 4, 5, 5, 5, 5, 3, 6, 5, 4, 4, …
## $ A3        <int> 3, 5, 5, 6, 3, 5, 5, 1, 6, 6, 5, 5, 5, 5, 2, 6, 6, 5, 5, 6, …
## $ A4        <int> 4, 2, 4, 5, 4, 6, 3, 5, 3, 6, 6, 5, 6, 6, 2, 6, 2, 4, 4, 5, …
## $ A5        <int> 4, 5, 4, 5, 5, 5, 5, 1, 3, 5, 5, 5, 4, 6, 1, 3, 5, 5, 3, 5, …
## $ C1        <int> 2, 5, 4, 4, 4, 6, 5, 3, 6, 6, 4, 5, 5, 4, 5, 5, 4, 5, 5, 1, …
## $ C2        <int> 3, 4, 5, 4, 4, 6, 4, 2, 6, 5, 3, 4, 4, 4, 5, 5, 4, 5, 4, 1, …
## $ C3        <int> 3, 4, 4, 3, 5, 6, 4, 4, 3, 6, 5, 5, 3, 4, 5, 5, 4, 5, 5, 1, …
## $ C4        <int> 4, 3, 2, 5, 3, 1, 2, 2, 4, 2, 3, 4, 2, 2, 2, 3, 4, 4, 4, 5, …
## $ C5        <int> 4, 4, 5, 5, 2, 3, 3, 4, 5, 1, 2, 5, 2, 1, 2, 5, 4, 3, 6, 6, …
## $ E1        <int> 3, 1, 2, 5, 2, 2, 4, 3, 5, 2, 1, 3, 3, 2, 3, 1, 1, 2, 1, 1, …
## $ E2        <int> 3, 1, 4, 3, 2, 1, 3, 6, 3, 2, 3, 3, 3, 2, 4, 1, 2, 2, 2, 1, …
## $ E3        <int> 3, 6, 4, 4, 5, 6, 4, 4, NA, 4, 2, 4, 3, 4, 3, 6, 5, 4, 4, 4,…
## $ E4        <int> 4, 4, 4, 4, 4, 5, 5, 2, 4, 5, 5, 5, 2, 6, 6, 6, 5, 6, 5, 5, …
## $ E5        <int> 4, 3, 5, 4, 5, 6, 5, 1, 3, 5, 4, 4, 4, 5, 5, 4, 5, 6, 5, 6, …
## $ N1        <int> 3, 3, 4, 2, 2, 3, 1, 6, 5, 5, 3, 4, 1, 1, 2, 4, 4, 6, 5, 5, …
## $ N2        <int> 4, 3, 5, 5, 3, 5, 2, 3, 5, 5, 3, 5, 2, 1, 4, 5, 4, 5, 6, 5, …
## $ N3        <int> 2, 3, 4, 2, 4, 2, 2, 2, 2, 5, 4, 3, 2, 1, 2, 4, 4, 5, 5, 5, …
## $ N4        <int> 2, 5, 2, 4, 4, 2, 1, 6, 3, 2, 2, 2, 2, 2, 2, 5, 4, 4, 5, 1, …
## $ N5        <int> 3, 5, 3, 1, 3, 3, 1, 4, 3, 4, 3, NA, 2, 1, 3, 5, 5, 4, 2, 1,…
## $ O1        <int> 3, 4, 4, 3, 3, 4, 5, 3, 6, 5, 5, 4, 4, 5, 5, 6, 5, 5, 4, 4, …
## $ O2        <int> 6, 2, 2, 3, 3, 3, 2, 2, 6, 1, 3, 6, 2, 3, 2, 6, 1, 1, 2, 1, …
## $ O3        <int> 3, 4, 5, 4, 4, 5, 5, 4, 6, 5, 5, 4, 4, 4, 5, 6, 5, 4, 2, 5, …
## $ O4        <int> 4, 3, 5, 3, 3, 6, 6, 5, 6, 5, 6, 5, 5, 4, 5, 3, 6, 5, 4, 3, …
## $ O5        <int> 3, 3, 2, 5, 3, 1, 1, 3, 1, 2, 3, 4, 2, 4, 5, 2, 3, 4, 2, 2, …
## $ gender    <int> 1, 2, 2, 2, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 1, 2, 2, …
## $ education <int> NA, NA, NA, NA, NA, 3, NA, 2, 1, NA, 1, NA, NA, NA, 1, NA, N…
## $ age       <int> 16, 18, 17, 17, 17, 21, 18, 19, 19, 17, 21, 16, 16, 16, 17, …

2. Kayıp Veri Analizi

Kayıp veriler analiz sonuçlarını olumsuz etkileyebilir. Bu adımda veride eksik değer olup olmadığını hem görselleştirerek hem de sayısal olarak kontrol ediyoruz.

library(kableExtra)

miss_var_summary(bfi) %>%
  kable() %>%
  kable_styling(full_width = TRUE, position = "center")
variable n_miss pct_miss
education 223 7.96
N4 36 1.29
N5 29 1.04
O3 28 1
A2 27 0.964
A3 26 0.929
C4 26 0.929
E3 25 0.893
C2 24 0.857
E1 23 0.821
N1 22 0.786
O1 22 0.786
C1 21 0.75
E5 21 0.75
N2 21 0.75
C3 20 0.714
O5 20 0.714
A4 19 0.679
A1 16 0.571
A5 16 0.571
C5 16 0.571
E2 16 0.571
O4 14 0.5
N3 11 0.393
E4 9 0.321
O2 0 0
gender 0 0
age 0 0

Education değişkeninde 223 gözlem eksiktir, bu da veri setinin yaklaşık %8’ine karşılık gelmektedir. Bu durum, bireylerin eğitim düzeyini belirtmek istememesiyle ilişkili olabilir.

Diğer değişkenlerdeki eksiklik oranları %1’in altındadır. Bu oranlar, genel analizleri ciddi biçimde etkileyecek düzeyde değildir.

2.1 MCAR Testi

Bu test, eksik verilerin tamamen rastgele mi (MCAR) oluştuğunu anlamaya çalışır. Bu durum eksik verilerle nasıl başa çıkacağımızı belirlemek açısından kritiktir. Aşağıda, bfi veri setindeki Big Five maddeleri (A, C, E, N, O) için MCAR testi yapılmıştır:

library(naniar)

bfi_mcar <- bfi |>
  select(A1:A5, C1:C5, E1:E5, N1:N5, O1:O5)

mcar_testi <- mcar_test(bfi_mcar)

library(kableExtra)

kable(mcar_testi, caption = "BFI Değişkenleri İçin MCAR Testi Sonuçları", align = "c") %>%
  kable_styling(full_width = TRUE, position = "center")
BFI Değişkenleri İçin MCAR Testi Sonuçları
statistic df p.value missing.patterns
2190.945 1950 9.94e-05 87

Yapılan MCAR testi sonucunda p = 9.94e-05 bulunmuştur. Bu değer 0.05’ten küçük olduğu için eksik verilerin tamamen rastgele (MCAR) olmadığı, belirli örüntülere bağlı olduğu anlaşılmaktadır.

Bu nedenle, eksik gözlemleri doğrudan silmek (drop_na()) yerine çoklu imputasyon gibi daha gelişmiş yöntemlerin kullanılması önerilir. Bu, veri analizinde önyargıyı azaltır ve daha geçerli sonuçlar üretir.

2.2 Eksik Verilerin mice ile Tamamlanması

mice() fonksiyonu, değişkenler arası ilişkileri kullanarak eksik değerleri iteratif olarak tahmin eder.

library(mice)

# Yalnızca sayısal maddelerle çalışıyoruz
bfi_mcar <- bfi |>
  select(A1:A5, C1:C5, E1:E5, N1:N5, O1:O5)

# Çoklu imputasyon (default: 5 set, 5 iterasyon)
imp <- mice(bfi_mcar, m = 1, maxit = 5, method = "pmm", seed = 123)
## 
##  iter imp variable
##   1   1  A1  A2  A3  A4  A5  C1  C2  C3  C4  C5  E1  E2  E3  E4  E5  N1  N2  N3  N4  N5  O1  O3  O4  O5
##   2   1  A1  A2  A3  A4  A5  C1  C2  C3  C4  C5  E1  E2  E3  E4  E5  N1  N2  N3  N4  N5  O1  O3  O4  O5
##   3   1  A1  A2  A3  A4  A5  C1  C2  C3  C4  C5  E1  E2  E3  E4  E5  N1  N2  N3  N4  N5  O1  O3  O4  O5
##   4   1  A1  A2  A3  A4  A5  C1  C2  C3  C4  C5  E1  E2  E3  E4  E5  N1  N2  N3  N4  N5  O1  O3  O4  O5
##   5   1  A1  A2  A3  A4  A5  C1  C2  C3  C4  C5  E1  E2  E3  E4  E5  N1  N2  N3  N4  N5  O1  O3  O4  O5
# İlk tamamlanmış veri setini al
df_filled <- complete(imp, 1)

Artık analizler df_filled üzerinden yapılacaktır.

3. Uç Değer Analizi

a. Tek Değişkenli Uç Değerler (Z Skoru)

Z skoru, her gözlemin kendi değişkeninde ortalamadan kaç standart sapma uzaklıkta olduğunu belirtir. Her değişkeni z-skoruna dönüştürüp, |z| > 3 olan gözlemleri uç değer olarak işaretliyoruz.

z_scores <- df_filled |>
  mutate(across(everything(), ~ scale(.) |> as.vector()))

z_scores |>
  summarise(across(everything(), ~ sum(abs(.) > 3))) |>
  pivot_longer(cols = everything(), names_to = "değişken", values_to = "uç_değer_sayısı") |>
  arrange(desc(uç_değer_sayısı))
## # A tibble: 25 × 2
##    değişken uç_değer_sayısı
##    <chr>              <int>
##  1 O4                    55
##  2 A2                    48
##  3 O1                    23
##  4 A1                     0
##  5 A3                     0
##  6 A4                     0
##  7 A5                     0
##  8 C1                     0
##  9 C2                     0
## 10 C3                     0
## # ℹ 15 more rows

Z-skor analizi sonucunda yalnızca birkaç değişkende anlamlı düzeyde uç değer gözlenmiştir. Özellikle O4 (55 uç değer), A2 (48 uç değer) ve O1 (23 uç değer) maddelerinde uç gözlem sayısı oldukça yüksektir. Diğer 22 değişkende uç değer bulunmamıştır. Bu nedenle, analizlerde bu 3 değişkene özel dikkat gösterilmesi önerilir.

b. Çok Değişkenli Uç Değerler (Mahalanobis Mesafesi)

Mahalanobis mesafesi bir gözlemin çok boyutlu ortalamaya olan uzaklığını ölçer. Bu uzaklık, tüm değişkenleri birlikte değerlendirerek uç değerleri daha güvenilir şekilde belirler.

mahal <- mahalanobis(df_filled, colMeans(df_filled), cov(df_filled))
cutoff <- qchisq(0.975, df = ncol(df_filled))
outliers <- which(mahal > cutoff)
df_clean <- df_filled[-outliers, ]
print(paste("Silinen toplam çok değişkenli uç gözlem sayısı:", length(outliers)))
## [1] "Silinen toplam çok değişkenli uç gözlem sayısı: 314"

Mahalanobis mesafesine göre yapılan çok değişkenli uç değer analizi sonucunda toplam 314 gözlem aykırı olarak belirlenmiş ve analiz dışı bırakılmıştır. Temizlenmiş veri çerçevesi (df_clean) ile analizlere devam edilmiştir.

4. Normallik Testleri

a. Q-Q Grafikleri + Shapiro-Wilk

df_filled |>
  select(A1, C1, E1, N1, O1) |>
  pivot_longer(cols = everything(), names_to = "variable", values_to = "value") |>
  ggplot(aes(sample = value)) +
  stat_qq() + stat_qq_line() +
  facet_wrap(~ variable, scales = "free")

df_filled |>
  summarise(across(c(A1, C1, E1, N1, O1), ~ shapiro.test(.)$p.value))
##             A1           C1           E1           N1           O1
## 1 3.262622e-45 2.599219e-42 3.077934e-40 2.127495e-39 4.556397e-45

5. Doğrusallık

Doğrusallık varsayımı, bağımlı ve bağımsız değişkenler arasındaki ilişkinin lineer (doğrusal) olması gerektiğini belirtir. Bu varsayım özellikle regresyon analizleri için önemlidir.

Aşağıdaki grafiklerde değişken çiftleri arasındaki ilişkiler incelenmiştir:

df_clean |>
  select(A1, C1, E1, N1, O1) |>
  ggpairs()

Doğrusal ilişkiyi incelemek için oluşturulan ggpairs grafiği incelendiğinde, değişken çiftleri arasında genel olarak zayıf düzeyde, ancak istatistiksel olarak anlamlı ilişkiler görülmektedir. Noktaların dağılımı belirgin bir eğri ya da kümelenme göstermemekte, bu da doğrusal ilişki varsayımının büyük ölçüde sağlandığını düşündürmektedir. Elde edilen korelasyon değerleri düşük olsa da, doğrusal modelleme yapılması açısından engel oluşturacak bir durum gözlemlenmemiştir.

6. Varyansların Homojenliği (Levene Testi)

Gruplar arasında varyansların eşitliği testi yapılır. Örnek olarak A1 maddesi cinsiyete göre test edilmiştir.

df_gender <- bfi %>% 
  select(A1, gender) %>% 
  drop_na() %>% 
  mutate(gender = as.factor(gender))

leveneTest(A1 ~ gender, data = df_gender)
## Levene's Test for Homogeneity of Variance (center = median)
##         Df F value    Pr(>F)    
## group    1  11.967 0.0005497 ***
##       2782                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Levene testi sonucuna göre A1 maddesinin varyansı cinsiyet grupları arasında anlamlı düzeyde farklılık göstermektedir (F(1, 2782) = 11.967, p = 0.0005). Elde edilen p değeri 0.05’ten küçük olduğu için, gruplar arasında varyansların eşit olduğu yönündeki sıfır hipotezi reddedilmiştir. Bu durum, varyans homojenliği varsayımının ihlal edildiğini göstermektedir.

7. Multicollinearity (Çoklu Bağlantı)

Çoklu bağlantı, bir bağımsız değişkenin diğer bağımsız değişkenlerle yüksek oranda ilişkili olmasını ifade eder. Aşağıdaki analizde A1 maddesi bağımlı değişken olarak seçilmiş ve diğer kişilik boyutları bağımsız değişken olarak kullanılmıştır.

model <- lm(A1 ~ C1 + E1 + N1 + O1, data = df_clean)
vif(model)
##       C1       E1       N1       O1 
## 1.033100 1.020750 1.004946 1.049451

Çoklu bağlantı analizi sonucunda tüm VIF değerleri 1’e yakın ve 5’in oldukça altındadır (en yüksek VIF: 1.049). Bu durum, bağımsız değişkenler arasında çoklu bağlantı olmadığını ve modelde güvenle birlikte kullanılabileceklerini göstermektedir.

Sonuçlar

Veri seti üzerinde gerçekleştirilen çok değişkenli varsayım kontrolleri sonucunda analizlerin büyük çoğunluğu için varsayımların sağlandığı görülmüştür. Eksik verilerin tamamen rastgele olmadığı belirlenmiş ve bu nedenle çoklu imputasyon yöntemi (mice) ile eksik veriler başarıyla tamamlanmıştır. Z-skor analizine göre yalnızca birkaç değişkende (O4, A2, O1) anlamlı sayıda uç gözlem bulunmuş, Mahalanobis mesafesiyle yapılan çok değişkenli analiz sonucunda ise 314 gözlem uç değer olarak saptanıp veri setinden çıkarılmıştır.

Normallik testleri bazı değişkenler için sapmalar gösterse de, genel dağılım yapısında ciddi bir bozulma bulunmamıştır. Doğrusallık varsayımı zayıf ama anlamlı korelasyonlarla desteklenmiş; bu da doğrusal analizler için uygunluk sağlamıştır. Levene testi sonucuna göre varyans homojenliği varsayımı A1 değişkeni için ihlal edilmiştir, bu nedenle grup karşılaştırmalarında dikkatli olunmalıdır. Son olarak, VIF değerlerinin 1’e çok yakın olması, bağımsız değişkenler arasında çoklu bağlantı olmadığını ortaya koymuştur.

Bu bulgular doğrultusunda, eldeki veri seti ile yapılacak ileri düzey analizler için gerekli varsayımlar büyük ölçüde sağlanmıştır. Ancak uç değerlerin etkisi, normallik ve varyans homojenliği gibi konular analiz türüne göre yeniden göz önünde bulundurulmalıdır.