Setiap tahun ada mahasiswa yang berhenti kuliah sebelum lulus. Di artikel ini kami membangun model machine learning untuk memprediksi apakah seorang mahasiswa akan dropout, masih terdaftar (enrolled), atau lulus (graduate). Kami membandingkan dua model baseline dengan beberapa metode Ensemble Learning (Bagging, Random Forest, Soft Voting, AdaBoost, Gradient Boosting, dan Stacking), lalu mengoptimasi model dengan hyperparameter tuning memakai GridSearchCV.
Seluruh eksperimen dijalankan di Google Colab: buka notebook di Google Colab
1. Permasalahan dan Tujuan
Dropout merugikan mahasiswa (waktu dan biaya) dan juga kampus. Kalau mahasiswa yang berisiko bisa dikenali lebih awal, kampus bisa memberi pendampingan akademik atau bantuan keuangan sebelum terlambat.
Tujuan eksperimen ini:
- Membuat model klasifikasi 3 kelas: Dropout, Enrolled, dan Graduate.
- Membandingkan model baseline dengan beberapa metode ensemble.
- Mengoptimasi model dengan hyperparameter tuning.
- Mencari faktor yang paling berhubungan dengan dropout.
2. Dataset
Kami memakai dataset Predict Students' Dropout and Academic Success dari UCI Machine Learning Repository:
https://archive.ics.uci.edu/dataset/697/predict+students+dropout+and+academic+success
| Keterangan | Isi |
|---|---|
| Asal data | Polytechnic Institute of Portalegre, Portugal (angkatan 2008/2009 sampai 2018/2019) |
| Jumlah data | 4424 mahasiswa |
| Fitur | 36 (data pendaftaran, latar belakang keluarga, kondisi ekonomi, nilai semester 1 dan 2) |
| Target | Dropout, Enrolled, Graduate |
| Lisensi | CC BY 4.0 |
Dataset bisa dibaca langsung dari link download UCI, jadi tidak perlu upload file ke Colab. Pemisah kolomnya titik koma (;).
url = "https://archive.ics.uci.edu/static/public/697/predict+students+dropout+and+academic+success.zip"
df = pd.read_csv(url, sep=";")
print("Shape:", df.shape) # (4424, 37)
Hasil pengecekan awal: tidak ada missing value dan tidak ada data duplikat.
3. Eksplorasi Data (EDA)
Distribusi target
Jumlah data tiap kelas tidak seimbang: Graduate 2209 (49.9%), Dropout 1421 (32.1%), dan Enrolled 794 (17.9%). Karena itu kami tidak hanya melihat akurasi, tetapi memakai F1-macro sebagai metrik utama.
Jumlah mata kuliah yang lulus di semester 2
Mahasiswa yang dropout lulus jauh lebih sedikit mata kuliah. Nilai tengahnya (median) 0 mata kuliah, sedangkan Enrolled 4 dan Graduate 6.
Status pembayaran uang kuliah
Dari mahasiswa yang uang kuliahnya tidak lunas, 86.6% berakhir dropout. Pada mahasiswa yang uang kuliahnya lunas, angka dropout hanya 24.7%.
Korelasi fitur dengan dropout
Untuk melihat korelasi, kami membuat kolom bantu Dropout (1 = dropout, 0 = tidak dropout).
Fitur yang paling berhubungan dengan dropout adalah jumlah mata kuliah lulus dan nilai semester 2 (korelasi -0.57), lalu semester 1 (-0.48) dan status uang kuliah lunas (-0.43). Tanda minus artinya semakin tinggi nilainya, semakin kecil kemungkinan dropout.
4. Preprocessing
Langkah preprocessing yang kami lakukan:
- Merapikan nama kolom, karena ada satu nama kolom yang mengandung karakter tab di ujungnya.
- Mengubah target menjadi angka: Dropout = 0, Enrolled = 1, Graduate = 2.
- Memisahkan fitur (
X) dan target (y). - Membagi data menjadi 80% data latih dan 20% data uji.
stratify=ymenjaga proporsi ketiga kelas tetap sama di data latih dan data uji.
df.columns = df.columns.str.strip()
df["Target"] = df["Target"].map({"Dropout": 0, "Enrolled": 1, "Graduate": 2})
X = df.drop(columns="Target")
y = df["Target"]
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.20,
random_state=RANDOM_STATE,
stratify=y
)
Hasilnya 3539 data latih dan 885 data uji. Semua fitur sudah berbentuk angka dan tidak ada missing value, jadi tidak perlu encoding atau imputasi. Standarisasi (StandardScaler) hanya dipakai untuk Logistic Regression, karena model berbasis pohon tidak terpengaruh skala fitur.
5. Model Baseline dan Cross Validation
Baseline adalah model sederhana sebagai pembanding. Kami memakai Logistic Regression (dengan StandardScaler di dalam Pipeline) dan satu Decision Tree.
logistic = Pipeline([
("scaler", StandardScaler()),
("model", LogisticRegression(max_iter=1000))
])
tree = DecisionTreeClassifier(random_state=RANDOM_STATE)
| Model | Akurasi train | Akurasi test | F1-macro test |
|---|---|---|---|
| Logistic Regression | - | 0.768 | 0.683 |
| Decision Tree | 1.000 | 0.697 | 0.639 |
Decision Tree mendapat akurasi 1.0 di data latih tetapi hanya 0.697 di data uji. Satu pohon keputusan menghafal data latih (overfitting).
Skor dari satu kali pembagian data bisa kebetulan bagus atau jelek. Karena itu kami memakai cross validation 5-fold: data latih dibagi menjadi 5 bagian, model dilatih di 4 bagian dan diuji di 1 bagian sisanya, diulang 5 kali, lalu skornya dirata-rata.
cv_lr = cross_val_score(logistic, X_train, y_train, cv=5, scoring="f1_macro")
cv_tree = cross_val_score(tree, X_train, y_train, cv=5, scoring="f1_macro")
F1-macro CV Logistic Regression: [0.668 0.693 0.681 0.666 0.681] rata-rata: 0.6779
F1-macro CV Decision Tree : [0.631 0.606 0.606 0.646 0.601] rata-rata: 0.618
6. Ensemble Learning
Ensemble learning menggabungkan banyak model supaya prediksinya lebih baik dan lebih stabil dibanding satu model saja.
6.1 Bagging dan Random Forest
Bagging (Bootstrap Aggregating) melatih banyak Decision Tree pada sampel data yang diambil acak dengan pengembalian, lalu menggabungkan hasil prediksinya. Random Forest adalah bagging yang di setiap percabangan pohon hanya memakai sebagian fitur secara acak, sehingga pohon-pohonnya lebih beragam.
bagging = BaggingClassifier(
estimator=DecisionTreeClassifier(random_state=RANDOM_STATE),
n_estimators=100,
random_state=RANDOM_STATE,
n_jobs=-1
)
rf = RandomForestClassifier(
n_estimators=200,
random_state=RANDOM_STATE,
n_jobs=-1
)
Bagging menaikkan F1-macro test dari 0.639 (satu Decision Tree) menjadi 0.677, dan Random Forest mendapat 0.682. Menggabungkan banyak pohon membuat prediksi lebih stabil.
6.2 Soft Voting
Voting menggabungkan beberapa model yang berbeda jenis. Pada soft voting, probabilitas prediksi dari setiap model dirata-rata, lalu kelas dengan probabilitas tertinggi dipilih.
voting = VotingClassifier(
estimators=[
("lr", logistic),
("rf", rf),
("bagging", bagging)
],
voting="soft"
)
Soft Voting mendapat akurasi test 0.772 (tertinggi dari semua model) dan F1-macro test 0.688.
6.3 Boosting: AdaBoost dan Gradient Boosting
Boosting melatih model secara berurutan. Model berikutnya fokus memperbaiki kesalahan model sebelumnya.
ada = AdaBoostClassifier(
n_estimators=200,
random_state=RANDOM_STATE
)
gb = GradientBoostingClassifier(random_state=RANDOM_STATE)
AdaBoost mendapat F1-macro test 0.664, justru lebih rendah dari baseline Logistic Regression. Gradient Boosting lebih baik dengan F1-macro test 0.690.
6.4 Stacking
Stacking memakai prediksi beberapa model (base model) sebagai input untuk satu model terakhir (meta-model). Kami memakai Random Forest, Gradient Boosting, dan AdaBoost sebagai base model, dengan Logistic Regression sebagai meta-model.
stacking = StackingClassifier(
estimators=[
("rf", rf),
("gb", gb),
("ada", ada)
],
final_estimator=LogisticRegression(max_iter=1000)
)
Stacking mendapat akurasi test 0.765 dan F1-macro test 0.701, tertinggi di antara semua model.
7. Hyperparameter Tuning dengan GridSearchCV
GridSearchCV mencoba semua kombinasi parameter yang kami tentukan. Setiap kombinasi dinilai dengan cross validation 5-fold di data latih, lalu dipilih kombinasi dengan F1-macro tertinggi. Kami melakukan tuning pada Random Forest (27 kombinasi) dan Gradient Boosting (8 kombinasi).
param_rf = {
"n_estimators": [100, 200, 300],
"max_depth": [None, 10, 20],
"min_samples_leaf": [1, 2, 4]
}
grid_rf = GridSearchCV(
RandomForestClassifier(random_state=RANDOM_STATE),
param_rf,
cv=5,
scoring="f1_macro",
n_jobs=-1
)
grid_rf.fit(X_train, y_train)
| Model | Parameter terbaik | F1-macro CV | F1-macro test |
|---|---|---|---|
| Random Forest (tuned) |
n_estimators=100, max_depth=None, min_samples_leaf=1
|
0.698 | 0.692 |
| Gradient Boosting (tuned) |
learning_rate=0.05, max_depth=3, n_estimators=200
|
0.703 | 0.689 |
Parameter terbaik Random Forest hampir sama dengan parameter bawaan scikit-learn, jadi kenaikannya kecil.
8. Perbandingan Semua Model
Semua model dibandingkan dengan cara yang sama: F1-macro cross validation 5-fold di data latih (F1 CV), lalu akurasi dan F1-macro di data uji.
for name, model in models.items():
cv_score = cross_val_score(model, X_train, y_train, cv=5, scoring="f1_macro", n_jobs=-1)
pred = model.predict(X_test)
results.append({
"Model": name,
"F1 CV": cv_score.mean(),
"Accuracy Test": accuracy_score(y_test, pred),
"F1 Test": f1_score(y_test, pred, average="macro")
})
| Model | F1 CV | Akurasi test | F1 test |
|---|---|---|---|
| Stacking | 0.714 | 0.765 | 0.701 |
| Gradient Boosting (tuned) | 0.703 | 0.759 | 0.689 |
| Soft Voting | 0.701 | 0.772 | 0.688 |
| Gradient Boosting | 0.701 | 0.759 | 0.690 |
| Bagging | 0.699 | 0.749 | 0.677 |
| Random Forest (tuned) | 0.698 | 0.767 | 0.692 |
| Random Forest | 0.693 | 0.765 | 0.682 |
| Logistic Regression (baseline) | 0.678 | 0.768 | 0.683 |
| AdaBoost | 0.672 | 0.744 | 0.664 |
| Decision Tree (baseline) | 0.618 | 0.697 | 0.639 |
9. Evaluasi Model Final
Model final dipilih berdasarkan F1 CV tertinggi, bukan skor data uji, supaya data uji tetap menjadi penilaian akhir yang netral. Model terpilih adalah Stacking.
precision recall f1-score support
Dropout 0.79 0.74 0.76 284
Enrolled 0.55 0.44 0.49 159
Graduate 0.81 0.90 0.85 442
accuracy 0.76 885
macro avg 0.72 0.69 0.70 885
weighted avg 0.76 0.76 0.76 885
Cara membaca confusion matrix: baris adalah kelas asli, kolom adalah hasil prediksi, dan angka di diagonal adalah prediksi yang benar.
- Graduate dikenali dengan sangat baik: 398 dari 442 benar (recall 0.90).
- Dropout cukup baik: 209 dari 284 benar (recall 0.74).
- Enrolled paling sulit: hanya 70 dari 159 benar (recall 0.44). Sebanyak 39 mahasiswa Enrolled diprediksi Dropout dan 50 diprediksi Graduate.
10. Fitur Paling Berpengaruh
Stacking tidak punya atribut feature_importances_, jadi kami memakai Random Forest hasil tuning untuk melihat fitur yang paling berpengaruh.
Empat fitur teratas adalah jumlah mata kuliah lulus dan nilai di semester 2 dan semester 1. Ini sesuai dengan temuan EDA. Status uang kuliah lunas juga masuk 10 fitur terpenting.
11. Analisis Hasil
- Ensemble lebih baik dari baseline. Stacking memberikan F1-macro CV 0.714 dan F1-macro test 0.701. Dibanding Logistic Regression (CV 0.678, test 0.683), F1-macro naik sekitar 0.02 sampai 0.04. Dibanding Decision Tree (CV 0.618, test 0.639), naik sekitar 0.06 sampai 0.10.
- Tidak semua ensemble otomatis lebih baik. AdaBoost (CV 0.672) masih di bawah Logistic Regression. Soft Voting punya akurasi test tertinggi (0.772), tetapi F1-macro-nya (0.688) di bawah Stacking. Inilah alasan kami memakai F1-macro sebagai metrik utama: akurasi bisa tinggi walaupun kelas kecil (Enrolled) sering salah.
- Efek hyperparameter tuning kecil. Tuning menaikkan F1-macro CV Random Forest dari 0.693 menjadi 0.698 dan Gradient Boosting dari 0.701 menjadi 0.703. Parameter bawaan scikit-learn ternyata sudah cukup baik untuk dataset ini.
- Kelas Enrolled paling sulit. Datanya paling sedikit (17.9%) dan kondisinya berada di antara Dropout dan Graduate, sehingga sering tertukar dengan dua kelas lainnya.
- Faktor akademik paling penting. Jumlah mata kuliah lulus dan nilai di semester 1 dan 2 adalah fitur terpenting, diikuti faktor lain seperti nilai masuk, usia, dan status uang kuliah.
12. Kesimpulan
- Ensemble learning berhasil meningkatkan performa prediksi dropout dibanding model baseline. Model terbaik adalah Stacking (Random Forest + Gradient Boosting + AdaBoost dengan meta-model Logistic Regression) dengan F1-macro 0.701 dan akurasi 0.765 di data uji.
- Hyperparameter tuning dengan GridSearchCV hanya memberi kenaikan kecil (sekitar 0.002 sampai 0.005 F1-macro CV).
- Prestasi akademik di semester 1 dan 2 serta status pembayaran uang kuliah adalah faktor yang paling berhubungan dengan dropout. Kampus dapat memakai faktor-faktor ini sebagai tanda awal untuk memberi pendampingan.
13. Keterbatasan
- Data hanya berasal dari satu institusi di Portugal, jadi hasilnya belum tentu sama untuk kampus lain, termasuk di Indonesia.
- Model memakai nilai semester 1 dan 2, sehingga prediksi baru bisa dibuat setelah semester 2 selesai, bukan saat mahasiswa baru masuk.
- Kelas Enrolled masih sulit diprediksi (recall 0.44).
- Tuning hanya dilakukan pada dua model dengan jumlah kombinasi parameter yang sedikit. Grid yang lebih luas mungkin memberi hasil berbeda.
- Data uji hanya dibagi satu kali (
random_state=42), jadi skor test bisa sedikit berbeda jika pembagian datanya diubah.
Notebook
Kode lengkap beserta semua output bisa dilihat dan dijalankan ulang di Google Colab: https://colab.research.google.com/drive/1JF6VieRSYcE72Dp49FVNyb9wadaA8P_8
Anggota Kelompok
| No | Nama | NIM |
|---|---|---|
| 1 | Priskila Novaulin Tulangouw | 2432084 |
| 2 | Selia Emeline | 2432035 |
| 3 | Hendra Cung | 2432065 |
| 4 | Shinta Natalia | 2432020 |
| 5 | Firman | 2432063 |
Mata kuliah Penerapan Kecerdasan Buatan, Program Studi Teknologi Informasi.
Referensi
- Realinho, V., Machado, J., Baptista, L., & Martins, M. V. (2022). Predicting Student Dropout and Academic Success. Data, 7(11), 146. https://doi.org/10.3390/data7110146
- UCI Machine Learning Repository: Predict Students' Dropout and Academic Success. https://archive.ics.uci.edu/dataset/697/predict+students+dropout+and+academic+success
- Dokumentasi scikit-learn: Ensemble methods. https://scikit-learn.org/stable/modules/ensemble.html







Top comments (0)