Zaman Serisi Analizi

Zaman serisi analizi, zaman içinde gözlenen verileri incelemek ve bu verilerin gelecekteki değerlerini tahmin etmek amacıyla istatistiksel ve veri madenciliği tekniklerinin uygulanmasıdır. Zaman serisi verileri, belirli bir zaman diliminde toplanan verileri temsil eder ve genellikle düzenli zaman aralıklarıyla gözlenir.

Trend

Trend, zaman içinde sürekli bir artış, azalış veya istikrarlı bir eğilimi ifade eder. Bu, bir zaman serisinin orta veya uzun vadeli değişimini temsil eder.

Hareketli Ortalama (Moving Average): Zaman serisindeki gürültüyü azaltmak ve trendi yakalamak için hareketli ortalama yöntemi kullanılabilir. Basit bir hareketli ortalama veya ağırlıklı hareketli ortalama kullanılabilir.

# Basit bir hareketli ortalama hesaplama
rolling_mean = time_series.rolling(window=10).mean()

Lowess Düzleştirmesi: Lowess (Locally Weighted Scatterplot Smoothing) düzleştirmesi, veriyi yumuşatarak ve yerel eğilimleri yakalayarak trendi belirlemek için kullanılır.

from statsmodels.nonparametric.smoothers_lowess import lowess

time_series = [0, 4, 6, 3, 5, 5, 6, 7, 8, 8, 5]

# Lowess duzlestirmesi ile trendi hesaplayin
smoothed = lowess(time_series, np.arange(len(time_series)), frac=0.2)

# Lowess duzlestirmesi sonuclarini gorsellestirin
plt.figure(figsize=(12, 6))
plt.plot(time_series, label="Zaman Serisi")
plt.plot(smoothed[:, 0], label="Trend (Lowess Duzlestirmesi)", linestyle="--")
plt.xlabel("Zaman")
plt.ylabel("Deger")
plt.legend()
plt.grid(True)
plt.show()

Durağanlık (Stationary)

Durağanlık, bir zaman serisinin istatistiksel özelliklerinin zaman içinde sabit olduğu veya dalgalanmadığı bir durumu ifade eder. Durağan bir zaman serisi, ortalama, varyans ve otokorelasyon gibi özellikler açısından zaman içinde tutarlıdır.

Augmented Dickey-Fuller (ADF) Testi: Bir test, bir zaman serisinin birim kök (unit root) varlığını veya yokluğunu belirlemeye yardımcı olur. Birim kök, zaman serisinin durağanlık özelliği olmadığını ifade eder. ADF testi, null hipotezi H0 ve alternatif hipotezi H1; H0 = Zaman serisi birim kök içerir ve durağan değildir. H1 = Zaman serisi birim kök içermez ve durağandır.

import pandas as pd
from statsmodels.tsa.stattools import adfuller

data = [10, 20, 30, 40, 50, 60, 70, 80, 90]

ts = pd.Series(data)

result = adfuller(ts)

print('ADF Istatistigi:', result[0])
print('p-degeri:', result[1])
print('Kritik degerler:', result[4])

if result[1] <= 0.05:
    print('Zaman serisi duragan.')
else:
    print('Zaman serisi duragan degil.')

Kwiatkowski-Philips-Schmidt-Shin (KPSS Testi): H0: Zaman serisi, düzgün (trend-stationary) durağanlık gösterir. H1: Zaman serisi, düzgün durağanlık göstermez (durağanlık göstermeyen birim kök içerir.). KPSS testi, genellikle iki farklı sürümde uygulanır: düzgün durağanlık testi (Level Stationary Test) ve trend durağanlık testi (Trend Stationary Test).

  • Düzgün Durağanlık Testi (Level Stationary Test): H0: Zaman serisi düzgün durağanlık gösterir. H1: Zaman serisi düzgün durağanlık göstermez.
  • Trend Durağanlık Testi (Trend Stationary Test): H0: Zaman serisi eğimli durağanlık gösterir. H1: Zaman serisi eğimli durağanlık göstermez.
from statsmodels.tsa.stattools import kpss

data = [2, 2, 4, 4, 4, 6, 7, 8, 9]

ts = pd.Series(data)

# Duzgun duraganlik testini uygulayin
kpss_stat_level, p_value_level, lags_level, critical_values_level = kpss(ts, regression='c')

# Trend duraganlik testini uygulayin
kpss_stat_trend, p_value_trend, lags_trend, critical_values_trend = kpss(ts, regression='ct')

print("Zaman Serisi:", data)

# Duzgun duraganlik test sonuclarini yazdirin
print('Duzgun Duraganlik Test Istatistigi:', kpss_stat_level)
print('Duzgun Duraganlik Test p-degeri:', p_value_level)

# Trend duraganlik test sonuclarini yazdirin
print('Trend Duraganlik Test Istatistigi:', kpss_stat_trend)
print('Trend Duraganlik Test p-degeri:', p_value_trend)

if p_value_level <= 0.05:
    print('Zaman serisi duzgun duragan degil.')
else:
    print('Zaman serisi duzgun duragan.')

if p_value_trend <= 0.05:
    print('Zaman serisi trend duragan degil.')
else:
    print('Zaman serisi trend duragan.')

Philips-Perron Testi: Zaman serisinin eğilimsiz (trend-stationary) durağanlık özelliğini değerlendirmek için kullanılır. H0: Zaman serisi eğilimsiz durağanlık gösterir. H1: Zaman serisi eğilimsiz durağanlık göstermez.

from statsmodels.tsa.stattools import adfuller

data = [10, 20, 30, 30, 30, 30, 30, 30, 30]

ts = pd.Series(data)

# PP testini uygulayin
result = adfuller(ts, regression='ct')

print('Zaman Serisi:', data)

# PP test sonuclarini yazdirin
print('PP Istatistigi:', result[0])
print('p-degeri:', result[1])
print('Kritik degerler:', result[4])

if result[1] <= 0.05:
    print('Zaman serisi egilimsiz duragan.')
else:
    print('Zaman serisi egilimsiz duragan degil.')

Ljung-Box Testi: Zaman serisinin otokorelasyonunu (kendi içindeki özbenzerliğini) test etmek için kullanılan bir istatistiksel testtir. Bu test, bir zaman serisinin rastgele gürültü içerip içeermediğini değerlendirmek amacıyla yaygın olarak kullanılır. Otokorelasyon, zaman serisinin kendisi ile belirli gecikmeler arasında pozitif veya negatif bir ilişki gösterip göstermediğini ölçer. H0: Zaman serisinin otokorelasyonu yoktur, yani zaman serisi bağımsızdır. H1: Zaman serisinde otokorelasyon vardır. Ljung-Box testi, belirli bir gecikme (lag) sayısı için bir test istatistiği hesaplar ve bu istatistiği karşılaştırılabilir bir eleştirel değerle karşılaştırır.

from statsmodels.stats.diagnostic import acorr_ljungbox

data = [10, 20, 30, 40, 50, 60, 70, 80, 90]

ts = pd.Series(data)

# Ljung-Box testini uygulayin
lags = 5  # Test edilecek gecikme sayisi
lb_stat, p_value = acorr_ljungbox(ts, lags=lags)

# Ljung-Box test sonuclarini yazdirin
print('Ljung-Box Istatistigi:', lb_stat)
print('p-degeri:', p_value)

# Sonuclari yorumlayin
if any(p_value <= 0.05):
    print('Zaman serisinde otokorelasyon vardir.')
else:
    print('Zaman serisinde otokorelasyon yoktur.')

Mevsimsel (Seasonal) Değişkenler

Mevsimsel değişkenler, belirli bir dönemde, düzenli aralıklarla tekrar eden belirli bir deseni ifade eder. Mevsimsel değişkenler, zaman serisinin mevsimsel etkilerini veya desenlerini yakalamak için kullanılır.

Aralık Tablosu (Seasonal Decomposition of Time Series – STL): Bu yöntem, zaman serisini trend, mevsimsel ve rastgele bileşenlere ayırmak için kullanılır.

from statsmodels.tsa.seasonal import seasonal_decompose

result = seasonal_decompose(time_series, model='additive')
result.seasonal.plot()

ACF (Autocorrelation Function) ve PACF (Partial Autocorrelation Function):

from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

# ACF grafigini cizdirin
plot_acf(time_series, lags=50)

# PACF grafigini cizdirin
plot_pacf(time_series, lags=50)

Differencing (Fark Alma): Zaman serisinde mevsimsel değişkenler varsa, veriyi fark alma (differencing) yöntemi kullanarak mevsimsel desenlerden arındırabilirsiniz. İlk fark, bir mevsimsel periyot boyunca (örneğin, bir yıl) yapılan farkı ifade eder. İkinci fark, ilk farkı fark alarak mevsimsel etkileri daha da azaltır.

# Birinci fark
first_difference = time_series - time_series.shift(1)

# Ikinci fark
second_difference = first_difference - first_difference.shift(1)

Exponential Smoothing (Üstel Düzleştirme): Üstel düzleştirme yöntemleri (örneğin, Holt-Winters) mevsimsel değişkenleri modellemek için kullanılabilir. Bu yöntemler, verinin mevsimsel bileşenlerini ve mevsimsel desenlerini tahmin etmeye yardımcı olur.

from statsmodels.tsa.holtwinters import ExponentialSmoothing

model = ExponentialSmoothing(time_series, seasonal='add', seasonal_periods=12)
result = model.fit()

seasonal_forecast = result.forecast(steps)

Fourier Dönüşümleri: Fourier dönüşümleri, mevsimsel desenleri modellendirmek için kullanılabilir. Bu yöntem, karmaşık mevsimsel desenleri yakalamak için sinüs ve kosinüs fonksiyonlarını kullanır.

Rastgele Gürültü (Noise)

Rastgele gürültü, zaman serisindeki tahmin edilemeyen, rastgele veya stokastik dalgalanmalardır. Genellikle, trend ve mevsimsel desenlerin dışında kalan değişkenliklerin neden olduğu dalgalanmalar olarak düşünülür. Rastgele gürültü, zaman serisindeki diğer bileşenlerin modelleme ve tahmininde dikkate alınmaz.