Veriyi tanımak
Modelden önce dağılımı anlamak gerekir. İstatistik fonksiyonlarının adları SQL türüne göre değişir:
| Ölçü | SQL Server | PostgreSQL | MySQL | Oracle |
|---|---|---|---|---|
| Ortalama | AVG(x) | |||
| Standart sapma (örneklem) | STDEV(x) | STDDEV(x) | STDDEV_SAMP(x) | STDDEV(x) |
| Varyans (örneklem) | VAR(x) | VARIANCE(x) | VAR_SAMP(x) | VARIANCE(x) |
| Medyan | PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY x) OVER () | PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY x) | yok (pencere fonksiyonuyla hesaplanır) | MEDIAN(x) |
Bu uygulamadaSQLite'ta istatistik fonksiyonu yoktur; uygulama
MEDIAN, STDDEV, VARIANCE fonksiyonlarını ekler. SQL Server'da PERCENTILE_CONT bir pencere fonksiyonudur; bu yüzden medyanı ayrı bir CTE'de hesaplayıp birleştiririz (SQL Server sekmesine bak).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
WHERE o.status = 'delivered'
GROUP BY o.order_id
)
SELECT COUNT(*) AS n,
ROUND(AVG(tutar), 1) AS ortalama,
ROUND(MEDIAN(tutar), 1) AS medyan,
ROUND(STDDEV(tutar), 1) AS std
FROM sepet;
Ortalama medyandan çok büyükse dağılım sağa çarpıktır (birkaç büyük sepet ortalamayı yukarı çeker). E-ticarette çok yaygındır; bu yüzden medyan raporlamak çoğu zaman daha dürüsttür.
Mod (en sık değer)
SELECT quantity, COUNT(*) AS frekans FROM order_items GROUP BY quantity ORDER BY frekans DESC LIMIT 1;
Varyansı elle hesaplamak
Formül: Var = (Σx² − (Σx)²/n) / (n − 1). Fonksiyonun olmadığı ortamlarda işe yarar:
SELECT (SUM(price * price) - SUM(price) * SUM(price) / COUNT(*)) / (COUNT(*) - 1) AS varyans_elle,
VARIANCE(price) AS varyans_fonk
FROM products;