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

Dağılımlar ve histogram (binning)

Sabit genişlikli kutular, logaritmik kutular ve yüzdelikler.

Uygulamada aç, 6 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ç.

Sabit genişlikli histogram

Değeri kutu genişliğine bölüp aşağı yuvarlarsın:

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
)
SELECT FLOOR(tutar / 500) * 500 AS kutu_alt,
       COUNT(*) AS siparis
FROM sepet
GROUP BY kutu_alt
ORDER BY kutu_alt;

Çarpık dağılımlar için log ölçek

SELECT FLOOR(log10(price)) AS basamak, COUNT(*) AS urun,
       MIN(price) AS min, MAX(price) AS max
FROM products
GROUP BY basamak ORDER BY basamak;

Yüzdelikler (quantile)

NTILE(100) ile yüzdelik dilimler çıkarılabilir; ya da sıralayıp belirli sıradaki değeri seçersin:

WITH s AS (
  SELECT salary, ROW_NUMBER() OVER (ORDER BY salary) AS rn, COUNT(*) OVER () AS n
  FROM employees
)
SELECT MAX(CASE WHEN rn = FLOOR(0.25 * n) + 1 THEN salary END) AS q1_yaklasik,
       MAX(CASE WHEN rn = FLOOR(0.75 * n) + 1 THEN salary END) AS q3_yaklasik
FROM s;

Derinleş: çarpıklık, yüzdelikler ve aykırı değerler

Bir dağılımı tek bir ortalamayla özetlemek çoğu zaman yanıltır. Gelir, sepet tutarı, bekleme süresi gibi iş verileri genellikle sağa çarpıktır: değerlerin çoğu küçüktür, az sayıda çok büyük değer ortalamayı yukarı çeker. Bu yüzden analist önce dağılımın şekline bakar, sonra hangi özeti kullanacağına karar verir.

Lezzet Kurye'de sepet tutarını (sipariş satırlarının toplamı) beş sayıyla özetleyelim:

WITH sepet AS (
  SELECT order_id, SUM(qty * unit_price) AS tutar
  FROM lk_order_lines
  GROUP BY order_id
),
s AS (
  SELECT tutar,
         ROW_NUMBER() OVER (ORDER BY tutar) AS rn,
         COUNT(*) OVER () AS n
  FROM sepet
)
SELECT ROUND(AVG(tutar), 2) AS ortalama,
       MAX(CASE WHEN rn = FLOOR(0.25 * n) + 1 THEN tutar END) AS q1,
       MAX(CASE WHEN rn = FLOOR(0.50 * n) + 1 THEN tutar END) AS medyan,
       MAX(CASE WHEN rn = FLOOR(0.75 * n) + 1 THEN tutar END) AS q3,
       MAX(CASE WHEN rn = FLOOR(0.95 * n) + 1 THEN tutar END) AS p95,
       MAX(tutar) AS en_buyuk
FROM s;

Sonuç: ortalama 510,08 TL, medyan 430 TL, en büyük sepet 2.655 TL. Ortalamanın medyandan belirgin biçimde büyük olması sağa çarpıklığın işaretidir. “Tipik müşteri” için medyanı, toplam ciro planlaması için ortalamayı kullanırsın.

IQR ile aykırı değer

Çeyrekler arası açıklık IQR = Q3 − Q1. Yaygın kural: Q3 + 1,5 × IQR üstü ve Q1 − 1,5 × IQR altı “aykırı aday”dır. Burada Q1 = 270, Q3 = 665, üst sınır 1.257,5 TL; 7.178 siparişin 232'si (%3,2) bu sınırın üstünde.

WITH sepet AS (
  SELECT order_id, SUM(qty * unit_price) AS tutar FROM lk_order_lines GROUP BY order_id
),
r AS (
  SELECT tutar, ROW_NUMBER() OVER (ORDER BY tutar) AS rn, COUNT(*) OVER () AS n FROM sepet
),
q AS (
  SELECT MAX(CASE WHEN rn = FLOOR(0.25 * n) + 1 THEN tutar END) AS q1,
         MAX(CASE WHEN rn = FLOOR(0.75 * n) + 1 THEN tutar END) AS q3
  FROM r
)
SELECT q1, q3, q3 + 1.5 * (q3 - q1) AS ust_sinir,
       (SELECT COUNT(*) FROM sepet WHERE tutar > q.q3 + 1.5 * (q.q3 - q.q1)) AS aykiri
FROM q;
Aykırı değer hata değildirKalabalık bir ofisin toplu siparişi gerçek bir siparişse veriden atılmaz; yalnızca ortalama yerine medyan kullanılır ya da ayrı bir segment olarak incelenir. Silme kararı, değerin yanlış olduğu (ör. eksi tutar, test kaydı) kanıtlanınca verilir.
DurumTercih edilecek özet
Simetrik dağılım (ör. boy, sınav puanı)Ortalama ve standart sapma
Sağa çarpık (sepet, gelir, süre)Medyan, çeyrekler, p90/p95
Çok geniş aralık (fiyatlar 10 TL – 50.000 TL)Log ölçekte histogram
SLA ve performans hedefleriYüzdelikler (p95 teslim süresi gibi)

Sık hata: histogram kutularını çok dar seçmek gürültü, çok geniş seçmek bilgi kaybı üretir. Kutu sayısını veriye bakarak değiştir; uç değerler için “1.500 ve üzeri” gibi açık uçlu son kutu kullan.

Alıştırmalara geç (6)