0Pricing
Pandas & NumPy Academy · Ders

Betimsel İstatistikler ve Normallik Testi

Çarpıklığı ve basıklığı scipy.stats ile hesaplayın, normallik için Shapiro-Wilk testi uygulayın ve p değerini yorumlayın.

Betimsel İstatistikler ve Normallik Testi, CoddyKit'te ücretsiz bir Pandas & NumPy Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Pandas & NumPy Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Pandas & NumPy Academy kursu toplamda 4 dersten oluşur.

Betimsel ve Çıkarımsal İstatistikler

Betimsel istatistikler verilerinizde neler olduğunu özetler: mean, medyan, standart sapma, çarpıklık. Çıkarımsal istatistikler bir örnekleme dayanarak bir kitle hakkında çıkarım yapar: hipotez testleri, güven aralıkları, p-değerleri. SciPy'nin scipy.stats modülü bu iki alanı birleştirir — Pandas'ın describe() işlevinin sunduklarının ötesine geçen betimsel ölçümler ile klasik hipotez testlerinin eksiksiz bir kümesini sağlar. Veri işleme için Pandas'ı, istatistiksel testler için SciPy'yi birleştirmek, standart Python veri bilimi iş akışıdır.

Genişletilmiş Betimsel İstatistikler

Pandas'ın describe() işlevi count, mean, std, min/max ve çeyrekleri verir. scipy.stats ise çarpıklığı (dağılımın simetrik olmaması) ve kurtosis'i (kuyrukların ağırlığı) ekler. Çarpıklığın 0 olması simetrik dağılım anlamına gelir; pozitif çarpıklık, sağ kuyruğun daha uzun olduğunu gösterir (çok sayıda küçük değer, az sayıda çok büyük değer). kurtosis değerinin 3 olması (veya fazlalık biçiminde 0 olması) normal kabul edilir; daha yüksek değerler, normal bir dağılımın üreteceğinden daha uç aykırı değerlerin bulunduğu daha ağır kuyruklara işaret eder.

import pandas as pd
from scipy import stats
import numpy as np

np.random.seed(0)
data = np.concatenate([
    np.random.exponential(scale=2, size=500),  # right-skewed
    np.random.normal(loc=5, scale=1, size=500)
])

print('Mean:', round(data.mean(), 3))
print('Std:', round(data.std(), 3))
print('Skewness:', round(stats.skew(data), 3))
print('Kurtosis (excess):', round(stats.kurtosis(data), 3))

Çarpıklığı Anlamak

Çarpıklık, istatistiksel testleri ve dönüşümleri seçerken önemlidir. Sağa çarpık (pozitif çarpıklık) bir dağılımda mean medyandan büyüktür; bu durum gelir verileri, tepki süreleri ve satış tutarlarında tipiktir. Sola çarpık (negatif çarpıklık) bir dağılımda mean medyandan küçüktür. Genel kural: |çarpıklık| < 0.5 yaklaşık olarak simetriktir; 0.5–1.0 orta düzeyde çarpıktır; > 1.0 ise oldukça çarpıktır ve normalliği varsayan testler uygulanmadan önce log veya karekök dönüşümünden yararlanabilir.

import numpy as np
from scipy import stats

# Right-skewed: income-like data
right_skewed = np.random.lognormal(mean=1, sigma=1, size=1000)
print('Right skew:', round(stats.skew(right_skewed), 3))

# After log transform
print('After log transform:', round(stats.skew(np.log(right_skewed)), 3))

# Symmetric normal
normal_data = np.random.normal(0, 1, 1000)
print('Normal skew:', round(stats.skew(normal_data), 3))

Normallik Testi Neden Önemlidir

Birçok istatistiksel test — t-testleri, ANOVA, Pearson korelasyonu — verilerin (veya artıkların) normal (Gauss) dağılımını izlediğini varsayar. Küçük örneklemlerde bu varsayım ihlal edilirse testin p-değerleri hatalı olabilir. Normallik testi, bu varsayımın geçerli olup olmadığını kontrol eder. Büyük örneklemlerde (n > 100) normallik testleri çok duyarlı hâle gelir ve önemsiz sapmalar için bile neredeyse her zaman normalliği reddeder — bu durumda ham verileri test etmek yerine Merkezi Limit Teoremi'ne güvenin (örneklem mean değerleri yaklaşık olarak normaldir).

Shapiro-Wilk Testi

Shapiro-Wilk testi (scipy.stats.shapiro(data)), yaklaşık 5.000'e kadar örneklem büyüklükleri için en güçlü normallik testidir. Bir W-istatistiği ve p-değeri döndürür. p > 0.05 ise normalliği reddetmek için yeterli kanıt yoktur; veriler normal bir dağılımla tutarlıdır. p ≤ 0.05 ise normalliği reddedersiniz. Unutmayın: normalliği reddetmek için yeterli kanıt bulunmaması, verilerin normal olduğunu kanıtlamaz; yalnızca normal olmadığını söylemek için yeterli kanıtınız olmadığı anlamına gelir.

import numpy as np
from scipy import stats

np.random.seed(42)

# Normal data
normal = np.random.normal(0, 1, 100)
stat, p = stats.shapiro(normal)
print(f'Normal data: W={stat:.4f}, p={p:.4f}')
print('Conclusion:', 'Looks normal' if p > 0.05 else 'Not normal')

# Skewed data
skewed = np.random.exponential(1, 100)
stat2, p2 = stats.shapiro(skewed)
print(f'Skewed data: W={stat2:.4f}, p={p2:.4f}')
print('Conclusion:', 'Looks normal' if p2 > 0.05 else 'Not normal')

Kolmogorov-Smirnov Testi

Kolmogorov-Smirnov (K-S) testi (scipy.stats.kstest(data, 'norm', args)), bir örneklemin belirtilen bir dağılımı izleyip izlemediğini test eder. Shapiro-Wilk testinin aksine her dağılımla (yalnızca normal dağılımla değil) ve büyük örneklemlerle çalışır. Verilerinizin ampirik CDF'si ile teorik CDF arasındaki en büyük farkı hesaplar. Bunun bir çeşidi olan iki örneklemli K-S testi (stats.ks_2samp(a, b)), iki örneklemin aynı dağılımdan gelip gelmediğini test eder — önceki ve sonraki dağılımları karşılaştırmak için kullanışlıdır.

import numpy as np
from scipy import stats

np.random.seed(0)
data = np.random.normal(loc=5, scale=2, size=200)

# One-sample K-S test against N(5, 2) distribution
stat, p = stats.kstest(data, 'norm', args=(5, 2))
print(f'K-S test: stat={stat:.4f}, p={p:.4f}')
print('Follows N(5,2)?', 'Yes' if p > 0.05 else 'No')

# Two-sample K-S test
data2 = np.random.normal(loc=5.5, scale=2, size=200)
stat2, p2 = stats.ks_2samp(data, data2)
print(f'Two-sample K-S: stat={stat2:.4f}, p={p2:.4f}')

Görsel Normallik Kontrolü: QQ Grafiği

Q-Q (kantil-kantil) grafiği, görsel bir normallik kontrolüdür: verilerinizin kantillerini normal dağılımın kantilleriyle karşılaştırarak çizer. Veriler normalse noktalar düz bir köşegen üzerinde yer alır. Doğrudan sapmalar normallikten uzaklaşmaya işaret eder — S eğrileri kurtosis'i, kıvrımlar ise çarpıklığı gösterir. İstatistiksel testler sapmaların anlamlı olup olmadığını söyler; Q-Q grafikleri sapmaların niteliğini ve konumunu gösterir. Q-Q grafiği verilerini oluşturmak için scipy.stats.probplot() kullanın.

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

np.random.seed(1)
data = np.random.exponential(2, 200)

# Q-Q plot
(osm, osr), (slope, intercept, r) = stats.probplot(data, dist='norm')
print(f'R-squared of Q-Q fit: {r**2:.4f}')  # Close to 1 = normal
# Visual inspection: if plotting, points on the line = normal
# plt.figure()
# stats.probplot(data, dist='norm', plot=plt)
# plt.show()

Merkezi Limit Teoremi Uygulamada

Merkezi Limit Teoremi (CLT), temel dağılım ne olursa olsun, örneklem büyüklüğü arttıkça örneklem mean değerlerinin dağılımının normale yaklaştığını belirtir. n ≥ 30 için, tek tek gözlemler çarpık olsa bile örneklem mean değeri yaklaşık olarak normaldir. Bu nedenle t-testleri büyük örneklemlerde dayanıklıdır: mean değerinin farklı olup olmadığını test edersiniz ve ham veriler normal olmasa bile mean yaklaşık olarak normaldir. Normal olmayan kitlelerden alınan küçük örneklemler için parametrik olmayan testleri kullanın.

import numpy as np
from scipy import stats

np.random.seed(0)
# Population: heavily right-skewed (exponential)
population = np.random.exponential(scale=1, size=10000)
print('Population skewness:', round(stats.skew(population), 3))

# Sample means are approximately normal (CLT)
sample_means = [np.random.choice(population, 50).mean()
                for _ in range(1000)]
print('Sample means skewness:', round(stats.skew(sample_means), 3))
_, p = stats.shapiro(sample_means)
print('Shapiro p-value for means:', round(p, 4))

Gruplara Göre Normallik

Grup karşılaştırma testlerinde (t-testi, ANOVA) normallik, genel verilerde değil, her bir grubun içinde gereklidir. Satışların bölgelere göre farklı olup olmadığını test ederken satışların normalliğini her bölge içinde ayrı ayrı test edin. Genel olarak normal olmayan bir dağılım, alt gruplar içinde normallik koşulunu yine de sağlayabilir. Varsayımı sistematik olarak kontrol etmek için Pandas groupby() ile her gruba stats.shapiro() uygulayın ve gruplar üzerinde yineleyin.

import pandas as pd
import numpy as np
from scipy import stats

np.random.seed(0)
df = pd.DataFrame({
    'region': ['N']*50 + ['S']*50 + ['E']*50,
    'sales': np.concatenate([
        np.random.normal(100, 20, 50),
        np.random.normal(110, 25, 50),
        np.random.normal(95, 15, 50)
    ])
})

for region, group in df.groupby('region'):
    stat, p = stats.shapiro(group['sales'])
    print(f'Region {region}: W={stat:.4f}, p={p:.4f} -> '
          f'{"Normal" if p>0.05 else "Not normal"}')

Parametrik Olmayan Alternatifler

Normallik ihlal edildiğinde, dağılım hakkında hiçbir varsayımda bulunmayan parametrik olmayan testleri kullanın. Mann-Whitney U testi (stats.mannwhitneyu) bağımsız t-testinin; Wilcoxon işaretli sıralar testi (stats.wilcoxon) eşleştirilmiş t-testinin; Kruskal-Wallis testi (stats.kruskal) ise tek yönlü ANOVA'nın yerini alır. Bu testler ham değerler yerine sıraları kullanır ve aykırı değerlere karşı dayanıklıdır; ancak normallik gerçekten sağlandığında parametrik karşılıklarına göre istatistiksel güçleri daha düşüktür.

import numpy as np
from scipy import stats

np.random.seed(0)
# Non-normal data
group_a = np.random.exponential(2, 40)
group_b = np.random.exponential(2.5, 40)

# Parametric would be wrong here; use non-parametric
stat, p = stats.mannwhitneyu(group_a, group_b, alternative='two-sided')
print(f'Mann-Whitney U test: U={stat:.1f}, p={p:.4f}')
print('Groups differ?' , 'Yes' if p < 0.05 else 'No')

Birden Çok Sütun İçin İstatistikleri Özetleme

EDA sırasında çoğu zaman tüm sayısal sütunların normalliğini ve çarpıklığını aynı anda kontrol etmeniz gerekir. Pandas'ın select_dtypes işlevini, sütunlar üzerinde döngü kurarak stats.shapiro() ve stats.skew() çağrılarıyla birleştirin. Çarpıklık, kurtosis ve Shapiro p-değeri sütunlarını içeren bir özet DataFrame'i oluşturun; böylece hangi sütunların normal olmadığını ve modelleme öncesinde dönüşüm gerektirdiğini genel olarak görebilirsiniz. Bu, sistematik bir veri kalitesi kontrol listesinin parçasıdır.

import pandas as pd
import numpy as np
from scipy import stats

np.random.seed(0)
df = pd.DataFrame({
    'age': np.random.normal(35, 10, 200),
    'income': np.random.lognormal(10, 1, 200),
    'score': np.random.uniform(0, 100, 200)
})

rows = []
for col in df.select_dtypes(include='number').columns:
    s = stats.skew(df[col])
    _, p = stats.shapiro(df[col][:200])
    rows.append({'column': col, 'skewness': round(s, 3),
                 'shapiro_p': round(p, 4), 'normal': p > 0.05})

print(pd.DataFrame(rows).to_string(index=False))

Kısa Kontrol

Bu dersteki Veri Analizi kavramlarını anlayıp anlamadığınızı test edin.

Ders Özeti

Bu derste şunları öğrendiniz: scipy.stats.skew() ve kurtosis(), bir dağılımın şeklini describe() işlevinin sunduklarının ötesinde açıklar; scipy.stats.shapiro(), p > 0.05 değerinin normalliğe karşı kanıt bulunmadığı anlamına geldiği normallik testini gerçekleştirir; Merkezi Limit Teoremi ise normal olmayan verilerde bile büyük örneklemler için t-testlerini dayanıklı hâle getirir. Sırada grupların mean değerlerini karşılaştırmak için hipotez testlerini t-testleriyle uygulayacağız.

Sıkça Sorulan Sorular

“Betimsel İstatistikler ve Normallik Testi” dersi ücretsiz mi?

Evet — “Betimsel İstatistikler ve Normallik Testi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Pandas & NumPy Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Pandas & NumPy Academy kursu toplamda 4 dersten oluşur.

“Betimsel İstatistikler ve Normallik Testi” dersinde ne öğreneceğim?

Çarpıklığı ve basıklığı scipy.stats ile hesaplayın, normallik için Shapiro-Wilk testi uygulayın ve p değerini yorumlayın. Pandas & NumPy Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Pandas & NumPy Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Pandas & NumPy Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Betimsel İstatistikler ve Normallik Testi” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Pandas & NumPy Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Pandas & NumPy Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Betimsel İstatistikler ve Normallik Testi
  2. Ortalamaları Karşılaştırmak için t Testleri
  3. Bağımsızlık için Ki-Kare Testi
  4. ANOVA ve Sonraki Testler
← Pandas & NumPy Academy Sayfasına Dön