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;
| Durum | Tercih 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 hedefleri | Yü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.