Pola SQL yang Digunakan untuk Mendeteksi Penipuan Transaksi
(analytics.fixelsmith.com)- Deteksi penipuan sering kali dimulai bukan dari machine learning, melainkan dari tabel dan join yang benar serta menemukan pola anomali pada kecepatan, lokasi, jumlah, merchant, dan waktu transaksi dengan SQL
- Velocity mencari rentetan transaksi dari pemilik kartu yang sama dalam waktu singkat, dan memerlukan penyesuaian jendela waktu, ambang batas, serta whitelist untuk false positive
- Impossible travel menggunakan
LAG()dan perhitungan jarak untuk menangkap perpindahan yang mustahil secara fisik, seperti pembayaran di Chicago lalu 7 menit kemudian di Los Angeles, sebagai sinyal kuat kartu kloning - Anomali jumlah mencari kisaran nilai seperti
$1.00,$99.99,$499.99yang mengindikasikan pengujian kartu atau upaya menghindari aturan, tetapi kurang cocok untuk transaksi manfaat - Lonjakan merchant, transaksi di luar jam normal, dan kolom turunan dari window function dapat dipakai bersama untuk memberi skor transaksi dengan banyak sinyal dan memangkas siklus iterasi dari hitungan minggu menjadi hitungan jam
Pola SQL untuk Menemukan Tanda-Tanda Penipuan dalam Data Transaksi
- Deteksi penipuan sering kali dimulai bukan dari machine learning atau graph database, melainkan dari tabel dan join yang benar, serta SQL untuk menemukan bentuk transaksi yang janggal
- Dapat diterapkan pada data seperti kartu kredit, klaim medis, e-commerce, POS, dan program manfaat bantuan pemerintah—apa pun yang melibatkan perpindahan uang dan menyisakan log
- Pada dataset baru, pola biasanya disusun berurutan dari velocity, impossible travel, anomali jumlah, konsentrasi merchant, waktu tidak normal, hingga sinyal berbasis window function
1. Velocity: transaksi berlebihan dalam waktu singkat
- Jika kartu atau akun curian sedang dihabiskan secepat mungkin, akan muncul pola transaksi yang menumpuk dalam waktu singkat pada pemilik kartu yang sama
- Query dasar mengelompokkan transaksi 30 hari terakhir per jam, lalu mencari interval saat jumlah transaksi per
cardholder_idmelewati ambang tertentu - Nilai penyesuaian utama adalah ukuran jendela waktu dan ambang jumlah transaksi
- Versi 1 menit, 5 menit, dan 1 jam bisa dijalankan paralel untuk dibandingkan
- Kelompok penguji kartu bisa menjejalkan transaksi dalam hitungan detik, sedangkan kelompok penipuan manfaat bisa bergerak selama setengah hari, jadi skalanya berbeda
- Pengguna normal juga bisa melewati ambang ini
- operator yang mengelola vending machine
- orang yang mengisi banyak kartu prabayar
- setelah eksplorasi awal, diperlukan whitelist untuk target false positive seperti ini
- Pendekatan sliding window menghitung jumlah transaksi dalam 5 menit terakhir dengan
COUNT(*) OVER (...) RANGE BETWEEN INTERVAL '5 minutes' PRECEDING AND CURRENT ROW QUALIFYbekerja di Snowflake, BigQuery, Databricks, Teradata- Di Postgres, seluruh query harus dibungkus dalam CTE lalu difilter di luar
2. Impossible travel: perpindahan yang mustahil secara fisik
- Jika sebuah kartu dipakai di Chicago lalu 7 menit kemudian di Los Angeles, kemungkinan besar salah satunya palsu
- Pola ini adalah sinyal kuat untuk kartu kloning, karena hampir tidak ada alasan normal sebuah kartu bisa berada di dua lokasi yang sangat jauh hanya dalam beberapa menit
- Query mengambil waktu dan lokasi transaksi sebelumnya dengan
LAG(), lalu menghitung jarak dan selang waktu antara lokasi saat ini dan lokasi sebelumnya haversineadalah fungsi untuk menghitung great-circle distance- Sebagian besar data warehouse menyediakannya
- Jika tidak ada, fungsinya cukup sederhana untuk ditulis sendiri
- Contoh ambang batasnya adalah 600mph
- Karena kecepatan jelajah jet komersial sekitar 575mph, ini berarti bahkan dengan pesawat pun perpindahan itu mustahil
- Jika diturunkan ke 100mph, perpindahan darat yang cepat juga bisa tertangkap, tetapi transaksi normal dari penumpang pesawat atau orang tua yang mengantar anak pun mulai ikut terflag
- Ada sinyal tambahan lain dalam keluarga pola yang sama
- Jika transaksi terjadi di dua kota yang jauh dalam negara bagian yang sama dalam 5 menit, itu bisa mengindikasikan jaringan kloning lokal
- Jika ada transaksi di beberapa ZIP code dalam 1 jam, itu bisa mengindikasikan jaringan skimmer yang bergerak dalam satu wilayah
- Transaksi yang melintasi perbatasan negara dalam 10 menit bisa menjadi sinyal jaringan internasional
3. Amount anomalies: transaksi aneh pada kisaran jumlah tertentu
- Dalam penipuan, ada pola jumlah transaksi yang sering muncul tetapi jarang terlihat pada penggunaan normal
- Contoh kondisinya mencari kisaran jumlah berikut
$1.00,$5.00,$10.00$99.50atau lebih dan kurang dari$100.00$499.50atau lebih dan kurang dari$500.00
- Jumlah dolar bulat yang kecil umumnya merupakan sinyal pengujian kartu
- Alurnya adalah memeriksa apakah nomor dari dump kartu benar-benar berfungsi sebelum dijual kembali
- Jarang ada pemilik kartu asli membeli barang dengan harga tepat
$1.00 - Kopi cenderung bernilai seperti
$4.73, dan bensin seperti$52.81, bukan jumlah yang dibulatkan persis
- Jumlah tepat di bawah ambang memiliki arti lain
$99.99bisa menjadi cara menghindari batas yang di banyak tempat mewajibkan verifikasi identitas mulai$100$499.99bisa menjadi cara menghindari batas harian ATM sebesar$500- Ini menjadi sinyal bahwa pelaku memahami aturan dan sengaja tetap berada sedikit di bawahnya
- Pada transaksi manfaat, pola jumlah bulat tidak terlalu membantu
- Manfaat tidak diuji seperti kartu
- Biasanya, penerima ganda lebih merupakan sinyal penting
4. Suspicious merchants: konsentrasi anomali pada tingkat merchant
- Jika reader kartu tertentu, seperti card reader pada pompa bensin, terinfeksi skimmer, akibatnya bisa bukan hanya satu kasus melainkan puluhan kasus penipuan
- Semua kartu yang memakai reader itu selama beberapa minggu bisa masuk ke database seseorang
- Dari sudut pandang merchant, ini terlihat sebagai kenaikan tajam jumlah kartu yang tidak saling terkait dalam periode singkat, disertai nilai transaksi yang juga membesar
- Contoh ambang sederhana: untuk 7 hari terakhir, kelompokkan per merchant dan per jam lalu hitung
- jumlah kartu unik
- total jumlah transaksi
- total nilai transaksi
- cari slot waktu saat jumlah kartu unik melebihi 20 dan total nilai melebihi
$5000
- Ambang statis punya masalah penyesuaian skala
- Costco bisa melewati ambang itu dalam 90 detik
- toko buku bekas mungkin hampir tidak pernah melewatinya
- Pendekatan yang lebih baik adalah membandingkan tiap merchant dengan baseline historisnya sendiri
- kelompokkan transaksi 60 hari terakhir per jam
- hitung rata-rata jumlah kartu unik berdasarkan 168 bucket jam historis untuk setiap merchant
- cari interval saat jumlah kartu unik saat ini melebihi 3 kali rata-rata historis
- 168 bucket jam berarti slot per jam selama 7 hari terakhir
- karena musiman harian dan mingguan itu penting
- coffee shop yang sama pun punya baseline berbeda antara Selasa pukul 14.00 dan Sabtu pukul 09.00
- Sebagai titik awal, bisa gunakan 3 kali lipat dari biasanya
- cukup longgar agar alert tidak membanjir
- tetapi cukup ketat untuk tetap menangkap slot waktu yang benar-benar aneh
5. Off-hours: transaksi di luar jam kebiasaan seseorang
- Kebanyakan orang memiliki pola pengeluaran
- Jika seseorang yang biasa bekerja pukul 9 sampai 5 tiba-tiba mulai membeli bensin pada pukul 3 pagi, mungkin kartunya dipakai orang lain atau dia sedang bepergian
- Apakah dia sedang bepergian dapat diverifikasi lagi dengan sinyal lain
- Query menghitung jumlah transaksi per pemilik kartu dan per jam dalam 90 hari terakhir, lalu hanya mengakui jam yang pernah memiliki setidaknya 2 transaksi sebagai jam kebiasaan
- Setelah itu, transaksi baru dideteksi jika waktunya berada di luar rentang
earliest_hourdanlatest_hourmilik pemilik kartu tersebut - Kondisi “setidaknya 2 transaksi pada jam itu” dalam query internal sangat penting
- Ini mencegah satu transaksi isi bensin tengah malam yang kebetulan terjadi 3 bulan lalu masuk sebagai jam kebiasaan
- Ambangnya disesuaikan dengan kebiasaan nyata, bukan “sesuatu yang pernah terjadi sekali”
- Kekurangannya adalah memerlukan data historis
- akun baru tidak punya baseline
- untuk akun baru, Anda bisa memakai pola jam transaksi seluruh pengguna, atau melewati pola ini sampai akun mengumpulkan histori beberapa bulan
6. Menggabungkan sinyal dengan window function
- Pola window function bukan jenis penipuan tersendiri, melainkan pekerjaan persiapan untuk mengubah lima pola sebelumnya menjadi sinyal yang bisa digabungkan
- Untuk setiap transaksi, Anda dapat membuat kolom turunan berikut
- waktu yang berlalu sejak transaksi sebelumnya:
timestamp - LAG(timestamp) - apakah merchant berubah: bandingkan
merchant_idsebelumnya denganmerchant_idsaat ini - jumlah kumulatif 24 jam terakhir:
SUM(amount) OVER (...) - transaksi ke berapa pada hari itu:
ROW_NUMBER()
- waktu yang berlalu sejak transaksi sebelumnya:
- Jika kolom-kolom ini dimaterialisasi, aturan penipuan menyusut menjadi ekspresi filter yang sederhana
- Kelompok penguji kartu bisa ditemukan dengan kondisi berikut
- transaksi ke-5 atau lebih pada hari itu
- kurang dari 60 detik sejak transaksi sebelumnya
- merchant berbeda dari transaksi sebelumnya
- Jika hipotesis penipuan baru bisa dinyatakan sebagai filter SQL, bukan tiket engineering, siklus iterasi bisa turun dari hitungan minggu menjadi hitungan jam
- Hasilnya, lebih banyak penipuan bisa ditangkap lebih cepat
Cara memakai pola-pola ini bersama-sama
- Tidak ada satu pola pun yang cukup sendirian
- Setiap pola punya batasan yang jelas
- Velocity punya false positive seperti operator vending machine
- Perpindahan yang mustahil secara geografis akan melewatkan penipuan yang terjadi dalam satu area metropolitan besar
- Anomali jumlah tidak terlalu cocok di luar konteks pengujian kartu
- Aturan waktu tidak normal memerlukan histori
- Dalam praktik, pendekatan yang efektif adalah menjalankan semua pola lalu memberi skor setiap transaksi berdasarkan banyak sinyal
- Transaksi yang terkena tiga atau empat sinyal hampir selalu merupakan penipuan
- Transaksi yang hanya terkena satu sinyal bisa jadi sekadar penggunaan yang tidak biasa dari pemilik kartu normal yang sedang bepergian
- Jika baru mulai membangun deteksi penipuan, sebaiknya mulai dari Velocity
- mengungkap jumlah penipuan yang berguna
- relatif sedikit menangkap aktivitas normal
- biaya eksekusinya juga rendah
- Jika pola 1 sampai 5 sudah dimiliki, investasi berikutnya yang paling baik adalah kolom mentah berbasis window function
- sekali dibuat, semua analis di tim dapat memakainya
- penambahan pola penipuan berikutnya tidak lagi menjadi proyek terpisah
Hal-hal yang perlu diperhatikan
-
Penanganan NULL
- Tabel transaksi nyata sering kali tidak memakai
NULLseperti di buku pengantar SQL - Banyak sistem legacy menggunakan nilai sentinel seperti
9999-12-31untuk “tidak ada tanggal akhir” dan0001-01-01untuk “tidak ada tanggal mulai” - Jika memfilter dengan
IS NULL, baris-baris seperti ini bisa terlewat tanpa disadari - Anda perlu memeriksa konvensi pada tabel tertentu sebelum menulis klausa
WHERE
- Tabel transaksi nyata sering kali tidak memakai
-
False positive
- Setiap aturan bisa menangkap perilaku yang aneh tetapi sah dari pemilik kartu nyata
- Kasus yang terflag memerlukan tinjauan manusia
- Diperlukan feedback loop untuk menyesuaikan ambang berdasarkan mana yang benar-benar penipuan dan mana yang bukan
- Pemblokiran otomatis berdasarkan satu aturan saja bisa membuat Anda kehilangan pelanggan
-
Privasi
- Jika data mengandung PII, Anda harus mematuhi kebijakan penggunaan data yang berlaku
- Sebaiknya mulai dengan data yang sudah dide-identifikasi atau data sampel, lalu gunakan data produksi setelah ada persetujuan
-
Biaya
- Window function pada partisi besar tidaklah murah
- Filter dulu rentang tanggal, baru terapkan window function
- Jika Anda menjalankan
LAG()lebih dulu pada transaksi 2 tahun untuk seluruh dataset lalu baru menambahkanWHERE, anggaran kredit data warehouse bisa terkuras besar
4 komentar
Ini adalah metode yang dulu pernah dipinjam dan digunakan di sistem inti perbankan dan sistem kanal.
Komentar Hacker News
Tolok ukur bahwa pemilik kartu yang sebenarnya hampir tidak pernah membeli sesuatu yang harganya tepat $1.00 tampaknya juga bergantung pada bagaimana penjual menetapkan harga
Saat seseorang membeli sesuatu di situs web untuk menguji kartu kredit curian, pembeli tidak bisa menentukan harga sesuka hati
Selain itu, ini tampak terlalu disesuaikan dengan situasi seperti di AS, tempat pajak tidak termasuk dalam harga, sementara di wilayah lain harga bulat sangat umum
Saya juga ragu tolok ukur lain dalam tulisan itu akan bekerja dengan baik. Misalnya, jika menandai orang yang bertransaksi dalam 90 hari terakhir di luar jam saat mereka biasanya pernah bertransaksi lebih dari dua kali, bukankah hampir separuh orang akan kena?
Tidak jelas apakah ini tulisan yang menyederhanakan pengetahuan profesional yang rumit menjadi kueri SQL yang terlalu sederhana, atau sepenuhnya dugaan dan karangan. Kalimat “enam pola SQL yang dipakai untuk menangkap penipuan transaksi” dan “tidak ada satu pun di sini yang benar-benar pernah saya kerjakan atau lihat” saling bertentangan
Biasanya orang tidak membeli bensin, kopi, atau camilan jam 2 pagi, tetapi kalau itu sangat jarang terjadi, kemungkinan besar ada keadaan darurat pribadi, dan dalam situasi begitu orang juga tidak ingin menelepon bank
Saya paham pencuri oportunistis juga bisa beraktivitas pada jam itu, tetapi jelas ada juga biaya false positive
Selain itu ada SPBU yang memang meminta nominal tetap lebih dulu, seperti 10, 20, atau 50 euro
Lalu kartu saya diblokir karena dicurigai sebagai penipuan, dan itu cukup menjengkelkan. Bukan hal yang ingin diurus saat mabuk jam 2 pagi
Mungkin mereka melindungi saya dari diri saya sendiri, tetapi tetap saja merepotkan
Dan justru pola heuristik seperti ini, yang tidak mengharapkan akurasi hampir 100%, bukankah itu bidang yang seharusnya dikuasai AI?
Tolok ukur “menyeberangi perbatasan dalam 10 menit berarti organisasi internasional” bisa berlaku juga untuk orang biasa yang tinggal di wilayah dekat perbatasan Eropa
Bahkan kalau transaksi card-not-present dikecualikan, ini tetap tampak salah mengasumsikan bahwa semua lokasi merchant disetel akurat, semua penjualan terjadi di toko fisik, tidak ada penjualan keliling, dan semua transaksi diproses secara online
Jika dibaca sampai akhir, nasihatnya kosong dan saling bertentangan. Hampir pasti ini tampak seperti tulisan buatan LLM
Ia bilang “tim Anda” tidak boleh bergantung pada satu pola pun, tetapi juga mengatakan pola 1 saja bisa mengungkap “jumlah penipuan yang berguna”
Ada juga kalimat aneh seperti “semua analis di tim Anda akan memakainya, yaitu window function, ketika itu ada, dan menambahkan pola penipuan berikutnya tidak lagi menjadi proyek”
Selain itu, hampir semua contoh bahkan tidak memakai
IS NULL, tetapi tetap muncul pembahasan yang kurang relevan soal filterIS NULLyang mungkin tidak diterapkan, dan satu-satunya contoh yang memakainya pun ada di konteks lainSecara keseluruhan ini tulisan yang berkualitas rendah dan terlalu panjang
Hacker News, ini perlu ditunjukkan
“Fixel Smith” adalah tokoh buatan AI, dan tulisannya hampir tidak ada hubungannya dengan analisis penipuan. Nama ini dipakai untuk hampir semua identitas yang bisa dibayangkan: musisi (1), novelis (2), analis penipuan (3), influencer (4), dan seterusnya
Posting ini mendapat lebih dari 220 poin dan lebih dari 70 komentar, tetapi hampir tak ada yang menyadari bahwa ini cukup palsu, dan tak ada yang melihat bahwa sosoknya adalah hasil generasi AI
https://www.amazon.it/Forged-Soundtrack-Explicit-Fixel-Smith...
https://fixelsmith.com
https://analytics.fixelsmith.com/
https://www.instagram.com/fixeltales/
Saya jadi bertanya-tanya apakah banjir AI ini mengungkap kebenaran yang tidak nyaman tentang daya nilai komunitas, atau ini sekadar kegagalan mekanisme pertahanan yang sudah ada dan hanya perlu diperbaiki
Dengan asumsi semua komentar ditulis dengan itikad baik, cukup mengkhawatirkan bahwa bahkan di sini literasi AI tampaknya rendah
Novel-novelnya hampir tidak berhubungan dengan tulisan analitisnya, dan tulisan analitisnya sendiri tampak punya gaya LLM, jadi semuanya terasa mencurigakan. Mengingat topik tulisan aslinya adalah penipuan, ini ironis
Sejujurnya saya biasanya bahkan tidak melihat byline, apalagi bagian lain dari situsnya
Tidak jelas apakah isinya karangan atau bukan, tetapi orang bisa mengkritik isi tulisan ini tanpa perlu menebak apakah ditulis LLM atau oleh novelis. Ada banyak cacat yang jauh lebih spesifik
Kami sedang mengembangkan framework keamanan open source tirreno
Saya meragukan pendekatan yang dijelaskan di sini. Misalnya, perjalanan mustahil adalah teknik yang sah dan banyak dipakai, tetapi itu berkaitan dengan perilaku pengguna online berbasis alamat IP
Di tirreno ada aturan terpisah untuk kasus saat jelas IP berasal dari Apple Relay atau VPN/Tor, dan itu menjadi flag tersendiri
Saya rasa sebagian atau seluruh contohnya dibuat LLM. Konteksnya campur aduk, dan tidak ada tempat yang benar-benar mengumpulkan lokasi GPS secara massal untuk pembayaran kartu
Ini lebih mirip logika berbasis aturan yang dienkode ke dalam kueri SQL tanpa data pendukung
Ambang batasnya banyak, tetapi tidak ada data yang menunjukkan bahwa ambang-ambang itu memang bermakna
Pernyataan tegas seperti “deteksi penipuan pada data transaksi kebanyakan adalah SQL, bukan machine learning, bukan graph database, dan bukan apa pun yang sedang diangkat Gartner tahun ini” hanya bisa dibenarkan jika yang dibahas adalah seluruh pekerjaan integritas program
Jika pendekatan yang lebih sederhana dan kasar memang menyelesaikan masalah domainnya, itu mungkin lebih baik
Klien fintech biasanya ingin tahu apakah transaksi yang sedang terjadi sekarang adalah penipuan, dan mereka ingin jawaban dalam hitungan milidetik terhadap data berdimensi tinggi. Ini pekerjaan pada skala yang menyulitkan database relasional memenuhi batasan real-time seperti itu, sehingga lebih sering dipakai untuk hal lain seperti pemuatan data historis
Karena itu muncul database in-memory, stream processing engine, dan juga machine learning
Meski begitu, sebagian poin penulis tetap masuk akal, dan khususnya masalah menangani alert yang bising adalah persoalan umum yang melampaui performance engineering, jadi saya menantikan tulisan lanjutannya
Dalam pencegahan, selalu ada batasan dari kebutuhan latensi, data yang tersedia, dan gambaran perilaku pengguna yang tidak lengkap. Machine learning dan aturan dipakai untuk mengambil keputusan cepat dan menangani sebagian besar kasus, tetapi karena batasan itu tidak mungkin menghentikan semua penipuan dengan tepat
Deteksi menangani akibat setelahnya. Umumnya tim analis menganalisis transaksi yang sudah disetujui untuk mencari tanda-tanda penipuan. Ini особенно penting untuk jenis penipuan yang tidak memiliki sinyal eksternal seperti chargeback atau keluhan pelanggan. Integritas platform adalah contohnya, dan sistem anti pencucian uang di fintech juga harus aktif mencari penipuan
Alasan keduanya saling melengkapi adalah karena transaksi yang terdeteksi menjadi label untuk melatih dan mengevaluasi model pencegahan berikutnya
Dikatakan bahwa jika kartu digesek di Chicago lalu 7 menit kemudian digesek lagi di Los Angeles, maka salah satunya palsu, tetapi saya penasaran bagaimana ini bekerja untuk belanja online
Jika saya duduk di sofa dan membeli barang di Amazon, alamatnya akan tercatat di mana?
Dan ada juga kasus tepi seperti pasangan yang berbagi akun online, lalu salah satunya sedang bepergian dan membeli memakai data kartu yang tersimpan
Peritel dan bank bisa membedakan keduanya
“Cara ini tidak bekerja sampai riwayatnya cukup terkumpul, dan akun baru tidak punya baseline” adalah faktor pengalaman pelanggan yang diremehkan
Kalau saya pelanggan baru atau sedang menunjukkan pola baru lalu kartu saya ditolak, rasanya perangkat lunaknya bekerja dengan baik
Tetapi kalau ada riwayat masa lalu yang sudah saya otorisasi namun transaksi saya tetap ditolak, saya justru kesal pada algoritme yang naif dan paranois
Transaksi penipuan pada akhirnya membuat bank menanggung kerugian lewat pembatalan atau refund. Transaksi yang ditolak hanya menciptakan satu pelanggan yang marah, lalu pelanggan itu mengeluh dan segera melupakannya. Jadi beban biaya yang dieksternalisasi jatuh ke pelanggan
Karena itu bank punya insentif untuk salah ke sisi yang lebih hati-hati dan menolak transaksi meskipun ada false positive
Bukankah inti machine learning justru mempelajari aturan seperti ini dari data?
Menurut saya pendekatan yang benar adalah memakai model machine learning untuk menemukan pola yang berkorelasi dengan penipuan, lalu mengevaluasi apakah ada yang masuk akal. Dengan begitu kita mungkin menemukan hipotesis baru
Analis manusia harus bisa menjelaskan kepada tim compliance dalam email 5 menit mengapa transaksi tertentu ditolak, dan apa yang seharusnya dilakukan berbeda agar keputusan yang merugikan itu bisa dihindari
Sering kali ketika satu masalah diperbaiki dengan machine learning, muncul dua masalah baru yang belum terlalu terlihat. Dalam hal regresi atau efek samping tak terduga saat berubah seiring waktu, SQL biasanya membawa kejutan yang lebih sedikit
Tadinya saya bingung apa maksudnya jumlah bulat.. ternyata
roundedyaKenapa ini diterjemahkan seperti itu ya, hiks. Saya sudah memperbaikinya.