Geleneksel çıkarımsal istatistik yöntemleri, belirli varsayımların gerçekleştiği durumlarda popülasyondan elde edilen “n” büyüklüğündeki bir örneklemi ve örneklemin özelliklerini kullanarak örnekleme dağılımını üretir.

Görsel: Towards Data Science
Örneklemler maliyet ve zaman avantajı sağlasa da popülasyonun tamamı değil, bir parçası oldukları için büyük resmin tamamını gösteremez. Popülasyondan oluşturulan her bir örneklemin istatistiği, hem popülasyondan oluşturulmuş diğer örneklemlerden hem de popülasyon parametresinden farklılık/değişkenlik gösterir.
Örnekleme dağılımı ve merkezi limit teoremi ilişkisini açıklarken her bir örneklemin birbirinden ne kadar farklılık gösterebileceğini detaylı incelemiştik. Örneklemler arasındaki bu belirsizliği tekrardan canlandırarak yeniden inceleyelim.
Herhangi bir işlem yapmadan önce, yazı boyunca kullanılacak kütüphaneleri çağıracağız. Veri manipülasyonu için Pandas ve NumPy, istatistiksel hesaplamalar için SciPy kütüphanesinden stats modülü, görselleştirme için Matplotlib ve Seaborn ve son olarak rastgele sayılar üretip, örneklemeler oluşturmak için random kütüphanesini kullanacağız.
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
import random
Çoğunlukla, hakkında çıkarım yaptığımız popülasyona dair parametreleri (ortalama, standart sapma vs.) bilemeyiz ve bu parametreleri tahmin etmeye çalışırız. Örneklem istatistiklerinin popülasyon parametrelerinden farklılık gösterdiğini kanıtlamak için popülasyonu temsilen rastgele sayılar üretip, içerisinden aynı büyüklükteki örneklemler seçerek ortalamalarını karşılaştıracağız.
random.seed(10)
pop = [random.randint(10, 100) for i in range(10000)]
pop_mean = np.mean(pop)
pop_std = np.std(pop)
print(pop_mean, pop_std)
55.155 26.149355154573126
- Popülasyonu temsilen üreteceğimiz rastgele sayıları bir listede saklamak istiyoruz. Bunun için pop adında bir değişken oluşturduk.
- Bu değişkenin içerisinde bir for döngüsü ve random modülünden randint() fonksiyonunu kullanarak 10000 adet 10 ile 100 arasında rastgele sayılar ürettik. Bu işlemin tekrarlandığı zaman aynı rakamları üretmesi için random modülündeki seed() fonksiyonunu kullanarak “10” değerini atadık.
- Oluşturduğumuz popülasyonun ortalama ve standart sapma değerlerini NumPy’ın mean ve std fonksiyonlarını kullanarak hesapladık.
Ortalama değeri 55, standart sapması 26 olan ve 10,000 adet gözlemden oluşan popülasyonumuz hazır. Şimdi de içerisinden basit tesadüfi örnekleme yöntemi ile örneklemler oluşturacağız.
random.seed(10)
s1 = random.sample(pop, 1000)
s2 = random.sample(pop, 1000)
s3 = random.sample(pop, 1000)
s4 = random.sample(pop, 1000)
print(np.mean(s1), np.mean(s2), np.mean(s3), np.mean(s4))
54.87 54.669 54.275 55.266
random modülündeki sample() fonksiyonunu kullanarak, pop değişkeninden 1000 örneklem büyüklüğüne sahip 4 adet farklı örneklem oluşturduk ve ortalamalarını hesapladık. Sonuçlardan da görüleceği üzere, her bir örneklemin ortalama değeri hem birbirinden hem de popülasyondan farklıdır.
Tek bir örneklemden bir istatistik elde edebiliriz. Fakat bu istatistik ile beraber cevaplanması gereken farklı sorular belirir:
- Bu değer istatistiksel olarak anlamlı mı yoksa şans eseri mi oluştu?
- Diğer örneklemlerden ne kadar farklı?
- Bu sonuca ne kadar güvenebiliriz?
Buraya kadar, örneklemin ve örneklemden elde edilen istatistiklerin geleneksel yöntemlerin varsayımlarını sağladığını ve örneklemlerin “yeterince” büyük olduğunu kabul ettik. Gerçek dünyadaki veri setlerinde:
- Geleneksel yöntemin varsayımlarına uymayacak şekilde örneklem büyüklüklerinin az veya örneklem dağılımının belirsiz olması muhtemeldir.
- Yeni veri toplamanın imkansız veya çok pahalı olduğu durumlar da yine olasıdır.
Bootstrap örnekleme yöntemi, veri seti hakkında minimum varsayıma ihtiyaç duyan, örneklem büyüklüğünün az olduğu veya yeni veri toplamanın mümkün olamadığı durumlarda da etkili ve aynı zamanda pratik bir yeniden örnekleme (resampling) yöntemdir. Ayrıca, pratik olması açısından geleneksel yönteme alternatif olarak da kullanışlıdır.

Görsel: Towards Data Science
Yeniden örnekleme (resampling) nedir?
Popülasyon hakkında çıkarımlar yapabilmek için bir veri setinden yerine koyarak (sampling with replacement) tekrar tekrar aynı büyüklükte örneklemler oluşturmaya yeniden örnekleme (resampling) denir. Bu yöntemler sayesinde örneklemlerin belirsizliği ve değişkenliği ile ilgili daha iyi fikir elde edilebilir.
Birçok farklı yeniden örnekleme yöntemleri mevcuttur.
- Bootstrap örneklemesi
- Jackknife
- K-Fold Cross Validation
- Leave One Out Cross Validation
- Permutation resampling
Yeniden örnekleme yöntemleri genel olarak şu avantajları sağlar:
- Araştırmanın tekrarlanmasının pahalı veya zaman alıcı olduğu durumlarda küçük bir veri setinden istatistiksel çıkarımlar yapmaya yardımcı olur.
- Ekstra veri toplamadan, makine öğrenmesi modellerinin yeni bir veri setinde nasıl performans gösterebileceğini test etmeye yardımcı olur.
Bootstrap örneklemesi nedir? Nasıl çalışır?
İlk kez Bradley Efron tarafından 1979 yılında ortaya atılan Bootstrap yöntemi, bir popülasyon hakkında birçok küçük örneklemin istatistiklerinin ortalamalarını kullanarak çıkarım yapmak için kullanılan bir yeniden örnekleme yöntemidir.
Bootstrap örneklemesi Random Forests ve Stochastic Gradient Boosting gibi makine öğrenmesi algoritmalarında da kullanılır.
Bootstrap örnekleme yöntemini kullanarak örnekleme dağılımları oluşturulur. Süreç şöyle çalışır:
- Kaç adet örnekleme ihtiyaç duyulduğu belirlenir.
- Basit tesadüfi örnekleme yöntemi ile “örneklem ile aynı büyüklükte” örneklemler üretilir.
- Her bir örneklemin istatistiği (ortalama, varyans vs.) hesaplanır.
- Her bir örneklemden hesaplanan istatistikler ile örnekleme dağılımı oluşturulur.

Görsel: Towards Data Science
Bootstrap örneklemesi, örneklemin popülasyonun “iyi bir temsilcisi” olduğu varsayımı ile çalışır. Bu nedenle, örneklem popülasyonun bir temsili olarak kabul edilir ve sanki bir popülasyondan farklı farklı örneklemler üretiliyor gibi ilerlenir.
Bootstrap örneklemleri neden orijinal örneklem ile aynı büyüklükte olmalıdır?
Örnekleme dağılımı ile birlikte örneklem istatistiğinin alabileceği potansiyel tüm değerleri, yani istatistiğin değişkenliğini hesaplamış oluruz. Bootstrap örneklemlerinden oluşturulan örnekleme dağılımı ve bu dağılımdaki değişkenlik yardımı ile bootstrap örneklemlerini oluşturduğumuz “örneklemin ortalamasının” doğruluğu hakkında çıkarımlarda bulunuruz.
Örneklem istatistiğinin “değişkenliği” örneklem büyüklüğünden etkilenir. Bootstrap örneklemlerinin büyüklüğünü, orijinal örneklem büyüklüğünden farklılaştırdığımız anda örneklemin dağılımını değiştirdiğimiz için yaptığımız çıkarımlar etkilenir.
Bootstrap örneklemesi neden önemlidir?
Birçok istatistiksel test veri setinin belli varsayımlara (normallik vs.) uymasını bekler. Fakat gerçek dünyadaki veri setleri idealden uzaktır. Bootstrap örneklemesi, temel olarak istatistiğin en yaygın problemine yanıt bulmaya çalışır:
Bir popülasyon hakkında çıkarım yapmak istiyorum. Fakat elimde bu popülasyondan alınmış bir örneklem var. Bu örneklemden elde ettiğim istatistik, popülasyon parametresini ne kadar iyi tahmin ediyor?
Bootstrap örneklemesinin avantajları:
- Non-parametrik bir yöntemdir. Yani, herhangi bir dağılıma veya bilinmeyen bir dağılıma sahip veri setleri üzerinde de kullanılabilir.
- Örneklem büyüklüğünün sınırlı olduğu durumlarda da kullanışlıdır. n = 10’a kadar kullanılabilir.
- Bootstrap örneklemesi ile oluşturulan örneklemlerin istatistiklerinin olasılık dağılımı (örnekleme dağılımı) normal dağılıma sahiptir. Bu dağılım kullanılarak, popülasyon parametresi tahmin edilebilir, güven aralıkları oluşturulabilir veya hipotez testleri uygulanabilir.
- Bootstrap yöntemi kullanılarak birçok farklı örneklem istatistiği analiz edilebilir.
- Ortalama, Ortanca, Mod
- Standart sapma, Varyans
- Korelasyon, Regresyon katsayıları
- Oranlar
- İkili (Binary) verilerdeki varyans
- Çok değişkenli istatistikler
- Bu yöntem ile üretilen örneklemleri kullanarak, makine öğrenmesi modellerinin, test verisi üzerinde denemeden önce, yeni bir veri seti üzerinde performansını denemek ve optimize etmek mümkündür.
Bootstrap yönteminin sınırları:
- Bootstrap yöntemi ile popülasyona dair güçlü çıkarımlar yapmak mümkündür. Fakat çıkarımların kalitesini örneklemin kalitesi doğrudan etkiler. Popülasyonu temsil etmeyen, hatalı bir örneklemden oluşturulacak alt örneklemler de hatalı çıkarımlara sebep olacaktır. Garbage in, Garbage Out (ne verirseniz onu alırsınız) prensibini unutmayın.
- Örneklem büyüklüğünün çok küçük olduğu durumlarda yöntemin etkinliğini düşürebilir. Örneklem büyüklüğü ne kadar büyükse o kadar iyidir.
- Örneklem büyüklüğünün küçük olduğu durumlarda ortanca gibi bazı istatistiklerin bootstrap yöntemiyle hesaplanması zordur.
Örnek Uygulama: Bootstrap ile Örneklem Dağılımı ve Güven Aralıklarının Oluşturulması
Yazının bundan sonraki sürecinde Bootstrap örneklemesini uygulamalı göstermek adına online araba pazar yeri AutoScout24 üzerinden elde edilmiş, 2011-2021 yılları arasında satılan 46,405 araca dair istatistiklerinin olduğu bir örnek veri seti kullanacağız.
Örnek veri seti: AutoScout24 2011-2021 Araç Satış Bilgileri – Almanya
Kullanacağımız kütüphaneleri daha önceden çağırmıştık. read_csv() fonksiyonu ile veri setini çağıralım.
cars = pd.read_csv("autoscout24-germany-dataset.csv")
Veri setini read_csv() fonksiyonu ile çağırdıktan yada dosyayı okuduktan sonra, Pandas’ın hazır fonksiyonlarından info()‘yu kullanarak veri setini tanımak için hızlı bir göz atacağız.
cars.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 46405 entries, 0 to 46404 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 mileage 46405 non-null int64 1 make 46405 non-null object 2 model 46262 non-null object 3 fuel 46405 non-null object 4 gear 46223 non-null object 5 offerType 46405 non-null object 6 price 46405 non-null int64 7 hp 46376 non-null float64 8 year 46405 non-null int64 dtypes: float64(1), int64(3), object(5) memory usage: 3.2+ MB
- Veri setinde 8 değişken ve 46,405 adet gözlemden oluşuyor.
- mileage: Aracın kilometresi
- make: Aracın markası
- model: Aracın modeli
- fuel: Yakıt tipi
- gear: Vites tipi (Manuel vs Otomatik)
- offerType: Aracın kullanım durumu
- price: Aracın fiyatı
- hp: Motorun beygir gücü
- year: Aracın kayıt tarihi
- 8 değişkenden 5’i kategorik, 3’ü tam sayı, 1 tanesi ise ondalık sayı veri tipine sahiptir.
- “model”, “gear”, “hp” değişkenlerinde kayıp veriler olduğu görünüyor.
Kısa bir keşifçi veri analizinden sonra bootstrap metodunu uygulamaya başlıyoruz.
1. Adım: Örneklem sayısının belirlenmesi.
Bootstrap metodunu uygularken hesaplayacağımız istatistiklerin anlamlı olabilmesi için örneklem sayısının olabildiğince fazla olması istenir.
Veri setinden veri setine değişmekle beraber “olabildiğince fazla” ile kast edilen rakam binlerdir. Farklı rakamlarda örneklemler alınarak (1000, 5000, 10000, 100000 vs.), örnekleme dağılımına bakılıp değişkenliğin azaldığı durumda durulabilir.
2. Adım: Basit tesadüfi örnekleme yöntemi ile örneklemlerin üretilmesi ve örneklemin istatistiğinin (ortalama, varyans vs.) hesaplanması.
Bootstrap yöntemi ile örneklemleri oluştururken basit tesadüfi örnekleme yöntemini kullanacağız. Farklı durumlar için diğer olasılıklı örnekleme yöntemleri de kullanılabilir.
Basit tesadüfi örnekleme yönteminde, her bir gözlemin eşit seçilme şansı vardır. Bu yöntemin uygulanması için Pandas kütüphanesinin sample() fonksiyonu kullanışlıdır.
Örneklemleri çektikten sonra her bir örneklem için ortalama değerini hesaplayacağız. Anlattığımız işlemleri tek bir fonksiyon oluşturarak uygulayacağız.
def srs_boot(df, col, n, rep):
means = []
for i in range(rep):
boot_sample = df.sample(n = n, replace = True)
means.append(np.mean(boot_sample[col]))
return means
boot_means = srs_boot(cars, "mileage", len(cars["mileage"]), 1000)
- srs_boot() adında bir fonksiyon oluşturduk. Bu fonksiyon 4 adet parametre kullanır.
- df: Veri setinin atandığı Pandas DataFrame
- col: Veri setinde örnekleme dağılımının oluşturulacağı değişken
- n: Örneklem büyüklüğü
- rep: Bootstrap örneklem sayısı
- Fonksiyon ilk olarak for döngüsünü kullanarak, parametre şeklinde girilen tekrar sayısı kadar örneklem üretir.
- Üretilen her bir örneklem boot_sample adı verilen değişkene atanır. Basit tesadüfi örneklemi Pandas’ın sample() fonksiyonunu kullanarak uygularız. Bu fonksiyon ilgili DataFrame’e uygulanır. Parametre olarak ise örneklem büyüklüğünü kullanır.
- Döngünün attığı turu tamamlaması için yapması gereken son işlem, bootstrap örnekleminin ilgili değişkeninin ortalama değerini NumPy’ın mean fonksiyonu ile hesaplayıp, means adını verdiğimiz boş listeye atamasıdır.
Oluşturduğumuz fonksiyon ile veri setindeki “mileage” değişkeninden oluşturulan bootstrap örneklemlerinin ortalamasını hesapladık ve sonucu boot_means isimli değişkene atadık.
3. Adım: Örnekleme dağılımının oluşturulması.
Örneklem istatistikleri hesaplandıktan sonra örnekleme dağılımı oluşturulmalıdır. Örnekleme dağılımını Seaborn kütüphanesini kullanarak görselleştireceğiz. Görsel bir karşılaştırma sunması açısından, “mileage” değişkeninin ham halini ve örnekleme dağılımını yan yana çizdireceğiz.
fig, (ax1, ax2) = plt.subplots(1, 2, figsize = (12, 6))
sns.histplot(ax = ax1, data = cars["mileage"], kde = True, stat="probability")
ax1.set_title("Ham Veri")
ax1.set_xlabel("Mileage")
ax1.set_ylabel("Olasılık")
sns.histplot(ax = ax2, data = boot_means, kde = True, stat="probability")
ax2.set_title("Örnekleme Dağılımı")
ax2.set_xlabel("Mileage")
ax2.set_ylabel("Olasılık")
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.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.
- 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.

Sol tarafta değişkenin ham halini, sağ tarafta ise boostrap örneklemleri ile ortalamaları kullanarak oluşturduğumuz örnekleme dağılımının histogramını çizdirdik. Histogramlara baktığımızda, değişkenin ilk başta sağa çarpık bir dağılıma sahip olduğunu gözlemlerken, Merkezi Limit Teoremi‘nin katkılarıyla değişkenin örnekleme dağılımının normal dağılıma yaklaştığını görüyoruz.
Peki, 1000 adet örneklemeyi kullanarak oluşturduğumuz örnekleme dağılımı gerçekten normal dağılıma sahip mi?
Bu soruya daha iyi bir yanıt verebilmek için Q-Q grafiğinden yararlanabiliriz.
stats.probplot(boot_means, plot=plt)
plt.show()

SciPy kütüphanesinin stats modülünden probplot() fonksiyonunu kullanarak Q-Q grafiğini çizdirdik. Grafikten de belli olduğu üzere, gözlemlerin çapraz çizgiyi takip ettiğini ve sapmalar olmadığını görüyoruz. Bu da 1,000 adet örneklemden oluşan örnekleme dağılımının normal dağılıma yakın olduğunu gösteriyor.
grafiğin sol altında ve sağ üstünde yer alan bazı değerlerin çapraz çizgiyi takip etmeyi bıraktığını, yani saptığını görüyoruz. Bu da veri dağılımının tam olarak normal dağılıma sahip olmadığına dair kanıt sunuyor.
Bu grafikte, öncekine kıyasla, gözlemlerin çapraz çizgiyi takip ettiğini ve sapmalar olmadığını görüyoruz. Bu da 10,000 adet örneklemden oluşan örnekleme dağılımının normal dağılıma daha yakın olduğunu gösteriyor.
Standart sapma, bir veri setindeki değişkenliğin (variability) ölçüsüdür. Standart sapma değeri büyüdükçe, verideki değerlerin ortalamadan uzaklaştığını, standart sapma küçüldükçe ise verinin ortalama değer etrafında kümelendiğini söyleyebiliriz.
Standart hata (standard error), örnekleme dağılımının standart sapmasıdır. Standart hata, bir örneklem istatistiğinin popülasyon parametresinden ne kadar saptığını ifade eder. Bir örnekleme dağılımının standart hatasının küçük olması, örneklemin popülasyonun daha iyi bir temsili olduğunu gösterir.
Bir örneklem dağılımının ortalamasının standart hatası şu şekilde hesaplanır:
Standart hata = s/√n s: Örneklemin standart sapması n: Örneklemin büyüklüğü
Elimizdeki örneklemin ve örneklemden 1,000 ve 10,000 tekrar ile oluşturulan örneklem dağılımlarının standart hatasını karşılaştıralım.
se_sam = np.std(cars["mileage"]) / np.sqrt(len(cars["mileage"]))
se_boot_means = np.std(boot_means) / np.sqrt(len(boot_means))
print(se_sam, se_boot_means)
290.71190031809334 9.302132991105376
Örneklemin standart hatası 290 iken, 1,000 tekrarla oluşan örnekleme dağılımının standart hatası 9.30 olarak hesaplandı. 1,000 tekrar ile oluşturulan örneklem dağılımının standart hatası düşük olduğu için popülasyonun daha iyi bir temsilcisi olduğunu söyleyebiliriz.
4. Adım: Güven aralıklarının oluşturulması.
Örneklem dağılımını oluşturduktan sonra araştırmanın amacına göre çıkarımsal istatistiğin herhangi bir işlemi uygulanabilir. Dilerseniz hipotez testi yapabilir veya bir popülasyon parametresini tahmin edebilirsiniz.
Bu örneğin kapsamında, güven aralıklarını hesaplayacağız.
Güven aralığı, belirli bir güven seviyesinde popülasyon parametresinin bulunduğu aralığı ifade eder. Örnek olarak, erkeklerin boylarının ölçüldüğü bir çalışmada %95 güven seviyesinde boy ortalamasının 168.8 cm ve 181.2 cm arasında olduğunu kabul edelim. Bu durumda, yapılan çalışma çokça tekrarlandığı durumda çalışmaların %95’inde boy ortalaması 168.8 – 181.2 cm arasında olacaktır.
Güven aralığını hesaplarken kartillerden yararlanırız. Normal dağılım grafiğinin simetrik ve eğrinin altında kalanın toplamının 1’e eşit olduğunu söylemiştik. %95 güven düzeyinde güven aralığını hesaplarken %2.5 ve %97.5. kartillerinin değeri güven aralığının alt ve üst değerleri olacaktır.

Görsel: Omni Calculator
10,000 tekrarla oluşturduğumuz örneklem dağılımının %95 güven düzeyindeki güven aralığını hesaplayacağız.
boot_mean = np.mean(boot_means)
print(mean_boot_tenthou)
conf_int = np.percentile(boot_means, [2.5, 97.5]).round(2)
print(conf_int)
71162.4424003448 array([70589.13, 71715.19])
İlk olarak 1,000 tekrarla oluşturduğumuz örneklem dağılımının ortalamasını NumPy kütüphanesinin mean() fonksiyonunu kullanarak hesapladık. Daha sonrasında yine NumPy kütüphanesindeki percentile() fonksiyonu ile kartilleri kullanarak güven aralıklarını hesapladık.
1,000 tekrarla oluşturduğumuz örneklem dağılımının ortalaması 71,162‘dir. %95 güven düzeyinde ortalama değeri 70,589 ve 71,715 değerleri arasında olacaktır.
Uygulamayı tamamlamadan önce, hesapladığımız değerleri görselleştireceğiz.
fig, ax = plt.subplots(figsize = (12, 8))
sns.histplot(ax = ax, data = boot_means, alpha = 0.1)
ax.set_xlabel("Örneklem ortalaması")
ax.set_ylabel("Frekans")
ax.axvline(boot_mean, color = "red")
ax.axvline(lower, color = "red")
ax.text(lower + 10, 60, 'Alt Sınır')
ax.axvline(upper, color = "red")
ax.text(upper + 20, 60, 'Üst Sınır')
plt.show()
Önceki histograma benzer bir şekilde görselleştirme işlemini tamamladık. Diğer grafiklerden farklı olarak ortalama ve güven aralıklarının bulunduğu sınırları işaretlemek için kırmızı çizgiler kullandık.

Bootstrap örneklemesi, çok az varsayım ile çıkarımsal istatistik yapabilmeye imkan sağladığı için etkili ve pratik bir yöntemdir. Her ne kadar pratik bir yöntem olsa da örneklemlerin dezavantajlarından etkilenir. Popülasyonu yeterince iyi temsil etmeyen bir örneklem, hangi yöntem uygulanırsa uygulansın sonuçların kalitesini etkileyecektir.
Kaynakça:
Bootstrap Methods: Another Look at the Jackknife – B.Efron
Introduction to Bootstrapping in Statistics with an Example