Proyek-proyek sebelumnya selalu punya guru: churn dilatih dari pelanggan yang diketahui nasibnya, harga rumah belajar dari harga jual nyata, kampanye dinilai dari hasilnya. Deteksi anomali transaksi membalik situasi tersebut. Transaksi bermasalah — fraud — langka, dan label “ini fraud, ini sah” baru hadir berminggu-minggu kemudian lewat audit atau keluhan pelanggan; saat sistem harus memutuskan, label belum ada. Proyek ini membangun detektor yang bekerja tanpa label (unsupervised), lalu menagih jawabannya lewat evaluasi terhadap label historis yang sengaja disembunyikan: statistik univariat transparan, Isolation Forest multivariat, dan pemilihan ambang operasional berbasis kapasitas tim tinjauan.
Masalah Menyaring Transaksi Tidak Wajar #
Sistem pembayaran sebuah toko daring memproses ribuan transaksi per hari; mayoritas sah, sebagian kecil mencurigakan, dan tim fraud punya kapasitas meninjau puluhan kasus manual saja. Pertanyaan operasionalnya bukan “transaksi mana yang fraud” melainkan “kasus mana yang paling layak ditinjau hari ini” — masalah peringkat, bukan klasifikasi massal. Akurasi pun menyesatkan di sini: aturan naif “anggap semua transaksi sah” mencapai akurasi 98,8% pada data dengan 1,2% anomali, padahal aturan tersebut tidak menandai satu kasus pun. Presisi pada k kasus teratas dan recall terhadap anomali sejatinya menjadi tolok ukur yang relevan.
Alur proyek meniru praktik industri: eksplorasi pola transaksi normal, aturan statistik murah sebagai baseline, model machine learning yang membaca kombinasi fitur, lalu evaluasi dan penetapan ambang keputusan.
Dataset Transaksi E-commerce 5.000 Baris #
Dataset dibangkitkan sintetis oleh 01_bangun_data.py dengan np.random.default_rng(42) sehingga CSV identik di mesin mana pun. Setiap baris adalah satu transaksi dengan enam fitur: nominal_ribu (nilai dalam ribu rupiah), jam_transaksi, menit, hari_dalam_minggu, durasi_detik (lama sesi checkout), dan jumlah_item. Populasi normal mengikuti kebiasaan belanja yang teratur: jam sibuk 10–21 menampung 83% transaksi, nominal sekitar jumlah item dikali harga satuan, dan durasi checkout membesar seiring banyaknya item.
Enam puluh transaksi (1,2%) ditanam sebagai anomali dalam tiga tipe: nominal ekstrem, jam dini hari 02–05, dan checkout kilat — banyak item dengan durasi jauh terlalu cepat untuk sebanyak itu item. Ketiga tipe meniru tiga tantangan deteksi berbeda: mudah dilihat satu dimensi, mudah dilihat satu dimensi lainnya, dan hanya terlihat pada kombinasi fitur. Kolom is_fraud mencatat ground truth tersebut, tetapi skrip deteksi Bagian 1–3 dilarang membacanya — hanya evaluasi Bagian 4 yang membukanya, mensimulasikan label audit yang datang belakangan.
Struktur dan Artefak Proyek #
proyek-deteksi-anomali-transaksi/
├── _index.md
├── bagian/
│ ├── part-1-eksplorasi-data/
│ ├── part-2-deteksi-statistik/
│ ├── part-3-model-anomali/
│ └── part-4-evaluasi-dan-ambang/
├── data/
│ └── transaksi.csv
├── src/
│ ├── 01_bangun_data.py
│ ├── 02_eksplorasi.py
│ ├── 03_statistik.py
│ ├── 04_model.py
│ └── 05_laporan.py
└── laporan/
└── laporan-anomali.txtKelima skrip di src/ dirancang dijalankan dari root proyek sehingga path relatif data/transaksi.csv dan laporan/... selalu konsisten. Laporan akhir berformat teks polos karena berkas .md di dalam bundle akan dirender Hugo sebagai halaman kursus — laporan/laporan-anomali.txt adalah artefak analisis untuk dibaca apa adanya.
Tahapan Pengerjaan #
Proyek dikerjakan dalam empat bagian berurutan; setiap bagian menghasilkan skrip yang dapat dijalankan ulang kapan saja:
- Bagian 1: Eksplorasi Data — bangkitkan dataset, lewati gerbang kualitas, lalu baca pola jam sibuk, kemiringan nominal, dan hubungan durasi dengan jumlah item.
- Bagian 2: Deteksi Statistik — pasang aturan z-score, kuantil ekor, dan jam dini hari sebagai baseline transparan, lalu hitung berapa transaksi tertandai.
- Bagian 3: Model Anomali — rakit fitur log dan rasio, latih
IsolationForest, bandingkan dengan Local Outlier Factor dan aturan statistik. - Bagian 4: Evaluasi dan Ambang — buka label audit, ukur precision@k dan recall pada ambang bergeser, lalu tetapkan ambang operasional dan tulis laporan.
Disiplin Unsupervised dan Determinisme #
Dua aturan dipegang sepanjang proyek. Pertama, deteksi sungguh-sungguh tanpa label: skrip eksplorasi, aturan, dan model tidak pernah membaca is_fraud; label hanya menyentuh evaluasi Bagian 4 sebagaimana audit nyata menyentuh sistem produksi setelah keputusan diambil. Kedua, seluruh jalur komputasi deterministik: satu generator berseed 42 untuk data, random_state=42 pada estimator, format angka stabil, tanpa pencetakan waktu berjalan — setiap skrip selesai dalam hitungan detik dan menghasilkan keluaran identik:
cd content/machine-learning/proyek/proyek-deteksi-anomali-transaksi
python3 src/01_bangun_data.py
python3 src/02_eksplorasi.py
python3 src/03_statistik.py
python3 src/04_model.py
python3 src/05_laporan.pyMulailah dari Bagian 1: Eksplorasi Data — di sana dataset dibangkitkan, pola jam belanja dan struktur durasi-item mulai terbaca dari angka, dan dua temuan (kemiringan nominal serta durasi yang sebanding item) ditabung sebagai bahan rekayasa fitur model dua bagian kemudian.
Referensi Resmi #
- Outlier detection — scikit-learn User Guide — kerangka resmi Isolation Forest, Local Outlier Factor, dan kerabatnya.
- sklearn.ensemble.IsolationForest — API
— parameter
contamination,n_estimators, dandecision_function. - numpy.random.Generator — dokumentasi — generator berseed untuk dataset sintetis yang reproducible.
Kenali pola transaksi normal dan tanda-tanda transaksi mencurigakan.
Buka → # Bagian 2: Deteksi StatistikTerapkan aturan z-score dan IQR sebagai baseline deteksi yang transparan.
Buka → # Bagian 3: Model AnomaliLatih Isolation Forest dan Local Outlier Factor pada fitur agregat transaksi.
Buka → # Bagian 4: Evaluasi dan AmbangTentukan ambang keputusan berbasis biaya tinjauan manual dan ukur kualitas deteksi.
Buka →