# Memuat paket yang diperlukan
library(readxl)
# Membaca data dari file Excel
data <- read_excel("databaru.xlsx")
# Memeriksa struktur data
str(data)
## tibble [60 × 3] (S3: tbl_df/tbl/data.frame)
## $ Tahun : num [1:60] 2019 2019 2019 2019 2019 ...
## $ Bulan : num [1:60] 1 2 3 4 5 6 7 8 9 10 ...
## $ Curah Hujan: num [1:60] 637 236 445 346 60 61 2 179 179 179 ...
# Mengambil jumlah baris dan kolom data
row_data <- nrow(data)
col_data <- ncol(data)
# Menentukan proporsi data untuk pelatihan (misalnya 80%)
proporsi_pelatihan <- 0.6
n_pelatihan <- floor(proporsi_pelatihan * row_data)
# Membagi data menjadi set pelatihan dan pengujian
data_pelatihan <- data[1:n_pelatihan, ]
data_pengujian <- data[(n_pelatihan + 1):row_data, ]
# Menghitung nilai awal L0, T0, dan S0 menggunakan data pelatihan
# Menghitung L0 sebagai rata-rata dari 12 bulan pertama data pelatihan
data_l0 <- data_pelatihan[1:12, ]
l0 <- mean(data_l0$`Curah Hujan`)
print(paste("L0:", l0))
## [1] "L0: 223.583333333333"
# Menghitung T0 sebagai rata-rata perbedaan antara tahun kedua dan pertama
data_y1 <- data_pelatihan[1:12, ]
data_y2 <- data_pelatihan[13:24, ]
y2_y1 <- data_y2$`Curah Hujan` - data_y1$`Curah Hujan`
T0 <- mean(y2_y1) / 12
print(paste("T0:", T0))
## [1] "T0: 2.26388888888889"
# Menghitung S0 sebagai perbedaan antara nilai aktual dan L0 untuk 12 bulan pertama
S0 <- data_l0$`Curah Hujan` - l0
print("S0:")
## [1] "S0:"
print(S0)
## [1] 413.41667 12.41667 221.41667 122.41667 -163.58333 -162.58333
## [7] -221.58333 -44.58333 -44.58333 -44.58333 -145.58333 57.41667
# Inisialisasi vektor Lt, Tt, St, dan Prediksi
Lt <- c(l0)
Tt <- c(T0)
St <- as.numeric(S0)
Prediksi <- numeric()
# Menentukan parameter smoothing
alpha <- 0.1
beta <- 0
gamma <- 0.4
# Menerapkan metode Holt-Winters pada data pelatihan
for (i in 1:nrow(data_pelatihan)) {
if (i <= 12) {
# Untuk 12 bulan pertama, gunakan nilai S0 yang telah dihitung
st <- St[i]
} else {
# Untuk bulan berikutnya, hitung st berdasarkan data sebelumnya
st <- gamma * (data_pelatihan$`Curah Hujan`[i] - Lt[i]) + (1 - gamma) * St[i - 12]
St <- c(St, st)
}
lt <- alpha * (data_pelatihan$`Curah Hujan`[i] - st) + (1 - alpha) * (Lt[i] + Tt[i])
Lt <- c(Lt, lt)
tt <- beta * (Lt[i + 1] - Lt[i]) + (1 - beta) * Tt[i]
Tt <- c(Tt, tt)
prediksi <- (Lt[i + 1] + Tt[i + 1]) + st
Prediksi <- c(Prediksi, prediksi)
}
# Menghapus nilai pertama dari Lt dan Tt karena merupakan nilai awal
Lt <- Lt[-1]
Tt <- Tt[-1]
# Menampilkan Lt, Tt, St, dan Prediksi pada data pelatihan
print("Lt:")
## [1] "Lt:"
print(Lt)
## [1] 225.6208 227.4546 229.1050 230.5903 231.9271 233.1302 234.2130 235.1876
## [9] 236.0646 236.8540 237.5644 238.2038 235.4641 254.9688 244.2631 230.2998
## [17] 239.4944 241.2972 242.6919 233.8028 225.8672 220.2676 232.7641 272.8307
## [25] 302.8643 305.0381 321.5055 329.4080 322.5932 319.7440 318.6690 312.4720
## [33] 309.3254 305.1332 313.2741 335.7585
print("Tt:")
## [1] "Tt:"
print(Tt)
## [1] 2.263889 2.263889 2.263889 2.263889 2.263889 2.263889 2.263889 2.263889
## [9] 2.263889 2.263889 2.263889 2.263889 2.263889 2.263889 2.263889 2.263889
## [17] 2.263889 2.263889 2.263889 2.263889 2.263889 2.263889 2.263889 2.263889
## [25] 2.263889 2.263889 2.263889 2.263889 2.263889 2.263889 2.263889 2.263889
## [33] 2.263889 2.263889 2.263889 2.263889
print("St:")
## [1] "St:"
print(St)
## [1] 413.41667 12.41667 221.41667 122.41667 -163.58333 -162.58333
## [7] -221.58333 -44.58333 -44.58333 -44.58333 -145.58333 57.41667
## [13] 381.56847 128.86436 136.46250 15.74475 -115.86994 -164.14774
## [19] -225.86888 -117.42674 -111.07114 -95.49687 -75.85706 310.94437
## [25] 568.20878 129.77290 232.66227 54.84463 -174.88517 -196.72594
## [31] -246.61893 -172.32365 -145.63147 -137.02829 -35.16752 447.25697
print("Prediksi pada data pelatihan:")
## [1] "Prediksi pada data pelatihan:"
print(Prediksi)
## [1] 641.30139 242.13514 452.78551 355.27085 70.60766 72.81078 14.89359
## [8] 192.86812 193.74520 194.53457 94.24500 297.88439 619.29646 386.09700
## [15] 382.98952 248.30848 125.88830 79.41334 19.08687 118.63999 117.05993
## [22] 127.03466 159.17092 586.03900 873.33696 437.07486 556.43170 386.51654
## [29] 149.97195 125.28196 74.31396 142.41221 165.95783 170.36880 280.37051
## [36] 785.27938
# Menghitung error pada data pelatihan
error_pelatihan <- data_pelatihan$`Curah Hujan` - Prediksi
print("Error pada data pelatihan:")
## [1] "Error pada data pelatihan:"
print(error_pelatihan)
## [1] -4.301389 -6.135139 -7.785514 -9.270851 -10.607655 -11.810779
## [7] -12.893590 -13.868119 -14.745196 -15.534566 -16.244998 -16.884387
## [13] -47.296458 152.902996 -118.989517 -148.308479 60.111696 -6.413339
## [19] -10.086872 -102.639993 -94.059927 -73.034664 89.829082 337.961004
## [25] 247.663038 -3.074859 125.568304 48.483457 -83.971953 -48.281956
## [31] -32.313958 -78.412206 -50.957833 -60.368802 50.629495 179.720623
absolute_error_pelatihan <- abs(error_pelatihan)
print("Absolute Error pada data pelatihan:")
## [1] "Absolute Error pada data pelatihan:"
print(absolute_error_pelatihan)
## [1] 4.301389 6.135139 7.785514 9.270851 10.607655 11.810779
## [7] 12.893590 13.868119 14.745196 15.534566 16.244998 16.884387
## [13] 47.296458 152.902996 118.989517 148.308479 60.111696 6.413339
## [19] 10.086872 102.639993 94.059927 73.034664 89.829082 337.961004
## [25] 247.663038 3.074859 125.568304 48.483457 83.971953 48.281956
## [31] 32.313958 78.412206 50.957833 60.368802 50.629495 179.720623
MAE_pelatihan <- mean(absolute_error_pelatihan)
print(paste("MAE Pelatihan:", MAE_pelatihan))
## [1] "MAE Pelatihan: 66.4211859581572"
MAPE_pelatihan <- 100 * MAE_pelatihan / mean(data_pelatihan$`Curah Hujan`)
print(paste("MAPE Pelatihan:", MAPE_pelatihan, "%"))
## [1] "MAPE Pelatihan: 23.595447942507 %"
# Menggunakan model yang telah dilatih untuk memprediksi data pengujian
# Mengambil nilai Lt, Tt, dan St terakhir dari data pelatihan
Lt_pengujian <- tail(Lt, 1)
Tt_pengujian <- tail(Tt, 1)
St_pengujian <- tail(St, 12) # Mengambil 12 nilai musiman terakhir
Prediksi_pengujian <- numeric()
for (i in 1:nrow(data_pengujian)) {
st <- gamma * (data_pengujian$`Curah Hujan`[i] - Lt_pengujian) + (1 - gamma) * St_pengujian[(i - 1) %% 12 + 1]
St_pengujian <- c(St_pengujian, st)
lt <- alpha * (data_pengujian$`Curah Hujan`[i] - st) + (1 - alpha) * (Lt_pengujian + Tt_pengujian)
Lt_pengujian <- lt
tt <- beta * (Lt_pengujian - lt) + (1 - beta) * Tt_pengujian
Tt_pengujian <- tt
prediksi <- (Lt_pengujian + Tt_pengujian) + st
Prediksi_pengujian <- c(Prediksi_pengujian, prediksi)
}
# Menampilkan Prediksi pada data pengujian
print("Prediksi pada data pengujian:")
## [1] "Prediksi pada data pengujian:"
print(Prediksi_pengujian)
## [1] 794.20373 552.35447 421.61179 235.89189 217.88262 117.99398 45.75046
## [8] 101.00322 115.53513 275.20708 316.83780 767.03509 805.02530 756.32674
## [15] 398.84573 323.15179 119.26692 92.07523 75.78683 90.51741 207.71847
## [22] 108.53941 203.49020 485.20834
# Menghitung error pada data pengujian
error_pengujian <- data_pengujian$`Curah Hujan` - Prediksi_pengujian
print("Error pada data pengujian:")
## [1] "Error pada data pengujian:"
print(error_pengujian)
## [1] -138.203734 107.645534 -183.611791 -171.891894 96.117381 -10.993980
## [7] -38.750461 -59.003219 -68.535135 114.792922 26.162197 -18.035088
## [13] -116.025298 353.673264 -235.845725 -88.151791 -49.266923 -52.075226
## [19] -8.786832 -80.517408 33.281528 -100.539415 -98.490200 -324.208342
absolute_error_pengujian <- abs(error_pengujian)
print("Absolute Error pada data pengujian:")
## [1] "Absolute Error pada data pengujian:"
print(absolute_error_pengujian)
## [1] 138.203734 107.645534 183.611791 171.891894 96.117381 10.993980
## [7] 38.750461 59.003219 68.535135 114.792922 26.162197 18.035088
## [13] 116.025298 353.673264 235.845725 88.151791 49.266923 52.075226
## [19] 8.786832 80.517408 33.281528 100.539415 98.490200 324.208342
MAE_pengujian <- mean(absolute_error_pengujian)
print(paste("MAE Pengujian:", MAE_pengujian))
## [1] "MAE Pengujian: 107.27522032285"
# Menghitung MAPE pada data pengujian
MAPE_pengujian <- 100 * mean(abs(error_pengujian) / abs(data_pengujian$`Curah Hujan`))
print(paste("MAPE Pengujian:", MAPE_pengujian, "%"))
## [1] "MAPE Pengujian: 171.617881007781 %"
# Memuat paket yang diperlukan untuk plotting
library(ggplot2)
# Mengambil nilai terakhir dari Lt, Tt, dan St untuk prediksi 12 bulan ke depan
Lt_prediksi <- tail(Lt, 1)
Tt_prediksi <- tail(Tt, 1)
St_prediksi <- tail(St, 12) # Mengambil 12 nilai musiman terakhir
# Inisialisasi vektor untuk menyimpan prediksi 12 bulan ke depan
Prediksi_tahunan <- numeric()
# Melakukan prediksi untuk 12 bulan ke depan
for (i in 1:12) {
# Menggunakan indeks musiman yang berulang untuk setiap bulan
st <- St_prediksi[(i - 1) %% 12 + 1]
# Menghitung prediksi berdasarkan Lt, Tt, dan St terakhir
prediksi <- (Lt_prediksi + (i * Tt_prediksi)) + st
Prediksi_tahunan <- c(Prediksi_tahunan, prediksi)
}
# Menampilkan prediksi 12 bulan ke depan
print("Prediksi untuk 12 bulan ke depan:")
## [1] "Prediksi untuk 12 bulan ke depan:"
print(Prediksi_tahunan)
## [1] 906.2312 470.0592 575.2125 399.6587 172.1928 152.6159 104.9868 181.5460
## [9] 210.5021 221.3691 325.4938 810.1822
# Membuat data frame untuk plot hasil prediksi
# Gabungkan data aktual dan prediksi dalam satu frame untuk visualisasi
data_aktual <- c(data_pelatihan$`Curah Hujan`, data_pengujian$`Curah Hujan`)
prediksi_akhir <- c(Prediksi, Prediksi_pengujian, Prediksi_tahunan)
# Menentukan rentang waktu untuk seluruh data (pelatihan, pengujian, dan prediksi)
waktu_aktual <- 1:length(data_aktual)
waktu_prediksi <- 1:length(prediksi_akhir)
# Membuat data frame untuk ggplot
plot_data <- data.frame(
Waktu = c(waktu_aktual, (length(waktu_aktual) + 1):(length(waktu_aktual) + 12)),
Curah_Hujan = c(data_aktual, rep(NA, 12)), # Tambahkan NA untuk data aktual pada prediksi tahunan
Prediksi = prediksi_akhir
)
# Plot data aktual dan prediksi
ggplot(plot_data, aes(x = Waktu)) +
geom_line(aes(y = Curah_Hujan, color = "Data Aktual"), size = 1) +
geom_line(aes(y = Prediksi, color = "Prediksi"), size = 1, linetype = "dashed") +
labs(title = "Hasil Ramalan Curah Hujan",
x = "Waktu (bulan)",
y = "Curah Hujan",
color = "Legenda") +
scale_color_manual(values = c("Data Aktual" = "blue", "Prediksi" = "red")) +
theme_minimal() +
theme(legend.position = "bottom")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: Removed 12 rows containing missing values or values outside the scale range
## (`geom_line()`).
