# 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()`).