Lewati ke konten utama

Dekomposisi Deret Waktu: Memahami Tren, Musiman, dan Derau

Pelajari cara memecah data deret waktu menjadi komponen bermakna seperti tren, musiman, dan residual menggunakan model aditif dan multiplikatif. Pelajari metode klasik dan STL. Jelajahi penyesuaian musiman dan praktikkan peramalan dengan model dekomposisi.
· 8 mnt Baca

Jelajahi bersama AI

Dekomposisi adalah salah satu hal yang lebih menarik dalam data science. Intinya, dekomposisi berarti memecah sesuatu yang kompleks menjadi bagian-bagian yang lebih sederhana dan lebih mudah ditafsirkan. Ini bisa diterapkan pada matriks, model, atau sinyal. 

Karena merupakan gagasan umum, bentuknya bisa beragam. Dalam aljabar linear, ada dekomposisi QR, eigendecomposition, dekomposisi nilai singular, dan dekomposisi Cholesky, untuk menyebut beberapa. Di bidang lain, ada transformasi Fourier, analisis komponen utama, dan bahkan topic modeling menggunakan metode seperti LDA. Variabilitas dalam model regresi dapat didekomposisi menjadi komponen jumlah kuadrat: SST, SSR, dan SSE. Kita bahkan dapat memandang pohon keputusan sebagai bentuk dekomposisi. 

Di sini, kita akan meninjau salah satu favorit kami: dekomposisi deret waktu. Jika pada akhirnya kami berhasil membangkitkan rasa ingin tahu Anda, ikuti kursus Peramalan di R bersama Profesor Rob Hyndman.

Apa Itu Dekomposisi Deret Waktu?

Dekomposisi deret waktu adalah metode untuk memecah suatu deret waktu menjadi komponen terpisah yang disebut tren atau siklus-tren, musiman, dan residual. Tujuan dekomposisi deret waktu adalah untuk lebih memahami pola yang mendasari dan meningkatkan akurasi peramalan.

Apa Saja Komponen Deret Waktu?

Mari kita lihat komponen deret waktu. Ini mungkin cara terbaik untuk memahami gagasannya.

Komponen tren

Tren dari suatu deret waktu (seperti namanya) adalah pergerakan jangka panjang. Perlu kami sebutkan bahwa komponen tren sering kali sebenarnya dipandang sebagai siklus-tren, di mana siklus dipahami sebagai pola panjang yang tidak beraturan. Penjualan mobil secara historis dipahami bergerak dalam siklus tujuh tahun (entah kenapa), meskipun mungkin, dengan peralihan ke mobil listrik, tidak lagi demikian.

Inti yang biasanya didapat orang dari tren adalah ini: Apakah data meningkat atau menurun, atau tetap stabil, dalam jangka panjang? Kenaikan suhu laut global selama beberapa dekade terakhir adalah salah satu tren yang jelas (baca: buruk).

Komponen musiman

Komponen musiman akan memerlukan penjelasan sedikit lebih panjang karena sedikit lebih rumit. Komponen musiman dari suatu deret waktu adalah siklus jangka pendek yang berulang dalam data dan terjadi pada interval teratur. Pikirkan harian, bulanan, mingguan, triwulanan. Kuncinya di sini adalah intervalnya harus cukup teratur. Anda mungkin melihat, misalnya, bahwa pesanan kedai kopi mengikuti musiman mingguan jika orang suka membuat kopi di rumah pada hari Minggu. (Kita akan menelaah pertanyaan tentang pesanan kedai kopi ini di bagian berikutnya.)

Hal tentang musiman adalah bahwa ia bisa lebih rumit daripada kelihatannya. Pikirkan bagaimana jumlah minggu dalam setahun bukan bilangan bulat (~52,18). Atau pikirkan bagaimana bulan-bulan tidak berjarak sama: Februari memiliki 28 (atau 29) hari, tetapi Juli selalu memiliki 31.

Lebih dari itu, karena setiap tahun sedikit lebih dari 52 minggu, dan karena bulan juga bervariasi, Anda tidak bisa membagi sebagian besar bulan secara merata ke dalam minggu. Ini jelas saat Anda mempelajari kalender. Namun yang kurang jelas bagi analis data adalah bahwa, ketika Anda melihat data pada tingkat mingguan, lalu mengagregasikannya ke tingkat bulanan, Anda mungkin melihat hal-hal yang tidak konsisten, seperti bagaimana suatu Januari mungkin memiliki empat hari Senin, tetapi Januari berikutnya memiliki lima.

Komponen residual / tidak beraturan / sisa

Semua yang tersisa setelah menarik keluar siklus-tren dan komponen musiman kita sebut, tepatnya, komponen residual, yang mencakup hal-hal anomali dalam data, seperti sebuah peristiwa besar, dan derau acak. Berlawanan dengan apa yang mungkin Anda pikirkan karena namanya, komponen residual bukan artefak yang tak berguna. Semua data memiliki variabilitas yang tidak terjelaskan, dan mengukur besarnya variabilitas itu penting. Menariknya, residual sering berbentuk distribusi Gaussian dalam deret yang tertib, yang dalam hal ini kita bisa mengevaluasi peristiwa black swan dengan uji hipotesis.

Model Dekomposisi Deret Waktu

Setelah kita membahas bagian-bagian penyusun deret waktu, perlu kami sebutkan bahwa sebenarnya ada dua jenis umum dekomposisi deret waktu. Kita akan mulai dengan model aditif.

Dekomposisi aditif

Berikut adalah rumus dekomposisi aditif:

Perhatikan tanda tambah. Rumus ini menyatakan bahwa jika Anda mengambil tren lalu menambahkannya dengan komponen musiman, dan menambahkannya lagi dengan residual, Anda akan mendapatkan kembali deret waktu asal. Secara umum, kita menggunakan dekomposisi aditif ketika variasi musiman konstan dari waktu ke waktu.

Dekomposisi multiplikatif

Berikut adalah rumus dekomposisi multiplikatif. Perhatikan tanda perkalian pada versi ini. 

Kita menggunakan model multiplikatif ketika variasi musiman berskala mengikuti tren. Artinya, ketika Anda melihat besarnya efek musiman menjadi lebih besar saat keseluruhan deret naik atau turun. Yang kita gambarkan di sini sebenarnya adalah bentuk dari heteroskedastisitas.

Teknik Dekomposisi Deret Waktu

Sejauh ini, kita telah membahas apa saja yang masuk dalam dekomposisi deret waktu, dan dua jenis umum utamanya. Selanjutnya, kita perlu membahas dua metode yang paling umum. Masing-masing dapat diterapkan sebagai model aditif atau multiplikatif. 

Dekomposisi klasik

Dekomposisi klasik lebih mudah dipahami. Metode ini berasal dari tahun 1920-an tetapi masih relevan hingga kini. Untuk menunjukkan dekomposisi klasik, mari gunakan Excel. Dekomposisi klasik, seperti STL yang akan kami tunjukkan berikutnya, dapat dilakukan dengan model aditif atau multiplikatif. Untuk contoh ini, kita akan membuat versi aditif.

Jika Anda ingin mencoba sendiri, gunakan CSV index_1 dalam dataset penjualan kopi yang sangat menarik di Kaggle. Sebagai referensi, kami mengagregasi dan merangkum penjualan per hari.

  • Pertama, kita menghitung siklus-tren. Kita mengidentifikasi musiman mingguan, dan ada tujuh hari dalam seminggu, sehingga periode musiman ganjil, yang berarti rata-rata bergerak kita harus dipusatkan menggunakan jendela simetris. Yaitu, moving average 7 hari. Harap berhati-hati dengan penyelarasan dan pemusatan di lembar Excel.

  • Berikutnya, kita mencari deret yang telah dihilangkan tren (detrended) dengan mengurangkan tren dari deret asli.

  • Lalu, untuk menemukan komponen musiman, kita merata-ratakan nilai yang sudah di-detrend untuk setiap periode musiman. Tambahan penting: Anda akan melihat bahwa komponen musiman kemungkinan tidak berjumlah tepat nol. Pastikan untuk menyesuaikannya dengan normalisasi:

    • Hitung mean dari komponen musiman Anda.

    • Kurangkan mean musiman dari setiap nilai musiman.

  • Terakhir, untuk sisa (remainder), kita mengurangkan tren dan periode musiman dari deret asal. 

classical additive time series decomposition in Excel

Jika kita melihat deret kita memiliki efek musiman yang berubah mengikuti tingkat data, kita akan mempertimbangkan dekomposisi multiplikatif sebagai gantinya. Langkah-langkah dekomposisi multiplikatif hampir sama, kecuali kita menggunakan pembagian alih-alih pengurangan. Secara khusus, kita akan mencari deret yang di-detrend dengan membagi deret asli dengan siklus-tren. Lalu, kemudian, untuk menemukan sisa, kita akan membagi deret asli dengan hasil kali komponen tren dan musiman. (Sebagai alternatif, kita bisa mengambil logaritma natural dari deret asal dan menerapkan dekomposisi aditif. Ini akan sama secara fungsional.)

Dekomposisi STL 

Dekomposisi STL, singkatan dari seasonal and trend decomposition using LOESS, adalah versi dekomposisi yang lebih modern. Ini lebih sulit untuk dijelaskan, tetapi umumnya lebih fleksibel daripada metode klasik. STL bekerja dengan menggunakan metode bernama LOESS, yang menyesuaikan model regresi sederhana pada potongan kecil data yang saling tumpang tindih. Ia menerapkan regresi berbobot lokal ini untuk mengisolasi komponen tren dan musiman secara terpisah.

Metode ini mengatasi kelemahan spesifik pada dekomposisi klasik, yaitu pada versi klasik tidak ada estimasi siklus-tren atau sisa untuk observasi pertama dan terakhir. Anda bisa melihat ini pada sel kosong di Excel, di baris 3, 4, 5, dan 20, 21, dan 22, di atas.

Perlu juga disebutkan bahwa siklus-tren yang diidentifikasi oleh dekomposisi klasik menghaluskan lonjakan dan penurunan cepat, sehingga mungkin mengabaikan hal-hal penting yang terjadi dalam deret. Terakhir, dekomposisi klasik menerima begitu saja gagasan adanya pola musiman, padahal, dengan cukup data, terkadang kita bisa melihat pola musiman berubah.

Mari mulai dengan membuat plot waktu dari deret asli. Seperti sebelumnya, sebagai langkah pertama, kita mengagregasi dan merangkum dataset Kaggle untuk mendapatkan deret yang kita minati.

coffee_sales_data <- read.csv("/Users/x/Desktop/index_1.csv")
coffee_sales_data <- as.data.frame(coffee_sales_data)
library(dplyr)
library(ggplot2)

coffee_sales_data |>
  group_by(date) |>
  summarize(money = sum(money)) |>
  ggplot(aes(x = as.Date(date), y = money)) +
  geom_line(color = '#01ef63') +
  labs(title = "Coffee Sales") +
  labs(subtitle = "Time series")

Berikutnya, kita mendekomposisi deret menjadi komponen tren, musiman, dan sisa. Kotak di bagian atas grafik dekomposisi menunjukkan deret asli, meski sedikit tertekan.

coffee_sales_data |>
  group_by(date) |>
  summarize(money = sum(money)) |>
  mutate(date = as.Date(date)) |>
  as_tsibble() |>
  filter(date > '2024-02-28') |>
  filter(date < '2024-05-01') |>
  model(
      STL(money ~ season(window = "periodic"))
  ) |>
  components() |>
  autoplot(color = '#203147') +
  labs(title = "Coffee Sales") +
  labs(subtitle = "Classical additive decomposition")

coffee_sales_data |>
  group_by(date) |>
  summarize(money = sum(money)) |>
  mutate(date = as.Date(date)) |>
  as_tsibble() |>
  filter(date > '2024-02-28') |>
  filter(date < '2024-05-01') |>
  model(
      STL(money ~ season(window = "periodic"))
  ) |>
  components() -> ts_components

ts_components |>
  autoplot(color = '#203147') +
  labs(title = "Coffee Sales") +
  labs(subtitle = "Classical additive decomposition")

Perhatikan bahwa, tidak seperti dekomposisi klasik, dataframe yang kita dapatkan kembali tidak memiliki celah di awal atau akhir.  

print(ts_components)

Ada beberapa kelemahan pada dekomposisi STL juga, dan jika Anda tertarik, kami menambahkan informasinya ke FAQ kami. 

Dekomposisi Deret Waktu dan Penyesuaian Musiman

Sering kali, berguna untuk membuat versi data yang disesuaikan secara musiman. Dekomposisi deret waktu membantu hal ini. Untuk membuat versi yang disesuaikan musiman, kita cukup menjumlahkan komponen tren dan sisa. Atau, kita dapat mengurangkan komponen musiman dari deret asal; keduanya akan menghasilkan hal yang sama.

seasonally_adjusted <- components |>
  mutate(seasonally_adjusted = money - season_week)

season_adjust_data <- seasonally_adjusted |>
  select(date, money, season_adjust) |>
  pivot_longer(cols = c(money, season_adjust), names_to = "series", values_to = "value")

season_adjust_data |>
  autoplot() + facet_wrap(~series) +
  scale_color_manual(values = c(
    "money" = '#203147',          # blue
    "season_adjust" = '#01ef63'   # orange
  )) +
  facet_wrap(~series) +
  labs(title = "Coffee Sales: Original vs Seasonally Adjusted")

Kami menemukan bahwa tidak ada musiman yang sangat kuat dalam dataset tertentu ini, yang pada dirinya sendiri menarik.

Kekuatan data yang disesuaikan musiman adalah dapat membantu kita memahami fitur tertentu dari deret kita. Kita dapat melihat apakah tren yang mendasari merupakan hasil dari musiman, misalnya. Kedua, kita dapat menelaah lebih dekat kejadian tidak biasa dalam data. Apakah kita menganggap promosi hari Jumat berhasil karena itu hari Jumat atau karena promosi? Nah, menggunakan dekomposisi deret waktu dan penyesuaian musiman, kita dapat menguji pertanyaan seperti itu.

Dekomposisi Deret Waktu dan Peramalan

Anda mungkin terkejut mendengar bahwa dekomposisi deret waktu juga berguna dalam peramalan. Kami memikirkannya dalam dua cara utama. Pertama, kita ingin memahami komponen deret waktu kita untuk membantu memutuskan model peramalan mana yang harus digunakan. Jika kita melihat musiman yang kuat, kita mungkin cenderung pada model seperti pelicinan eksponensial Holt-Winters atau metode ETS, yang secara khusus dibangun untuk menangani komponen tren dan musiman.

Kedua, kita bahkan dapat menggunakan data yang telah didekomposisi sebagai bagian dari peramalan kita, yang memberi kita opsi. Kita, misalnya, dapat menjalankan model peramalan non-musiman pada versi data yang disesuaikan musiman. (Kita dapat memperkenalkan kembali komponen musiman nanti.) Penyesuaian musiman sangat membantu ketika kita ingin menggunakan model yang fleksibel, seperti ARIMA standar dan regresi linear. 

Di sini, kita membuat model ARIMA sederhana untuk meramalkan data yang disesuaikan musiman. 

season_adjust_data_filtered <- season_adjust_data |>
  filter(series == "season_adjust") |>
  as_tsibble(index = date)

seasonal_adjust_arima_model <- season_adjust_data_filtered |>
  model(
    ARIMA(value)
  )

seasonal_adjust_arima_model |>
  forecast(h = "14 days") |>  
  autoplot(season_adjust_data_filtered, color = '#01ef63') +
  labs(title = "Forecast of Seasonally Adjusted Coffee Sales",
       subtitle = "Simple ARIMA Model",
       y = "Money (Seasonally Adjusted)",
       x = "Date")

Kita juga dapat meramalkan deret yang disesuaikan musiman dan menambahkan kembali komponen musiman, yang secara efektif memberi kita peramalan musiman. Semua ini dimungkinkan melalui dekomposisi awal kita.

# Build tagged historical and forecast data
historical_data <- components |>
  as_tibble() |>
  select(date, money) |>
  mutate(source = "historical")

forecast_data <- final_forecast |>
  as_tibble() |>
  transmute(date, money = money_forecast) |>
  mutate(source = "forecast")

# Bind and create tsibble
full_data <- bind_rows(historical_data, forecast_data) |>
  as_tsibble(index = date, validate = FALSE)

# Plot with color by source
full_data |>
  ggplot(aes(x = date, y = money, color = source)) +
  geom_line() +
  scale_color_manual(values = c(
    "historical" = "#203147",   # dark blue for real data
    "forecast" = "#01ef63"      # green for forecast
  )) +
  labs(
    title = "Coffee Sales: Actual and Forecast",
    subtitle = "Historical vs Forecast",
    y = "Money",
    x = "Date"
  )

Penutup

Saya harap Anda menyukai artikel kami tentang dekomposisi deret waktu! Ingat bahwa dekomposisi hanyalah satu bagian dari analisis deret waktu, jadi untuk menjadi ahli, daftarlah ke kursus Peramalan di R bersama Profesor Rob Hyndman, yang membantu mengembangkan paket R yang kami gunakan untuk visual kami. Kami juga memiliki kursus Memvisualisasikan Data Deret Waktu di Python jika Anda tertarik dengan gagasan dalam artikel ini tetapi lebih menyukai Python, yang juga sangat baik untuk hal semacam ini. 

Josef Waples

Penulis

Josef Waples

Saya penulis dan editor data science dengan kontribusi pada artikel riset di jurnal ilmiah. Saya sangat tertarik pada aljabar linear, statistika, R, dan sejenisnya. Saya juga cukup sering bermain catur! 

Laiba Siddiqui

Penulis

Laiba Siddiqui

Saya seorang ahli strategi konten yang senang menyederhanakan topik kompleks. Saya telah membantu perusahaan seperti Splunk, Hackernoon, dan Tiiny Host membuat konten yang menarik dan informatif untuk audiens mereka.

FAQs

Apa itu dekomposisi deret waktu?

Dekomposisi deret waktu adalah proses memecah deret waktu menjadi tiga komponen yang dapat ditafsirkan: tren, musiman, dan residual (atau komponen tidak beraturan). Tren menunjukkan perkembangan jangka panjang, komponen musiman menangkap siklus jangka pendek yang berulang, dan residual mencerminkan derau acak atau kejadian tak terduga. Dekomposisi membantu analis lebih memahami struktur data dan dapat meningkatkan peramalan dengan memodelkan setiap komponen secara terpisah.

Mengapa ada nilai hilang di awal dan akhir dekomposisi klasik?

Moving average terpusat memerlukan data yang simetris di sekitar setiap titik. Untuk moving average 7 hari, Anda tidak dapat menghitung nilai terpusat untuk tiga hari pertama atau tiga hari terakhir. Akibatnya, dekomposisi klasik tidak memberikan estimasi untuk tepi, sehingga ada celah pada komponen tren, musiman, dan residual di batas-batasnya.

Kapan saya harus menggunakan dekomposisi aditif vs. multiplikatif?
  • Gunakan dekomposisi aditif ketika fluktuasi musiman relatif konstan dari waktu ke waktu.
  • Gunakan dekomposisi multiplikatif ketika komponen musiman meningkat atau menurun mengikuti tren, artinya efeknya berskala dengan level data. Ini sering terjadi pada deret waktu heteroskedastik (dengan varians tidak konstan).

Bisakah saya beralih antara dekomposisi aditif dan multiplikatif?

Ya. Pendekatan umum adalah mentransformasikan deret dengan log dan menerapkan dekomposisi aditif. Ini setara secara matematis dengan model multiplikatif pada skala asli. Ini dapat menyederhanakan pemodelan dan menstabilkan varians.

Apakah residual dari dekomposisi selalu mengikuti distribusi Gaussian?

Tidak. Meskipun dekomposisi STL mengasumsikan residual kira-kira berdistribusi normal, ini tidak selalu terjadi pada data dunia nyata. Residual dapat menceng, leptokurtik, atau dipengaruhi oleh outlier dan perubahan struktural. Namun, jika dekomposisi cocok dengan baik, komponen sisa sering menyerupai derau Gaussian.

Apa kekurangan dekomposisi klasik?

Dekomposisi klasik memiliki beberapa keterbatasan:

  • Efek tepi: Seperti disebutkan, tidak dapat mengestimasi siklus-tren atau residual di awal atau akhir deret.

  • Musiman tetap: Mengasumsikan pola musiman stabil dan tidak berubah seiring waktu.

  • Sensitif terhadap outlier: Karena berbasis pada moving average dan rata-rata sederhana, lebih rentan terdistorsi oleh nilai ekstrem.

  • Fleksibilitas terbatas: Menggunakan aturan pemulusan yang telah ditetapkan dan tidak dapat beradaptasi dengan baik terhadap pola tidak standar.

Apa yang membuat dekomposisi STL lebih baik daripada dekomposisi klasik?

STL mengatasi banyak keterbatasan dekomposisi klasik:

  • Menangani musiman yang tidak konstan, di mana pola berubah seiring waktu.

  • Menyediakan estimasi di batas, menghindari nilai hilang di tepi.

  • Memungkinkan parameter pemulusan yang ditentukan pengguna, memberikan kontrol lebih atas tingkat pemulusan tiap komponen.

  • Tangguh terhadap outlier dengan opsi fitting yang robust.

Apakah dekomposisi STL memiliki keterbatasan?

Ya. Meskipun STL lebih fleksibel, ada beberapa catatan:

  • STL hanya mendukung dekomposisi aditif, bukan multiplikatif. Jika terdapat perilaku multiplikatif, diperlukan transformasi log.

  • Memerlukan penyetelan parameter untuk jendela musiman dan tren agar hasil optimal.

  • Mengasumsikan musiman periodik, yang mungkin tidak menangkap periode musiman yang tidak teratur atau berubah tanpa penyesuaian.

Apa itu LOESS dalam dekomposisi STL?

LOESS (Locally Estimated Scatterplot Smoothing) adalah jenis regresi lokal yang digunakan dalam dekomposisi STL untuk mengestimasi kurva halus melalui subset data. Alih-alih menyesuaikan satu tren global, LOESS menyesuaikan banyak regresi sederhana pada jendela yang tumpang tindih. Hasil fitting lokal ini kemudian digabung untuk membentuk estimasi halus dari komponen tren dan musiman. Ini membuat LOESS sangat berguna untuk menangkap perubahan bertahap dan pola tidak beraturan dalam data deret waktu.

Apa itu moving average dalam analisis deret waktu?

Moving average adalah teknik pemulusan yang digunakan untuk mengurangi fluktuasi jangka pendek dan menonjolkan tren jangka lebih panjang dalam data deret waktu. Teknik ini bekerja dengan mengambil rata-rata nilai dalam jendela tetap (seperti 7 hari atau 12 bulan) yang "bergerak" sepanjang deret. Misalnya, moving average 7 hari menghaluskan setiap titik dengan merata-ratakan tiga hari sebelum dan sesudahnya. Moving average umum digunakan untuk mengestimasi komponen tren dalam dekomposisi klasik.

Apa itu model dekomposisi?

Model dekomposisi adalah cara memecah deret waktu menjadi bagian-bagian terpisah yang masing-masing menjelaskan jenis pola berbeda dalam data. Bagian-bagian ini biasanya mencakup tren (arah jangka panjang), musiman (siklus jangka pendek yang berulang), dan residual (derau acak atau peristiwa tidak beraturan). Ada dua jenis utama model dekomposisi: aditif, di mana bagian-bagiannya digabung dengan penjumlahan, dan multiplikatif, di mana bagian-bagiannya digabung dengan perkalian. Pilihan di antara keduanya bergantung pada apakah besarnya perubahan musiman tetap konstan atau tumbuh mengikuti level keseluruhan data.

Topik

Terkait

blogs

Tutorial Korelasi di R

blogs

Spaghetti Plot dan Jalur Badai

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026