ROC AUC vs PR AUC: Mana yang Benar untuk Data Timpang
TL;DR
ROC AUC ngukur kemampuan model ngebedain kelas positif dan negatif lewat trade off antara true positive rate dan false positive rate. PR AUC ngukur trade off antara precision dan recall, dan itu jauh lebih ketat waktu kelas positifmu langka. Di data yang cuma 2 persen positif, ROC AUC gampang kelihatan tinggi karena penyebut false positive rate diisi puluhan ribu kasus negatif. Pakai PR AUC kalau kelas positif di bawah 10 persen dan yang kamu peduliin cuma kemampuan model nemuin kasus positif. Nilai acuan PR AUC bukan 0,5, tapi proporsi kelas positif itu sendiri.
ROC AUC ngukur seberapa bagus model kamu misahin kelas positif dari negatif di semua ambang batas. PR AUC ngukur hal yang lebih sempit: seberapa bagus model kamu nemuin kasus positif tanpa kebanyakan bikin alarm palsu.
Di data yang seimbang, dua-duanya cerita hal yang mirip. Di data timpang, mereka bisa nunjuk ke model yang berbeda.
Dan data timpang itu justru yang paling sering muncul di kerjaan nyata. Kecurangan, penyakit, pelanggan yang berhenti, mesin yang rusak. Semua kasus menarik itu langka.
Apa itu ROC AUC?
Kurva ROC nggambarin hubungan antara dua angka di berbagai ambang batas.
True Positive Rate = TP / (TP + FN) -- sama dengan recall
False Positive Rate = FP / (FP + TN)
Tiap titik di kurva mewakili satu ambang batas. AUC-nya luas area di bawah kurva itu, nilainya antara 0 dan 1.
Tafsiran yang paling gampang dipegang: ROC AUC adalah peluang bahwa satu kasus positif yang diambil acak dapat skor lebih tinggi dari satu kasus negatif yang diambil acak.
ROC AUC 0,90 artinya kalau kamu ambil satu kasus curang dan satu kasus normal, model bakal ngasih skor lebih tinggi ke yang curang di 90 dari 100 percobaan.
Acuan acaknya 0,5, dan itu tetap 0,5 berapapun proporsi kelasmu. Sifat itu kelihatan enak, tapi justru itu sumber masalahnya.
Apa itu PR AUC?
Kurva precision recall nggambarin hubungan antara dua angka lain:
Precision = TP / (TP + FP)
Recall = TP / (TP + FN)
Perhatiin penyebut precision. Isinya jumlah tebakan positif, bukan jumlah kasus negatif.
Itu bedanya yang menentukan. False positive rate punya penyebut yang besar banget di data timpang, jadi tambahan seribu alarm palsu cuma bikin angkanya naik sedikit. Precision langsung kena.
Acuan PR AUC bukan 0,5. Acuannya proporsi kelas positif di datamu. Kalau positifmu 2 persen, model asal-asalan dapat PR AUC sekitar 0,02.
Konsep precision dan recall-nya sendiri aku bahas terpisah di precision vs recall.
Kenapa ROC AUC nyesatkan di data timpang?
Ini gampang dilihat pakai angka.
Anggap ada 20.000 transaksi, 400 di antaranya bermasalah. Model kamu nandai 1.200 transaksi, dan 320 di antaranya beneran bermasalah.
TP = 320
FP = 880
FN = 80
TN = 18.720
True Positive Rate = 320 / 400 = 0,800
False Positive Rate = 880 / 19.600 = 0,045
Precision = 320 / 1.200 = 0,267
Lihat bedanya. False positive rate cuma 4,5 persen, angka yang kedengarannya kecil dan bagus. Tapi precision-nya 26,7 persen, artinya 3 dari 4 alarm itu palsu.
Dua angka itu ngomongin 880 kesalahan yang sama persis. Yang satu bilang "kecil", yang satu bilang "besar". Bedanya cuma penyebut.
Ini kenapa kurva ROC bisa kelihatan bagus banget di masalah langka, sementara orang yang harus ngecek daftar hasilnya ngerasa modelnya nggak kepakai.
Contoh kasus: dua model deteksi selisih kasir di toko_berkah
Aku pakai dataset ngulikdata biar keliatan gimana dua ukuran ini bisa kebalik.
Datanya 20.000 transaksi dari 3 cabang toko_berkah, dengan 400 kasus bermasalah yang terverifikasi. Proporsi positif 2 persen.
Dua model dibandingin:
| Ukuran | Model A | Model B |
|---|---|---|
| ROC AUC | 0,932 | 0,911 |
| PR AUC | 0,412 | 0,524 |
| Acuan PR AUC (proporsi positif) | 0,020 | 0,020 |
| Precision di recall 0,80 | 0,214 | 0,338 |
| Jumlah kasus yang harus dicek buat dapat recall 0,80 | 1.495 | 947 |
Model A menang di ROC AUC. Model B menang di PR AUC.
Yang bikin bedanya: Model A lebih rapi misahin kasus negatif yang skornya rendah, dan itu nyumbang ke ROC AUC. Model B lebih tajam di ujung atas daftar, yaitu di kasus-kasus yang skornya paling tinggi.
Buat kerjaan tim audit, cuma ujung atas yang penting. Mereka nggak bakal ngecek 20.000 transaksi. Mereka ngecek beberapa ratus teratas.
Hitungan praktisnya: buat nangkap 320 dari 400 kasus, tim harus periksa 1.495 transaksi kalau pakai Model A, atau 947 kalau pakai Model B. Selisih 548 pemeriksaan.
Dengan 15 menit per pemeriksaan, itu 137 jam kerja per kuartal yang kehemat cuma dari milih model yang benar.
Kalau aku cuma lihat ROC AUC, aku bakal milih Model A dan buang 137 jam itu.
Kapan pakai yang mana?
| Situasi | Pakai | Alasan |
|---|---|---|
| Kelas positif di bawah 10 persen | PR AUC | ROC AUC ketutupan sama banyaknya kasus negatif yang gampang |
| Dua kelas seimbang dan sama pentingnya | ROC AUC | Nafsirinnya lebih gampang dan nggak kepengaruh ambang |
| Hasil model dipakai buat nyaring daftar tindak lanjut | PR AUC | Precision langsung nentuin beban kerja tim |
| Bandingin model antar dataset dengan proporsi berbeda | ROC AUC | PR AUC ikut berubah kalau proporsi kelas berubah |
| Peringkat pelanggan buat kampanye terbatas | PR AUC | Cuma bagian atas daftar yang bakal dipakai |
| Nilai negatif juga punya konsekuensi nyata | Dua-duanya | Laporkan berdampingan, jangan pilih salah satu |
Baris keempat sering kelewat. PR AUC nggak bisa dibandingin lurus antar dataset yang proporsi kelasnya beda, karena acuannya ikut geser. Kalau kamu ngebandingin performa model di dua cabang yang tingkat kecurangannya beda, sertakan proporsi positif tiap cabang.
Cara ngitungnya di Python
from sklearn.metrics import roc_auc_score, average_precision_score
from sklearn.metrics import precision_recall_curve, roc_curve
roc = roc_auc_score(y_true, y_prob)
pr = average_precision_score(y_true, y_prob)
acuan_pr = y_true.mean() # proporsi kelas positif
print(f"ROC AUC : {roc:.3f} (acuan acak 0.500)")
print(f"PR AUC : {pr:.3f} (acuan acak {acuan_pr:.3f})")
Pakai average_precision_score, bukan auc dengan interpolasi. Cara interpolasi bisa ngasih angka yang terlalu bagus di kurva precision recall karena bentuk kurvanya nggak halus.
Buat lihat precision di tingkat recall tertentu, yang biasanya lebih berguna dari angka ringkasannya:
import numpy as np
prec, rec, ambang = precision_recall_curve(y_true, y_prob)
for target in [0.60, 0.70, 0.80, 0.90]:
idx = np.argmin(np.abs(rec - target))
print(f"recall {rec[idx]:.2f} -> precision {prec[idx]:.3f}")
Tabel empat baris itu jauh lebih dipahami orang non-teknis dibanding satu angka AUC. Aku selalu bawa versi ini ke rapat.
Definisi lengkap tiap fungsi ada di dokumentasi resmi scikit-learn soal evaluasi model.
Kesalahan umum
Ngelaporin PR AUC tanpa nyebut proporsi kelas positif. PR AUC 0,41 itu bagus kalau positifnya 2 persen, dan jelek kalau positifnya 40 persen. Tanpa acuan, angkanya nggak bisa dibaca.
Ngebandingin PR AUC antar dataset dengan proporsi berbeda. Model yang sama bisa dapat PR AUC 0,52 di satu cabang dan 0,31 di cabang lain cuma karena tingkat kejadiannya beda.
Nyeimbangin data lalu ngukur di data yang udah diseimbangkan. Kalau kamu oversampling kelas positif sampai 50 persen lalu ngitung PR AUC di sana, angkanya nggak nyambung sama kenyataan. Ukur di data uji dengan proporsi asli.
Ngejar AUC tanpa pernah milih ambang. Dua ukuran ini ngerangkum performa di semua ambang. Waktu model dipakai, kamu tetap harus milih satu ambang, dan itu keputusan terpisah yang butuh hitungan biaya.
Nganggap ROC AUC tinggi berarti model siap produksi. ROC AUC 0,95 di masalah dengan 0,5 persen positif masih bisa ngasih precision di bawah 10 persen. Cek precision di tingkat recall yang kamu targetkan.
Lupa ngecek kualitas label. Kalau kasus positif di data uji ada yang belum terverifikasi, dua ukuran ini ikut salah. Cek dulu, dan konsepnya ada di glosarium data quality.
Yang aku laporkan waktu presentasi model
Bukan satu angka AUC. Empat baris ini:
- Proporsi kelas positif di data uji
- PR AUC dan acuannya, ditulis berdampingan
- Tabel precision di recall 0,60 sampai 0,90
- Berapa kasus yang harus diperiksa manusia di ambang yang diusulkan
Baris keempat yang paling sering bikin diskusi berubah arah. Begitu orang lihat angkanya 947 pemeriksaan per kuartal, pembicaraan pindah dari "modelnya bagus nggak" ke "tim kita sanggup nggak".
Nyambungin ukuran model ke ukuran kerja itu bagian yang paling sering kelewat, dan aku bahas dasarnya di glosarium KPI.
FAQ
Kapan harus pakai PR AUC daripada ROC AUC?
Pakai PR AUC kalau kelas positifmu di bawah 10 persen dan yang kamu peduliin cuma kemampuan model nemuin kasus positif. Contohnya deteksi kecurangan, skrining penyakit langka, atau nyari pelanggan yang bakal berhenti. Pakai ROC AUC kalau dua kelas sama pentingnya dan proporsinya nggak terlalu jomplang, misalnya klasifikasi jenis dokumen.
Nilai ROC AUC berapa yang dianggap bagus?
Acuan acaknya 0,5, jadi apapun di atas itu lebih baik dari nebak. Tapi angka bagus tergantung bidangnya. Di kredit dan asuransi, 0,70 sampai 0,80 udah dipakai produksi. Di masalah yang sinyalnya jelas, di bawah 0,90 dianggap kurang. Yang lebih penting dari angkanya: bandingkan sama model pembanding paling sederhana di kasusmu, bukan sama patokan umum.
Nilai acuan PR AUC berapa?
Proporsi kelas positifmu sendiri. Kalau 2 persen datamu positif, model asal-asalan dapat PR AUC sekitar 0,02. Jadi PR AUC 0,41 itu sekitar 20 kali lebih baik dari acak, bukan angka jelek walaupun kelihatan rendah. Selalu tulis proporsi kelas positif di sebelah nilai PR AUC waktu ngelaporin hasil.
Apa bedanya PR AUC dan average precision?
Average precision adalah cara ngitung luas di bawah kurva precision recall dengan penjumlahan bertahap, tanpa interpolasi. Di scikit-learn, fungsi average_precision_score itu yang disarankan buat ngitung PR AUC, karena cara auc dengan interpolasi bisa ngasih hasil yang terlalu bagus. Buat pelaporan sehari-hari, dua istilah ini sering dianggap sama.
Kalau dua ukuran ini kasih urutan model yang beda, ikut yang mana?
Ikut yang cocok sama tujuan kerjamu. Kalau kamu mau nyaring daftar yang bakal ditindaklanjuti manusia, ikut PR AUC, karena precision langsung nentuin berapa banyak waktu tim kebuang. Lalu pastikan dengan hitungan biaya rupiah dari false positive dan false negative. Ukuran ringkasan cuma alat bantu, keputusan akhir tetap dari biaya kesalahan.
Penutup
Tiga hal yang perlu kamu bawa.
ROC AUC gampang kelihatan tinggi di data timpang karena penyebut false positive rate diisi puluhan ribu kasus negatif. PR AUC lebih ketat, dan acuannya bukan 0,5 melainkan proporsi kelas positifmu. Dua ukuran ini bisa nunjuk model yang berbeda, dan di contoh toko_berkah bedanya 137 jam kerja per kuartal.
Ambil model yang lagi kamu kerjain, hitung dua-duanya, lalu tulis proporsi kelas positif di sebelahnya. Kalau urutannya beda, itu tanda kamu perlu lihat precision di tingkat recall yang beneran mau kamu pakai.
Lanjut baca precision vs recall buat dasar dua angka penyusunnya, atau confusion matrix dari sisi bisnis kalau kamu perlu ngejelasin hasil model ke orang non-teknis.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Pandas groupby: Agregasi Data ala Pivot di Python (2026)
groupby ngelompokin baris berdasarkan kolom, lalu ngitung ringkasan per grup kayak total atau rata-rata. Ini pivot-nya pandas.
Pandas to_excel: Ekspor DataFrame ke Excel (2026)
to_excel nyimpen DataFrame pandas jadi file Excel .xlsx. Ini cara pakainya, dari satu sheet sampai banyak sheet, plus setelan yang bikin hasilnya rapi.
Pandas read_excel: Baca File Excel di Python
pandas read_excel baca file Excel jadi DataFrame, bisa pilih sheet tertentu dan lompatin baris judul yang berantakan. Ini cara pakai plus parameter penting dengan contoh data toko.