1 Pendahuluan

Curah hujan adalah salah satu parameter untuk mengukur intensitas hujan pada suatu daerah, biasanya dinyatakan dalam satuan milimeter (mm). Informasi mengenai intensitas curah hujan menjadi penting karena berkaitan dengan berbagai sektor, seperti pertanian, transportasi, pengelolaan sumber daya air, serta mitigasi bencana hidrometeorologi.

Kota Bandung berada pada ketinggian rata-rata 768 meter di atas permukaan laut dan terletak pada kawasan cekungan yang dikelilingi pegunungan vulkanik, sehingga memengaruhi dinamika atmosfer lokal dan distribusi curah hujan yang bervariasi secara spasial maupun temporal. Curah hujan di Jawa Barat umumnya dipengaruhi pola monsun, terutama pada periode musim hujan Oktober-Maret.

Fenomena pemanasan global menyebabkan pola musim semakin tidak menentu, sehingga variabilitas curah hujan antar waktu sangat tinggi. Hal ini menimbulkan tantangan dalam membangun model prediksi yang stabil dan andal.

1.1 Tujuan Penelitian

Penelitian ini bertujuan membentuk model yang dapat memprediksi hujan/tidak hujan berdasarkan klasifikasi BMKG menggunakan dua pendekatan:

  • Regresi Logistik Binomial — mencari pengaruh variabel independen terhadap kejadian hujan melalui parameter odds ratio.
  • Analisis Diskriminan Linear (LDA) — mengklasifikasikan observasi ke dalam kelompok hujan/tidak hujan berdasarkan fungsi diskriminan Fisher.

Kedua model kemudian dibandingkan untuk menentukan pendekatan yang paling sesuai untuk prediksi hujan di Kota Bandung.


2 Data dan Variabel

Penelitian ini menggunakan data sekunder dari BMKG (dataonline.bmkg.go.id) periode Oktober 2025 - Maret 2026 untuk Kota Bandung, sebanyak 182 observasi.

Nama Variabel Tipe Data Satuan Keterangan
TN Numerik °C Temperatur Minimum
TX Numerik °C Temperatur Maksimum
TAVG Numerik °C Temperatur Rata-rata
RH_AVG Numerik % Kelembapan Rata-rata
RR Numerik mm Curah Hujan
SS Numerik Jam Lama Penyinaran Matahari
FF_X Numerik m/s Kecepatan Angin Maksimum
DDD_X Numerik ° Arah Angin saat Kecepatan Maksimum
FF_AVG Numerik m/s Kecepatan Angin Rata-rata
DDD_CAR Kategorik ° Arah Angin Terbanyak

Variabel RR (Curah Hujan) dijadikan variabel dependen dikotomus: 0 (Tidak Hujan) / 1 (Hujan). Variabel DDD_CAR terdiri atas C (Calm) dan W (West), ditransformasi menjadi biner dengan C sebagai baseline (0).

Hujan <- read_excel("D:/Hujan.xlsx")

# Variabel respon: 0 = Tidak Hujan, 1 = Hujan
Hujan$Kategori <- ifelse(Hujan$RR == 0, 0, 1)
Hujan$Kategori <- factor(Hujan$Kategori, ordered = TRUE)

table(Hujan$Kategori)
## 
##   0   1 
##  67 115

3 Regresi Logistik Binomial

3.1 Model Logit

Regresi logistik binomial mencari hubungan antara variabel dependen dikotomus dengan satu atau lebih variabel independen. Fungsi logit dinyatakan sebagai:

\[g(x) = \ln\left[\frac{\Pi(x)}{1-\Pi(x)}\right] = \beta_0 + \beta_1 x_1 + \dots + \beta_p x_p\]

Estimasi parameter \(\beta\) dilakukan dengan Maximum Likelihood Estimation (MLE), dioptimasi secara numerik menggunakan metode iteratif Newton-Raphson.

fit_binom <- glm(
  Kategori ~ lag(Kategori, 1) + TN + TX + TAVG + RH_AVG +
    SS + FF_X + DDD_X + FF_AVG + `DDD_CAR Kategori`,
  data = Hujan,
  family = binomial
)
summary(fit_binom)
## 
## Call:
## glm(formula = Kategori ~ lag(Kategori, 1) + TN + TX + TAVG + 
##     RH_AVG + SS + FF_X + DDD_X + FF_AVG + `DDD_CAR Kategori`, 
##     family = binomial, data = Hujan)
## 
## Coefficients:
##                      Estimate Std. Error z value Pr(>|z|)
## (Intercept)        -1.866e-06  1.829e+06   0.000    1.000
## lag(Kategori, 1).L  3.757e+01  4.592e+04   0.001    0.999
## TN                 -1.439e-08  4.157e+04   0.000    1.000
## TX                  1.673e-08  2.364e+04   0.000    1.000
## TAVG               -3.612e-08  6.547e+04   0.000    1.000
## RH_AVG              1.561e-09  9.236e+03   0.000    1.000
## SS                  1.294e-08  1.259e+04   0.000    1.000
## FF_X                3.160e-08  2.525e+04   0.000    1.000
## DDD_X               8.877e-11  3.792e+02   0.000    1.000
## FF_AVG              1.721e-08  7.171e+04   0.000    1.000
## `DDD_CAR Kategori`  7.903e-07  1.117e+05   0.000    1.000
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 2.3950e+02  on 181  degrees of freedom
## Residual deviance: 1.0559e-09  on 171  degrees of freedom
## AIC: 22
## 
## Number of Fisher Scoring iterations: 25

3.2 Seleksi Model: Stepwise AIC

Metode stepwise digunakan untuk mencari model dengan nilai AIC (Akaike Information Criterion) terkecil.

stepwise_aic <- stepAIC(fit_binom, direction = "both", trace = TRUE)
## Start:  AIC=22
## Kategori ~ lag(Kategori, 1) + TN + TX + TAVG + RH_AVG + SS + 
##     FF_X + DDD_X + FF_AVG + `DDD_CAR Kategori`
##                      Df Deviance    AIC
## - TN                  1     0.00  20.00
## - TX                  1     0.00  20.00
## - TAVG                1     0.00  20.00
## - RH_AVG              1     0.00  20.00
## - SS                  1     0.00  20.00
## - FF_X                1     0.00  20.00
## - DDD_X               1     0.00  20.00
## - FF_AVG              1     0.00  20.00
## - `DDD_CAR Kategori`  1     0.00  20.00
## <none>                      0.00  22.00
## - lag(Kategori, 1)    1   177.66 197.66
## 
## Step:  AIC=20
## Kategori ~ lag(Kategori, 1) + TX + TAVG + RH_AVG + SS + FF_X + 
##     DDD_X + FF_AVG + `DDD_CAR Kategori`
##                      Df Deviance    AIC
## - TX                  1     0.00  18.00
## - TAVG                1     0.00  18.00
## - RH_AVG              1     0.00  18.00
## - SS                  1     0.00  18.00
## - FF_X                1     0.00  18.00
## - DDD_X               1     0.00  18.00
## - FF_AVG              1     0.00  18.00
## - `DDD_CAR Kategori`  1     0.00  18.00
## <none>                      0.00  20.00
## + TN                  1     0.00  22.00
## - lag(Kategori, 1)    1   180.38 198.38
## 
## Step:  AIC=18
## Kategori ~ lag(Kategori, 1) + TAVG + RH_AVG + SS + FF_X + DDD_X + 
##     FF_AVG + `DDD_CAR Kategori`
##                      Df Deviance    AIC
## - TAVG                1     0.00  16.00
## - RH_AVG              1     0.00  16.00
## - SS                  1     0.00  16.00
## - FF_X                1     0.00  16.00
## - DDD_X               1     0.00  16.00
## - FF_AVG              1     0.00  16.00
## - `DDD_CAR Kategori`  1     0.00  16.00
## <none>                      0.00  18.00
## + TN                  1     0.00  20.00
## + TX                  1     0.00  20.00
## - lag(Kategori, 1)    1   180.41 196.41
## 
## Step:  AIC=16
## Kategori ~ lag(Kategori, 1) + RH_AVG + SS + FF_X + DDD_X + FF_AVG + 
##     `DDD_CAR Kategori`
##                      Df Deviance   AIC
## - RH_AVG              1      0.0  14.0
## - SS                  1      0.0  14.0
## - FF_X                1      0.0  14.0
## - DDD_X               1      0.0  14.0
## - FF_AVG              1      0.0  14.0
## - `DDD_CAR Kategori`  1      0.0  14.0
## <none>                       0.0  16.0
## + TN                  1      0.0  18.0
## + TX                  1      0.0  18.0
## + TAVG                1      0.0  18.0
## - lag(Kategori, 1)    1    181.1 195.1
## 
## Step:  AIC=14
## Kategori ~ lag(Kategori, 1) + SS + FF_X + DDD_X + FF_AVG + `DDD_CAR Kategori`
##                      Df Deviance   AIC
## - SS                  1      0.0  12.0
## - FF_X                1      0.0  12.0
## - DDD_X               1      0.0  12.0
## - FF_AVG              1      0.0  12.0
## - `DDD_CAR Kategori`  1      0.0  12.0
## <none>                       0.0  14.0
## + TN                  1      0.0  16.0
## + TX                  1      0.0  16.0
## + TAVG                1      0.0  16.0
## + RH_AVG              1      0.0  16.0
## - lag(Kategori, 1)    1    218.5 230.5
## 
## Step:  AIC=12
## Kategori ~ lag(Kategori, 1) + FF_X + DDD_X + FF_AVG + `DDD_CAR Kategori`
##                      Df Deviance    AIC
## - FF_X                1     0.00  10.00
## - DDD_X               1     0.00  10.00
## - FF_AVG              1     0.00  10.00
## - `DDD_CAR Kategori`  1     0.00  10.00
## <none>                      0.00  12.00
## + TN                  1     0.00  14.00
## + TX                  1     0.00  14.00
## + TAVG                1     0.00  14.00
## + RH_AVG              1     0.00  14.00
## + SS                  1     0.00  14.00
## - lag(Kategori, 1)    1   228.78 238.78
## 
## Step:  AIC=10
## Kategori ~ lag(Kategori, 1) + DDD_X + FF_AVG + `DDD_CAR Kategori`
##                      Df Deviance    AIC
## - DDD_X               1     0.00   8.00
## - FF_AVG              1     0.00   8.00
## - `DDD_CAR Kategori`  1     0.00   8.00
## <none>                      0.00  10.00
## + TN                  1     0.00  12.00
## + TX                  1     0.00  12.00
## + TAVG                1     0.00  12.00
## + RH_AVG              1     0.00  12.00
## + SS                  1     0.00  12.00
## + FF_X                1     0.00  12.00
## - lag(Kategori, 1)    1   228.93 236.93
## 
## Step:  AIC=8
## Kategori ~ lag(Kategori, 1) + FF_AVG + `DDD_CAR Kategori`
##                      Df Deviance    AIC
## - FF_AVG              1     0.00   6.00
## - `DDD_CAR Kategori`  1     0.00   6.00
## <none>                      0.00   8.00
## + TN                  1     0.00  10.00
## + TX                  1     0.00  10.00
## + TAVG                1     0.00  10.00
## + RH_AVG              1     0.00  10.00
## + SS                  1     0.00  10.00
## + FF_X                1     0.00  10.00
## + DDD_X               1     0.00  10.00
## - lag(Kategori, 1)    1   229.67 235.67
## 
## Step:  AIC=6
## Kategori ~ lag(Kategori, 1) + `DDD_CAR Kategori`
##                      Df Deviance    AIC
## - `DDD_CAR Kategori`  1     0.00   4.00
## <none>                      0.00   6.00
## + TN                  1     0.00   8.00
## + TX                  1     0.00   8.00
## + TAVG                1     0.00   8.00
## + RH_AVG              1     0.00   8.00
## + SS                  1     0.00   8.00
## + FF_X                1     0.00   8.00
## + DDD_X               1     0.00   8.00
## + FF_AVG              1     0.00   8.00
## - lag(Kategori, 1)    1   237.83 241.83
## 
## Step:  AIC=4
## Kategori ~ lag(Kategori, 1)
##                      Df Deviance   AIC
## <none>                       0.0   4.0
## + TN                  1      0.0   6.0
## + TX                  1      0.0   6.0
## + TAVG                1      0.0   6.0
## + RH_AVG              1      0.0   6.0
## + SS                  1      0.0   6.0
## + FF_X                1      0.0   6.0
## + DDD_X               1      0.0   6.0
## + FF_AVG              1      0.0   6.0
## + `DDD_CAR Kategori`  1      0.0   6.0
## - lag(Kategori, 1)    1    239.5 241.5
summary(stepwise_aic)
## 
## Call:
## glm(formula = Kategori ~ lag(Kategori, 1), family = binomial, 
##     data = Hujan)
## 
## Coefficients:
##                      Estimate Std. Error z value Pr(>|z|)
## (Intercept)        -2.058e-06  2.737e+04   0.000    1.000
## lag(Kategori, 1).L  3.757e+01  3.870e+04   0.001    0.999
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 2.3950e+02  on 181  degrees of freedom
## Residual deviance: 1.0559e-09  on 180  degrees of freedom
## AIC: 4
## 
## Number of Fisher Scoring iterations: 25
model_terbaik <- glm(
  formula = Kategori ~ TN + RH_AVG + DDD_X + FF_AVG + `DDD_CAR Kategori`,
  family = binomial,
  data = Hujan
)

Model terbaik diperoleh dengan AIC = 191,20, melibatkan lima variabel:

\[\hat{P} = \frac{1}{1+\exp\left(-(-8.70 - 0.45X_1 + 0.23X_2 + 0.01X_3 - 0.68X_4 + 1.66X_5)\right)}\]

dengan:

  • \(X_1\): Temperatur Minimum
  • \(X_2\): Kelembapan Rata-rata
  • \(X_3\): Arah Angin saat Kecepatan Maksimum
  • \(X_4\): Kecepatan Angin Rata-rata
  • \(X_5\): Arah Angin Terbanyak

3.3 Pengujian Asumsi

3.3.1 Uji Multikolinearitas

Multikolinearitas dideteksi menggunakan Variance Inflation Factor (VIF):

\[VIF = \frac{1}{1-R_j^2}, \quad j = 1, 2, ..., p\]

Nilai VIF > 10 mengindikasikan adanya multikolinearitas.

vif(model_terbaik)
Variabel VIF
X1 (Temperatur Minimum) 1,03
X2 (Kelembapan Rata-rata) 1,06
X3 (Arah Angin saat Kec. Maks.) 1,24
X4 (Kecepatan Angin Rata-rata) 1,36
X5 (Arah Angin Terbanyak) 1,18

Seluruh variabel independen memiliki nilai VIF di bawah 10 (tertinggi 1,36), sehingga model memenuhi asumsi bebas multikolinearitas.

3.3.2 Uji Independensi

Karena data bersifat time series, perlu dilakukan pengecekan asumsi independensi antar error. Pelanggaran asumsi ini menyebabkan standar error koefisien diestimasi terlalu kecil, sehingga uji signifikansi menjadi tidak valid. Pengujian dilakukan dengan memplot quantile residual terhadap lag-nya.

res1 <- qresid(model_terbaik)
reslag <- c(NA, head(res1, -1))

plot(res1,
     reslag,
     xlab = "Quantile Residual (t)",
     ylab = "Quantile Residual (t-1)",
     main = "Quantile Residual vs Lag-1 Residual")

Secara umum, tidak terlihat pola tertentu pada plot residual sehingga model terbebas dari pelanggaran non-independensi.

3.3.3 Uji Linearitas (Box-Tidwell)

Regresi logistik mensyaratkan hubungan linear antara setiap prediktor kontinu dengan nilai logit. Pengujian dilakukan dengan menambahkan suku interaksi \(x_j \cdot \ln(x_j)\) ke dalam model:

\[logit[\pi(x)] = \beta_0 + \sum_{j=1}^{p} \beta_j x_j + \sum_{j=1}^{p} \gamma_j x_j \cdot \ln(x_j)\]

Jika \(\gamma_j = 0\) maka hubungan antara \(x_j\) dan logit bersifat linear.

TN_adj     <- ifelse(Hujan$TN <= 0, Hujan$TN + 0.001, Hujan$TN)
RH_AVG_adj <- ifelse(Hujan$RH_AVG <= 0, Hujan$RH_AVG + 0.001, Hujan$RH_AVG)
DDD_X_adj  <- ifelse(Hujan$DDD_X <= 0, Hujan$DDD_X + 0.001, Hujan$DDD_X)
FF_AVG_adj <- ifelse(Hujan$FF_AVG <= 0, Hujan$FF_AVG + 0.001, Hujan$FF_AVG)

TN_log     <- TN_adj * log(TN_adj)
RH_AVG_log <- RH_AVG_adj * log(RH_AVG_adj)
DDD_X_log  <- DDD_X_adj * log(DDD_X_adj)
FF_AVG_log <- FF_AVG_adj * log(FF_AVG_adj)

model_box_tidwell <- glm(Kategori ~ TN + RH_AVG + DDD_X + FF_AVG +
                           TN_log + RH_AVG_log + DDD_X_log + FF_AVG_log +
                           `DDD_CAR Kategori`,
                         data = Hujan, family = binomial)
summary(model_box_tidwell)
Variabel Estimasi Std. Error z-value Pr(>|z|)
TN_log 4,864145 8,915026 0,546 0,5853
RH_AVG_log -1,33768 0,902579 -1,482 0,1383
DDD_X_log 0,006542 0,008531 0,767 0,4432
FF_AVG_log -0,3435 1,14581 -0,3 0,7643

Tidak terdapat signifikansi pada variabel interaksi dengan nilai logaritma naturalnya, sehingga asumsi linearitas logit terpenuhi.

3.4 Uji Signifikansi Model

3.4.1 Uji Rasio Likelihood (Serentak)

model_null <- glm(Kategori ~ 1, family = binomial, data = Hujan)
lrtest(model_null, model_terbaik)

Pada taraf signifikansi \(\alpha = 5\%\), \(H_0\) ditolak karena \(G = 60{,}296 > \chi^2_{0{,}05;5} = 11{,}07\), sehingga variabel independen secara serentak memberikan pengaruh signifikan terhadap curah hujan.

3.4.2 Uji Wald (Parsial)

Pengujian signifikansi parameter secara individu menggunakan uji Wald, \(H_0: \beta_i = 0\).

Variabel Nilai \(\beta_i\) z-value z-crit
Temperatur Minimum -0,45 -1,880 1,96
Kelembapan Rata-rata 0,23 5,602 1,96
Arah Angin saat Kec. Maks. 0,01 1,607 1,96
Kecepatan Angin Rata-rata -0,68 -1,738 1,96
Arah Angin Terbanyak 1,65 1,916 1,96

Pada \(\alpha = 5\%\), \(H_0\) ditolak ketika \(|z\text{-value}| > z\text{-crit}\). Variabel yang signifikan adalah Kelembapan Rata-rata.

3.5 Interpretasi Odds Ratio

\[\phi = \exp(\beta_1)\]

Variabel \(\beta_i\) \(e^{\beta_i}\) \(1-e^{\beta_i}\) Signifikansi
Temperatur Minimum -0,45 0,63 -0,37 Tidak Signifikan
Kelembapan Rata-rata 0,23 1,26 0,26 Signifikan
Arah Angin saat Kec. Maks. 0,01 1,02 0,02 Tidak Signifikan
Kecepatan Angin Rata-rata -0,68 0,51 -0,49 Tidak Signifikan
Arah Angin Terbanyak 1,66 5,26 4,26 Tidak Signifikan

Setiap kenaikan 1 unit kelembapan rata-rata meningkatkan peluang hujan sebesar 26% dibandingkan peluang tidak hujan, dengan pengaruh yang signifikan. Variabel lain tidak menunjukkan pengaruh yang signifikan, meskipun arah angin terbanyak dari barat memiliki odds ratio sebesar 5,26 untuk hujan dibandingkan kondisi tenang (Calm).

3.6 Kurva ROC dan AUC

Kurva Receiver Operating Characteristic (ROC) digunakan untuk mengukur kemampuan model membedakan kondisi hujan dan tidak hujan di seluruh nilai cut-off yang mungkin.

\[AUC = \int_0^1 TPR(FPR) \cdot d(FPR)\]

# 1. Prediksi probabilitas (peluang hujan) untuk seluruh data
pred_prob <- predict(model_terbaik, type = "response")

# 2. Hitung kurva ROC
roc_obj <- roc(Hujan$Kategori, pred_prob)  # Hujan$Kategori harus numeric 0/1, pROC menangani factor
roc_obj$auc
## Area under the curve: 0.8252
# 3. Cari threshold optimal (maksimalkan Youden's J = sens + spec - 1)
optimal_idx <- which.max(roc_obj$sensitivities + roc_obj$specificities - 1)
optimal_threshold <- roc_obj$thresholds[optimal_idx]
optimal_j <- roc_obj$sensitivities[optimal_idx] + roc_obj$specificities[optimal_idx] - 1

# Tampilkan hasil
cat("=== Threshold Optimal ===", "\n")
## === Threshold Optimal ===
cat("Threshold (cut-off):", round(optimal_threshold, 4), "\n")
## Threshold (cut-off): 0.5482
cat("Indeks Youden J:", round(optimal_j, 4), "\n")
## Indeks Youden J: 0.5387
cat("Sensitivitas (TPR) :", round(roc_obj$sensitivities[optimal_idx], 4), "\n")
## Sensitivitas (TPR) : 0.8522
cat("Spesifisitas (TNR) :", round(roc_obj$specificities[optimal_idx], 4), "\n")
## Spesifisitas (TNR) : 0.6866
# 4. Visualisasi kurva ROC dengan titik optimal
roc_df <- data.frame(
  fpr = 1 - roc_obj$specificities,
  tpr = roc_obj$sensitivities,
  thr = roc_obj$thresholds
)

# Tentukan koordinat titik optimal
opt_fpr <- 1 - roc_obj$specificities[optimal_idx]
opt_tpr <- roc_obj$sensitivities[optimal_idx]

ggplot(roc_df, aes(x = fpr, y = tpr)) +
  geom_line(color = "blue", size = 1) +
  geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "gray") +
  geom_point(aes(x = opt_fpr, y = opt_tpr), color = "red", size = 3) +
  labs(title = "Kurva ROC dengan Threshold Optimal",
       x = "1 - Spesifisitas (False Positive Rate)",
       y = "Sensitivitas (True Positive Rate)") +
  annotate("text", x = opt_fpr + 0.05, y = opt_tpr - 0.05,
           label = paste("Threshold =", round(optimal_threshold, 3)),
           color = "red", hjust = 0) +
  theme_minimal()

Dengan menggunakan nilai threshold sebesar 0,548, model logistik binomial berada pada titik kerja paling seimbang antara sensitivitas dan spesifisitas. Nilai AUC = 0,83, yang menandakan kemampuan diskriminasi baik (excellent), berdasarkan interpretasi berikut:

Nilai AUC Interpretasi
AUC = 0,5 Tidak ada kemampuan diskriminasi (setara tebakan acak)
0,5 < AUC ≤ 0,7 Kemampuan diskriminasi lemah
0,7 < AUC ≤ 0,8 Kemampuan diskriminasi cukup (acceptable)
0,8 < AUC ≤ 0,9 Kemampuan diskriminasi baik (excellent)
AUC > 0,9 Kemampuan diskriminasi sangat baik (outstanding)

3.7 Evaluasi Model: Confusion Matrix

Evaluasi performa dilakukan menggunakan confusion matrix dengan tiga ukuran: akurasi, sensitivitas, dan spesifisitas.

\[Akurasi = \frac{TP+TN}{TP+TN+FP+FN}, \quad Sensitivitas = \frac{TP}{TP+FN}, \quad Spesifisitas = \frac{TN}{TN+FP}\]

pred_class <- ifelse(pred_prob >= optimal_threshold, "1", "0")
pred_class <- factor(pred_class, levels = c("0", "1"))
confusionMatrix(pred_class, Hujan$Kategori, positive = "1")
Pengamatan Prediksi: 0 (Tidak Hujan) Prediksi: 1 (Hujan) Benar (%)
0 (Tidak Hujan) 46 21 68%
1 (Hujan) 17 98 85%
Keseluruhan 79%

Model regresi logistik binomial memprediksi dengan benar sebesar 79% dari 182 observasi. Model cenderung lebih andal pada kondisi hujan (85%) dibandingkan kondisi tidak hujan (68%).


4 Analisis Diskriminan

4.1 Fungsi Diskriminan Linear Fisher

Pada kasus dua kelompok (\(g=2\)), fungsi diskriminan linear Fisher didefinisikan sebagai:

\[Z = a^T X = a_1 X_1 + a_2 X_2 + \dots + a_p X_p\]

dengan koefisien diskriminan:

\[a = S_{pl}^{-1}(\bar{x}_1 - \bar{x}_2), \quad S_{pl} = \frac{(n_1-1)S_1 + (n_2-1)S_2}{n_1+n_2-2}\]

Dalam model ini, kategori didefinisikan sebagai 1 (Tidak Hujan) dan 2 (Hujan).

4.2 Seleksi Variabel: Wilks’ Lambda (Stepwise)

Seleksi variabel prediktor dilakukan menggunakan metode stepwise berbasis minimalisasi Wilks’ Lambda (\(\Lambda\)):

\[\Lambda = \frac{|E|}{|E+H|}\]

Nilai \(\Lambda\) mendekati 0 mengindikasikan sebagian besar variansi total dijelaskan oleh perbedaan antar kelompok; nilai mendekati 1 mengindikasikan pemisahan antar kelompok lemah.

data <- read_excel("D:/Hujan.xlsx")
data$Kategori <- ifelse(data$RR <= 0.5482, 1, 2)

model_step <- greedy.wilks(Kategori~TN+TX+TAVG+RH_AVG+SS+FF_X+DDD_X+FF_AVG+data$`DDD_CAR Kategori`,data=data)
model_step$results
lda_model <- lda(Kategori ~ RH_AVG + TN + `DDD_CAR Kategori`, data = data)
lda_model$scaling
##                           LD1
## RH_AVG              0.1868496
## TN                 -0.3854272
## `DDD_CAR Kategori`  0.7765944

Model terbaik yang dihasilkan:

\[y = 0{,}18\,X_1 - 0{,}38\,X_2 + 0{,}77\,X_5\]

dengan:

  • \(X_1\): Temperatur Minimum
  • \(X_2\): Kelembapan Rata-rata
  • \(X_5\): Arah Angin Terbanyak

4.3 Pengujian Asumsi

4.3.1 Uji Normalitas Multivariat (Mardia Test)

Pengujian dilakukan dengan hipotesis \(H_0\): data berdistribusi normal multivariat, menggunakan statistik skewness dan kurtosis:

\[skew = \frac{1}{n^2}\sum_{i=1}^{k}\sum_{j=1}^{k} m_{ij}^3, \quad kurt = \frac{1}{n}\sum_{i=1}^{k} m_{ii}^2\]

sam <- cbind.data.frame(data$TN,data$TX,data$TAVG,data$RH_AVG,data$SS,
                        data$FF_X,data$DDD_X,data$FF_AVG,data$'DDD_CAR Kategori',
                        data$Kategori)
sam 
colnames(sam) <- c("TN","TX","TAVG","RH_AVG","SS",
                   "FF_X","DDD_X","FF_AVG","DDD_CAR Kategori",
                   "Kategori")
test_data <- sam[, c("TN", "RH_AVG", "DDD_CAR Kategori")]
mardia(test_data)
Test Statistic p-value Method
Mardia Skewness 315,48 8,268075e-62 Asymptotic
Mardia Kurtosis 8,73 2,471599e-18 Asymptotic

Pada taraf signifikansi \(\alpha = 5\%\), \(H_0\) ditolak — data tidak berdistribusi normal multivariat. Namun, karena jumlah observasi \(n = 182 > 30\), Central Limit Theorem (CLT) dapat digunakan sebagai justifikasi sehingga data tetap dapat dianggap mengikuti distribusi normal.

4.3.2 Uji Homogenitas Varians-Kovarians (Box’s M)

Hipotesis: \(H_0: \Sigma_1 = \Sigma_2\) (matriks kovarians antar kelompok homogen).

\[M = \left[\sum_l (n_l-1)\right]\ln|S_{pooled}| - \left[\sum_l (n_l-1)\ln|S_l|\right]\]

boxM_result <- boxM(data = test_data, grouping = sam$Kategori)
print(boxM_result)
## 
##  Box's M-test for Homogeneity of Covariance Matrices
## 
## data:  test_data
## Chi-Sq (approx.) = 11.258, df = 6, p-value = 0.08072

Berdasarkan perhitungan, \(\chi^2_{hitung} = 11{,}258 < \chi^2_{0{,}95;6} = 12{,}592\), sehingga \(H_0\) tidak ditolak — matriks kovarians antar kelompok adalah homogen.

4.4 Prosedur Analisis Diskriminan

  1. Identifikasi variabel dependen dan independen.
  2. Menentukan fungsi diskriminan dengan stepwise estimation berbasis Wilks’ Lambda.
  3. Uji signifikansi fungsi diskriminan.
  4. Interpretasi fungsi diskriminan.
  5. Menghitung ketepatan klasifikasi.

4.5 Evaluasi Model: Confusion Matrix

predictions <- predict(lda_model, newdata = sam)
sam$predicted_class <- predictions$class

confusionMatrix(as.factor(sam$Kategori), as.factor(sam$predicted_class), positive = "1")
Pengamatan Prediksi: 1 (Tidak Hujan) Prediksi: 2 (Hujan) Benar (%)
1 (Tidak Hujan) 53 17 76%
2 (Hujan) 25 87 78%
Keseluruhan 77%

Model diskriminan berhasil memprediksi dengan tepat sebesar 77% dari 182 observasi. Dibandingkan model logistik binomial, model diskriminan menunjukkan stabilitas yang lebih tinggi, terlihat dari keseimbangan sensitivitas antar kelompok (76% untuk tidak hujan dan 78% untuk hujan).


5 Perbandingan dan Pembahasan

5.1 Ringkasan Hasil

Aspek Logistik Binomial Analisis Diskriminan
Variabel terpilih TN, RH_AVG, DDD_X, FF_AVG, DDD_CAR TN, RH_AVG, DDD_CAR
Variabel signifikan Kelembapan Rata-rata -
Akurasi keseluruhan 79% 77%
Sensitivitas (Hujan) 85% 78%
Spesifisitas (Tidak Hujan) 68% 76%
AUC 0,83 -
Karakteristik utama Akurasi tinggi, namun timpang antar kelas Akurasi sedikit lebih rendah, namun lebih stabil/seimbang

5.2 Visualisasi Perbandingan

df <- data.frame(
  Model = rep(c("Logistik Binomial", "Diskriminan"), each = 3),
  Metrik = factor(rep(c("Sensitivitas", "Spesifisitas", "Akurasi"), 2),
                   levels = c("Sensitivitas", "Spesifisitas", "Akurasi")),
  Nilai = c(85, 68, 79, 78, 76, 77)
)

ggplot(df, aes(x = Metrik, y = Nilai, fill = Model)) +
  geom_col(position = position_dodge(width = 0.7), width = 0.6) +
  geom_text(aes(label = paste0(Nilai, "%")),
            position = position_dodge(width = 0.7), vjust = -0.5, size = 4) +
  scale_fill_manual(values = c("Logistik Binomial" = "#1C7293", "Diskriminan" = "#F9A03F")) +
  ylim(0, 100) +
  labs(title = "Perbandingan Performa Model Prediksi Hujan", y = "Persentase (%)", x = "") +
  theme_minimal(base_size = 13) +
  theme(legend.position = "bottom", plot.title = element_text(face = "bold"))

5.3 Diskusi

Berdasarkan hasil pembahasan, faktor-faktor yang dipakai untuk model prediksi curah hujan dengan pendekatan regresi logistik binomial adalah temperatur minimum, kelembapan rata-rata, arah angin saat kecepatan maksimum, kecepatan angin rata-rata, dan arah angin terbanyak, dengan fungsi logit:

\[g(x) = -8.70 - 0.45X_1 + 0.23X_2 + 0.01X_3 - 0.68X_4 + 1.66X_5\]

Sedangkan faktor yang dipakai untuk model prediksi curah hujan melalui analisis diskriminan adalah temperatur minimum, kelembapan rata-rata, dan arah angin terbanyak, dengan fungsi diskriminan:

\[y = 0.18X_1 - 0.38X_2 + 0.77X_5\]

Berdasarkan evaluasi model secara keseluruhan, model logistik binomial dapat mengklasifikasikan hujan/tidak hujan dengan benar sebesar 79%, sedangkan model diskriminan sebesar 77%. Meskipun memiliki akurasi global yang lebih rendah, model diskriminan menunjukkan stabilitas yang lebih tinggi, tercermin dari keseimbangan nilai sensitivitas antar kelompok. Oleh karena itu, model diskriminan cenderung lebih stabil dalam memprediksi hujan/tidak hujan, sementara model logistik binomial lebih unggul untuk peringatan dini kondisi hujan.


6 Kesimpulan

  1. Kelembapan rata-rata merupakan satu-satunya variabel yang signifikan dalam memprediksi kejadian hujan di Kota Bandung pada model regresi logistik binomial.
  2. Model logistik binomial memiliki akurasi keseluruhan tertinggi (79%) dan AUC sebesar 0,83 (kategori baik), serta lebih dominan dalam mendeteksi hari hujan (85%) — menjadikannya lebih sesuai untuk peringatan dini hujan.
  3. Model analisis diskriminan memiliki akurasi sedikit lebih rendah (77%), namun menawarkan prediksi yang lebih stabil antar kelompok hujan/tidak hujan (sensitivitas 76% vs 78%).
  4. Pemilihan model terbaik bergantung pada kebutuhan aplikasi: model logistik untuk deteksi dini kondisi hujan, sedangkan model diskriminan untuk stabilitas klasifikasi antar kelompok.

6.1 Saran Penelitian Lanjutan

  • Menambah periode data historis untuk meningkatkan validitas dan generalisasi model.
  • Eksplorasi metode lain seperti Random Forest, Support Vector Machine, atau model time series mengingat sifat data yang sekuensial.
  • Menangani isu non-normalitas multivariat dengan transformasi data atau pendekatan non-parametrik seperti Quadratic Discriminant Analysis (QDA) atau Naive Bayes.

7 Daftar Pustaka

  1. Rohmana, S. F., Rusgiyono, A., & Sugito, S. (2019). PENENTUAN FAKTOR-FAKTOR YANG MEMPENGARUHI INTENSITAS CURAH HUJAN DENGAN ANALISIS DISKRIMINAN GANDA DAN REGRESI LOGISTIK MULTINOMIAL (Studi Kasus: Data Curah Hujan Kota Semarang dari Stasiun Meteorologi Maritim Tanjung Emas Periode Oktober 2018 – Maret 2019). Jurnal Gaussian, 8(3), 398 - 406. https://doi.org/10.14710/j.gauss.8.3.398-406
  2. Pemerintah Kota Bandung. (n.d.). Iklim dan Wilayah. Portal Resmi Pemerintah Kota Bandung. https://www.bandung.go.id/news/read/12/iklim-dan-wilayah
  3. ​Kang, S. J., Park, Y. S., & Kim, C. W. (1996). The effects of temperature and humidity on the production of a-amylase by Aspergillus oryzae in solid-state fermentation. Process Biochemistry, 31(8), 755–760. https://doi.org/10.1016/S0743-9547(96)00069-4
  4. Tukidi. (2010). Karakter Curah Hujan di Indonesia. Jurnal Geografi, 7(2), 136–145. https://journal.unnes.ac.id/nju/index.php/JG/article/view/84
  5. Mandey, F.N. 2017. Pemodelan Sistem Prediksi Intensitas Curah Hujan di Kota Manado dengan Menggunakan Kontrol Logika Fuzzy. Jurnal MIPA UNSRAT Online Vol. 2, No. 6: Hal 19-23
  6. Kurniadi, A., Weller, E., Salmond, J., & Aldrian, E. (2024). Future projections of extreme rainfall events in Indonesia. International Journal of Climatology, 44(1), 160–182. https://doi.org/10.1002/joc.8321⁠
  7. Badan Meteorologi, Klimatologi, dan Geofisika (BMKG). (2024). Buletin prakiraan musim hujan 2023/2024 Daerah Istimewa Yogyakarta. Stasiun Klimatologi Daerah Istimewa Yogyakarta. https://staklim-yogya.bmkg.go.id/wp-content/uploads/2024/03/Buletin-Prakiraan-Musim-Hujan-2023-2024-DIY.pdf
  8. Zhang, W., Zhou, T., Ye, W. et al. A Year Marked by Extreme Precipitation and Floods: Weather and Climate Extremes in 2024. Adv. Atmos. Sci. 42, 1045-1063 (2025). https://doi.org/10.1007/s00376-025-4540-4
  9. Abdulhafedh, A. (2022) Comparison between Common Statistical Modeling Techniques Used in Research, Including: Discriminant Analysis vs Logistic Regression, Ridge Regression vs LASSO, and Decision Tree vs Random Forest. Open Access Library Journal, 9: e8414. https://doi.org/10.4236/oalib.1108414
  10. Agresti, A. (2002). Categorical data analysis (2nd ed.). John Wiley & Sons.
  11. Novianti, F. A., & Purnami, S. W. (2012). Analisis diagnosis pasien kanker payudara menggunakan regresi logistik dan support vector machine (SVM) berdasarkan hasil mamografi. Jurnal Sains dan Seni ITS, 1(1), D147-D152. https://doi.org/10.12962/j23373520.v1i1.1937
  12. Shreiber, J. B., & Gregory, J. (2018). Logistic and Linear Regression Assumptions: Violation Recognition and Control. Proceedings of the WUSS/SCSUG Conference.
  13. Dunn, P. K., & Smyth, G. K. (2018). Generalized linear models: With examples in R. Springer.https://doi.org/10.1007/978-1-4419-0118-7  
  14. Hosmer, D. W., Jr., & Lemeshow, S. (2000). Applied logistic regression (Edisi ke-2). John Wiley & Sons, Inc.
  15. Hyndman, R. J., & Athanasopoulos, G. (2021). Forecasting: Principles and Practice (3rd ed.). Melbourne: OTexts.
  16. Field, A. (2018). Discovering statistics using IBM SPSS statistics (5th ed.). SAGE Publications.
  17. Hosmer, D. W., Lemeshow, S., & Sturdivant, R. X. (2013). Applied logistic regression (3rd ed.). John Wiley & Sons. https://doi.org/10.1002/9781118548387
  18. Box, G. E. P., & Tidwell, P. W. (1962). Transformation of the independent variables. Technometrics, 4(4), 531–550. https://doi.org/10.1080/00401706.1962.10490003
  19. Raymond H. Myers (1990). Classical and Modern Regression with Applications (2nd ed.). Boston: Duxbury Press. 
  20. Hanley, J. A., & McNeil, B. J. (1982). The meaning and use of the area under a receiver operating characteristic (ROC) curve. Radiology, 143(1), 29–36.
  21. Tatham, R.L., Hair, J.F, Anderson, R.E., dan Black, W.C., (1998), “Multivariate Data Analysis”, Prentice Hall, New Jersey.
  22. Maria Tri, F. (2012). Analisis diskriminan terhadap perilaku mahasiswa dalam mengkonsumsi makanan cepat saji: Studi kasus para mahasiswa di UPI, ITB, UNLA, dan UIN Sunan Gunung Djati [Skripsi S1, Universitas Pendidikan Indonesia]. Repository UPI.http://repository.upi.edu/id/eprint/111496 
  23. Izenman, A. J. (2008). Modern Multivariate Statistical Techniques: Regression, Classification, and Manifold Learning. Springer. https://doi.org/10.1007/978-0-387-78189-1
  24. Johnson, R. A., & Wichern, D. W. (2007). Applied Multivariate Statistical Analysis (6th ed.). Pearson Prentice Hall.
  25. Rohmana, S. F., Rusgiyono, A., & Sugito, S. (2019). Penentuan faktor-faktor yang mempengaruhi intensitas curah hujan dengan analisis diskriminan ganda dan regresi logistik multinomial. Jurnal Gaussian, 8(3), 398–406. https://doi.org/10.14710/j.gauss.8.3.398-406
  26. Mardia, K. V. (1970). Measures of multivariate skewness and kurtosis with applications. Biometrika, 57(3), 519–530. https://doi.org/10.1093/biomet/57.3.519
  27. Montgomery, D. C., & Runger, G. C. (2014). Applied Statistics and Probability for Engineers (6th ed.). John Wiley & Sons.
  28. Box, G. E. P. (1949). A general distribution theory for a class of likelihood criteria. Biometrika, 36(3–4), 317–346. https://doi.org/10.1093/biomet/36.3-4.317
  29. F.Hair,J., A. R.., Tatham,R. L., & Black, W. C (2010). Multivariate Data Analysis. New Jersey: Prentice Hall International Inc.