R’da Normal Dağılım Dönüşümleri Üzerine Vaka Çalışmaları: Case Studies on Normal Distribution Transformations in R

Giriş

Analizle uğraşan gerek akademik gerekse saha çalışanları verinin normal dağılım göstermediği durumlarda sıklıkla verinin normal dağılım dönüşümlerine başvurdukları bilinmekte ve görülmektedir. Normal dağılım sürekli olasılık dağılımlarından biridir. Geleneksel istatistik literatüründe özellikle parametrik test varsayımlarından birinin verinin normal dağılım gösterdiği varsayımıdır. Ancak genellikle biz uygulamada verinin normal dağılım göstermediğini biliriz. Peki bu durumda ne yaparız? Bu durumda yapılması gereken veriyi normal dağılıma uygun hale getirmektir. Peki ama nasıl? Öncelikle verinin dağılım yapısı histogramlarla, q-q, p-p ve kutu grafiklerle veya en kesin sonuç normalite testleriyle ortaya konulabilir. Normalite testleri tek değişkenli olarak yapılacaksa hepimizin yakından bildiği Shapiro-Wilk test veya Kolmogorov-Smirnov testi yapılır. Genellikle gözlem sayısının 50’nin altında değişken veri setlerinde Shapiro-Wilk testin kullanılmasının uygun olacağı iddia edilse de daha yüksek gözlem sayılarında da bu normalite testinin kullanıldığı görülmektedir. Literatürde yaygın olarak kullanılan diğer tek değişkenli normalite testleri ise şöyledir:

  • Lilliefors düzeltmeli K-S testi,
  • Anderson-Darling testi
  • Cramer-von Mises testi
  • D’Agostino çarpıklık testi
  • Anscombe-Glynn basıklık testi
  • D’Agostino-Pearson omnibus testi
  • Jarque-Bera testi.

Tek değişkenli normalite testlerinde yokluk (Hnull) hipotezimiz yani “H0:Dağılım normal dağılım gösterir” şeklinde kurulur. Test sonucunda bulunan önemlilik düzeyi(p), a (alfa) yanılma düzeyinden diğer bir ifadeyle tip I hata (alfa hatası)’dan büyükse dağılımın normal dağılım gösterdiğini söyleriz. Örneğin Shapiro-Wilk veya Kolmogorov-Smirnov test istatistikleri söz gelimi 0,73 ve p değeri 0,06 ise p değeri a=0,05’ten büyük olduğu için dağılımın normal dağılım gösterdirdiği söylenir ve bu durumda H0 hipotezi kabul edilir. Diğer yandan ise alternatif hipotez red edilir. Alternatif hipotezin reddedilmesi, dağılımın normal dağılım göstermediği anlamına gelir. Bu arada değişken veri setinin çarpıklık (skewness) ve basıklık (kurtosis) değerlerine ve şekline de bakarak dağılımın yapısında bir yargıya ulaşılabilir. Çarpıklık, bir simetri ölçüsüdür, daha doğrusu, simetri eksikliğini gösterir. Bir dağılım veya veri kümesi, merkez noktanın solunda ve sağında aynı görünüyorsa simetriktir. Basıklık ise verilerin normal bir dağılıma göre kalın veya hafif kuyruklu olup olmadığının bir ölçüsüdür. Standart normal bir dağılımda çarpıklık ve basıklık değerleri 0’a eşittir. Diğer bir deyişle, yüksek basıklığa sahip veri setleri, büyük veya aykırı değerler (outliers)’e sahip olma eğilimindedir. Düşük basıklığa sahip veri kümeleri, düşük kuyruklara veya düşük aykırı değerlere sahip olma eğilimindedir. Ayrıca aralık yöntemi de değişken veri setinin normal dağılıma uygunluğunun test edilmesinde kullanılabilir. Diğer bir yaklaşım ise merkezi dağılım ölçülerinden olan ortalama, medyan ve mod değerlerine bakılarak dağılımın yapısı hakkında fikir edinilebilmesidir. Örneğin standart normal dağılımın ortalaması 0 ve standart sapması ise 1’e eşittir. Buradan bakıldığında eğer değişken veri setinin ortalaması ne kadar 0’a, standart sapması ise 1’e yakın olursa dağılımın normal dağılımına evrildiğini söyleyebiliriz.

Dönüşüm, ingilizce ifadeyle transformation veri setindeki değişkenlerin farklı bir birimle ifade edilmesidir. Dağılımını normal dağılıma dönüştürmek aslında hepimizin bildiği can eğrisine dönüştürmektir. Sözü gelmişken ifade etmek isterim verinin dönüştürülmesi ile standardizasyon iki farklı kavramdır. Dolayısıyla birbirine karıştırılmaması gerekir. Verinin dönüştürülmesinde dağılımın şekli değişirken, standardizasyonda dağılımın şeklinde bir değişiklik olmaz. Yani bu iki kavram farklı amaçlara hizmet etmektedir. Farklı yöntemlerle verinin standardize edilmesine yönelik daha önce yaptığım uygulamalı çalışmayı görmek isteyenler için çalışmanın linkini aşağıda paylaşıyorum.

Verinin Standartlaştırılması Üzerine Vaka Çalışmaları

Esasında normallik dönüşümü yapmakta amacımız, Şekil 1’de ortada yer alan normal dağılım olarak adlandırdığımız simetrik dağılıma veriyi dönüştürmektir. Simetrik dağılım ya da standart normal dağılımda şekilde görüleceği üzere ortalama (mean), medyan (median) ve mod (mode) değerleri birbirine eşittir. Normallik dönüşümlerinde de bizim amacımız Şekil 1’in solunda yer alan pozitif çarpık (sağa çarpık) ve Şekil 1’in sağında yer alan negatif çarpık (sola çarpık) dağılımları normal dağılıma yani simetrik dağılıma evrilmesini sağlamaktır. Pozitif çarpık bir dağılımda Mod <Medyan <Ortalama sırası bulunmakta iken, negatif çarpık bir dağılımda ise Mod> Medyan> Ortalama sırası bulunmaktadır.

Şekil 1: Normal ve Çarpık Dağılımlar

Kaynak: https://www.oreilly.com

Ancak dikkat edilmesi gereken bir konu olduğu için burası önemlidir: eğer kurulacak çok değişkenli analiz modellerinde normal dağılım varsayımı geçerliyse aynı anda bütün değişkenlerin içerisinde olduğu çok değişkenli normalite testi yapılmalıdır. Çünkü değişkenlerin bireysel bazda normal dağılım varsayımı karşılaması birlikte bu varsayımı karşılayacağı anlamına gelmemektedir. Yani her bir değişken durumuna uygun dönüşümle normal dağılıma uygun hale getirildikten sonra çok değişkenli normalite testi yapılmalıdır. Bir diğer durum değişken veri setlerinde bazı değişkenlerin normal dağılım gösterirken diğerlerinin normal dağılım göstermemesidir. Bu durumda da çok değişkenli normalite testi yapılmalıdır. Dolayısıyla normallik dönüşümlerinin iki farklı boyutu olduğu için iki başlık altında ele alınmaktadır:

a) Tek değişkenli veri seti setlerinde normallik dönüşümleri

b) Çok değişkenli veri seti setlerinde normal dağılım varsayımının incelenmesi

a) Tek değişkenli veri seti setlerinde normallik dönüşümleri

Tek değişkenli veri setlerinde dağılımın çarpıklık yapısına bağlı olarak yapılacak dönüşümler farklılık göstermektedir:

  1. Eğer dağılım ılımlı derecede pozitif çarpık, diğer bir ifadeyle ılımlı derecede sağa çarpık ise karekök dönüşümü ve bazı durumlarda ondan daha etkili olan küp kök dönüşümü yapılır. Eğer karekök dönüşümü yapılacak değişken veri setinde 1’den küçük değerler varsa en küçük değeri 1 yapacak şekilde bir sabit terimin gözlem değerlerine ilave edilmesi gerekir. Bazen de bu dağılım yapılarında Tukey dönüşümü (Tukey’s Ladder of Powers transformation) de kullanılmaktadır. Burada mutlak şekilde bu veya şu dönüşümü kullanmak gerektiğini söylemek çok doğru bir yaklaşım olmaz, verinin üzerinde test edilip değerlendirilmesi gerekir.
  2. Eğer dağılım şiddetli derecede pozitif çarpık, diğer bir ifadeyle şiddetli derecede sağa çarpık ise logaritmik (log) dönüşümü yapılır. Eğer log dönüşümü yapılacak değişken veri setinde 1’den küçük değerler varsa en küçük değeri 1 yapacak şekilde bir sabit terimin gözlem değerlerine ilave edilmesi gerekir.
  3. Eğer dağılım ılımlı veya şiddetli derecede negatif çarpık, diğer bir ifadeyle sola çarpık ise veri setindeki her bir gözlem, veri setindeki maksimum değer + 1 değerinden çıkarılarak dağılımı pozitif çarpık bir dağılıma dönüştürülür. Daha sonra pozitif çarpık dağılımlarda uygulanan dönüşüm yöntemleri uygulanarak dağılım normal dağılıma dönüştürülür. Negatif çarpık dağılımlarda değişken veri setinde kare veya küp dönüşümü de yapılabilmektedir. Ayrıca değişken veri setindeki değerler 0-1 aralığında ise bu durumda da log(x/(1-x)) dönüşümü uygulanabilmektedir. Doğrudan negatif çarpık dağılımların normallik dönüşümlerinde sıralı çeyreklik normalleştirme dönüşümü (Ordered Quantile (ORQ) normalizing transformation) de kullanılabilmektedir. Sıralı çeyreklik normalleştirme dönüşümü g(x) = Φ ^ {-1} ((sıra(x) – 0,5) / (uzunluk(x))) eşitliği ile hesaplanmaktadır. Eşitlikte Φ, standart normal kümülatif dağılım fonksiyonu (cdf)’nu ifade ederken, sıra (x) her bir gözlemin sırasını ve uzunluk (x) gözlem sayısını ifade etmektedir.

Değişkenin veri tipine göre de yapılacak dönüşüm farklılık gösterebilmektedir. Eğer kesikli nicel bir veri tipine sahipsek karekök dönüşümü uygulanabilmektedir. Diğer taraftan aşırı derecede çarpık dağılıma sahip bir değişken veri setinde değişken veri setinin tersi de alınabilmektedir. Ancak oran türünde bir değişken veri setine sahip isek bu durumda sıklıkla logit dönüşümü kullanabiliriz. Logit dönüşüm eşitliği şöyledir: Logit(p)=loge(p/1-p). Logit dönüşüm daha çok regresyon analizlerinde kullanılmaktadır. Pozitif çarpık dağılımlar uygulamada en sık karşılaşılan dağılımlardan biridir. Basedilenler ışığında kullanılan dönüşüm yöntemleri Şekil 2 üzerinde verilmiştir.

Şekil 2: Normallik Dönüşüm Yöntemleri

b) Çok değişkenli veri seti setlerinde normal dağılım varsayımının incelenmesi

Çok değişkenli veri setlerinde aynı anda normalite testlerinin yapılması ile değişken bazında normalite testlerinin yapılması aynı sonucu doğurmamaktadır. Diğer bir ifadeyle, bütün değişken veri setlerinin bireysel bazda normal dağılım göstermesi tamamı aynı anda değerlendirildiği zaman normal dağılım göstereceğini garanti etmez. Bunu şöyle düşünebiliriz; Bir futbol takımı düşünün her bir oyuncu oynadığı pozisyonda iyi işler çıkarıyor. Ancak iş takım oyununa geldiğinde uyum problemi yaşanabiliyor. Yani 1 futbolcunun 11 kişilik takımda bireysel anlamda iyi olması 11 kişilik takımın da iyi olacağı anlamına ve takım üyelerinin birbirine iyi uyum sağlayacağı anlamına gelmez. Bu örnekten hareketle çok değişkenli normalite testleri de aslında takım üyelerinin (bütün değişkenlerin) aynı anda normal dağılım gösterip göstermediğini bize verir. Literatürde daha fazla çok değişkenli normalite testleri bulunmakla birlikte öne çıkan çok değişkenli normalite testleri şöyledir:

  • Mardia’nın çok değişkenli normallik testi: Mardia’nın testi çok değişkenli çarpıklık ve basıklık katsayılarını ve bunlara karşılık gelen istatistiksel anlamlılıklarını hesaplar. Küçük örneklem büyükleri (n <20) için çarpıklık katsayısının düzeltilmiş versiyonunu da hesaplayabilir. Çok değişkenli normallik için hem çarpıklık hem de basıklık istatistiğinin p değerleri 0,05’ten büyük olmalıdır. Verilerde eksik gözlemler varsa, liste halinde silme uygulanır ve tam bir durum analizi gerçekleştirilir.
  • Henze-Zirkler çok değişkenli normallik testi: Henze-Zirkler testi, iki dağılım (gözlemlenen ve teorik) arasındaki mesafeyi ölçen negatif olmayan bir fonksiyona dayanmaktadır. Çok değişkenli veriler normalse, test istatistiği (HZ) yaklaşık olarak log-normal olarak dağılım gösterir. Verilerde eksik gözlemler varsa, liste halinde silme uygulanır ve tam bir durum analizi gerçekleştirilir.
  • Royston çok değişkenli normallik testi: Çok değişkenli normalite testlerinden en sık kullanılanlardan biri de Royston tarafından 1992 yılında önerilen Royston testidir. Bu testte çok değişkenli normal dağılıma uygunluğun test edilmesinde Shapiro-Wilk veya Shapiro-Francia test istatistiğinden yararlanılır. Öncelikle bu testte her bir değişken için basıklık değerleri hesaplanır, ardından değişkenlerin basıklık katsayıları 3’ten büyükse Shapiro-Francia test istatistik değeri, eğer basıklık değeri 3’ten küçükse Shapiro-Wilk test istatistik değeri kullanılır.
  • Enerji çok değişkenli normallik testi: Çok değişkenli dağılımlar arasındaki enerji mesafesi kavramına dayanmaktadır. Enerji adlandırması, Newton’un yerçekimi potansiyel enerjisi ile yakın bir benzetmeden kaynaklanmaktadır.

Bireysel baz kurulan hipotezlere benzer olarak çok değişkenli normalite testlerinde de aşağıda belirtildiği gibi hipotezler kurulur.

  • H0 (yokluk): Değişkenler çok değişkenli normal dağılım gösterir.
  • H1 (alternatif): Değişkenler çok değişkenli normal dağılım göstermez.

Çalışma kapsamında tesadüfi bir şekilde üretilen değişken gözlemleri üzerinden değişken veri setlerinin normallik dönüşümü öncesi ve sonrası normal dağılım varsayımı test edilmiştir. Ayrıca çok değişkenli normalite testleri de yapılarak normallik varsayımı bir bütün olarak ele alınmıştır.

Metodoloji ve Uygulama Sonuçları

İlk olarak analizde kullanılacak R kütüphanelerini vererek işe başlayalım. Aşağıda gerekenden fazla kütüphane verdiğimi biliyorum. Ancak daha çok esneklik ve estetik tasarım tanıdığı için genellikle olması gerekenden fazla kütüphane ile çalışıyorum. İki veya daha fazla değişkenli veri seti setlerinde normal dağılım varsayımının incelenmesinde kullanılan kütüphaneler “MVN” iken, normallik dönüşümlerinde ise “dlookr”, “bestNormalize” kütüphaneleridir. Analizlerde R programlama dili kullanılmıştır. Bulguların çalışma kitaplarına yazdırılmasında ise xlsx uzantılı Microsoft Excel çalışma kitapları kullanılmıştır.

Yüklenecek kütüphaneler

# Kütüphaneler
library<-c("dplyr","tibble","tidyr","ggplot2","ggthemes","readr","readxl","ggpubr","formattable", "ggstance", "pastecs","writexl", "psych", "GGally","pander", "MVN", "dlookr")
loading<-sapply(library, require, character.only = TRUE)
 
# Kütüphane yüklenme durumunu gösteren tablo
tablo=suppressWarnings(loading, classes = "warning")
 
isim=names(tablo)
 
deger=as_tibble(tablo)
 
data.frame(kutuphane=isim, yuklenme_durumu=deger$value) %>% mutate(yuklenme_durumu=if_else(yuklenme_durumu==TRUE, "Yuklendi", "Paket Kurulumu Gerekli")) %>% pander(caption="Kütüphane Yüklenme Bilgisi")

Yukarıdaki R kod bloğunun çalıştırılmasından sonra yukarıdaki kütüphanelerin yüklenip yüklenmediğine dair aşağıdaki gibi mantıksal vektör sonuçları gelecektir. Eğer mantıksal vektör sonuçlarının hepsi TRUE ise kütüphanelerin hepsi yüklenmiştir demektir. Kolaylık sağlaması açısından yukarıda kütüphanelerin yüklenmesini gösterir tabloyu da elde etmek ve daha kolay okumanız için yukarıdaki kod bloğu içerisinden kısa bir kod yazdım. Bu kod çalıştırıldığında aşağıdaki tabloda görüleceği üzere bütün kütüphaneler yüklenmiştir. Eğer ilgili kütüphane yüklenmemiş olursa “Paket Kurulumu Gerekli” ifadesi satırda yazacaktır. Satırda yazan bu uyarı metnine göre paketi ya kurar yada yüklersiniz. Bir paketin kurulması ile yüklenmesinin aynı şey olmadığını burada ifade etmek gerekir konuyu yabancı olanlar için. Paket kurulumu ilk defa yapılan bir işlem iken, paketin yüklenmesi zaten kurulan bir paketin yüklenmesi yani çalışır duruma getirilmesidir. İlk defa bir paket kurulumu gerçekleştiriliyorsa install.packages() fonksiyonunu, zaten bir paket kurulumu gerçekleştirilmiş ise ilgili paketin veya kütüphanenin yüklenmesi veya okunması için library() veya require() fonksiyonlarını kullanıyoruz. Fonksiyonlardaki parantez () içerisine yüklenecek paket veya kütüphane adını yazıyoruz.

-------------------------------
  kutuphane    yuklenme_durumu 
------------- -----------------
    dplyr         Yuklendi     

   tibble         Yuklendi     

    tidyr         Yuklendi     

   ggplot2        Yuklendi     

  ggthemes        Yuklendi     

    readr         Yuklendi     

   readxl         Yuklendi     

   ggpubr         Yuklendi     

 formattable      Yuklendi     

  ggstance        Yuklendi     

   pastecs        Yuklendi     

   writexl        Yuklendi     

    psych         Yuklendi     

   GGally         Yuklendi     

   pander         Yuklendi     

     MVN          Yuklendi     

   dlookr         Yuklendi     
-------------------------------

Table: Kütüphane Yüklenme Bilgisi

Veri setinin oluşturulması

Oluşturulan veri setinde 4 değişken bulunmakta olup, aşağıdaki kurallara göre oluşturulmuştur.

  • v1 değişkeni pozitif çarpık dağılım gösteren üstel (exponential) dağılımdan tesadüfi bir şekilde üretilen 1000 gözlemden oluşmaktadır. Üstel beta dağılıma göre veri üretmek için rexp() fonksiyonu kullanılmıştır.
  • v2 değişkeni negatif çarpık dağılım gösteren beta dağılımdan tesadüfi bir şekilde üretilen 1000 gözlemden oluşmaktadır. Beta dağılımdan veri üretmek için rbeta() fonksiyonu kullanılmıştır.
  • v3 değişkeni negatif çarpık dağılım gösteren beta dağılımdan tesadüfi bir şekilde üretilen 1000 gözlemden oluşmaktadır. Tek biçimli (uniform) dağılıma göre veri üretmek için runif() fonksiyonu kullanılmıştır.
  • v4 değişkeni negatif çarpık dağılım gösteren beta dağılımdan tesadüfi bir şekilde üretilen 1000 gözlemden oluşmaktadır. Normal dağılıma uygun veri üretmek için rnorm() fonksiyonu kullanılmıştır.
set.seed(61) #üretilen değişken gözlem değerlerini sabitlemek için

v1=rexp(1000,rate=2) #Üstel dağılımdan tesadüfi bir şekilde üretilen 1000 gözlemli pozitif çarpık dağılım

v2=rbeta(1000,2,0.5,ncp=2) ##Beta dağılımdan tesadüfi bir şekilde üretilen 1000 gözlemli negatif çarpık dağılım

v3=runif(1000,min=0,max=2) # Tek biçimli (uniform) dağılımdan üretilen 1000 gözlemli iki modlu dağılım

v4=rnorm(n=1000, mean=0, sd=1) #standart normal dağılım (ortalama=0, standart sapma=1)'dan üretilen 1000 gözlemli  değişken

veri=cbind(v1,v2,v3,v4) %>% as_tibble()
veri

#ilk 10 gözlemin gösterilmesi
head(veri,10) %>% formattable()

Yukarıdaki R kod bloğu çalıştırıldıktan sonra elde edilen ilk 10 gözlem aşağıdaki tabloda verilmiştir.

a) Tek değişkenli değişken veri setlerinin normallik dönüşümleri

Veri setindeki değişkenlerin dağılım yapısının yoğunluk grafikleriyle ortaya konulması

Aşağıda yazılan kod bloğu ile ilk olarak oluşturulan veri setindeki değişkenlerin dağılım yapısı yoğunluk grafikleriyle karşılaştırmalı olarak ortaya konulmuştur.

# V1 değişkeninin dağılımı
v1=ggdensity(veri, x = "v1", fill = "red", title = "v1: Pozitif Çarpık", add = "mean")

# V2 değişkeninin dağılımı
v2=ggdensity(veri, x = "v2", fill = "red", title = "v2: Negatif Çarpık", add = "mean") 

# V3 değişkeninin dağılımı
v3=ggdensity(veri, x = "v3", fill = "red", title = "v3: İkili Mod Dağılımı", add = "mean") 

# V4 değişkeninin dağılımı
v4=ggdensity(veri, x = "v4", fill = "red", title = "v4: Standart Normal Dağılım", add = "mean")

ggarrange(v1,v2,v3,v4, ncol=2, nrow=2)

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen yoğunluk grafikleri değişkenlere göre aşağıda verilmiştir. Grafiklerde gösterilen y eksenine paralel kesikli siyah doğru ortalamayı göstermektedir.

Aşağıda yazılan kod bloğu ile ayrıca veri setindeki değişkenlerin dağılım yapısı teorik normal dağılım ile birlikte yoğunluk grafikleriyle ortaya konulmuştur.

# V1 değişkeninin dağılımı
v1=ggdensity(veri, x = "v1", fill = "red", title = "v1: Pozitif Çarpık", add = "mean") +
  stat_overlay_normal_density(color = "blue", linetype = "dashed")

# V2 değişkeninin dağılımı
v2=ggdensity(veri, x = "v2", fill = "red", title = "v2: Negatif Çarpık", add = "mean") +
  stat_overlay_normal_density(color = "blue", linetype = "dashed")

# V3 değişkeninin dağılımı
v3=ggdensity(veri, x = "v3", fill = "red", title = "v3: İkili Mod Dağılımı", add = "mean") +
  stat_overlay_normal_density(color = "blue", linetype = "dashed")

# V4 değişkeninin dağılımı
v4=ggdensity(veri, x = "v4", fill = "red", title = "v4: Standart Normal Dağılım", add = "mean") +
  stat_overlay_normal_density(color = "blue", linetype = "dashed")

ggarrange(v1,v2,v3,v4, ncol=2, nrow=2)

Veri setindeki değişkenlerin dağılım yapısı teorik normal dağılım ile birlikte yoğunluk grafikleriyle aşağıda verilmiştir. Bu grafiklerde teorik normal dağılım eğrisinin verilmesi mevcut değişken veri setindeki dağılım ile olması gereken normal dağılım yapısı arasındaki farkı görmek açısından önem arz etmektedir. Grafiklerde gösterilen y eksenine paralel kesikli siyah doğru ortalamayı göstermektedir.

Veri setindeki değişkenlerin dağılım yapısının q-q grafikleriyle ortaya konulması

Aşağıda yazılan kod bloğu ile veri setindeki değişkenlerin dağılım yapısı q-q grafikleriyle karşılaştırmalı olarak ortaya konulmuştur.

v1=ggplot(data=veri,                 
       aes(sample=v1)) +
  geom_qq() +                     
  geom_qq_line() +
  ggtitle("v1: Pozitif Çarpık")

v2=ggplot(data=veri,                 
       aes(sample=v2)) +
  geom_qq() +                     
  geom_qq_line() +
  ggtitle("v2: Negatif Çarpık")

v3=ggplot(data=veri,                 
       aes(sample=v3)) +
  geom_qq() +                     
  geom_qq_line() +
  ggtitle("v3: İkili Mod Dağılımı")

v4=ggplot(data=veri,                 
       aes(sample=v4)) +
  geom_qq() +                     
  geom_qq_line() +
  ggtitle("v4: Standart Normal Dağılım")

ggarrange(v1,v2,v3,v4, ncol=2, nrow=2)

Veri setindeki değişkenlerin dağılım yapısı q-q grafikler ile birlikte aşağıda verilmiştir. Veri setinin normal dağılıma uygun olup olmadığını ortaya koymada sıklıkla yararlanılan q-q grafiklerde teorik doğru üzerinde veri setinin dağılımın olması o veri setinin normal dağılıma sahip olduğunu veya normal dağılıma evrildiğini göstermektedir. Aşağıdaki grafiklere bakıldığında v4 değişkenindeki gözlemlerin doğru boyunca ilerlediği görülmektedir. Dolayısıyla burada v4 değişkeninin normal dağılım gösterdiğini söyleyebiliriz.

Veri setindeki değişkenlerin çarpıklık ve basıklık değerlerinin hesaplanması

Veri setindeki özellikle çarpık değerleri dağılım simetrik yapısını ortaya koymada oldukça yararlıdır. Aşağıda yazılan kod bloğu ile veri setindeki değişkenlerin hem çarpıklık hem de basıklık değerleri ortaya konulmuştur.

#çarpıklık değerlerinin hesaplanması
cv1=Skew(veri$v1)
cv2=Skew(veri$v2)
cv3=Skew(veri$v3)
cv4=Skew(veri$v4)

carpiklik= rbind(cv1, cv2, cv3,cv4)

#basıklık değerlerinin hesaplanması
bv1=Kurt(veri$v1)
bv2=Kurt(veri$v2)
bv3=Kurt(veri$v3)
bv4=Kurt(veri$v4)

basiklik= rbind(bv1, bv2, bv3,bv4)

#test etiketleri
test_tur=c(rep("Çarpıklık", 4), rep("Basıklık", 4))

#değişken etiketleri
degisken=rep(paste("V",1:4, sep = ""), 2)

#tablo oluşturma
tablo=cbind(degisken, test_tur,rbind(carpiklik,basiklik)) %>% as_tibble() %>% rename(deger=V3) %>% mutate(deger=round(as.numeric(deger),3))

formattable(tablo, align =rep("l",3), list(
  `test_tur` = formatter("span", style = ~ style(color = "black",font.weight = "bold")), 
  `deger`= color_bar("#00FF7F")
))

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen veri setindeki değişkenlerin çarpıklık ve basıklık değerleri aşağıdaki tabloda verilmiştir. Daha önce bahsettiğimiz üzere standart normal bir dağılımda çarpıklık ve basıklık değerleri 0’a eşittir. Buradan baktığımızda çarpıklık ve basıklık değerleri 0’a ne kadar yakınsa o ölçüde normal dağılıma evrildiğini söyleyebiliriz. Tabloya bakıldığında 0’a en yakın çarpıklık ve basıklık değerleri olan değişken v4 değişkeni olduğu için normal dağılıma sahip olduğunu söyleyebiliriz.

Veri setindeki değişkenlerin normalite testleri

Önceki kısımda yaptığımız testler her ne kadar dağılımın normal dağılım gösterip göstermediğini ortaya koymada yardımcı olsa da kesin bir karara varmak için normalite testleri yapılması gerekir. Aşağıda yazılan kod bloğu ile veri setindeki her bir değişkenin iki kuyruklu (two-sided) Kolmogorov-Smirnov (K-S) ve Shapiro-Wilks (S-W) testleri yapılarak dağılımın normal dağılıma uyup uymadığı kesin olarak ortaya konulmuştur.

options(scipen = 999)#sayısal bulguları bilimsel notasyondan kurtarmak için

#Kolmogorov-Smirnov (K-S) testleri (iki kuyruklu)
v1=ks.test(veri$v1, "pnorm", mean=mean(veri$v1), sd=sd(veri$v1))
v2=ks.test(veri$v2, "pnorm", mean=mean(veri$v2), sd=sd(veri$v2))
v3=ks.test(veri$v3, "pnorm", mean=mean(veri$v3), sd=sd(veri$v3))
v4=ks.test(veri$v4, "pnorm", mean=mean(veri$v4), sd=sd(veri$v4))

ks_testistastistigi=rbind(v1$statistic, v2$statistic, v3$statistic, v4$statistic)
ks_pdegeri=rbind(v1$p.value, v2$p.value, v3$p.value, v4$p.value)

#Shapiro-Wilks (S-W) testleri
v1=shapiro.test(veri$v1)
v2=shapiro.test(veri$v2)
v3=shapiro.test(veri$v3)
v4=shapiro.test(veri$v4)

sw_testistastistigi=rbind(v1$statistic, v2$statistic, v3$statistic, v4$statistic)
sw_pdegeri=rbind(v1$p.value, v2$p.value, v3$p.value, v4$p.value)

#test etiketleri
test_tur=c(rep("Kolmogorov-Smirnov", 4), rep("Shapiro-Wilks", 4))

#değişken etiketleri
degisken=rep(paste("V",1:4, sep = ""), 2)

#tablo oluşturma
t=cbind(degisken, test_tur, rbind(ks_testistastistigi,sw_testistastistigi),rbind(ks_pdegeri,sw_pdegeri)) %>% as_tibble() 
t= t %>% rename(testin_turu=test_tur, test_istatistigi=D, p_degeri=V4)%>% mutate(p_degeri=as.numeric(p_degeri), test_istatistigi=as.numeric(test_istatistigi)) %>% mutate(sonuc=if_else(p_degeri>0.0499, "normal dağılım göstermektedir", "normal dağılmamaktadır")) %>% mutate_if(is.numeric, round, 3) %>% formattable()
t

Yukarıda yazılan kod bloğunun çalıştırılması ile elde edilen veri setindeki her bir değişkenin iki kuyruklu (two-sided) Kolmogorov-Smirnov (K-S) ve Shapiro-Wilks (S-W) test sonuçları aşağıdaki tabloda verilmiş ve yukarıda yazılan basit bir algoritmayla yorumlanmıştır. Aşağıdaki tablodan görüleceği üzere v4 değişkeninde p değeri 0,05’ten büyük olduğu için hem Kolmogorov-Smirnov (K-S) hem de Shapiro-Wilks (S-W) test sonuçları istatistiksel olarak anlamlı olup, bu sonuç v4 değişkeninin normal dağılım gösterdiğini ortaya koymaktadır. Bu durumda “Dağılım normal dağılım gösterir” şeklinde kurulan H0 hipotezi kabul edilirken H1 yani alternatif hipotez reddedilir.

Veri setindeki değişkenlerin normal dağılıma dönüştürülmesi

  1. v1 değişkeninin dönüştürülmesi

v1 değişkeni aşağıda yazılan kod bloğu ile Tukey (Tukey’s Ladder of Powers) dönüşüm uygulanarak normal dağılıma dönüştürülmüştür. Aynı zamanda dönüştürülen değişken gözlemlerinin grafiklerle ve Shapiro-Wilk testi ile normal dağılıma uygunluğu test edilmiştir.

#v1 değişkenine Tukey dönüşümünün uygulanması
tt=transformTukey(veri$v1,plotit=T)
tt

#Orjinal gözlemlerin ve dönüştürülmüş gözlemlerin tabloya taşınması
dv1=tibble(v1=veri$v1, dv1=tt[1:1000])

# v1 değişkeninin karşılaştırmalı dağılımı
v1=ggdensity(dv1, x = "v1", fill = "red", title = "v1: Pozitif Çarpık", add = "mean") +
  stat_overlay_normal_density(color = "blue", linetype = "dashed")

# dönüşüm uygulanmış değişken (dv1) gözlemlerinin dağılımı
dv1=ggdensity(dv1, x = "dv1", fill = "red", title = "dv1: Tukey Dönüşüm", add = "mean") +
  stat_overlay_normal_density(color = "blue", linetype = "dashed")

ggarrange(v1, dv1, ncol=2, nrow=1)

Yukarıdaki R kod bloğunda çalıştırıldığında elde edilen dönüşüm sonrası gözlemlerin karşılaştırmalı yoğunluk dağılım grafikleri aşağıda verilmiştir. Görüleceği üzere v1 değişkeni gözlemleri Tukey dönüşüm uygulanarak dönüştürüldüğünde normal dağılıma evrildiği görülmektedir. Ancak bu dönüşüme rağmen yine de bir normalite testinin yapılması yerinde bir karar olacağı düşünülmektedir. Grafiklerde gösterilen y eksenine paralel kesikli siyah doğru ortalamayı göstermektedir.

Aşağıda yazılan R kod bloğu dönüştürülmüş v1 (dv1) değişken gözlemlerinin normallik varsayımı Shapiro-Wilk testi ile test edilmiştir. Aynı zamanda dönüştürülmüş v1 değişken gözlemleri xlsx uzantılı Microsoft Excel çalışma kitabına yazdırılmıştır.

#dv1 değişkeni Shapiro-Wilk normalite testi
shapiro.test(dv1$dv1)

#dv1 değişkeninin excel çalışma kitabına yazdırılması
write_xlsx(dv1,"donusturulmus_v1_degiskeni.xlsx")

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen Shapiro-Wilk normalite testi sonucu aşağıda verilmiştir. Bulgular dönüştürülmüş v1 değişken gözlemlerinin normal dağılım gösterdiğini ortaya koymaktadır. Çünkü p (0,09496) değeri 0,05’ten büyüktür.

#dv1 değişkeni Shapiro-Wilk normalite testi sonucu
W = 0.99731, p-value = 0.09496

Yukarıda yazılan kod bloğunun son satırı çalıştırıldığında dönüştürülmüş v1 (dv1) değişkeni ile dönüştürülmemiş v1 değişkeni xlx uzantılı çalışma kitabına yazdırılmış olup, aşağıdaki linkten indirebilirsiniz.

2. v2 değişkeninin dönüştürülmesi

v2 değişkeni aşağıda yazılan kod bloğu ile sıralı çeyreklik normalleştirme dönüşümü (Ordered Quantile (ORQ) normalizing transformation) uygulanarak normal dağılıma dönüştürülmüştür. Aynı zamanda dönüştürülen değişken gözlemlerinin grafiklerle ve Shapiro-Wilk testi ile normal dağılıma uygunluğu test edilmiştir.

#v2 değişkenine sıralı çeyreklik normalleştirme dönüşümü (Ordered Quantile (ORQ) normalizing transformation) uygulanması
sira=orderNorm(veri$v2)

#Orjinal gözlemlerin ve dönüştürülmüş gözlemlerin tabloya taşınması
d2=tibble(v2=veri$v2, dv2=sira$x.t)

#v2 değişkeninin karşılaştırmalı dağılımı
v2=ggdensity(d2, x = "v2", fill = "red", title = "v2: Negatif Çarpık", add = "mean") +
  stat_overlay_normal_density(color = "blue", linetype = "dashed")

#Dönüşüm uygulanmış değişken (dv2) gözlemlerinin dağılımı
dv2=ggdensity(d2, x = "dv2", fill = "red", title = "dv2: ORQ Dönüşümü", add = "mean") +
  stat_overlay_normal_density(color = "blue", linetype = "dashed")

ggarrange(v2, dv2, ncol=2, nrow=1)

Yukarıdaki R kod bloğunda çalıştırıldığında elde edilen dönüşüm sonrası gözlemlerin karşılaştırmalı yoğunluk dağılım grafikleri aşağıda verilmiştir. Görüleceği üzere v2 değişkeni gözlemleri sıralı çeyreklik (ORQ) normalleştirme dönüşümü uygulanarak dönüştürüldüğünde normal dağılıma evrildiği görülmektedir. Ancak bu dönüşüme rağmen yine de bir normalite testinin yapılması yerinde bir karar olur. Grafiklerde gösterilen y eksenine paralel kesikli siyah doğru ortalamayı göstermektedir.

Aşağıda yazılan R kod bloğu dönüştürülmüş v2 (dv2) değişken gözlemlerinin normallik varsayımı Shapiro-Wilk testi ile test edilmiştir. Aynı zamanda dönüştürülmüş v2 değişken gözlemleri xlsx uzantılı Microsoft Excel çalışma kitabına yazdırılmıştır.

#dv2 değişkeni Shapiro-Wilk normalite testi
shapiro.test(d2$dv2)

#dv2 değişkeninin excel çalışma kitabına yazdırılması
write_xlsx(d2,"donusturulmus_v2_degiskeni.xlsx")

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen Shapiro-Wilk normalite testi sonucu aşağıda verilmiştir. Bulgular dönüştürülmüş v2 değişken gözlemlerinin normal dağılım gösterdiğini ortaya koymaktadır. Çünkü p (1) değeri 0,05’ten büyüktür.

#dv2 değişkeni Shapiro-Wilk normalite testi sonucu
W = 0.99995, p-value = 1

Yukarıda yazılan kod bloğunun son satırı çalıştırıldığında dönüştürülmüş v2 (dv2) değişkeni ile dönüştürülmemiş v2 değişkeni xlx uzantılı çalışma kitabına yazdırılmış olup, aşağıdaki linkten indirebilirsiniz.

3. v3 değişkeninin dönüştürülmesi

v3 değişkeni aşağıda yazılan kod bloğu ile v2 değişkeninde olduğu gibi sıralı çeyreklik normalleştirme dönüşümü (Ordered Quantile (ORQ) normalizing transformation) uygulanarak normal dağılıma dönüştürülmüştür. Aynı zamanda dönüştürülen değişken gözlemlerinin grafiklerle ve Shapiro-Wilk testi ile normal dağılıma uygunluğu test edilmiştir.

#v2 değişkenine sıralı çeyreklik normalleştirme dönüşümü (Ordered Quantile (ORQ) normalizing transformation) uygulanması
sira=orderNorm(veri$v3)

#Orjinal gözlemlerin ve dönüştürülmüş gözlemlerin tabloya taşınması
d3=tibble(v3=veri$v3, dv3=sira$x.t)

# v2 değişkeninin karşılaştırmalı dağılımı
v3=ggdensity(d3, x = "v3", fill = "red", title = "v3: İkili Mod Dağılımı", add = "mean") +
  stat_overlay_normal_density(color = "blue", linetype = "dashed")

#Dönüşüm uygulanmış değişken (dv3) gözlemlerinin dağılımı
dv3=ggdensity(d3, x = "dv3", fill = "red", title = "dv3: ORQ Dönüşümü", add = "mean") +
  stat_overlay_normal_density(color = "blue", linetype = "dashed")

ggarrange(v3, dv3, ncol=2, nrow=1)

Yukarıdaki R kod bloğunda çalıştırıldığında elde edilen dönüşüm sonrası gözlemlerin karşılaştırmalı yoğunluk dağılım grafikleri aşağıda verilmiştir. Görüleceği üzere v3 değişkeni gözlemleri sıralı çeyreklik (ORQ) normalleştirme dönüşümü uygulanarak dönüştürüldüğünde normal dağılıma evrildiği görülmektedir. Ancak bu dönüşüme rağmen yine de bir normalite testinin yapılması, kesin bir karara varmak açısından önem taşımaktadır. Grafiklerde gösterilen y eksenine paralel kesikli siyah doğru ortalamayı göstermektedir.

Aşağıda yazılan R kod bloğu dönüştürülmüş v3 (dv3) değişken gözlemlerinin normallik varsayımı Shapiro-Wilk testi ile test edilmiştir.

#dv3 değişkeni Shapiro-Wilk normalite testi
shapiro.test(d3$dv3)

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen Shapiro-Wilk normalite testi sonucu aşağıda verilmiştir. Bulgular dönüştürülmüş v3 değişken gözlemlerinin normal dağılım gösterdiğini ortaya koymaktadır. Çünkü p (1) değeri 0,05’ten büyüktür.

dv3 değişkeni Shapiro-Wilk normalite testi sonucu
W = 0.99995, p-value = 1

Aşağıda yazılan kod bloğu ile dönüştürülmüş ilk üç değişkeni içeren veri setini birleştirelim ve xlsx uzantılı çalışma kitabına yazdıralım sonuçları görmek isteyenler için.

#veri setinin birleştirilmesi
don_veri=tibble(dv1=dv1$dv1, dv2=d2$dv2, dv3=d3$dv3)

#veri setinin xlsx uzantılı Microsoft Excel çalışma kitabına yazdırılması
write_xlsx(don_veri, "donusturul_veri_seti.xlsx")

Yukarıdaki kod bloğunun çalıştırılmasından sonra dönüştürülmüş veri xlsx uzantılı Microsoft Excel çalışma kitabına yazdırılmış olup, aşağıdaki linkten bu veri setini indirebilirsiniz.

b) Çok değişkenli veri seti setlerinde normal dağılım varsayımının incelenmesi

Bu bölüme kadar oluşturduğumuz veri setlerinde değişkenlerin bireysel olarak normallik dönüşümlerini yaparak yine bireysel normal dağılım gösterip göstermediğini test ettik. Ancak merak edilen konu değişkenlerin takım halinde normal dağılım varsayımının karşılayıp karşılanmadığıdır. Bu amaçla oluşturulmuş değişken veri setlerinin (v1’den v4’e kadar (dahil)) bu bölümde aynı anda normal dağılım gösterip göstermediği test edilmiştir. v4 değişkeninin bireysel olarak normal dağılım gösterdiği bilinmektedir. Çok değişkenli normalite testleri olarak

  • Mardia’nın çok değişkenli normallik testi
  • Henze-Zirkler çok değişkenli normallik testi
  • Royston çok değişkenli normallik testi
  • Enerji çok değişkenli normallik testi

testlerinden yararlanacağız. Bireysel bazda kurulan hipotezlere benzer olarak çok değişkenli normalite testlerinde de aşağıda belirtildiği gibi hipotezler kurulur.

  • H0 (yokluk): Değişkenler çok değişkenli normal dağılım gösterir.
  • H1 (alternatif): Değişkenler çok değişkenli normal dağılım göstermez.

Mardia’nın çok değişkenli normallik testi

Bu kısımda öncelikle aşağıda yazılan kod bloğu ile çok değişkenli Mardia’nın normalite testi yapılmıştır.

mardia=mvn(veri, mvnTest = "mardia", alpha = 0.5)
mardia=mardia$multivariateNormality 
mardia

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen Mardia normalite test sonuçları aşağıda verilmiştir. Mardia normalite testine göre değişkenler normal dağılım göstermemektedir.

TestStatisticp valueResult
Mardia Skewness1014,340,00NO
Mardia Kurtosis9,860,00NO
MVNNO

Henze-Zirkler çok değişkenli normallik testi

Aşağıda yazılan kod bloğu ile çok değişkenli Henze-Zirkler’in normalite testi yapılmıştır.

Henze_Zirkler=mvn(veri, mvnTest = "hz", alpha = 0.5)
Henze_Zirkler=Henze_Zirkler$multivariateNormality
Henze_Zirkler

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen Henze-Zirkler normalite test sonuçları aşağıda verilmiştir. Henze-Zirkler normalite testine göre değişkenler normal dağılım göstermemektedir.

TestHZp valueMVN
Henze-Zirkler8,4436130NO

Royston çok değişkenli normallik testi

Aşağıda yazılan kod bloğu ile çok değişkenli Royston’un normalite testi yapılmıştır.

royston=mvn(veri, mvnTest = "royston", alpha = 0.5)
royston=royston$multivariateNormality
royston

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen Royston normalite test sonuçları aşağıda verilmiştir. Royston normalite testine göre değişkenler normal dağılım göstermemektedir.

TestHp valueMVN
Royston355,87450,000NO

Enerji çok değişkenli normallik testi

Aşağıda yazılan kod bloğu ile çok değişkenli Enerji normalite testi yapılmıştır. Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen Royston normalite test sonuçları aşağıda verilmiştir.

enerji=mvn(veri, mvnTest = "energy", alpha = 0.5)
enerji=enerji$multivariateNormality
enerji

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen Enerji normalite test sonuçları aşağıda verilmiştir. Enerji normalite testine göre değişkenler normal dağılım göstermemektedir.

TestStatisticp valueMVN
E-statistic17,103330,000NO

Yapılan açık kaynak R kodlu normallik dönüşüm çalışmaları ile veri bilimi (data science) ile ilgilenen akademi ve saha çalışanlarına bir katkı sunulması amaçlanmıştır. Literatürde yukarıdaki bahsedilen hususlara dikkat etmeyen pek çok bilimsellikten uzak çalışma bulunmaktadır. Dolayısıyla yapacağınız çalışmalarda nitelikli araştırma yaparak ve içinize sinerek bir çalışma yapmanız her şeyden önce gerekmektedir. Amacımız sayısal çoğunluk değil nitelikli çoğunluk olmalıdır diye düşünüyorum.

Faydalı olması ve farkındalık oluşturması dileğiyle.

Bilimle ve teknolojiyle kalınız.

Saygılarımla.

Not: Kaynak gösterilmeden alıntı yapılamaz veya kopyalanamaz.

Note: It can not be cited or copied without referencing.

Yararlanılan Kaynaklar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s