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.
Penelitian ini bertujuan membentuk model yang dapat memprediksi hujan/tidak hujan berdasarkan klasifikasi BMKG menggunakan dua pendekatan:
Kedua model kemudian dibandingkan untuk menentukan pendekatan yang paling sesuai untuk prediksi hujan di Kota Bandung.
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
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
Metode stepwise digunakan untuk mencari model dengan nilai AIC (Akaike Information Criterion) terkecil.
## 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
##
## 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:
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.
| 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.
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.
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.
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.
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.
\[\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).
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 ===
## Threshold (cut-off): 0.5482
## Indeks Youden J: 0.5387
## Sensitivitas (TPR) : 0.8522
## 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) |
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%).
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).
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## 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:
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.
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]\]
##
## 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.
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).
| 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 |
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"))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.