- Ortalama, medyan, standart sapma ve IQR hesaplamak, aykırı değerleri bulmak
- Normal dağılımda olasılıkları ve nicelikleri
scipy.stats.normile bulmak - Ortalama için güven aralığı oluşturmak ve t-testinin p-değerini doğru yorumlamak
- Pearson ve Spearman korelasyonunu hesaplamak, korelasyonu nedensellikten ayırmak
Bakü'deki bir yemek teslimat servisi siparişleri “ortalama 15 dakikada” getirmeyi vaat ediyor. Murad 10 siparişin süresini ölçtü. Bu, vaadi kontrol etmeye yeter mi? Bir sipariş 45 dakika sürdüyse sonucu nasıl etkiler? İstatistik üç adımda yanıt verir: veriyi betimle, bir dağılımla modelle ve örneklemden bütün ana kütle hakkında çıkarım yap. Python'da bunun için NumPy ve scipy.stats yeterlidir.
Betimleyici istatistik ve aykırı değerler
Merkezi eğilim ölçüleri “tipik” değeri verir: ortalama (aritmetik ortalama), medyan (sıralanmış verinin ortası) ve mod (en sık görülen değer). Yayılım ölçüleri değerlerin ne kadar dağınık olduğunu gösterir: varyans, standart sapma ve çeyrekler açıklığı IQR = Q3 − Q1. Örneklem için varyansı n − 1'e böleriz (Bessel düzeltmesi); böylece tahmin yansız olur.
- nörneklem büyüklüğü
- s²örneklem varyansı (birimi verinin biriminin karesi)
- sörneklem standart sapması (veriyle aynı birimde); NumPy'da
std(ddof=1)
import numpy as np
from scipy import stats
minutes = np.array([12, 15, 11, 14, 13, 45, 13, 16, 14, 13])
print('mean :', minutes.mean())
print('median:', np.median(minutes))
print('mode :', stats.mode(minutes, keepdims=False).mode)
print('var :', round(minutes.var(ddof=1), 2))
print('std :', round(minutes.std(ddof=1), 2))
q1, q3 = np.percentile(minutes, [25, 75])
iqr = q3 - q1
print('Q1, Q3, IQR:', q1, q3, iqr)
low, high = q1 - 1.5 * iqr, q3 + 1.5 * iqr
print('outliers:', minutes[(minutes < low) | (minutes > high)])▸ Beklenen çıktı
mean : 16.6 median: 13.5 mode : 13 var : 101.6 std : 10.08 Q1, Q3, IQR: 13.0 14.75 1.75 outliers: [45]
- Q1, Q3birinci ve üçüncü çeyrek (%25 ve %75)
- IQRQ3 − Q1, verinin orta yarısının genişliği
Tukey kuralı: bu aralığın dışındaki değerler aykırı değer sayılır. Burada: 14,75 + 1,5 · 1,75 = 17,375, yani 45 aykırı bir değerdir.
Normal dağılım
Birçok küçük bağımsız etkinin toplamı olan nicelikler (ölçüm hataları, test puanları, boy) çoğu zaman normal dağılıma yakındır: ortalama etrafında simetrik, çan biçimli bir eğri. Onu iki parametre belirler: ortalama μ ve standart sapma σ. Her değer bir z-puanıyla standartlaştırılabilir; bu puan, değerin ortalamadan kaç σ uzakta olduğunu gösterir.
- μdağılımın ortalaması
- σstandart sapma (σ > 0)
- f(x)olasılık yoğunluğu; P(a < X < b), a ile b arasında eğrinin altındaki alandır
- zz-puanı: standart normal dağılımdaki (μ = 0, σ = 1) konum
scipy.stats.norm bir dağılım nesnesi oluşturur: cdf(x) = P(X ≤ x) (birikimli dağılım fonksiyonu), sf(x) = P(X > x) = 1 − cdf, ppf(q) ise tersidir: verilen olasılığa karşılık gelen nicelik. Test puanları μ = 70 ve σ = 10 ile normal dağılıyorsa:
from scipy import stats
scores = stats.norm(loc=70, scale=10)
print(round(scores.cdf(85), 4))
print(round(scores.sf(85), 4))
print(round(scores.cdf(80) - scores.cdf(60), 4))
print(round(scores.ppf(0.90), 2))
z = (85 - 70) / 10
print(z, round(stats.norm.cdf(z), 4))▸ Beklenen çıktı
0.9332 0.0668 0.6827 82.82 1.5 0.9332
Test puanları N(70; 10²) dağılımına uyuyor. a) Rastgele seçilen bir öğrencinin 85'ten fazla alma olasılığı nedir? b) En iyi %10'a girmek için kaç puan gerekir? Φ(1,5) = 0,9332, z₀,₉₀ = 1,2816.
Çözümü gösterÇözümü gizle
P(X > 85) = 1 − Φ(1,5) = 1 − 0,9332 = 0,0668, yani yaklaşık %6,7.
b) x = μ + z₀,₉₀ · σ = 70 + 1,2816 · 10 ≈ 82,8 puan.
İki cevap da kodla (
sf(85) ve ppf(0.90)) örtüşüyor.Örneklemler, merkezi limit teoremi ve standart hata
Genellikle bütün ana kütleyi (tüm siparişleri) değil, yalnızca bir örneklemi görürüz. Her yeni örneklemin ortalaması biraz farklı çıkar. Merkezi limit teoremi şunu söyler: n yeterince büyük olduğunda, asıl dağılım çarpık olsa bile örneklem ortalamalarının dağılımı normale yaklaşır ve standart sapması, yani standart hata, σ/√n'ye eşittir. Aşağıda çarpık bir üstel dağılımdan 30'luk 5000 örneklem alınıyor:
- SEortalamanın standart hatası
- σ, sana kütlenin ve örneklemin standart sapması
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng(1)
population = rng.exponential(scale=10, size=100_000)
means = rng.choice(population, size=(5000, 30)).mean(axis=1)
print(f'population: mean {population.mean():.2f}, std {population.std():.2f}')
print(f'sample means: mean {means.mean():.2f}, std {means.std():.2f}')
print(f'sigma / sqrt(n) = {population.std() / np.sqrt(30):.2f}')
fig, (a, b) = plt.subplots(1, 2, figsize=(8, 3), layout='constrained')
a.hist(population, bins=50)
a.set_title('Population (skewed)')
b.hist(means, bins=40)
b.set_title('Means of samples, n = 30')
plt.show()▸ Beklenen çıktı
population: mean 9.96, std 9.92 sample means: mean 9.94, std 1.81 sigma / sqrt(n) = 1.81
Güven aralığı ve t-testi
σ bilinmediğinde onu s ile değiştiririz ve normal dağılım yerine serbestlik derecesi n − 1 olan Student t-dağılımını kullanırız; küçük örneklemlerde onun “kuyrukları” daha kalındır. Bir fabrika hattından 100 gramlık 10 paket çay tartıldı:
- t*t-dağılımının kritik değeri; %95 için α = 0,05
- n − 1serbestlik derecesi
Ortalama için %95 güven aralığı. stats.t.ppf(0.975, df=n - 1) t* değerini, stats.t.interval ise aralığın tamamını döndürür.
import numpy as np
from scipy import stats
packs = np.array([99.2, 100.4, 98.7, 100.9, 99.5, 100.1, 99.8, 98.9, 100.6, 99.4])
n = packs.size
mean = packs.mean()
s = packs.std(ddof=1)
se = s / np.sqrt(n)
t_crit = stats.t.ppf(0.975, df=n - 1)
print(f'mean = {mean:.2f} g, s = {s:.3f} g, SE = {se:.3f} g')
print(f't* = {t_crit:.3f}')
print(f'95% CI: [{mean - t_crit * se:.2f}; {mean + t_crit * se:.2f}] g')
low, high = stats.t.interval(0.95, df=n - 1, loc=mean, scale=se)
print(round(low, 2), round(high, 2))▸ Beklenen çıktı
mean = 99.75 g, s = 0.738 g, SE = 0.233 g t* = 2.262 95% CI: [99.22; 100.28] g 99.22 100.28
16 öğrencinin sınava hazırlanma süresi: x̄ = 52 saat, s = 8 saat. Ortalama için %95 güven aralığını bul. t₀,₉₇₅(15) = 2,131.
Çözümü gösterÇözümü gizle
Hata payı = t* · SE = 2,131 · 2 = 4,262.
Aralık: 52 ± 4,26 → [47,74; 56,26] saat.
Örneklemi 64 öğrenciye çıkarırsak SE 1'e düşer ve aralık yaklaşık iki kat daralır (√n yasası).
Hipotez testi soruyu şöyle sorar: sıfır hipotezi H₀ (“fark yoktur”) doğru olsaydı, gözlediğimiz kadar ya da daha büyük bir farkın çıkma olasılığı ne olurdu? Bu olasılık p-değeridir. p < α (genellikle 0,05) ise H₀'ı reddederiz. Tek örneklem t-testi bir ortalamayı verilen bir sayıyla, iki örneklem testi ise iki grubun ortalamalarını karşılaştırır; grupların varyansları farklı olabileceği için Welch sürümünü (equal_var=False) seçeriz.
- x̄₁, x̄₂grup ortalamaları
- s₁², s₂²grupların örneklem varyansları
- n₁, n₂grup büyüklükleri
Welch t istatistiği: ortalamaların farkının kendi standart hatasına bölümü. |t| ne kadar büyükse p o kadar küçüktür.
import numpy as np
from scipy import stats
packs = np.array([99.2, 100.4, 98.7, 100.9, 99.5, 100.1, 99.8, 98.9, 100.6, 99.4])
res1 = stats.ttest_1samp(packs, popmean=100)
print(f'one-sample: t = {res1.statistic:.3f}, p = {res1.pvalue:.3f}')
group_a = np.array([72, 85, 78, 90, 66, 81, 77, 88, 74, 83])
group_b = np.array([80, 91, 86, 94, 79, 88, 85, 97, 82, 90])
print(group_a.mean(), group_b.mean())
res2 = stats.ttest_ind(group_b, group_a, equal_var=False)
print(f'Welch: t = {res2.statistic:.3f}, p = {res2.pvalue:.4f}')▸ Beklenen çıktı
one-sample: t = -1.071, p = 0.312 79.4 87.2 Welch: t = 2.581, p = 0.0194
Korelasyon
Pearson korelasyon katsayısı r, iki değişken arasındaki doğrusal ilişkinin gücünü ve yönünü −1 ile 1 arasında ölçer; r² ise y'deki değişimin ne kadarının x ile doğrusal olarak açıklandığını gösterir. Spearman katsayısı ρ aynı hesabı sıralar (ranklar) üzerinde yapar; bu yüzden aykırı değerlere dayanıklıdır ve her tür monoton ilişkiyi yakalar.
- r−1 ≤ r ≤ 1; işaret yönü, |r| gücü gösterir
- x̄, ȳher değişkenin ortalaması
import numpy as np
from scipy import stats
hours = np.array([1, 2, 2, 3, 4, 5, 5, 6, 7, 8])
score = np.array([52, 55, 61, 60, 68, 70, 75, 74, 82, 88])
r, p = stats.pearsonr(hours, score)
rho, _ = stats.spearmanr(hours, score)
print(f'Pearson r = {r:.3f}, p = {p:.1e}')
print(f'Spearman rho = {rho:.3f}')
print(f'r squared = {r ** 2:.3f}')
print(np.corrcoef(hours, score).round(3))▸ Beklenen çıktı
Pearson r = 0.980, p = 6.5e-07 Spearman rho = 0.957 r squared = 0.961 [[1. 0.98] [0.98 1. ]]
np.corrcoef korelasyon matrisini döndürür.x = (1, 2, 3, 4, 5), y = (2, 4, 5, 4, 5). Pearson korelasyon katsayısını bul.
Çözümü gösterÇözümü gizle
xᵢ − x̄: −2, −1, 0, 1, 2; yᵢ − ȳ: −2, 0, 1, 0, 1.
Çarpımların toplamı: 4 + 0 + 0 + 0 + 2 = 6.
∑ (xᵢ − x̄)² = 10, ∑ (yᵢ − ȳ)² = 4 + 0 + 1 + 0 + 1 = 6.
r = 6 / √(10 · 6) = 6 / √60 ≈ 0,775; r² ≈ 0,6.
Kontrol:
np.corrcoef(x, y)[0, 1] → 0,7746.data dizisi için ilk satırda ortalamayı (1 ondalık basamak), medyanı ve örneklem standart sapmasını (ddof=1, 2 ondalık basamak) boşlukla ayırarak yazdır. İkinci satırda Tukey'nin 1,5 · IQR kuralına göre aykırı değerlerin listesini yazdır.
import numpy as np
data = np.array([48, 52, 50, 47, 53, 51, 49, 95, 50, 52])
# line 1: mean (1 decimal), median, sample std (2 decimals)
# line 2: outliers as a list▸ Beklenen çıktı
54.7 50.5 14.28 [95]
Bir laboratuvarda 8 ölçüm yapıldı. İlk satırda örneklem ortalamasını, ikinci satırda ortalama için %95 güven aralığının alt ve üst sınırlarını (boşlukla ayırarak) yazdır; hepsini 2 ondalık basamağa yuvarla. t* değerini stats.t.ppf ile bul.
import numpy as np
from scipy import stats
sample = np.array([23.1, 24.5, 22.8, 25.0, 23.9, 24.2, 23.5, 24.8])
# mean, then the 95% confidence interval▸ Beklenen çıktı
23.98 23.31 24.64
Önemli noktalar
- Örneklem varyansı n − 1'e bölünür (
ddof=1); çarpık veriler için medyan ve IQR daha güvenilirdir. - Tukey kuralı: [Q1 − 1,5 · IQR; Q3 + 1,5 · IQR] dışındaki değerler aykırıdır.
- z = (x − μ) / σ;
norm.cdf,norm.sf,norm.ppfolasılık ve nicelikleri verir; 68–95–99,7 kuralı. - Standart hata SE = s / √n; ortalama için aralık x̄ ± t* · SE.
- p < α olduğunda H₀ reddedilir ama p ne H₀'ın olasılığıdır ne de etkinin büyüklüğü.
- Pearson r doğrusal ilişkiyi ölçer, Spearman ρ sıralarla çalışır; korelasyon nedenselliği kanıtlamaz.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.