# 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 ...
data$`Curah Hujan` <- log(data$`Curah Hujan`)
# 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: 4.86005841986022"
# 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: -0.0107226704295978"
# Menghitung S0 sebagai rasio antara nilai aktual dan L0 untuk 12 bulan pertama
S0 <- data_l0$`Curah Hujan` / l0
print("S0:")
## [1] "S0:"
print(S0)
## [1] 1.3285375 1.1242317 1.2547327 1.2029565 0.8424476 0.8458487 0.1426212
## [8] 1.0673505 1.0673505 1.0673505 0.8964314 1.1601413
# Inisialisasi vektor Lt, Tt, St, dan Prediksi
Lt <- c(l0)
Tt <- c(T0)
St <- as.numeric(S0)
Prediksi <- numeric()
# Menentukan parameter smoothing
alpha <- 0.02313929
beta <- 0.003610298
gamma <- 0.4283049
# 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] 4.849584 4.839353 4.829360 4.819601 4.810071 4.800766 4.791681 4.782812
## [9] 4.774155 4.765705 4.757458 4.749411 4.739391 4.739483 4.725095 4.701795
## [17] 4.708836 4.703124 4.764474 4.718779 4.680452 4.656478 4.663532 4.667769
## [25] 4.665083 4.659335 4.657637 4.657771 4.643790 4.637840 4.691248 4.683266
## [33] 4.681118 4.673054 4.675474 4.673766
print("Tt:")
## [1] "Tt:"
print(Tt)
## [1] -0.01072177 -0.01072000 -0.01071738 -0.01071392 -0.01070964 -0.01070457
## [7] -0.01069873 -0.01069212 -0.01068477 -0.01067670 -0.01066793 -0.01065847
## [13] -0.01065617 -0.01061736 -0.01063097 -0.01067671 -0.01061275 -0.01059505
## [19] -0.01033531 -0.01046297 -0.01056356 -0.01061198 -0.01054820 -0.01049482
## [25] -0.01046663 -0.01044959 -0.01041800 -0.01037990 -0.01039291 -0.01037687
## [31] -0.01014658 -0.01013877 -0.01010992 -0.01010253 -0.01005732 -0.01002718
print("St:")
## [1] "St:"
print(St)
## [1] 1.3285375 1.1242317 1.2547327 1.2029565 0.8424476 0.8458487 0.1426212
## [8] 1.0673505 1.0673505 1.0673505 0.8964314 1.1601413 1.3320877 1.2111276
## [15] 1.2212205 1.1051587 0.9576568 0.8738179 0.2816330 0.8594424 0.8947955
## [22] 0.9752282 1.0199832 1.2904049 1.4058702 1.2499666 1.2979728 1.1904877
## [29] 0.9327470 0.9001942 0.5061823 0.8710397 0.9454948 0.9876097 1.1149077
## [36] 1.3672514
print("Prediksi pada data pelatihan:")
## [1] "Prediksi pada data pelatihan:"
print(Prediksi)
## [1] 6.4286095 5.4285018 6.0461082 5.7848815 4.0432103 4.0516667 0.6818692
## [8] 5.0935244 5.0842919 5.0752816 4.2551719 5.4976232 6.2990888 5.7272600
## [15] 5.7573996 5.1844305 4.4992857 4.1004156 1.3389224 4.0465265 4.1785953
## [22] 4.5307792 4.7459657 6.0097691 6.5437863 5.8109523 6.0319642 5.5326625
## [29] 4.3217870 4.1656154 2.3694909 4.0704788 4.4164133 4.6051763 5.2015092
## [36] 6.3765031
# 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] 0.02816012 0.03532996 0.05196610 0.06155727 0.05113423 0.05920712
## [7] 0.01127796 0.09386141 0.10309392 0.11210418 0.10153693 0.14073149
## [13] 0.05005015 0.56245553 -0.18145051 -0.57926034 0.72646098 0.19004383
## [19] 0.85830214 -1.27393773 -1.04310113 -0.54179517 0.77148715 0.81894295
## [25] 0.47819017 0.26209222 0.49306547 0.54268356 -0.13213228 0.17819005
## [31] 1.36817869 0.08840433 0.32851883 0.09530410 0.60060919 0.49562499
absolute_error_pelatihan <- abs(error_pelatihan)
print("Absolute Error pada data pelatihan:")
## [1] "Absolute Error pada data pelatihan:"
print(absolute_error_pelatihan)
## [1] 0.02816012 0.03532996 0.05196610 0.06155727 0.05113423 0.05920712
## [7] 0.01127796 0.09386141 0.10309392 0.11210418 0.10153693 0.14073149
## [13] 0.05005015 0.56245553 0.18145051 0.57926034 0.72646098 0.19004383
## [19] 0.85830214 1.27393773 1.04310113 0.54179517 0.77148715 0.81894295
## [25] 0.47819017 0.26209222 0.49306547 0.54268356 0.13213228 0.17819005
## [31] 1.36817869 0.08840433 0.32851883 0.09530410 0.60060919 0.49562499
MAE_pelatihan <- mean(absolute_error_pelatihan)
print(paste("MAE Pelatihan:", MAE_pelatihan))
## [1] "MAE Pelatihan: 0.375284505127483"
MAPE_pelatihan <- 100 * MAE_pelatihan / mean(data_pelatihan$`Curah Hujan`)
print(paste("MAPE Pelatihan:", MAPE_pelatihan, "%"))
## [1] "MAPE Pelatihan: 7.53321118223842 %"
# 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] 6.505714 6.095891 5.769726 4.903181 4.923061 4.370309 2.157021 3.872891
## [9] 4.105667 5.134449 5.406453 6.391667 6.448625 6.256142 5.536808 5.412523
## [17] 4.223389 3.890592 3.120328 3.213669 4.780309 3.391632 4.811834 5.615848
# 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] -0.01955341 0.39634854 -0.29745504 -0.74429752 0.82633189 0.30251945
## [7] -0.21111049 -0.13522186 -0.25551950 0.83169768 0.43127726 0.22707219
## [13] 0.08661643 0.75597351 -0.44305731 0.04706209 0.02510575 -0.20171220
## [19] 1.08436479 -0.91108358 0.70448771 -1.31219039 -0.15787394 -0.53444400
absolute_error_pengujian <- abs(error_pengujian)
print("Absolute Error pada data pengujian:")
## [1] "Absolute Error pada data pengujian:"
print(absolute_error_pengujian)
## [1] 0.01955341 0.39634854 0.29745504 0.74429752 0.82633189 0.30251945
## [7] 0.21111049 0.13522186 0.25551950 0.83169768 0.43127726 0.22707219
## [13] 0.08661643 0.75597351 0.44305731 0.04706209 0.02510575 0.20171220
## [19] 1.08436479 0.91108358 0.70448771 1.31219039 0.15787394 0.53444400
MAE_pengujian <- mean(absolute_error_pengujian)
print(paste("MAE Pengujian:", MAE_pengujian))
## [1] "MAE Pengujian: 0.455932355319222"
# Menghitung MAPE pada data pengujian
MAPE_pengujian <- mean(abs(error_pengujian) / abs(data_pengujian$`Curah Hujan`)) * 100
print(paste("MAPE Pengujian:", MAPE_pengujian, "%"))
## [1] "MAPE Pengujian: 11.6411384496803 %"
# 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] 6.556611 5.816984 6.027376 5.516312 4.312677 4.153138 2.330249 4.001163
## [9] 4.333695 4.516827 5.087844 6.225697
# 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()`).

# Invers transformasi logaritma pada data aktual, prediksi pengujian, dan prediksi tahunan
data_aktual_invers <- exp(c(data_pelatihan$`Curah Hujan`, data_pengujian$`Curah Hujan`))
Prediksi_invers <- exp(Prediksi)
Prediksi_pengujian_invers <- exp(Prediksi_pengujian)
# Prediksi tahunan
Lt_prediksi <- tail(Lt, 1)
Tt_prediksi <- tail(Tt, 1)
St_prediksi <- tail(St, 12)
Prediksi_tahunan <- numeric()
for (i in 1:12) {
st <- St_prediksi[(i - 1) %% 12 + 1]
prediksi <- (Lt_prediksi + (i * Tt_prediksi)) * st
Prediksi_tahunan <- c(Prediksi_tahunan, prediksi)
}
# Invers transformasi logaritma pada prediksi tahunan
Prediksi_tahunan_invers <- exp(Prediksi_tahunan)
print("Prediksi untuk 12 bulan ke depan (Invers Transformasi):")
## [1] "Prediksi untuk 12 bulan ke depan (Invers Transformasi):"
print(Prediksi_tahunan_invers)
## [1] 703.88233 335.95733 414.62555 248.71606 74.64003 63.63340 10.28050
## [8] 54.66168 76.22544 91.54467 162.04021 505.57515
# Gabungkan data aktual dan prediksi dalam satu frame untuk visualisasi
prediksi_akhir <- c(Prediksi_invers, Prediksi_pengujian_invers, Prediksi_tahunan_invers)
waktu_aktual <- 1:length(data_aktual_invers)
# 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_invers, rep(NA, 12)),
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: Removed 12 rows containing missing values or values outside the scale range
## (`geom_line()`).
