Zaman Serisi Analizi: Trend, Mevsimsellik ve Tahminleme

Hangi tahmin yöntemi işinize yarar ve bunu nasıl ölçersiniz? Trend ve mevsimselliği ayrıştırmadan baseline kurmaya, zamansal doğrulamadan hata metriklerine kadar tahminleme sürecini Python örnekleriyle anlatıyorum.

  • İstatistik
  • Makine Öğrenmesi

Zaman serisi analizi nedir?

Zaman serisi, belirli zaman noktalarında veya aralıklarında sıralı biçimde gözlemlenen değerlerden oluşur. Zaman serisi analizi; bu gözlemlerdeki yapıyı, bağımlılıkları ve değişimi inceleyerek açıklama, izleme veya tahmin üretme sürecidir.

Günlük satışlar, saatlik elektrik tüketimi, aylık enflasyon, web sitesi ziyaretleri, çağrı merkezi talepleri ve sosyal medya mention hacmi zaman serilerine örnektir. Bu verilerde gözlemlerin sırası önemlidir: bugünkü satışlar, çoğu zaman dünkü satışlardan ve haftanın gününden bağımsız değildir.

1

Açıklama

Hangi örüntüler gözlenen değişimi açıklıyor? Trend mi, mevsimsellik mi, kampanya etkisi mi?

2

Tahmin

Geçmiş örüntüler ve bilinen etkenler ışığında gelecek dönemlerde ne beklenebilir?

Bu yazının odağı tahminleme. ARIMA ailesinin teorik kurulumu — ACF/PACF okuma, birim kök testleri, auto.arima() ile model seçimi — ayrı bir yazıda R üzerinden işleniyor: Zaman Serisi Analizine Giriş. Burada ise yöntem seçimi, baseline kurma ve tahmin doğruluğunu ölçme üzerinde duruyorum.

Zaman serisinin temel bileşenleri

Bir zaman serisini anlamak için gözlenen değerin hangi örüntülerden oluşabileceğini düşünmek gerekir. Klasik ayrıştırmada trend, mevsimsellik ve düzensiz bileşenler ele alınır; bazı durumlarda döngüsel hareketler de ayrı değerlendirilir.

BileşenAçıklamaÖrnek
TrendUzun vadeli genel yönelim.Yıllar içinde artan müşteri sayısı.
MevsimsellikSabit ve bilinen takvim aralıklarında tekrar eden örüntü.Her aralık ayında artan perakende satışları.
DöngüSabit uzunluğu olmayan, daha uzun dönemli genişleme ve daralma hareketleri.Ekonomik konjonktürle ilişkili talep değişimi.
Düzensiz bileşenDiğer bileşenlerle açıklanamayan kısa vadeli değişim.Beklenmedik bir kesinti sonrası talep dalgalanması.

Toplamsal ve çarpımsal yapı

Toplamsal modelde bileşenler bir araya gelerek gözlemi oluşturur. Çarpımsal modelde ise mevsimsel dalgalanmanın büyüklüğü serinin seviyesiyle birlikte artar.

Ayrıştırma gösterimi
# Toplamsal ayrıştırma
Y[t] = Trend[t] + Seasonal[t] + Remainder[t]

# Çarpımsal ayrıştırma
Y[t] = Trend[t] * Seasonal[t] * Remainder[t]

Satışlar yükseldikçe yaz aylarındaki ek satışlar da mutlak olarak büyüyorsa çarpımsal yapı ya da logaritmik dönüşüm anlamlıdır. Seride sıfır veya negatif değerler varsa çarpımsal yaklaşım doğrudan uygulanamaz — logaritma tanımsız kalır.

Trend analizi nasıl yapılır?

Trend, serinin uzun vadeli yönelimini gösterir. Ancak her yükseliş kalıcı büyüme anlamına gelmez; takvim etkileri, kampanyalar, ölçüm değişiklikleri ve uç değerler trend izlenimini kolayca değiştirir.

Hareketli ortalama

Hareketli ortalama, kısa vadeli dalgalanmaları yumuşatarak daha genel eğilimi görmeyi sağlar. Günlük satışlarda 7 günlük hareketli ortalama, haftanın günlerinden kaynaklanan dalgalanmayı büyük ölçüde temizler.

pandas ile hareketli ortalama
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("gunluk_satis.csv", parse_dates=["tarih"])
df = df.sort_values("tarih").set_index("tarih")

df["ortalama_7g"] = df["satis"].rolling(7, min_periods=7).mean()

df[["satis", "ortalama_7g"]].plot()
plt.title("Günlük satışlar ve 7 günlük hareketli ortalama")
plt.tight_layout()
plt.show()

Hareketli ortalama bir tahmin modeli değildir; görselleştirme ve yumuşatma aracıdır. Pencere büyüdükçe seri daha fazla yumuşar ama ani değişimlere daha geç tepki verir. min_periods=7 yazmak, ilk altı günde yarım pencereyle hesaplanmış yanıltıcı değerler üretilmesini engeller.

Doğrusal trend

Basit doğrusal regresyon, zaman ile değer arasında yaklaşık doğrusal bir ilişki varsa kullanılabilir. Gerçek serilerde trend doğrusal olmak zorunda değildir; kırılmalar veya doygunluk sık görülür.

Basit doğrusal trend
import numpy as np
from sklearn.linear_model import LinearRegression

y = df["satis"].dropna()
t = np.arange(len(y)).reshape(-1, 1)

model = LinearRegression().fit(t, y)
trend = model.predict(t)

Bu örnek gözlemlerin eşit aralıklarla geldiğini varsayar. Takvimde boşluklar varsa np.arange ile üretilen sıra numarası gerçek zamanı temsil etmez; bu durumda gerçek zaman indeksini modellemek veya eksik dönemleri açıkça ele almak gerekir.

Mevsimsellik nasıl analiz edilir?

Mevsimsellik, belirli bir takvim döngüsü boyunca tekrarlayan örüntüdür. Günlük veride haftalık, aylık veride yıllık mevsimsellik görülür. Döngüden farkı, mevsimselliğin bilinen ve sabit bir periyoda sahip olmasıdır.

Örnekler: restoranlarda hafta sonu yoğunluğu, ısıtma tüketiminde kış artışı, turizmde yaz sezonu, perakendede yıl sonu kampanyaları. Mevsimsel etkiyi incelerken resmî tatiller, hareketli bayram tarihleri ve kampanyalar gibi takvim etkilerini ayrıca düşünmek gerekir — Türkiye verisinde bayramların her yıl kayması, sabit periyot varsayımını tek başına yetersiz bırakır.

STL ile ayrıştırma

STL (Seasonal-Trend decomposition using Loess), seriyi trend, mevsimsellik ve kalan bileşenlere ayıran esnek bir yöntemdir. Mevsimsel desen zamanla değişebiliyorsa klasik ayrıştırmadan daha uygundur.

statsmodels · STL
from statsmodels.tsa.seasonal import STL

# Gunluk seride haftalik mevsimsellik: period=7
sonuc = STL(df["satis"].asfreq("D").interpolate(),
            period=7, robust=True).fit()

sonuc.plot()
plt.tight_layout()
plt.show()

Örnekte period=7 günlük seride haftalık mevsimsellik varsayar; aylık veride yıllık döngü için period=12 kullanılır. robust=True, uç değerlerin mevsimsel bileşeni bozmasını sınırlar. Koddaki interpolate() yalnızca gösterim amaçlıdır: üretim analizinde eksik zaman noktalarının nedeni ve uygun doldurma yöntemi ayrıca değerlendirilmelidir.

Durağanlık nedir, neden önemlidir?

Bir zaman serisi, kabaca zaman içinde değişmeyen istatistiksel özelliklere sahipse durağan kabul edilir. Zayıf durağanlık bağlamında ortalamanın ve varyansın sabit olması, kovaryansın ise yalnızca iki gözlem arasındaki gecikmeye bağlı olması beklenir.

Belirgin trend veya değişen mevsimsel seviye içeren seriler durağan değildir. Durağanlık özellikle ARMA ailesi için önemlidir; ancak her tahmin yöntemi aynı biçimde durağan girdi istemez. Üstel düzeltme ve ağaç tabanlı modeller bu varsayımı doğrudan gerektirmez.

Durağanlığı değerlendirme

  • Zaman grafiğinde seviyenin ve varyansın zamanla değişip değişmediğine bakın.
  • ACF grafiğiyle gecikmeler arasındaki korelasyonun davranışını inceleyin.
  • ADF gibi testleri yardımcı kanıt olarak kullanın; tek başına p-değeriyle karar vermeyin.
ADF testi
from statsmodels.tsa.stattools import adfuller

seri = df["satis"].dropna()
adf_sonuc = adfuller(seri, autolag="AIC")

print("ADF istatistiği:", adf_sonuc[0])
print("p-değeri:", adf_sonuc[1])

ADF testinin sıfır hipotezi birim kök bulunduğudur. Küçük p-değeri, testin varsayımları altında bu hipoteze karşı kanıt sunar — yani serinin durağan olmadığı iddiasını zayıflatır. Test; kırılmalar, mevsimsellik ve örneklem uzunluğundan etkilenir, bu yüzden grafik ve alan bilgisiyle birlikte yorumlanmalıdır.

Fark alma

Birinci fark
df["satis_fark"] = df["satis"].diff()

Fark alma, ardışık gözlemler arasındaki değişimi modelleyerek bazı trend yapılarını giderir. Mevsimsel fark alma ise belirli periyotla ayrılmış gözlemleri karşılaştırır; aylık seride diff(12) gibi. Gereğinden fazla fark almak yorumlanabilirliği azaltır ve modelin davranışını bozar.

Başlıca tahminleme yöntemleri

YöntemNe zaman işe yarar?Dikkat
Naif tahminSon gözlemi bir sonraki dönem için tahmin olarak kullanır.Güçlü bir kıyaslama noktasıdır; trendi yakalamaz.
Mevsimsel naifBir önceki mevsimsel dönemin değerini kullanır.Mevsimsel örüntü istikrarlıysa yenilmesi zor bir baseline.
Üstel düzeltmeSeviye, trend ve mevsimsellik bileşenlerini yumuşatır.Serinin yapısına uygun varyant seçilmelidir.
ARIMA / SARIMAGecikmeli bağımlılıkları ve gerekirse mevsimsel yapıyı modeller.Tanılama, parametre seçimi ve artık kontrolleri şart.
Regresyon + takvimTatil, fiyat, kampanya veya hava durumu biliniyorsa.Gelecek dönem için açıklayıcı değişken değerleri gerekir.
Makine öğrenmesiÇok sayıda özellik ve doğrusal olmayan ilişki varsa.Zamansal doğrulama ve veri sızıntısını önleme zorunlu.

Önce basit bir kıyaslama modeli kurun

Karmaşık bir modelin işe yarayıp yaramadığını anlamanın tek yolu, onu naif veya mevsimsel naif bir tahminle karşılaştırmaktır. Baseline'ı geçemeyen bir modelin karmaşıklığı gerekçelendirilemez — ve bu durum sanıldığından çok daha sık görülür.

Mevsimsel naif baseline
import numpy as np

# Gunluk seride haftalik sezonsallik varsayimiyla
mevsim = 7
train = df["satis"].iloc[:-28]
test  = df["satis"].iloc[-28:]

tahmin = train.iloc[-mevsim:].to_numpy()
tahmin = np.resize(tahmin, len(test))

Bu kod, eğitim setinin son haftasındaki değerleri test dönemi boyunca sırayla tekrarlar. Basit görünse de mevsimselliği güçlü serilerde şaşırtıcı derecede iyi çalışır. İleri değerlendirmede tahmin ufkuna, eksik günlere ve hafta içi/hafta sonu yapısına dikkat edin.

Tahmin doğruluğu nasıl ölçülür?

Modeli rastgele train-test ayırımıyla değerlendirmek zaman serilerinde yanlıştır: gelecekteki gözlemler eğitim sürecine sızar ve model olduğundan iyi görünür. Bunun yerine kronolojik ayırım ya da kayan başlangıçlı zaman serisi çapraz doğrulaması kullanılır.

MetrikYorumSınırlılık
MAEMutlak hataların ortalaması; hedefin kendi biriminde yorumlanır.Büyük hataları ayrıca cezalandırmaz.
RMSEBüyük hatalara daha fazla ağırlık verir.Uç değerlere duyarlıdır.
MAPEHata oranını yüzde olarak sunar; birimden bağımsızdır.Gerçek değer sıfıra yakınsa patlar, sıfırsa tanımsızdır.
MAE ve RMSE
import numpy as np
from sklearn.metrics import mean_absolute_error, mean_squared_error

mae  = mean_absolute_error(test, tahmin)
rmse = np.sqrt(mean_squared_error(test, tahmin))

print(f"MAE: {mae:.2f}")
print(f"RMSE: {rmse:.2f}")

Model seçerken tek bir test dönemi yeterli değildir. Farklı başlangıç tarihlerinde aynı tahmin ufkunu değerlendirmek, modelin dönemler arasında ne kadar tutarlı olduğunu gösterir. Tahmin aralıkları da en az nokta tahmini kadar önemlidir: karar vericiye belirsizliğin büyüklüğünü aktaran şey odur.

Gerçek hayattan dört senaryo

1

Perakende satış

Günlük satışlarda trend, haftalık mevsimsellik, tatiller ve promosyonlar birlikte değerlendirilir. Tahminler stok ve personel planlamasını besler.

2

Enerji tüketimi

Saatlik tüketim; sıcaklık, gün saati, hafta sonu ve mevsimlerden etkilenir. Dışsal değişkenler tahmini belirgin biçimde iyileştirir.

3

Marka ve sosyal medya

Günlük mention hacmi kampanyalar, gündem olayları ve haber akışından etkilenir. Ani sıçramaları trend sanmamak gerekir.

4

Çağrı merkezi

Saatlik çağrı sayısı vardiya planlaması için tahmin edilir. Takvim, kampanya ve beklenmedik kesintiler ayrı ele alınır.

Sosyal medya analizinde belirli bir gün mention sayısının yükselmesi kalıcı büyüme değildir. Bu artış viral bir paylaşım, haber olayı veya kampanya kaynaklı olabilir. Model yalnızca geçmiş sayılara değil, mümkün olduğunda olay takvimine ve açıklayıcı değişkenlere de bakmalıdır.

Uçtan uca zaman serisi iş akışı

Altı adım
  1. Zaman İndeksini
    Doğrula
  2. Görselleştir
  3. Bileşenleri
    İncele
  4. Baseline
    Kur
  5. Modeli
    Eğit
  6. Zamansal
    Doğrula
  • Frekans: günlük, haftalık veya aylık gözlemlerin düzenli olup olmadığını kontrol edin.
  • Eksik zaman noktaları: olmayan kayıt sıfır mı, yoksa veri toplanmamış mı? Bu ayrım tahmini doğrudan değiştirir.
  • Aykırı değerler: hatalı veri mi, yoksa gerçekten yaşanmış bir olay mı — araştırmadan silmeyin.
  • Takvim etkileri: tatil, hafta sonu ve kampanya gibi bilinen etkileri önceden belirleyin.
  • Doğrulama: geçmişten geleceğe doğru ayırın ve gerçek kullanımdaki tahmin ufkuyla aynı ufukta ölçün.
  • İzleme: gerçekleşen değerlerle tahminleri karşılaştırıp hatayı ve veri yapısındaki kaymayı sürekli izleyin.

Kaçınılması gereken hatalar

  • Gözlemleri zaman sırasına koymadan model kurmak.
  • Eksik tarihleri otomatik sıfırla doldurmak; sıfır ile gözlenmemiş değeri karıştırmak.
  • Geleceğe ait bilgiyi eğitim verisine sokmak (veri sızıntısı).
  • Modeli yalnızca eğitim verisindeki uyuma göre seçmek.
  • Mevsimselliği göz ardı edip yalnızca doğrusal trend eklemek.
  • Tahmin belirsizliğini ve olası yapısal kırılmaları raporlamamak.
  • Geçmişteki iyi performansın gelecekte de süreceğini varsaymak.
Unutmayın: tahmin, geleceğin kesin cevabı değil; belirli varsayımlar altında üretilmiş bir beklentidir. Karar süreçlerinde tahmin aralığı, senaryolar ve modelin ne zaman yeniden eğitileceği de planlanmalıdır.

Zaman serisi analizi, örüntüleri anlamakla başlar

Başarılı bir zaman serisi çalışması karmaşık bir algoritma seçmekle başlamaz. Önce verinin frekansı, eksik zaman noktaları, trendi ve mevsimselliği anlaşılır; ardından durağanlık ve bağımlılık yapısı değerlendirilir. Basit tahmin yöntemleri güçlü bir başlangıç noktasıdır; daha karmaşık modeller ancak ölçülebilir fayda sağladıklarında tercih edilmelidir.

Satış, enerji, finans, operasyon veya sosyal medya verisi üzerinde çalışın — doğru zaman indeksini kurmak, kronolojik doğrulama yapmak ve hataları düzenli izlemek tahmin kalitesini artıran temel adımlardır.

Başlangıç önerisi: önce seriyi çizdirin, bir hareketli ortalama ekleyin ve mevsimsel naif bir baseline kurun. Sonra daha gelişmiş modellerin gerçekten daha iyi sonuç verip vermediğini ölçün. ARIMA tarafına geçmek isterseniz giriş yazısındaki ACF/PACF ve auto.arima() bölümleri doğal devam noktası.

What is time series analysis?

A time series consists of values observed in order at specific points or intervals in time. Time series analysis is the process of examining the structure, dependencies and change in those observations in order to explain, monitor or forecast.

Daily sales, hourly electricity consumption, monthly inflation, website visits, call centre demand and social media mention volume are all time series. The order of the observations matters here: today's sales are rarely independent of yesterday's, or of the day of the week.

1

Explanation

Which patterns explain the observed variation? Trend, seasonality, or a campaign effect?

2

Forecasting

Given past patterns and known drivers, what can be expected in the periods ahead?

This post focuses on forecasting. The theoretical setup of the ARIMA family — reading ACF/PACF, unit root tests, model selection with auto.arima() — is covered separately in R: Introduction to Time Series Analysis. Here I concentrate on choosing a method, building a baseline and measuring forecast accuracy.

The components of a time series

To understand a series, it helps to think about which patterns the observed value may be made of. Classical decomposition considers trend, seasonality and an irregular component; in some cases cyclical movements are treated separately.

ComponentDescriptionExample
TrendThe long-term general direction.Customer numbers rising over the years.
SeasonalityA pattern repeating over fixed, known calendar intervals.Retail sales rising every December.
CycleLonger expansions and contractions with no fixed length.Demand shifts tied to the economic cycle.
IrregularShort-term variation the other components do not explain.A demand swing after an unexpected outage.

Additive and multiplicative structure

In an additive model the components sum to the observation. In a multiplicative model the size of the seasonal swing grows with the level of the series.

Decomposition notation
# Additive decomposition
Y[t] = Trend[t] + Seasonal[t] + Remainder[t]

# Multiplicative decomposition
Y[t] = Trend[t] * Seasonal[t] * Remainder[t]

If the extra summer sales grow in absolute terms as sales rise overall, a multiplicative structure or a log transform makes sense. If the series contains zeros or negative values, the multiplicative approach cannot be applied directly — the logarithm is undefined.

How do you analyse trend?

Trend shows the long-term direction of the series. But not every rise means lasting growth; calendar effects, campaigns, measurement changes and outliers easily distort the impression of a trend.

Moving average

A moving average smooths short-term fluctuation so the broader tendency becomes visible. On daily sales, a 7-day moving average largely removes day-of-week variation.

Moving average in pandas
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("gunluk_satis.csv", parse_dates=["tarih"])
df = df.sort_values("tarih").set_index("tarih")

df["ortalama_7g"] = df["satis"].rolling(7, min_periods=7).mean()

df[["satis", "ortalama_7g"]].plot()
plt.title("Daily sales and 7-day moving average")
plt.tight_layout()
plt.show()

A moving average is not a forecasting model; it is a visualisation and smoothing tool. The wider the window, the smoother the series — and the slower it reacts to sudden change. Writing min_periods=7 prevents misleading values computed from a half-filled window over the first six days.

Linear trend

Simple linear regression works when the relationship between time and value is roughly linear. In real series the trend need not be linear; breaks and saturation are common.

A simple linear trend
import numpy as np
from sklearn.linear_model import LinearRegression

y = df["satis"].dropna()
t = np.arange(len(y)).reshape(-1, 1)

model = LinearRegression().fit(t, y)
trend = model.predict(t)

This example assumes observations arrive at equal intervals. If the calendar has gaps, the index produced by np.arange no longer represents real time; you then need to model the actual time index or handle the missing periods explicitly.

How do you analyse seasonality?

Seasonality is a pattern that repeats over a particular calendar cycle. Daily data shows weekly seasonality, monthly data yearly seasonality. What separates it from a cycle is that seasonality has a known, fixed period.

Examples: weekend peaks in restaurants, winter rises in heating consumption, the summer season in tourism, year-end campaigns in retail. When examining seasonal effects, calendar effects such as public holidays, moving religious holidays and campaigns need separate thought — in Turkish data, holidays shifting every year make the fixed-period assumption insufficient on its own.

Decomposition with STL

STL (Seasonal-Trend decomposition using Loess) is a flexible method for splitting a series into trend, seasonal and remainder components. It suits cases where the seasonal pattern changes over time better than classical decomposition.

statsmodels · STL
from statsmodels.tsa.seasonal import STL

# Weekly seasonality on a daily series: period=7
sonuc = STL(df["satis"].asfreq("D").interpolate(),
            period=7, robust=True).fit()

sonuc.plot()
plt.tight_layout()
plt.show()

Here period=7 assumes weekly seasonality on a daily series; for a yearly cycle in monthly data you would use period=12. robust=True limits how much outliers distort the seasonal component. The interpolate() call is for demonstration only: in production the reason for missing time points and the appropriate filling method need separate consideration.

What is stationarity and why does it matter?

A time series is considered stationary if its statistical properties are roughly unchanging over time. Under weak stationarity, the mean and variance are expected to be constant and the covariance to depend only on the lag between two observations.

Series with a clear trend or a shifting seasonal level are not stationary. Stationarity matters particularly for the ARMA family; not every forecasting method demands a stationary input in the same way. Exponential smoothing and tree-based models do not require the assumption directly.

Assessing stationarity

  • Look at the time plot to see whether the level and variance change over time.
  • Examine the behaviour of correlation across lags with an ACF plot.
  • Use tests such as ADF as supporting evidence; do not decide on a p-value alone.
The ADF test
from statsmodels.tsa.stattools import adfuller

seri = df["satis"].dropna()
adf_sonuc = adfuller(seri, autolag="AIC")

print("ADF statistic:", adf_sonuc[0])
print("p-value:", adf_sonuc[1])

The null hypothesis of the ADF test is that a unit root is present. A small p-value provides evidence against that null under the test's assumptions — that is, it weakens the claim that the series is not stationary. The test is affected by breaks, seasonality and sample length, so read it together with the plot and domain knowledge.

Differencing

First difference
df["satis_fark"] = df["satis"].diff()

Differencing models the change between consecutive observations and removes some trend structures. Seasonal differencing compares observations a fixed period apart — diff(12) on a monthly series, for example. Differencing more than necessary reduces interpretability and distorts the model's behaviour.

The main forecasting methods

MethodWhen it helpsWatch out for
Naive forecastUses the last observation as the forecast for the next period.A strong benchmark; does not capture trend.
Seasonal naiveUses the value from the previous seasonal period.Hard to beat when the seasonal pattern is stable.
Exponential smoothingSmooths level, trend and seasonal components.The variant must match the structure of the series.
ARIMA / SARIMAModels lagged dependencies and, if needed, seasonal structure.Diagnostics, parameter choice and residual checks are essential.
Regression + calendarWhen holidays, price, campaigns or weather are known.You need values of the explanatory variables for the future period.
Machine learningWith many features and non-linear relationships.Temporal validation and preventing leakage are mandatory.

Build a simple benchmark first

The only way to know whether a complex model is worth it is to compare it against a naive or seasonal naive forecast. A model that cannot beat the baseline cannot justify its complexity — and this happens far more often than people expect.

A seasonal naive baseline
import numpy as np

# Assuming weekly seasonality on a daily series
mevsim = 7
train = df["satis"].iloc[:-28]
test  = df["satis"].iloc[-28:]

tahmin = train.iloc[-mevsim:].to_numpy()
tahmin = np.resize(tahmin, len(test))

This repeats the values of the final training week across the test period. Simple as it looks, it performs surprisingly well on strongly seasonal series. For a fuller evaluation, pay attention to the forecast horizon, missing days and the weekday/weekend structure.

How do you measure forecast accuracy?

Evaluating a model with a random train-test split is wrong for time series: future observations leak into training and the model looks better than it is. Use a chronological split, or rolling-origin time series cross-validation instead.

MetricInterpretationLimitation
MAEMean of absolute errors; read in the target's own unit.Does not penalise large errors any further.
RMSEGives more weight to large errors.Sensitive to outliers.
MAPEExpresses error as a percentage; unit-independent.Explodes near zero and is undefined at zero.
MAE and RMSE
import numpy as np
from sklearn.metrics import mean_absolute_error, mean_squared_error

mae  = mean_absolute_error(test, tahmin)
rmse = np.sqrt(mean_squared_error(test, tahmin))

print(f"MAE: {mae:.2f}")
print(f"RMSE: {rmse:.2f}")

One test period is not enough when choosing a model. Evaluating the same horizon from several different start dates shows how consistent the model is across periods. Prediction intervals matter at least as much as the point forecast: they are what communicates the size of the uncertainty to a decision-maker.

Four real-world scenarios

1

Retail sales

Trend, weekly seasonality, holidays and promotions are weighed together in daily sales. Forecasts feed stock and staff planning.

2

Energy consumption

Hourly consumption is driven by temperature, hour of day, weekends and seasons. External variables improve forecasts markedly.

3

Brand and social media

Daily mention volume is shaped by campaigns, news events and the agenda. A sudden spike should not be mistaken for a trend.

4

Call centre

Hourly call volume is forecast for shift planning. Calendar, campaigns and unexpected outages are handled separately.

In social media analysis, a rise in mentions on a particular day is not lasting growth. It may come from a viral post, a news event or a campaign. The model should look not only at past counts but, where possible, at an events calendar and explanatory variables.

An end-to-end time series workflow

Six steps
  1. Validate the
    Time Index
  2. Visualise
  3. Inspect
    Components
  4. Build a
    Baseline
  5. Train the
    Model
  6. Validate
    Temporally
  • Frequency: check whether daily, weekly or monthly observations are regular.
  • Missing time points: is an absent record a zero, or was no data collected? The distinction changes the forecast directly.
  • Outliers: bad data or a real event — do not delete before investigating.
  • Calendar effects: identify known effects such as holidays, weekends and campaigns in advance.
  • Validation: split from past to future, and measure over the same horizon you will actually forecast.
  • Monitoring: compare realised values against forecasts and keep watching the error and any drift in the data.

Mistakes to avoid

  • Fitting a model without putting the observations in time order.
  • Filling missing dates with zero automatically, conflating zero with unobserved.
  • Letting information about the future into the training data (leakage).
  • Choosing a model purely on its fit to the training data.
  • Ignoring seasonality and adding only a linear trend.
  • Failing to report forecast uncertainty and possible structural breaks.
  • Assuming that past performance guarantees future performance.
Remember: a forecast is not a definitive answer about the future; it is an expectation produced under particular assumptions. Decision processes should also plan for prediction intervals, scenarios and when the model will be retrained.

Time series analysis starts with understanding patterns

A successful time series project does not start by picking a complex algorithm. First you understand the frequency of the data, the missing time points, the trend and the seasonality; then you assess stationarity and the dependency structure. Simple forecasting methods are a strong starting point; more complex models should only be preferred when they deliver measurable benefit.

Whether you work on sales, energy, finance, operations or social media data, building the right time index, validating chronologically and monitoring errors regularly are the fundamental steps that improve forecast quality.

Where to start: plot the series, add a moving average and build a seasonal naive baseline. Then measure whether more advanced models genuinely do better. If you want to move on to ARIMA, the ACF/PACF and auto.arima() sections of the introductory post are the natural next step.