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