Chebyshev, Extreme Value Theory ve Peak Over Threshold: Uç Olayların İstatistiği
Normal varsayımı geçmediğinde: Chebyshev eşitsizliği ile dağılım-agnostik sınır; Extreme Value Theory (block maxima, GEV); Peak Over Threshold (POT) ile Generalized Pareto Distribution — banking ve telekomda baş aktör.
Şükrü Yusuf KAYA
30 dakikalık okuma
Orta📈 Uçtan değer var
Z-score, Grubbs, IQR — hepsi 'çoğunluk normal' varsayımıyla gelir. Ama bazı sektörlerde — banking risk, network attack, ülke çapı doğa olayları — anomaliler doğanın bir parçası. Bunlar nadir ama beklenen. Bu derste uç değer teorisini öğreneceğiz: nadir olayları sistematik modellemek. Banking VaR (Value at Risk), telco DDoS modellemesi, finansal regülasyon hep bu temele dayanır.
Chebyshev Eşitsizliği: Dağılım Bağımsız Garanti#
Z-score, normal dağılım varsayar — '%99.7 veri 3σ içinde' kuralı normal'de
geçerli. Peki dağılım normal değilse?
Pafnuty Chebyshev (1867) kanıtladı: herhangi bir dağılım için (varyansı
tanımlı olmak şartıyla):
Pratik Tablo#
| k | P(|X-μ| ≥ kσ) üst sınırı (Chebyshev) | Normal'de gerçek |
|---|---|---|
| 1 | %100 | %32 |
| 2 | %25 | %4.6 |
| 3 | %11.1 | %0.3 |
| 4 | %6.25 | %0.006 |
| 5 | %4 | %0.00006 |
Sezgi: Chebyshev her zaman doğru ama çoğunlukla gevşek. Bir uç gözlemin "imkansız" olduğunu söyleyemez, sadece "şu sınırın altında bir olasılığa sahiptir" der.
Pratik Kullanım#
Chebyshev outlier tespiti için doğrudan eşik vermez ama:
- Worst-case outlier oranı tahmini için kullanılır
- Dağılım bilinmiyorsa "minimum güvence"
- Quality control'de "k=3 ile %11'den fazla outlier olmaz, biz %1 görüyoruz, demek ki sıkıntı yok" şeklinde
Modern AD'de Chebyshev nadiren tek başına kullanılır; daha çok bir referans
sınır olarak gösterilir.
Extreme Value Theory: Asıl Güçlü Araç#
Bazı dağılımlar heavy tail taşır: uç kuyruğa daha çok ağırlık veren
dağılımlar. Bunlar çok yaygın:
- Finansal getiriler: Aşağı/yukarı uç hareketler beklenenden sık
- Web request latency: %99.9 latency'i p50'nin 10-100 katı olabilir
- Network traffic: DDoS yükleri ortalama trafiğin 100x'i
- Sigorta tazminatları: Çoğu küçük, ama nadir büyük claim'ler bütçeyi yer
- Doğa olayları: Deprem, sel, fırtına şiddetleri
EVT'nin Temel Teoremi (Fisher-Tippett-Gnedenko)#
Bağımsız ve aynı dağılımlı (IID) bir veri kümesinden block maxima'ları
(her blok'un maksimumu) al. Bunların asimptotik dağılımı Generalized Extreme
Value (GEV) dağılımı:
Burada:
- μ — konum parametresi
- σ — ölçek parametresi
- ξ (ksi) — şekil parametresi
- ξ > 0: Fréchet (heavy tail, polynomial decay)
- ξ = 0: Gumbel (light tail, exponential decay)
- ξ < 0: Weibull (bounded tail)
Block Maxima Yöntemi#
1. Veriyi N bloğa böl (örn. 365 günlük veriyi 12 aylık bloğa) 2. Her bloğun maksimumunu al → 12 maksimum 3. GEV dağılımını bu maksimumlara fit et 4. Yeni bir maksimum geldiğinde, GEV'in kuyruğunda olup olmadığını test et
Sorun: Block maxima yöntemi blok başına sadece 1 değer kullanır.
Veriyi israf eder. Bu yüzden alternatifi var: POT.
Peak Over Threshold (POT): EVT'nin Modern Versiyonu#
POT 1975'te Pickands tarafından önerildi. Block maxima yerine bir eşiğin
üstündeki tüm gözlemleri kullanır.
Pickands-Balkema-de Haan Teoremi#
IID veride yeterince yüksek u eşiği seçilirse, u'yu aşan miktarlar (excess)
yaklaşık olarak Generalized Pareto Distribution (GPD) ile modellenebilir:
Burada y = x - u (eşiği aşan miktar). Iki parametre var:
- σ — ölçek (scale)
- ξ — şekil (shape), GEV'deki ξ ile aynı
POT Pipeline#
- Eşik u seç. Genelde verinin %95-99'luk dilimi. Mean Excess Plot ile görsel olarak seçilir.
- u'yu aşan gözlemleri çek. Bunlar "excess" veri kümesi.
- GPD'yi fit et. Maximum likelihood ile σ ve ξ tahmin et.
- Anomaly threshold belirle. Verilen risk seviyesi p için VaR:
Burada n = toplam veri, N_u = u'yu aşan gözlem sayısı. Bu formül "p güven seviyesinde en kötü durum" verir.
Eşik Seçimi: Mean Excess Plot#
uGPD'nin teorisi der ki: eğer u yeterince yüksekse, e(u) u'nun lineer fonksiyonudur. Yani mean excess plot'unu çizdiğinde lineerleştiği noktadan u'yu seç.
python
import numpy as npimport matplotlib.pyplot as pltfrom scipy.stats import genpareto, kstest def mean_excess_plot(x, thresholds=None): """ Mean excess plot — eşik seçimi için. """ x = np.asarray(x) if thresholds is None: thresholds = np.linspace(np.percentile(x, 70), np.percentile(x, 99), 50) means = [] for u in thresholds: excess = x[x > u] - u if len(excess) < 5: means.append(np.nan) else: means.append(excess.mean()) return thresholds, np.array(means) def fit_pot(x, threshold): """ Generalized Pareto Distribution fit (above threshold). """ excess = x[x > threshold] - threshold if len(excess) < 10: raise ValueError("Çok az excess gözlem") # scipy.stats.genpareto: (c, loc, scale) — c = ξ shape, loc, scale = genpareto.fit(excess, floc=0) return {'shape': shape, 'scale': scale, 'n_excess': len(excess)} def pot_var(x, threshold, p=0.999, gpd_params=None): """ POT ile VaR hesaplaması. p = güvence seviyesi (örn. 0.999 = %99.9) """ if gpd_params is None: gpd_params = fit_pot(x, threshold) n = len(x) Nu = gpd_params['n_excess'] xi = gpd_params['shape'] sigma = gpd_params['scale'] if abs(xi) < 1e-6: var = threshold - sigma * np.log((n / Nu) * (1 - p)) else: var = threshold + (sigma / xi) * (((n / Nu) * (1 - p)) ** (-xi) - 1) return var # Örnek: heavy-tail simülasyonnp.random.seed(42)normal_part = np.random.normal(50, 5, 9000)heavy_tail = np.random.pareto(a=2.5, size=1000) * 20 + 50 # heavy taildata = np.concatenate([normal_part, heavy_tail]) # Mean excess plotths, mes = mean_excess_plot(data, thresholds=np.linspace(60, 120, 50))plt.plot(ths, mes, 'o-')plt.xlabel('Threshold u')plt.ylabel('Mean Excess')plt.title('Mean Excess Plot')plt.grid()plt.savefig('reports/mean_excess.png', dpi=120) # u=80'i seç (görsele bakarak)u = 80gpd = fit_pot(data, threshold=u)print(f"GPD fit: shape={gpd['shape']:.3f}, scale={gpd['scale']:.3f}, N_u={gpd['n_excess']}") # 99.9% VaRvar_999 = pot_var(data, threshold=u, p=0.999)print(f"VaR (99.9%): {var_999:.2f}")# Bu eşiği aşan gözlemler 'anomali' kabul edilir.POT — GPD fit + VaR hesaplaması
POT Hangi Sektörde Tepe?#
POT modern AD'nin en çok kullanılan uç olay modelleme aracıdır:
Banking — VaR ve Stress Testing#
BDDK ve Basel III çerçevesinde Türk bankaları Value at Risk (VaR) raporlar.
99% veya 99.5% güvende günlük kayıp tahmini. POT bunu doğrudan üretir.
Network — DDoS Tespiti#
Streaming traffic'te POT online uygulanır (örn. Siffer algoritması, Streaming
Peak Over Threshold). Saniyede bant genişliği POT eşiğinin üstüne çıkarsa DDoS
alarm.
Time Series AD — SPOT/DSPOT#
Anomaly Transformer ve PyOD'da kullanılan dynamic POT — eşiği streaming'de
otomatik günceller. Modül 15-16'da (TS AD) bunu detaylı işleyeceğiz.
Sigorta — Reinsurance Pricing#
Tek tek küçük claim'ler bilinen dağılımda; ama nadir milyonluk claim'lerin
beklenen frekansı POT ile modellenir. Reasürans primleri buna göre belirlenir.
Online AD: SPOT / DSPOT (Siffer & Fouque, 2017)#
Streaming için POT'un online versiyonu. Eşiği gerçek zamanlı günceller, yeni
veride ξ ve σ'yı kademeli olarak yeniden tahmin eder.
python
# SPOT pseudo-code (Siffer et al., 2017)class SPOT: """ Streaming Peak Over Threshold — online anomaly detection. """ def __init__(self, q=0.001, n_init=1000): self.q = q # anomaly olasılığı (örn. 0.001) self.n_init = n_init # warm-up veri sayısı self.threshold = None # mevcut eşik (zT) self.peaks = [] # eşiği aşan excess'ler self.t = None # GPD eşiği (u) def initialize(self, x_init): """Warm-up: ilk n_init veriyle GPD'yi fit et.""" self.t = np.percentile(x_init, 98) excess = x_init[x_init > self.t] - self.t self.shape, _, self.scale = genpareto.fit(excess, floc=0) self.peaks = list(excess) # Anomaly threshold n = len(x_init) Nt = len(excess) self.threshold = self._compute_threshold(n, Nt) def _compute_threshold(self, n, Nt): xi, sigma = self.shape, self.scale if abs(xi) < 1e-6: return self.t - sigma * np.log((n / Nt) * self.q) return self.t + (sigma / xi) * (((n / Nt) * self.q) ** (-xi) - 1) def update(self, x_new): """Bir yeni gözlem geldiğinde güncelle.""" is_anomaly = x_new > self.threshold if x_new > self.t and not is_anomaly: # Eşik üstü ama anomaly değil — GPD'yi güncelle self.peaks.append(x_new - self.t) self.shape, _, self.scale = genpareto.fit(self.peaks, floc=0) n = len(self.peaks) * 50 # estimated n self.threshold = self._compute_threshold(n, len(self.peaks)) return is_anomaly # Kullanım (kavramsal — production'da daha karmaşık)spot = SPOT(q=0.001, n_init=1000)spot.initialize(data[:1000]) for x in data[1000:]: if spot.update(x): print(f"Anomaly: {x}")SPOT — streaming POT (kavramsal implementasyon)
POT Tuzakları#
POT güçlü ama dikkatsiz uygulanırsa yanıltıcı.
Tuzak 1: Eşik Çok Düşük#
u çok düşükse, GPD'nin asimptotik teorisi bozulur. Excess'ler GPD'ye uymaz, hipotez yanlış.
Çözüm: mean excess plot kullan; eşiği lineer bölgenin başına koy.
Tuzak 2: Eşik Çok Yüksek#
u çok yüksekse, excess sayısı (Nu) çok az olur, GPD parametre tahminleri sallantılı.
Çözüm: Nu ≥ 30 hedefle.
Tuzak 3: IID Varsayımı#
EVT/POT veri bağımsız varsayar. Zaman serisinde ardışık değerler bağımlı (autocorrelation).
Çözüm: Önce de-cluster veya declustering (Davison-Smith), sonra POT.
Tuzak 4: Şekil Parametresi ξ Yorumu#
ξ pozitifse heavy-tail (Fréchet) → maksimum sınırı yok. ξ negatifse bounded → sınır var.
Production'da: ξ tahmini varyansı yüksek; en az 100 excess gözlem önerilir.
Tuzak 5: Concept Drift#
EVT statik dağılım varsayar. Üretim verisinde dağılım zamanla değişir. POT'u rolling window'da yeniden fit etmek şart. SPOT/DSPOT bunu çözer.
🇹🇷 Türkiye Bankacılığında EVT/POT
BDDK 2016 Genelgesi ve Basel III çerçevesinde, kredi ve piyasa riski VaR hesaplamalarında 'historical simulation' ve 'POT' arasında seçim hakkı tanınır. Türk bankalarının çoğu önce historical sim ile başladı, son 5 yılda POT'a kaydı — özellikle stress test ve reverse stress test için. Ekibe katıldığında ilk hafta soracaklar: 'POT-based VaR'a aşinalığın var mı?' Bu kursta evet diyebileceksin.
Z-Score vs POT: Hangisi Ne Zaman?#
| Kriter | Z-Score / Grubbs | POT |
|---|---|---|
| Dağılım varsayımı | Normal | Sadece kuyrukta (asymptotic GPD) |
| Heavy tail | Zayıf | Güçlü |
| Eşik | Sabit (3σ) | Adaptif (verinin %95-99'u) |
| Yorumlanabilirlik | Çok yüksek | Yüksek |
| Compliance | Banking için "klasik" | Banking için "modern" |
| Streaming | Rolling z ile | SPOT/DSPOT |
| Türkiye banking | Hâlâ baskın | Hızla yayılıyor |
Pratik kural: Veride 5-sigma'dan fazla gözlemler sık geliyorsa (sigma'ya rağmen), dağılım heavy-tail. Bu durumda POT şart, z-score yetersiz.
👉 Bir sonraki ders
Ders 2.5 — Robust İstatistikler. Huber, M-estimator, Tukey biweight, MCD (Minimum Covariance Determinant). 'Neden ortalama yerine medyan' sorusunu derinlemesine cevaplayacağız. Production'da AD modellerinin altında yatan tüm 'robust' kelimesi buradan geliyor.
Sık Sorulan Sorular
EVT genel teori; POT EVT'nin pratik uygulamalarından biri. EVT iki ana yaklaşım sunar: (1) Block Maxima → GEV dağılımı, (2) Peak Over Threshold → GPD dağılımı. POT modern uygulamalarda baskın çünkü block maxima veri israf ediyor.
Yorumlar & Soru-Cevap
(0)Yorum yazmak için giriş yap.
Yorumlar yükleniyor...
İlgili İçerikler
Modül 0: Kurs Çerçevesi ve Atölye Kurulumu
Anomaly Detection Engineer Kimdir? Fraud, SRE, Quality Engineer ile Farklar ve Türkiye Maaş Manzarası
Öğrenmeye BaşlaModül 0: Kurs Çerçevesi ve Atölye Kurulumu
Kurs Felsefesi: Neden Bu Yol, Neden Bu Sıra — Anomaly Detection Öğrenme Nehri
Öğrenmeye BaşlaModül 0: Kurs Çerçevesi ve Atölye Kurulumu