Tugas ini menganalisis pertumbuhan wisatan mancaneagara di Indonesia menggunakan data dari tahun 2024 hingga 2025. Tujuannya adalah untuk melakukan peramalan menggunakan metode Naive dan Moving Average, serta membandingkan hasilnya dengan data historis. Dengan melakukan analisis ini diharapkan bisa memperoleh pembelajaran bagaimana kedua metode ini dapat digunakan, dengan mempelajari pola tren, dan sesonalitas dari data time series.
Data yang digunakan pada tugas ini diambil dari website Badan Pusat Statistik, dengan alamat https://www.bps.go.id/id/statistics-table/2/MTQ3MCMy/jumlah-kunjungan-wisatawan-mancanegara-per-bulan-menurut-kebangsaan.html. Data tersebut untuk kemudian disimpan dalam bentuk file CSV dengan nama wisman3.csv. Total data yang diunduh sebanyak 24 baris, di mana struktur data yang digunakan adalah bulan, dan jumlah wisatawan.
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.5.2
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
df <- read.csv2('wisman3.csv', stringsAsFactors = FALSE, sep = '\t')
## Warning in read.table(file = file, header = header, sep = sep, quote = quote, :
## incomplete final line found by readTableHeader on 'wisman3.csv'
head(df)
tail(df)
Dikarenakan data yang diunduh tersedia dalam bentuk memanjang ke samping, hal ini cukup merepotkan untuk dilakukan analisis menggunakan fungsi-fungsi timeseries pada R. Untuk itu diperlukan transformasi atau pivotting agar data tersedia dalam bentuk vertikal.
df_long <- df %>%
pivot_longer(cols = -X, names_to = "Month", values_to = "Value")
time_values <- df_long$Value
ts_data <- ts(time_values, start = c(2024, 1), frequency = 12)
plot(ts_data, type = "l", main = "Time Series Data", ylab = "Value", xlab = "Time")
Untuk mendapatkan pemahaman terhadap struktur time series pada data yang diunduh, dilakukan dekomposisi dengan metode additive, melihat secara visual pertumbuhannya cenderung konstan.
decomp <- decompose(ts_data, type="additive")
plot(decomp)
Dari plotting di atas, terlihat bahwa dari tahun 2024 hingga 2025,
data menunjukkan tren meningkat (baris plot kedua). Sedangkan dari sisi
seasonalitas terlihat bahwa data menunjukkan pola musiman yang berulang
setiap tahun (baris plot ketiga). Sementara itu, komponen residual atau
noise (baris plot keempat) menunjukkan fluktuasi acak yang tidak dapat
dijelaskan oleh tren atau seasonalitas. #
{r} # data_stasioner <- ts_data / (decomp$trend * decomp$seasonal) # plot(pure_noise_manual, type = "l", main = "Data Stasioner", ylab = "Value", xlab = "Time") #
Untuk dapat memodelkan forecasting dengan menggunakan metode naive dan
moving average, diperlukan data yang stasioner. Untuk itu dilakukan
proses deseasonalization dengan menghilangkan komponen seasonal dari
data asli. Dari plot di atas kita sudah mendapatkan data stasioner yang
dihasilkan dari perhitungan data asli - komponen seasonal. Data
stasioner ini kemudian digunakan untuk melakukan forecasting dengan
metode naive dan moving average, dengan menambahkan kembali komponen
seasonal untuk mendapatkan hasil forecast yang lebih akurat.
seasonal_add <- decomp$seasonal
trend_add <- decomp$trend
residual_add <- decomp$random
stationare_data <- ts_data - seasonal_add #- trend_add
plot(stationare_data, type = "l", main = "Data Stasioner (Additive)", ylab = "Value", xlab = "Time")
h <- 12 # lama forecast
last_value <- tail(stationare_data, 1)
naive_forecast <- rep(last_value, h)
# Tambahkan kembali komponen seasonal untuk mendapatkan forecast akhir
season_future <- tail(seasonal_add, 12)
final_forecast_add <- naive_forecast + season_future
plot(final_forecast_add, type = "l", main = "Hasil Forecast -Naive (Additive)", ylab = "Value", xlab = "Time")
Proses berikutnya adalah melakukan forecasting dari data stasioner menggunakan metode naive, dengan metode naive ini diasumsikan bahwa nilai masa depan akan sama dengan fluktuasi nilai musiman sebelumnya yang sudah diamati (seasonal_add). Setelah mendapatkan hasil forecast dari data stasioner, langkah selanjutnya adalah menambahkan kembali komponen seasonal untuk mendapatkan hasil forecast yang lebih akurat.
moving_average <- function(x, k) {
stats::filter(x, rep(1/k, k), sides = 1)
}
k <- 3 # ambil rata-rata (MA) 3 bulan terakhir
ma_values <- moving_average(stationare_data, k)
# gunakan MA 1 bulan terakhir
last_ma <- tail(na.omit(ma_values), 1)
ma_forecast <- rep(last_ma, h)
# tambahan komponen seasonal
final_ma_forecast_add <- ma_forecast + season_future
plot(final_ma_forecast_add, type = "l", main = "Hasil Forecast (Moving Average) - Additive", ylab = "Value", xlab = "Time")
Di dalam forecast menggunakan moving average, digunakan fungsi moving_average yang mengambil rata-rata dari k bulan terakhir untuk menghasilkan nilai forecast. Dalam hal ini, digunakan k = 3, yang berarti bahwa rata-rata dari 3 bulan terakhir akan digunakan untuk menghasilkan nilai forecast. Setelah mendapatkan hasil forecast dari data stasioner, langkah selanjutnya adalah menambahkan kembali komponen seasonal untuk mendapatkan hasil forecast yang lebih akurat.
ts.plot(ts_data, col = "black", xlim = c(2024, 2028))
# plot forecasting
lines(ts(final_forecast_add, start = c(2026,1), frequency = 12),
col = "blue")
lines(ts(final_ma_forecast_add, start = c(2026,1), frequency = 12),
col = "red")
legend("topleft",
legend = c("Historis", "Naive", "Moving Avg"),
col = c("black", "blue", "red"),
lty = 1)
Untuk memudahkan di dalam menginterpretasikan hasil forecast, dilakukan plotting data historis dengan hasil forecast dari metode naive dan moving average. Dari plot di atas terlihat bahwa hasil forecast dari metode naive (garis biru) menunjukkan pola yang lebih stabil dan cenderung mengikuti pola musiman yang diamati pada data historis. Sementara itu, hasil forecast dari metode moving average (garis merah) menunjukkan fluktuasi yang lebih besar, yang mungkin disebabkan oleh sensitivitas metode ini terhadap perubahan nilai dalam data stasioner. Secara keseluruhan, kedua metode memberikan hasil forecast yang berbeda, dengan kedua metode sepintas secara visual mempunyai kedekatan (dengan margin error yang kecil).