Ana içeriğe geç
Kesit SQL
Orta · Veri Bilimi

Aykırı değer tespiti: z-skoru ve IQR

İstatistiksel olarak sıra dışı kayıtları SQL ile işaretlemek.

Uygulamada aç, 4 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Z-skoru

z = (x − ortalama) / standart sapma. |z| > 3 genelde aykırı kabul edilir (daha küçük örneklerde 2–2.5).

WITH sepet AS (
  SELECT o.order_id, SUM(oi.quantity * oi.unit_price * (1 - oi.discount)) AS tutar
  FROM orders o JOIN order_items oi ON oi.order_id = o.order_id
  GROUP BY o.order_id
),
istat AS (
  SELECT AVG(tutar) AS ort, STDDEV(tutar) AS sd FROM sepet
)
SELECT s.order_id, ROUND(s.tutar) AS tutar, ROUND((s.tutar - i.ort) / i.sd, 2) AS z
FROM sepet s CROSS JOIN istat i
WHERE ABS((s.tutar - i.ort) / i.sd) > 3
ORDER BY z DESC;

İstatistikleri tek satırlık bir CTE'de hesaplayıp CROSS JOIN ile her satıra taşımak taşınabilir bir kalıptır. PostgreSQL ve BigQuery'de STDDEV(tutar) OVER () yazarak pencere fonksiyonu olarak da kullanabilirsin (bu uygulamadaki ek fonksiyonlar pencere olarak çalışmaz).

IQR yöntemi

Z-skoru normal dağılım varsayar; çarpık verilerde IQR daha sağlamdır: IQR = Q3 − Q1, aykırı sınırları Q1 − 1.5·IQR ve Q3 + 1.5·IQR.

WITH s AS (
  SELECT price, NTILE(4) OVER (ORDER BY price) AS q FROM products
),
sinir AS (
  SELECT MAX(CASE WHEN q = 1 THEN price END) AS q1,
         MAX(CASE WHEN q = 3 THEN price END) AS q3
  FROM s
)
SELECT p.name, p.price
FROM products p, sinir
WHERE p.price > q3 + 1.5 * (q3 - q1) OR p.price < q1 - 1.5 * (q3 - q1);
Alıştırmalara geç (4)