Precision vs Recall: Memilih Berdasarkan Biaya Kesalahan
Blog/Tips & Trik/Precision vs Recall: Memilih Berdasarkan Biaya Kesalahan

Precision vs Recall: Memilih Berdasarkan Biaya Kesalahan

BimaBima
·10 Oktober 2025·10 menit baca

Penulis

Bima

Bima

Founder & Data Professional

Bagikan

TL;DR

Precision adalah bagian dari prediksi positif yang ternyata benar, dan recall adalah bagian dari kasus positif asli yang berhasil ketangkap. Naikin salah satu hampir selalu nurunin yang lain, jadi kamu harus milih. Cara milih yang paling masuk akal adalah hitung biaya rupiah dari false positive dan false negative di kasusmu, lalu pilih ambang batas yang bikin total kerugian paling kecil. Akurasi nggak berguna buat masalah dengan kelas timpang, karena model yang selalu nebak negatif bisa dapat akurasi 98 persen tanpa nangkap satu kasus pun.

Precision ngukur seberapa sering tebakan positif modelmu benar. Recall ngukur seberapa banyak kasus positif yang beneran ada berhasil ketangkap.

Dua-duanya dihitung dari tabel yang sama, tapi jawab pertanyaan yang berbeda. Dan hampir selalu, naikin yang satu nurunin yang lain.

Pertanyaan yang bikin banyak orang mentok: "harus pilih yang mana?" Jawabannya nggak ada di buku statistik. Ada di hitungan biaya kesalahan di kasusmu sendiri.

Apa itu precision dan recall?

Keduanya lahir dari confusion matrix, tabel 2x2 yang ngebandingin tebakan model sama kenyataan.

Aslinya positifAslinya negatif
Ditebak positifTrue Positive (TP)False Positive (FP)
Ditebak negatifFalse Negative (FN)True Negative (TN)

Rumusnya:

Precision = TP / (TP + FP)
Recall    = TP / (TP + FN)
F1        = 2 x (Precision x Recall) / (Precision + Recall)

Bacaan gampangnya begini.

Precision ngitung dari sisi tebakan. Dari semua yang kamu bilang positif, berapa persen yang bener? Precision rendah artinya kamu sering bikin alarm palsu.

Recall ngitung dari sisi kenyataan. Dari semua kasus positif yang beneran ada, berapa persen yang kamu tangkap? Recall rendah artinya banyak yang lolos.

Perhatiin penyebutnya. Precision pakai jumlah tebakan positif, recall pakai jumlah kasus positif asli. Itu bedanya, dan itu yang bikin dua angka ini bisa jomplang jauh.

Kalau kamu mau baca ulang konsep tabelnya dari sisi bisnis, ada di confusion matrix dari sisi bisnis.

Kenapa akurasi nyesatin?

Ini kesalahan paling mahal yang aku lihat di proyek pertama orang.

Anggap dari 20.000 transaksi, cuma 400 yang bermasalah. Artinya 2 persen positif.

Bikin model yang selalu nebak "nggak bermasalah" buat semua transaksi. Akurasinya 98 persen. Angka yang kalau ditaruh di slide bikin orang tepuk tangan.

Recall-nya nol. Nggak ada satu pun kasus yang ketangkap.

Akurasi ngitung semua tebakan benar, dan di data timpang, tebakan negatif yang gampang itu numpuk sampai nutupin kegagalan di kelas yang kamu peduliin.

Aturannya: begitu kelas positifmu di bawah 20 persen, berhenti lihat akurasi. Lihat precision dan recall untuk kelas positif.

Kapan mentingin recall, kapan mentingin precision?

Patokan sederhananya: bandingin mana yang lebih mahal, kelewatan atau alarm palsu.

KasusUtamakanAlasan
Skrining awal penyakitRecallKasus yang lolos berakibat fatal. Alarm palsu cuma bikin tes lanjutan.
Deteksi transaksi curangRecallKerugian dari kasus lolos biasanya jauh lebih besar dari biaya periksa.
Filter spam ke folder terhapusPrecisionEmail penting yang kesangkut lebih merugikan dari spam yang lolos.
Blokir akun otomatisPrecisionSalah blokir pelanggan asli langsung jadi keluhan dan kehilangan pemasukan.
Rekomendasi produk di halaman depanPrecisionSlotnya terbatas, jadi tiap slot harus dipakai buat tebakan yang paling yakin.
Nyari calon pelanggan buat dihubungi tim salesTergantung kapasitasKalau tim sales cuma sanggup nelepon 200 orang seminggu, precision menang.

Baris terakhir itu yang paling sering kelewat. Kapasitas tindak lanjut adalah batas nyata. Recall 90 persen nggak berarti apa-apa kalau yang bisa ditindaklanjuti cuma 5 persen dari daftar.

Contoh kasus: deteksi selisih kasir di toko_berkah

Ini contoh dengan angka dari dataset ngulikdata, biar kelihatan gimana keputusannya dibikin.

Konteksnya: 3 cabang toko_berkah punya masalah selisih kas di akhir shift. Aku bikin model buat nandai transaksi yang pola-nya mencurigakan, biar bisa diperiksa manual.

Dari 20.000 transaksi selama satu kuartal, 400 di antaranya terbukti bermasalah setelah dicek satu per satu.

Dua ambang batas yang aku bandingin:

UkuranAmbang 0,50Ambang 0,20
True Positive180320
False Positive120880
False Negative22080
Precision0,600,27
Recall0,450,80
F10,510,40
Akurasi0,9830,952

Kalau kamu pilih berdasarkan F1 atau akurasi, ambang 0,50 menang. Tapi coba masukin rupiah.

Biaya periksa satu transaksi yang ditandai: sekitar 15 menit kerja staf audit. Kerugian rata-rata dari satu kasus yang lolos: Rp 380.000, dari perhitungan selisih kas historis.

HitunganAmbang 0,50Ambang 0,20
Jam audit terbuang (FP x 15 menit)30 jam220 jam
Biaya jam audit (Rp 40.000/jam)Rp 1,2 jutaRp 8,8 juta
Kerugian kasus lolos (FN x Rp 380.000)Rp 83,6 jutaRp 30,4 juta
Total kerugianRp 84,8 jutaRp 39,2 juta

Ambang 0,20 lebih murah Rp 45,6 juta per kuartal, walaupun F1 dan akurasinya lebih jelek.

Ini poin utamanya. F1 nganggap dua jenis kesalahan sama beratnya. Di kasus ini, satu kasus lolos setara dengan sekitar 38 kali biaya periksa yang sia-sia. Nggak seimbang sama sekali.

Satu catatan jujur: 220 jam audit itu nggak gratis dari sisi kapasitas. Kalau tim auditnya cuma dua orang, angka itu nggak muat. Dalam kasus ini, tim di cabang tersebut punya lima orang, dan tambahan 220 jam per kuartal masih masuk.

Cara ngitungnya di Python

Kalau kamu pakai scikit-learn, semua angka di atas bisa keluar dalam beberapa baris.

from sklearn.metrics import precision_score, recall_score, f1_score
from sklearn.metrics import classification_report, confusion_matrix

# y_true = label sebenarnya, y_prob = skor peluang dari model
ambang = 0.20
y_pred = (y_prob >= ambang).astype(int)

print(confusion_matrix(y_true, y_pred))
print(classification_report(y_true, y_pred, digits=3))

Buat nyari ambang yang paling murah, jalanin loop dan hitung biayanya langsung:

import numpy as np

biaya_fp = 10_000     # 15 menit x Rp 40.000 per jam
biaya_fn = 380_000    # rata-rata kerugian per kasus lolos

hasil = []
for ambang in np.arange(0.05, 0.95, 0.05):
    y_pred = (y_prob >= ambang).astype(int)
    tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
    total_biaya = fp * biaya_fp + fn * biaya_fn
    hasil.append((round(ambang, 2), fp, fn, total_biaya))

for baris in sorted(hasil, key=lambda x: x[3])[:5]:
    print(baris)

Lima baris teratas dari sortiran itu yang jadi kandidat ambangmu. Bukan angka 0,5 yang jadi bawaan library.

Definisi lengkap tiap metrik dan variasinya ada di dokumentasi resmi scikit-learn soal evaluasi model.

Ngitung di Excel kalau datanya kecil

Buat data ratusan baris, kamu nggak perlu Python. Dua kolom cukup: kolom label asli dan kolom tebakan.

TP: =COUNTIFS(A:A,1,B:B,1)
FP: =COUNTIFS(A:A,0,B:B,1)
FN: =COUNTIFS(A:A,1,B:B,0)
TN: =COUNTIFS(A:A,0,B:B,0)

Precision: =E2/(E2+E3)
Recall:    =E2/(E2+E4)

Rumus dasarnya cuma COUNTIFS dengan dua kondisi. Tambahin IFERROR supaya nggak muncul pesan galat waktu penyebutnya nol.

Kesalahan umum

Ngelaporin precision dan recall tanpa nyebut ambang batasnya. Angka precision 0,60 nggak berarti apa-apa tanpa info ambang. Selalu tulis ambangnya di laporan.

Ngukur di data latih. Precision di data yang dipakai buat melatih model hampir selalu terlalu bagus. Pakai data uji yang belum pernah dilihat model.

Nyeimbangin data lalu lupa efeknya ke precision. Teknik oversampling bikin recall naik, tapi precision di data nyata bisa jatuh karena proporsi aslinya beda. Ukur ulang di data uji yang proporsinya asli.

Ngejar F1 tanpa mikir biaya. Contoh toko_berkah di atas nunjukin F1 bisa nunjuk ke pilihan yang rugi Rp 45,6 juta.

Lupa kapasitas tindak lanjut. Recall tinggi yang bikin daftar 3.000 nama buat tim yang sanggup ngecek 200, itu recall yang cuma bagus di atas kertas.

Nganggap label di data pasti benar. Kalau label kasus positifmu dibikin manual dan ada yang kelewat, recall aslinya lebih rendah dari yang kamu ukur. Cek dulu kualitas labelnya, dan konsepnya ada di glosarium data quality.

FAQ

Precision dan recall itu bahasa Indonesianya apa?

Precision sering diterjemahkan jadi presisi atau ketepatan, dan recall jadi sensitivitas atau daya tangkap. Di dunia kerja Indonesia, orang biasanya tetap pakai istilah aslinya karena terjemahannya gampang ketuker sama akurasi. Yang penting kamu bisa jelasin maknanya pakai kalimat biasa: precision soal seberapa sering alarmmu benar, recall soal seberapa banyak kejadian yang kena alarm.

Kenapa akurasi nggak boleh dipakai buat data timpang?

Karena akurasi ngitung semua tebakan benar, termasuk tebakan negatif yang gampang. Kalau cuma 2 persen datamu positif, model yang selalu bilang negatif langsung dapat akurasi 98 persen tanpa nangkap satu kasus pun. Angkanya kelihatan bagus tapi modelnya nggak berguna. Buat kasus timpang, lihat precision, recall, dan F1 per kelas positif.

F1 score itu selalu pilihan aman?

Nggak. F1 nganggap precision dan recall sama pentingnya, padahal di kebanyakan kasus bisnis biayanya beda jauh. Deteksi penyakit lebih rugi kalau kelewat, filter spam lebih rugi kalau salah blokir. Kalau bobotnya beda, pakai F beta dengan beta lebih dari 1 buat mentingin recall, atau kurang dari 1 buat mentingin precision.

Gimana cara naikin recall tanpa ngorbanin precision terlalu jauh?

Turunin ambang batas dulu dan lihat berapa precision yang hilang. Kalau turunnya terlalu curam, berarti modelnya yang perlu diperbaiki, bukan ambangnya. Tambah fitur yang beneran ngebedain kelas positif, perbaiki label yang salah, atau kumpulin lebih banyak contoh kasus positif. Ambang batas cuma ngatur pembagian, bukan nambah kemampuan model.

Ambang batas 0,5 itu dari mana asalnya?

Itu cuma nilai bawaan library, bukan hasil hitungan yang cocok buat kasusmu. Sebagian besar model klasifikasi keluarin skor peluang antara 0 dan 1, lalu library motong di 0,5 supaya ada jawaban ya atau tidak. Kalau biaya dua jenis kesalahanmu nggak seimbang, angka 0,5 hampir pasti bukan pilihan terbaik.

Penutup

Tiga hal yang perlu kamu bawa.

Precision soal seberapa sering alarmmu benar, recall soal seberapa banyak kejadian yang kena alarm. Akurasi nggak berguna begitu kelas positifmu di bawah 20 persen. Dan cara paling jujur buat milih ambang batas adalah hitung rupiah dari tiap jenis kesalahan, bukan ngikutin F1.

Coba buka satu model yang lagi kamu kerjain, lalu jawab dua pertanyaan ini di kertas: berapa rugi kalau satu kasus lolos, dan berapa biaya satu alarm palsu. Kalau kamu bisa jawab dua angka itu, ambang batasmu bisa dihitung, bukan ditebak.

Lanjut baca ROC AUC vs PR AUC kalau kamu perlu ngukur model tanpa nentuin ambang dulu, atau glosarium KPI buat nyambungin ukuran model ke ukuran bisnis.

Coba Langsung

Mau praktek langsung? Mulai latihan SQL gratis

Latihan interaktif, langsung di browser.

Buka NgulikSQL →
Bagikan:
Bima
Ditulis oleh

Bima

Founder & Data Professional

Founder Ngulik Data. Passionate about making data analysis accessible for everyone.

Artikel terkait

Pandas groupby: Agregasi Data ala Pivot di Python (2026)
Tips & Trik
20 Juli 2026•9 menit baca

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.

BimaBima
Pandas to_excel: Ekspor DataFrame ke Excel (2026)
Tips & Trik
18 Juli 2026•8 menit baca

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.

BimaBima
Pandas read_excel: Baca File Excel di Python
Tips & Trik
16 Juli 2026•8 menit baca

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.

BimaBima
Kembali ke Blog
Ngulik Data logoNgulik Data

Platform edukasi data lengkap untuk professionals Indonesia. Belajar SQL, Data Analysis, dan lebih banyak lagi dengan praktek langsung dan feedback real-time.

© 2026 Ngulik Data. Semua hak dilindungi.

TAUTAN
BantuanHargaDatasetBlogAfiliasi
LEGAL
Syarat & KetentuanKebijakan Privasi
Ngulik Data
DatasetLeaderboardBlogStore