İçeriğe geç

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
Chebyshev, Extreme Value Theory ve Peak Over Threshold: Uç Olayların İstatistiği
📈 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#

  1. Eşik u seç. Genelde verinin %95-99'luk dilimi. Mean Excess Plot ile görsel olarak seçilir.
  2. u'yu aşan gözlemleri çek. Bunlar "excess" veri kümesi.
  3. GPD'yi fit et. Maximum likelihood ile σ ve ξ tahmin et.
  4. 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#

u
'nun "doğru" değeri ne? Mean excess function:
GPD'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 np
import matplotlib.pyplot as plt
from 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ülasyon
np.random.seed(42)
normal_part = np.random.normal(50, 5, 9000)
heavy_tail = np.random.pareto(a=2.5, size=1000) * 20 + 50 # heavy tail
data = np.concatenate([normal_part, heavy_tail])
 
# Mean excess plot
ths, 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 = 80
gpd = fit_pot(data, threshold=u)
print(f"GPD fit: shape={gpd['shape']:.3f}, scale={gpd['scale']:.3f}, N_u={gpd['n_excess']}")
 
# 99.9% VaR
var_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?#

KriterZ-Score / GrubbsPOT
Dağılım varsayımıNormalSadece kuyrukta (asymptotic GPD)
Heavy tailZayıfGüçlü
EşikSabit (3σ)Adaptif (verinin %95-99'u)
YorumlanabilirlikÇok yüksekYüksek
ComplianceBanking için "klasik"Banking için "modern"
StreamingRolling z ileSPOT/DSPOT
Türkiye bankingHâlâ baskınHı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