İleri seviyede ölçü yazmak
Uzun bir ölçü, birbirine bağlanan küçük adımlardan oluşur. İleri seviyenin sonunda ölçüyü yazmadan önce adımları kâğıda dökersin:
- Soru: Ölçü tam olarak neyi cevaplıyor? Toplam satırında ne görünmeli?
- Bağlam: Görselde hangi alanlar olacak? Hangi filtreler korunmalı, hangileri kaldırılmalı?
- Kümeler: Hangi ara tablolar gerekiyor (ilk N ürün, A alan müşteriler, ortak ürünler)?
- Skaler adımlar: Hangi sayılar bu kümelerden türetiliyor?
- Dallar: Toplam satırı, boş değerler, özel satırlar (“Diğer”) için SWITCH dalları.
Her adım bir VAR olur. İyi adlandırılmış değişkenler ölçünün belgesidir.
1 · Top N + Diğer
Soru: Grafikte ilk N ürün ve tek bir “Diğer” çubuğu; toplam her zaman genel toplama eşit. Model hilesi: Ürün adları + “Diğer” satırını içeren bağlantısız UrunlerVeDiger tablosu eksene konur; çünkü ölçü, modelde olmayan bir satır (“Diğer”) üretemez.
2 · Sepet analizi
Soru: A'yı alanların yüzde kaçı B'yi de aldı? Model hilesi: Ürünlerin bağlantısız bir kopyası (KarsiUrunler) ikinci eksen olur; A filtresi kaldırılıp B filtresi TREATAS ile uygulanır. Destek (support), güven (confidence) ve kaldıraç (lift) üç temel metriktir:
| Metrik | Formül | Anlam |
|---|---|---|
| Destek | A ve B'yi birlikte alan / tüm müşteriler | Birlikteliğin yaygınlığı |
| Güven | A ve B'yi birlikte alan / A'yı alan | A alındığında B'nin olasılığı |
| Kaldıraç | Güven / B'nin genel alınma oranı | 1'den büyükse birliktelik tesadüften güçlü |
3 · Like-for-like (LFL)
Soru: Yeni ürün eklemenin etkisi olmadan organik büyüme ne? Her iki dönemde de satılan ürün kümesi bulunur, iki dönemin satışı yalnızca bu kümeyle hesaplanır.
4 · Para birimi dönüşümü
Soru: Satışı USD/EUR olarak göster. Kural: Dönüşüm işlemin tanecikte (ay) yapılır, sonra toplanır. Yıllık TL toplamı yıllık ortalama kura bölünmez.
Dört kalıbın tam kodu ve satır satır açıklaması Measure Lab'nda. Aşağıdaki alıştırmalarda bunları sen yazacaksın; iskelet verildi.
ABC / Pareto: üretim hâli
Kategori müdürü ABC sınıfını stok planlamasında kullanacak: A ürünlerinin stoğu hiç bitmemeli, C ürünleri gözden geçirilecek. Sınıf bir karar tetiklediği için her satırının savunulabilir olması gerekir. Segmentasyon dersindeki kalıbı üretime taşırken beş soruya cevap ver.
1. Sınır kuralı yazılı mı?
Satan 38 ürün için iki makul kural farklı sonuç verir:
| Kural | A | B | C |
|---|---|---|---|
| Kümülatif pay (ürün dahil) ≤ %70 ise A | 20 | 9 | 9 |
| Önceki ürünlerin payı < %70 ise A (eşiği geçen ürün de A) | 21 | 9 | 8 |
İkisi de savunulabilir; önemli olan ekibin hangisini kullandığını ölçünün açıklamasına yazmasıdır. Tedarik ekibi "21. ürün neden B?" diye sorduğunda cevap belgede olmalı.
2. Eşitlikler nasıl çözülüyor?
Klasik kalıp "satışı benimkinden büyük ya da eşit olanların toplamı"dır. Eşit satışlı iki ürün birbirinin satışını kümülatife katar ve ikisi de büyük kümülatifi alır. Bu katalogda eşitlik yok, ama binlerce SKU'lu gerçek listelerde (aynı fiyatla bir kez satılan ürünler) çok sık görülür. Eşitliği bozmanın yolu ikinci bir sıralama ölçütüdür: pencere fonksiyonunda ORDERBY([Net Satış], DESC, Urunler[Urun], ASC).
Kümülatif Satış (Eşitliksiz) =
SUMX(
WINDOW(
1, ABS, 0, REL,
ALLSELECTED(Urunler[Urun]),
ORDERBY([Net Satış], DESC, Urunler[Urun], ASC)
),
[Net Satış]
)
3. Performans ne kadar?
Klasik kalıp her ürün satırında tüm ürün listesini süzer: n ürün için n² karşılaştırma. 40 üründe 1.600; 50.000 SKU'da 2,5 milyar. Seçenekler:
| Yol | Filtrelere tepki | Hız | Ne zaman? |
|---|---|---|---|
| Ölçü (FILTER + ADDCOLUMNS) | Var | n² ; büyük katalogda yavaş | Birkaç yüz ürün |
| Ölçü (WINDOW) | Var | Sıralama maliyeti; daha okunur | Orta katalog, eşitlik çözümü gerekiyorsa |
| Hesaplanmış sütun / tablo | Yok (yenilemede donar) | Hızlı | "Son 12 aya göre sabit sınıf" yeterliyse |
| Power Query ya da kaynak | Yok | En hızlı | Sınıf başka sistemlerde de kullanılacaksa |
4. 80/20 gerçekten geçerli mi?
Bu katalogda satışın %80'ini satan 38 ürünün 25'i (%66) getiriyor. "Ürünlerin %20'si satışın %80'i" kuralı burada yok; satış oldukça dengeli dağılıyor. Kuralı varsayma, veriden ölç ve raporda söyle.
5. Sınıfları eksene koymak
Ölçü ile hesaplanan sınıf eksene konamaz. "Her sınıfta kaç ürün var?" grafiği için A/B/C satırlarını içeren bağlantısız küçük bir tablo (DATATABLE) ve sınıf sayan bir ölçü gerekir. Ölçünün çekirdeği alıştırmada.
Yeni, sadık, geri kazanılan, kayıp: köprü tutmalı
Yönetim kurulu yıllık "müşteri köprüsü" istiyor: geçen yılın aktif müşterisinden bu yılın aktif müşterisine nasıl gelindi? Tanımlar (yıllık pencere, iptaller hariç):
| Durum | Tanım | 2024 |
|---|---|---|
| Önceki yıl aktif | 2023'te alan | 77 |
| Kayıp | 2023'te alıp 2024'te almayan | 13 |
| Sadık | İki yılda da alan | 64 |
| Yeni | 2024'te alan, daha önce hiç almamış | 59 |
| Geri kazanılan | 2024'te alan, 2023'te almamış ama daha önce almış | 0 |
| Bu yıl aktif | 2024'te alan | 123 |
Köprü: 77 − 13 + 59 + 0 = 123. Bu eşitlik her dönemde tutmalıdır; tutmuyorsa tanımlardan biri diğeriyle örtüşüyor ya da bir müşteriyi iki kez sayıyorsun. Köprüyü bir DAX sorgusuyla her dönem için test et ve testi ölçüyle birlikte sakla.
- Veri başlangıcı etkisi: Veri Haziran 2022'de başladığı için 2022'nin 32 müşterisinin hepsi "yeni" görünür. Bu gerçek bir kazanım değildir; köprüyü 2023'ten başlat ya da ilk dönemi işaretle.
- Pencere uzunluğu: Çeyreklik pencerede aynı müşteriler sık sık "kayıp" ve "geri kazanılan" olur (2024 Ç4'te 23 geri kazanılan). Pencere, müşterinin alışveriş sıklığına göre seçilmelidir.
- Toplam satırı: Önceki dönemi DATEADD ile tanımlayan ölçü toplamda anlamsız sayı üretir.
HASONEVALUE(Tarih[Yil])ile koru. - Durumları eksende göstermek: Bağlantısız bir durum tablosu ve SWITCH gerekir; Top N + Diğer'deki model hilesiyle aynı mantık.
Müşteri Köprüsü =
VAR Durum = SELECTEDVALUE(MusteriDurumu[Durum])
VAR Simdi = CALCULATETABLE(VALUES(Satislar[MusteriNo]), Satislar[Durum] <> "İptal")
VAR Onceki = CALCULATETABLE(VALUES(Satislar[MusteriNo]), Satislar[Durum] <> "İptal", DATEADD(Tarih[Tarih], -1, YEAR))
VAR Eski = CALCULATETABLE(VALUES(Satislar[MusteriNo]), Satislar[Durum] <> "İptal", Tarih[Tarih] < MIN(Tarih[Tarih]))
RETURN
IF(HASONEVALUE(Tarih[Yil]),
SWITCH(Durum,
"Kayıp", - COUNTROWS(EXCEPT(Onceki, Simdi)),
"Sadık", COUNTROWS(INTERSECT(Simdi, Onceki)),
"Yeni", COUNTROWS(EXCEPT(EXCEPT(Simdi, Onceki), Eski)),
"Geri kazanılan", COUNTROWS(INTERSECT(EXCEPT(Simdi, Onceki), Eski))
)
)
Sepet analizi: müşteri değil sipariş düzeyinde
Ana bölümdeki birlikte alma oranı müşteri düzeyindedir: "A'yı bir kez alan, B'yi herhangi bir zaman almış mı?" Mağaza yerleşimi ve "bunu alan bunu da aldı" önerisi için asıl soru sipariş düzeyindedir: aynı sepette mi? Kitap ve Kozmetik için sayılar (iptaller hariç, 838 sipariş):
| Metrik | Hesap | Değer |
|---|---|---|
| Kitap içeren sipariş | 311 | |
| Kozmetik içeren sipariş | 229 | |
| İkisini birlikte içeren | 61 | |
| Destek | 61 / 838 | %7,3 |
| Güven (Kitap → Kozmetik) | 61 / 311 | %19,6 |
| Kozmetik'in genel oranı | 229 / 838 | %27,3 |
| Kaldıraç | %19,6 / %27,3 | 0,72 |
En sık birlikte görülen çift, tesadüften daha az birlikte alınıyor. Bu veride 21 kategori çiftinin hiçbirinde kaldıraç 1'i geçmiyor; sepetler küçük (sipariş başına ortalama 1,79 satır) ve kategoriler aynı sepette birbirinin yerine geçiyor. En yüksek kaldıraç Hediye–Kozmetik (0,89), ama yalnızca 9 siparişe dayanıyor ve yıla göre 1,21 (2023) ile 0,87 (2024) arasında oynuyor.
Hediye–Kozmetik Kaldıracı = VAR Tum = CALCULATE([Sipariş Sayısı], REMOVEFILTERS(Kategoriler), REMOVEFILTERS(Urunler)) VAR A = CALCULATETABLE(VALUES(Satislar[SiparisNo]), Satislar[Durum] <> "İptal", Kategoriler[Kategori] = "Hediye") VAR B = CALCULATETABLE(VALUES(Satislar[SiparisNo]), Satislar[Durum] <> "İptal", Kategoriler[Kategori] = "Kozmetik") VAR AB = COUNTROWS(INTERSECT(A, B)) RETURN DIVIDE(AB * Tum, COUNTROWS(A) * COUNTROWS(B))
- En az destek eşiği koy: Örneğin 30 siparişin altındaki çiftleri gösterme. Küçük sayılarda kaldıraç rastgele büyür ya da küçülür.
- Oranın yanında sayıyı göster: "Kaldıraç 1,21 (n = 4)" ile "Kaldıraç 1,21 (n = 400)" aynı karar değildir.
- Performans: Ürün düzeyinde n ürün için n² çift vardır. Binlerce SKU'da çift tablosunu Power Query'de ya da Fabric'te önceden hesapla, Power BI'da yalnızca göster.
Dinamik segmentasyon: üyelik hangi filtreye göre?
Kitap kategori müdürü dilimleyicide Kitap'ı seçip [Dilimdeki Müşteri] grafiğine bakıyor: 85 Küçük, 28 Orta, hiç Büyük ya da VIP yok. "Kitap müşterilerimiz değersiz mi?" Hayır: ölçü müşteriyi yalnızca Kitap harcamasına göre segmentliyor. İki farklı soru var:
| Soru | Küçük | Orta | Büyük | VIP |
|---|---|---|---|---|
| Kitap harcamasına göre (mevcut ölçü) | 85 | 28 | 0 | 0 |
| Kitap alanlar, toplam harcamalarına göre | 12 | 31 | 37 | 33 |
İkinci soru için iki değişiklik gerekir: müşterinin değeri ürün filtreleri kaldırılarak hesaplanır, ama dolaşılan liste yalnızca Kitap alanlardır. Dikkat: listeyi VALUES(Musteriler[MusteriNo]) ile kurarsan Kitap filtresi Musteriler'e ulaşmaz (filtre Satislar'dan Musteriler'e akmaz) ve 113 yerine 136 müşteri sayarsın.
- Sınır kontrolü: Koşul
Min < S <= Max. Değeri 0 ya da negatif olan müşteri (iadesi satışından büyük) hiçbir dilime girmez. Testte dilimlerin toplamını [Müşteri Sayısı] ile karşılaştır. - Dönem etkisi: 2024 seçilince VIP sayısı 34'ten 10'a düşer; çünkü değer seçili döneme göre hesaplanır. Bu bilinçli bir karar olmalı ve başlıkta yazmalı.
Kontrol listesi
- Sınır kuralı ve eşitlik çözümü ölçünün açıklamasında yazılı mı?
- Katalog büyüklüğünde performansı ölçtün mü? Gerekirse sınıfı yenilemede hesapla.
- Müşteri köprüsü her dönemde kapanıyor mu? İlk dönem işaretli mi?
- Sepet metriklerinin yanında sipariş sayısı görünüyor mu, en az destek eşiği var mı?
- Segment üyeliği hangi filtreye göre hesaplanıyor? Başlık bunu söylüyor mu?