Semua model yang kita bangun sejauh ini hidup dari korelasi: fitur dan target bergerak bersama, dan model memanfaatkannya untuk memprediksi. Masalah muncul ketika kita melangkah dari memprediksi ke menyetir — “kalau kita turunkan harga, berapa penjualan naik?” bukan lagi pertanyaan prediksi, melainkan pertanyaan sebab-akibat. Chapter Membedakan Korelasi dan Kausalitas sudah memetakan bahaya kesimpulan kausal dari data observasional; chapter ini melangkah lebih jauh ke peralatan penalarannya: confounder sebagai aktor utama kekeliruan, diagram sebab-akibat sebagai peta, stratifikasi sebagai kacamata pembetul, dan A/B testing sebagai standard emas. Kode di chapter ini sengaja minim — intinya adalah cara berpikir, bukan library.
Confounder: Penyebab Ketiga yang Tersembunyi #
Confounder adalah variabel yang menyebabkan keduanya: variabel yang kita anggap sebab dan variabel yang kita anggap akibat. Ketika kedua anak panah itu mengalir dari satu sumber, hubungan yang tampak di data bisa murni pinjaman dari sang confounder. Contoh klasik di dunia kita: data menunjukkan pemegang kartu member Toko Kopi Kita berbelanja jauh lebih besar daripada pelanggan non-member, dan pihak manajemen siap menyimpulkan “kartu member mendorong belanja”. Sebelum percaya, kita perlu menggambar petanya:
Membaca diagramnya: pelanggan yang sering datang memang cenderung mendaftar kartu member (panah atas — makin sering ke toko, makin terasa untungnya jadi member), dan pelanggan yang sering datang juga otomatis punya total belanja bulanan besar (panah bawah). Kedua panah itu bisa menghasilkan hubungan member–belanja yang kuat di data bahkan jika kartu member sama sekali tidak berpengaruh. Garis putus-putus dari member ke belanja adalah efek yang sebenarnya ingin kita ukur — dan pada data observasional, garis itulah yang paling sulit dipisahkan dari dua panah confounder.
Praktik: Membedah Efek Kartu Member #
Dataset kecil 16 pelanggan berisi nama, status member, jumlah kunjungan per bulan, dan total belanja bulanan (ribu rupiah). Analisis dua tahap: pertama rata-rata belanja member vs non-member apa adanya, lalu rata-rata yang sama di dalam kelompok kunjungan — teknik yang disebut stratifikasi.
import pandas as pd
pelanggan = pd.DataFrame({
"nama": ["Budi", "Siti", "Dewi", "Rani", "Agus", "Tono", "Mira", "Lina",
"Joko", "Sari", "Bima", "Ratna", "Dodi", "Ika", "Gilang", "Nova"],
"member": ["ya", "ya", "tidak", "tidak", "tidak", "tidak", "tidak", "tidak",
"ya", "ya", "ya", "ya", "ya", "tidak", "tidak", "tidak"],
"kunjungan_bulan": [4, 5, 3, 4, 5, 3, 4, 5,
10, 12, 9, 11, 14, 10, 13, 12],
"total_belanja_ribu": [160, 175, 145, 150, 165, 140, 155, 168,
410, 440, 395, 425, 455, 405, 450, 435],
})
naif = pelanggan.groupby("member")["total_belanja_ribu"].agg(["mean", "size"])
print("Rata-rata belanja menurut status member (tanpa mengelompokkan lainnya):")
print(naif.round(1).to_string())
pelanggan["kelompok_kunjungan"] = pd.cut(
pelanggan["kunjungan_bulan"], bins=[0, 8, 100], labels=["jarang", "sering"]
)
print()
print("Sebaran status member di tiap kelompok kunjungan:")
print(pd.crosstab(pelanggan["kelompok_kunjungan"], pelanggan["member"]).to_string())
print()
print("Rata-rata belanja member vs non-member, DI DALAM tiap kelompok kunjungan:")
strata = pelanggan.groupby(["kelompok_kunjungan", "member"], observed=True)[
"total_belanja_ribu"
].mean().round(1)
print(strata.to_string())Output yang Dihasilkan:
Rata-rata belanja menurut status member (tanpa mengelompokkan lainnya):
mean size
member
tidak 245.9 9
ya 351.4 7
Sebaran status member di tiap kelompok kunjungan:
member tidak ya
kelompok_kunjungan
jarang 6 2
sering 3 5
Rata-rata belanja member vs non-member, DI DALAM tiap kelompok kunjungan:
kelompok_kunjungan member
jarang tidak 153.8
ya 167.5
sering tidak 430.0
ya 425.0Mari kita baca ketiga keluarannya berurutan:
- Tabel pertama, kesimpulan naif: member rata-rata berbelanja Rp351,4 ribu dan non-member Rp245,9 ribu — selisih Rp105,5 ribu. Angka ini persis jenis bukti yang biasa dikutip untuk mendukung program member.
- Tabel kedua, letak confounder terlihat: kartu member ternyata tidak tersebar merata — hanya 2 dari 8 pelanggan jarang datang yang memilikinya, sementara 5 dari 8 pelanggan yang sering datang adalah member. Kelompok member dan non-member membandingkan dua populasi yang berbeda kebiasaan.
- Tabel ketiga, efek yang tersisa: di dalam kelompok jarang datang, selisih member lawan non-member tinggal Rp13,7 ribu (167,5 lawan 153,8); di kelompok sering datang selisihnya justru terbalik tipis (425,0 lawan 430,0). Setelah frekuensi kunjungan disamakan, “efek kartu member” menyusut dari Rp105,5 ribu menjadi sekian ribu rupiah yang berubah-ubah tanda — konsisten dengan efek yang nyaris nol.
Stratifikasi bekerja karena membandingkan pelanggan yang mirip satu sama lain di sisi variabel pengacau. Batasannya juga jelas: teknik ini hanya bisa mengendalikan confounder yang terukur dan terpikirkan — confounder yang tidak ada di data (selera belanja bawaan, daya beling rumah tangga) tetap bebas bekerja di luar jangkauan.
A/B Testing: Standard Emas dan Gagasan Counterfactual #
Cara paling kuat memutus jerat confounder adalah dengan merancakannya sendiri: A/B testing (eksperimen terkontrol) membagi pelanggan menjadi dua kelompok secara acak — kelompok A menerima perlakuan (misalnya kartu member), kelompok B tidak — lalu membandingkan hasilnya setelah beberapa minggu. Pengacakan bekerja karena menyerahkan keputusan “siapa mendapat kartu” pada dadu, bukan pada kebiasaan pelanggan; setiap variabel, yang terukur maupun yang tidak, terbagi kira-kira seimbang ke kedua kelompok, sehingga satu-satunya pembeda sistematis adalah perlakuannya. Perbedaan hasil rata-rata antar kelompok kemudian bisa dibaca sebagai efek perlakuan, dan uji statistik standar (misalnya uji-t dua sampel di scipy) memberi tahu seberapa yakin kita pada selisih itu.
Di balik semua ini berdiri gagasan counterfactual — “dunia yang tidak terjadi”: efek kartu member bagi Budi adalah selisih belanja Budi yang memegang kartu melawan Budi yang sama tanpa kartu di waktu yang sama. Kedua dunia itu tidak pernah bisa diamati bersamaan pada satu orang, dan itulah masalah fundamental penalaran kausal. Eksperimen acak memecahnya secara rata-rata: kelompok B menjadi cermin kelompok A di dunia tanpa perlakuan. Data observasional hanya bisa mendekati cermin itu lewat pengendalian confounder — stratifikasi, pencocokan, atau pemodelan — dan seberapa dekat pendekatannya bergantung pada seberapa lengkap kita memahami peta sebab-akibatnya.
Rangkuman #
- Prediksi hidup dari korelasi; keputusan menuntut kausalitas — melangkah dari satu ke yang lain memerlukan penalaran tambahan, bukan sekadar model yang lebih canggih.
- Confounder menyebabkan dua variabel sekaligus dan meminjamkan hubungan palsu; DAG memaksa dugaan mekanisme dituliskan sebelum membaca angka.
- Stratifikasi membandingkan kelompok yang setara di sisi confounder terukur: selisih belanja member vs non-member menyusut dari Rp105,5 ribu menjadi mendekati nol setelah frekuensi kunjungan disamakan.
- A/B testing mengacak perlakuan sehingga semua confounder — termasuk yang tak terukur — terbagi seimbang; inilah standard emas pengukuran efek.
- Efek kausal selalu bersifat counterfactual: perbandingan dengan dunia yang tidak terjadi, dan eksperimen acak adalah pendekatan rata-rata terbaik kita ke dunia itu.
Pertanyaan “seberapa besar efeknya” pada data eksperimen punya saudara di dunia keyakinan: setelah melihat 40 pengunjung dan 12 konversi, seberapa yakin kita bahwa proporsi konversi sebenarnya di sekitar 30%? Pertanyaan tentang keyakinan — bukan sekadar tebakan tunggal — adalah ranah analisis Bayesian pada chapter berikutnya: Analisis Bayesian .
Referensi: