Ekstrak musiman dari deret waktu python

Tren dan Musiman umumnya ada di sebagian besar data deret waktu di dunia nyata. Ketika kita ingin melakukan peramalan dengan time series, kita membutuhkan time series yang stasioner

Deret waktu stasioner adalah kumpulan data deret waktu di mana tidak ada informasi tren atau musiman di dalamnya. Deret waktu stasioner adalah deret dengan rata-rata konstan, varians konstan, dan autokorelasi konstan

Untuk membuat deret waktu stasioner, kita perlu menemukan cara untuk menghilangkan tren dan musiman dari deret waktu kita sehingga kita dapat menggunakannya dengan model prediksi. Untuk melakukan itu, kita perlu memahami apa itu tren dan musiman secara mendalam untuk menanganinya dengan lebih baik

Terlepas dari tren dan musiman, beberapa deret waktu juga memiliki komponen kebisingan/kesalahan/sisa. Kami dapat menguraikan deret waktu untuk melihat komponen yang berbeda

> Apa yang Dapat Anda Pelajari dari Artikel Ini?

Sebagai bagian dari tutorial ini, kami telah menjelaskan cara mendeteksi dan kemudian menghapus tren serta musiman yang ada dalam kumpulan data deret waktu. Kami telah menjelaskan berbagai cara untuk menghapus tren dan musiman seperti transformasi daya, transformasi log, fungsi jendela bergerak, regresi linier, dll dari data. Selain itu, kami juga telah menjelaskan cara menguji stasioneritas setelah tren dan musim dihilangkan. Tutorial adalah titik awal yang baik untuk memahami konsep-konsep seperti tren, musiman, stasioneritas, dll

Di bawah ini, kami telah membuat daftar bagian-bagian penting dari Tutorial untuk memberikan gambaran umum tentang materi yang dibahas

Bagian Penting Dari Tutorial

Time-series umumnya terdiri dari dua jenis

  • Deret Waktu Aditif. Deret waktu aditif adalah deret waktu di mana komponen (tren, musiman, kebisingan) ditambahkan untuk menghasilkan deret waktu
    • Time-Series = tren + musiman + kebisingan
  • Deret Waktu Perkalian. Deret waktu multiplikatif adalah deret waktu di mana komponen (tren, musiman, kebisingan) dikalikan untuk menghasilkan deret waktu. seseorang dapat melihat peningkatan amplitudo musiman dalam deret waktu multiplikatif
    • Time-Series = kebisingan tren musiman

Additive vs Multiplicative Time-Series

2. Kecenderungan

Tren mewakili peningkatan atau penurunan nilai deret waktu dari waktu ke waktu. Jika kita perhatikan bahwa nilai pengukuran dari waktu ke waktu meningkat atau menurun maka kita dapat mengatakan bahwa itu memiliki tren naik atau turun

Ada berbagai cara untuk menghilangkan tren deret waktu. Kami telah menjelaskan beberapa di bawah ini

  • Transformasi Log
  • Transformasi Daya
  • perataan lokal - Menerapkan fungsi jendela bergerak ke data deret waktu
  • Membedakan deret waktu
  • Regresi linier

3. Musiman

Kemusiman mewakili variasi dalam nilai terukur yang berulang dalam interval waktu yang sama secara teratur. Jika kita memperhatikan bahwa variasi tertentu dalam nilai terjadi setiap minggu, bulan, kuartal atau setengah tahunan maka kita dapat mengatakan bahwa deret waktu memiliki semacam musiman.

Ada berbagai cara untuk menghilangkan musiman. Tugas menghilangkan musim agak rumit. Kami telah menjelaskan beberapa cara di bawah ini untuk menghilangkan musiman

  • Nilai de-tren rata-rata
  • Membedakan deret waktu
  • Gunakan metode loess

Kami sekarang akan menjelajahi tren dan penghapusan musiman dengan contoh. Kami akan menggunakan kumpulan data penumpang udara terkenal yang tersedia online untuk tujuan kami karena memiliki tren dan musiman. Ini memiliki informasi tentang penumpang maskapai AS dari tahun 1949 hingga 1960 yang direkam setiap bulan. Silakan unduh dataset untuk mengikuti

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

%matplotlib inline

air_passengers = pd.read_csv("~/datasets/AirPassengers.csv", index_col=0, parse_dates=True)
air_passengers.head()
_

#PassengersMonth1949-01-011121949-02-011181949-03-011321949-04-011291949-05-01121

air_passengers.plot(figsize=(8,4), color="tab:red");

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

air_passengers["1952"].plot(kind="bar", color="tab:green", legend=False);

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Dengan melihat plot di atas kita dapat melihat bahwa deret waktu kita adalah deret waktu multiplikatif dan memiliki tren serta musiman. Kita bisa melihat trennya karena penumpang terus meningkat dari waktu ke waktu. Kita dapat melihat musiman dengan variasi yang sama berulang selama 1 tahun di mana nilai puncaknya sekitar bulan Agustus

Kita dapat menguraikan time-series untuk melihat berbagai komponen time-series. Modul Python bernama statmodels memberi kita utilitas yang mudah digunakan yang dapat kita gunakan untuk mendapatkan komponen individual dari deret waktu dan kemudian memvisualisasikannya

from statsmodels.tsa.seasonal import seasonal_decompose
_

decompose_result = seasonal_decompose(air_passengers, model="multiplicative")

trend = decompose_result.trend
seasonal = decompose_result.seasonal
residual = decompose_result.resid

decompose_result.plot();

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Kita dapat melihat komponen tren dan musiman secara terpisah serta komponen sisa. Ada kehilangan sisa di awal yang menetap kemudian

Seperti yang kami nyatakan di atas deret waktu adalah stasioner yang rata-rata, varian, dan kovarian otomatisnya tidak bergantung pada waktu. Kami dapat memeriksa rata-rata, varians, dan kovarians otomatis menggunakan fungsi jendela bergerak yang tersedia dengan panda. Kami juga akan menggunakan tes dicky-fuller yang tersedia dengan model statistik untuk memeriksa stasioneritas deret waktu. Jika deret waktu tidak stasioner maka kita perlu membuatnya stasioner

Di bawah ini kami telah mengambil rata-rata jendela bergerak dari 12 sampel. Kami perhatikan dari plot di atas bahwa ada musiman 12 bulan dalam deret waktu. Kami dapat mencoba berbagai ukuran jendela untuk tujuan pengujian

air_passengers.rolling(window = 12).mean().plot(figsize=(8,4), color="tab:red", title="Rolling Mean over 12 month period");
_

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

air_passengers.rolling(window = 20).mean().plot(figsize=(8,4), color="tab:red", title="Rolling mean over 20 month period");

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Kita dapat dengan jelas melihat bahwa deret waktu memiliki tren naik yang terlihat

Di bawah ini kami telah mengambil varian dari jendela bergerak dari 12 sampel. Kami perhatikan dari plot di atas bahwa ada musiman 12 bulan dalam deret waktu

air_passengers.rolling(window = 12).var().plot(figsize=(8,4), color="tab:red", title="Rolling Variance over 12 month period");
_

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

air_passengers.rolling(window = 20).var().plot(figsize=(8,4), color="tab:red", title="Rolling variance over 20 month period");
_

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Dari dua plot di atas, kami melihat bahwa deret waktu memiliki semacam efek penggandaan yang tampaknya meningkat seiring dengan periode waktu. Kita dapat melihat efek musiman yang rendah di awal yang meningkat seiring waktu

Di bawah ini kami juga memplot plot korelasi otomatis untuk data deret waktu. Plot ini membantu kita memahami apakah nilai deret waktu saat ini berkorelasi positif, berkorelasi negatif, atau tidak terkait sama sekali dengan nilai masa lalu. pustaka statsmodels menyediakan metode plot_acf siap pakai sebagai bagian dari modul statsmodels. grafis. tsaplots

air_passengers = pd.read_csv("~/datasets/AirPassengers.csv", index_col=0, parse_dates=True)
air_passengers.head()
_0

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Kita dapat melihat dari grafik di atas bahwa setelah 13 lag, garis masuk ke dalam interval kepercayaan (area biru muda). Hal ini dapat terjadi karena musiman 12-13 bulan dalam data kami

Tes Dicky-Fuller untuk Stasioneritas

Setelah kami menghapus tren dan musiman dari data deret waktu, maka kami dapat menguji stasioneritasnya menggunakan uji dicky-fuller. Ini adalah uji statistik untuk memeriksa stasioneritas data deret waktu

Baca Lebih Lanjut Tentang Tes

Kami dapat melakukan fungsionalitas pengujian Dicky-Fuller yang tersedia dengan pustaka statsmodels

Di bawah ini kami akan menguji stasioneritas deret waktu kami dengan fungsi ini dan mencoba menginterpretasikan hasilnya untuk lebih memahaminya

air_passengers = pd.read_csv("~/datasets/AirPassengers.csv", index_col=0, parse_dates=True)
air_passengers.head()
_1

air_passengers = pd.read_csv("~/datasets/AirPassengers.csv", index_col=0, parse_dates=True)
air_passengers.head()
_2

Kita dapat menginterpretasikan hasil di atas berdasarkan nilai p dari hasil

  • nilai-p > 0. 05 - Ini menyiratkan bahwa deret waktu tidak stasioner
  • p-nilai <=0. 05 - Ini menyiratkan bahwa deret waktu tidak bergerak

Kita dapat melihat dari hasil di atas bahwa p-value lebih besar dari 0. 05 karenanya deret waktu kami tidak stasioner. Itu masih memiliki komponen yang bergantung pada waktu yang perlu kita hapus

7. Hapus Tren

Ada berbagai cara untuk menghilangkan tren dari data seperti yang telah kita bahas di atas. Kami akan mencoba cara-cara seperti membedakan, transformasi daya, transformasi log, dll

7. 1 Transformasi Tercatat

Untuk menerapkan transformasi log, kita perlu mengambil log dari setiap nilai individual dari data deret waktu

air_passengers = pd.read_csv("~/datasets/AirPassengers.csv", index_col=0, parse_dates=True)
air_passengers.head()
_3

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Dari grafik pertama di atas, kita dapat melihat bahwa kita telah mengurangi varian dari data time-series. Kita dapat melihat nilai-y dari data deret waktu asli dan data deret waktu yang diubah log untuk menyimpulkan bahwa varian deret waktu berkurang

Kita dapat memeriksa apakah kita berhasil atau tidak dengan memeriksa masing-masing komponen deret waktu dengan menguraikannya seperti yang telah kita lakukan di atas

air_passengers = pd.read_csv("~/datasets/AirPassengers.csv", index_col=0, parse_dates=True)
air_passengers.head()
_4

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Harap buat CATATAN bahwa deret waktu kami memiliki tren dan musiman. Kami mencoba berbagai teknik untuk menghilangkan tren di bagian ini. Kami tidak akan menguji stasioneritas di bagian ini. Bagian selanjutnya dibangun berdasarkan bagian ini dan menjelaskan berbagai teknik untuk menghilangkan stasioneritas. Pada bagian tersebut, kami telah menguji stasioneritas. Silakan menguji stasioneritas setelah bagian ini jika deret waktu Anda hanya memiliki tren

7. 2 Transformasi Daya

Kita dapat menerapkan transformasi daya dalam data dengan cara yang sama seperti transformasi log untuk menghilangkan tren

air_passengers = pd.read_csv("~/datasets/AirPassengers.csv", index_col=0, parse_dates=True)
air_passengers.head()
_5

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Dari grafik pertama di atas, kita dapat melihat bahwa kita telah mengurangi varian dari data time-series. Kita dapat melihat nilai-y dari data deret waktu asli dan data deret waktu yang diubah daya untuk menyimpulkan bahwa varian deret waktu berkurang

Kita dapat memeriksa apakah kita berhasil atau tidak dengan memeriksa masing-masing komponen deret waktu dengan menguraikannya seperti yang telah kita lakukan di atas

air_passengers = pd.read_csv("~/datasets/AirPassengers.csv", index_col=0, parse_dates=True)
air_passengers.head()
_6

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

7. 3 Menerapkan Fungsi Jendela Bergerak

Kami dapat menghitung rata-rata bergulir selama periode 12 bulan dan menguranginya dari deret waktu asli untuk mendapatkan deret waktu yang tidak lagi tren

air_passengers = pd.read_csv("~/datasets/AirPassengers.csv", index_col=0, parse_dates=True)
air_passengers.head()
_7

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Dari grafik pertama di atas, kita dapat melihat bahwa kita tampaknya telah menghapus tren dari data deret waktu

Kita dapat memeriksa apakah kita berhasil atau tidak dengan memeriksa masing-masing komponen deret waktu dengan menguraikannya seperti yang telah kita lakukan di atas

air_passengers = pd.read_csv("~/datasets/AirPassengers.csv", index_col=0, parse_dates=True)
air_passengers.head()
_8

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Kita juga dapat menerapkan lebih dari satu transformasi. Kami pertama-tama akan menerapkan transformasi log ke deret waktu, lalu mengambil rata-rata penggiliran selama periode 12 bulan, lalu mengurangi deret waktu yang digulirkan dari deret waktu yang diubah log untuk mendapatkan deret waktu akhir

air_passengers = pd.read_csv("~/datasets/AirPassengers.csv", index_col=0, parse_dates=True)
air_passengers.head()
_9

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Dari grafik pertama di atas, kita dapat melihat bahwa kita dapat menghapus tren dari data deret waktu

Kita dapat memeriksa apakah kita berhasil atau tidak dengan memeriksa masing-masing komponen deret waktu dengan menguraikannya seperti yang telah kita lakukan di atas

air_passengers.plot(figsize=(8,4), color="tab:red");
0

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Kita juga dapat menerapkan lebih dari satu transformasi. Kami pertama-tama akan menerapkan transformasi daya ke deret waktu, lalu mengambil rata-rata penggiliran selama periode 12 bulan, lalu mengurangi deret waktu yang digulirkan dari deret waktu yang diubah daya untuk mendapatkan deret waktu akhir

air_passengers.plot(figsize=(8,4), color="tab:red");
1

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Dari grafik pertama di atas, kita dapat melihat bahwa kita dapat menghapus tren dari data deret waktu

Kita dapat memeriksa apakah kita berhasil atau tidak dengan memeriksa masing-masing komponen deret waktu dengan menguraikannya seperti yang telah kita lakukan di atas

air_passengers.plot(figsize=(8,4), color="tab:red");
2

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

7. 6 Menerapkan Regresi Linier untuk Menghilangkan Tren

Kami juga dapat menerapkan model regresi linier untuk menghilangkan tren. Di bawah ini kami menyesuaikan model regresi linier dengan data deret waktu kami. Kami kemudian menggunakan model fit untuk memprediksi nilai deret waktu dari awal hingga akhir. Kami kemudian mengurangi nilai prediksi dari deret waktu asli untuk menghilangkan tren

air_passengers.plot(figsize=(8,4), color="tab:red");
_3

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Dari grafik pertama di atas, kita dapat melihat bahwa kita dapat menghapus tren dari data deret waktu

Kita dapat memeriksa apakah kita berhasil atau tidak dengan memeriksa masing-masing komponen deret waktu dengan menguraikannya seperti yang telah kita lakukan di atas

air_passengers.plot(figsize=(8,4), color="tab:red");
_4

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Setelah menerapkan transformasi di atas, kita dapat mengatakan bahwa regresi linier tampaknya berhasil menghilangkan tren dibandingkan metode lainnya. Kami dapat mengonfirmasi lebih lanjut apakah itu benar-benar berhasil dengan menghapus komponen musiman dan memeriksa stasioneritas deret waktu

8. Hapus Musiman

Kami dapat menghapus musiman dengan teknik pembedaan. Kami akan menggunakan perbedaan pada berbagai deret waktu tren yang dihitung di atas

Kami telah menerapkan pembedaan pada deret waktu yang diubah log dengan menggeser nilainya sebanyak 1 periode dan mengurangkannya dari deret waktu asli yang diubah log

air_passengers.plot(figsize=(8,4), color="tab:red");
5

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Kita sekarang dapat menguji apakah deret waktu kita stasioner sekarang dengan menerapkan uji dicky-fuller yang telah kita terapkan di atas

air_passengers.plot(figsize=(8,4), color="tab:red");
6

air_passengers.plot(figsize=(8,4), color="tab:red");
7

Dari hasil tes dicky-fuller kami, kami dapat mengonfirmasi bahwa deret waktu TIDAK TETAP karena nilai p 0. 07 lebih besar dari 0. 05

Kami telah menerapkan perbedaan pada deret waktu yang diubah daya dengan menggeser nilainya sebanyak 1 periode dan mengurangkannya dari deret waktu yang diubah daya aslinya

air_passengers.plot(figsize=(8,4), color="tab:red");
_8

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Kita sekarang dapat menguji apakah deret waktu kita stasioner sekarang dengan menerapkan uji dicky-fuller yang telah kita terapkan di atas

air_passengers.plot(figsize=(8,4), color="tab:red");
_9

air_passengers["1952"].plot(kind="bar", color="tab:green", legend=False);
0

Dari hasil uji dicky-fuller kami, kami dapat mengonfirmasi bahwa deret waktu adalah STATIONARY karena nilai p 0. 02 kurang dari 0. 05

Kami telah menerapkan pembedaan pada deret waktu bergulir rata-rata dengan menggeser nilainya sebanyak 1 periode dan mengurangkannya dari deret waktu bergulir rata-rata asli

CATATAN

Harap perhatikan bahwa kami mengubah deret waktu sebanyak 1 periode dan membedakannya dari deret waktu yang tidak lagi tren. Adalah umum untuk mencoba menggeser deret waktu dengan periode waktu yang berbeda untuk menghilangkan musiman dan mendapatkan deret waktu yang stasioner

air_passengers["1952"].plot(kind="bar", color="tab:green", legend=False);
1

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Kita sekarang dapat menguji apakah deret waktu kita stasioner sekarang dengan menerapkan uji dicky-fuller yang telah kita terapkan di atas

air_passengers["1952"].plot(kind="bar", color="tab:green", legend=False);
2

air_passengers["1952"].plot(kind="bar", color="tab:green", legend=False);
_3

Dari hasil uji dicky-fuller kami, kami dapat mengonfirmasi bahwa deret waktu adalah STATIONARY karena nilai p 0. 02 kurang dari 0. 05

Kami telah menerapkan pembedaan pada deret waktu transformasi log-transformed & mean rolled dengan menggeser nilainya sebanyak 1 periode dan mengurangkannya dari deret waktu asli

air_passengers["1952"].plot(kind="bar", color="tab:green", legend=False);
_4

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Kita sekarang dapat menguji apakah deret waktu kita stasioner sekarang dengan menerapkan uji dicky-fuller yang telah kita terapkan di atas

air_passengers["1952"].plot(kind="bar", color="tab:green", legend=False);
5

air_passengers["1952"].plot(kind="bar", color="tab:green", legend=False);
6

Dari hasil uji dicky-fuller kami, kami dapat mengonfirmasi bahwa deret waktu adalah STATIONARY karena nilai p 0. 001 kurang dari 0. 05

Kami telah menerapkan perbedaan pada deret waktu yang diubah daya & rata-rata bergulir dengan menggeser nilainya sebanyak 1 periode dan mengurangkannya dari deret waktu asli

air_passengers["1952"].plot(kind="bar", color="tab:green", legend=False);
_7

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Kita sekarang dapat menguji apakah deret waktu kita stasioner sekarang dengan menerapkan uji dicky-fuller yang telah kita terapkan di atas

air_passengers["1952"].plot(kind="bar", color="tab:green", legend=False);
8

air_passengers["1952"].plot(kind="bar", color="tab:green", legend=False);
_9

Dari hasil uji dicky-fuller kami, kami dapat mengonfirmasi bahwa deret waktu adalah STATIONARY karena nilai p 0. 005 kurang dari 0. 05

Kami telah menerapkan pembedaan pada deret waktu transformasi regresi linier dengan menggeser nilainya sebanyak 1 periode dan mengurangkannya dari deret waktu transformasi log asli

from statsmodels.tsa.seasonal import seasonal_decompose
_0

Time Series - How to Remove Trend & Seasonality from Time-Series Data using Pandas [Python]

Kita sekarang dapat menguji apakah deret waktu kita stasioner sekarang dengan menerapkan uji dicky-fuller yang telah kita terapkan di atas

from statsmodels.tsa.seasonal import seasonal_decompose
_1

from statsmodels.tsa.seasonal import seasonal_decompose
_2

Dari hasil tes dicky-fuller kami, kami dapat mengonfirmasi bahwa deret waktu TIDAK TETAP karena nilai p 0. 054 lebih besar dari 0. 05

Ini mengakhiri tutorial kecil kami tentang menangani tren dan musiman dengan data deret waktu dan berbagai cara untuk menghapusnya

Bagaimana Anda menemukan musiman dari deret waktu dengan Python?

seasonal_decompose() menguji apakah deret waktu memiliki musiman atau tidak dengan menghilangkan tren dan mengidentifikasi musiman dengan menghitung autokorelasi(acf). Outputnya meliputi jumlah periode, jenis model (penjumlahan/perkalian) dan acf periode.

Bagaimana Anda menangkap musiman dalam data deret waktu?

Kita dapat menggunakan ACF untuk menentukan apakah musiman hadir dalam deret waktu . Misalnya, Yt = γ · St + ϵt. Semakin besar amplitudo fluktuasi musiman, semakin jelas osilasi di ACF.

Bagaimana Anda mengekstrak musiman?

Langkah demi Langkah. Dekomposisi Deret Waktu .
Langkah 1. Impor Datanya. Aditif. .
Langkah 2. Mendeteksi Tren. .
Langkah 3. Detrend Time Series. .
Langkah 4. Rata-rata Musiman. .
Langkah 5. Meneliti Kebisingan Acak yang Tersisa. .
Langkah 6. Merekonstruksi Sinyal Asli

Bagaimana Anda menguraikan musiman dengan Python?

Dekomposisi .
Langkah 1. Ekstrak setiap komponen musiman menggunakan STL. .
Langkah 2. Sempurnakan setiap komponen musiman yang diekstrak. .
Langkah 3. Ekstrak tren. .
Langkah 4. Ekstrak residu