İçeriğe geç
Educora
Üniversite25 dk34 / 42

Python ile istatistik

Betimleyici istatistik, aykırı değerler, normal dağılım ve `scipy.stats`, merkezi limit teoremi, güven aralığı, t-testi ve korelasyon; formüller, çözümlü örnekler ve çalışan kodla.

Kendini test et
Bu derste öğreneceklerin
  • Ortalama, medyan, standart sapma ve IQR hesaplamak, aykırı değerleri bulmak
  • Normal dağılımda olasılıkları ve nicelikleri scipy.stats.norm ile 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.

x̄ = (1/n) · ∑ xᵢ s² = ∑ (xᵢ − x̄)² / (n − 1) s = √s²x̄ = (1/n) · ∑ xᵢ s² = ∑ (xᵢ − x̄)² / (n − 1) s = √s²
burada:
  • nörneklem büyüklüğü
  • s²örneklem varyansı (birimi verinin biriminin karesi)
  • sörneklem standart sapması (veriyle aynı birimde); NumPy'da std(ddof=1)
Python
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]
Tek bir 45 dakikalık sipariş ortalamayı 16,6 dakikaya, standart sapmayı 10 dakikaya çıkarıyor; medyan ise 13,5 dakikada kalıyor. Bu sipariş olmasaydı ortalama 13,44 dakika olurdu.
[Q1 − 1,5 · IQR; Q3 + 1,5 · IQR]
burada:
  • 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.

f(x) = 1 / (σ · √(2π)) · e^(−(x − μ)² / (2σ²)) z = (x − μ) / σf(x) = 1 / (σ · √(2π)) · e^(−(x − μ)² / (2σ²)) z = (x − μ) / σ
burada:
  • μ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:

Python
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
Örnek 1: z-puanı ve olasılık

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
a) z = (85 − 70) / 10 = 1,5.
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:

SE = σ / √n ≈ s / √nSE = σ / √n ≈ s / √n
burada:
  • SEortalamanın standart hatası
  • σ, sana kütlenin ve örneklemin standart sapması
Python
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
Sağdaki histogram neredeyse simetrik bir çandır; yayılımı (1,81) da tam olarak σ/√30 kadardır.

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ı:

x̄ ± t* · s / √n, t* = t₁₋α/₂(n − 1)x̄ ± t* · s / √n, t* = t₁₋α/₂(n − 1)
burada:
  • 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.

Python
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
Örnek 2: elle güven aralığı

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
SE = s / √n = 8 / √16 = 8 / 4 = 2 saat.
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.

t = (x̄₁ − x̄₂) / √(s₁²/n₁ + s₂²/n₂)t = (x̄₁ − x̄₂) / √(s₁²/n₁ + s₂²/n₂)
burada:
  • 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.

Python
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
Paketler: p = 0,312 > 0,05; ortalama ağırlığın 100 g'dan farklı olduğuna dair kanıt yok. Gruplar (A — eski, B — yeni öğretim yöntemi): p ≈ 0,019 < 0,05; fark istatistiksel olarak anlamlı.

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 = ∑ (xᵢ − x̄)(yᵢ − ȳ) / √( ∑ (xᵢ − x̄)² · ∑ (yᵢ − ȳ)² )r = ∑ (xᵢ − x̄)(yᵢ − ȳ) / √( ∑ (xᵢ − x̄)² · ∑ (yᵢ − ȳ)² )
burada:
  • r−1 ≤ r ≤ 1; işaret yönü, |r| gücü gösterir
  • x̄, ȳher değişkenin ortalaması
Python
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.  ]]
Çalışma saatleri ile puan arasında çok güçlü pozitif bir ilişki var: puanlardaki değişimin %96'sı saatlerle doğrusal olarak açıklanıyor. np.corrcoef korelasyon matrisini döndürür.
Örnek 3: r'yi elle hesaplayalım

x = (1, 2, 3, 4, 5), y = (2, 4, 5, 4, 5). Pearson korelasyon katsayısını bul.

Çözümü göster
x̄ = 3, ȳ = 4.
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.
Alıştırma

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.

Alıştırma · Python
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]
Alıştırma

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.

Alıştırma · Python
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.ppf olası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.

1 / 10
Maaşlar: 800, 900, 950, 1000, 12 000 manat. “Tipik” maaşı hangi ölçü daha iyi anlatır?