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

Finansal raporlama: gelir tablosu, bütçe sapması, oranlar ve finansal fonksiyonlar

Satış ve maliyet verisinden küçük bir kâr-zarar tablosu kurmak (yardımcı tablo + SWITCH), bütçe sapması, oran panosu, FV/PV/PMT ile paranın zaman değeri, XNPV ve XIRR ile yatırım kararı ve ne olur parametresiyle duyarlılık.

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

Finans ekibi bir raporda üç şey arar: tutarlar bir gelir tablosu düzeninde mi, bütçeye göre neredeyiz ve bir kararın parasal değeri ne. Anadolu Market modelinde faaliyet giderleri Giderler, bütçesi GiderButce, türleri GiderTurleri tablosundadır; bilanço yoktur. Gelir tablosunu faaliyet kârına kadar gerçek veriyle kurarız. Şirket ölçeği öğretim için sıkıştırılmıştır: Giderler tutarları satışa göre küçük, Calisanlar[Maas] ile aynı ölçekte değildir.

Gelir tablosunun mantığı

Gelir tablosu (kâr-zarar tablosu, P&L) yukarıdan aşağı okunur; her satır bir öncekinden bir kalem düşer:

  1. Brüt satış: Liste fiyatıyla satış (adet × birim fiyat).
  2. − İndirimler → Satış (indirim sonrası)
  3. − İadeler → Net satış
  4. − Satılan malın maliyeti (SMM) → Brüt kâr. Brüt kâr / net satış = brüt marj.
  5. − Faaliyet giderleri (pazarlama, genel yönetim, personel) → FAVÖK (faiz, amortisman ve vergi öncesi kâr; İngilizcede EBITDA). Operasyonun nakit üretme gücüne yakın bir göstergedir.
  6. − Amortisman, faiz, vergi → Net kâr.

Modelde 5. satıra kadar inebiliriz: hazır [Gider] ve [Faaliyet Kârı] ölçüleri Giderler tablosunu kullanır. Amortisman ayrı tutulmadığı için buna tam FAVÖK değil, faaliyet kârı diyoruz. Dikkat: modeldeki [Net Satış] yalnızca iptalleri çıkarır, iadeleri değil. Muhasebe dilindeki net satış için iadeyi ayrıca düşmek gerekir. Bir ölçüye ad verirken hangi tanımı kullandığını açıklamasına yaz.

Modelden küçük bir kâr-zarar tablosu

Matrisin satırlarında “Brüt satış, İndirimler, …” gibi kalem adları olmalı; ama bu adlar modelde bir sütun değil. Kalıp: kalemleri tutan bir yardımcı tablo (Giriş → Veri gir) ve kalem başına doğru ölçüyü seçen bir SWITCH ölçüsü.

-- Yardımcı tablo: KZKalemleri (Sira, Kalem), Kalem sütunu Sira'ya göre sıralı
KZ Tutarı =
VAR IadeMaliyet = CALCULATE([Toplam Maliyet], Satislar[Durum] = "İade")
VAR NetSatis = [Net Satış] - [İade Tutarı]
VAR SMM = [Net Maliyet] - IadeMaliyet
RETURN SWITCH(SELECTEDVALUE(KZKalemleri[Sira]),
    1, CALCULATE([Brüt Tutar], Satislar[Durum] <> "İptal"),
    2, -[İndirim Tutarı],
    3, [Net Satış],
    4, -[İade Tutarı],
    5, NetSatis,
    6, -SMM,
    7, NetSatis - SMM)

Aynı mantığı yardımcı tabloyu sorgunun içinde kurarak deneyebilirsin:

EVALUATE
VAR Kalemler = SELECTCOLUMNS(
    { (1, "Brüt satış"), (2, "İndirimler"), (3, "Satış (indirim sonrası)"), (4, "İadeler"),
      (5, "Net satış"), (6, "Satılan malın maliyeti"), (7, "Brüt kâr") },
    "Sira", [Value1], "Kalem", [Value2])
VAR IadeMaliyet = CALCULATE([Toplam Maliyet], Satislar[Durum] = "İade")
RETURN ADDCOLUMNS(Kalemler, "Tutar", SWITCH([Sira],
    1, CALCULATE([Brüt Tutar], Satislar[Durum] <> "İptal"),
    2, -[İndirim Tutarı],
    3, [Net Satış],
    4, -[İade Tutarı],
    5, [Net Satış] - [İade Tutarı],
    6, -([Net Maliyet] - IadeMaliyet),
    7, [Net Satış] - [İade Tutarı] - ([Net Maliyet] - IadeMaliyet)))
KalemTutar (TL)
Brüt satış1.291.856
İndirimler−41.084
Satış (indirim sonrası)1.250.772
İadeler−80.835
Net satış1.169.937
Satılan malın maliyeti−743.418
Brüt kâr426.519 (marj %36,5)

Satılan malın maliyetinden iade edilen ürünlerin maliyeti (51.246 TL) düşüldü; ürün stoğa geri döndüğü varsayımıyla. Gider kalemleri tutarları negatif yazılır; böylece matrisin toplamı anlamlı olmaz ama her satır doğru okunur. Ara toplam satırlarını (Net satış, Brüt kâr) koşullu biçimlendirmeyle kalın göster; matrisin kendi toplam satırını kapat.

Kalem sırasıYardımcı tablonun Kalem sütununu “Sütuna göre sırala” ile Sira'ya bağla; yoksa kalemler alfabetik dizilir. Bu kalıp, Hesaplama grupları, alan parametreleri, görsel hesaplamalar dersindeki ölçü seçme mantığıyla akrabadır.

Bütçe sapması

Bütçe (ya da hedef) sapması iki biçimde verilir: tutar olarak (gerçekleşen − bütçe) ve yüzde olarak ((gerçekleşen − bütçe) / bütçe). Modeldeki Hedefler tablosu kategori ve ay düzeyindedir (ayrıntı düzeyi farkı için Hedef ve gerçekleşen dersine bak).

Bütçe Sapma Yüzdesi = DIVIDE([Net Satış] - [Hedef], [Hedef])

Toplamda net satış 1.250.772 TL, hedef 1.299.300 TL: sapma −48.528 TL, yani −%3,7. Yıllara göre: 2022 −%23,0, 2023 −%0,4, 2024 −%2,1. 2022'deki büyük açık bir performans sorunu değil; hedefler Ocak'tan, satışlar 22 Haziran'dan başlıyor. Sapmayı yorumlamadan önce iki tarafın aynı dönemi kapsadığını kontrol et.

Sapma işareti kaleme göre yorumlanır: satışta pozitif sapma iyi, maliyette kötüdür. Koşullu biçimlendirmede renk kuralını kaleme göre ters çevir. Oranlarda (marj gibi) sapma yüzde puan olarak verilir: %36,5 marj ile %35 hedef arasındaki fark +1,5 puandır, %4,3 değil.

Gider bütçesi: gerçek veriyle sapma

GiderButce gider türü ve ay düzeyindedir. Hazır ölçüler:

Gider Sapma Kontrol = [Gider] - [Gider Bütçe]

Gider tarafında işaret terstir: pozitif sapma bütçe aşımı, yani kötü haberdir. Örnek raporlar → Finansal Performans raporu bu ölçüleri ve GiderTurleri[Grup] kırılımını kullanır.

Oranlar ve oran panosu

OranTanımModelde
Brüt marjBrüt kâr / net satış[Kâr Marjı %] = %36,5
İndirim oranıİndirim / brüt satış[Ortalama İndirim %] = %3,2
İade oranı (satır)İade satırı / tüm satırlar[İade Oranı %] = %6,8
İade oranı (tutar)İade tutarı / satışDIVIDE([İade Tutarı], [Net Satış]) = %6,5
İptal oranıİptal satırı / tüm satırlar[İptal Oranı %] = %7,5

Aynı adlı oranın iki tanımı (satır ya da tutar bazlı) farklı sonuç verir; panoya hangisini koyduğunu yaz. Kategoriye göre tutar bazlı iade oranı Kozmetik'te %10,9, Spor'da %3,9. Oran panosunda her oranı kendi hedefi ve geçen yılı ile birlikte göster; tek başına bir yüzde iyi mi kötü mü söylemez. Pano tasarımı için Koşullu biçimlendirme ve KPI'lar dersine bak.

Paranın zaman değeri: FV, PV, PMT

Bugünkü 1 TL, bir yıl sonraki 1 TL'den değerlidir; çünkü bugün yatırıp faiz alabilirsin. DAX, Excel'deki finansal fonksiyonların aynısını içerir. İşaret kuralı da Excel'deki gibidir: senden çıkan para negatif, sana gelen pozitif.

FonksiyonSoruÖrnekSonuç
FV(oran, dönem, ödeme, [bd], [tür])Her ay 10.000 TL yatırırsam 12 ay sonra ne birikir? (aylık %3)FV(0.03, 12, -10000)141.920 TL
PV(oran, dönem, ödeme)3 yıl boyunca yılda 120.000 TL almanın bugünkü değeri? (%30)PV(0.30, 3, -120000)217.934 TL
PMT(oran, dönem, bd)500.000 TL krediyi 24 ayda aylık %3,5 ile öderken taksit?PMT(0.035, 24, -500000)31.136 TL

Oranın ve dönemin aynı birimde olmasına dikkat et: aylık taksit için aylık oran ve ay sayısı. Yıllık %42 nominal oran aylık 0,42 / 12 = 0,035'tir. Son bağımsız değişken tür (type) ödemenin dönem sonunda (0, varsayılan) mı başında (1) mı yapıldığını söyler: FV(0.03, 12, -10000, 0, 1) 146.178 TL döndürür.

EVALUATE
ADDCOLUMNS(GENERATESERIES(12, 36, 12),
    "Taksit", PMT(0.035, [Value], -500000),
    "Toplam Ödeme", PMT(0.035, [Value], -500000) * [Value])

Vade 12 aydan 36 aya uzayınca taksit 51.742 TL'den 24.642 TL'ye iner; ama toplam ödeme 620.904 TL'den 887.115 TL'ye çıkar.

Yatırım kararı: XNPV ve XIRR

Net bugünkü değer (NBD, NPV): Bir yatırımın tüm nakit akışlarını, istenen getiri oranıyla bugüne indirip toplamak. NBD > 0 ise yatırım istenen getiriden fazlasını kazandırır. İç verim oranı (İVO, IRR): NBD'yi sıfır yapan oran; yatırımın kendi getirisi.

DAX'ta düzensiz tarihli akışlar için XNPV(tablo, değer, tarih, oran) ve XIRR(tablo, değer, tarih) kullanılır. İndirgeme ilk akışın tarihine göre, (gün farkı / 365) üssüyle yapılır. Akışlarda en az bir negatif ve bir pozitif değer olmalı. Örnek: Depo otomasyonu için 1 Ocak 2025'te 300.000 TL yatırım; sonraki iki yıl boyunca her çeyrek 50.000 TL ek brüt kâr (varsayımsal bir proje):

EVALUATE
VAR Akis = SELECTCOLUMNS(GENERATESERIES(0, 8),
    "Tarih", EDATE(DATE(2025, 1, 1), 3 * [Value]),
    "Nakit", IF([Value] = 0, -300000, 50000))
RETURN ROW(
    "NBD (%25)", XNPV(Akis, [Nakit], [Tarih], 0.25),
    "İVO", XIRR(Akis, [Nakit], [Tarih]))

Sonuç: NBD 13.920 TL, İVO %30,6. Şirketin istediği getiri %25 ise proje kabul edilir (NBD pozitif, İVO > %25). İstenen getiri %35 olsaydı NBD −10.159 TL olurdu ve proje reddedilirdi.

Nakit akışı tablosuGerçek bir modelde nakit akışları bir tabloda (ör. Excel'den gelen bir yatırım planı) durur ve ölçü XNPV(Akislar, Akislar[Tutar], Akislar[Tarih], 0.25) biçiminde yazılır. Sorgu içinde SELECTCOLUMNS(GENERATESERIES(…)) ya da { (DATE(2025, 1, 1), -250000), … } tablo oluşturucusuyla küçük bir tablo kurmak deneme için yeterlidir.

Ne olur parametresiyle duyarlılık

NBD, varsayılan orana çok duyarlıdır. Segmentasyon dersindeki ne olur (what-if) parametresi kalıbı burada da işler: Modelleme → Yeni parametre → Sayısal aralık ile 0,10–0,40 arasında 0,05 adımlı bir “İskonto Oranı” parametresi oluştur; ölçü SELECTEDVALUE ile seçili oranı okur.

NBD Senaryo =
XNPV(Akislar, Akislar[Tutar], Akislar[Tarih],
     SELECTEDVALUE('İskonto Oranı'[İskonto Oranı], 0.25))

Parametre tablosunu bir çizgi grafiğin eksenine koyarsan duyarlılık eğrisini görürsün; eğrinin sıfırı kestiği nokta İVO'dur:

EVALUATE
VAR Akis = SELECTCOLUMNS(GENERATESERIES(0, 8),
    "Tarih", EDATE(DATE(2025, 1, 1), 3 * [Value]),
    "Nakit", IF([Value] = 0, -300000, 50000))
RETURN ADDCOLUMNS(GENERATESERIES(0.10, 0.40, 0.05), "NBD", XNPV(Akis, [Nakit], [Tarih], [Value]))

%10'da 59.949 TL, %20'de 27.750 TL, %30'da 1.336 TL, %35'te −10.159 TL. Satış tarafında aynı soruyu Segmentasyon dersindeki fiyat senaryosuyla sorarsın: fiyat %5 artarsa adet ve kâr ne olur? İkisini bir sayfada birleştirmek, yatırımın getirisinin fiyat varsayımına ne kadar bağlı olduğunu gösterir.

Alıştırmalara geç (9)