Python ile Hipotez Testleri – Parametrik Testler Bölüm – 1/3

Hipotezlerin testi, genel olarak iki değer arasındaki farkın raslantı sonucu ortaya çıkıp çıkmadığının araştırılmasıdır. Eğer raslantı sonucu ortaya çıkmış ise H0 ile gösterilen yokluk hipotezi reddedilemez. Eğer iki anakütlenin ortalamaları arasındaki fark ile ilgileniyorsak; bunlardan çekilen örneklemlerin ortalamalar arasındaki farka ait hipotez testleri yaparak, farkın doğru olup olmadığını anlayabiliriz. Bu yazıda ise size Python ile hipotez testlerinin nasıl yapıldığından bahsedeceğim. Tabi öncelikle hipotez testlerinin temel varsayımlarını incelememiz lazım.

Hipotez Testleri için Temel Varsayımlar

  1. Örneğe alınan birimler birbirlerinden bağımsız olarak seçilmiş olmalıdırlar.
  2. Anakütle normal dağılıma sahip olmalıdır.
  3. İki anakütle söz konusu ise bunların varyansları eşit olmalıdır.

Eğer bu varsayımlar sağlanıyor ise parametrik, sağlanmıyor ise parametrik olmayan testler kullanılır.

Normallik Testleri

Normallik testi, verilerin parametrik olup olmadığını test eder. One Sample Kolmogorov Smirnov Testi veya Shapiro-Wilk Testi ile verilerin normal dağılıp dağılmadığına bakılır.

Shapiro-Wilk Normallik Testi

Öncelikle normal dağılıma uygun rasgele sayılar üretelim

x = stats.norm.rvs(size=100)

Şimdi ise normallik testimiz çalıştıralım

shapiro_result = stats.shapiro(x)

Testimizin çıktısı aşağıdaki gibidir

(0.9911503791809082, 0.7568293213844299)

Görüldüğü gibi testin çıktısı şuanki hali ile pek birşey ifade etmiyor. Çıktının ilk değeri bize t istatistiğini verirken, ikinci değer bize p değerini veriyor. Bu değerleri tablo içerisini atarak daha okunabilir hale getirebiliriz.

data = {'DF':[len(x) - 1],
         'Test Statistic':[shapiro_result[0]],
         'p-Value':[shapiro_result[1]]}
result = pd.DataFrame(data)

Daha güzel oldu!

Tek Örneklem Kolmogorov Smirnov Normallik Testi

Bir önceki test için ürettiğimiz veriyi bu testte de kullanalım.

kolmogorov_result = stats.stats.kstest(x, cdf = 'norm')

Test fonksiyonu içindeki cdf argümanı ile test etmek istediğimiz dağılımı belirliyoruz. Normal dağılımı test etmek istediğimiz için cdf içine ‘norm’ yazdık.
Test sonucunu incelemek için tablomuzu oluşturalım.

data = {'DF':[len(x) - 1], 
        'Test Statistic':[kolmogorov_result[0]], 
        'p-Value':[kolmogorov_result[1]]}
result = pd.DataFrame(data)

Homojenlik Testleri

Varyansların homojenliğini test etmek için birden çok test vardır. Aşağıda bu testlerden 3 tanesi gösterilmiştir.

    1. Bartlett Testi: Eğer veri normal dağılmış ise bu testi kullanmak en mantıklı hareket olacaktır.
    2. Levene Testi: Bu test, normallikten sapma konusunda Bartlett testinden daha dayanıklıdır.

Yukarıdaki bütün testler için null hipotezi “Bütün populasyonların varyansları birbirine eşittir.”, alternatif hipotezi ise “en az ikisi farklıdır.”
p değerinin homojenliği test ederken 0.05’ten büyük olması lazım.

Barttlett Testi

Eğer bir tane bağımsız değişken kullanırsak testi aşağıdaki gibi yapmamız lazım.Önce veriyi tanımlayalım. Daha sonra testimizi çalıştıralım. Ardından da sonuçları tabloya ekleyelim.

a = [10,7,20,14,14,12,10,23,17,20,14,13,11,17,21,11,16,14,17,17,19,21,7]
b = [1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,]
bartlett_result = stats.bartlett(a, b)
data = {'DF':[len(a) - 1], 
        'Test Statistic':[bartlett_result[0]], 
        'p-Value':[bartlett_result[1]]}
result = pd.DataFrame(data)

Levene Testi

Bu testte de Bartlett testindeki veriyi kullanacağız.

levene_result = stats.levene(a, b)
data = {'DF':[len(a) - 1], 
        'Test Statistic':[levene_result[0]], 
        'p-Value':[levene_result[1]]}
result = pd.DataFrame(data)

Parametrik Testler

İstatistiksel bir test yapacağımız zaman önce verinin nitel yada nicel olma durumunu inceleriz. Eğer nicelse örneklem hacmimize bakarız. Örneklem hacmimiz 30’dan büyük veya eşitse parametrik testleri kullanırız. Ayrıca parametrik test kullanabilmek için verinin normal dağılıma sahip olması ve verinin homojen dağılması gerekir.

T Testi

T-Testi, iki ortalamanın karşılaştırılmasında kullanılır. Eğer karşılaştıracağınız ortalama sayısı ikinin üzerinde ise Varyans Analizi yöntemini kullanmanız gerekecektir.

One Sample T-Test

One Sample T-testine şöyle bir örnek verelim; bir şişe doldurma makinesi 500 ml’lik şişeleri dolduruyor. Şişelerin dolum miktarları normal dağılıma uyuyor. Üretici ise makinenin şişeleri tam doldurmadığını düşünüyor. Doldurulmuş olan 20 tane şişe seçiliyor.Burda tek taraflı test daha uygundur çünkü üretici özellikle dolum hacimlerinin 500 ml’den az olup olmadığını bilmek istiyor. Null hipotezimiz “Ortalama dolum hacmi 500 ml’ye eşittir.” ve alternatif hipotezimiz “Ortalama dolum hacmi 500 ml’den azdır.”.Önce verimizi yükleyelim.

bottles = pd.read_csv('bottles.csv').iloc[:, 1:]
oneSample_result = stats.ttest_1samp(bottles, popmean=500)

Şimdi ise testin sonuçlarını tabloya aktaralım.

data = {'DF':[bottles.count()[0] - 1], 
        'Test Statistic':[oneSample_result[0][0]], 
        'p-Value':[oneSample_result[1][0]]}

Şuan itibari ile testimiz 2 yönlüdür. Scipy kütüphanesindeki t testlerinde testin yönünü belirleyebileceğimiz bir argüman olmadığı için yapmamız gerekn bazı işlemler var. Eğer tek yönlü test yapıcaksak; büyük olacağını test edeceksek p/2 < alpha ve t > 0, küçük olacağını test edeceksek p/2 < alpha ve t < 0 olmalıdır.

if result['p-Value'].values/2.0 < 0.05 and result['Test Statistic'] < 0:
    print('Ortalama dolum hacmi 500 ml\'ye eşittir.')
else:
    print('Ortalama dolum hacmi 500 ml\'den azdır.')

p/2 < alpha ve t > 0 koşulunu sağlayamadığımız için “Ortalama dolum hacmi 500 ml’den azdır.” diyoruz.

Independent Sample T-Test

Independent sample t-testinde ise tek örneklem t-testinden farklı olarak iki ayrı bağımsız grubun ortalamaları karşılaştırılır.
Independent Sample T-Testine şöyle bir örnek verelim. mtcars veri setini kullanarak manuel ve otomatik şanzımanlı araçların galon başına katettikleri mil miktarlarının arasında anlamlı bir farklılık olup olmadığını test edelim.
Önce veriyi yükleyelim.

mtcars = pd.read_csv('mtcars.csv').rename(columns = {'Unnamed: 0': 'car'})
mtcars.head(


Şimdi ise otomatik ve manuel şanzımanlı arabaların dağılımını incelemek için boxplot yapalım. İlk önce otomatik ve manuel şanzımanların yakıt harcamalarını veriden çekelim. Daha sonrada boxplot oluşturalım.

manual = mtcars[mtcars['am'] == 1]['mpg']
automatic = mtcars[mtcars['am'] == 0]['mpg']

sns.boxplot(data = [automatic, manual], linewidth = 2.5, width = 0.50)
plt.title('Achieved mileage of Automatic and manual cars')
plt.ylabel('Miles per gallon')
plt.xlabel('Type of car (automatic - 0/ manual - 1)')


Şimdi ise testimizi uygulayalım ve sonuçları tabloya aktaralım.

independentSample_result = stats.ttest_ind(np.log(automatic), np.log(manual), equal_var=True)

data = {'DF':[automatic.count() + manual.count() - 2], 
        'Test Statistic':[independentSample_result[0]], 
        'p-Value':[independentSample_result[1]]}
result = pd.DataFrame(data)


Görüldüğü gibi p < 0.05’tir. Yani araç şanzıman tipi ile galon başına katettikleri mesafe arasında anlamlı bir fark yoktur.

Paired Sample T-Test

Özellikle deneme modelli araştırmalarda deney öncesi ve sonrası değerlerin karşılaştırılmasına ihtiyaç duyulabilir. Bunun dışında belli bir grubun ilişkili fakat farklı iki konu ya da uygulamaya ilişkin görüşlerini karşılaştırmak isteyebilirsiniz.
Örnek verimizde 20 fare 3 ay süresince X tedavisi uygulanmıştır. X tedavisinin farelerin kütlesine etkisinin olup olmadığını test etmek istiyoruz.
Öncelikle verimizi yükleyelim.

before = [200.1, 190.9, 192.7, 213, 241.4, 196.9, 172.2, 185.5, 205.2, 193.7]
after  = [392.9, 393.2, 345.1, 393, 434, 427.9, 422, 383.9, 392.3, 352.2]
groupB = ['before', 'before', 'before', 'before', 'before', 'before', 'before', 'before', 'before', 'before']
groupA = ['after', 'after', 'after', 'after', 'after', 'after', 'after', 'after', 'after', 'after']
df = {'group':groupB + groupA,'weight':before + after}
veri = pd.DataFrame(df)

Daha sonra ise boxplot ile tedavi öncesi ve sonrası kütlelerin dağılımlarına bakalım.

beforeW = veri[veri['group'] == 'before']['weight']
afterW = veri[veri['group'] == 'after']['weight']

sns.boxplot(data = [beforeW, afterW], linewidth = 2.5, width = 0.50)
plt.ylabel('Weight')
plt.xlabel('Groups (before: 0 / after: 1)')


Şimdi ise testimizi çalıştırarak sonucu inceleyelim.

pairedSample_result = stats.ttest_rel(beforeW, afterW)

data = {'DF':[len(before) + len(after) - 2], 
        'Test Statistic':[pairedSample_result[0]], 
        'p-Value':[pairedSample_result[1]]}

result = pd.DataFrame(data)


Görüldüğü gibi p değerimiz 0.05’ten oldukça küçüktür. Yani H0 hipotezini red edebiliriz. X tedavisinin farelerin kütlelerini etkisi vardır.

Eveet, parametrik testlerin sonuna geldik. Görüşmek üzere, esen kalın…

 

Kaynakça:Akkuş, Ö., & Günay, S.  (2016).İstatistiksel Hipotez Testleri(Teori ve Uygulamaları)(1. baskı). Ankara:Gazi Kitabevi

Yazar Hakkında
Toplam 10 yazı
Alperen Balık
Alperen Balık
Yıldız Teknik Üniversitesi İstatistik Bölümü Mezunu. Veri Bilimcisi. İlgilendiği alanlar; Makine Öğrenmesi, Dashboard Tasarlama, Yazılım Geliştirme
Yorumlar (1 Yorum)
Hasan
Hasan Yanıtla
- 14:48

Hangi kütüphaneleri kullandığınızı belirtmemişsiniz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara