Zaman Serisi Analizine Giriş
Zaman serisi analizi; zaman içerisinde gelişen olayların ve işlemlerin analiz edilmesi ve iç görüye dönüştürülmesi ile tarihsel etkileri anlamak için önemli bir tekniktir.
Zaman etkisiyle değişen olaylardan elde edilecek çıkarımlar ve bu etkilenmelerin işaretlenmesi, nedensellik ve anlam ilişkisi kurmak için oldukça faydalıdır.
Şeyleri daha iyi (optimal) bir duruma getirmek için, şeyler hakkında bildiklerimizden daha fazlasını bilmeye çalışmak optimizasyon kültürü için zâruri bir nosyondor. Gerçekleşen olaylar ve olayların zaman boyutu ile işaretlenmesi, zaman boyutunun kendi karakteristik (mevsimsel) özelliklerinden dolayı etkileyeceği durumlardaki etkilenmeyi açıklamaya da yardımcı olur.
Bu yazı, kavramların yanı sıra zaman serileri ve analiz tekniklerinin gelişmiş yöntemlerini incelerken, gerçek hayattan örneklerle pratikler barındırmaktadır.
İçerikler
- Zaman Serisi Nedir?
- Zaman Serisi Örnekleri
- Zaman Serisi Çizelgesi (Time Plot)
- ts Nesnesine Giriş
- Zaman Serisi Bileşenleri (Time Series Components)
- Mevsimsel Çizelge (Seasonal Plot)
- Mevsimsel Alt Seri Çizelgesi (Seasonal Subseries Plot)
- Zaman Serisi Dekompozisyonu (Time Series Decomposition)
Zaman Serisi Nedir?
Zaman serileri; zamana göre (kronolojik) sıralanan veri dizileridir, veri satırları periyodik (saat, gün, ay, yıl vb.) bir döngü ile sıralanırlar.
Zaman serileri sayısal olarak ifade edilebilecek olayların ve işlemlerin bir zaman damgası ile ilişkilendirildiği basit veri setleri olarak da tanımlanabilir.
Zaman boyutları (Time) ardışık bir halde gözlemler (Observation) ile yan yana geldiklerinde zaman dizilerini oluşturmaktadır.
Frekans ile ilgili açıklama yapalım.
Örnek Zaman Dizisi:
Zaman #1, Gözlem #1 Zaman #2, Gözlem #2 Zaman #3, Gözlem #3
“Bir zaman serisi, zaman içinden alınan ardışık bir dizi gözlemdir.”Time Series Analysis: Forecasting and Control (Wiley Series in Probability and Statistics)
Zamanın ve verinin birlikte olduğu veri setleri, zamansal etkilenmelerin etkilerini hipotez olarak kurgulamak ve ilişkisel çıkarımlar yapmak için yararlıdır.
Zaman serilerinin bir tarih aralığına (sınırlılık) sahip olması, onların tarih üzerinde bir örneklem olduğunu varsaymamızı gerektirir.
Zaman Serisi Örnekleri
Bir insanın gün içerisinde attığı adım sayısı bir zaman serisi örneğidir, günler ile işaretlenecek olan adım sayıları, günler ile birlikte bir zaman serisi oluşturmaktadır.
Bu örnekte gün serinin zaman boyutudur, adım sayısı ise gözlemdir.
|Günler (Zaman)
|Adım Sayısı (Gözlem)
|01-01-2019
|2236
|02-01-2019
|1652
|03-01-2019
|1725
|04-01-2019
|2699
|05-01-2019
|2756
|..
|..
Bir işletmenin aylık satış verilerinin zaman damgası ile işaretli olduğu ve zaman üzerinde sıralanmış olduğu bir veri seti; zaman serisi verisidir, bu veri setinde zaman boyutu aylar, gözlemler ise satışlarla temsil edilmiş olur.
|Yıl (Zaman)
|Satışlar (Gözlem)
|2010
|210.010 TL
|2011
|230.883 TL
|2012
|210.603 TL
|2013
|260.218 TL
|2014
|280.368 TL
|..
|..
ts Nesnesine Giriş
Bir zaman serisi, yukarıdaki örnekteki gibi gelir bilgisinin hangi yıllarda kaydedildiği hakkında bilgiler saklayan bir sayı listesi olarak düşünülebilir, zaman serileri R dilinde
ts nesnesi ile temsil edilmektedir.
Yukarıdaki tabloda yer alan zaman serisini R’da zaman serisi nesnesine çevirelim, y değişkeni değer olarak zaman serisi verisine sahip olacaktır.
ts(gözlemler, start=başlangıç tarihi) fonksiyonu aşağıdaki örnekte 2 parametreden oluşmaktadır, ilk parametrede gözlemler, ikinci parametrede (start) ise serinin başlangıç tarihi belirtilmektedir.
y = ts(c(210.010,230.883,210.603,260.218,280.368), start=2010)
R ile zaman serisi nesnesi oluştururken kullanacağımız veriler yıllıksa, yani yılda bir gözlem gerçekleşiyorsa, yalnızca başlangıç yılını belirtmemiz yeterlidir.
Aylık veriler gibi yılda bir kereden daha sık tekrarlanan gözlemler için,
frequency (frekans) parametresini de kullanmamız gerekmektedir, z değişkeni içerisinde gözlemlerin yer aldığını varsayarak; aşağıdaki kod bloğu zaman serisini bir başlangıç parametresine ihtiyaç duymadan aylık olarak oluşturacaktır.
y = ts(z, start=2013, frequency=12)
Bu makalede kullanılan verilerin neredeyse tamamı önceden
ts nesnesi olarak oluşturulmuştur. Ancak kendi verilerinizle çalışmak istiyorsanız, analize devam etmeden önce
ts() fonksiyonunu kullanarak verilerinizi R’ın anlayabileceği şekilde zaman serisi nesnesine dönüştürmeniz gerekmektedir.
Zaman Serisi Çizelgesi (Time Plot)
Zaman serisi grafiklerinde; X ekseninde ardışık sıralanmış zaman damgası (time) yer alırken, gözlemler (observation) Y ekseninde düz çizgilerle birleştirilerek görselleştirilir. Zaman serisi grafiklerinin (zaman serisi çizelgesi) teknik literatürdeki karşılığı time plot‘tır.
Aşağıdaki Şekil 1.1; Ansett Airlines’ın, Avustralya’nın en büyük iki şehri olan Melbourne ve Sydney arasındaki seferlerinin ekonomi sınıfı yolcu sayısını göstermektedir.
autoplot(melsyd[,"Economy.Class"]) +
ggtitle("Ekonomi Sınıfı Yolcular: Melbourne-Sydney") +
xlab("Yıl") +
ylab("Yolcu Sayısı (Binler)")
Zaman serileri görselleştirildikleri andan itibaren hızlı çıkarımlar yapmak için oldukça elverişli bir ortam hazırlar. Görselleştirdiğimiz zaman serisi sonrası yukarıdaki time plot, bazı ilginç özellikleri bizlere görsel olarak aktarmıştır.
Grafikteki bazı değişimleri aklımız nedensellik ilişkisi ile hızlıca anlamlandırabilir.
Bazı değişimlerin nedenini bulmak için ise farklı teknikler uygulayacağız, bazı değişimlerin nedenini ise asla bilemeyeceğiz.
Çıkarımlar ve nedensellik:
- 1989’da endüstriyel bir anlaşmazlıktan dolayı yolcu taşınmayan bir dönem vardı.
- 1992’de ekonomi sınıfındaki yolcu sayısında bir miktar azalma yaşandı, bu azalma bazı ekonomi sınıfı koltukların, işletme sınıfı koltuklarla değiştirildiği bir denemeden kaynaklanıyordu.
- 1991 yılının ikinci yarısında yolcu yükünde büyük bir artış gerçekleşti.
- Her yeni yıl başlangıcında görece bazı büyük düşüşler var. Bunlar tatil etkilerinden kaynaklanıyor.
- 1987’de yükselen bir dalgalanma varken, 1989’da azalıyor ve 1990 ile 1991’e kadar devam eden seride uzun vadeli bir dalgalanma görülüyor.
- Verimizde bazı eksik gözlem noktaları var, bunun yanı sıra anlamlandıramadığımız birçok hareket ve bilmediğimiz için ilişkilendiremediğimiz nedenleri var.
Herhangi bir tahminleme modeli, yolcu yükünün gelecekteki olasılıklarını etkili bir şekilde tahmin edebilmek için, tüm bu çıkarımları ve nedensellikleri göz önünde bulundurmaya ve öğrenmeye ihtiyaç duyacaktır.
Şekil 1.2’de daha basit bir zaman serisi gösterilmektedir.
autoplot(a10) +
ggtitle("Antidiyabetik İlaç Satışları") +
xlab("Yıl") +
ylab("Milyon Dolar")
Yukarıdaki grafikte artan bir eğilim olduğu net olarak görünmektedir. Seri ilerledikçe ve seviyesi arttıkça, büyüklüğü onunla birlikte artan güçlü bir mevsimsel desen (pattern) de gözükmektedir.
Her yeni yıl başlangıcındaki ani düşüş, hastaların ilaçları önden stoklamalarına neden olan bir maliyet artışından (devlet sübvansiyonu) kaynaklanmaktadır.
Bu zaman serisini tahmin etmek için geliştirilecek tüm modeller, mevsimsel değişiklikleri anlamak durumunda ve trendin yavaş yavaş değişiyor olmasını da göz önünde bulundurmalıdır.
Zaman Serisi Bileşenleri (Time Series Components)
Zaman serilerinin analizinde trend (eğilim) ve seasonality (sezonsallık) en önemli kavramlar olarak karşımıza çıkar, analiz tekniklerinde birer varsayım olarak konumlanan bu kavramlar, aynı zamanda zaman serisi analizleri esnasında farklı durumları açıklamakta farklı görevler üstlenirler.
Bu kavramlar zaman serisi komponentleri ya da zaman serisi bileşenleri olarak isimlendirilmektedir.
Trend (Eğilim):
Verilerde uzun vadeli bir artış ya da düşüş eğilimi olduğunda, eğilim yönünü temsil eden bir trend çizgisi oluşur, bu trend çizgisi her zaman doğrusal olmak zorunda değildir. Bazı trendler, artan bir eğilimden azalan bir eğilime doğru gittiğinde, onları yön değiştiren (changing direction) trend olarak adlandırırız.
Şekil 1.2’de gösterilen antidiyabetik ilaç satış verilerinde artan bir trend olduğu görülmektedir.
Seasonal (Mevsimsel):
Mevsimsel desenler; günün saatleri, haftanın günleri ya da yılın haftaları gibi döngü oluşturan periyotlarla sıralanan zaman serilerinde, mevsimsel döngülenmenin veri üzerindeki etkilerinden meydana gelir.
Aşağıdaki grafikte bir web sitesinin 1 yıl içerisindeki oturum sayıları (sessions) görselleştirilmiştir, her hafta sonu ziyaretçi sayısında ortalama yarı yarıya bir düşüş olduğu görülmektedir, bu seasonal bir harekettir ve serinin trendi (doğrusal trend) yönü itibariyle azalma eğilimi olduğunu gösterir.
Cyclical (Konjonktürel):
Zaman serilerinde mevsimsel olmayan ve tamamen nedensel bir etkenden kaynaklanan dalgalardan oluşan döngüler de gerçekleşir. Bu dalgalanmalar genellikle ekonomik koşullardan kaynaklanır ve genellikle iş döngüsü (business cycle) ile ilişkilidir.
Vergi indirimleri, ödeme dengelerindeki değişiklikler ve makroekonomik birçok etken cyclical hareketler oluşturur.
Aşağıdaki grafikte Mayıs-Haziran ile başlayan ve yaz aylarını takip eden mevsimsel bir hareket görülmektedir, düzenli olarak artış meydana geldiği için trend’in yukarı doğru olduğu söylenebilir.
Grafiği tekrar incelediğimizde son 2 Şubat ayında normalde gerçekleşmesi beklenmeyen bir spike (sivrilme) söz konusu, yaz ayları düğün ve evliliklerin sıkça gerçekleştiği dönemler olduğu için bu mevsimsel dalgalanma anlamlı fakat, Şubat ayındaki artışların başka bir nedeni olmalı, mesela vergi indirimleri.
Birçok insan cyclical desenleri seasonal davranışlarla karıştırır, ancak bu iki komponent ciddi biçimde farklıdır. Eğer dalgalanmalar sabit bir frekansta değilse, o zaman döngüseldir, eğer frekans değişmiyorsa ve takvimin bazı yönleriyle ilişkiliyse, desen mevsimseldir.
Genel olarak, ortalama döngü uzunluğu mevsimsel desen uzunluğundan daha uzundur ve cyclical desen büyüklükleri mevsimsel döngülere kıyasla daha ucu açık ve rassaldır.
Pek çok zaman serisi trend, döngü ve mevsimsellik içerir. Bir tahmin yöntemi seçerken, önce verilerdeki zaman serisi modellerini tanımlamamız gerekecek, sonra desenleri doğru şekilde kavrayabilecek bir yöntem ile model seçmeliyiz.
Şekil 2.3’deki örnekler yukarıda anlatılan bileşenlerin farklı kombinasyonlarını göstermektedir.
- Aylık konut satışları (sol üst): her yıl güçlü bir mevsimsellik deseni barındırmakla birlikte, yaklaşık 6-10 yıllık bir süre ile bazı güçlü döngüsel davranışlar göstermektedir. Bu dönemde verilerde belirgin bir eğilim yoktur.
- ABD hazine bonosu sözleşmeleri (sağ üstte): 1981 yılı içerisinde Chicago pazarına ait ardışık 100 günlük işlem verilerinde bir mevsimsellik görülmüyor, ancak belirgin bir düşüş eğilimi var. Muhtemelen eğer çok daha uzun bir serimiz olsaydı, bu düşüş eğiliminin aslında uzun bir döngünün parçası olduğunu görecektik, ancak sadece 100 günlük işlemi görüyor olduğumuz için bir düşüş trendi gibi görünerek bizi yanıltabilir.
- Avustralya çeyreklik elektrik üretimi (sol altta): güçlü mevsimsellik ile güçlü bir artış trendi göstermektedir. Burada herhangi bir döngüsel davranış olduğuna dair bir kanıtımız yok.
- Google hisse senedi kapanışı (sağ altta): gözlemlenen günlük değişikliklerde trend, mevsimsellik veya döngüsel davranış yoktur. Çok öngörülebilir olmayan rastgele dalgalanmalar vardır ve bir tahmin modelinin geliştirilmesine yardımcı olacak güçlü desenler görülmemektedir.
Mevsimsel Çizelge (Seasonal Plot)
Seasonal plot; farklı yıllardaki zaman serilerini üst üste görselleştirerek, her bir yılın sezonsal farklılığını ve ortak yanlarını anlamamıza yardımcı olan veri görselleştirme aracıdır.
ggseasonplot(a10, year.labels=TRUE, year.labels.left=TRUE) +
ylab("Milyon Dolar") +
xlab("Ay") +
ggtitle("Seasonal Plot: Antidiyabetik İlaç Satışları")
Şekil 1.4’teki veriler time plot (zaman çizelgesi) ile görselleştirilen verilerle tamamen aynıdır, ancak şimdi her yılın mevsim verilerini üst üste görüntüleyebilmekteyiz. Benzer mevsimsel hareketler ve bunun dışında kalan hareketler artık çok daha temiz bir şekilde anlaşılmaktadır.
Yukarıdaki grafiğe bakarak her yıl Ocak ayında satışlarda büyük bir sıçrama olduğunu söyleyebiliriz. Aslında bu hareketler Aralık ayı sonlarında, mali yıl sonundan önce müşterilerin stoklarını doldurmaya çalışmasından kaynaklanan satış artışlarıdır.
Grafik aynı zamanda Mart 2008’de alışılmadık derecede az satış olduğunu göstermektedir (diğer yıllarda Şubat ve Mart ayları arasında bir artış gözlenlenmektedir). 2008 yılı Haziran ayında gerçekleşen az sayıdaki satış ise, büyük olasılıkla verilerin ölçümlendiği sırada satışların eksik sayılmasından kaynaklanmaktadır.
Seasonal plot üzerinde mevsimsel farklılıkları polarizasyon ile incelemek istersek, farklı bir yöntem olan polar (kutupsal) görselleştirme varyasyonunu da kullanabiliriz. Kodlar üzerinde yapacağımız
polar = TRUE düzenlemesi, zaman serisinin eksenini aşağıda gösterildiği gibi yatay yerine dairesel yapar.
ggseasonplot(a10, polar=TRUE) +
ylab("Milyon Dolar") +
xlab("Ay") +
ggtitle("Polar Seasonal Plot: Antidiyabetik İlaç Satışları")
Mevsimsel Alt Seri Çizelgesi (Seasonal Subseries Plot)
Mevsimsel alt seri çizelgesi, seasonal plot ile analiz edilmiş mevsimsel düzenin kendi içindeki hareketlerinin daha açıkça görülmesini sağlar ve zaman içindeki değişimlerini gösterir.
ggsubseriesplot(a10) +
ylab("Milyon Dolar") +
xlab("Ay") +
ggtitle("Seasonal Subseries Plot: Antidiyabetik İlaç Satışları")
Y Ekseni:
Her bir ay için, yıllar boyunca o ayda görülmüş gözlem değeri (observation) yani satış verisi bulunmaktadır.
X Ekseni:
Aylar kronolojik olarak sıralanmıştır.
Yatay Çizgi:
Zaman serisindeki her ayın ortalama (mean) değerini gösterir.
Grafiği Okuma:
X eksenine (ay) karşılık gelen Y ekseni (satış) değerleri sonrası oluşan çizgiler her bir yılın Ocak içindeki gözlem değerlerini yansıtır.
Kullanmış olduğumuz veri setinde genellikle her yıl artış gözlemlendiği için, çizgiler çoğunlukla yukarı eğilimlidir. Fakat birden fazla yılın Mart ve Nisan aylarında artışın tersi olarak azalma yaşandığı görülmektedir. Aynı şekilde Haziran’ın düşüşte olduğu bir yıl olduğu da grafiği incelerken görebildiğimiz bulgulardan sadece bir tanesi.
Ekim ayından başlayarak Şubat ayına kadar artan satış eğilimden dolayı, bu ayların yatay çizgileri yani ortalamalarının da artışta görülmektedir. Ayların mevsimsellik kalıntılarını ve anomalilerini görmek için seasonal subseries plot oldukça kullanışlı bir görselleştirme tekniğidir.
Zaman Serisi Dekompozisyonu (Time Series Decomposition)
Zaman serisi bileşenleri başlıklı bölümde zaman serilerinin kompozisyonunu oluşturan bileşenlerin neler olduğunu incelemiştik, zaman zerisi dekompozisyonu analizi ile bu bileşenlerinin ayrıştırılması işlemini gerçekleştireceğiz ve seriyi oluşturan faktörleri yakından inceleyeceğiz.
Google Trends üzerinden 2015 ve 2019 yılları arasında Türkiye’den yapılan “samsung” aramalarına ait verileri indirelim ve R’da time series plot ile zaman serisi olarak görselleştirelim.
data = ts(google_trends_data$samsung, start=2015, frequency=52)
plot(data, ylab = "Trend", xlab = "Years")
Seriye dekompozisyon işlemi uygulayalım.
data_decomp = decompose(data)
plot(data_decomp, ylab = "Trend", xlab = "Years")
Şekil 1.7’de göründüğü gibi normal şartlarda günlük hayatımızda incelediğimiz zaman serilerinde mevsimsellik ve trend faktörlerini net bir biçimde görememekteyiz. Zaman serisi dekompozisyonu ile seriyi oluşturan bileşenler net bir biçimde görselleştirilmiştir.
Observed (Gözlemlenen):
Zaman serisinin dekompoze edilmemiş halidir, gözlemlerin saf halini yansıtır.
Trend (Eğilim):
Logaritmik olarak hesaplanmış polinom eğilim çizgisidir, bu komponent doğrusal (linear) olmadığı için reel trendi daha net yansıtmaktadır.
Seasonal (Mevsimsel):
Mevsimsel döngü desenlerini (patterns) açıklayan bileşendir. Şekil 1.7’yi incelediğinizde burada net olarak görülmeyen sezonsal hareketler Şekil. 1.8’de çok daha net şekilde gözlemlenmiştir.
Random (Rassal):
Anomalileri yansıtan bileşendir, mevcut zaman serisinden trend ve seasonality bileşenlerini çıkardığımızda geriye kalan veriler random hareketleri oluşturur.
Kaynaklar
Kapanış Notları
Zaman serisi analizi birçok iş modelinde nedenselik ilişkilerini açıklamak ve iş akışını optimize etmek için kullanılan katma değerli bir analiz sürecidir.
Verilerin zaman serileri üzerinde incelenmeleri, ortalamalar ve oransal veriler üzerinden alınan kararlara oranla sapmaların ve sezonsallıkların çok daha iyi anlaşılmasını sağlayarak stratejik kararlarda önemli bir rol oynar.
Yazı ile ilgili sorularınız veya danışmanlık talepleriniz için LinkedIn üzerinden iletişime geçebilirsiniz.
Sonraki yazıda görüşmek üzere.