TL;DR
SHAP ngasih angka kontribusi tiap fitur ke satu prediksi, dan jumlah semua kontribusi plus nilai dasar model selalu pas sama hasil prediksinya. Sifat itu yang bikin kamu bisa jawab kenapa satu pelanggan tertentu diprediksi berhenti, sesuatu yang nggak bisa dijawab feature importance biasa. Pakai grafik waterfall buat penjelasan satu pelanggan dan beeswarm buat gambaran umum. Batasannya, SHAP ngejelasin cara model mengambil keputusan, bukan sebab akibat di dunia nyata.
SHAP ngasih angka kontribusi tiap fitur ke satu prediksi, dan semua angka itu kalau dijumlahin sama nilai dasar model bakal pas sama hasil prediksinya.
Jadi kamu bisa bilang ke tim marketing: pelanggan ini diprediksi berhenti dengan peluang 0,78, dan yang paling ngedorong angkanya adalah 94 hari tanpa transaksi.
Nama lengkapnya SHapley Additive exPlanations, dan dasarnya nilai Shapley dari teori permainan. Cara kerjanya, kontribusi satu fitur diukur dari rata-rata perubahan prediksi waktu fitur itu ditambahin ke berbagai kombinasi fitur lain.
SHAP adalah metode buat ngukur seberapa besar tiap fitur ndorong satu prediksi naik atau turun dari nilai rata-rata model. Sifat penjumlahannya bikin penjelasan per pelanggan bisa dipertanggungjawabkan angkanya, bukan cuma peringkat fitur secara umum. Ini yang bikin SHAP kepakai waktu keputusan model harus dijelasin ke orang non teknis.
Bedanya sama ukuran pentingnya fitur biasa ada di cakupannya:
| Metode | Cakupan | Jawab pertanyaan |
|---|---|---|
| feature_importances_ | Seluruh model | Fitur mana yang paling sering dipakai memecah data? |
| Permutation importance | Seluruh model | Performa turun berapa kalau fitur ini diacak? |
| SHAP | Per baris dan seluruh model | Kenapa pelanggan nomor 4021 diprediksi berhenti? |
Dua yang pertama nggak bisa jawab pertanyaan tim marketing soal satu pelanggan tertentu. SHAP bisa.
Metode ini dikenalin Lundberg dan Lee lewat makalah A Unified Approach to Interpreting Model Predictions di NeurIPS 2017. Dokumentasi resminya ada di shap.readthedocs.io.
Empat langkah, semuanya di Python. Contoh ini pakai model pohon, jadi perhitungannya cepat.
import pandas as pd
import shap
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
df = pd.read_csv("pelanggan_toko_berkah.csv")
X = df.drop(columns=["churn"])
y = df["churn"]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42, stratify=y
)
model = RandomForestClassifier(
n_estimators=500, min_samples_leaf=5,
class_weight="balanced", n_jobs=-1, random_state=42
)
model.fit(X_train, y_train)
explainer = shap.Explainer(model, X_train)
shap_values = explainer(X_test)
Buat model pohon, shap.Explainer otomatis milih algoritma khusus pohon yang jauh lebih cepat daripada pendekatan umum.
Kalau modelmu klasifikasi dua kelas dari scikit-learn, hasilnya punya dimensi tambahan buat tiap kelas. Ambil kelas positifnya:
nilai_positif = shap_values[..., 1]
shap.plots.beeswarm(nilai_positif, max_display=12)
Tiap titik satu pelanggan. Posisi horizontal nunjukin seberapa kuat fitur itu ndorong prediksi, warnanya nunjukin nilai fiturnya tinggi atau rendah.
Kalau titik merah numpuk di kanan buat fitur jarak hari sejak transaksi terakhir, artinya makin lama nggak belanja makin tinggi peluang berhentinya. Masuk akal, dan itu tanda modelmu belajar pola yang bener.
shap.plots.waterfall(nilai_positif[42])
Grafik ini mulai dari nilai dasar, yaitu prediksi rata-rata model buat semua pelanggan. Lalu tiap fitur nambahin atau ngurangin sampai ketemu prediksi akhir buat pelanggan itu.
Ini bentuk yang paling gampang dibawa ke rapat. Orang non teknis bisa ngikutin batang per batang tanpa ngerti isi modelnya.
Tiga hal yang sering keliru dipahami:
SHAP bukan sebab akibat. Nilai SHAP tinggi berarti fitur itu ndorong prediksi model, bukan berarti fitur itu penyebab pelanggan berhenti. Model cuma belajar hubungan dari data historis.
Satuannya ikut keluaran model. Buat model pohon dari scikit-learn, satuannya peluang. Buat XGBoost dan LightGBM, bawaannya log odds, jadi angka 0,8 di situ bukan berarti 80%.
Fitur yang saling berkorelasi bikin kontribusinya kebagi. Kalau kamu punya kolom total belanja dan rata-rata belanja yang gerakannya mirip, nilai SHAP-nya kebagi dua dan masing-masing keliatan lebih kecil dari pengaruh gabungannya.
Peringatan ketiga ini sama kayak yang berlaku di random forest waktu kamu baca permutation importance.
Model churn di dataset toko_berkah dilatih dari 4.310 pelanggan dengan 14 kolom perilaku. Sebanyak 11,8% di antaranya berhenti belanja lebih dari 90 hari.
Nilai dasar modelnya 0,118, sama persis dengan proporsi pelanggan yang berhenti di data latih.
Ini penjelasan buat satu pelanggan dengan prediksi peluang berhenti 0,78:
| Fitur | Nilai pelanggan | Kontribusi SHAP |
|---|---|---|
| Hari sejak transaksi terakhir | 94 hari | +0,31 |
| Frekuensi belanja 6 bulan | 2 kali | +0,19 |
| Jumlah kategori produk berbeda | 1 | +0,14 |
| Nilai transaksi rata-rata | Rp 412.000 | -0,06 |
| Sisa fitur digabung | - | +0,08 |
Kalau dijumlahin: 0,118 + 0,31 + 0,19 + 0,14 - 0,06 + 0,08 = 0,778. Pas sama prediksinya.
Yang menarik ada di baris keempat. Nilai transaksinya besar, dan itu justru nurunin peluang berhenti sebesar 6 poin.
Jadi ini pelanggan yang belanjanya jarang tapi sekali belanja nominalnya gede. Buat tim marketing, penanganannya beda dari pelanggan yang jarang belanja dan nominalnya kecil.
Waktu aku rata-ratain nilai SHAP absolut di seluruh data uji, urutan tiga fitur teratasnya sama: jarak hari, frekuensi, lalu keragaman kategori. Tiga fitur itu nyumbang 71,4% dari total besaran kontribusi.
Angka itu berguna buat mutusin kolom mana yang wajib dijaga kualitasnya. Kalau kolom jarak hari sering telat diperbarui, prediksinya langsung melenceng.
Ngitung SHAP di data latih. Hasilnya terlalu optimis soalnya model udah lihat baris-baris itu. Pakai data uji atau data baru.
Nyampur satuan log odds sama peluang. Cek dulu keluaran modelmu sebelum ngomongin persentase ke orang bisnis.
Bilang fitur ini penyebabnya. Ganti kalimatnya jadi fitur ini yang paling ndorong prediksi model. Bedanya penting waktu keputusan bisnisnya mahal.
Ngitung SHAP buat ratusan ribu baris sekaligus. Buat model non pohon, perhitungannya berat. Ambil sampel acak beberapa ribu baris buat gambaran umum.
Lupa ngasih data latar. Beberapa penjelas butuh data latar sebagai pembanding. Kalau datanya nggak representatif, nilai dasarnya melenceng dan semua penjelasan ikut geser.
Nunjukin grafik beeswarm ke manajemen. Grafik itu padat dan susah dibaca orang awam. Pakai grafik waterfall satu pelanggan atau grafik batang rata-rata.
Bisa buat hampir semua model, tapi kecepatannya beda jauh. Buat model pohon seperti random forest, XGBoost, dan LightGBM ada algoritma khusus yang cepat dan hasilnya eksak. Buat model linear ada versi khusus yang juga ringan. Buat model lain seperti jaringan saraf, perhitungannya pakai pendekatan sampling yang jauh lebih lambat, jadi ambil sampel baris secukupnya.
Feature importance bawaan cuma ngasih satu angka per fitur buat seluruh model, dan nggak nunjukin arahnya. SHAP ngasih angka per fitur per baris, lengkap dengan tanda positif atau negatif. Jadi kamu bisa lihat fitur yang sama ndorong satu pelanggan ke arah berhenti tapi ndorong pelanggan lain ke arah bertahan. Buat penjelasan satu per satu, feature importance nggak kepakai sama sekali.
Karena keluaran mentah modelmu emang log odds, dan ini bawaan XGBoost serta LightGBM buat klasifikasi. Nilai SHAP selalu ngikutin satuan keluaran yang dijelasin. Kalau kamu butuh satuan peluang, atur parameter keluaran modelnya waktu bikin penjelas, atau konversi sendiri hasil akhirnya. Yang penting jangan nyebut angka log odds sebagai persentase waktu presentasi.
Buat model pohon, ngitung seluruh data uji biasanya masih cepat sampai puluhan ribu baris. Buat model lain, mulai dari sampel acak 1.000 sampai 2.000 baris dulu buat gambaran umum, lalu hitung nilai per baris cuma buat pelanggan yang mau kamu tindak lanjuti. Sampel acak yang cukup besar udah ngasih urutan fitur yang stabil.
Jangan sebut istilahnya di awal. Mulai dari grafik waterfall satu pelanggan, lalu jelasin pakai kalimat biasa: model mulai dari peluang rata-rata 12%, lalu naik 31 poin karena pelanggan ini udah 94 hari nggak belanja. Setelah mereka paham polanya, baru sebut nama metodenya. Cara ini jauh lebih nyantol dibanding mulai dari teori permainan.
SHAP ngubah prediksi model jadi daftar angka yang bisa dibaca orang, lengkap sama arah dan besarannya.
Yang bikin dia kepakai bukan grafiknya, tapi sifat penjumlahannya. Semua kontribusi plus nilai dasar selalu pas sama prediksi akhir, jadi angkanya bisa dipertanggungjawabkan waktu ditanya.
Ingat satu batasannya: SHAP ngejelasin model, bukan dunia nyata. Kalau modelmu belajar dari data yang bias, penjelasannya juga ikut bias.
Coba jalanin kode di atas ke model churn kamu, lalu ambil satu pelanggan dan bikin grafik waterfall-nya. Lanjut baca random forest untuk analis kalau modelnya belum ada, atau pahami dulu segmentation buat nentuin siapa yang mau kamu tindak lanjuti.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Kolom datetime nyimpen tanggal, jam, hari, semuanya nempel jadi satu. Accessor .dt di pandas ngeluarin tiap bagian jadi kolom sendiri buat dianalisa.
Nama toko ketik campur huruf besar-kecil, spasi nyasar di ujung, atau kode produk nempel jadi satu. Accessor .str di pandas ngerapiin semua itu tanpa loop.
Model machine learning cuma ngerti angka, bukan teks kayak merah atau biru. get_dummies ngubah kolom kategori jadi kolom 0/1 dalam satu baris kode.