Veri analisti/bilimcisi, çoğu zaman olasılık dağılımı bilinmeyen bir popülasyondan elde edilen örneklemlerle çalışır. Bir örneklemin olasılık dağılımı, o örnekleme uygulanabilecek istatistiksel yöntemler konusunda sınırlamalar getirir. Birçok istatistiksel test ve makine öğrenmesi modeli verinin dağılımına yönelik yapılan bazı varsayımlarla çalışır.
Normallik testleri, bir veri kümesinin normal dağılımla iyi modellenip modellenmediğini belirlemek ve veri kümesinin altında yatan rastgele bir değişkenin normal dağılma olasılığını hesaplamak için kullanılır.
Bu yazıda istatistik ve veri biliminin en önemli konularından biri olan normal dağılımı ve özelliklerini inceleyip, grafik ve istatistiksel testler yardımı ile bir dağılımın normal dağılıma uygun olup olmadığının nasıl anlaşılabileceğini göreceğiz.
Normal dağılım (Gauss dağılımı) nedir?
Normal dağılım, bir dizi gözlemin, bu gözlemlerin merkezi etrafında nasıl dağıldığını tanımlayan bir fonksiyondur. Normal dağılım gözlemlerin ortalama etrafında toplandığı, tek tepeli, simetrik ve dağa/zile benzer şekle sahip bir dağılımdır.
Gauss dağılımı olarak da bilinen normal dağılım, ilk olarak 1809 yılında Carl Friedrich Gauss tarafından tanımlanmıştır. Diğer bir matematikçi Pierre Simon Laplace ise Gauss’un buluşunu daha da ileriye taşıyıp, Merkezi Limit Teoremini bulmuştur.
Gerçek hayattaki birçok olay normal dağılıma uygunluk gösterir. Normal dağılım örnekleri:
- IQ skorları
- Boy uzunlukları
- Vücut ısısı
- Hisse senetlerinin periyodik (günlük, aylık vs.) getirileri
- Üretim hataları
Normal dağılım ve veri bilimindeki yeri
Normal dağılım, istatistik ve veri bilimi için önemli bir yere sahiptir. Normallik varsayımı, birçok istatistiksel sürecin temelini oluşturur. Günlük hayattaki birçok tesadüfi olay normal dağılıma uyar.
Normal dağılımın veri bilimine ve istatistik hesaplamalarına katkılarını şu şekilde özetleyebiliriz:
- Merkezi Limit Teoremi ile popülasyonun dağılımı ne olursa olsun, yeterli büyüklükte örneklemler oluşturulduğunda, örneklemlerin ortalamalarının dağılımı normal dağılıma sahip olacaktır. Bu sayede küçük örneklemler ile popülasyonun tamamı hakkında çıkarımlar yapmak mümkündür.
- Bazı hipotez testleri (parametrik testler) verinin normal dağılıma sahip olduğu varsayımı ile çalışır.
- Lineer ve non-lineer regresyon, kalıntıların (residuals) normal dağılıma sahip olduğunu varsayar.
- Least Square-based regression, Gaussian Naive Bayes Classifier, Linear and Quadratic Discriminant Analyses gibi bazı makine öğrenmesi modelleri verinin normal dağılıma sahip olduğunu varsayar.
- Normal dağılım, istatistiksel hesaplamaları daha kolaylaştırır.
Normal dağılım ne anlama gelir?
Bir verinin normal dağılıma sahip olması, veri setinin simetrik olduğu ve gözlemlerin ortalama etrafında toplandığı anlamına gelir. Ortalama değeri gerçekleşmesi en yüksek olasılığa sahip gözlem iken, ortalamadan uçlara doğru gidildikçe gözlemlerin gerçekleşme olasılığı azalır.
Gerçek bir örnek üzerinden ilerleyelim. Normal dağılıma örnek verirken IQ skorlarının dağılımının da normal dağılıma sahip olduğundan bahsetmiştik. Örnek bir IQ skoru dağılımı şöyle görünebilir:
Bu dağılıma göre IQ skorlarının ortalaması 100, standart sapması ise 15’tir. IQ skorunun 100 olma olasılığı maksimumdur. Çok düşük ve çok yüksek IQ skorlarına doğru ilerlediğimizde olasılıkların azaldığını görürüz. Stanford-Binet IQ testi kullanılarak yapılan çalışmaya göre toplumun sadece %0.25 – 1.00’inin 140 ve üzeri IQ skoruna sahip olduğu tahmin ediliyor. Dünya nüfusunu gözünüzde canlandırdığınızda olasılığın ne kadar az olduğunu anımsayabilirsiniz.
Normal dağılımın parametreleri
Sürekli bir olasılık dağılımı olan normal dağılım iki parametre ile tanımlanabilir: ortalama (μ) ve standart sapma (σ)
Ortalama dağılımın merkezini (yatay eksen) belirlerken, standart sapma ise dağılımın genişliğini (dikey eksen) belirler.
Örnek grafikte, aynı standart sapma ve farklı ortalamalara sahip 3 farklı normal dağılıma sahip veri seti mevcut. Görselden de belli olacağı üzere, her grafiğin standart sapması sabit olduğu için genişliği aynı olurken, ortalamaları farklı olduğu için grafiklerin yerleri birbirinden farklıdır.
Diğer bir örnek görselde ise bu sefer standart sapmaları farklı, ortalamaları aynı olan normal dağılıma sahip veri setleri mevcut. Standart sapma büyüdükçe, değişkenlik arttığı için grafiğin eni büyürken, sapma küçüldükçe değerler ortalama etrafında toplandığı için grafiğin genişliği küçülür. Ortalamalar sabit olduğu için tüm grafiklerin merkezi aynıdır.
Bir rassal değişkenin belirli bir değer aralığında değere sahip olma olasılığını hesaplamak için olasılık yoğunluk fonksiyonu (probability density function – pdf) kullanılır. Normal dağılımın olasılık yoğunluk fonksiyon formülü şöyledir:
X ~ N(𝜇, σ2) 𝜇: Ortalama σ2: Varyans π: Pi sayısı (π = 3.14159) e: Euler sayısı (e = 2.71828)
Ortalama (𝜇)
𝜇 = E(X) = 0
Varyans (σ2)
Var(X) = σ2 = 1
Normal dağılımın özellikleri nelerdir?
Normal dağılımın karakteristik özellikleri şunlardır:
- Dağılım ortalama etrafında simetriktir. Veri setindeki gözlemlerin bir yarısı ortalamadan büyük iken diğer yarısı ortalamadan küçüktür.
- Değişkenin ortalama, ortanca ve mod değerleri birbirine eşittir.
- Normal dağılım eğrisinin altında kalan alan olasılıkları ifade eder ve bu olasılıkların toplamı 1’e eşittir.
- Değerlerin %68’i ortalamadan 1 standart sapma, %95’i 2 standart sapma ve %99.7’si ise 3 standart sapma uzaklıktadır. Değerlerin yaklaşık %0.3’ü ortalamaya 3 standart sapmadan da uzaktır ve bu değerler genel olarak “aykırı değer” olarak nitelendirilirler. Bu durum 68-95-99.7 kuralı veya empirik kural olarak bilinir.
Standart normal dağılım ve olasılık
Z dağılımı olarak da isimlendirilen standart normal dağılım, ortalamanın 0, standart sapmanın da 1’e eşit olduğu özel bir normal dağılımdır. Standart normal dağılım, z-puanı adı verilen standartlaştırılmış değerlerin normal dağılımıdır. Z-puanı standart sapma birimleriyle ölçülür.
Herhangi bir normal dağılım, verilerin standartlaştırılması ile z-dağılımına dönüştürülebilir. Verinin standartlaştırılması, hem farklı standart sapma ve ortalamaya sahip verilerin karşılaştırılmasını kolaylaştırır hem de kolaylıkla olasılık hesabı yapılmasına imkan sağlar. Farklı ölçek/büyüklüğe sahip veriler söz konusu olduğunda standardizasyon işlemi makine öğrenmesi modelleri için de kritiktir.
Z-puanı, veri setindeki bir gözlemin ortalamadan kaç standart sapma uzaklıkta olduğunu gösterir.
- Pozitif z-skoru, gözlemin ortalamadan büyük olduğunu,
- Negatif z-skoru, gözlemin ortalamadan küçük olduğunu,
- Z-skorunun sıfır olması ise gözlemin ortalamaya eşit olduğunu ifade eder.
Herhangi bir gözlem için z puanı aşağıdaki formüle göre hesaplanır:
z = (x - 𝜇) / σ z: Z-skoru x: Gözlemin değeri 𝜇: Değişkenin ortalaması σ: Değişkenin standart sapması
Normal dağılıma uygun bir veri setini standart normal veri setine dönüştürmek için yukarıdaki formüle göre veri setinde bulunan tüm değerlere karşılık gelen Z-puanı hesaplanmalıdır.
Standart normal dağılımında eğrinin altında kalan alanın toplamı 1’e eşittir. İki nokta arasında, eğrinin altında kalan alan rassal değişkenin o değerler arasında olma olasılığını verir.
Üstteki görselde standart normal dağılım eğrisini görüyoruz. Elimizde bir gözlem var ve bunu z puanına çevirdiğimizde -1 olduğunu varsayalım. Z puanının -1′ den küçük olma olasılığını hesaplamak için mavi ile işaretlenmiş soldaki kuyruğun alanına ihtiyacımız var. Peki, bunu nasıl yapacağız?
Standart normal dağılım ve Z tablosu
Z-skoruna karşılık gelen olasılık değerini bulmak için Z tablosuna ihtiyaç vardır. Z-tablosunda, -4 ile 4 arasında 0.01 birim arayla her bir z-puanı için karşılık gelen olasılık değeri hesaplanmıştır. Olasılık hesabı yapabilmek için elinizdeki Z-tablosundan Z puanına karşılık gelen olasılık değerini bulmalısınız.
Z tablosu nasıl okunur?
- Normal dağılım grafiğinde hesaplamak istediğiniz alanı belirleyin. Bazı durumlarda istediğiniz alana tek bir hesaplamada ulaşamayabilirsiniz. İki alanın olasılığını birbirinden çıkarmak durumunda kalabilirsiniz.
- Daha sonrasında Z-tablosunun 1. sütun ve satırında z-puanı değerleri vardır. Hesapladığınız z-puanın satır ve sütun üzerinde takip ederek bulun ve karşılık gelen olasılık değerini alın.
Bazı tablolarda z-puanlarını negatif görürken, diğerinde pozitif olarak görürsünüz. Z-tablosunun iki farklı versiyonu vardır.
Pozitif Z-tablosu
- Dağılım grafiğinin sağ yarısını gösterir.
- Standart normal dağılım grafiğinin orta noktası (Z = 0 veya ortalama) ile herhangi bir pozitif Z-puanı arasındaki alanın olasılık değerini verir.
- Tablonun olasılık değerleri 0.5’ten yani %50’den başlar.
Negatif Z-tablosu:
- Dağılım grafiğinin sol yarısını gösterir.
- Standart normal dağılım grafiğinin en sol uç ile Z-puanı arasındaki alanın olasılık değerini verir.
- Tablonun olasılık değerleri 0.0’dan başlar.
Her iki Z-tablosunun tüm değerleri olan haline bu linkten ulaşabilirsiniz.
Tablolara bakıp, olasılık değeri hesaplamak kulağa biraz garip gelebilir. Neyse ki, Python’da bu işi de birkaç satır kod yardımı ile halledebiliyoruz. Tablo ve manuel olasılık hesabını bakış açısı kazanmak adına hatırlatmak istedim.
Peki, Python’da normal dağılım ile olasılık hesabı nasıl yapılır?
SciPy kütüphanesi, kurulu gelen hazır kütüphanelerden biri olmadığı için kullanmadan önce dosya içerisine çağrılması gerekmektedir.
from scipy import stats
Şöyle bir örnek üzerinden gidelim. Farz edelim ki, bir matematik sınavındaki sınıf 65 not ortalaması ve 15 standart sapması ile normal dağılıma uygundur. stats modülünü kullanarak önce yukarıdaki parametrelere uygun normal dağılımı oluşturacağız.
norm_prob = stats.norm(loc = 65, scale = 15)
Bu sınıftaki bir öğrencinin en fazla 75 almış olma olasılığı nedir?
Belli bir değer ve daha altındaki değerlerden birini alma olasılığını alma şartı için kümülatif dağılım fonksiyonu kullanışlıdır. Kümülatif dağılım fonksiyonunu stats modülündeki cdf() fonksiyonu ile hesaplayabiliriz.
norm_prob.cdf(75)
0.8413447460685429
Bir öğrencinin 75 ve daha düşük bir not alma olasılığı %84 olarak hesaplandı.
Bu sınıftaki bir öğrencinin en az 75 almış olma olasılığı nedir?
En az belli bir değer alma olasılığını hesaplarken sf() – survival function fonksiyonundan yararlanırız.
norm_prob.sf(75)
0.15865525393145707
Cevabı aslında bir önceki sorudan da bulabilirdik. Normal dağılım eğrisinin altında kalanın toplamı 1’dir. Eğer 75’ten az olma olasılığı %84 ise 75 ve üzeri not olma ise 1 – %84.2 işleminden kalan %15.8 olmalıdır.
Bu sınıftaki bir öğrencinin 65 ile 75 arasında bir not almış olma olasılığı nedir?
Bu sefer iki nokta arasındaki bir alanın değerini arıyoruz. Bu sorunun yanıtını bulabilmek için önce öğrendiğimiz fonksiyonlardan kümülatif dağılım fonksiyonunu kullanacağız.
Bildiğimiz üzere kümülatif dağılım fonksiyonu en fazla bir değer alma olasılığını hesaplıyordu. Bir öğrencinin en fazla 75 alma olasılığını hesaplayıp, daha sonrasında da en fazla 65 alma olasılığını hesaplayıp, bu iki değeri birbirinden çıkardığımda aradığım alanı bulabilirim.
norm_prob.cdf(75) - norm_prob.cdf(65)
0.3413447460685429
Bu sınavdaki bir öğrencinin 65 ile 75 arasında bir not almış olasılığı %34 olarak hesaplandı.
Sınıfın öğretmeni olarak çan eğrisi yapmaya karar verdiniz ve ilk %10’a giren öğrencilere A+ notunu vermek istiyorsunuz. Hangi not ve üzeri öğrenciler A+ puanı alabilir?
Kantil fonksiyonu olarak da isimlendirilen ppf() fonksiyonu yardımıyla önceki adımlarda hesapladığımız olasılık değerlerine karşılık gelen gözlem değerini hesaplayabiliriz. Tam olarak birebir karşılığı olmasa da cdf() fonksiyonunun tersi sayılabilir.
İlk %10’luk kesime girmeyi sağlayacak notu arıyoruz. Yani, diğer bir deyişle bir öğrencinin en fazla %90. olmasını sağlayacak notu arıyoruz. Bu not ve üzeri olan notlar öğrenciyi ilk %10’luk kesime sokacaktır.
norm_prob.ppf(.90)
77.815515655446
Hesaplamaya göre 78 ve üzeri not alan öğrenciler A+ skoru almalıdır.
Verinin dağılımı
Her değişkenin değerleri bir dağılım oluşturur. Dağılımın şeklini çarpıklık (skewness) ve basıklık (kurtosis) değerleri ile karakterize edilebilir.
Çarpıklık (Skewness)
Çarpıklık, simetrik şekilden ne kadar uzaklaşıldığının ölçüsüdür diyebiliriz. Bir değişkenin dağılımı simetrik, sağa çarpık (pozitif) veya sola çarpık (negatif) olabilir.
Sağa veya sola çarpık dağılıma sahip değişkenlerin dağılım grafiklerinde uzun bir kuyruk vardır.
Dağılımın çarpıklığı, çarpıklık kat sayısı (skewness) ile ölçülür. Çarpıklık katsayısı, bir dağılımın çarpıklığının yönünü ve gücünü gösterir. Negatif bir çarpıklık değeri dağılımın sola çarpık, pozitif bir çarpıklık değeri ise dağılımın sağa çarpık olduğunu gösterir.
- Çarpıklık katsayısı -1’den küçük veya +1’den büyük ise dağılım çok çarpıktır.
- Çarpıklık katsayısı -1 ile -0.5 veya +0.5 ile +1 arasında ise dağılım orta derecede çarpıktır.
- Çarpıklık katsayısı -0.5 ile +0.5 arasında ise dağılım yaklaşık olarak simetriktir.
Basıklık (Kurtosis)
Basıklık, dağılımın sivriliğinin ölçüsüdür. Yüksek basıklığa sahip bir dağılım, ortalama değere yakın ve sivri bir tepeye ve tepeden sert inişleri olan kuyruklara sahip bir şekle benzerken, Düşük basıklığa sahip bir dağılımın görüntüsü daha düzdür.
- Basıklık katsayısı pozitif ise olasılık dağılımı lepto-basıktır (leptokurtic). Lepto-basık bir görünme sahip olasılık dağılımı görüntü olarak, ortalama değerinde (normal dağılıma nazaran) daha sivri ve kuyrukları daha “şişman” olma görüntüsü verirler.
- Basıklık katsayısı 0’a eşit ise olasılık dağılımı meso-basıktır (mesokurtic).
- Basıklık katsayısı negatif ise olasılık dağılımı plati-basıktır (platykurtic). Bu tarz bir dağılım, ortalama etrafında düşük ve yayvan ve kuyrukları kısa, sıska görünümünde veya ortası basık yamaçları dik yokuş bir “masa dağı” görünüşünde olur.
“Kusursuz normal dağılıma” sahip bir veri setinin basıklık değeri 3’e eşittir. SPSS gibi bazı istatistiksel yazılımlar, basıklık katsayısını hesaplarken, ünlü istatistikçi Ronald Fisher‘in tanıma göre hesaplanan katsayıdan “3” çıkardığı için, bu yazılımlarda kusursuz normal dağılıma sahip bir veri setinin basıklık değeri 0’a eşittir.
Çarpıklık ve basıklık katsayıları, olasılık dağılımının şekli hakkında fikir vermesi açısından önemlidir. Fakat, tek başına normallik testinin yerine kullanılamaz. Aşağıdaki görselde de net bir şekilde görüleceği üzere, çarpıklık ve basıklık kat sayısı normal dağılım değerlerine uyan fakat normal dağılıma sahip olmayan veri setleri olabilir.
Python’da çarpıklık ve basıklık değerleri nasıl hesaplanır?
Python’da çarpıklık ve basıklık değerleri SciPy kütüphanesinin stats modülünde bulunan skew() ve kurtosis() fonksiyonları ile hesaplanabilir.
Öncelikle rastgele sayılar ile bir dağılım üretip, daha sonrasında da çarpıklık ve basıklık değerlerini hesaplayacağız.
Rastgele sayılar üretmek için Python’da bulunan “random” kütüphanesini çağıracağız.
import random
random kütüphanesi kullanıma hazır. Şimdi de random kütüphanesinde bulunan randint() fonksiyonu ile 0, 100 arasında yer alan 1,000 farklı sayı üreteceğiz.
rand_num = [random.randint(0,100) for i in range(1000)]
Python’daki list comprehension yapısı ile for döngüsünü kullanarak dağılımı ürettik. Sıra çarpıklık ve basıklık değerlerini hesaplamaya geldi.
stats.skew(rand_num), stats.kurtosis(rand_num)
(-0.03933634290453327, -1.1940480919493106)
Dağılımın çarpıklık katsayısı -0.03 ve basılık kat sayısı ise -1.19 olarak hesaplandı. Çarpıklık sıfıra çok yakın. Dağılımı simetrik olarak kabul edebiliriz.
Basıklık tanımını yaparken bazı yazılımların Fisher tanımına göre hesaplanan değerden “-3” yaptığını söylemiştik. kurtosis() fonksiyonu varsayılan olarak Fisher tanımını kullanmaz. Yani, normal dağılıma uygun bir veri seti için basıklık değeri 3 olmalıdır. Fisher tanımına göre basıklık değeri hesaplamak isterseniz, kurtosis() fonksiyonuna parametre olarak “fisher = True” ifadesini girmeniz gerekmektedir.
Veri seti için hesaplanan basıklık değeri negatif ve küçüktür. Bu da dağılımın plati-basık (platykurtic) olduğuna dair yorumlanabilir.
Bu iki değer de tek başına verinin dağılımı ile ilgili net bir tespit yapmakta yeterli değildir. Veri setini bir histogram yardımı ile görselleştirdiğimiz zaman dağılımın normale benzemediğini net bir şekilde görebiliriz.
rand_num değişkeninin histogram grafiği
Bir verinin normal dağılıma uygunluğu nasıl test edilir?
Bir verinin normal dağılıma uygunluğu grafik yöntemler ve/veya normallik testi olarak da adlandırılan istatistiksel testler yardımı ile tespit edilebilir.
Grafiksel yöntemler dağılımın normal olup olmadığına yönelik hızlı bir fikir edinmeye yardımcı olurken, normallik testleri ile bulguları istatistiksel olarak da kanıtlama imkanı sağlanır.
Veri bilimcisi/analisti olarak grafikleri verinin dağılımına dair bir ön fikir edinmek için kullanıp, kesin sonuçlar istediğiniz veya emin olamadığınız durumlarda normallik testlerine başvurabilirsiniz.
Yazının bundan sonraki sürecinde teknikleri uygulamalı göstermek adına popüler online satranç oyun platformu Lichess’te oynanan ve platformun API servisi Lichess API kullanılarak elde edilmiş 20,000 adet maça ait istatistikleri kullanacağız.
Örnek veri seti: Lichess Satranç Maçı İstatistikleri
Herhangi bir işlem yapmadan önce, yazı boyunca kullanılacak kütüphaneleri çağıracağız. Veri manipülasyonu için Pandas ve NumPy ve görselleştirme için Matplotlib ve Seaborn kütüphanelerini kullanacağız. Daha öncesinde istatistiksel hesaplamalar yapmak için SciPy kütüphanesinden stats modülünü çağırmıştık. Onu tekrardan çağırmamıza gerek yoktur.
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt
Kütüphaneler kullanım için hazır. Şimdi Pandas’ın read_csv() fonksiyonu ile veri setini çağıralım.
games = pd.read_csv("games.csv")
Veri setini read_csv() fonksiyonu ile çağırdıktan yada dosyayı okuduktan sonra da diyebiliriz, Pandas’ın hazır fonksiyonlarından info()‘yu kullanarak veri setini tanımak için hızlı bir göz atacağız.
games.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 94317 entries, 0 to 94316 Data columns (total 20 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id 94317 non-null object 1 name 94317 non-null object 2 popularity 94317 non-null int64 3 duration_ms 94317 non-null int64 4 explicit 94317 non-null int64 5 artists 94317 non-null object 6 id_artists 94317 non-null object 7 release_date 94317 non-null object 8 danceability 94317 non-null float64 9 energy 94317 non-null float64 10 key 94317 non-null int64 11 loudness 94317 non-null float64 12 mode 94317 non-null int64 13 speechiness 94317 non-null float64 14 acousticness 94317 non-null float64 15 instrumentalness 94317 non-null float64 16 liveness 94317 non-null float64 17 valence 94317 non-null float64 18 tempo 94317 non-null float64 19 time_signature 94317 non-null int64 dtypes: float64(9), int64(6), object(5) memory usage: 14.4+ MB
- Veri setinde 19 değişken bulunuyor. Her bir değişken 94,317 adet gözleme sahip.
- Hiç bir değişkende kayıp veri bulunmuyor.
- Şarkılara dair şarkı ismi, yayınlanma tarihi, süresi gibi tanımlayıcı değişkenlerin yanı sıra Spotify tarafından hesaplanmış ve şarkıları içeriğine göre değerlendiren tempo, akustik, enerji gibi farklı değişkenler de bulunuyor.
Örnek veri seti hazır olduğuna göre normallik testi için yöntemleri incelemeye hazırız.
Grafik yöntemler
Biraz önce yukarıda da ifade ettiğimiz gibi grafiksel yöntemler hızlı bir fikir elde etmek için kullanışlıdır fakat, istatistiksel testler kadar kesin sonuçlar vermez. Bir verinin dağılımını tespit etmek için 4 farklı grafik tipi kullanılabilir.
1- Histogram
Histogram, veri görselleştirmede en yaygın kullanılan popüler bir grafik türüdür. Bir verinin dağılımını görselleştirmek için sıkça tercih edilir.
Veri setindeki gözlemleri kutu (bins) adı verilen eşit parçalara bölüp, eşit genişliklere sahip sütunlar olarak görselleştirir. Her bir kutunun yüksekliği, kutu içerisindeki gözlem sayısına yani kutuyu oluşturan aralıkta bulunan rakamların frekansına bağlıdır.
Bir değişken normal dağılıma sahip ise histogram zil (bell curve) şeklinde bir görünüme sahip olmalıdır.
Avantajları
- Popüler bir grafik olduğu için istatistik bilgisine sahip olmayan kişiler tarafından da anlaşılması kolaydır.
- Veriye dair hızlı bir iç görü sağlar.
Dezavantajları
- Kutu sayısı değiştikçe, grafiğin görünümü değişir. Bu durum aldatmaca yaratabilir.
- Doğru bir görüntü için optimum kutu sayısını belirlemek zordur.
Python’da histogram
Python’da histogram grafiği Pandas, Matplotlib veya Seaborn kütüphanelerinden herhangi biri kullanılarak çizilebilir.
#Pandas games["white_rating"].hist() #Seaborn sns.histplot(data = games["white_rating"]) #Matplotlib plt.hist(games["white_rating"])
Grafiklerin farkları ve benzerliklerinin daha net fark anlaşılabilmesi için her üç grafiği de yan yana koydum.
- Pandas ve Matplotlib ile çizdirilen histogramların (1 ve 3 numara) birbirinin neredeyse aynısı olduğunu fark etmişsinizdir. Pandas kütüphanesi grafikler için Matplotlib fonksiyonlarını kullanır. Pandas dokümantasyonunda histogram grafiğinin anlatıldığı bölümde bunu en tepede görebilirsiniz.
- Seaborn kütüphanesi ile çizilen histogramda kutu sayısının diğer grafiklere göre daha fazla olduğunu görebilirsiniz.
- Kutu sayısı değişince görsel algınızın nasıl değiştiğini de fark edebilirsiniz.
- Histograma göre “white_rating” değişkeni neredeyse simetrik bir görünüme sahiptir.
2- Kernel yoğunluk grafiği (KDEPlot)
Bir verinin dağılımını görselleştirebileceğimiz bir diğer grafik türü ise kernel yoğunluk grafiğidir (kernel density plot – kdeplot).
KDEPlot, histogramın kutularına benzer bir şekilde bandwidth adı verilen “genişlik” değerinden etkilenir. “Bandwidth” değeri KDEPlot’un görünümünü etkiler.
Avantajları
- Dağılımın şeklini daha iyi bir şekilde belli eder.
- Büyük veri setlerinde daha etkilidir.
Dezavantajları
- Verilerin olmadığı, özellikle kuyruklarda, veri görünümü üretme eğilimleri vardır. Dağılımın kuyruklarını hiçbir verinin olmadığı ve hatta hiçbir verinin mümkün olmadığı alanlara genişletebilir. (Ör: Negatif yaş değerleri)
Python’da Kernel yoğunluk grafiği (kdeplot)
Python’da histogram grafiği Seaborn kütüphanesinden kdeplot() fonksiyonu kullanılarak çizilebilir.
sns.kdeplot(data = games["white_rating"])
Histograma kıyasla KDEPlot grafiğinde dağılımın şeklini daha net bir şekilde görebiliyoruz.
3- Kutu grafiği (Boxplot)
Adını şeklinden alan kutu grafiği veri setindeki çeyrekleri kullanarak verinin dağılımını görselleştirir. Görselleştirme için çeyreklik değerlerini kullandığı için veri setindeki aykırı değerlerden etkilenmez.
Kutu grafiğinin yatay görünümünde sol veya dikey görünümde alt kenarı 1.çeyreklik değerini ifade ederken, sağ veya üst kenar ise 3.çeyreklik değerini ifade eder. Kutunun içerisinde yer alan dikey çizgi ise ortanca (medyan) değerini temsil eder.
Normal dağılıma sahip bir verinin kutu grafiğinde ortancayı temsil eden dikey çizgi kutunun ortasında yer almalıdır.
Avantajları
- Histogram ve yoğunluk grafiğine kıyasla daha az alan kapladığı için aynı anda birden çok değişkenin dağılımını kıyaslamak için kullanışlıdır.
Dezavantajları
- Histogram ve Kernel yoğunluk grafiğine kıyasla yorumlaması daha zor bir grafiktir.
- Kutu grafiği veri setindeki tüm değerlerin bir özetidir. Veri setindeki tüm gözlemleri içermez.
Python’da kutu grafiği (Boxplot)
Python’da kutu grafiği Matplotlib ve Seaborn kütüphanelerinden boxplot() fonksiyonu yardımı ile çizdirilebilir.
#Seaborn sns.boxplot(data = games["white_rating"]) #Matplotlib plt.boxplot(games["white_rating"]) plt.show()
Kutu grafiğine baktığımızda Seaborn ile çizilen kutu grafiğinin Matplotlib ile karşılaştırıldığında çerçeveyi orantılı olarak doldurduğunu ve daha geniş göründüğünü söyleyebiliriz. Seaborn ile çizilen grafiğin enini “width” parametresini kullanarak ayarlayabilirsiniz.
Grafikleri, verinin dağılımı açısından incelediğimizde ortancayı temsil eden çizginin kutuyu neredeyse ortalamasıan rağmen tam olarak kutunun ortasında olmadığını söyleyebiliriz.
Her iki kutu grafiğini de yan yana ekledim. Hem Matplotlib hem de Seaborn kütüphaneleri varsayılan olarak kutu grafiklerini dikey olarak konumlar. Grafikleri yatay hale getirmek için:
#Seaborn sns.boxplot(x = games["white_rating"]) #Matplotlib plt.boxplot(games["white_rating"], vert = False) plt.show()
- Seaborn’da görselleştirmek istediğimiz değişkeni “data” parametresi değil, yatay ekseni temsilen “x” parametresi ile kullanmak gerekmektedir.
- Matplotlib’de “vert” parametresini “False” olarak belirtmek gerekmektedir.
4- Q-Q grafiği (Quantile-Quantile plot)
Verinin dağılımını anlamaya yönelik bir diğer grafiksel yöntem Q-Q grafiğidir. Q-Q grafiği ile iki olasılık dağılımı (verinin dağılımı ile istenilen olasılık dağılımı) birbiri ile karşılaştırılır. Eğer iki dağılım birbirine eşit ise gözlemler Q-Q grafiğinde bulunan 45 derecelik açıyla çizilmiş düz bir çizgi üzerinde seyreder.
Avantajları
- Gözlem sayısı fazla olan veri setlerinde daha etkilidir.
- Yorumlaması ve sonuç çıkarması kolaydır.
Dezavantajları
- Gözlem sayısının az olduğu veri setlerinde yanıltıcı olabilir.
Python’da Q-Q grafiği (Q-Q plot)
Python’da Q-Q grafiği çizebilmek için stats modülünden “probplot()” fonksiyonu kullanılabilir.
stats.probplot(games["white_rating"], dist = "norm", plot = plt) plt.title("Q-Q Grafiği") plt.show()
- Q-Q grafiği ile değişkenimizin normal dağılıma göre kıyaslanması için “dist” parametresine “norm” yanıtını girdik.
- Grafikte de histogramda gördüğümüze benzer bir sonuç var. “white_rating” değişkeni grafiğin üstünde ve altında bazı sapmaları olmasına rağmen normal dağılıma çok yakındır.
- Kutu grafiğinde değişkenin aykırı değerlere sahip olduğunu görmüştük. Aykırı verilerin analiz edilip, uygun bir teknik ile giderilmesi durumunda normal dağılıma uyan bir görüntü oluşabileceğini düşünüyorum.
Python ile normallik testi/analizi
Bir dağılımın normal dağılıma uygunluğunu test etmenin ileri seviye fakat daha etkili bir yolu da normallik testi olarak da isimlendirilen istatistiksel hipotez testleridir. Normallik testi, verinin dağılımının normallik varsayımını ihlal edip etmediğini sınamak için kullanılır.
Tüm normallik testlerinde test edilecek hipotezler şöyledir:
H0: Örneklemin dağılımı normal dağılımdan anlamlı (significant) derecede farklı değildir.
H1: Örneklemin dağılımı normal dağılımdan anlamlı (significant) derecede farklıdır.
Genelde istatistiksel testler %90, %95, %99 güven seviyelerinde gerçekleştirilir. En yaygın olarak kullanılan güven seviyesi %95’tir. Yazının devamında uygulayacağımız testlerde H0 hipotezini %95 güven seviyesinde test edeceğiz.
Hipotez testleri sonucunda p-değeri hesaplanır. p-değerinin 0.08 yani %8 olması, veri normal dağılıma sahip olmadığı durumda, çalışmaların %8’i verinin normal dağılıma sahip olduğunu tespit ettiği anlamına gelir. p değerinin hata payından (1 – güven seviyesi) küçük olması durumunda H0 hipotezi red edilir.
- p değerinin 0.05’ten küçük olması durumunda: H0 hipotezi red edilir yani verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt vardır.
- p değerinin 0.05’ten büyük olması durumunda: H0 hipotezi red edilemez yani verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt yoktur.
Hipotez testlerinin genel çalışma mantığını inceledikten sonra Normallik testlerini inceleyeceğiz.
1- Shapiro-Wilk testi
1965 yılında Samuel Sanford Shapiro ve Martin Wilk tarafından geliştirilen Shapiro-Wilk testi en güçlü normalite testidir. Shapiro-Wilk testi bir veri setinin sadece ve sadece normal dağılıma uygun olup olmadığını test etmek için kullanılır.
Test sonucunda bir W istatistik değeri hesaplanır. W istatistiği 0 ile 1 arasında bir değer alır. Değer 1’e ne kadar yakınsa empirik (teorik) dağılım ile örneklem dağılımı birbirine yakındır. Diğer bir deyişle, veri normal dağılıma daha uygundur.
Test ilk ortaya çıktığı zamanlarda 50’den küçük örneklemler için kullanışlıydı. Sonradan yapılan iyileştirmeler ile örneklem büyüklüğü 2,000’e kadar çıkarıldı. M. Mahibbur Rahman and Z. Govindarajulu tarafından yapılan iyileştirmeler ile örneklem büyüklüğü 5,000’e kadar genişletildi. Örneklem büyüklüğünün 5,000’den büyük olduğu durumlarda kullanılması önerilmez.
Shapiro-Wilk testi hangi durumlarda kullanılır?
Tek değişkenli, sürekli veri türüne sahip kantitatif değişkenler için kullanışlıdır.
Avantajları
- Normalite testleri içerisinde en güçlü ve en popüler olan testtir.
Dezavantajları
- Birçok aynı değerin bulunduğu veri setinde problem yaratabilir.
- Örneklem büyüklüğü Shapiro-Wilk testinde yanlılık (bias) yaratır.
Python’da Shapiro-Wilk testi
Python’da Shapiro-Wilk testini uygulamak için SciPy kütüphanesinden stats modülü kullanışlıdır. Örnek veri seti 20 binden fazla gözleme sahip olduğu için Shapiro-Wilk testi uygun değildir. Bu testi uygulayabilmek için normal dağılıma sahip olan ve olmayan iki örnek veri seti oluşturacağız. SciPy kütüphanesinin stats modülünde, belirli bir dağılıma sahip rastgele veri setleri üretebilecek fonksiyonlar bulunmaktadır.
norm_example = stats.norm.rvs(loc = 0, scale = 1, size = 1000, random_state = 40) uniform_example = stats.uniform.rvs(loc = 5, scale = 45, size = 1000, random_state = 30)
- Normal dağılıma uygun bir veri seti üretebilmek için norm.rvs() fonksiyonunu kullandık. Bu fonksiyona 4 adet parametre girdik.
- loc: Verinin ortalaması.
- scale: Verinin standart sapması.
- size: Örneklem büyüklüğü
- random_state: Fonksiyon tekrar çalıştırıldığında ürettiğimiz verilerin her seferinde aynı olmasını sağlar. 40 rakamı semboliktir. Farklı bir rakam seçip, o rakamı düzenli olarak kullandığınızda aynı gözlem değerlerini elde edeceksiniz.
- Bir diğer sürekli olasılık dağılımı olan “uniform” dağılıma uygun veri üretebilmek için uniform.rvs() fonksiyonunu kullandık. Bu fonksiyona da yine 4 adet parametre girdik.
- loc: Veri setinin minimum değeri
- scale: loc değeri ile toplandığı zaman veri setinin maksimum değeri.
- size: Örneklem büyüklüğü
- random_state: Tekrarlanabilir rastgele sayı üretimi parametresi
Öncelikle her iki dağılımı da histogram yardımı ile görselleştirerek grafikler yardımı ile normalliğe bakacağız.
sns.histplot(data = norm_example) sns.histplot(data = uniform_example)
Yukarıdaki örnek koddan bağımsız olarak karşılaştırmanın kolay olması için bir çerçeve üreterek her iki histogramı da yan yana koydum. Soldaki grafikte normal dağılıma sahip bir sürekli veri seti bulunurken sağda ise normal dağılıma sahip olmayan bir sürekli veri seti bulunmaktadır.
Shapiro-Wilk testini her iki örnek veri setinde de uygulayarak W istatistiğinin ve p-değerine bakacağız.
w, p = stats.shapiro(norm_example) alpha = 0.05 print(w, p) if p > alpha: print('H0 hipotezi red edilemez. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt yoktur.') else: print('H0 hipotezi red edilir. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt vardır.')
0.9987836480140686 0.7442338466644287 H0 hipotezi red edilemez. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt yoktur.
- Shapiro-Wilk testini uygulayabilmek için stats modülünden shapiro() fonksiyonunu kullandık.
- Bu fonksiyon veri setini parametre olarak alır ve W istatistiği ile p-değerini yanıt olarak döner.
- %95 güven seviyesinde, alfa değerinin 0.05 olduğu durumda normal dağılıma sahip veri setinin W istatistiği 0.99, p-değeri ise 0.74 olarak hesaplandı.
- W değeri 1’e ne kadar yakınsa örneklem dağılımı normal dağılıma o kadar yakındır.
- p-değerinin 0.05’ten yani alfa değerinden büyük olması H0 hipotezinin red edilemeyeceği anlamına gelir. Yani, verinin normal dağılıma sahip olmadığını söyleyemeyiz.
Shapiro-Wilk testini bir de normal dağılıma sahip olmayan veri seti üzerinde uygulayalım ve sonuçları inceleyelim.
w, p = stats.shapiro(uniform_example) alpha = 0.05 print(w, p) if p > alpha: print('H0 hipotezi red edilemez. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt yoktur.') else: print('H0 hipotezi red edilir. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt vardır.')
0.9498206973075867 5.884024796713773e-18 H0 hipotezi red edilir. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt vardır.
Shapiro-Wilk testi uniform dağılıma sahip bir veri setine uygulandığında W istatistiği yine 1’e yakın olarak hesaplandı. Fakat, burada kritik olan durum p-değerinin %95 güven seviyesindeki değeridir. p-değeri %95 güven seviyesinde alfa değerinden küçük çıktığı için W istatistiği değeri istatistiksel olarak anlamlı değildir. H0 hipotezi red edilir. Verinin normal dağılıma sahip olmadığını net bir şekilde histogramda görmüştük.
Peki, farklı örneklem büyüklüklerinde W istatistiği nasıl davranıyor?
Bu durumu test edebilmek için farklı örneklem büyüklüklerine sahip, normal dağılma sahip binlerce örneklem oluşturup, her biri için Shapiro-Wilk testini uygulayarak W istatistiğini hesaplayacağız. Daha sonrasında da her bir örneklem büyüklüğü için W istatistiğinin örneklem dağılımını elde edeceğiz.
Normal dağılma sahip binlerce örneklem oluşturup, her birine Shapiro-Wilk testini uygulamak için bir fonksiyona ihtiyacımız var.
def samp_dist_w(n, r): lst = [] for i in range(r): norm_dist = stats.norm.rvs(loc = 0, scale = 1, size = n) w, p = stats.shapiro(norm_dist) lst.append(w) return lst
- samp_dist_w() adında bir fonksiyon oluşturduk. Bu fonksiyon 2 adet parametre kullanıyor.
- n: Her bir örneklemin örneklem büyüklüğü
- r: Oluşturulacak örneklem sayısı
- Fonksiyon ilk olarak bir for döngüsü yardımı ile parametre olarak girilen örneklem sayısı kadar tekrar ederek, önce normal dağılma uygun ortalaması sıfır, standart sapması 1 olan ve parametre olarak girilen örneklem büyüklüğü kadar örneklemler oluşturuyor.
- Daha sonrasında da her bir tekrarda Shapiro-Wilk testini uygulayıp, W istatistik değerini for döngüsü dışında oluşturulan lst adlı bir listeye atıyor.
Gerekli işlemi uygulayacak fonksiyonu oluşturduktan sonra sıra farklı örneklem büyüklüklerine sahip binlerce örneklem oluşturup, W istatistiklerini hesaplamaya geldi.
ten = samp_dist_w(10, 1000) twenty = samp_dist_w(20, 1000) fifty = samp_dist_w(50, 1000)
10, 20 ve 50 örneklem büyüklüğüne sahip 1,000 adet örnekleme dair W istatistiğini hesaplayarak W istatistiğinin örnekleme dağılımını oluşturduk.
fig, ax = plt.subplots(figsize = (12, 6)) sns.kdeplot(ten, label = "n = 10") sns.kdeplot(twenty, label = "n = 20") sns.kdeplot(fifty, label = "n = 50") ax.set_title("Farklı Örneklem Büyüklüklerinde W İstatistiğinin Örneklem Dağılımı", size = 14) ax.set_xlabel("W İstatistik Değeri", size = 12) ax.set_ylabel("Frekans", size = 12) plt.legend() plt.show()
Grafiğe göre, örneklem büyüklüğü arttıkça W istatistiği 1’e yaklaşmaktadır. Örneklem büyüklüğü arttıkça Shapiro-Wilk testi veri setindeki küçük sapmalara daha hassas hale gelir ve H0 hipotezini reddetme olasılığı artar.
2- Kolmogorov-Smirnov testi
Kolmogorov-Smirnov testi, örneklemden oluşturulan empirik kümülatif dağılım fonksiyonu (ECDF) ile ideal dağılımın kümülatif dağılım fonksiyonunu (CDF) karşılaştırarak aradaki maksimum farkın hesaplanması ile bir istatistik değeri hesaplar.
Üstteki grafikte kırmızı ile çizilen CDF ideal dağılımı temsil ederken, mavi ile çizilen ECDF ise örneklemin dağılımını temsil etmektedir. İki çizgi arasındaki maksimum fark “D” istatistiğini verir. Aradaki fark ne kadar küçükse, dağılım o kadar normale yakındır.
Kolmogorov-Smirnov testi örneklemin elde edildiği popülasyonun parametrelerinin (Ör: Normal dağılım için ortalama – µ ve standart sapma – σ) bilindiği varsayımı ile çalışır. Parametrelerin bilinmediği ve örneklem üzerinden tahmin edildiği durumlarda Lilliefors testinin kullanılması uygundur.
Kolmogorov Smirnov testi hangi durumlarda kullanılır?
Örneklemin elde edildiği popülasyon parametrelerinin bilindiği, kantitatif değişkenler için kullanılır.
Avantajları
- K-S testi farklı “sürekli (continuous)” olasılık dağılımlarının test edilmesi için de kullanılır.
- Küçük örneklemlerde de uygulanabilir. Hatta çok küçük örneklemler için eldeki tek alternatif çözümdür.
- K-S testi dağılımın merkezine daha hassastır.
Dezavantajları
- Bazı çalışmalarda testin gücü Anderson-Darling ve Shapiro-Wilk testlerine kıyasla düşük bulunmuştur.
- Kategorik veri için kullanımı uygun değildir.
- Veri setindeki aykırı değerlerden etkilenir.
- Popülasyon parametrelerinin bilinmediği durumda K-S testi ile elde edilen sonuçlar geçersizdir.
Python’da Kolmogorov-Smirnov testi
Python’da Kolmogorov-Smirnov testini uygulayabilmek için SciPy kütüphanesinin stats modülünden kstest() fonksiyonu kullanışlıdır.
K-S testini uygulayabilmek için Shapiro-Wilk testini uyguladığımız normal dağılıma uygun olan ve olmayan 2 farklı veri setini kullanıp, sonuçlarını karşılaştıracağız.
UYARI: Kolmogorov-Smirnov testi varsayılan olarak örneklemin dağılımını, ortalaması 0 ve standart sapması 1 olan standart normal dağılım ile karşılaştırır. Eğer, veri setiniz farklı bir ortalama ve standart sapması olan bir normal dağılıma sahip ise KS testi dağılımın normalden farklı olduğunu ifade edecektir. Yani p-değeri hata payından düşük olacağı için H0 hipotezi red edilecektir.
KS testi ile test etmek istediğimiz dağılımın ortalama ve standart sapması değil, dağılımın şeklidir. Bu nedenle, Kolmogorov-Smirnov testi uygulamadan önce değişken standardize edilmelidir.
K-S testini:
- Öncelikle Shapiro-Wilk testini uygularken de kullandığımız standart normal dağılıma sahip veri seti üzerinde,
- Daha sonrasında farklı ortalama ve standart sapmaya sahip yine bir normal dağılıma sahip veri seti üzerinde ve
- Son olarak da uniform dağılıma sahip bir veri setinde uygulayarak sonuçlarını inceleyeceğiz.
Standart normal dağılıma sahip örnek veri seti
ks, p = stats.kstest(norm_example, "norm") alpha = 0.05 print(w, p) if p > alpha: print('H0 hipotezi red edilemez. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt yoktur.') else: print('H0 hipotezi red edilir. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt vardır.')
0.03405908771393251 0.1921094726715316 H0 hipotezi red edilemez. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt yoktur.
- kstest() fonksiyonu çalışmak için 2 adet parametre kullanır.
- İlk parametre testin yapılacağı veri seti, ikinci parametre ise test edilecek dağılımın ismidir.
- %95 güven seviyesinde, D istatistiği 0.03, p-değeri ise 0.19 olarak hesaplandı. p-değeri alfa değeri olan 0.05’ten büyük olduğu için H0 red edilemez.
Farklı bir normal dağılıma sahip örnek veri seti
Yazının bu bölümünde K-S testini normal dağılıma sahip fakat ortalama ve standart sapması standart normal dağılımdan farklı bir veri seti üzerinde deneyeceğiz.
Öncelikle, bu tanıma uygun örnek bir veri seti oluşturacağız.
norm_nonstd_example = stats.norm.rvs(loc = 45, scale = 8, size = 1000, random_state = 20)
stats modülünden norm.rvs() fonksiyonunu kullanarak normal dağılıma sahip, ortalaması 45, standart sapması 8 ve örneklem büyüklüğü 1,000 olan örnek bir veri seti oluşturduk.
Şimdi de bu örnek veri setine K-S testini uygulayacağız.
ks, p = stats.kstest(norm_nonstd_example, "norm") alpha = 0.05 print(ks, p) if p > alpha: print('H0 hipotezi red edilemez. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt yoktur.') else: print('H0 hipotezi red edilir. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt vardır.')
1.0 0.0 H0 hipotezi red edilir. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt vardır.
Normal dağılıma sahip, fakat standart normal dağılıma sahip olmayan veri seti ile K-S testini denediğimizde H0 hipotezi red edildi. Bu nedenle K-S testini uygulamadan önce daha tutarlı ve doğru sonuçlar elde etmek için veri standardize edilmelidir.
Normal dağılıma sahip olmayan örnek veri seti
Kolmogorov Smirnov testini son olarak bir de normal dağılıma uygun olmayan bir veri seti üzerinde deneyelim.
Bir önceki örnekte gördüğümüz üzere, K-S testini uygulamadan önce veri seti standartlaştırılmalıdır. Veri setini standartlaştırmak için her bir gözlemden verinin ortalaması çıkarılır daha sonrasında da verinin standart sapmasına bölünür.
std_uniform = (uniform_example - np.mean(uniform_example)) / np.std(uniform_example)
- Hali hazırda uğraştığımız örnek verimiz bir NumPy array veri tipine sahip olduğu için yapılan her işlem sütun boyunca tüm satırlara uygulanacaktır.
- Her bir gözlemi temsilen değişkenin adını yazdık ve daha sonrasında NumPy’ın ortalama (mean) ve standart sapma (std) fonksiyonlarını kullandık.
ks, p = stats.kstest(std_uniform, "norm") alpha = 0.05 print(ks, p) if p > alpha: print('H0 hipotezi red edilemez. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt yoktur.') else: print('H0 hipotezi red edilir. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt vardır.')
0.06490703301891265 0.00041715518089314145 H0 hipotezi red edilir. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt vardır.
KS testinin daha önceden oluşturduğumuz uniform dağılıma sahip veri setinde uyguladığımız zaman %95 güven seviyesinde D istatistiğinin 0.06, p-değerinin ise 0.0004 olarak hesaplandığını görüyoruz. p-değeri alfa değerinden küçük olduğu için H0 hipotezi red edilir. Veri setinin normal dağılıma sahip olduğunu söyleyemeyiz.
3- Lilliefors testi
Lilliefors testi, Kolmogorov Smirnov (K-S) testinin geliştirilmiş bir alternatifidir. Bazı kaynaklarda ve istatistiksel yazılımlarda Lilliefors düzeltmeli Kolmogorov-Smirnov testi olarak da isimlendirilir.
Aynı K-S testinde olduğu gibi örneklemden oluşturulan empirik kümülatif dağılım fonksiyonu (ECDF) ile ideal dağılımın kümülatif dağılım fonksiyonunu (CDF) karşılaştırarak aradaki maksimum farkın hesaplanması ile bir istatistik değeri hesaplanır. Hesaplanan istatistik değeri ne kadar küçükse, örneklemin dağılımı normal dağılma o kadar yakındır.
Lilliefors testi hangi durumlarda kullanılır?
Örneklemin elde edildiği popülasyon parametrelerinin bilinmediği, kantitatif değişkenler için K-S testi yerine Lilliefors testi kullanılır.
Avantajları
- Popülasyon parametrelerinin bilinmediği durumlarda kullanışlıdır.
Dezavantajları
- Testin gücü Anderson-Darling ve Shapiro-Wilk testlerine kıyasla düşüktür.
- Kategorik veri için kullanımı uygun değildir.
- Veri setindeki aykırı değerlerden etkilenir.
Python’da Lilliefors testi
Python’da Lilliefors testini uygulayabilmek için StatsModels kütüphanesinden lilliefors() fonksiyonu kullanışlıdır. Lilliefors testini önce normal dağılıma sahip test verisi, daha sonrasında da örnek veri setindeki “white_rating” değişkeni üzerinde uygulayacağız.
from statsmodels.stats.diagnostic import lilliefors lf, p = lilliefors(norm_example) alpha = 0.05 print(lf, p) if p > alpha: print('H0 hipotezi red edilemez. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt yoktur.') else: print('H0 hipotezi red edilir. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt vardır.')
0.015932587395239173 0.8369647792078794 H0 hipotezi red edilemez. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt yoktur.
- İlgili fonksiyonu kullanabilmek için öncelikle çalışma dosyamıza çağırmamız gerekir. İlk satırdaki from … import kalıbı ile belirttiğimiz kütüphaneden sadece “lilliefors” fonksiyonunu dosyamıza çağırdık.
- Daha sonrasında fonksiyonu veri setini parametre olarak girerek çalıştırdık.
- Çıkan sonuçlara göre, artık bildiğimiz üzere, örnek veri seti normal dağılıma uygundur.
Lilliefors testini “white_rating” değişkeni için uygulayalım.
lf, p = lilliefors(games["white_rating"]) alpha = 0.05 print(lf, p) if p > alpha: print('H0 hipotezi red edilemez. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt yoktur.') else: print('H0 hipotezi red edilir. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt vardır.')
0.04251040616239221 3.0230930144625103e-95 H0 hipotezi red edilir. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt vardır.
Lilliefors testi ile hesaplanan istatistik değeri 0’a çok yakın oldu. Aynı Kolmogorov-Smirnov testinde oldupu gibi, bu değer ne kadar küçükse o kadar iyi. Fakat buradaki problem p-değerinde. %95 güven seviyesinde p-değeri, alfa değeri olan 0.05’ten küçüktür. Bu da H0 hipotezinin red edilmesi anlamına gelir. Yani, hesaplanan istatistik değeri istatistiksel olarak anlamlı değildir. Lilliefors testi sonuçlarına göre “white_rating” değişkeninin normal dağılıma sahip olduğunu söyleyemeyiz.
4- Anderson-Darling testi
1952 yılında Theodore Anderson ve Donald Darling tarafından geliştirilmiştir. Anderson-Darling testi, Kolmogorov-Smirnov testinde olduğu gibi empirik kümülatif dağılım fonksiyonu (ECDF) ile ideal dağılımın kümülatif dağılım fonksiyonunu (CDF) karşılaştırır.
K-S testinden farklı olarak iki eğri arasındaki maksimum farkı değil veri değerlerinin tüm aralığını ele alır ve A2 istatistiğini oluşturur. A2 istatistiği ne kadar küçükse, gözlemlenen dağılım ile ideal dağılım birbirine o kadar yakındır.
Anderson-Darling testi testi hangi durumlarda kullanılır?
Kantitatif değişkenler (aralıklı veya oransal ölçekli veri tiplerinde) için Anderson-Darling testi kullanılır. Dağılım grafiğinde kuyrukların uzun olduğu veri setlerinde daha güçlüdür.
Avantajları
- AD testi KS testine kıyasla dağılımın kuyruklarındaki değişimlere daha hassastır. (Küçük ve büyük uç değerlere karşı daha duyarlıdır.)
- AD testi çok büyük örneklemlerde bile küçük farkları yakalama konusunda daha iyidir.
- Normal dağılım dışında, Weibull, Lognormal gibi farklı dağılımları test etmekte de kullanılabilir.
- Örneklem dağılımının hangi dağılıma uyduğunu tespit etmek için birden çok dağılımı test etmek adına kullanışlıdır.
- AD testi farklı güven seviyelerini/hata payını (normal dağılım için 15%, 10%, 5%, 2.5%, 1% hata payı) test ederek birden fazla p-değeri hesaplar. Bu özellik, testin sonuçlarını daha geniş bir perspektiften yorumlama imkanı sunar.
Dezavantajları
- Kategorik veri için kullanımı uygun değildir.
- AD testi verideki benzer (aynı) değerlerden etkilenir ve veri dağılımı normal bile olsa H0 hipotezini red edebilir. Bu probleme karşı Shapiro-Wilk testine göre daha çok etkilenir.
Python’da Anderson-Darling testi
Python’da Anderson-Darling testi stats modülündeki anderson() fonksiyonu ile kolaylıkla uygulanabilir.
Anderson-Darling testini normal dağılıma uyan örnek veri seti üzerinde test edelim.
print(stats.anderson(norm_example))
AndersonResult(statistic=0.27184625454617617, critical_values=array([0.574, 0.653, 0.784, 0.914, 1.088]), significance_level=array([15. , 10. , 5. , 2.5, 1. ]))
AD test istatistiği olabildiğince küçük. AD testini tanıtırken bahsettiğimiz gibi farklı güven seviyelerinde, karşılık gelen p-değerleri hesaplandı. Hesaplanan p-değerlerinin karşılık gelen hata payından büyük olduğunu görüyoruz. Yani, 5 farklı güven seviyesinde de H0 red edilemez.
Aynı testi bir de normal dağılıma uymadığını bildiğimiz bir veri setinde uyarlayarak farkı görelim.
print(stats.anderson(uniform_example))
AndersonResult(statistic=12.964104103785758, critical_values=array([0.574, 0.653, 0.784, 0.914, 1.088]), significance_level=array([15. , 10. , 5. , 2.5, 1. ]))
AD testini uniform dağılıma sahip örnek veri setinde çalıştırdığımız zaman, AD istatistiğinin 12 civarında hesaplandığını ve bir önceki örneğe göre baya büyüdüğünü görüyoruz. Farklı güven seviyelerinde p-değeri hata payından büyük olmasına rağmen AD istatistiğinin çok yüksek olmasından dolayı testin bu veri seti üzerindeki sonuçlarına şüpheyle yaklaşmakta fayda var.
5- Jarque-Bera testi
1980 yılında Carlos Jarque ve Anil K.Bera tarafından önerilen Jarque-Bera testi dağılımın basıklık ve çarpıklık ölçülerini kullanmaktadır. Normal dağılıma sahip bir veri setinin çarpıklık değeri 0, basıklık değeri ise 3 olmalıdır.
Çarpıklık ve basıklık değerleri kullanılarak hesaplanan JB istatistiği sıfıra ne kadar yakınsa, verinin dağılımı o kadar normal dağılıma uygundur.
Jarque-Bera testi testi hangi durumlarda kullanılır?
Örneklem büyüklüğü 2,000’den fazla olan kantitatif değişkenler yani büyük veri setleri için Jarque-Bera testi kullanılabilir.
Avantajları
- Örneklem büyüklüğünün fazla olduğu veri setlerinde kullanışlıdır.
Dezavantajları
- Örneklem büyüklüğünün az olduğu durumlarda testin gücü azalmaktadır.
- Verideki aykırı değerlere karşı hassastır. Aykırı değerlerin bulunduğu durumlarda JB testinin kullanımında dikkatle karar verilmelidir.
Python’da Jarque-Bera testi
Python’da Jarque-Bera testini uygulamak için yine SciPy kütüphanesinin stats modülünden yararlanacağız. Bu modülde yer alan jarque_bera() fonksiyonu JB testini uygular.
Öncelikle JB testine uygun bir normal dağılıma uyan veri seti üretip, testi bu verinin üzerinde uygulayacağız.
norm_jb = stats.norm.rvs(loc = 0, scale = 1, size = 7000) jb, p = stats.jarque_bera(norm_jb) alpha = 0.05 print(jb, p) if p > alpha: print('H0 hipotezi red edilemez. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt yoktur.') else: print('H0 hipotezi red edilir. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt vardır.')
0.1768311132783694 0.9153804052702921 H0 hipotezi red edilemez. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt yoktur.
- İlk olarak stats modülündeki norm.rvs() fonksiyonunu kullanarak normal dağılan ve örneklem büyüklüğü 7,000 gözlem olan bir test verisi ürettik.
- Daha sonrasında jarque_bera() fonksiyonu ile JB testini uyguladık.
- Test sonuçlarına göre %95 güven seviyesinde p-değeri alfa değerinden büyük olduğu için, H0 hipotezini reddetmek için yeterli kanıt yoktur.
Peki Jarque-Bera testini örnek satranç veri setindeki “white_rating” değişkeninde uygularsak, sonuç nasıl olacak?
jb, p = stats.jarque_bera(games["white_rating"]) alpha = 0.05 print(jb, p) if p > alpha: print('H0 hipotezi red edilemez. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt yoktur.') else: print('H0 hipotezi red edilir. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt vardır.')
302.42537791649875 0.0 H0 hipotezi red edilir. Verinin normal dağılıma sahip olmadığını söylemek için yeterli kanıt vardır.
JB testini “white_rating” değişkenine uyguladığımızda, JB istatistiği inanılmaz derecede yüksek çıktı. p-değerinin de hata payından (0.05) küçük olması, verinin normal dağılıma sahip olmadığını söylüyor. Fakat, burada hatırlanması gereken durum değişkenimizde aykırı değerlerin olmasıdır. Histogram ve Q-Q grafiğinde de değişkenin tam bir normal dağılıma sahip olmadığı belli olsa da aykırı değerlerden dolayı test sonuçlarına biraz şüpheci yaklaşmakta fayda var.
Uygun normallik testi nasıl seçilir?
Yazı içerisinde, literatürde sıkça rastlanılan ve popüler olan 5 farklı normallik testini inceledik. İncelediğimiz tüm normallik testlerinin farklı avantaj ve dezavantajlarından bahsettik. Normallik testi seçimi yaparken aşağıdaki şartlara dikkat edilmelidir:
Örneklem ile karşılaştırmak istediğiniz normal dağılım parametreleri.
Normallik testleri, çarpıklık ve basıklık değerleri, dağılım veya karakteristik fonksiyonu ve normal dağılımlı bir değişken ile standart normal z arasında var olan doğrusal ilişki gibi odaklandıkları normal dağılımın özelliklerine göre farklılık gösterir.
- Eğer örneklem ile normal dağılımın herhangi bir parametresini karşılaştırmak için Kolmogorov-Smirnov veya Anderson-Darling testi,
- Eğer herhangi bir parametre ile ilgilenmiyor ve sadece örneklemin dağılımının normal dağılıma uygun olup olmadığını test etmek istiyorsanız Shapiro-Wilk, Anderson-Darling, Lilliefors testini tercih edebilirsiniz..
Örneklem büyüklüğü.
Örneklem büyüklüğü, normallik testi seçimini etkileyen faktörlerden bir tanesidir. Normallik testlerinin etkinlikleri farklı örneklem büyüklüklerinde değişiklik göstermektedir.
- Shapiro-Wilk testi küçük örneklemler için de kullanışlıdır. Örneklem büyüklüğünün 2,000’den fazla olduğu durumlarda kullanılması önerilmez.
- Örneklem büyüklüğü arttıkça Q-Q grafiği tercih edilebilir.
Dağılımın karakteristik özelliği.
Örneklemin dağılımının şekli test seçiminde önemlidir.
- Örneklemin dağılım grafiğinde kuyrukların uzun olduğu veri setlerinde Anderson-Darling testi tercih edilebilir.
- Örneklem verisinde aykırı değerlerin olduğu durumlarda daha güçlü olan Jarque-Bera testi tercih edilebilir.
Testin gücü
Normallik testlerinin gücü farklı koşullar altında değişiklik göstermektedir. Testin gücü, sıfır hipotezini gerçekte yanlış olduğunda reddetme olasılığıdır.
- Hata payı
- Örneklem büyüklüğü
- Değişkenin varyansı
- Araştırmanın tasarımı
Literatürde birçok farklı durumu göz önüne alarak, farklı simülasyon testleri ile güç karşılaştırılması yapılmıştır.
Daha detaylı bir okuma ve araştırma için aşağıdaki çalışmalar kaynak olarak kullanılabilir:
- Bazı Normallik Testlerinin 1.Tip Hataları ve Güçleri Bakımından Kıyaslanması
- Farklı Örneklem Genişliklerinde Normal Dağılım Testlerinin Karşılaştırılması
- Normallik Testlerinin Karşılaştırılması
Normallik testleri hakkında bir durum değerlendirmesi
Farklı birçok normallik testini inceledik, kullanım alanlarını, yapay ve gerçek veri setleri üzerindeki doğruluğunu test ettik. İncelediğimiz örneklerde testlerin farklı dağılım veya farklı örneklem büyüklüklerine sahip veri setlerinde farklı sonuçlar üretebildiğini de gördük.
Normallik testleri:
- Örneklem büyüklüklerinin az olduğu durumlarda, normallik varsayımını reddetmesi gerekirken, düşük güç sebebiyle red etmeyebilir.
- Örneklem dağılımını “mükemmel ve kusursuz” normal dağılım eğrisi ile kıyasladığı için örneklem büyüklüğünün fazla olduğu durumlarda, normal dağılımdan kabul edilebilir ve ufak sapmalar olması durumunda bile H0 hipotezini reddeder.
- Seçilen teste göre sonuçlar farklı koşullar altında değişiklik gösterir.
Sonuç olarak, hiçbir normallik testinin %100 güvenilir ve kesin sonuçlar vermediğini söyleyebiliriz.
Peki, bu durumda normallik testi gereksiz mi?
Bu soruya yanıt vermeden önce normallik testinin kullanım amacını tekrar gözden geçirmemiz gerekir.
Yapay verilerle çok güzel ve kusursuz histogramlar çizmek kolay olsa da gerçek veri setleri büyük olasılıkla gerçekten normal dağılıma sahip değildir. Veri setinin normal dağılıma mükemmel şekilde uygun olmasını beklemek yerine, normal dağıldığını varsayabilecek kadar normal dağılımdan az sapmasını beklemek daha gerçekçi olacaktır.
Bu nedenle, normallik testi için sorulması gereken soru “Verilerimin dağılımı normal dağılıma uygun mudur?” değil, “Veri setimin dağılımı, normallik varsayımına dayanarak yaptığım çıkarımları etkileyecek kadar normal dağılımdan sapma gösteriyor mu?” olmalıdır.
Bir veri setinin normal dağılım gösterip göstermediği nasıl anlaşılır?
1. Yukarıda yaptığımız değerlendirme ışığında, bir veri setinin normal dağılıma ne kadar yakın olduğunu anlamak için öncelikle grafik yöntemlerden faydalanılmalıdır.
2. Eğer tek bir değişken için inceleme yapıyorsanız, histogram veya Kernel yoğunluk grafiği dağılım hakkında hızlıca bir fikir elde edinmenize yarar sağlar. Normal dağılıma sahip bir dağılımın zil şeklinde (bell curve) olmasını bekleriz. Birden çok değişken için inceleme yaptığınız durumlarda ise kutu grafikleri yardımı ile daha hızlı bir şekilde keşif yapabilirsiniz. Normal dağılıma sahip bir dağılımın kutu grafiğinde, ortanca değeri temsil eden çizgi kutunun tam ortasında yer almalıdır.
3. Bazı dezavantajlarından dolayı histogram ve Kernel yoğunluk grafiği yanıltıcı olabilir. Ön incelemeyi tamamladıktan sonra daha net sonuçlar elde etmek için Q-Q grafiğinden faydalanabilirsiniz. Q-Q grafiğinde, normal dağılımı oluşturan gözlemler 45 derece açıyla çizilmiş doğrusal çizgi boyunca takip eder.
4. Özellikle örneklem büyüklüğünün az olduğu durumlarda, grafik yöntemler tek başına yeterli gelmeyecektir. Bu noktada normallik testlerinden de veri setinize uygun olanını seçerek faydalanabilirsiniz. Hatta, duruma göre birden fazla normallik testini de kullanabilirsiniz. Normallik testlerinin hassas ve yanıltıcı doğasından dolayı, grafik yöntemler, dağılımın çarpıklık ve basıklık değerleriyle birlikte kullanmanızı, değerlendirmenizi ve sunmanızı öneririm. Normallik testleri konusunda örneklem büyüklüğü ile ilgili endişeleri mutlaka not olarak hatırlayın.
Veriler normal dağılım göstermiyorsa ne yapılmalı?
Verilerin normal dağılıma uygun olmadığı veya normal dağılıma yakın olmadığı kabul edilen durumlarda izlenecek bazı alternatif stratejiler vardır. Bu yöntemleri şöyle özetleyebiliriz:
1. Örneklem büyüklüğünün artırılması.
Araştırmanın kaynakları da hesaba katılarak, imkan varsa örneklem büyüklüğü artırılabilir. Örneklem büyüklüğünün 30’dan fazla olduğu durumlarda Merkezi Limit Teoremi‘ne göre, popülasyondan yeteri miktarda örneklemler oluşturulduğunda, örneklem istatistiğinin oluşturduğu örneklem istatistiğinin dağılımı, örneklemin dağılımdan bağımsız olarak normal dağılıma yaklaşır.
2. Yeniden örnekleme (Bootstrap) yöntemi ile örneklem dağılımının oluşturulması.
Veri bilimcisi/analisti açısından cazip olan örneklem büyüklüğünün artırılması olsa da, gerçek hayattaki birçok engelden dolayı (maliyet, zaman vs.) gerçekleşmeyebilir.
Örneklem büyüklüğünün az olduğu durumlarda, yeniden örnekleme yöntemi ile örneklem dağılımı oluşturulup, örneklem dağılımı üzerinden istatistiksel çıkarımlar yapılabilir.
3. Aykırı değerlerin giderilmesi.
Verinin dağılımını etkileyen faktörlerden bir tanesi de veri setinde bulunan aykırı değerlerdir. Aykırı değerlerin analizi ve daha sonrasında uygun yöntemler ile giderilmesi ile normal dağılıma uygunluk sağlanabilir.
4. Veri dönüşüm yöntemlerinin uygulanması.
Aykırı değerlerin analizinden sonra kullanılabilecek bir diğer strateji ise veri dönüşüm (data transformation) yöntemleridir. Veri dönüşümü, değişkenin aldığı değerlerin matematiksel bir fonksiyon yardımıyla başka değerlere değişimine denir. Veri dönüşümü, normallik gibi istatistiksel varsayımların sağlanmasına yardımcı olduğu için önemlidir.
5. Olasılık dağılımının belirlenmesi için farklı çalışmalardan yararlanılması.
Yazının başında normal dağılımın tanımını yaparken, normal dağılıma uygun olarak gerçekleşen boy uzunluğu, IQ skorları gibi bazı olayları örnek olarak incelemiştik. Boy uzunlukları, IQ skorları gibi bazı rastgele olayların sonuçlarının dağılımı bilinmektedir.
Belirli bir sonucun belirli bir dağılımı izlediğini biliyorsak, verilerin dağılımını doğrulamak için yapılan testin önerdiğine rağmen bu dağılımı varsaymak muhtemelen daha iyi bir strateji olabilir.
6. Non-parametrik yöntemlerin kullanılması.
Verinin dağılımının normal dağılıma uygun olmadığı durumlarda kullanılabilecek son bir yöntem ise herhangi bir dağılım varsayımına bağlı çalışmayan, Mann-Whitney U, Willcoxon İşaretli Sayılar testi gibi non-parametrik istatistiksel hipotez testlerini veya Decision Tree, Random Forest gibi makine öğrenmesi modellerini tercih etmek olabilir.
Kaynakça
Theoria Modus Corporum Coelestium – Carl Friedrich Gauss [Theory of the Motion of Heavenly Bodies]