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

Pareto ve ABC analizi

Cironun %80'ini hangi ürünler getiriyor?

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

80/20 kuralı

Pareto ilkesi: Sonuçların büyük kısmı az sayıda nedenden gelir. Ürünleri ciroya göre sıralayıp kümülatif payı hesaplarsan:

WITH urun AS (
  SELECT p.name, SUM(oi.quantity * oi.unit_price * (1 - oi.discount)) AS ciro
  FROM order_items oi
  JOIN orders o ON o.order_id = oi.order_id
  JOIN products p ON p.product_id = oi.product_id
  WHERE o.status = 'delivered'
  GROUP BY p.product_id, p.name
),
k AS (
  SELECT name, ciro,
         SUM(ciro) OVER (ORDER BY ciro DESC ROWS UNBOUNDED PRECEDING) / SUM(ciro) OVER () AS kum_pay
  FROM urun
)
SELECT name, ROUND(ciro) AS ciro, ROUND(100 * kum_pay, 1) AS kum_yuzde,
       CASE WHEN kum_pay <= 0.80 THEN 'A' WHEN kum_pay <= 0.95 THEN 'B' ELSE 'C' END AS sinif
FROM k
ORDER BY ciro DESC;

Derinleş: Kümülatif payın doğru tanımı

Pareto analizinin özü kümülatif paydır: ürünleri ciroya göre büyükten küçüğe sırala, her satırda “buraya kadarki toplam ÷ genel toplam” değerini hesapla. Bu basit tanımın içinde üç karar gizlidir.

1. Sınırı geçen ürün hangi sınıfta?

kum_pay <= 0.80 kuralı, %80 çizgisini geçiren ürünü B sınıfına atar. Oysa o ürün olmadan %80'e ulaşılamaz. Daha savunulabilir tanım, ürünün kendisinden önceki kümülatif paya bakmaktır: önceki pay %80'in altındaysa ürün A'dır.

WITH u AS (
  SELECT p.product_id, p.name, SUM(oi.quantity * oi.unit_price * (1 - oi.discount)) AS ciro
  FROM order_items oi
  JOIN orders o ON o.order_id = oi.order_id
  JOIN products p ON p.product_id = oi.product_id
  WHERE o.status = 'delivered'
  GROUP BY p.product_id, p.name
),
k AS (
  SELECT product_id, name, ciro,
         SUM(ciro) OVER (ORDER BY ciro DESC, product_id
                         ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) / SUM(ciro) OVER () AS kum
  FROM u
)
SELECT name, ROUND(ciro) AS ciro,
       ROUND(100 * (kum - ciro / (SELECT SUM(ciro) FROM u)), 1) AS onceki_yuzde,
       ROUND(100 * kum, 1) AS kum_yuzde
FROM k
WHERE kum BETWEEN 0.74 AND 0.86
ORDER BY ciro DESC, product_id;

Bu sorguda Powerbank 20000mAh satırına bak: öncesi %78,8, kendisiyle %81,1. Çizgiyi geçiren ürün odur. Eski kurala göre B'dir, “önceki pay” kuralına göre A'dır.

2. Eşitlik ve pencere çerçevesi

ORDER BY ciro DESC yazıp çerçeveyi belirtmezsen varsayılan RANGE çerçevesi devreye girer. Aynı ciroya sahip iki ürün aynı kümülatif değeri alır. Sıralamaya ikinci anahtar (product_id) ekleyip ROWS kullanmak sonucu belirli kılar.

3. Hiç satmayan ürünler

INNER JOIN, hiç satılmamış ürünleri listeden sessizce düşürür. Anadolu Market'in 40 ürününden 2'si (Koşu Bandı ve Gurme Lokum Kutusu) hiç teslim edilmemiş. “Ürünlerin yüzde kaçı cironun %80'ini yapıyor?” sorusunda payda 38 değil 40 olmalıdır. Bu ürünler C sınıfının en dibine LEFT JOIN ile eklenir.

80/20 bir yasa değilBu veride cironun %80'ine ulaşmak için ürünlerin üçte ikisi gerekiyor. Yani portföy yoğunlaşmış değil, dengeli. Pareto analizinin değeri, oranın 80/20 çıkması değil, yoğunlaşmanın ne kadar olduğunu ölçmesidir.
Alıştırmalara geç (5)