Dataset yang digunakan dalam penelitian ini adalah User Knowledge Modeling Dataset yang diperoleh dari UCI Machine Learning Repository.
Sumber: https://archive.ics.uci.edu/dataset/257/user+knowledge+modeling
Dataset ini berisi data yang digunakan untuk menganalisis tingkat pengetahuan pengguna berdasarkan aktivitas belajar. Terdapat beberapa variabel numerik yang menggambarkan performa pengguna dalam proses pembelajaran, serta satu variabel kategorik yaitu UNS (User Knowledge Level) yang menunjukkan tingkat pengetahuan pengguna.
library(readxl)
user <- read_excel("C:/Users/priya/Downloads/User Knowledge Modeling.xlsx")
head(user)
str(user)
## tibble [258 × 6] (S3: tbl_df/tbl/data.frame)
## $ STG: num [1:258] 0 0.08 0.06 0.1 0.08 0.09 0.1 0.15 0.2 0 ...
## $ SCG: num [1:258] 0 0.08 0.06 0.1 0.08 0.15 0.1 0.02 0.14 0 ...
## $ STR: num [1:258] 0 0.1 0.05 0.15 0.08 0.4 0.43 0.34 0.35 0.5 ...
## $ LPR: num [1:258] 0 0.24 0.25 0.65 0.98 0.1 0.29 0.4 0.72 0.2 ...
## $ PEG: num [1:258] 0 0.9 0.33 0.3 0.24 0.66 0.56 0.01 0.25 0.85 ...
## $ UNS: chr [1:258] "very_low" "High" "Low" "Middle" ...
Variabel dalam dataset ini dapat dijelaskan sebagai berikut:
1. STG (Study Time Goal) = Waktu belajar
2. SCG (Study Count Goal) = Jumlah pengulangan materi
3. STR (Study Time Real) = Waktu belajar aktual
4. LPR (Learning Process Rate) = Tingkat pemahaman selama
proses belajar
5. PEG (Performance Evaluation Grade) = Hasil evaluasi
belajar
6. UNS (User Knowledge Level) = Tingkat pengetahuan
pengguna
library(psych)
round(describe(user),4)
summary(user)
## STG SCG STR LPR
## Min. :0.0000 Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.2407 1st Qu.:0.2100 1st Qu.:0.2913 1st Qu.:0.2500
## Median :0.3270 Median :0.3025 Median :0.4900 Median :0.3300
## Mean :0.3711 Mean :0.3557 Mean :0.4680 Mean :0.4327
## 3rd Qu.:0.4950 3rd Qu.:0.4975 3rd Qu.:0.6900 3rd Qu.:0.6475
## Max. :0.9900 Max. :0.9000 Max. :0.9500 Max. :0.9900
## PEG UNS
## Min. :0.0000 Length:258
## 1st Qu.:0.2500 Class :character
## Median :0.5000 Mode :character
## Mean :0.4585
## 3rd Qu.:0.6600
## Max. :0.9300
Interpretasi:
Nilai seluruh variabel numerik berada pada rentang 0–1 yang menunjukkan
bahwa data telah dinormalisasi. Mean dan median yang relatif berdekatan
menunjukkan distribusi cukup seimbang. Namun, beberapa variabel seperti
STG, SCG, dan LPR sedikit miring ke kanan, sedangkan PEG cenderung
miring ke kiri. Variabel STR relatif simetris. Variabel UNS merupakan
variabel kategorik dengan total 258 observasi.
hist(user$PEG,
main="Distribution of PEG",
xlab="PEG",
col="lightblue",
probability = TRUE)
lines(density(user$PEG), col = "red", lwd = 2)
legend("topright", legend=c("Density"), col="red", lwd=1)
Interpretasi:
Distribusi PEG tidak simetris dan memiliki beberapa puncak, menunjukkan
adanya indikasi data terbagi ke dalam beberapa kelompok.
plot(user$STG, user$PEG,
main="STG vs PEG",
xlab="STG",
ylab="PEG",
col= "blue", pch=19)
legend("bottomright", legend="Data", col="blue", pch=19)
Interpretasi:
Tidak terdapat hubungan yang kuat antara STG dan PEG karena pola sebaran
data acak.
library(reshape2)
library(ggplot2)
avg_data <- aggregate(user[,c("STG","SCG","STR","LPR","PEG")],
by=list(user$UNS), mean)
data_melt <- melt(avg_data, id.vars="Group.1")
ggplot(data_melt, aes(x=variable, y=value, color=Group.1, group=Group.1)) +
geom_line(size=1) +
geom_point(size=2) +
labs(title="Average Variable Values Across UNS Levels",
x="Variables",
y="Average Value",
color="UNS") +
theme_minimal()
## 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.
Interpretasi:
Grafik menunjukkan perbedaan pola antar kategori UNS pada setiap
variabel. Kategori dengan tingkat pengetahuan lebih tinggi cenderung
memiliki nilai PEG dan variabel belajar yang lebih tinggi dibandingkan
kategori lainnya.
barplot(table(user$UNS),
main="Distribution of User Knowledge Levels",
xlab="Knowledge Level Category",
ylab="Frequency",
col=c("purple","blue","orange","red"))
legend("topright",
legend=names(table(user$UNS)),
fill=c("purple","blue","orange","red"))
Interpretasi:
Distribusi tidak merata, didominasi oleh kategori Middle dan Low.
ggplot(user, aes(x=UNS, y=PEG, fill=UNS)) +
geom_violin(trim=FALSE) +
labs(title="Distribution of PEG Across UNS Categories",
x="User Knowledge Level (UNS)",
y="Performance Evaluation Grade (PEG)") +
theme_minimal()
Interpretasi:
Terlihat bahwa kategori dengan tingkat pengetahuan yang lebih tinggi
cenderung memiliki distribusi PEG yang lebih besar pada nilai tinggi.
Selain itu, bentuk distribusi yang berbeda antar kategori menunjukkan
adanya perbedaan karakteristik performa pada masing-masing kelompok
pengguna.
user_std <- as.data.frame(scale(user[,c("STG","SCG","STR","LPR","PEG")]))
user_std$UNS <- user$UNS
model_reg <- lm(PEG ~ STG + SCG + STR + LPR, data=user_std)
summary(model_reg)
##
## Call:
## lm(formula = PEG ~ STG + SCG + STR + LPR, data = user_std)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.97772 -0.78020 -0.05747 0.69512 2.19222
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.388e-16 5.694e-02 0.000 1.000000
## STG 2.180e-01 5.751e-02 3.791 0.000188 ***
## SCG 1.868e-01 5.765e-02 3.240 0.001356 **
## STR 1.077e-01 5.730e-02 1.879 0.061385 .
## LPR -3.135e-01 5.759e-02 -5.444 1.23e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.9145 on 253 degrees of freedom
## Multiple R-squared: 0.1766, Adjusted R-squared: 0.1636
## F-statistic: 13.57 on 4 and 253 DF, p-value: 4.899e-10
Hasil estimasi model regresi linier berganda menunjukkan bahwa variabel STG, SCG, dan STR memiliki pengaruh positif terhadap PEG, sedangkan LPR memiliki pengaruh negatif.
Dari segi kekuatan model, nilai R-squared sebesar 0.1766 menunjukkan bahwa model hanya mampu menjelaskan 17.66% variasi PEG, sehingga masih terdapat banyak faktor lain di luar model yang mempengaruhi performa pengguna. Meskipun demikian, hasil uji F menunjukkan bahwa model secara keseluruhan signifikan.
plot(user$STG, user$PEG,
main="Relationship between STG and PEG",
xlab="STG",
ylab="PEG",
pch=19, col="blue")
abline(lm(PEG ~ STG, data=user), col="red", lwd=2)
legend("bottomright",
legend=c("Data","Regression Line"),
col=c("blue","red"),
pch=c(19, NA),
lwd=c(NA,1))
Interpretasi:
Garis regresi menunjukkan hubungan positif antara variabel STG dan PEG.
Hal ini berarti bahwa peningkatan waktu belajar cenderung diikuti oleh
peningkatan performa pengguna. Namun, kemiringan garis yang relatif
landai menunjukkan bahwa pengaruh STG terhadap PEG tidak terlalu kuat,
sehingga terdapat faktor lain yang juga mempengaruhi nilai PEG.
plot(model_reg$fitted.values, model_reg$residuals,
main="Residual Plot",
xlab="Predicted Values",
ylab="Residuals",
pch=19, col="darkgreen")
abline(h=0, col="red")
legend("bottomleft",
legend=c("Residuals","Zero Line"),
col=c("darkgreen","red"),
pch=c(19, NA),
lwd=c(NA,1))
Interpretasi:
Pola residual menunjukkan bahwa titik-titik menyebar secara acak di
sekitar garis nol tanpa membentuk pola tertentu, sehingga tidak terdapat
indikasi pelanggaran asumsi model. Penyebaran yang relatif merata ini
juga menunjukkan bahwa asumsi homoskedastisitas dan linearitas masih
terpenuhi.
library(corrplot)
corrplot(cor(user[,c("STG","SCG","STR","LPR","PEG")]),
method="color",
addCoef.col="black",
title="Correlation Heatmap of Variables",
mar=c(0,0,2,0))
Interpretasi:
Korelasi antar variabel relatif lemah. Hubungan negatif antara LPR dan
PEG konsisten dengan hasil regresi.
library(caret)
library(rpart)
library(rpart.plot)
# Ubah ke Factor
user$UNS <- as.factor(user$UNS)
# Model
model_tree <- rpart(UNS ~ STG + SCG + STR + LPR,
data=user,
method="class")
rpart.plot(model_tree)
# Prediksi
pred <- predict(model_tree, type="class")
prob <- predict(model_tree, type = "prob")
# Confusion Matrix
(cm <- confusionMatrix(pred, user$UNS))
## Confusion Matrix and Statistics
##
## Reference
## Prediction High Low Middle very_low
## High 29 2 3 3
## Low 14 65 14 9
## Middle 19 14 68 6
## very_low 1 2 3 6
##
## Overall Statistics
##
## Accuracy : 0.6512
## 95% CI : (0.5896, 0.7092)
## No Information Rate : 0.3411
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.4959
##
## Mcnemar's Test P-Value : 0.0001392
##
## Statistics by Class:
##
## Class: High Class: Low Class: Middle Class: very_low
## Sensitivity 0.4603 0.7831 0.7727 0.25000
## Specificity 0.9590 0.7886 0.7706 0.97436
## Pos Pred Value 0.7838 0.6373 0.6355 0.50000
## Neg Pred Value 0.8462 0.8846 0.8675 0.92683
## Prevalence 0.2442 0.3217 0.3411 0.09302
## Detection Rate 0.1124 0.2519 0.2636 0.02326
## Detection Prevalence 0.1434 0.3953 0.4147 0.04651
## Balanced Accuracy 0.7096 0.7859 0.7717 0.61218
Berdasarkan hasil Confusion Matrix, diperoleh informasi sebagai berikut:
Akurasi (65,12%
Model mampu mengklasifikasikan sekitar 65% data dengan benar, sehingga
performanya tergolong cukup baik.
Kappa (0,4959)
Menunjukkan tingkat kesesuaian model berada pada kategori moderat, yang
berarti model memiliki kemampuan klasifikasi yang cukup baik
dibandingkan tebakan acak.
Precision (Pos Pred Value)
High (78%) menunjukkan prediksi pada kelas ini paling akurat
Low (63%) menunjukkan masih terdapat kesalahan dalam prediksi
Middle (63%) memiliki performa yang mirip dengan kelas Low
very_low (50%) merupakan yang terendah, sehingga model kurang baik dalam
memprediksi kelas ini
Sensitivity (Recall)
Low (78%) dan Middle (77%) menunjukkan model mampu mengenali sebagian
besar data pada kelas tersebut
High (46%) menunjukkan masih banyak data yang tidak terdeteksi dengan
baik
very_low (25%) menunjukkan kemampuan model sangat rendah dalam mengenali
kelas ini
Distribusi Data (Prevalence)
Kelas Middle memiliki proporsi terbesar, sedangkan kelas very_low
memiliki proporsi paling kecil. Hal ini menunjukkan adanya
ketidakseimbangan data.
Kinerja Model
Secara Keseluruhan Secara umum, model memiliki performa yang cukup baik
dalam mengklasifikasikan data, terutama pada kelas dengan jumlah data
yang besar seperti Low dan Middle. Namun, performa model masih belum
merata di semua kelas.
Potensi Bias Model
Model cenderung bias terhadap kelas mayoritas seperti Low dan Middle,
dan kurang mampu mengenali kelas minoritas yaitu very_low. Hal ini
disebabkan oleh ketidakseimbangan jumlah data (class imbalance),
sehingga model lebih sering memprediksi kelas dengan proporsi yang lebih
besar.
# Ubah jadi tabel
cm_table <- as.table(cm)
# Visualisasi
ggplot(as.data.frame(cm_table),
aes(x = Prediction, y = Reference, fill = Freq)) +
geom_tile() +
geom_text(aes(label = Freq),
color = "black",
size = 4) +
scale_fill_gradient(low = "white",
high = "blue") +
labs(title = "Confusion Matrix",
x = "Predicted",
y = "Actual") +
theme_minimal()
Berdasarkan visualisasi confusion matrix, terlihat bahwa nilai pada diagonal utama menunjukkan jumlah prediksi yang benar. Model mampu mengklasifikasikan sebagian besar data dengan baik, terutama pada kelas Low dan Middle. Namun, masih terdapat kesalahan klasifikasi pada kelas High dan very_low, yang menunjukkan bahwa model kesulitan membedakan beberapa kelas tertentu, terutama kelas dengan jumlah data yang lebih sedikit.
library(pROC)
# ROC
kelas <- colnames(prob)
auc_list <- sapply(kelas, function(k) {
roc_obj <- roc(user$UNS == k, prob[, k])
auc(roc_obj)
})
auc_list
## High Low Middle very_low
## 0.7999593 0.8206196 0.8189505 0.7835648
# ROC Curve
par(mfrow = c(2, 2))
for (k in kelas) {
roc_obj <- roc(user$UNS == k, prob[, k])
auc_val <- auc(roc_obj)
plot(
roc_obj,
main = paste("ROC -", k, "\nAUC =", round(auc_val, 3))
)
}
Interpretasi:
ROC Curve menggambarkan kemampuan model dalam membedakan masing-masing
kelas menggunakan pendekatan One-vs-All. Kurva yang semakin mendekati
sudut kiri atas menunjukkan performa model yang semakin baik. Hal ini
diperkuat dengan nilai AUC pada setiap kelas yang berada di atas 0,7,
yang menandakan bahwa model memiliki kemampuan klasifikasi yang cukup
baik.
user_scaled <- scale(user[,c("STG","SCG","STR","LPR","PEG")])
wss <- numeric(10)
for (k in 1:10) {
kmeans_model <- kmeans(user_scaled, centers = k, nstart = 25)
wss[k] <- kmeans_model$tot.withinss
}
plot(1:10, wss, type="b",
xlab="Number of Clusters (k)",
ylab="Within-Cluster Sum of Squares (WSS)",
main="Elbow Method")
Interpretasi:
Dari grafik Elbow terlihat bahwa penurunan WSS mulai melambat pada titik
ke-3, sehingga jumlah cluster optimal adalah 3.
Selanjutnya dilakukan clustering menggunakan K-Means dengan jumlah cluster sebanyak 3.
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
set.seed(123)
km <- kmeans(user_scaled, centers = 3, nstart = 25)
user$cluster <- as.factor(km$cluster)
fviz_cluster(km,
data = user_scaled,
geom = "point",
ellipse.type = "convex",
show.clust.cent = FALSE,
labelsize = 0,
palette = c("#F8766D", "#00BA38", "#619CFF"),
ggtheme = theme_gray(),
main = "K-Means Clustering")
aggregate(user[,c("STG","SCG","STR","LPR","PEG")],
by=list(Cluster=user$cluster),
mean)
Interpretasi:
Berdasarkan hasil pengelompokan menggunakan K-Means, data pengguna
terbagi menjadi tiga kelompok utama:
Hasil segmentasi menunjukkan bahwa pola belajar memiliki hubungan dengan performa pengguna, namun hubungan tersebut tidak sepenuhnya linear.
Beberapa hal yang bisa disimpulkan: