TL;DR
P-hacking adalah praktik ngutak-atik analisis sampai p-value turun di bawah 0,05, sementara peeking adalah ngecek hasil eksperimen berkali-kali dan berhenti begitu hasilnya kelihatan signifikan. Dua-duanya naikin peluang false positive jauh di atas 5% yang kamu kira kamu pakai. Dari simulasi 20.000 eksperimen tanpa efek nyata, ngintip 10 kali bikin tingkat false positive naik dari 4,95% jadi 19,4%.
P-hacking adalah praktik ngutak-atik cara analisis sampai p-value akhirnya turun di bawah 0,05. Peeking adalah ngecek hasil eksperimen berkali-kali dan berhenti begitu angkanya kelihatan menang.
Dua-duanya bikin peluang kamu salah ngambil kesimpulan jauh lebih besar dari 5% yang kamu kira lagi kamu pakai.
Yang bikin dua kebiasaan ini awet: keduanya kelihatan kayak kerja bagus. Ngecek dashboard tiap pagi terasa rajin. Ngebreakdown hasil per segmen terasa teliti.
P-hacking adalah nyoba banyak versi analisis dari satu set data yang sama, terus cuma ngelaporin versi yang hasilnya signifikan. Datanya nggak dipalsuin sama sekali. Yang diubah-ubah itu pilihan metrik, pilihan segmen, pilihan periode, atau pilihan cara buang outlier.
Peluang dapet hasil signifikan naik tiap kali kamu nambah satu pilihan analisis. Nguji 5 metrik sekaligus di data yang sebenernya nggak punya efek apa-apa bikin peluang minimal satu metrik lolos jadi 22,6%. Naik ke 20 metrik, peluangnya 64,2%.
Angka itu bukan hasil eksperimen, tapi hitungan langsung: 1 dikurangi 0,95 pangkat jumlah metriknya.
Kalau istilah p-value masih terasa abstrak buat kamu, penjelasan p-value ini baiknya dibaca duluan.
Peeking adalah ngintip hasil eksperimen sebelum target sampel kepenuhan, terus mutusin berhenti berdasarkan apa yang kamu lihat. Nama lainnya optional stopping. Masalahnya bukan di ngintipnya, tapi di keputusan berhenti yang diambil dari intipan itu.
Uji hipotesis standar dirancang buat satu kali pengambilan keputusan, di satu titik yang udah ditentuin sebelumnya. Alpha 5% itu janji: dari 100 eksperimen tanpa efek nyata, kira-kira 5 bakal kelihatan signifikan gara-gara kebetulan.
Begitu kamu ngecek 10 kali dan berhak berhenti kapan aja, kamu punya 10 kesempatan buat kena kebetulan itu. Janji 5% tadi otomatis batal.
Aku simulasiin 20.000 eksperimen palsu buat ngukur ini. Setup-nya: dua varian dengan conversion rate yang sama persis, 5% dua-duanya, jadi secara definisi nggak ada efek apapun buat ditemuin. Target sampel 10.000 pengunjung per varian, uji z dua proporsi, ambang 0,05.
Bedanya cuma satu: berapa kali hasilnya diintip sebelum target kepenuhan.
| Berapa kali ngintip | Hasil "menang" palsu | Lipat dari yang seharusnya |
|---|---|---|
| 1 kali, di akhir | 4,95% | 1,0x |
| 2 kali | 8,4% | 1,7x |
| 5 kali | 14,0% | 2,8x |
| 10 kali | 19,4% | 3,9x |
| 20 kali | 25,3% | 5,1x |
Baris pertama nunjukin simulasinya jalan bener. Sekali ngecek di akhir ngasih 4,95%, persis kayak yang dijanjiin alpha 5%.
Baris terakhir yang bikin nyesek. Tim yang ngecek dashboard tiap pagi selama 20 hari kerja dan berhak matiin eksperimen kapan aja punya peluang 1 banding 4 buat ngumumin kemenangan dari eksperimen yang efeknya nol.
Satu dari empat. Itu bukan kesialan sesekali, itu default.
Yang di bawah ini semuanya pernah aku lihat di ruang rapat, dan nggak satupun diniatin buat nipu:
Kelima-limanya punya pola yang sama. Keputusan analisis diambil setelah datanya kelihatan, bukan sebelum.
Tim toko_berkah nguji banner promo baru di halaman depan selama 21 hari. Target sampel 12.000 pengunjung per varian, dihitung dari baseline conversion 4,1%.
Hari ke-6, dashboard nunjukin treatment unggul 0,7 poin persen dengan p-value 0,041. Sampel yang kekumpul baru 3.400 per varian, sekitar 28% dari target.
Rekomendasinya waktu itu ditahan. Eksperimennya jalan terus sampai 21 hari penuh.
| Titik pengecekan | Sampel per varian | Selisih conversion | p-value |
|---|---|---|---|
| Hari 6 | 3.400 | +0,7 poin | 0,041 |
| Hari 12 | 6.900 | +0,3 poin | 0,29 |
| Hari 21 | 12.100 | +0,1 poin | 0,71 |
Keunggulan 0,7 poin di hari ke-6 nyusut jadi 0,1 poin di akhir. Efeknya nggak pernah ada. Yang ada cuma ayunan angka biasa waktu sampelnya masih kecil.
Kalau eksperimennya distop di hari ke-6, tim bakal ngerayain kenaikan 17% relatif dan ngeroll out banner itu ke semua halaman. Terus bingung setahun kemudian kenapa akumulasi semua kemenangan eksperimen mereka nggak kelihatan di angka omzet.
Itu gejala yang paling khas. Portofolio eksperimen yang penuh kemenangan tapi grafik bisnisnya datar.
Kadang berhenti lebih awal itu kebutuhan nyata, bukan godaan. Eksperimen mahal, atau ada risiko nyata ke pengguna. Buat kasus kayak gitu ada metode yang emang dirancang buat pengecekan berulang.
Sequential testing naikin ambang signifikansi di pengecekan awal dan nurunin di pengecekan akhir, jadi total peluang false positive-nya tetap 5%. Kamu boleh ngintip sesering yang kamu mau, asal aturannya ditetapin sebelum eksperimen jalan.
Alpha spending function ngebagi jatah 5% itu ke beberapa titik pengecekan. Ngecek 5 kali berarti tiap titik dapet jatah lebih ketat dari 0,05.
Buat masalah banyak metrik, koreksi Benjamini-Hochberg lebih longgar dari Bonferroni dan cocok kalau metrik kamu banyak. Implementasi siap pakainya ada di scipy.stats.false_discovery_control.
Intinya satu: aturan berhentinya dibikin sebelum data masuk. Metode apapun kehilangan jaminannya kalau aturannya disusun sambil ngelihat hasil.
P-value 0,001 nggak bilang apa-apa soal ukuran efek. Sampel yang besar banget bisa bikin selisih 0,05 poin persen jadi signifikan. Selalu laporin ukuran efek plus rentang kepercayaannya, bukan cuma p-value.
Hasil nggak signifikan artinya kamu belum punya bukti cukup. Bisa jadi efeknya emang nol, bisa juga sampel kamu kekecilan. Bedanya kelihatan dari rentang kepercayaannya, bukan dari p-value.
Target 12.000 kepenuhan, hasilnya p 0,08, terus eksperimennya diperpanjang seminggu "biar lebih yakin". Ini peeking dengan nama lain, dan efeknya ke false positive sama persis.
Kalau kamu berhenti gara-gara angkanya bagus, itu peeking, seberapapun jelasnya kelihatan. Efek yang keliatan besar di awal justru paling sering menciut waktu sampel nambah. Kalau kamu memang butuh opsi berhenti lebih awal, siapin metode sequential testing sebelum eksperimen jalan, bukan diputusin di tengah jalan.
Fraud itu ngarang atau ngubah data. P-hacking nggak nyentuh datanya sama sekali, yang diutak-atik cara analisisnya. Makanya p-hacking jauh lebih umum dan jauh lebih susah kedeteksi. Kebanyakan orang yang ngelakuinnya nggak ngerasa lagi curang, mereka cuma ngerasa lagi teliti nyari sudut pandang yang pas.
Boleh, asal kamu monitor hal yang bener. Cek jumlah peserta per varian, cek error rate, cek apakah tracking-nya jalan. Yang nggak boleh itu ngelihat p-value metrik utama terus ngambil keputusan berhenti dari situ. Banyak tim sengaja nyembunyiin kolom p-value dari dashboard sampai target sampelnya kepenuhan.
Berhenti karena kerugian itu beda dari berhenti karena kemenangan. Tentuin batas guardrail di awal, misalnya kalau error rate naik 2 kali lipat atau omzet turun 10%, eksperimen dimatiin. Aturan ini dibikin sebelum data masuk, jadi kamu nggak lagi milih-milih momen berhenti berdasarkan hasil.
Nggak selalu. Yang bikin masalah itu kalau segmennya baru dibikin setelah kamu lihat hasil keseluruhan gagal. Kalau segmen prioritas kamu tulis di dokumen sebelum eksperimen jalan dan kamu koreksi ambang signifikansinya, analisis per segmen tetap sah. Perlakukan hasil segmen yang muncul belakangan sebagai bahan hipotesis buat test berikutnya.
Ambil tiga eksperimen terakhir yang timmu jalanin. Cek dua hal: berapa persen target sampel yang kepenuhan waktu eksperimennya distop, dan apakah metrik yang dilaporin sama dengan metrik yang ditulis di awal.
Kalau salah satunya nggak cocok, kamu baru nemu alasan kenapa kemenangan di dashboard nggak nyambung ke angka bisnis.
Buat ngerapiin dasarnya, mulai dari konsep uji hipotesis dan istilah A/B testing. Sesudah itu, tetapin metrik pengaman yang nggak boleh rusak selama eksperimen jalan lewat panduan guardrail metric.
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.