Ana içeriğe geç
Kesit Power BI
İleri · Uzman DAX

İleri iş kalıpları: Top N + Diğer, sepet, LFL, para birimi

Gerçek projelerde en çok istenen dört uzun kalıbı sıfırdan yazmak ve her satırın neden orada olduğunu anlamak.

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

İ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:

  1. Soru: Ölçü tam olarak neyi cevaplıyor? Toplam satırında ne görünmeli?
  2. Bağlam: Görselde hangi alanlar olacak? Hangi filtreler korunmalı, hangileri kaldırılmalı?
  3. Kümeler: Hangi ara tablolar gerekiyor (ilk N ürün, A alan müşteriler, ortak ürünler)?
  4. Skaler adımlar: Hangi sayılar bu kümelerden türetiliyor?
  5. 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:

MetrikFormülAnlam
DestekA ve B'yi birlikte alan / tüm müşterilerBirlikteliğin yaygınlığı
GüvenA ve B'yi birlikte alan / A'yı alanA 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.

Uzmanlaş

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:

KuralABC
Kümülatif pay (ürün dahil) ≤ %70 ise A2099
Önceki ürünlerin payı < %70 ise A (eşiği geçen ürün de A)2198

İ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:

YolFiltrelere tepkiHızNe zaman?
Ölçü (FILTER + ADDCOLUMNS)Varn² ; büyük katalogda yavaşBirkaç yüz ürün
Ölçü (WINDOW)VarSıralama maliyeti; daha okunurOrta katalog, eşitlik çözümü gerekiyorsa
Hesaplanmış sütun / tabloYok (yenilemede donar)Hızlı"Son 12 aya göre sabit sınıf" yeterliyse
Power Query ya da kaynakYokEn 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ç):

DurumTanım2024
Önceki yıl aktif2023'te alan77
Kayıp2023'te alıp 2024'te almayan13
Sadıkİki yılda da alan64
Yeni2024'te alan, daha önce hiç almamış59
Geri kazanılan2024'te alan, 2023'te almamış ama daha önce almış0
Bu yıl aktif2024'te alan123

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ş):

MetrikHesapDeğer
Kitap içeren sipariş311
Kozmetik içeren sipariş229
İkisini birlikte içeren61
Destek61 / 838%7,3
Güven (Kitap → Kozmetik)61 / 311%19,6
Kozmetik'in genel oranı229 / 838%27,3
Kaldıraç%19,6 / %27,30,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:

SoruKüçükOrtaBüyükVIP
Kitap harcamasına göre (mevcut ölçü)852800
Kitap alanlar, toplam harcamalarına göre12313733

İ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

  1. Sınır kuralı ve eşitlik çözümü ölçünün açıklamasında yazılı mı?
  2. Katalog büyüklüğünde performansı ölçtün mü? Gerekirse sınıfı yenilemede hesapla.
  3. Müşteri köprüsü her dönemde kapanıyor mu? İlk dönem işaretli mi?
  4. Sepet metriklerinin yanında sipariş sayısı görünüyor mu, en az destek eşiği var mı?
  5. Segment üyeliği hangi filtreye göre hesaplanıyor? Başlık bunu söylüyor mu?
Alıştırmalara geç (11)