İstatistiksel veri analizi iki farklı gruba ayrılır: Betimsel ve Çıkarımsal İstatistik
Betimsel istatistik, bir örneklem grubunu grafikler ve ortalama, varyans gibi özet rakamlar aracılığı ile tanımlamak için kullanılır. Betimsel istatistik ile gözlemlenen/ölçümlenen değerler tanımlandığı için herhangi bir “belirsizlik” yoktur.
Veri analizinin bir diğer kolu olan çıkarımsal istatistik, popülasyondan elde edilen ve popülasyonu temsil eden örneklem adı verilen bir/birden çok alt grubu kullanarak, popülasyon hakkında genelleştirilebilir tahminler yapabilmek için kullanılır.
Örneklemden elde edilen bulguların, sadece bir grup için geçerli olması değil, tüm popülasyona genelleştirilebilir/uygulanabilir olması istenir. Seçilen örneklemin, popülasyonu yeterince iyi temsil edip/etmediğine yönelik bir “belirsizlik” vardır.
Araştırmalarda popülasyon yerine örneklem gruplarını kullanmak zaman, maliyet ve kolaylık gibi önemli avantajlar sağlar. Peki, örneklem nerede yetersiz kalır? Sınırları nelerdir?
Belirsizlik ve örneklemin sınırları
Popülasyondan rastgele çekilen her örneklem, sınırlı sayıda büyüklüğe sahip olduğu için, doğası gereği popülasyon hakkında sınırlı bilgiye sahiptir.
Her bir örneklem için hesaplanan ortalama, varyans gibi istatistikler örneklemi oluşturan elemanlardan etkilenir ve bu nedenle örneklemden örnekleme değişkenlik gösterir. Bir örneklem istatistiği ile popülasyon parametresi arasındaki farklılığa “örnekleme hatası (sampling error)” denir. Örnekleme hatası nedeniyle örneklem tek başına bir parametreyi tahmin edebilecek yeterliliğe sahip değildir.
Bir örnek üzerinden popülasyon ve içerisinden rastgele çekilen örneklemlerin farklarını inceleyelim.
- Popülasyonu temsilen, 0 ile 100 arasında değişen rakamlardan, rastgele 100,000 adet sayı üretelim.
- Popülasyona yönelik ortalama parametresini hesaplayalım.
- Daha sonrasında da popülasyondan rastgele örneklemler seçerek, bu örneklemlerin ortalama istatistiğini hesaplayalım ve popülasyona olan yakınlığına göz atalım.
İlk olarak, örneği gerçekleştirebilmek için ilgili kütüphaneleri çağıracağız. Veri manipülasyonu için Pandas ve NumPy, rastgele sayılar üretmek için random, görselleştirme için Matplotlib ve Seaborn ve son olarak istatistiksel işlemler için SciPy kütüphanesinden stats modülünü kullanacağız.
import pandas as pd
import numpy as np
import random
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
Not: SciPy varsayılan Python kütüphanelerinden birisi olmadığı için kullanmadan önce yüklenmesi gerekir. Eğer daha önce yüklemediyseniz, yüklemek için aşağıdaki syntax’ı kullanabilirsiniz:
pip install scipy
Gerekli kütüphaneleri çağırdık. 0 ile 100 arasında değişen, rastgele yüz bin adet sayı üreteceğiz.
random.seed(10)
rand_num = [random.randint(0,100) for i in range(100000)]
print(rand_num[0:20])
[73, 4, 54, 61, 73, 1, 26, 59, 62, 35, 83, 20, 4, 66, 62, 41, 9, 31, 95, 46]
- Rastgele sayıları bir liste yardımı ile ürettik.
- Listenin içerisinde tanımladığınız for döngüsü ile randint() fonksiyonunu 100,000 defa çalıştırdık.
- randint() fonksiyonu, girilen alt ve üst değer arasında rastgele rakamlar üreten bir fonksiyondur. For döngüsü ile birleştirerek, 0 ile 100 arasında 100,000 sayı üretmesini sağladık.
- randint() fonksiyonunu yeniden çalıştırdığımızda, ilk ürettiğimizden farklı 100,000 rakam üretilecektir. Aynı rakamları üretmesi için random.seed() fonksiyonunu kullandık ve rastgele bir değer atadık (10).
- print() fonksiyonu ile oluşturduğumuz listenin ilk 20 elemanını yazdırdık.
Oluşturduğumuz temsili popülasyonun ortalama ve standart sapma değerlerini hesaplayalım.
pop_mean = np.mean(rand_num)
pop_std = np.std(rand_num)
print(pop_mean, pop_std)
49.87133 29.076069783089668
- NumPy’ın mean ve std fonksiyonlarını kullanarak ortalama ve standart sapma değerlerini hesapladık. Temsili popülasyonun ortalama değeri 49.87 iken, standart sapması 29.07‘dir.
Son olarak, temsili popülasyon verisine ait dağılım grafiğini çizdirelim. Verinin dağılımını çizdirmek için “Kernel Density Estimator (KDE) Plot“tan yararlanacağız.
fig, ax = plt.subplots(figsize = (10 , 8))
sns.kdeplot(ax = ax, data = rand_num)
ax.axvline(np.mean(rand_num), color = "r")
ax.text(np.mean(rand_num) + 1, 0.006, "Ortalama: 49.87")
ax.set_title("Popülasyon Dağılımı")
ax.set_xlabel("Değerler")
ax.set_ylabel("Olasılıklar")
plt.show()
- Öncelikle görselleri yerleştirebilmek için “fig” adında bir çerçeve ve çerçevenin içerisine “ax” adını verdiğimiz alt yerler (subplots) tanımladık. figsize() parametresi ile de çerçevenin en ve boyutunu “inç” cinsinden belirttik.
- Grafik için kullandığımız yapıyı ve komutları şöyle özetleyebiliriz:
- sns.kdeplot(): Seaborn kütüphanesinin kdeplot çizdirebilmek için geliştirdiği komut. Bu komuta parametre olarak grafiğin hangi yerde olacağını (ax) ve hangi veriyi kullanacağını (data) belirttik.
- axvline(): Grafiğe istediğimiz noktada yatay düzleme dik gelecek bir çizgi çekmek için kullanılır. Çizginin yatay düzlemde ortalamadan 1 birim fazla olmasını belirttik.
- text(): Grafiğe istediğimiz x, y koordinatında metin eklemek için kullanılır. Metinin yatay düzlemde ortalamadan 1 birim fazla olmasını, dikey düzlemde de “0.006” hizasında olmasını istedik.
- set_title(): Grafiğe başlık yazabilmek için kullanılır.
- set_xlabel(): Grafiğin yatay (x) düzlemindeki elemanları tanıtmak için kullanılır.
- set_ylabel(): Grafiğin dikey (y) düzlemindeki elemanları tanıtmak için kullanılır.
- Son olarak da plt.show() komutunu kullanarak çizdirdiğimiz çerçeveyi ekrana yazdırdık.

Rastgele sayı üreten random modülünü kullanarak oluşturduğumuz, 100,000 elemandan oluşan örnek popülasyon hazır. Grafikten de belli olacağı üzere, popülasyon dağılımı uniform (tekdüze) dağılıma benziyor.
Oluşturduğumuz popülasyon içerisinden rastgele örneklemler seçip, istatistik değerini hesaplayıp, popülasyona göre farkına bakalım.
random.seed(15)
s1 = random.sample(rand_num, 100)
s2 = random.sample(rand_num, 100)
s3 = random.sample(rand_num, 100)
s4 = random.sample(rand_num, 100)
s1_mean = np.mean(s1)
s2_mean = np.mean(s2)
s3_mean = np.mean(s3)
s4_mean = np.mean(s4)
print(s1_mean, s2_mean, s3_mean, s4_mean)
50.17 49.72 47.23 48.05
- Tekrardan random.seed() fonksiyonunu belirterek, üretilen rastgele sayılarda benzer rakamları kullanmak istedik.
- sample() fonksiyonu ile rastgele örneklemler oluşturduk. Bu fonksiyon örneklem çekilecek ana kütle ve örneklemin büyüklüğünü parametre kullanır.
- Örnek olması açısından 4 farklı örneklem oluşturduk.
- Daha sonrasında oluşturulan örneklemler için NumPy’ın mean() fonksiyonunu kullanarak ortalama değerini hesapladık.
Burada gördüğümüz sonuçları bir “rugplot” aracılığı ile görselleştirelim.
fig, ax = plt.subplots(4, 1, sharey = True, figsize = (10, 12))
fig.subplots_adjust(hspace=0.4)
sns.despine(left = True, right = True, top = True)
sns.rugplot(ax = ax[0], data = s1)
ax[0].tick_params(axis='y', which='both',left=False,labelleft=False)
ax[0].axvline(s1_mean, color = "r", linestyle = "dashed")
ax[0].set_title("1. Örneklem")
sns.rugplot(ax = ax[1], data = s2)
ax[1].tick_params(axis='y', which='both',left=False,labelleft=False)
ax[1].axvline(s2_mean, color = "r", linestyle = "dashed")
ax[1].set_title("2. Örneklem")
sns.rugplot(ax = ax[2], data = s3)
ax[2].tick_params(axis='y', which='both',left=False,labelleft=False)
ax[2].axvline(s3_mean, color = "r", linestyle = "dashed")
ax[2].set_title("3. Örneklem")
sns.rugplot(ax = ax[3], data = s4)
ax[3].tick_params(axis='y', which='both',left=False,labelleft=False)
ax[3].axvline(s4_mean, color = "r", linestyle = "dashed")
ax[3].set_title("4. Örneklem")
plt.show()
- Öncelikle görselleri yerleştirebilmek için “fig” adında bir çerçeve ve çerçevenin içerisine 4 satır ve 1 sütundan oluşan alt yerler (subplots) tanımladık.
- Bu çerçevede yer alacak grafiklerinin tamamının aynı “y” düzlemini paylaşması yani aynı aralıktaki değerleri dikey düzlemde kullanması için “sharey” parametresini True olarak belirttik.
- figsize() parametresi ile de çerçevenin en ve boyutunu “inç” cinsinden belirttik.
- Dört grafiği de çizdirirken aynı yapıyı kullandık. Her grafiğe yönelik özelleştirmeleri 4 satır ve 1 sütundan oluşan bir yapı “tek boyutlu dizi (one dimensional array)” oluşturduğumuz için aynı listelerde olduğu gibi indeksler aracılığı (Ör: ax[0], ax[1]) ile istediğimiz subplot’u manipüle ettik.
- Eğer “n boyutlu dizi (n-dimensional array)” üretmiş olsaydık, bu sefer her ax için satır ve sütun bilgisini girmemiz gerekirdi. (Ör: ax[0, 1], ax[2,2])
- Her bir grafik için kullandığımız yapıyı ve komutları şöyle özetleyebiliriz:
- sns.rugplot(): Seaborn kütüphanesinin rugplot çizdirebilmek için geliştirdiği komut. Bu komuta parametre olarak grafiğin hangi yerde olacağını (ax) ve hangi veriyi kullanacağını (data) belirttik.
- tick_params(): Grafikte bulunan yatay ve dikey eksendeki birimleri manipüle etmek için kullanılır. Bu fonksiyonu kullanarak, grafiği sadeleştirmek için dikey eksende bulunan rakamları kaldırdık.
- axvline(): Grafiğe istediğimiz noktada yatay düzleme dik gelecek bir çizgi çekmek için kullanılır.
- set_title(): Grafiğe başlık yazabilmek için kullanılır.
- Son olarak da plt.show() komutunu kullanarak çizdirdiğimiz çerçeveyi ekrana yazdırdık.

Görüldüğü üzere, her bir örneklemin ortalama istatistiği hem birbirinden hem de ana kütleden farklıdır. Örneklem istatistiklerindeki bu farklılık, her bir örneklemin popülasyona kendi benzersiz ve sınırlı penceresinden erişmesi nedeniyle ortaya çıkar. Benzersizlik, örneklemedeki rastgele seçim ve örneklemin sınırlı boyutundan dolayı kaynaklanır.
Peki, oluşturduğumuz örneklem sayısını binlerce artırsak ne olur? Parametreye erişebilir miyiz?
Ortalamaların örnekleme dağılımı
Oluşturduğumuz benzer örneklemlerin sayısını artırıp, her örneklemin ortalamasını hesapladıktan sonra ortaya çıkan bu değerlerin olasılık dağılımı “örnekleme dağılımını” oluşturur. Yani, örneklem ortalamalarının olasılık dağılımına örnekleme dağılımı denir.
Örnekleme dağılımı, bir istatistiğin, aynı popülasyondan alınan n büyüklükteki binlerce örneklemde alabileceği her olası değerin sıklığını/frekansını gösterir.
Biraz önce verdiğimiz örneğe devam edelim. Örneklem sayısını önce 5, daha sonra 100 ve en sonunda da 1000’e çıkararak, oluşan ortalama değerlerini hesaplayalım ve örnekleme dağılım grafiklerini çizdirelim.
Rastgele örneklemler oluşturup, her örneklemin ortalama değerini hesaplamak için bir fonksiyona ihtiyacımız var.
def sampling_dist(lst, numb, size):
sample_mean = []
for i in range(numb):
new_samp = random.sample(lst, size)
sample_mean.append(np.mean(new_samp))
return sample_mean
- sampling_dist() adında bir fonksiyon oluşturduk. Bu fonksiyon, örneklem oluşturulacak popülasyonu (lst), örneklem sayısını (numb) ve herbir örneklemin büyüklüğünü (size) parametre olarak kullanıyor.
- Üretmek istediğimiz örneklem sayısı kadar tekrar eden bir “for” döngüsü yardımı ile parametre olarak girdiğimiz popülasyondan, örneklem büyüklüğü 100 olan örneklemler oluşturduk ve NumPy’ın mean() fonksiyonunu kullanarak oluşturduğumuz örneklemlerin ortalama değerlerini hesapladık.
- Son olarak, hesapladığımız ortalama değerlerini sample_mean adında boş bir listeye kaydettik.
Oluşturduğumuz fonksiyonu kullanarak farklı sayılarda örneklemler üretebiliriz. Tüm örneklemlerde popülasyon olarak, yazının başlarında rand_num adında, oluşturduğumuz rastgele 100,000 adet veriyi kullanacağız.
sampling_dist fonksiyonunu kullanarak örneklem sayısı 10, 100 ve 1000 adet üç farklı örneklem grubu üretip, ortalama değerlerini hesaplayalım.
ten = sampling_dist(rand_num, 10, 100)
hund = sampling_dist(rand_num, 100, 100)
thou = sampling_dist(rand_num, 1000, 100)
print(ten)
[49.69, 52.77, 48.25, 46.58, 47.22, 48.8, 50.6, 51.52, 49.99, 47.07]
Oluşturduğumuz örneklemlerden 10 örneklem ortalaması içeren en küçük olanı print() fonksiyonu ile yazdırdığımız zaman farklı örneklemlerin birbirinden farklı ortalama istatistiğine sahip olduğunu görebiliriz.
Oluşturduğumuz üç farklı örneklem dağılımını görselleştirelim ve ortalama değerlerinin nasıl değiştiğine göz atalım.
fig, (ax1, ax2, ax3) = plt.subplots(1, 3, sharex = True, figsize = (15, 6))
sns.histplot(ax = ax1, data = ten)
ax1.axvline(np.mean(ten), color = "red", linestyle = "dashed")
ax1.set_title("Örneklem Dağılımı (n = 10)")
ax1.set_xlabel("Örneklem Ortalaması")
ax1.set_ylabel("Frekans")
sns.histplot(ax = ax2, data = hund)
ax2.axvline(np.mean(hund), color = "red", linestyle = "dashed")
ax2.set_title("Örneklem Dağılımı (n = 100)")
ax2.set_xlabel("Örneklem Ortalaması")
ax2.set_ylabel("Frekans")
sns.histplot(ax = ax3, data = thou)
ax3.axvline(np.mean(thou), color = "red", linestyle = "dashed")
ax3.set_title("Örneklem Dağılımı (n = 1000)")
ax3.set_xlabel("Örneklem Ortalaması")
ax3.set_ylabel("Frekans")
plt.show()
- Öncelikle görselleri yerleştirebilmek için “fig” adında bir çerçeve ve çerçevenin içerisine 1 satır ve 3 sütundan oluşan alt yerler (subplots) tanımladık. 3 subplot için de ax1, ax2, ax3 ismini verdik.
- Bu çerçevede yer alacak grafiklerinin tamamının aynı “x” düzlemini paylaşması yani aynı aralıktaki değerleri yatay düzlemde kullanması için “sharex” parametresini True olarak belirttik.
- figsize() parametresi ile de çerçevenin en ve boyutunu “inç” cinsinden belirttik.
- Üç grafiği de çizdirirken aynı yapıyı kullandık ve her grafiğe yönelik özelleştirmeleri de “ax1, ax2, ax3” isimlendirmesi ile sağladık.
- Her bir grafik için kullandığımız yapıyı ve komutları şöyle özetleyebiliriz:
- sns.histplot(): Seaborn kütüphanesinin histogram çizdirebilmek için geliştirdiği komut. Bu komuta parametre olarak grafiğin hangi yerde olacağını (ax) ve hangi veriyi kullanacağını (data) belirttik.
- axvline(): Grafiğe istediğimiz noktada yatay düzleme dik gelecek bir çizgi çekmek için kullanılır.
- set_title(): Grafiğe başlık yazabilmek için kullanılır.
- set_xlabel(): Grafiğin yatay (x) düzlemindeki elemanları tanıtmak için kullanılır.
- set_ylabel(): Grafiğin dikey (y) düzlemindeki elemanları tanıtmak için kullanılır.
- Son olarak da plt.show() komutunu kullanarak çizdirdiğimiz çerçeveyi ekrana yazdırdık.

Grafiğe bakarak şu yorumları yapabiliriz:
- Popülasyon dağılımı normal dağılıma sahip olmasa da örneklem sayısı arttıkça normal dağılıma yakınsamaya ve zile benzeyen simetrik görünümü almaya başladı.
- Örneklem sayısı arttıkça, örnekleme istatistiği, popülasyon parametresine çok yaklaşır. Farklı sayılardaki örneklem gruplarının ve popülasyonun ortalamaları şöyle:
- μ = 49.87
- x̅ = 48.762 (#10)
- x̅ = 50.2037 (#100)
- x̅ = 49.89367 (#1000)
Yukarıda uyguladığımız süreci görsel olarak şöyle özetleyebiliriz:

Görsel Kaynak: Örnekleme dağılımı
- Ana kütleden, rastgele, benzer özelliklere sahip n adet örneklem oluşturduk.
- Her örneklem için istatistik hesapladık.
- Örneklem istatistiklerinin frekans dağılımını (histogram) çizdirdik.
Örneklem sayısı arttıkça, örnekleme dağılımının ortalamasının normal dağılıma yakınsadığını deneyimledik. Örneklem büyüklüğünün örnekleme dağılımına nasıl bir etkisi vardır?
Örneklem büyüklüğünün örnekleme dağılımına etkisi
Bir önceki uygulamada örneklem sayısı değişirken, örneklem büyüklüğü 100 olacak şekilde sabitlendi. Bu kez de örneklem sayısını sabit tutarak, farklı örneklem büyüklükleri ile örneklem dağılımları oluşturup etkisini gözlemleyerek soruya bir yanıt arayalım.
Bir önceki örnek sırasında oluşturduğumuz, belirli parametrelere göre rastgele örneklemler çekip, ortalama istatistiğini hesaplayan fonksiyonu tekrardan kullanacağız.
fifteen_size = sampling_dist(rand_num, 1000, 15)
hund_size = sampling_dist(rand_num, 1000, 100)
f_hund_size = sampling_dist(rand_num, 1000, 500)
- 3 farklı örnekleme dağılımı oluşturduk.
- Her üç örneklemin de sayısı 1000 iken, örneklem büyüklüğünü sırasıyla 15, 100, 500 olarak belirledik.
Bir örneklem istatistiğinin standart sapması olarak hesaplanan standart hata, örneklem istatistiğinin ana kütle parametresine ne kadar yakın olduğu hakkında bilgi verir.
Standart hata ne kadar küçükse, örneklem istatistiği ana kütle parametresine o derece yakın, parametre hakkında o kadar duyarlı bir kestirim sunar. Standart hata şu şekilde formülüze edilir:
Standart hata (SE) = σ / √n
Her üç örnekleme dağılımı için de standart hata değerlerini hesaplayalım.
np.std(fifteen_size), np.std(hund_size), np.std(f_hund_size)
(7.360616215447666, 2.914650695212035, 1.313213407301342)
Her üç örnekleme dağılımının grafiklerini çizdirelim ve örneklem büyüklüğünün örnekleme dağılımı üzerindeki etkilerini yorumlayalım.
fig, (ax1, ax2, ax3) = plt.subplots(1, 3, sharex = True, figsize = (15, 6))
sns.histplot(ax = ax1, data = fifteen_size)
ax1.axvline(np.mean(ten), color = "red", linestyle = "dashed")
ax1.set_title("Örneklem Dağılımı (n = 15)")
ax1.set_xlabel("Örneklem Ortalaması")
ax1.set_ylabel("Frekans")
sns.histplot(ax = ax2, data = hund_size)
ax2.axvline(np.mean(hund), color = "red", linestyle = "dashed")
ax2.set_title("Örneklem Dağılımı (n = 100)")
ax2.set_xlabel("Örneklem Ortalaması")
ax2.set_ylabel("Frekans")
sns.histplot(ax = ax3, data = f_hund_size)
ax3.axvline(np.mean(thou), color = "red", linestyle = "dashed")
ax3.set_title("Örneklem Dağılımı (n = 500)")
ax3.set_xlabel("Örneklem Ortalaması")
ax3.set_ylabel("Frekans")
plt.show()

Grafiklere bakarak, şu yorumlarda bulunabiliriz. Örneklem büyüklüğü arttıkça:
- Örnekleme dağılımı normal dağılıma yakınsar.
- Standart hata yani dağılımın genişliği, azalır.
Örneklem dağılımının özellikleri
- Örneklem dağılımının ortalaması, popülasyon ortalamasına eşittir.
- Örneklem dağılımının standart sapması, popülasyonun standart sapmasının örneklem sayısının kareköküne bölümüne eşittir.
Örnekleme dağılımı ile ilgili yaptığımız çıkarımları Merkezi Limit Teoremi‘ne borçluyuz. Bu teoremi biraz daha yakından inceleyelim.
Merkezi Limit Teoremi (Central Limit Theorem – CLT)
Merkezi Limit Teoremi, bir popülasyonun sahip olduğu dağılımdan bağımsız olarak, popülasyondan yeterince miktarda her biri n örneklem büyüklüğüne sahip örneklemler alındığında, örneklemlerin oluşturduğu örnekleme dağılımının ortalaması normal dağılıma yaklaşır.
x̅ ~ N(μx̅,σx̅) μx̅ = μ σx̅ = σ / √n x̅: Bir örneklemin ortalaması n: Örneklemin büyüklüğü μx̅: Örnekleme dağılımının ortalaması σx̅: Örnekleme dağılımının standart sapması (Standart hata)
Merkezi Limit Teoremi’nin sınırları
Merkezi Limit Teoremi, bazı varsayımların gerçekleştiği durumlarda geçerlidir. MLT’nin geçerli olduğu varsayımları şöyle sıralayabiliriz:
- Merkezi Limit Teoremini kullanmak için ana kütlenin sahip olduğu dağılımı bilmeye ihtiyaç yoktur.
- Ana kütle sonsuz bir ortalama veya varyans değerine sahip olmamalıdır. Örnek olarak, Cauchy dağılımına sahip verilerde belirlenen sabit bir varyans veya ortalama yoktur ve bu nedenle Merkezi Limit Teoremi uygulanamaz.
- Merkezi Limit Teoremi ile ana kütle ve örnekleme dağılımı arasında ortaya koyulan ilişki sadece “ortalama” istatistiği için geçerlidir. Örnekleme dağılımının varyansı, standart sapması veya ortanca değeri ile ana kütle arasında bir ilişki Merkezi Limit Teoremi’ne göre uygulanamaz.
- Oluşturulan örneklemler rastgele seçilmelidir ve birbirinden bağımsız olmalıdır.
- Örneklemin büyüklüğü, iadesiz/tekrarsız seçim yapıldığı durumlarda popülasyonun büyüklüğünün %10’undan fazla olmamalıdır.
- Örneklem sayısı yeterince büyük olmalıdır. Özellikle, ana kütlenin asimetrik veya çarpık dağılıma sahip olduğu veri setlerinde örneklem sayısı fazla olmalıdır. Popülasyonun Normal, Uniform veya simetrik başka bir dağılıma sahip olduğu durumlarda örneklem sayısı daha az olabilir.
Popülasyon dağılımının örnekleme dağılımına etkisi
Merkezi Limit Teoremi’ne göre örneklem büyüklüğü yeterince büyükse, örnekleme dağılımı normal dağılıma yakınsar. Yukarıdaki varsayımlarda da bahsettiğimiz “yeterince büyük olmalıdır” ölçüsü belirsiz bir tanımlama olabilir.
Birçok kaynakta, örneklem büyüklüğünün 30’dan fazla olması (n > 30) gerektiği genel geçer bir kural olarak belirtilir fakat örneklem büyüklüğünün miktarı popülasyonun sahip olduğu dağılımla ilgilidir.
Normal dağılıma yakın, simetrik bir görünüme sahip bir popülasyondan elde edilecek örneklemler n = 10 gibi daha küçük örneklem büyüklüğü ile normal dağılıma yaklaşabilir fakat aşırı derecede sağa veya sola çarpık dağılıma sahip bir popülasyondan elde edilecek örneklemlerde örneklemlerde belki n = 100 gibi büyüklüklere ihtiyaç vardır.
Farklı dağılıma sahip popülasyonlarda, farklı örneklem büyüklüklerinin nasıl etki ettiğine göz atalım. Bunu yapabilmek için genelde sağa çarpık dağılıma sahip poisson dağılımı, sola çarpık dağılıma sahip beta dağılımı ve simetrik dağılıma sahip normal dağılıma uygun dağılan rastgele sayılar üretip, daha sonrasında bu verilerden rastgele örneklemler çekerek karşılaştırmalar yapacağız.
poi_dist = stats.poisson.rvs(size = 100000, mu = 5)
beta_dist = stats.beta.rvs(size = 100000, a = 10, b = 1)
norm_dist = stats.norm.rvs(size = 100000, loc = 0, scale = 1)
print(type(poi_dist))
numpy.ndarray
- Belirli dağılımlara sahip rastgele sayılar üretebilmek için SciPy kütüphanesinden stats modülünü kullandık. stats modülü, farklı dağılımlar için farklı parametreler kullanır.
- Tüm örnek dağılımların 100,000 adet elemana sahip olması için ortak kullanılan size parametresini 100,000 olarak belirledik.
- Poisson dağılımı alfa parametresi ile dağılır. Alfa parametresini 5 olarak belirledik.
- Beta dağılımı alfa ve beta parametreleri ile dağılır. Alfa parametresi stats modülünde “a”, beta parametresi ise “b” ile temsil edilir.
- Normal dağılım için ortalama ve standart sapma değerlerine ihtiyaç vardır. Stats modülünde normal dağılım için ortalama “loc”, standart sapma ise “scale” ile temsil edilir.
- Oluşturduğumuz tüm dağılımlar NumPy’ın array veri tipine sahiptir.
Farklı dağılımlara sahip temsili popülasyon verileri hazır. Şimdi de daha önceleri örneklem çekmek için oluşturduğumuz fonksiyonu kullanarak, her bir popülasyondan büyüklüğü 10 olan 1000’er adet örneklem oluşturup, ortalamalarını hesaplayacağız.
poi_ten = sampling_dist(list(poi_dist), 1000, 10)
beta_ten = sampling_dist(list(beta_dist), 1000, 10)
norm_ten = sampling_dist(list(norm_dist), 1000, 10)
SciPy’ın Stats modülünü kullanarak oluşturduğumuz popülasyon verileri NumPy Array veri tipine sahip. Bizim oluşturduğumuz fonksiyon çalışırken popülasyon verilerini liste olarak alıyor. Bu nedenle list() fonksiyonunu kullanarak NumPy array veri tipini listeye dönüştürüp, fonksiyona parametre olarak kullandık.
Oluşturduğumuz popülasyon ve örnekleme dağılımlarını görselleştirip, yorumlayacağız.
fig, ax = plt.subplots(3, 2, figsize = (12, 9))
fig.subplots_adjust(hspace=0.5)
#Population Dist
sns.histplot(ax = ax[0, 0], data = poi_dist)
ax[0, 0].axvline(np.mean(poi_dist), color = "red", linestyle = "dashed")
ax[0, 0].set_title("Poisson Dağılımı", fontweight="bold")
ax[0, 0].set_xlabel("Değerler")
ax[0, 0].set_ylabel("Frekans")
sns.histplot(ax = ax[1, 0], data = beta_dist)
ax[1, 0].axvline(np.mean(beta_dist), color = "red", linestyle = "dashed")
ax[1, 0].set_title("Beta Dağılımı", fontweight="bold")
ax[1, 0].set_xlabel("Değerler")
ax[1, 0].set_ylabel("Frekans")
sns.histplot(ax = ax[2, 0], data = norm_dist)
ax[2, 0].axvline(np.mean(norm_dist), color = "red", linestyle = "dashed")
ax[2, 0].set_title("Normal Dağılım", fontweight="bold")
ax[2, 0].set_xlabel("Değerler")
ax[2, 0].set_ylabel("Frekans")
#Sampling Dist
sns.histplot(ax = ax[0, 1], data = poi_ten, label= "n = 10")
ax[0, 1].axvline(np.mean(poi_dist), color = "red", linestyle = "dashed")
ax[0, 1].set_title("Poisson Dağılımı", fontweight="bold")
ax[0, 1].set_xlabel("Değerler")
ax[0, 1].set_ylabel("Frekans")
ax[0, 1].legend(loc = "upper right")
sns.histplot(ax = ax[1, 1], data = beta_ten, label= "n = 10")
ax[1, 1].axvline(np.mean(beta_dist), color = "red", linestyle = "dashed")
ax[1, 1].set_title("Beta Dağılımı", fontweight="bold")
ax[1, 1].set_xlabel("Değerler")
ax[1, 1].set_ylabel("Frekans")
ax[1, 1].legend(loc = "upper right")
sns.histplot(ax = ax[2, 1], data = norm_ten, label= "n = 10")
ax[2, 1].axvline(np.mean(norm_dist), color = "red", linestyle = "dashed")
ax[2, 1].set_title("Normal Dağılım", fontweight="bold")
ax[2, 1].set_xlabel("Değerler")
ax[2, 1].set_ylabel("Frekans")
ax[2, 1].legend(loc = "upper right")
plt.show()
Yukarıdaki kodu bir önceki örneklerden tanımak mümkün. Üstteki örneklerden farklı olarak 6 adet grafiği tek bir çerçevede topladık.

Sol taraftaki ilk sütunda bulunan grafikler farklı dağılımlara sahip popülasyonları, sağ taraftaki ikinci sütunda bulunan grafikler ise 10 elemana sahip 1000 adet örneklemlerin ortalamalarının oluşturduğu örnekleme dağılımlarını temsil etmektedir.
Grafiklerden de belli olacağı üzere, çarpık dağılıma sahip popülasyonlardan elde edilen örneklem büyüklüklerinin az olması dağılımın normale yakınlığını düşürür. İlk iki satırda bulunan sağa ve sola çarpık dağılıma sahip popülasyonlardan oluşturulan örneklem dağılımları hala sağa ve sola çarpık görünüme sahiptir.
Örneklem büyüklüğünün etkisini göstermek için örneklemlerin büyüklüğünü, örnekleme dağılımını normal dağılıma yakınsayacak şekilde tekrardan çekip, görselleştirelim.
Poisson dağılımı için örneklem büyüklüğünü 100, beta dağılımı için 200 ve normal dağılım için 30 olarak tekrardan rastgele 1000 adet örneklem çekip, ortalamalarını hesaplayalım.
poi_norm = sampling_dist(list(poi_dist), 1000, 100)
beta_norm = sampling_dist(list(beta_dist), 1000, 200)
norm_norm = sampling_dist(list(norm_dist), 1000, 30)
Yeni örnekleme dağılımlarını görselleştireceğiz.
fig, ax = plt.subplots(3, 2, figsize = (12, 9))
fig.subplots_adjust(hspace=0.5)
#Population Dist
sns.histplot(ax = ax[0, 0], data = poi_dist)
ax[0, 0].axvline(np.mean(poi_dist), color = "red", linestyle = "dashed")
ax[0, 0].set_title("Poisson Dağılımı", fontweight="bold")
ax[0, 0].set_xlabel("Değerler")
ax[0, 0].set_ylabel("Frekans")
sns.histplot(ax = ax[1, 0], data = beta_dist)
ax[1, 0].axvline(np.mean(beta_dist), color = "red", linestyle = "dashed")
ax[1, 0].set_title("Beta Dağılımı", fontweight="bold")
ax[1, 0].set_xlabel("Değerler")
ax[1, 0].set_ylabel("Frekans")
sns.histplot(ax = ax[2, 0], data = norm_dist)
ax[2, 0].axvline(np.mean(norm_dist), color = "red", linestyle = "dashed")
ax[2, 0].set_title("Normal Dağılım", fontweight="bold")
ax[2, 0].set_xlabel("Değerler")
ax[2, 0].set_ylabel("Frekans")
#Sampling Dist
sns.histplot(ax = ax[0, 1], data = poi_norm, label= "n = 100", kde = True)
ax[0, 1].axvline(np.mean(poi_dist), color = "red", linestyle = "dashed")
ax[0, 1].set_title("Örnekleme Dağılımı", fontweight="bold")
ax[0, 1].set_xlabel("Değerler")
ax[0, 1].set_ylabel("Frekans")
ax[0, 1].legend(loc = "upper right")
sns.histplot(ax = ax[1, 1], data = beta_norm, label= "n = 200", kde = True)
ax[1, 1].axvline(np.mean(beta_dist), color = "red", linestyle = "dashed")
ax[1, 1].set_title("Örnekleme Dağılımı", fontweight="bold")
ax[1, 1].set_xlabel("Değerler")
ax[1, 1].set_ylabel("Frekans")
ax[1, 1].legend(loc = "upper right")
sns.histplot(ax = ax[2, 1], data = norm_norm, label= "n = 30", kde = True)
ax[2, 1].axvline(np.mean(norm_dist), color = "red", linestyle = "dashed")
ax[2, 1].set_title("Örnekleme Dağılım", fontweight="bold")
ax[2, 1].set_xlabel("Değerler")
ax[2, 1].set_ylabel("Frekans")
ax[2, 1].legend(loc = "upper right")
plt.show()

Yeni oluşturduğumuz grafiklere baktığımızda, çarpık dağılımlar için örneklem büyüklüğünün artmasının önemli olduğunu görebiliriz. Aynı zamanda, yapabileceğimiz bir diğer çıkarım ise popülasyonun dağılımı ne olursa olsun Merkezi Limit Teoremi’ni kullanarak yeterli örneklem büyüklüğü ile normale yakınsayan örnekleme dağılımları elde edebiliriz.
Bir verinin normal dağılıma sahip olduğu varsayımı “hipotez testi” için önemlidir. Yeterli bir örneklem büyüklüğüne sahip olduğumuz durumlarda veri normal dağılıma sahip olmasa bile Merkezi Limit Teoremi’nin yardımıyla normale yakınsayan örnekleme dağılımları elde edip hipotez testleri uygulayabilir, popülasyon hakkında genelleştirilebilir çıkarımlarda bulunabiliriz.
Kaynakça:
SciPY Documentation
Khan Academy – Sampling Distributions
Central Limit Theorem Explained