Tableau Mastering

Tableau LOD Master Class · FIXED / EXCLUDE / INCLUDE

Tableau LOD Master Class

Level of Detail (LOD) ifadeleri, görünümün granularitesinden bağımsız hesaplama yapmamızı sağlar. Bu sayfada gerçek Türk şirket isimleriyle (Trendyol, Migros, Garanti BBVA, Yemeksepeti, Akbank, Turkcell vb.) hayali ama somut iş senaryolarına dayalı toplam 18 örnek bulacaksın. Her örnek; iş bağlamı, veri büyüklüğü, formül, çalışma mantığı, tuzaklar ve performans notlarıyla birlikte.

6 × FIXED 6 × EXCLUDE 6 × INCLUDE Türkçe · Orta/Üst Düzey

1. Önce Temeli Sağlamlaştıralım

LOD ifadelerini doğru kullanmak için önce granularite kavramını oturtmamız gerekir. Bu bölümde adım adım gideceğiz: granularite nedir, LOD niçin doğdu, sözdizimini nasıl okuruz, üç türün arasındaki gerçek fark nedir ve aynı veride üç LOD’un nasıl farklı sonuç ürettiğini.

1.1 Granularite Nedir?

Granularite, “veriye hangi seviyede bakıyorum?” sorusunun cevabıdır. En ince granularite veritabanındaki satır seviyesidir (örn. “Sipariş + Ürün” satırı). Tableau’da bir görünüm (view) açtığında, raflara koyduğun boyutlar view’un granularitesini belirler. Ölçüler (Sales, Quantity vb.) o seviyeye göre toplanır.

Ham Veri · En İnce Granularite
SiparişMüşteriÜrünTutar
S-1AliTelefon15.000
S-1AliKılıf500
S-2AliMouse800
S-3VeliKlavye1.200
4 satır · sipariş + ürün düzeyinde
View · Müşteri Seviyesi
MüşteriToplam Tutar
Ali16.300
Veli1.200
2 satır · müşteri düzeyinde

Burada Tableau ham veriyi (sol tablo) Müşteri boyutuna göre toplayarak sağdaki agregat tabloyu üretti. “Granularite kalınlaştı” diyebiliriz: 4 satır → 2 satır. Buradaki 16.300 sayısı view granularitesinde anlamlıdır, ham veri seviyesinde böyle bir satır yoktur. LOD ifadeleri tam da bu noktada devreye girer: view’un granularitesini override etmek için.

1.2 Bir LOD İfadesinin Anatomisi

Tableau LOD ifadeleri her zaman süslü parantez içinde, beş parçadan oluşur. Bu kalıbı bir kez ezberlersen her LOD ifadesini aynı yapıyla okuyabilirsin:

{ FIXED [Müşteri ID], [Bölge] : SUM([Satış]) }
1Süslü ParantezLOD ifadesinin başlangıç ve bitişi. Tableau parser’a “bu bir LOD” der.
2Anahtar KelimeFIXED · EXCLUDE · INCLUDE — granularitenin nasıl belirleneceğini söyler.
3Boyut ListesiHangi boyut(lar) seviyesinde gruplanacak. Virgülle ayrılır, opsiyonel.
4İki Nokta Üst ÜsteBoyut listesi ile agregasyonu ayırır. Boyut yoksa { FIXED : ... } de yazılır.
5AgregasyonSUM, AVG, MIN, MAX, COUNTD vb. Bir ölçünün belirtilen seviyede nasıl toplanacağı.

1.3 LOD Niçin Var? Hangi Sorunu Çözer?

Tableau’nun varsayılan davranışı şudur: raflardaki boyutlar = view granularitesi. Bu çoğu zaman yeterlidir, ama belirli analiz tipleri bunu yetersiz bırakır. LOD’un çözdüğü 4 tipik problem:

1

Farklı Seviyelerin Karşılaştırılması

“Sipariş başına ortalama tutar” gibi metrikler — önce sipariş seviyesinde toplama, sonra üst seviyede ortalama almak gerekir. Tek seviyeli toplama bunu yapamaz.

2

Filtre Bağımsız Hesaplama

Cohort analizinde müşterinin “ilk sipariş tarihi”, view’a hangi yıl/ay filtresi konursa konsun değişmemeli. FIXED bu sabitliği sağlar.

3

Yüzde / Pay Hesaplamaları

“Şehrin bölge içindeki yüzde payı” — payda görünümdeki şehir granularitesinden bağımsız, bölge seviyesinde hesaplanmalı. EXCLUDE bunu zarif çözer.

4

Sıralama / Top-N Analizleri

“Top 10 müşteri” listesini sabitleyip yüzde, kategori, segment hesaplamaları yapmak. Tablo hesaplarıyla mümkün ama LOD daha kararlı sonuç verir.

1.4 Üç LOD Türü ve Mental Modelleri

Aynı SUM([Satış]) hesabını üç farklı LOD ile yazmak çok farklı sonuçlar üretir. Her birinin kendine özgü “dünya görüşü” vardır — onları görsel bir mental modelle ezberlemek en kolay yol:

FIXED

Sabit Granularite · “Görmezden Gelen”

🧱 Mental model: Beton blok. Görünüm değişse de, dimension filtre değişse de bu hesap sarsılmaz. Yalnızca Context filtresi onu etkileyebilir.

{ FIXED [Müşteri] : SUM([Satış]) }
Ne Zaman?
  • Cohort etiketi (ilk sipariş tarihi)
  • CLV — yaşam boyu değer
  • % of grand total / region
  • Top-N listesi sabitleme
Dikkat!
  • Dimension filtreleri etkilemez (Context dışı)
  • Yüksek kardinaliteli boyutta yavaşlar

EXCLUDE

Yukarı Çık · “Boyutu Çıkar”

⬆️ Mental model: Asansör yukarı. Görünümdeki bir boyutu silerek view’u bir üst seviyeye çıkarır. Yüzde / sapma hesabı için ideal.

{ EXCLUDE [Ay] : SUM([Satış]) }
Ne Zaman?
  • % of category, % of region
  • Aydan yıla, şehirden ülkeye sapma
  • Aynı kıdem benchmark (ücret eşitliği)
Dikkat!
  • Çıkardığın boyut view’da yoksa etkisizdir
  • Filtrelerden etkilenir (FIXED’ın aksine)

INCLUDE

Aşağı İn · “Boyutu Ekle”

⬇️ Mental model: Asansör aşağı. View’da olmayan bir alt seviyeye iner, hesabı yapar, sonra dış aggregate ile geri çıkar.

{ INCLUDE [Sipariş] : SUM([Tutar]) }
Ne Zaman?
  • Avg of avg (avg per customer per region)
  • Sipariş başı sepet boyutu
  • Çalışan başı iş yükü
  • Şube günlük tekil müşteri
Dikkat!
  • Dış aggregate (AVG/MEDIAN/SUM) sonucu değiştirir
  • Simpson Paradoksu — eşit ağırlık tehlikesi

1.5 Aynı Veri — Üç Farklı Cevap

Soyut tanımları somut görelim. Aşağıdaki mini veri kümesinde, view Bölge bazında. Aynı satışı dört farklı yolla hesaplayınca nasıl bambaşka sonuçlar ürettiğini incele:

Mini Veri Seti (ham)
BölgeMüşteriSiparişTutar
MarmaraAliS1₺ 1.000
MarmaraAliS2₺ 500
MarmaraVeliS3₺ 200
EgeAyşeS4₺ 300
4 satır · 2 bölge · 3 müşteri · 4 sipariş
View: Bölge bazında — Sonuçlar
Bölge SUM(Tutar)
default
FIXED [Müşteri]
: SUM
EXCLUDE [Bölge]
: SUM
AVG(INCLUDE [Sipariş] : SUM)
Marmara 1.700 1.500 / 200 2.000 567
Ege 300 300 2.000 300
  • SUM(Tutar) — Tableau default; bölge bazında basit toplam.
  • FIXED [Müşteri] — her müşteri için kendi tüm-zaman toplamı; Marmara’da Ali = 1.500, Veli = 200 (bölge etkilemiyor).
  • EXCLUDE [Bölge] — bölgeyi çıkar = grand total (2.000) her satıra basılır. % of total hesabının paydası.
  • AVG(INCLUDE [Sipariş]) — sipariş başı ortalama tutar; Marmara’da (1.000+500+200)/3 = 567; Ege’de tek sipariş 300.

Kritik çıkarım: “Hangi LOD’u kullanmalıyım?” sorusunun cevabı, “hangi seviyede toplama yapmasını istiyorum?” sorusuyla başlar. Bu üç türün arasındaki seçim, dashboard’unun matematiksel doğruluğunu doğrudan belirler.

2. İşlem Sırası (Order of Operations)

Tableau bir grafik/tablo üretirken sorguyu belirli bir boru hattında çalıştırır. Filtreler, LOD’lar ve table calculations bu hatta sıraya girer. Bu sırayı bilmek “FIXED’ım niye filtremden etkilenmiyor?” gibi soruların doğrudan cevabıdır ve dashboard’taki çoğu görünmez hatanın kaynağıdır.

2.1 11 Adımlı Tam Pipeline

Aşağıdaki dikey timeline en üstten en alta veri akışını gösterir. Mor halkalı (kritik) adımlar LOD davranışını doğrudan belirler.

1

Extract Filters

Veri kaynağı seviyesi · En erken çalışır

Hyper extract (.hyper) oluşturulurken row’ları elemek için uygulanan filtre. Veri fiziksel olarak extract dosyasına dahil edilmez. Hangi sorguyu çalıştırırsan çalıştır, bu filtre zaten uygulanmıştır — başka hiçbir filtre bunu geri getiremez.

Örnek: 2020 öncesi tarihlerin extract’a alınmaması; 50M satırlık fact tablosunu dashboard için 10M’a düşürmek.
2

Data Source Filters

Workbook seviyesi · Tüm sayfaları etkiler

“Data Source” sekmesinde tanımlanır. Live connection’da SQL WHERE clause’una eklenir. Workbook içindeki tüm worksheet ve dashboard’larda aynı şekilde uygulanır; worksheet bazında override edilemez.

Örnek: Multi-tenant dashboard’da bayinin yalnızca kendi verisini görmesi (row-level security); test/staging verilerini production’dan elemek.
3

Context Filters KRİTİK

Geçici tablo katmanı · FIXED için “evren” tanımı

“Add to Context” ile bir dimension filter’ı bir üst seviyeye yükseltirsin. Tableau bu noktada geçici (TEMP) tablo oluşturur ve FIXED LOD’lar bu temp tablo üzerinden çalışır. Yani Context, FIXED’ı etkileyebilen tek “view” filtresidir.

Örnek: “2024 yılı için Top 10 müşteri” — Yıl filtresini Context’e at ki FIXED rank yalnızca 2024 evrenini görsün; aksi halde tüm yıllar üzerinden Top 10 üretir.
4

FIXED LOD KRİTİK

Granularite override · Filtre bağımsız

FIXED ifadeleri burada hesaplanır. Yalnızca üstündeki üç adımı (extract / source / context) görür; altındaki dimension/measure/table calc filtrelerini görmez. Cohort, CLV, peak month gibi “tarihsel sabit” hesaplar için doğru araçtır.

Örnek: { FIXED [Customer] : MIN([Order Date]) } — yıl filtresi seçilse bile müşterinin gerçek ilk siparişi sabit kalır.
5

Dimension Filters

View seviyesi · Quick filter’lar buraya düşer

Boyut alanlardan yapılan klasik filtreler (Region = “Marmara”, Date BETWEEN …). Quick Filter olarak shelf’e bıraktığında varsayılan olarak buraya düşer. Top N filtreleri ve Sets de bu adımdadır (içlerinde RANK çalışsa da bu seviyede uygulanırlar).

Örnek: Yıl dropdown’u, kategori multi-select, tarih slider. FIXED LOD’unun bunlardan etkilenmesini istiyorsan filtreyi Context’e taşı.
6

INCLUDE / EXCLUDE LOD KRİTİK

View boyutuyla etkileşimli · Filtreden etkilenir

Dimension filter’lardan SONRA çalışır → bu LOD’lar filtre seçimlerini görür. FIXED’ın aksine, ay filtrelendiğinde INCLUDE/EXCLUDE de o aya göre yeniden hesaplanır. Çoğu zaman bu istediğimiz davranıştır; “filtre uygulanmış evren içinde yüzde / sapma” gibi.

Örnek: “Marmara’da müşteri başı ortalama” — Region filtresi Marmara’ya ayarlandığında INCLUDE Customer LOD’u sadece Marmara müşterilerini hesaba katar.
7

Measure Filters

Aggregate sonrası · Toplam üzerinden filtre

Ölçüler aggregate edildikten sonra uygulanan filtreler. SUM([Sales]) > 100000, AVG([Discount]) <= 0.2 gibi. Tüm LOD'lar bu adımdan ÖNCE hesaplanmıştır; dolayısıyla measure filter LOD sonuçlarını geriye dönük etkileyemez, ama LOD üzerinden de filter yapılabilir.

Örnek: "Cirosu 1M üstü olan müşteriler" — bu filter FIXED CLV LOD'u zaten hesaplandıktan sonra row gizler; segmentleme bozulmaz.
8

Forecasts

Tahmin katmanı · İsteğe bağlı

Tableau'nun dahili exponential smoothing forecast motoru, var olan veri noktaları üzerine geleceğe yönelik tahminler ekler. LOD'lar bu adımdan önce yapıldığı için forecast LOD sonuçlarını da kullanabilir.

Örnek: Aylık satış line chart'ında önümüzdeki 6 ay tahmini. FIXED ile yıllık baseline çiziyorsan, forecast bunun üstüne çizilir.
9

Table Calculations

Result set üzerinde · WINDOW fonksiyonları

RANK, INDEX, WINDOW_SUM, RUNNING_SUM, LOOKUP, FIRST, LAST gibi fonksiyonlar. Sorgu sonucu (yani üstteki tüm filtre/LOD adımlarının sonucu) hazır olduktan sonra çalışır. Sıralama ve görünüm bağlamına duyarlıdır — view'da sıralamayı değiştirmek table calc sonucunu değiştirir.

Örnek: Pareto için RUNNING_SUM(SUM([Sales])) / TOTAL(SUM([Sales])). FIXED ile müşteri toplamını sabitle, RUNNING_SUM kümülatif yüzdeyi hesaplasın.
10

Table Calc Filters

Hide-only · View'u şekillendirmez

Bir table calc'ın sonucuna göre uygulanan filtre (örn. RANK ≤ 10 → ilk 10 göster). Tableau toplamı önce hesaplar, sonra istemediğin satırları gizler — bu yüzden grand total'lar, % of total gibi hesaplamalar gizlenen satırları da hâlâ görmüş olur. Subtle bir tuzak!

Örnek: "Top 10 müşterinin toplam ciroya katkısı". Table calc filter "RANK > 10" hide eder, fakat SUM([Sales]) toplamı 11+ müşteriyi de bilir. Doğru % için payda olarak { FIXED : SUM([Sales]) } kullan.
11

Trend Lines / Reference Lines / Totals

Görselleştirme katmanı · En son

Tüm filtre ve hesaplamalardan sonra grafiğin üzerine eklenen kompozisyon öğeleri. Tableau'nun render motoru için son adım — analitik panelden eklenen ortalama çizgisi, polynomial trend, std deviation band'leri burada konumlanır.

Örnek: Aylık satış grafiğine eklenen 12-aylık moving average reference line, Q4 hedef sınırı, regresyon trend'i.

2.2 Filtre × LOD Etki Matrisi

Hangi filtre türü hangi hesaplamayı etkiler? Bu matriste bir bakışta görebilirsin. = etkiler · = etkilemez · ~ = kısmi.

Filtre Türü FIXED LOD EXCLUDE LOD INCLUDE LOD Table Calc View Aggregate
Extract Filter
Data Source Filter
Context Filter
Dimension Filter
Measure Filter
Table Calc Filter ~ ~

~ Table calc filter sadece görünür satırları kısar (hide); alt-katmandaki TOTAL ve % hesaplamaları gizlenen satırları hâlâ görür.

2.3 "Filtremi Nereye Koymalıyım?" Karar Senaryoları

Aşağıdaki 5 senaryo gerçek dashboard'larda en sık karşılaşılan tuzaklardır. Her birinde "yanlış yerdeki filtre" görünmez bir hatadır:

A
"Top 10 müşteri her zaman seçili yıldan gelsin"

FIXED ile rank etiketi tüm zamanlardan geliyordu. Year filter ekledin ama Top 10 listesi değişmedi.

→ Çözüm: Year filter'ını Add to Context yap. FIXED yalnızca seçili yıl evrenini görür, Top 10 dinamik hale gelir.
B
"Cohort etiketi Ay filtresinden etkilenmemeli"

Müşterinin "ilk sipariş tarihi" cohort'unu Ay filtresi değiştirdiğinde retention dashboard'um bozuluyor.

→ Çözüm: FIXED kullan ve filtreyi Context'te BIRAKMA. Ay filtresi normal dimension filter olarak kalsın, FIXED tüm tarihleri görür ve ilk sipariş sabit kalır. Bu istenen davranıştır.
C
"% of Total filtre değiştikçe payda da daralsın"

Region filter "Marmara" seçince "şehir / ülke" yerine "şehir / Marmara" istiyorum.

→ Çözüm: Payda olarak EXCLUDE [City] kullan; FIXED yerine. EXCLUDE filter'dan etkilenir, paydası seçili Region'a daralır.
D
"Cirosu 1M altındaki müşterileri gizledim, segment dağılımı garip"

Bronze/Silver/Gold segmenti FIXED CLV ile hesaplanıyor. Measure filter ekledim, segment etiketleri doğru ama satır sayıları beklenenin üstünde.

→ Açıklama: Measure filter LOD'dan SONRA çalışır → segment doğru hesaplandı, sadece görünüm filtrelendi. Bu beklenen davranıştır; segment FIXED CLV ile dondurulduğu için sağlamdır.
E
"Top 10 ürünün toplam ciroya % katkısı 100% diyor (yanlış)"

Pareto'da "RANK ≤ 10" table calc filter kullanıyorum, % of total payda otomatik 10 ürünün toplamını alıyor.

→ Çözüm: Payda olarak { FIXED : SUM([Sales]) } kullan. Table calc filter HIDE eder ama LOD bunu görmez ve gerçek toplamı verir. Bu, Pareto / contribution analizinde 1 numaralı best practice.

2.4 Pratik Cheat Sheet

Hızlı başvuru için 6 ana hata-çözüm: dashboard'larda tıkandığında bu listeyi kontrol et.

FIXED filtreden etkilensin istiyorum
→ Filtreyi Add to Context'e taşı. Bu, FIXED'ı etkileyebilen tek view filtresidir.
FIXED hızı düştü
→ Boyut kardinalitesini düşür. Extract'a "Compute Calculations Now" çalıştır; Tableau Server'da pre-materialize edilir.
EXCLUDE etkisiz çalışıyor
→ Çıkardığın boyut view'da değil. Detail rafına ekle ki LOD onu "görsün".
INCLUDE Avg sonucu yanlış
→ Dış aggregate seçimi yanlış. AVG of AVG ağırlıksızdır; ciroya göre weighted gerekiyorsa SUM(...)/SUM(...) yaz.
Pareto / % of total bozuk
→ Table calc filter HIDE eder, TOTAL bilir. Payda olarak { FIXED : SUM(...) } kullan.
LOD'da SUM(SUM) hatası
→ LOD zaten aggregate döndürür. Dış agregat olarak MIN/MAX/AVG([LOD]) kullan; SUM çoğullar.

3. 18 Gerçek Hayat Egzersizi

Sekmeler arasında geçiş yap, her örnek varsayılan olarak kapalıdır. Başlığa veya sağdaki Detay butonuna tıklayarak açabilirsin.

FIXED · 01

Trendyol — 2024 Q1 Müşteri Kohortu Geri Dönüş Analizi

Trendyol CRM / Cohort Orta
Şirket: Trendyol (e-ticaret) Veri: 38M kullanıcı · 410M sipariş satırı Çeyrek: 2024 Q1'de 1.2M yeni kullanıcı
Performans pazarlama ekibi, 2024 Q1'de kazanılan müşterilerin sonraki çeyreklerde ne kadar harcadığını görmek istiyor. Yıl/Ay filtresi değiştiğinde bile kohort etiketi sabit kalmalı.
İlk Sipariş Tarihi
{ FIXED [Customer ID] :
   MIN([Order Date]) }
Acquisition Cohort
DATETRUNC('quarter', [İlk Sipariş Tarihi])
Retention Revenue
IF [Acquisition Cohort] = #2024-01-01#
   THEN [Sales] END

Neden FIXED?

2024 Q3 dashboard görüntüsünde kullanıcı Q3'te aktifse ama kazanım tarihi Q1'se, onu Q1 kohortuna saymak gerekiyor. Normal MIN() dimension filtresine takılır, "Q3 verisi içinde minimum tarih" verir → kohort kayar.

  • Customer ID 12.5M kardinaliteye sahip — performans için extract'ı materyalize et.
  • YEAR yerine DATETRUNC('quarter') tercih et; çeyreklik kohort raporlama standardıdır.
Beklenen sonuç: 2024 Q1 kohortu = 1.2M kullanıcı, Q2 ortalama harcama ₺412, Q3 ₺387, retention rate %37.
Customer IDİlk SiparişCohort2024 Toplam Harcama
TY-8824312022-03-112022 Q1₺ 14.300
TY-9931272024-02-082024 Q1₺ 1.220
TY-1100452024-04-192024 Q2₺ 870
FIXED · 02

Migros Sanal Market — Müşteri Yaşam Boyu Değeri (CLV) Segmentasyonu

Migros Finans / Müşteri Orta
Şirket: Migros (perakende) Müşteri: 7.4M aktif Migros Money üyesi Sepet ortalaması: ₺ 487
CRM ekibi 2025 lansman kampanyasında müşterileri Bronze · Silver · Gold · Platinum olarak segmentlere ayıracak. Sipariş kırılımlı tabloda her satıra müşterinin tüm zamanlardaki CLV'si yansıtılmalı.
CLV (Müşteri Bazında)
{ FIXED [Customer ID] :
   SUM([Sales]) }
Segment
IF     [CLV] >= 25000 THEN "Platinum"
ELSEIF [CLV] >= 10000 THEN "Gold"
ELSEIF [CLV] >= 3000  THEN "Silver"
ELSE                            "Bronze"
END

Çalışma mantığı

  • FIXED, Customer ID bazında tüm satırlara aynı toplamı dağıtır.
  • Order ID'yi de görünüme düşürdüğünde CLV değişmez — çünkü FIXED sipariş seviyesinden değil müşteri seviyesinden hesaplanır.
  • SUM([CLV]) demek yanlıştır: çoğullamaya yol açar. MIN/MAX/AVG([CLV]) kullan.
Beklenen dağılım (Migros 2024):
Bronze %52 · Silver %31 · Gold %13 · Platinum %4 → ciroya katkıları sırasıyla %14 · %29 · %33 · %24.
FIXED · 03

Garanti BBVA — Şehrin Bölge İçi Kredi Kartı Pazar Payı

Garanti BBVA Bankacılık / KPI Orta
Şirket: Garanti BBVA Bonus Veri: 81 il × 7 bölge × 14M kart 2024 KK harcaması: ₺ 2.1 trilyon
Pazarlama dashboard'unda şehir filtresi seçildiğinde dahi her şehrin kendi bölgesindeki yüzde payı sabit görünmeli (ülke geneli değil). Category filtresi ise dinamik etkilemeli.
Bölge Toplamı
{ FIXED [Region] :
   SUM([Card Spend]) }
Şehrin Bölge Payı
SUM([Card Spend]) /
SUM([Bölge Toplamı])

Filtre tuzağı

Şehir filtresi Add to Context'e alınmazsa pay yanlış hesaplanır. Ama tam burada FIXED'ın gücünü kullanırız: Marmara filtrelendiğinde dahi İstanbul, Marmara'nın %62'si bilgisini sabit tutmak istiyoruz → context'e ALMA.

  • Region kardinalitesi düşük (7) → ucuz hesaplama.
  • Müşteri segmenti (mass / affluent / private) eklendiğinde yine doğru çalışır.
Beklenen: İstanbul Marmara'nın %62'si, Bursa %14, Kocaeli %11, Sakarya %5...
FIXED · 04

MediaMarkt — Her SKU İçin Tarihsel Zirve Ay (Stok Planlama)

MediaMarkt Tedarik / Sezonsalite Üst
Şirket: MediaMarkt Türkiye SKU: 47.000 aktif ürün Black Friday: Yıllık cironun %18'i Kasım
Stok planlama ekibi her SKU için tarihsel olarak en yüksek satış yapılan ay'ı bulup, gelen yıl o aylarda %30 stok artışı planlayacak. Sonuç tabloda her ürünün karşısında tek bir "peak ay" yazmalı.
Ürün-Ay Toplamı
{ FIXED [SKU], DATETRUNC('month',[Order Date]) :
   SUM([Quantity]) }
SKU Peak Quantity
{ FIXED [SKU] :
   MAX([Ürün-Ay Toplamı]) }
Is Peak Flag
IF [Ürün-Ay Toplamı] = [SKU Peak Quantity]
   THEN "Peak Month"
ELSE "-" END

Nested LOD

İki seviyeli zincir: önce SKU + Ay toplamı, sonra SKU seviyesinde bu aylık toplamların maksimumu. Tableau iç LOD'u önce çalıştırır, sonra dış LOD'u uygular.

  • Top N filtresi koyacaksan SKU'yu Context'e ekle, aksi halde FIXED yine tüm SKU'lar üzerinden çalışır.
  • Yıllık peak için DATETRUNC('year', ...)'a değiştir.
Örnek bulgu: "PS5 Slim" peak ay → Kasım, "Klima 12000 BTU" → Temmuz, "Çamaşır makinesi" → Eylül.
FIXED · 05

Yemeksepeti — Tek Sefer ve Tekrarlayan Müşteri Ayrımı

Yemeksepeti Retention Orta
Şirket: Yemeksepeti Kayıtlı kullanıcı: 25M Hedef: One-time oranını %42'den %35'e indirmek
Görünümde ay filtresi olsa da, müşterinin tüm tarih boyunca verdiği toplam sipariş sayısına göre "One-time" / "Repeat" / "Loyal" segmenti üretilmeli. Filtre sonrası analiz değil, gerçek davranış lazım.
Tüm Zamanlardaki Sipariş Sayısı
{ FIXED [Customer ID] :
   COUNTD([Order ID]) }
Müşteri Tipi
IF     [Toplam Sipariş] = 1
   THEN "One-time"
ELSEIF [Toplam Sipariş] <= 5
   THEN "Repeat"
ELSE "Loyal"
END

Niye tarih filtresi etkilememeli?

"2024 Ocak" filtrelendiğinde tek sipariş görünenleri tek-sefer saymak yanıltıcı olur. Kullanıcı 2023'te 12 sipariş vermiş olabilir. FIXED tarihten bağımsız tüm geçmişe bakar.

  • YouFoody'de yapılan bir A/B test'te yanlış segmentasyon kampanya CTR'ını %38 düşürmüştür — gerçek bir tuzak.
  • Promosyon hedeflemesi için One-time'lar push notification kohortuna düşer.
FIXED · 06

Türk Telekom Kurumsal — Top 50 Müşterinin Pareto Payı

Türk Telekom B2B / Sales Ops Üst
Şirket: Türk Telekom Kurumsal Müşteri: 8.700 kurumsal hesap Veri tabanı: Snowflake fact_revenue 2.4B satır
Yönetim Kurulu sunumunda "Top 50 müşterimiz toplam B2B cironun yüzde kaçını yapıyor?" sorusuna anlık cevap verilmeli. Top 50 listesi tüm zamanlardan gelmeli, ama yüzde seçili dönem cirosu üzerinden hesaplanmalı.
Müşteri Toplam Cirosu (Tüm Zaman)
{ FIXED [Customer ID] :
   SUM([Revenue]) }
Müşteri Rank
// Window calc — sıralama için
RANK(SUM([Müşteri Toplam Cirosu]),
     'desc')
Top50 Share
SUM(IF [Müşteri Rank] <= 50
       THEN [Revenue] END)
/ SUM([Revenue])

İki seviyeli zekâ

  • FIXED: müşterinin tarihsel ciro etiketi → sıralama referansı.
  • Window RANK: sıralama mantığı.
  • Pay (Top50 cirosu) ile payda (toplam ciro) farklı kapsamlardan: pay = sabit liste, payda = filtreli dönem.
Pareto bulgusu: Türk Telekom Kurumsal'da Top 50 müşteri B2B cironun ~%52'sini yapıyor → klasik Pareto 80/20'den daha sağlıklı bir yapı.
EXCLUDE · 01

Vakıfbank — Aylık Harcamanın Yıllık İçindeki Payı

Vakıfbank Bankacılık / Finans Orta
Şirket: Vakıfbank Worldcard 2024 KK harcama: ₺ 1.8 trilyon Veri: 12M kart × 480M işlem
CRM raporu için Yıl-Ay kırılımındaki tabloda her ayın kendi yılı içindeki yüzde payı görünsün. Aralık ayı yılbaşı etkisiyle tepe yapar, Ağustos dip — bunu ay gözüne yazılı yüzdeyle ispatlayalım.
Yıllık Toplam (Ay Çıkar)
{ EXCLUDE MONTH([Tx Date]) :
   SUM([Spend]) }
% of Year
SUM([Spend]) /
SUM([Yıllık Toplam])

Ayrıntı

Görünümde YEAR ve MONTH varken EXCLUDE MONTH dersek yalnızca yıl seviyesinde toplar; her ay satırına yıl toplamı dağıtılır.

  • WINDOW_SUM ile de yapılabilir ama dashboard'da pencere yönü/kapsamı kayar; LOD daha kararlıdır.
  • Field formatını % yapmayı unutma.
Beklenen: Aralık ~%11.8, Kasım %9.4, Ağustos %6.7. Ramazan / Eylül okul dönemi sıçramaları görünür.
EXCLUDE · 02

LC Waikiki — Ürünün Kategori Cirosuna Katkısı

LC Waikiki Perakende / Hazır Giyim Orta
Şirket: LC Waikiki Kategori: Erkek · Kadın · Çocuk · Bebek · Spor SKU: 28.000 ürün
Ürün bazlı tabloda her satırda o ürünün ait olduğu kategori toplamı ve kategoriye yüzde katkısı görünmeli. Region (Marmara, Ege...) eklendiğinde bu hesap region kırılımına saygı duymalı.
Kategori Toplamı
{ EXCLUDE [Product Name] :
   SUM([Sales]) }
Ürün Katkısı
SUM([Sales]) /
SUM([Kategori Toplamı])

FIXED ile farkı

FIXED [Category] da aynı görünür — ama Region eklendiğinde FIXED Region'ı yok sayar; EXCLUDE diğer boyutları korur. "Görünümde olan diğer kırılımlardan etkilensin ama bu birinden değil" diyorsan EXCLUDE seç.

Bulgu: Erkek/Tişört "Basic V Yaka" tek başına Erkek kategorisinin %2.4'ünü yapıyor; en yoğun katkıdaki SKU.
EXCLUDE · 03

Yemeksepeti — Şehrin Ülke Ortalamasından Teslimat Süresi Sapması

Yemeksepeti Q-Commerce / Ops Üst
Şirket: Yemeksepeti Şehir: 65 il aktif Ülke ort. teslimat: 32 dakika
Operasyon ekibi her şehrin ülke ortalamasından kaç dk saptığını görmek istiyor. Pozitifler (yavaş) kırmızı, negatifler (hızlı) yeşil renklenecek; Bursa, Eskişehir gibi outlier şehirler vurgulanacak.
Ülke Ortalama Süre
{ EXCLUDE [City] :
   AVG([Delivery Min]) }
Sapma (Δ dk)
AVG([Delivery Min]) -
AVG([Ülke Ortalama Süre])

Renk paleti önerisi

  • Diverging palet (kırmızı–yeşil) ile sıfır eşiğinde nötr renk kullan.
  • Tooltip'e şehir, ülke ortalaması ve şehrin değerini birlikte koy.
Tuzak: Country boyutu görünümde yoksa LOD anlamsız sonuç verir. Country'i en azından Detail rafına ekle.

Beklenen bulgu: İstanbul Anadolu +6 dk (yoğun trafik), Eskişehir –4 dk (kompakt şehir), Şanlıurfa +9 dk (kurye yetersiz).

EXCLUDE · 04

BIM — Mağaza Günlük Cirosu vs Haftalık Ortalama

BIM Perakende / Anomaly Üst
Şirket: BIM Birleşik Mağazalar Mağaza: 11.700 nokta Günlük POS satırı: 84M
Mağazanın günlük cirosunu içinde bulunduğu haftanın ortalamasıyla karşılaştır. Sapma %10'u geçen günler "anomali" işaretlensin; merchandising ekibine slack alarmı gitsin.
Haftalık Ortalama (Gün Çıkar)
{ EXCLUDE [Order Date] :
   AVG(
      { FIXED DATETRUNC('week',[Order Date]),
                [Store ID] :
        SUM([Sales]) }
   )
}
Day vs Week %
(SUM([Sales]) - AVG([Haftalık Ort]))
/ AVG([Haftalık Ort])
Anomaly Flag
IF ABS([Day vs Week %]) > 0.10
   THEN "⚠ Anomaly"
ELSE "OK" END

Nested LOD

İçerideki FIXED, mağaza × hafta toplamı. Dıştaki EXCLUDE gün boyutunu kaldırarak haftalık ortalamayı her güne yansıtır.

  • Bayram günleri exclusion listesi tutarsan false positive azalır.
  • Şampuan kampanyası gibi promosyonlar genelde +%15 sapma yaratır → flagging eşiği 10% gerçekçi.
EXCLUDE · 05

Sabancı Holding İK — Departman İçi Ücret Eşitliği

Sabancı Holding İK / Pay Equity Orta
Şirket: Sabancı Holding (varsayımsal) Çalışan: 56.000 Departman: 14 şirket × 8 ana departman
İK Diversity ekibi, her çalışanın maaşının kendi departmanının ortalamasından ne kadar saptığını dashboard'a koymak istiyor — gender pay gap analizinin ön adımı.
Departman Ortalama Maaş
{ EXCLUDE [Employee] :
   AVG([Salary]) }
Salary Δ %
(AVG([Salary]) - AVG([Dept Avg]))
/ AVG([Dept Avg])

Niye EXCLUDE, FIXED değil?

Görünüme Title (Junior, Mid, Senior, Lead) eklediğinde FIXED bunu görmezden gelir; EXCLUDE ise Title bazında ortalama alır → "aynı kıdem-aynı departman" benchmark'ı oluşur. Bu, gerçek pay-equity raporunun standart yöntemidir.

Yan analiz: Δ<-15% olan kadın çalışanları topla → cinsiyet × kıdem matrisi → red flag listesi.
EXCLUDE · 06

Akbank — Müşteri Segmenti İçinde Şehir Ciro Payı

Akbank Bankacılık / CRM Üst
Şirket: Akbank Plus Segment: Mass · Affluent · Private · Premier · Genç Şehir: 81 il
Görünümde Segment ve City var. Her şehrin kendi segmenti içindeki ciro payını yüzde olarak göstereceğiz: "Affluent içinde İstanbul %42" gibi. Heatmap'te sütunlar segment, satırlar şehir.
Segment Toplamı
{ EXCLUDE [City] :
   SUM([Revenue]) }
Şehrin Segment Payı
SUM([Revenue]) /
SUM([Segment Toplamı])

Dashboard yorumu

  • Heatmap'te şehirleri Y, segmenti X eksenine yerleştir.
  • Renk olarak bu yüzdeyi kullan; her sütun (segment) kendi içinde 100% normalize görünür.
İleri seviye: Çoklu boyut çıkarmak için EXCLUDE [City], [Sub-Segment] kullanılabilir.
INCLUDE · 01

Akbank — Bölge Bazında Müşteri Başına Ortalama Harcama

Akbank Bankacılık / Avg of Avg Orta
Şirket: Akbank Müşteri: 12M aktif Görünüm: 7 bölge bazında özet
Görünümde sadece Region var. Her bölgede müşteri başına ortalama aylık harcama'nın ortalaması (avg of customer means) gösterilmeli — büyük müşterilerin ezici etkisinden korunmak için.
Müşteri Aylık Harcama
{ INCLUDE [Customer ID] :
   SUM([Spend]) }
Region Avg per Customer
AVG([Customer Spend])
Robust Median
MEDIAN([Customer Spend])

Niye INCLUDE?

SUM([Spend]) / COUNTD([Customer ID]) aynı sonucu verir ama Category, Year vs. eklendiğinde tutarlılığı kaybedebilir. INCLUDE ile "hesaplama daima müşteri bazında yapılsın, sonra ne agregat istersem onu uygulayayım" netliği gelir.

Beklenen: Marmara ₺ 4.200 / ay, Ege ₺ 3.150, Karadeniz ₺ 2.080. Median değerler %30 daha düşük → outlier private müşteri etkisini düşürüyor.
INCLUDE · 02

Hepsiburada — Kategori Bazında Sepet Boyutu (Basket Size)

Hepsiburada E-ticaret / Davranış Orta
Şirket: Hepsiburada Sipariş/yıl: 215M Genel sepet ort.: 3.4 ürün
"Hangi kategori sepete daha çok ürün katıyor?" sorusu. Görünümde Category var; sipariş seviyesinde inip ürün adedi toplamak, sonra kategori için ortalamasını almak istiyoruz.
Sipariş Başına Adet
{ INCLUDE [Order ID] :
   SUM([Quantity]) }
Category Avg Basket
AVG([Order Qty])

Sub-bag prensibi

Kategori birden fazla siparişi kapsar; INCLUDE Order ID seviyesinde toplam çıkarır, sonra dış AVG bunları kategoriye göre ortalama alır.

  • Kestirme: SUM([Quantity])/COUNTD([Order ID]) → ama LOD niyeti açıkça belgeler.
  • Median ile birlikte göstererek dağılımı anla; Kozmetik kategori medianı 3, mean'i 5.7 → kuyrukta büyük sepetler var.
Beklenen: Elektronik 1.8 · Giyim 4.2 · Kozmetik 5.7 · Süpermarket 11.3 · Kitap 2.1.
INCLUDE · 03

Migros — Mağaza Bazında Günlük Ortalama Çalışan Sayısı

Migros İK / Vardiya Planlama Orta
Şirket: Migros (perakende) Mağaza: 3.150 nokta Çalışan: 47.000 (vardiyalı)
Operasyon, her mağazanın günlük ortalama açılan vardiyada kaç çalışan olduğunu dashboard'a koysun istiyor — kapasite planlamasının temel KPI'ı.
Günlük Çalışan
{ INCLUDE [Shift Date] :
   COUNTD([Employee ID]) }
Avg Daily Headcount
AVG([Daily Headcount])

Bağlam

  • Görünüm Store, hesap günlük olmalı → INCLUDE Shift Date.
  • COUNTD eşsiz çalışan sayar; aynı çalışan iki vardiya yapsa bile bir sayılır.
Beklenen: M Migros (mahalle): 7-9 kişi/gün, MM (orta): 12-15, MMM (büyük): 22-28, Migros Jet: 4-5.
INCLUDE · 04

Turkcell PMO — Departman Çalışan Başına Aktif Proje

Turkcell PMO / Workload Orta
Şirket: Turkcell Çalışan: 12.500 (kurumsal) Aktif proje: 3.700
CFO ve CHRO ortak görüşmesinde "iş yükü adil dağılıyor mu?" sorusunu yanıtlayacaksınız. Görünüm Departman; mantık çalışan bazında olmalı.
Çalışan Başına Proje
{ INCLUDE [Employee] :
   COUNTD([Project ID]) }
Dept Workload (Avg)
AVG([Projects per Employee])
Burnout Risk
PERCENTILE([Projects per Employee], 0.95)

Yan analiz

P95 ile "top %5 en yüklü çalışan"ı yakalarsın; departman ortalaması 2.4 olabilir ama P95 8 ise burnout sinyali. Yan yana göstermek tek başına ortalamadan daha aydınlatıcıdır.

Beklenen: Dijital Servisler ort. 3.1 / P95 9; Çağrı Merkezi ort. 1.0 / P95 1.3 → çok farklı dinamikler.
INCLUDE · 05

Ziraat Bankası — Şube Başına Günlük Tekil Müşteri (Footfall)

Ziraat Bankası Bankacılık / Footfall Üst
Şirket: Ziraat Bankası Şube: 1.785 Aylık ortalama ziyaret: 18M
Şube ağı yönetimi her şubenin günlük tekil müşteri trafiği ortalaması ve P90'ını görmek istiyor — küçük şubelerin tepe günlerde nasıl davrandığını anlamak için.
Günlük Tekil Müşteri
{ INCLUDE [Visit Date] :
   COUNTD([Customer ID]) }
Avg Daily Footfall
AVG([Daily Customers])
P90 Footfall
PERCENTILE([Daily Customers], 0.9)

Operasyonel zekâ

  • Avg + P90 birlikte → "stabil" ve "patlayan" şubeleri ayırt edebilirsin.
  • Pazar günü trafiği yoktur; IF DATEPART('weekday')<>1 filtresi koy.
  • Maaş günü (her ayın 15'i) tepe noktasıdır; ekstra personel kararı için P90 değeri esastır.
Beklenen: Kırsal şube ort. 32 / P90 58; merkez İstanbul ort. 410 / P90 720.
INCLUDE · 06

Teknosa — Ürün Sipariş Başı Adet ve Reorder Point

Teknosa Tedarik Zinciri / Stok Üst
Şirket: Teknosa SKU: 8.500 aktif Lead time: 7-21 gün (tedarikçi farkı)
Stok ekibi her ürünün siparişlerde ortalama kaç adet satıldığı'na bakarak basit bir reorder point (minimum stok seviyesi) önerisi üretmek istiyor. Lead time × ortalama × güvenlik katsayısı.
Sipariş Başına Adet
{ INCLUDE [Order ID] :
   SUM([Quantity]) }
Avg Order Qty (Product)
AVG([Order Qty])
Reorder Point
AVG([Order Qty])
* [Lead Time Days]
* 1.2   // %20 safety stock

İş zekâsı bonusu

1.2 katsayısı %20'lik güvenlik stoğu (safety stock) yansıtır. INCLUDE ile elde ettiğin gerçek "ortalama sipariş adedi" üzerine bu basit kural uygulamada çalışan bir reorder point üretir.

Örnek: "Powerbank 20000 mAh" — ort. 1.4 adet × 14 gün lead × 1.2 = ~24 adet altına düştüğünde sipariş tetiklenmeli.

4. FIXED vs EXCLUDE vs INCLUDE — Hızlı Karşılaştırma

Aynı veride aynı ölçümü farklı LOD'larla yazdığında nasıl davranır?

ÖzellikFIXEDEXCLUDEINCLUDE
Görünüm boyutlarından etkilenir mi?HayırKısmen (yalnızca belirtilen çıkarılır)Evet (üstüne ekler)
Dimension filtresinden etkilenir mi?Hayır (Context dışında)EvetEvet
GranulariteTamamen sen belirlersinGörünüm – belirttiklerinGörünüm + belirttiklerin
Tipik kullanımCLV, cohort, top-N, % of totalYüzde paylar, sapma, benchmarkAvg of avg, kişi/sipariş başı metrikler
Performans riskiYüksek kardinalite tehlikeliGenelde ucuzGenelde ucuz

5. Hızlı Sınav

Arka planda 40 soruluk havuz var; her sayfa yenilemesinde rastgele 4 soru gelir. Sağdaki butonla yenilemeden de yeni 4 soru çekebilirsin.

Soru havuzu yükleniyor...

6. Sıkça Yapılan Hatalar

  • FIXED + dimension filter: Filtre etkisinin gelmesi gerektiğini fark etmemek → Filtreyi Context'e taşı.
  • SUM içinde SUM: LOD zaten aggregate döner; dış aggregate olarak yine SUM almak çoğullamaya neden olur. MIN/MAX/AVG uygundur.
  • Yüksek kardinalite FIXED: Customer × Order × Product gibi geniş seviyelerde performans çöker; mümkünse extract'ı materyalize et.
  • EXCLUDE dimensiyonu görünümde yokken: EXCLUDE etkisiz olur; kullanmadan önce o boyutun rafalarda (en az Detail) olduğundan emin ol.
  • Avg of avg yanılgısı (INCLUDE): Her grup eşit ağırlık almaz aslında; gerekiyorsa weighted average yaz.
  • Date trunc unutmak: FIXED [Order Date] her gün ayrı bir gruptur; ay seviyesinde istiyorsan DATETRUNC('month', ...) şart.
Tableau LOD Master Class · 18 örnek · tüm hesaplamalar Tableau 2020+ ile uyumludur. Şirket isimleri pedagojik amaçlı kullanılmıştır; veriler hayalidir.
Kopyalandı

Bir Cevap Yazın

mutmainkalb sitesinden daha fazla şey keşfedin

Okumaya devam etmek ve tüm arşive erişim kazanmak için hemen abone olun.

Okumaya Devam Edin

mutmainkalb sitesinden daha fazla şey keşfedin

Okumaya devam etmek ve tüm arşive erişim kazanmak için hemen abone olun.

Okumaya Devam Edin