Ana içeriğe geç
Kesit Power BI
İleri · Zaman Zekâsı

Zaman serisi analizi: gün etkisi, mevsimsellik, tahmin ve büyüme oranları

Bir satış serisini bileşenlerine ayırmak: haftanın günü etkisi, çalışma çizelgesi, mevsimsellik endeksi, yerleşik tahmin ve geriye dönük test, DAX ile basit tahmin, CAGR ve aylık bileşik büyüme.

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

Zaman zekâsı ve Gelişmiş zaman hesapları derslerinde dönemleri karşılaştırmayı (YTD, geçen yıl, hareketli ortalama) öğrendin. Bu derste soruyu değiştiriyoruz: Seri neden böyle hareket ediyor ve bir sonraki ay ne bekleyebiliriz?

Bir zaman serisinin dört bileşeni

BileşenNe demek?Anadolu Market'te
Eğilim (trend)Uzun dönemli yönYıllık net satış hızla büyüyor
Mevsimsellik (seasonality)Takvime bağlı, her yıl tekrarlanan desenKasım–Aralık yüksek, Ocak ve Nisan düşük
Döngü (cycle)Takvime bağlı olmayan, yıllardan uzun dalgalar (ekonomik döngü)Üç yıllık veride ayırt edilemez
Düzensizlik (noise)Kalan rastgele oynamaTek bir büyük siparişin ayı yukarı çekmesi

Önce veriye bak: 2022 eksik bir yıl

Tarih tablosu 1 Ocak 2022'de başlıyor, ama ilk satış 22 Haziran 2022'de. Yıllık net satış: 2022'de 102.837 TL (yalnızca ~6 ay), 2023'te 400.870 TL, 2024'te 747.066 TL. Bu bilgi aşağıdaki her hesabı etkiler:

Kural: Analize başlamadan önce serinin başlangıç ve bitiş tarihini ve aradaki boş dönemleri yaz.

Haftanın günü etkisi

“Hangi gün daha çok satıyoruz?” sorusunun cevabı paydaya bağlıdır. Haftanın gününe göre toplam satış, o günden kaç tane olduğuna bağlı olarak yanıltabilir; bu yüzden gün başına ortalama hesaplanır:

Gün Başına Satış =
VAR Ilk = CALCULATE(MIN(Satislar[Tarih]), REMOVEFILTERS())
RETURN DIVIDE([Net Satış], COUNTROWS(FILTER(Tarih, Tarih[Tarih] >= Ilk)))

Payda, verinin başladığı günden itibaren o haftanın gününe düşen tüm takvim günleridir (satışsız günler dahil). Sonuç: Çarşamba 1.590 TL ile en yüksek, Perşembe 1.266 TL ve Pazartesi 1.268 TL ile en düşük; tüm günlerin ortalaması 1.354 TL.

Satışsız günler de gündür924 günün yalnızca 509'unda satış var. AVERAGEX(VALUES(Tarih[Tarih]), [Net Satış]) boş günleri atlar ve “satış olan günlerin ortalaması”nı verir: bu hesapta en yüksek gün Cumartesi (2.758 TL) çıkar. Birinci ölçü “ortalama bir Çarşamba ne getirir?”, ikincisi “satış olan bir Cumartesi ne getirir?” sorusunu cevaplar. Hangisini sorduğunu bil. Ayrıca az veride (1.620 satır) günler arasındaki farkın bir kısmı tesadüftür.

Çalışma çizelgesi (run chart) ve medyan çizgisi

Çalışma çizelgesi, zaman ekseninde bir ölçünün çizgi grafiği ve üzerinde medyan çizgisidir. Medyan, uç aylardan etkilenmediği için ortalamadan daha sağlam bir referanstır. Power BI'da çizgi grafiği seç, Analiz bölmesinden Medyan çizgisi ekle; ya da ölçüyle:

Aylık Medyan =
VAR Seri = FILTER(ADDCOLUMNS(ALLSELECTED(Tarih[YilAy]), "S", [Net Satış]), NOT ISBLANK([S]))
RETURN MEDIANX(Seri, [S])

Satış olan 31 ayın medyanı 40.258 TL. Okuma kuralı: Medyanın aynı tarafında art arda 6 ya da daha çok nokta varsa bu rastlantı değil, bir kaymadır (shift). Ekim 2023–Mart 2024 arası 6 ay, Mayıs–Aralık 2024 arası 8 ay üst üste medyanın üstünde: seri kalıcı olarak yukarı kaymış. Böyle bir durumda tek bir medyan çizgisi tüm dönemi temsil etmez; çizgiyi kayma noktasından sonra yeniden hesapla.

Mevsimsellik endeksi

Mevsimsellik endeksi = bir takvim ayının ortalama satışı / tüm ayların ortalama satışı. 1'in üstü “bu ay normalden güçlü”, altı “zayıf” demektir. 2022 eksik olduğu için yalnızca tam yılları (2023 ve 2024) kullan:

Ay Endeksi Tam Yıl =
VAR AyOrt = DIVIDE(
    CALCULATE([Net Satış], KEEPFILTERS(Tarih[Yil] IN {2023, 2024})),
    CALCULATE(DISTINCTCOUNT(Tarih[YilAy]), KEEPFILTERS(Tarih[Yil] IN {2023, 2024})))
VAR GenelOrt = CALCULATE([Net Satış], REMOVEFILTERS(Tarih), Tarih[Yil] IN {2023, 2024}) / 24
RETURN DIVIDE(AyOrt, GenelOrt)
OcaŞubMarNisMayHazTemAğuEylEkiKasAra
0,640,780,920,600,761,061,110,831,091,271,521,44

Toplam satırda endeks 1'dir (bütün ayların ortalaması kendine eşittir); bu iyi bir sağlama. Ama bir sorun var: Seri bir yılda %86 büyüdüğü için yılın son ayları, yalnızca takvim yüzünden değil eğilim yüzünden de yüksek çıkar. Endeksi eğilimden arındırmak için ya her yılı kendi ortalamasına bölüp yılları ortalarsın ya da önce eğilim çizgisini çıkarırsın (İleri istatistik dersindeki en küçük kareler). Kategori kırılımında ölçü her kategorinin kendi mevsimselliğini verir, çünkü REMOVEFILTERS(Tarih) yalnızca tarihi temizler.

Yerleşik tahmin ve geriye dönük test

Çizgi grafiğinde Analiz bölmesi → Tahmin (Forecast). Ön koşul: ekseni sürekli bir tarih (ya da tarih hiyerarşisi) olan, tek ölçülü bir çizgi grafik. Ayarlar:

Sonuncusu geriye dönük test (backtest, hindcast) için kullanılır: Son 3 ayı yok say, tahmin edilen 3 ayı gerçekleşenle karşılaştır. Tahmin gerçek değerlerin çok altında ya da üstündeyse, geleceğe dönük tahmine de güvenme. Yerleşik tahmin üstel düzeltmeye dayanır; sonuçları ölçü olarak modele yazılmaz, yalnızca o görselde yaşar.

DAX ile basit tahmin

Her ay için “son 3 ayın ortalaması” bir sonraki ayın naif tahminidir. Ölçü, içinde bulunduğu ayı görmeden önceki üç tam aya bakar; böylece geçmişin her ayında bir geriye dönük test yapmış olursun:

Naif Tahmin 3 Ay =
VAR Son = MAX(Tarih[Tarih])
RETURN DIVIDE(
    CALCULATE([Net Satış], DATESBETWEEN(Tarih[Tarih], EOMONTH(Son, -4) + 1, EOMONTH(Son, -1))),
    3)

Aralık 2024 için tahmin 78.158 TL (Eylül–Kasım ortalaması), gerçekleşen 94.001 TL: hata −%16,9. Büyüyen ve mevsimsel bir seride naif ortalama hep geriden gelir. İkinci yöntem geçen yıl × büyümedir:

Tahmin GY x Büyüme =
CALCULATE([Net Satış], SAMEPERIODLASTYEAR(Tarih[Tarih])) * (1 + 0.8)

Geçen yılın aynı ayı mevsimselliği taşır, büyüme katsayısı eğilimi. 2024'ün yıllık büyümesiyle (%86,4) Aralık 2023'ten (43.560 TL) yapılan tahmin 81.179 TL, hata −%13,6. Sabit katsayıyı bir ne olur (what-if) parametresine bağlarsan kullanıcı büyüme varsayımını kaydırıcıyla değiştirir.

Gelecek tarihlerTahmini gelecekteki aylarda göstermek için tarih tablosu o ayları da içermelidir. Bu modelin Tarih tablosu 31.12.2024'te biter; 2025 için bir değer görmek istersen önce tarih tablosunu uzatman gerekir.

Büyüme oranları: CAGR ve CMGR

Bileşik yıllık büyüme oranı (CAGR) = (Son / İlk)^(1 / yıl sayısı) − 1. Dönem boyunca her yıl aynı oranda büyüseydin hangi oranda büyümüş olurdun sorusunu cevaplar.

Yarıyıl CAGR Örnek =
VAR Bas = CALCULATE([Net Satış], DATESBETWEEN(Tarih[Tarih], DATE(2022, 7, 1), DATE(2022, 12, 31)))
VAR Son = CALCULATE([Net Satış], DATESBETWEEN(Tarih[Tarih], DATE(2024, 7, 1), DATE(2024, 12, 31)))
RETURN POWER(DIVIDE(Son, Bas), 1 / 2) - 1

Bileşik aylık büyüme (CMGR) aynı formülün ay sayısıyla yazılışıdır. Mevsim etkisini azaltmak için aynı ayları seç: Aralık 2023 → Aralık 2024 (12 ay) için CMGR = (94.001 / 43.560)^(1/12) − 1 = ayda %6,6. Ocak 2023 (zayıf ay) ile Aralık 2024'ü (güçlü ay) karşılaştırmak oranı şişirir. Uç noktalar tek aylık değerse gürültüye duyarlıdır; çeyreklik ya da 12 aylık toplamlarla çalışmak daha sağlamdır.

Anomali

Mevsimselliği ve eğilimi bilince, “beklenenden sapan” ayı ayırt edebilirsin: Nisan 2024 (34.234 TL) hem önceki hem sonraki aylardan belirgin düşük. Power BI'daki Anomali bul özelliği ve z-skoruyla işaretleme Analiz özellikleri ve yapay zekâ görselleri ile İleri istatistik derslerinde anlatılıyor. Bir anomaliyi raporlamadan önce veri hatası olup olmadığını (eksik yükleme, iptal dalgası) kontrol et.

Alıştırmalara geç (7)