Think Stats kitabının üçüncü baskısını Bookshop.org ve Amazon üzerinden edinebilirsiniz (bunlar satış ortaklığı bağlantılarıdır). Ücretsiz çevrimiçi sürümü beğeniyorsanız bana bir kahve ısmarlamayı düşünebilirsiniz.

8. Tahmin#

Nüfusu 10.000 olan bir kasabada yaşadığınızı ve yaklaşan seçimi kimin kazanacağını öngörmek istediğinizi varsayın. Kuramsal olarak kasabadaki herkese kime oy vereceğini sorabilir; herkes dürüst yanıt verirse güvenilir bir öngörüde bulunabilirsiniz.

Ancak küçük bir kasabada bile herkese anket yapmak büyük olasılıkla mümkün değildir. Neyse ki buna gerek de yoktur. Kasaba halkından rastgele bir örneklem seçip bütün kasabanın oy tercihleri hakkında çıkarım yapabilirsiniz. Bir evren hakkında çıkarım yapmak için örneklem kullanma sürecine istatistiksel çıkarım denir.

İstatistiksel çıkarım, bu bölümün konusu olan tahmini ve sonraki bölümün konusu olan hipotez testini kapsar.

Bu notebook’u Colab’da çalıştırmak için buraya tıklayın.

Kod hücresi içeriğini gizle

from os.path import basename, exists


def download(url):
    filename = basename(url)
    if not exists(filename):
        from urllib.request import urlretrieve

        local, _ = urlretrieve(url, filename)
        print("İndirildi: " + local)


download("https://github.com/TerekliTahaBerk/thinkstatstr/raw/v3/nb/thinkstats.py")

Kod hücresi içeriğini gizle

try:
    import empiricaldist
except ImportError:
    %pip install empiricaldist

Kod hücresi içeriğini gizle

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from thinkstats import decorate

8.1. Penguenlerin tartılması#

Antarktika’da yerel penguen popülasyonlarını inceleyen bir araştırmacı olduğunuzu varsayın. Görevlerinizden biri, penguenlerin ortalama ağırlığının yıl boyunca nasıl değiştiğini izlemektir. Bölgedeki bütün penguenleri tartmak mümkün olmayacağından her hafta rastgele 10 penguen seçip tartmayı ve bu örneklemle bütün penguenlerin ortalama ağırlığını, yani evren ortalamasını, tahmin etmeyi planlıyorsunuz.

Örneklemden evren ortalamasını tahmin etmenin birçok yolu vardır; biz yalnızca ikisini ele alacağız: örneklem ortalaması ve örneklem medyanı. İkisi de makul seçeneklerdir; hangisinin daha iyi olduğuna ve “daha iyi” ile ne kastettiğimize bakalım.

Gösterim amacıyla penguen ağırlıklarının, ortalaması ve standart sapması bilinen bir normal dağılımdan geldiğini varsayacağız. Bunları mu ve sigma ile gösterip kilogram cinsinden değerler atayacağım.

mu = 3.7
sigma = 0.46

Bu değerler normal dağılımın parametreleridir; yani belirli bir dağılımı tanımlarlar. Parametreler verildiğinde NumPy ile örnekleme sürecini simüle edebilir ve herhangi bir büyüklükte örneklem üretebiliriz. Örneğin aşağıda 10 ağırlıktan oluşan varsayımsal bir örneklem var.

# Her çalıştırmada aynı sonuçları almak için rastgele sayı üretecini tohumla
np.random.seed(1)
sample = np.random.normal(mu, sigma, size=10)
sample
array([4.44719887, 3.41859205, 3.45704099, 3.20643443, 4.09808751,
       2.6412922 , 4.50261341, 3.34984483, 3.84675798, 3.58528963])

Örneklemin ortalaması ve medyanı şöyledir.

np.mean(sample), np.median(sample)
(np.float64(3.6553151902291945), np.float64(3.521165310619601))

Ortalama ile medyan, hangisinin daha iyi bir tahmin olduğunu sorgulatacak kadar farklıdır. Bunu öğrenmek için verilen n büyüklüğünde varsayımsal örneklemler üreten aşağıdaki işlevi kullanacağız.

def make_sample(n):
    return np.random.normal(mu, sigma, size=n)

İlk deney olarak örneklem büyüklüğü arttıkça örneklem ortalaması ile medyanının nasıl davrandığına bakalım. Logaritmik ölçekte eşit aralıklı, 10 ile 100.000 arasında bir ns dizisi oluşturmak için NumPy’nin logspace işlevini kullanacağız.

ns = np.logspace(1, 5).astype(int)

Her n değeri için varsayımsal bir örneklem üretmek, ortalamasını hesaplamak ve sonuçları toplamak üzere bir liste üreteci kullanabiliriz:

means = [np.mean(make_sample(n)) for n in ns]

Aynısını medyan için de yapacağız.

medians = [np.median(make_sample(n)) for n in ns]

Evrenin bir özelliğini tahmin etmek için kullanılan örneklem ortalaması ya da medyanı gibi istatistiklere tahmin edici denir.

Aşağıdaki şekil, örneklem büyüklüğünü artırdığımızda bu tahmin edicilerin nasıl davrandığını gösteriyor. Yatay çizgi evrendeki gerçek ortalamayı gösterir.

plt.axhline(mu, color="gray", lw=1, alpha=0.5)
plt.plot(ns, means, "--", label="ortalama")
plt.plot(ns, medians, alpha=0.5, label="medyan")

decorate(xlabel="Örneklem büyüklüğü", xscale="log", ylabel="Tahmin")
_images/52735d1bd91f90bb133c5fae0e0b9faa43ca978bcb36ebb9672680007d14a06e.png

Her iki tahmin edicide de örneklem büyüklüğü arttıkça tahminler gerçek değere yakınsar. Bu, iyi bir tahmin edicide bulunması gereken özelliklerden biri olan tutarlılığı gösterir. Bu özelliğe göre ortalama ile medyan eşit ölçüde iyi görünür.

Önceki şekilde tahminlerin bazen fazla yüksek, bazen fazla düşük olduğunu ve değişimin gerçek değer çevresinde yaklaşık simetrik göründüğünü fark edebilirsiniz. Bu durum başka bir deneyi akla getirir: Aynı büyüklükte çok sayıda örneklem alıp çok sayıda tahmin hesaplarsak tahminlerin ortalaması ne olur?

Aşağıdaki döngü 10 penguenlik 10.001 örneklem üretip her birinin ortalamasını hesaplayarak bu senaryoyu simüle eder.

means = [np.mean(make_sample(n=10)) for i in range(10001)]
np.mean(means)
np.float64(3.7003450849286907)

Ortalamaların ortalaması, örneklemleri üretmekte kullandığımız gerçek ortalama olan 3,7 kg’a yakındır.

Aşağıdaki döngü aynı senaryoyu simüle eder; ancak bu kez her örneklemin medyanını hesaplar.

medians = [np.median(make_sample(n=10)) for i in range(10001)]
np.mean(medians)
np.float64(3.701214089907223)

Bu varsayımsal medyanların ortalaması da gerçek evren ortalamasına çok yakındır.

Bu sonuçlar, örneklem ortalaması ile medyanının yanlı olmayan tahmin ediciler olduğunu, yani ortalama olarak doğru olduklarını gösterir. “Yanlılık” sözcüğü farklı bağlamlarda farklı anlamlara gelir ve bu durum kafa karıştırabilir. Burada “yanlı olmayan”, tahminlerin ortalamasının gerçek değere eşit olması demektir.

Şimdiye kadar iki tahmin edicinin de tutarlı ve yanlı olmadığını gösterdik; ancak hangisinin daha iyi olduğu hâlâ belli değil. Bir deney daha yapıp hangisinin daha doğru olduğuna bakalım. “Doğru” sözcüğünün de farklı anlamları vardır; bunu nicelleştirmenin bir yolu olarak ortalama karesel hatayı (MSE) ele alalım. Aşağıdaki işlev tahminler ile gerçek değer arasındaki farkları hesaplar ve bu hataların karelerinin ortalamasını döndürür.

def mse(estimates, actual):
    """Bir tahmin dizisinin ortalama karesel hatası."""
    errors = np.asarray(estimates) - actual
    return np.mean(errors**2)

MSE’yi yalnızca gerçek değeri biliyorsak hesaplayabileceğimize dikkat edin. Uygulamada genellikle bilmeyiz; zaten gerçek değeri bilseydik tahmin etmemiz gerekmezdi. Ancak deneyimizde gerçek evren ortalamasının 3,7 kg olduğunu bildiğimiz için örneklem ortalamalarının MSE’sini hesaplayabiliriz.

mse(means, mu)
np.float64(0.02087198489128938)

Büyüklüğü 10 olan örneklemlerde evren ortalamasını örneklem ortalamasıyla tahmin edersek ortalama karesel hata yaklaşık 0,021 kilogram karedir. Şimdi örneklem medyanlarının MSE’sine bakalım.

mse(medians, mu)
np.float64(0.029022273128644173)

Evren ortalamasını örneklem medyanlarıyla tahmin edersek ortalama karesel hata yaklaşık 0,029 kilogram karedir. Bu örnekte örneklem ortalaması, örneklem medyanından daha iyidir. Genel olarak veriler normal dağılımdan geliyorsa örneklem ortalaması, MSE’yi en aza indirmesi anlamında evren ortalamasının en iyi yanlı olmayan tahmin edicisidir.

MSE’yi en aza indirmek iyi bir özelliktir; ancak MSE hataları özetlemenin her zaman en iyi yolu değildir. Öncelikle yorumlanması güçtür. Bu örnekte birimi kilogram kare olduğundan bunun ne anlama geldiğini söylemek zordur.

Çözümlerden biri MSE’nin karekökü olan “kök ortalama karesel hata”yı (RMSE) kullanmaktır. Başka bir seçenek ise hataların mutlak değerlerinin ortalaması olan “ortalama mutlak hata”yı (MAE) kullanmaktır. Aşağıdaki işlev bir tahmin dizisinin MAE’sini hesaplar.

def mae(estimates, actual):
    """Bir tahmin dizisinin ortalama mutlak hatası."""
    errors = np.asarray(estimates) - actual
    return np.mean(np.abs(errors))

Örneklem ortalamalarının MAE’si şöyledir.

mae(means, mu)
np.float64(0.1154043374950527)

Örneklem medyanlarınınki ise şöyledir.

mae(medians, mu)
np.float64(0.13654429774596036)

Örneklem ortalamasının gerçek değerden ortalama yaklaşık 0,115 kg, örneklem medyanının ise 0,137 kg sapmasını bekleriz. En azından bu örnekte örneklem ortalaması muhtemelen daha iyi seçimdir.

8.2. Dirençlilik#

Şimdi farklı bir senaryo ele alalım. Bir pengueni tartmaya çalıştığınız her yüz denemenin ikisinde penguenin yanlışlıkla terazinin birim düğmesine bastığını ve ağırlığın kilogram yerine pound cinsinden kaydedildiğini varsayın. Hata fark edilmezse örnekleme bir aykırı değer eklenir.

Aşağıdaki işlev bu senaryoyu, ağırlıkların %2’sini kilogram başına 2,2 pound dönüşüm katsayısıyla çarparak simüle eder.

def make_sample_with_errors(n):
    sample = np.random.normal(mu, sigma, size=n)
    factor = np.random.choice([1, 2.2], p=[0.98, 0.02], size=n)
    return sample * factor

Bunun dağılım üzerindeki etkisini görmek için büyük bir örneklem üreteceğiz.

sample = make_sample_with_errors(n=1000)

Örneklem dağılımını çizmek için KDE’yi ve Bölüm 6’daki Pdf nesnesini kullanacağız.

from scipy.stats import gaussian_kde
from thinkstats import Pdf

kde = gaussian_kde(sample)
domain = 0, 10
pdf = Pdf(kde, domain)
pdf.plot(label='tahmin edilen yoğunluk')
decorate(xlabel="Penguen ağırlığı (kg)", ylabel="Yoğunluk")
_images/7425e7e673017d0bababb7855239b0168d318e67e4c2c08d4a5400923b2884b7.png

Ölçüm hataları, 3,7 kg yakınındaki modun yanı sıra 8 kilogram yakınında ikinci bir mod oluşturur.

Şimdi önceki deneyi yineleyelim: büyüklüğü 10 olan çok sayıda örneklem simüle edip her birinin ortalamasını, ardından örneklem ortalamalarının ortalamasını hesaplayalım.

means = [np.mean(make_sample_with_errors(n=10)) for i in range(10001)]
np.mean(means)
np.float64(3.786352945690677)

Ölçüm hataları, örneklem ortalamasının ortalama olarak 3,7 kg’dan yüksek olmasına yol açar.

Şimdi aynı deneyi örneklem medyanlarıyla yapalım.

medians = [np.median(make_sample_with_errors(n=10)) for i in range(10001)]
np.mean(medians)
np.float64(3.7121869836715353)

Örneklem medyanlarının ortalaması da 3,7 kg’dan yüksektir; ancak sapma çok daha küçüktür. Tahminlerin MSE’lerini karşılaştırırsak örneklem medyanlarının belirgin biçimde daha doğru olduğunu görürüz.

mse(means, mu), mse(medians, mu)
(np.float64(0.06853430354724438), np.float64(0.031164467796883765))

Ölçümler gerçekten normal dağılımdan geliyorsa örneklem ortalaması MSE’yi en aza indirir. Ancak bu senaryo varsayımı ihlal ettiğinden örneklem ortalaması MSE’yi en aza indirmez. Örneklem medyanı aykırı değerlere daha az duyarlıdır; dolayısıyla daha az yanlı ve MSE’si daha küçüktür. Aykırı değerlerle ve benzer varsayım ihlalleriyle iyi başa çıkan tahmin edicilere dirençli denir.

8.3. Varyansın tahmin edilmesi#

Başka bir örnek olarak penguen ağırlıklarındaki varyansı tahmin etmek istediğimizi varsayalım. Bölüm 1’de bir örneklemin varyansını hesaplamanın iki yolu olduğunu görmüş, aradaki farkı daha sonra açıklayacağıma söz vermiştim. O zaman geldi.

İki yol bulunmasının nedeni, bunlardan birinin evren varyansının yanlı, diğerinin yanlı olmayan tahmin edicisi olmasıdır. Aşağıdaki işlev, karesel sapmalar toplamını n’ye bölerek yanlı tahmin ediciyi hesaplar.

def biased_var(xs):
    # Paydada n kullanarak varyansı hesapla
    n = len(xs)
    deviations = xs - np.mean(xs)
    return np.sum(deviations**2) / n

Sınamak için büyüklüğü 10 olan çok sayıda örneklem simüle edip her örneklemin yanlı varyansını, ardından varyansların ortalamasını hesaplayacağız.

biased_vars = [biased_var(make_sample(n=10)) for i in range(10001)]
np.mean(biased_vars)
np.float64(0.19049277659404473)

Sonuç yaklaşık 0,19’dur; ancak gerçek evren varyansının yaklaşık 0,21 olduğunu biliyoruz. Dolayısıyla örneklem varyansının bu sürümü ortalama olarak fazla düşüktür ve yanlı olduğu doğrulanır.

actual_var = sigma**2
actual_var
0.2116

Aşağıdaki işlev, karesel sapmalar toplamını n-1’e bölerek yanlı olmayan tahmin ediciyi hesaplar.

def unbiased_var(xs):
    # Paydada n-1 kullanarak varyansı hesapla
    n = len(xs)
    deviations = xs - np.mean(xs)
    return np.sum(deviations**2) / (n - 1)

Çok sayıda örneklem üretip her birinin yanlı olmayan varyansını hesaplayarak bunu sınayabiliriz.

unbiased_vars = [unbiased_var(make_sample(n=10)) for i in range(10001)]
np.mean(unbiased_vars)
np.float64(0.21159109492300626)

Yanlı olmayan örneklem varyanslarının ortalaması gerçek değere çok yakındır; yanlı değilse beklediğimiz de budur.

Örneklem büyüklüğü 10 olduğunda yanlı ve yanlı olmayan tahmin ediciler arasındaki fark yaklaşık %10’dur ve göz ardı edilemeyebilir. Örneklem büyüklüğü 100 olduğunda fark yalnızca %1’dir; uygulamada muhtemelen önem taşımayacak kadar küçüktür.

n = 10
1 - (n - 1) / n
0.09999999999999998
n = 100
1 - (n - 1) / n
0.010000000000000009

8.4. Örnekleme dağılımları#

Şimdiye kadar penguen ağırlıklarının parametreleri bilinen normal dağılımdan geldiğini varsayarak simüle edilmiş verilerle çalıştık. Şimdi gerçek verilerde ne olduğuna bakalım.

Araştırmacılar 2007 ile 2010 arasında Antarktika’daki Palmer İstasyonu’nda yerel popülasyonlardan 342 pengueni ölçüp tarttı. Topladıkları veriler ücretsiz olarak kullanılabilir; indirme yönergeleri bu bölümün notebook’unda yer alıyor.

Aşağıdaki hücre, verileri Allison Horst tarafından oluşturulan bir depodan indirir.

Horst AM, Hill AP, Gorman KB (2020). palmerpenguins: Palmer Archipelago (Antarctica) penguin data. R paketi, sürüm 0.1.0. https://allisonhorst.github.io/palmerpenguins/. doi: 10.5281/zenodo.3960218.

Veriler şu makaleye temel olan araştırma kapsamında toplanmıştır: Gorman KB, Williams TD, Fraser WR (2014). Ecological sexual dimorphism and environmental variability within a community of Antarctic penguins (genus Pygoscelis). PLoS ONE 9(3):e90081. https://doi.org/10.1371/journal.pone.0090081

download(
    "https://raw.githubusercontent.com/allisonhorst/palmerpenguins/c19a904462482430170bfe2c718775ddb7dbb885/inst/extdata/penguins_raw.csv"
)

Verileri Pandas ile okuyabiliriz.

penguins = pd.read_csv("penguins_raw.csv").dropna(subset=["Body Mass (g)"])
penguins.shape
(342, 17)

Veri kümesi üç penguen türünü içerir.

penguins["Species"].value_counts()
Species
Adelie Penguin (Pygoscelis adeliae)          151
Gentoo penguin (Pygoscelis papua)            123
Chinstrap penguin (Pygoscelis antarctica)     68
Name: count, dtype: int64

İlk örnekte yalnızca sakallı penguenleri seçeceğiz.

chinstrap = penguins.query('Species.str.startswith("Chinstrap")')

Tahmin edilen PDF’leri çizmek için bu işlevi kullanacağız.

def plot_kde(sample, name="tahmin edilen yoğunluk", **options):
    kde = gaussian_kde(sample)
    m, s = np.mean(sample), np.std(sample)
    plt.axvline(m, color="gray", ls=":")

    domain = m - 4 * s, m + 4 * s
    pdf = Pdf(kde, domain, name)
    pdf.plot(**options)

Sakallı penguenlerin kilogram cinsinden ağırlık dağılımı aşağıdadır. Dikey noktalı çizgi örneklem ortalamasını gösterir.

weights = chinstrap["Body Mass (g)"] / 1000
plot_kde(weights, "weights")
decorate(xlabel="Penguen ağırlığı (kg)", ylabel="Yoğunluk")
_images/75ab817cf317974590ea28d374fa88bfcd7373e8e1aad2454b2e8395f9cd54da.png

Örneklem ortalaması yaklaşık 3,7 kg’dır.

sample_mean = np.mean(weights)
sample_mean
np.float64(3.733088235294118)

Evren ortalamasını tahmin etmeniz istenirse 3,7 kg makul bir seçimdir; peki bu tahmin ne kadar hassastır?

Bu soruyu yanıtlamanın bir yolu, tahmini ortalamanın örneklemden örnekleme ne kadar değiştiğini gösteren ortalamanın örnekleme dağılımını hesaplamaktır. Evrendeki gerçek ortalama ve standart sapmayı bilseydik örnekleme sürecini modelleyip örnekleme dağılımını hesaplayabilirdik. Ancak gerçek evren ortalamasını bilseydik onu tahmin etmemiz gerekmezdi.

Neyse ki örnekleme dağılımına yaklaşmanın yeniden örnekleme denen basit bir yolu vardır. Temel fikir, örneklemi kullanarak evrenin bir modelini oluşturmak ve ardından örnekleme sürecini modelle simüle etmektir.

Daha özel olarak parametrik yeniden örnekleme kullanacağız: örneklemden evren parametrelerini tahmin edip yeni örneklemler üretmek için kuramsal bir dağılım kullanacağız.

Aşağıdaki işlev bu süreci normal dağılımla uygular. Yeni örneklemlerin özgün örneklemle aynı büyüklükte olduğuna dikkat edin.

def resample(sample):
    # Normal dağılımdan bir örneklem üret
    m, s = np.mean(sample), np.std(sample)
    return np.random.normal(m, s, len(sample))

Bu döngü, çok sayıda örneklem üretmek ve her birinin ortalamasını hesaplamak için resample kullanır.

sample_means = [np.mean(resample(weights)) for i in range(1001)]

Aşağıdaki şekil bu örneklem ortalamalarının dağılımını gösteriyor.

plot_kde(sample_means, "örneklem ortalamaları")
decorate(xlabel="Ağırlığın örneklem ortalaması (kg)", ylabel="Yoğunluk")
_images/c621679f130f46061b31d21810b274ddf3eacb92e8c09edbde798ba94960ea7d.png

Bu sonuç, örneklem ortalamasının örnekleme dağılımına yaklaşır. Evren modelimizin doğru olduğu varsayımıyla, aynı büyüklükte çok sayıda örneklem toplarsak örneklem ortalamasının ne kadar değişmesini beklediğimizi gösterir.

Kabaca, aynı büyüklükte başka bir örneklem toplasaydık örneklem ortalamasının 3,55 kadar düşük ya da 3,9 kadar yüksek olabileceğini görebiliriz.

8.5. Standart hata#

Örnekleme dağılımının genişliğini nicelleştirmenin bir yolu standart sapmasını hesaplamaktır; sonuca standart hata denir.

standard_error = np.std(sample_means)
standard_error
np.float64(0.046265310696849846)

Bu durumda standart hata yaklaşık 0,045 kg’dır; yani çok sayıda örneklem toplarsak örneklem ortalamalarının ortalama olarak yaklaşık 0,045 kg değişmesini bekleriz.

Standart hata ile standart sapma sık sık karıştırılır. Şunu unutmayın:

  • Standart sapma, ölçümlerdeki değişkenliği nicelleştirir.

  • Standart hata, bir tahminin hassasiyetini nicelleştirir.

Bu veri kümesinde sakallı penguenlerin ağırlıklarının standart sapması yaklaşık 0,38 kg’dır.

np.std(weights)
np.float64(0.3814986213564681)

Ortalama ağırlığın standart hatası yaklaşık 0,046 kg’dır.

np.std(sample_means)
np.float64(0.046265310696849846)

Standart sapma penguenlerin ağırlık bakımından ne kadar farklı olduğunu, standart hata ise bir tahminin ne kadar hassas olduğunu söyler. Farklı soruları yanıtlarlar.

Yine de aralarında bir ilişki vardır. Standart sapmayı ve örneklem büyüklüğünü biliyorsak ortalamaların standart hatasına şöyle yaklaşabiliriz:

def approximate_standard_error(sample):
    n = len(sample)
    return np.std(sample) / np.sqrt(n)
approximate_standard_error(weights)
np.float64(0.046263503290595163)

Bu sonuç, yeniden örneklemeyle elde ettiğimiz değere yakındır.

8.6. Güven aralıkları#

Örnekleme dağılımını özetlemenin başka bir yolu güven aralığı hesaplamaktır. Örneğin %90 güven aralığı, örnekleme dağılımındaki değerlerin %90’ını içerir; bunu 5. ve 95. yüzdelikleri hesaplayarak bulabiliriz. Sakallı penguenlerin ortalama ağırlığı için %90 güven aralığı şöyledir.

ci90 = np.percentile(sample_means, [5, 95])
ci90
array([3.6576334 , 3.80737506])

Bir güven aralığını yorumlarken gerçek evren parametresinin %90 güven aralığına düşme olasılığının %90 olduğunu söylemek çekicidir. Bu örnekte sakallı penguenlerin evren ortalamasının 3,66 ile 3,81 kg arasında olma olasılığının %90 olduğunu söylerdik.

Frekansçılık denen katı bir olasılık felsefesine göre bu yoruma izin verilmez ve birçok istatistik kitabında bunun yanlış olduğu söylenir.

Bence bu yasak gereksiz ölçüde katıdır. Makul olasılık felsefelerine göre güven aralığı insanların beklediği anlama gelir: gerçek değerin %90 güven aralığına düşme olasılığı %90’dır.

Ancak güven aralıkları yalnızca evrenin bir bölümünü ölçmekten, yani örneklemeden kaynaklanan değişkenliği nicelleştirir. Örnekleme dağılımı, özellikle sonraki bölümde ele alınan örnekleme yanlılığı ve ölçüm hatası gibi başka hata kaynaklarını hesaba katmaz.

8.7. Hata kaynakları#

Antarktika’daki penguenlerin ortalama ağırlığı yerine yaşadığınız kentteki kadınların ortalama ağırlığını bilmek istediğinizi varsayın. Kadınlardan rastgele ve temsil edici bir örneklem seçip onları tartamazsınız.

Basit bir seçenek “telefonla örnekleme” olabilir: telefon rehberinden rastgele numaralar seçip arar, yetişkin bir kadınla konuşmak ister ve ağırlığını sorarsınız. Ancak telefonla örneklemenin belirgin sorunları vardır.

Örneğin örneklem, telefon numarası listelenmiş kişilerle sınırlıdır; telefonu olmayanları (ortalamadan daha yoksul olabilirler) ve numarası gizli olanları (daha varlıklı olabilirler) dışarıda bırakır. Ev telefonlarını gündüz ararsanız çalışan kişileri örnekleme olasılığınız daha düşüktür. Yalnızca telefonu açan kişiyi örneklerseniz telefon hattını paylaşan kişileri örnekleme olasılığınız da azalır.

Gelir, istihdam ve hane büyüklüğü gibi etmenler ağırlıkla ilişkiliyse —ki bu makul bir olasılıktır— araştırma sonuçlarınız şu ya da bu yönde etkilenir. Bu soruna, örnekleme sürecinin bir özelliği olduğu için örnekleme yanlılığı denir.

Bu süreç aynı zamanda bir örnekleme yanlılığı türü olan öz seçilime açıktır. Bazı kişiler soruyu yanıtlamayı reddeder; reddetme eğilimi ağırlıkla ilişkiliyse sonuçlar etkilenir.

Son olarak kişileri tartmak yerine ağırlıklarını sorarsanız sonuçlar doğru olmayabilir. Yardımcı olmak isteyen kişiler bile gerçek ağırlıklarından rahatsızlarsa yukarı ya da aşağı yuvarlama yapabilir. Üstelik her katılımcı yardımcı değildir. Bu yanlışlıklar ölçüm hatası örnekleridir.

Tahmin edilen bir niceliği bildirirken standart hata ya da güven aralığı vererek örneklemeden kaynaklanan değişkenliği nicelleştirmek yararlıdır. Ancak bunun yalnızca bir hata kaynağı olduğunu ve çoğu zaman en büyük kaynak olmadığını unutmayın.

8.8. Sözlük#

  • evren ortalaması (population mean): Bir alt kümeden hesaplanan örneklem ortalamasının aksine, evrendeki bir niceliğin gerçek ortalaması.

  • parametre (parameter): Bir dağılım ailesindeki belirli dağılımı tanımlayan değerlerden biri; örneğin normal dağılımın parametreleri ortalama ile standart sapmadır.

  • tahmin edici (estimator): Evren parametresini tahmin etmek için örneklemden hesaplanan istatistik.

  • tutarlı (consistent): Örneklem büyüklüğü arttıkça parametrenin gerçek değerine yakınsayan tahmin edici.

  • yanlı olmayan (unbiased): Belirli bir örneklem büyüklüğünde örneklem tahminlerinin ortalaması parametrenin gerçek değerine eşit olan tahmin edici.

  • ortalama karesel hata (mean squared error, MSE): Gerçek değer biliniyorsa tahmin edilen ve gerçek parametre değerleri arasındaki karesel farkların ortalaması.

  • dirençli (robust): Veri kümesi aykırı değerler veya hatalar içerdiğinde ya da kuramsal dağılıma tam uymadığında bile doğruluğunu koruyan tahmin edici.

  • yeniden örnekleme (resampling): Örnekleme sürecini simüle ederek bir tahminin örnekleme dağılımına yaklaşma yöntemi.

  • parametrik yeniden örnekleme (parametric resampling): Örneklemden evren parametrelerini tahmin edip örnekleme sürecini kuramsal bir dağılımla simüle eden yeniden örnekleme türü.

  • örnekleme dağılımı (sampling distribution): Aynı evrenden alınabilecek örneklemler boyunca bir istatistiğin dağılımı.

  • standart hata (standard error): Rastgele örneklemeden kaynaklanan tahmin değişkenliğini nicelleştiren örnekleme dağılımı standart sapması.

  • güven aralığı (confidence interval): Örnekleme dağılımındaki en olası değerleri içeren aralık.

  • örnekleme yanlılığı (sampling bias): Örneklemi evreni temsil edemez hâle getiren toplama süreci kusuru.

  • ölçüm hatası (measurement error): Verilerin gözlenme, ölçülme ya da kaydedilme biçimindeki yanlışlık.

8.9. Alıştırmalar#

8.9.1. Alıştırma 8.1#

Yeniden örnekleme yöntemlerinin güçlü yönlerinden biri başka istatistiklere kolayca genişletilebilmeleridir. Bu bölümde penguen ağırlıklarının örneklem ortalamasını hesaplayıp ortalamanın örnekleme dağılımına yaklaşmak için yeniden örnekleme kullandık. Şimdi aynısını standart sapma için yapalım.

Sakallı penguenlerin ağırlıklarının örneklem standart sapmasını hesaplayın. Ardından standart sapmanın örnekleme dağılımına yaklaşmak için resample kullanın. Tahminin standart hatasını ve %90 güven aralığını örnekleme dağılımından hesaplayın.

8.9.2. Alıştırma 8.2#

Davranışsal Risk Faktörü Gözetim Sistemi (BRFSS) veri kümesi, ABD’deki yetişkinlerden oluşan bir örneklemin kendi bildirdiği boy ve ağırlıkları içerir. Yetişkin erkeklerin ortalama boyunu tahmin etmek için bu verileri kullanın. Örnekleme dağılımına yaklaşmak ve %90 güven aralığı hesaplamak için resample kullanın.

Örneklem çok büyük olduğu için güven aralığı çok dardır; bu da rastgele örneklemeden kaynaklanan değişkenliğin küçük olduğu anlamına gelir. Ancak başka hata kaynakları daha büyük olabilir. Sizce sonuçları başka hangi hata kaynakları etkiler?

Aşağıdaki hücreler verileri indirir, bir DataFrame içine okur ve erkek katılımcıların boylarını seçer.

download("https://github.com/TerekliTahaBerk/thinkstatstr/raw/v3/data/CDBRFS08.ASC.gz")
from thinkstats import read_brfss

brfss = read_brfss()
male = brfss.query("sex == 1")
heights = male["htm3"]
heights.describe()
count    154407.000000
mean        178.066221
std           7.723563
min          61.000000
25%         173.000000
50%         178.000000
75%         183.000000
max         236.000000
Name: htm3, dtype: float64

8.9.3. Alıştırma 8.3#

Futbol ve hokey gibi oyunlarda goller arasındaki süre üstel dağılım izleme eğilimindedir (Bölüm 6’da gördüğümüz gibi). Goller arasındaki sürelerden oluşan bir örneklem gözlediğimizi varsayın. Örneklemin üstel dağılımdan geldiğini kabul edersek dağılımın gerçek ortalamasını nasıl tahmin edebiliriz? Örneklem ortalamasını ya da medyanını kullanmayı düşünebiliriz. Bunlardan birinin tutarlı ve yanlı olmayan tahmin edici olup olmadığına bakalım. Deneylerde goller arasındaki gerçek ortalama sürenin 10 dakika olduğunu varsayacağız.

actual_mean = 10

Aşağıdaki işlev, bu ortalamaya ve verilen örneklem büyüklüğüne sahip üstel dağılımdan bir örneklem üretir.

def make_exponential(n):
    return np.random.exponential(actual_mean, size=n)

Bu işlevle çeşitli büyüklüklerde örneklemler üretip her birinin ortalamasını hesaplayın. n arttıkça örneklem ortalamaları gerçek ortalamaya yakınsıyor mu?

Ardından çeşitli büyüklüklerde örneklemler üretip her birinin medyanını hesaplayın. Örneklem medyanları gerçek medyana yakınsıyor mu?

Verilen ortalamaya sahip üstel dağılımın gerçek medyanı şöyledir.

actual_median = np.log(2) * actual_mean
actual_median
np.float64(6.931471805599453)

Ardından büyüklüğü 10 olan çok sayıda örneklem üretip örneklem ortalamasının evren ortalamasının yanlı olmayan bir tahmin edicisi olup olmadığını denetleyin.

Son olarak örneklem medyanının evren medyanının yanlı olmayan bir tahmin edicisi olup olmadığını denetleyin.

8.9.4. Alıştırma 8.4#

Bu bölümde yanlı bir varyans tahmin edicisini sınayıp gerçekten yanlı olduğunu gösterdik. Yanlı olmayan tahmin edicinin de yanlı olmadığını gösterdik. Şimdi standart sapmayı deneyelim.

Evren standart sapmasını tahmin etmek için yanlı ya da yanlı olmayan varyans tahmin edicisinin karekökünü şöyle hesaplayabiliriz:

def biased_std(sample):
    # Yanlı varyans tahmin edicisinin karekökü
    var = biased_var(sample)
    return np.sqrt(var)
def unbiased_std(sample):
    # Yanlı olmayan varyans tahmin edicisinin karekökü
    var = unbiased_var(sample)
    return np.sqrt(var)

Ortalaması 3,7 ve standart sapması 0,46 olan normal dağılımdan büyüklüğü 10 olan çok sayıda örneklem üretmek için make_sample kullanın. Bu ikisinden birinin standart sapmanın yanlı olmayan tahmin edicisi olup olmadığını denetleyin.

# `make_sample` kullanılan bir örnek

mu, sigma = 3.7, 0.46
make_sample(n=10)
array([4.5279695 , 3.75698359, 4.09347143, 3.56308034, 3.17123233,
       4.40734952, 3.70858308, 4.15706704, 4.06716703, 3.7203591 ])

8.9.5. Alıştırma 8.5#

Bu alıştırma, II. Dünya Savaşı sırasında Londra’daki Amerikan Büyükelçiliği Ekonomik Savaş Bölümü’nün yaptığı gerçek bir analizin basitleştirilmiş sürümü olan Alman tankı problemine dayanır.

Müttefik bir casus olduğunuzu ve görevinizin Almanların kaç tank ürettiğini tahmin etmek olduğunu varsayın. Veri olarak ele geçirilen k tanktan alınmış seri numaralarınız var.

Almanların 1’den N’ye numaralandırılmış N tankı olduğunu ve bu aralıktaki tüm tankların ele geçirilme olasılığının eşit olduğunu varsayarsak N’yi şöyle tahmin edebiliriz:

def estimate_tanks(sample):
    m = np.max(sample)
    k = len(sample)
    return m + (m - k) / k

Örnek olarak N’nin 122 olduğunu varsayın.

N = 122
tanks = np.arange(1, N + 1)

Rastgele k tanklık bir örneklem üretmek için aşağıdaki işlevi kullanabiliriz.

def sample_tanks(k):
    return np.random.choice(tanks, replace=False, size=k)

Bir örnek şöyledir.

np.random.seed(17)
sample = sample_tanks(5)
sample
array([74, 71, 95, 10, 17])

Bu örnekleme dayalı tahmin ise şöyledir.

estimate_tanks(sample)
np.float64(113.0)

Bu tahmin edicinin yanlı olup olmadığını denetleyin.

Bu problem hakkında daha fazla bilgi için Vikipedi sayfasına ve Ruggles ile Brodie’nin Mart 1947 tarihli Journal of the American Statistical Association’da yayımlanan “An Empirical Approach to Economic Intelligence in World War II” makalesine bakın; makale buradan edinilebilir.

Tahmin edicinin nasıl çalıştığını açıklayan bu video da ilginizi çekebilir.

8.9.6. Alıştırma 8.6#

Başta basketbol olmak üzere çeşitli sporlarda birçok oyuncu ve taraftar “sıcak el” denen olguya inanır. Buna göre art arda birkaç isabet kaydeden oyuncunun bir sonraki atışını da isabet ettirme, art arda birkaç kez kaçıran oyuncunun ise yine kaçırma olasılığı daha yüksektir.

Ünlü bir makale, profesyonel basketbol maçlarındaki isabet ve ıska dizilerini inceleyerek sıcak elin gerçek mi yanılsama mı olduğunu sınamayı önerdi. Yazarlar her oyuncu için genel isabet olasılığını ve art arda üç isabetten sonraki koşullu isabet olasılığını hesapladı. Dokuz oyuncunun sekizinde üç isabetten sonra isabet olasılığının daha düşük olduğunu buldular. Buna ve diğer sonuçlara dayanarak “ardışık atışların sonuçları arasında pozitif korelasyon olduğuna dair kanıt bulunmadığı” sonucuna vardılar. On yıllar boyunca birçok kişi sıcak elin çürütüldüğüne inandı.

Ancak bu sonuç en azından kısmen istatistiksel bir hataya dayanır. 2018 tarihli bir makale, ilk makalede kullanılan istatistiğin —üç isabetten sonraki isabet olasılığının— yanlı olduğunu gösterdi. Her atışın isabet olasılığı tam 0,5 olsa ve sonuçlar arasında gerçekte hiçbir korelasyon bulunmasa bile üç isabetten sonraki isabet olasılığı 0,5’ten küçüktür.

Bunun neden doğru olduğu açık değildir; hata bu yüzden bu kadar uzun süre fark edilmedi. Burada açıklamaya çalışmayacağım, ancak bu bölümdeki yöntemlerle denetleyebiliriz. Olasılığı 0,5 olan ve korelasyon içermeyen 0 ve 1 dizisi üretmek için aşağıdaki işlevi kullanacağız.

def make_hits_and_misses(n):
    # Rastgele bir 0 ve 1 dizisi üret
    return np.random.choice([0, 1], size=n)

Bu bölümün notebook’unda art arda üç isabetten (1’lerden) oluşan tüm alt dizileri bulup dizide bunları izleyen öğeyi döndüren bir işlev veriyorum.

import numpy as np


def get_successors(seq, target_sum=3):
    """Toplamı hedef değere eşit olan her alt dizinin ardıllarını döndürür.

    Parametreler:
    seq (array-like): 1 ve 0 dizisi.
    target_sum (int): Alt dizinin hedef toplamı. Varsayılan değer 3’tür.

    Döndürür:
    np.ndarray: Toplamı `target_sum` olan alt dizilerin ardıllarından oluşan dizi.
    """
    # Girdi dizisinin fazla kısa olup olmadığını denetle
    if len(seq) < 3:
        return np.array([])

    # Uzunluğu 3 olan her alt dizinin toplamını hesapla
    kernel = [1, 1, 1]
    corr = np.correlate(seq, kernel, mode="valid")

    # Alt dizi toplamının hedef değere eşit olduğu indisleri bul
    indices = np.nonzero(corr == target_sum)[0]

    # Alt dizinin dizinin sonunda olduğu durumları çıkar
    indices = indices[indices < len(seq) - 3]

    # Her geçerli alt dizinin ardılını bul
    successors = seq[indices + 3] if len(indices) > 0 else np.array([])

    return successors

Uzunluğu 100 olan çok sayıda dizi üretin ve her dizide üç isabetten sonra gelen atışları bulun. Bu atışların yüzde kaçının isabet olduğunu hesaplayın. İpucu: Dizi art arda üç isabet içermiyorsa işlev boş bir dizi döndürür; kodunuz bunu ele almalıdır.

Bu simülasyonu çok kez çalıştırdığınızda ortalama isabet yüzdesi nedir? Dizinin uzunluğunu artırdığınızda ya da azalttığınızda sonuç nasıl değişir?

Ünlü makale: Gilovich, T., Vallone, R. ve Tversky, A. (1985). The hot hand in basketball: On the misperception of random sequences. Cognitive Psychology, 17(3), 295–314.

İstatistiksel hatayı gösteren makale: Miller, J. B. ve Sanjurjo, A. (2018). Surprised by the hot hand fallacy? A truth in the law of small numbers. Econometrica, 86(6), 2019–2047.

İlk makaleye buradan, ikinci makaleye buradan ulaşabilirsiniz. Konuya genel bakış ve hatanın açıklaması için bu videoyu da izleyebilirsiniz.

Think Stats: Python ile Keşifsel Veri Analizi, 3. Baskı

Telif hakkı 2024 Allen B. Downey

Kod lisansı: MIT Lisansı

Metin lisansı: Creative Commons Atıf-Gayriticari-AynıLisanslaPaylaş 4.0 Uluslararası