Memisahkan unsur Trend dan Musiman pada data Time Series

Tujuan memisahkan unsur trend dan musiman adalah untuk memahami mana yang lebih dominan dari kedua unsur tersebut. Data Time series biasanya mengandung tiga unsur; yakni trend, musiman, dan siklus. Unsur siklus biasanya jarang terlihat karena memerlukan periode data yang sangat lama. Sehingga dalam peramalan, biasanya yang sering kita jumpai adalah musiman dan trend.

Pemisahan unsur trend dan musiman bisa bermanfaat untuk melakukan perencanaan bisnis. Ketika kita berbicara trend, biasanya kita membahas pola yang lebih panjang daripada musiman. Sehingga strategi yang akan dilakukan juga memiliki jangka waktu yang lama. Misalkan, pada tahun 2023 ini kita memprediksi adanya trend peningkatan penjualan sebesar 5 persen. Maka, strategi yang dilakukan menyesuaikan dengan trend peningkatan tersebut atau ditarget lebih tinggi.

Mengetahui musiman bisa membantu management ungtuk melakukan strategi diatas dengan tepat sasaran. Misalnya strategi yang dibuat sudah lengkap dalam satu tahun, sekarang tinbul pertanyaan kapan strategi itu dilakukan dalam tahun tersebut. Disinilah data musiman berperan. Mungkin saja penjualan akan meningkat pada bulan bulan tertentu, ataukah penjualan bersifat flat sepanjang tahun.

Berikut latihan pengolahan data untuk memisahkan unsur trend dan musiman dalam sebuah data time series. saya mengambil data saham PWON di finance yahoo. Data yang akan diolah sejumlah 245 data yang merupakan pergerakan data saham PWON dalam satu tahun terakhir. Saya akan menggunakan python untuk mengolah data tersebut. Jika anda masih awam dengan python, silahkan simak artikel: cara install dan menjalankan python di windows.

data memisahkan tren dan musiman

Pertama, kita siapkan data dalam format csv dan menyimpannya dalam folder notebook yang akan kita kerjakan. Kemudian kita import data tersebut dengan menggunakan syntax:

#1 langkah pertama mengimport data, menampilkan 5 data awal dan 5 data akhir
import pandas as pd
df = pd.read_csv("Data.csv")
print(df.head())
print(df.tail())

Kemudian kita  membuat plot time series untuk melakukan identifikasi secara visual terlebih dahulu, dengan syntax sbb:

#2 membuat time series plot
import matplotlib.pyplot as plt
import seaborn as sns
sns.lineplot(df['data'])
plt.ylabel("satuan")
plt.savefig('data plot.png')

Bagaimana kesan anda melihat gambar diatas? Data ini adalah data satu tahun dan terdiri dari puncak puncak yang merupakan musiman dari data saham PWON. Tentu bisa dipastikan bahwa PWON memiliki unsur musiman yang lebih tinggi dibandingkan unsur trend. Meskipun terlihat ada trend penurunan saham, tapi itu kecil sekali. Analisis inilah yang dimaksudkan saat melihat chart time series diatas. Ada hipotesis awal sehingga ada pemahaman awal saat mengolah data selanjutnya.

Memisahkan unsur Trend dan Musiman

Sebelum kita memisahkan trend dengan musiman, kita perlu mengetahui periode musiman dari data yang ada. Pada grafik diatas, belum diketahui berapa periode musiman yang terjadi. Jika datanya perhari, dan musiman tersebut terjadi selama sebulan sekali, berarti periode musimannya adalah 30.

Untuk mengetahui periode musimannya kita perlu periksa dengan data ACF dan PACF. Secara singkat kedua indikator ini memeriksa hubungan lag 1 dengan lag berikutnya. Sehingga dengan mudah diketahui periode musiman, yakni lag yang signifikan berpengaruh kepada lag awal. Untuk mengetahui acf dan pacf kita gunakan sintax sbb:

from statsmodels.graphics.tsaplots import plot_pacf
from statsmodels.graphics.tsaplots import plot_acf
plot_pacf(data['data'])
plot_acf(data['data'])

hasilnya akan berbentuk dua grafik ACF dan PACF

Perhatikan grafik PACF, nilai korelasi PACF dikatakan signifikan jika melewati daerah arsiran biru baik dibawah ataupun diatas. Bedanya klo diatas dia berkorelasi positif, jika melewati arsir bagian bawah berarti korelasinya negatif. Kita bisa sedikit memberi kesimpulan bahwa pacf signifikan pada n ke 4 dan 8, dst.. ini memang menggambarkan musiman. Namun, data ini kurang didukung dengan ACF yang tampaknya memiliki kendala stasioner. Kendala ini yang menyulitkan kita untuk mengetahui periode musiman pada ACF. Sehingga perlu dilakukan differencing pertama.

Differencing pertama dapat dilakukan dengan syntax:

import numpy as np
data['data'] = np.log(df['data'])
data['data'] = df['data'].diff()
data = data.drop(data.index[0])
plot_pacf(data['data'])
plot_acf(data['data'])

perintah “import” berarti kita menggunakan module python yang harus terinstall terlebih dahulu. Pastikan modulenya sudah terdownload dan terinstal. Tutorial lengkapnya ada di artikel cara install dan menjalankan python.

Hasilnya adalah sebagai berikut:

Dari kedua grafik ACF dan PACF tersebut kita dapat simpulkan bahwa periode musiman terletak pada n = 7. Karena pada lag 7 terdapat korelasi yang signifikan baik pada PACF maupun ACF. Begitupun kelipatannya meskipun signifikannya terus menurun.

Selanjutnya adalah melakukan kick off memisahkan unsur trend dan musiman dengan menuliskan syntax:

from statsmodels.tsa.seasonal import seasonal_decompose
decompose = seasonal_decompose(df['data'],model='additive', period=7)
decompose.plot()
plt.savefig('dekomposisi.png', dpi=100)
plt.show()

perhatikan pada perintah “period=7”, saya tulis 7 sesuai hasil analisis sebelumnya yakni periode musimannya sama dengan 7. Hasilnya adalah:

Gambar yang paling atas adalah gambar time series yang sebenarnya, gabungan antara trend dan musiman. Gambar kedua terlihat lebih smooth karena gambar tersebut adalah unsur trend murni. Sedangkan musimannya sudah dipisahkan pada grafik ketiga. Ketika kita melihat gambar kedua, kita tidak terganggu lagi dengan adanya fluktuasi musiman, sehingga bisa melakukan perencanaan lebih baik. Secara deyil atau musiman, kita bisa melihat kecenderungan fluktiasi di setiap musim yakni ada satu puncak besar di n ketiga, kemudian puncak kecil di n ke lima.

Gambar baris terakhir adalah residual yang menerangkan nilai error yang terjadi. Semakin jauh jarak error dari garis 0, maka model semakin tidak baik.

Selamat Belajar

Similar Posts

3 Comments

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *