library(tidyverse) library(caret) library(nnet) library(MASS) library(corrplot) library(rsample) library(ggplot2) library(ggthemes) library(rcompanion)
cardiotocographic <- read.csv(“C:\Users\Novan\Downloads\Cardiotocographic.csv”) wine <- read.csv(“C:\Users\Novan\Downloads\WineQT.csv”)
cardiotocographic\(class <- factor(cardiotocographic\)NSP, labels = c(“Normal”, “Suspect”, “Pathologic”))
ggplot(cardiotocographic, aes(x = class)) + geom_bar(fill = “steelblue”) + theme_minimal() + ggtitle(“Distribusi Kelas - CTG (Cardiotocographic)”)
#distribusi dari data tersebut tidak seimbang #bisa dilihat dari jumlah distribusi pada kelas ‘Normal’ yang mendominasi dengan jumlah lebih dari 1500 dan sisa kelas yang memiliki jumlah kurang dari 500
model_multinom <- multinom(class ~ ., data = cardiotocographic)
summary(model_multinom)
#output dari model multinomial menunjukkan koefisien regresi untuk dua katogori relatif terhadap kategori referensi (Normal) #koefisien ini menunjukkan pengaruh tiap variabel prediktor terhadap log odds #contohnya pada variabel ‘ASTV’ dengan koefisien ‘suspect’ sebesar -6.638853 yang menunjukkan bahwa peningkatan nilai ASTV dapat menurunkan kemungkinan seorang pasien termasuk ke dalam kelas “suspect’ dibandingkan kelas ‘Normal’ #contoh lain pada variabel yang sama dengan koefisien ‘Pathologic’ sebesar 2.862657 menunjukkan peningkatan nilai ASTV justru meningkatkan kemungkinan pasien masuk ke kelas ‘Pathologic’
pred_multinom <- predict(model_multinom, newdata = cardiotocographic) conf_matrix_multinom <- table(Predicted = pred_multinom, Actual = cardiotocographic$class) conf_matrix_multinom
accuracy_multinom <- sum(diag(conf_matrix_multinom)) / sum(conf_matrix_multinom) cat(“Akurasi model multinomial:”, round(accuracy_multinom * 100, 2), “%”)
#akurasi dari model ini 100%
conf_df_multinom <- as.data.frame(conf_matrix_multinom) ggplot(conf_df_multinom, aes(x = Actual, y = Predicted, fill = Freq)) + geom_tile(color = “white”) + geom_text(aes(label = Freq), color = “white”, size = 5) + scale_fill_gradient(low = “skyblue”, high = “darkblue”) + ggtitle(“Confusion Matrix - Multinomial Logistic Regression”) + theme_minimal()
wine\(quality <- factor(wine\)quality, ordered = TRUE) wine_scaled <- wine %>% mutate(across(-quality, scale))
ggplot(wine, aes(x = quality)) + geom_bar(fill = “tomato”) + theme_minimal() + ggtitle(“Distribusi Kualitas Wine”)
#Grafik tersebut menunjukkan distribusi frekuensi kualitas wine (quality) dengan rentang tiga sampai delapan #Mayoritas data berada pada kelas lima dan enam dengan masing-masing memiliki lebih dari 450 obesrvasi, dengan kelas yang lain menjadi kelas yang minoritas dengan jumlah yang sedikit #Dengan distribusi yang tidak seimbang ini bisa jadi memengaruhi hasil akurasi di akhir nanti
model_polr <- polr(quality ~ ., data = wine_scaled, Hess = TRUE) summary(model_polr)
#model di atas ini berguna untuk memprediksi kualitas wine dari data ordinal berdasarkan dengan semua variabel prediktor #nilai koefisien yang positif dapat meningkatkan kemungkinan observasi pada kelas kualitas lebih tinggi #sedangkan koefisien negatif dapat meningkatkan kemungkinan berada pada kelas yang lebih rendah #contoh pada ‘alcohol’ memiliki koefisien sebesar 0,94791 dengan t value sebesar 8,48 menunjukkan bahwa kadar alkohol yang lebih tinggi dapat meningkatkan kualitas wine #contoh lain pada ‘volatile.acidity’ memiliki koefisien sebesar -0.65670 dengan t value -7,6461 menunjukkan bahwa semakin tinggi keasaman volatil cenderung akan menurunkan kualitas wine
#intercept beryujuan untuk fungsi logit kumulatif guna membentuk batas antar kategori ordinal #anka-angka yang muncul menunjukkan batas pemisah antara kelas kualitas
pred_polr <- predict(model_polr, newdata = wine_scaled) conf_matrix_polr <- table(Predicted = pred_polr, Actual = wine_scaled$quality) conf_matrix_polr
#akurasi accuracy_polr <- sum(diag(conf_matrix_polr)) / sum(conf_matrix_polr) cat(“Akurasi model ordinal:”, round(accuracy_polr * 100, 2), “%”)
#nilai akurasi tidak terlalu tinggi dengan akurasi sebesar 60,8%, hal ini bisa terjadi karena distribusi kualitas yang kurang seimbang dan belum adanya pre processing pada data tersebut
conf_df_polr <- as.data.frame(conf_matrix_polr) ggplot(conf_df_polr, aes(x = Actual, y = Predicted, fill = Freq)) + geom_tile(color = “white”) + geom_text(aes(label = Freq), color = “white”, size = 5) + scale_fill_gradient(low = “lightgreen”, high = “darkgreen”) + ggtitle(“Confusion Matrix - Ordinal Logistic Regression”) + theme_minimal()
#dari model di atas bisa ditangkap bahwa ‘alcohol’ , ‘volatile.acidity’ dan ‘sulphates’ adalah prediktor yang signifikan