Generator grafik transaksi besar dengan pola aktivitas kriminal

Hari yang baik


Jaringan

Beberapa tahun yang lalu, tim kami (kepatuhan di bank Swiss) menghadapi tugas yang sangat menarik: diperlukan untuk menghasilkan grafik besar transaksi antara pelanggan, perusahaan dan ATM, menambahkan pola yang mirip dengan pencucian uang dan pola aktivitas kriminal lainnya ke grafik ini, dan juga menambahkan minimum informasi tentang simpul grafik ini - nama, alamat, waktu, dll. Tentu saja, semua data harus dihasilkan dari awal, tanpa menggunakan data pelanggan yang ada.

Untuk mengatasi masalah ini, sebuah generator telah ditulis, yang ingin saya bagikan dengan Anda. Di bawah potongan Anda akan menemukan sebuah cerita yang menjelaskan mengapa kami membutuhkannya, dan deskripsi operasi generator. Untuk tidak sabar - di sinilah letak kodenya . Saya akan senang jika seseorang akan mendapat manfaat dari pengalaman kami.


Mengapa kita melakukan omong kosong seperti itu?


Tim kami memutuskan untuk berpartisipasi sebagai sponsor di hackathon LauzHack

. Salah satu syarat untuk berpartisipasi dalam format sponsor adalah penyediaan tugas bisnis nyata bagi para peserta. Tepat pada saat itu, kami memiliki proyek yang sangat menarik terkait dengan otomatisasi pencarian kejahatan keuangan dan pencucian uang di antara transaksi pelanggan kami, dan tanpa ragu-ragu, kami memutuskan untuk menawarkan tugas yang sama kepada para peserta hackathon.

Karena alasan yang jelas, kami tidak dapat menggunakan data nyata, jadi kami harus membuatnya. Untuk membuat tugas sedekat mungkin dengan kenyataan, kami melihat statistik data nyata dan mencoba, semampu kami, untuk membawa data yang dihasilkan lebih dekat ke distribusi nyata, dan juga tidak berhemat pada jumlah dan kompleksitas data - kami tidak memerlukan solusi yang bekerja pada grafik 100 node dan 200 koneksi, kami sedang mencari solusi yang mampu memproses grafik ukuran jutaan node dan milyaran koneksi, dan dengan mempertimbangkan semua informasi yang tersedia tentang node dan koneksi.


Apa yang kita dapat


Dan kami mendapatkan generator yang cukup cepat (disesuaikan dengan jumlah data), menarik dan dapat dikonfigurasi! Mari kita pahami secara detail


Tipe data


Kami ingin memiliki grafik transaksi keuangan, masing-masing, kemungkinan peserta dalam grafik ini adalah:


  • Klien - Anda dapat mengatakan akun klien bank abstrak. Ini dijelaskan berdasarkan nama, email, umur, pekerjaan, pandangan politik, kebangsaan, pendidikan dan alamat tempat tinggal
  • Perusahaan adalah entitas bisnis dalam sistem keuangan. Itu ditentukan oleh jenis perusahaan, nama dan negara.
  • ATM - secara kasar, titik keluar uang dari grafik yang dikendalikan oleh kami. Didefinisikan oleh koordinat geografis.
  • Transaction - Fakta mentransfer uang dari satu simpul grafik ke yang lain. Didefinisikan oleh simpul awal dan akhir, jumlah, mata uang, dan waktu.

Untuk membuat data ini, kami menggunakan Mimesis , perpustakaan yang hebat untuk membuat data palsu.


Membuat grafik: entitas dasar


Pertama, Anda perlu membuat semua entitas dasar - pelanggan, perusahaan, dan ATM. Script mengambil jumlah pelanggan yang ingin Anda buat, dan atas dasar ini menghitung jumlah perusahaan dan ATM. Menurut data kami, jumlah perusahaan yang memiliki sejumlah besar transaksi dengan pelanggan adalah sekitar 2,5% dari jumlah pelanggan, dan jumlah ATM adalah 0,05% dari jumlah pelanggan. Nilai-nilai ini sangat umum dan tidak dapat dikonfigurasi (kabel dalam kode generator).


Semua informasi disimpan dalam file .csv. Menulis ke file-file ini terjadi dalam batch, k baris sekaligus. Nilai ini dikonfigurasi oleh argumen skrip. Juga, tiga jenis node dihasilkan secara paralel.


Membuat grafik: koneksi antar entitas


Setelah membuat entitas dasar, kita mulai menghubungkannya bersama. Pada tahap ini, kami belum menghasilkan transaksi sendiri, tetapi hanya fakta bahwa ada koneksi antara node. Ini dilakukan untuk mempercepat proses menghasilkan seluruh grafik dan bekerja kira-kira sebagai berikut: jika dua node terhubung, maka kami menghasilkan sejumlah transaksi di antara mereka, tersebar dalam waktu. Jika tidak terhubung, tetapi transaksi antara node ini tidak ada.


Kemungkinan koneksi antara kedua node dikonfigurasi melalui argumen, nilai standar tercantum di bawah ini.


Jenis koneksi yang mungkin:


  • Klien -> Klien (p = 0,4%)
  • Klien -> Perusahaan (p = 1%)
  • Klien -> ATM (p = 3%)
  • Perusahaan -> Klien (p = 0,5%)

Seperti halnya node, semua jenis koneksi dihasilkan secara paralel dan ditulis ke file mereka dalam batch.


Pembuatan Grafik: Transaksi


Setelah simpul grafik dan koneksi di antara mereka berada di bawah distribusi yang diinginkan, kita dapat mulai menghasilkan transaksi. Prosesnya sendiri cukup sederhana, tetapi memparalelkannya cukup sulit. Oleh karena itu, pada tahap ini hanya ada dua arus independen - transaksi yang berasal dari klien, dan transaksi yang berasal dari perusahaan.


Tidak ada yang sangat menarik terjadi pada tahap ini: skrip berjalan melalui daftar koneksi dan menghasilkan sejumlah transaksi acak untuk setiap koneksi. Semua ditulis dengan cara yang sama - dalam file .csv oleh paket.


Hitung Kreasi: Pola


Dan di sini ada poin menarik. Jenis-jenis pola perilaku yang ingin kita dapatkan di kolom terakhir:


  • Flow - jumlah besar berpindah dari satu node ke m ke yang lain, masing-masing node m mentransfer uang ke level berikutnya dari n node, dan seterusnya, hingga level terakhir mengirim semua uang ke satu penerima.
  • Circular - jumlah uang berputar dan kembali ke sumbernya.
  • Waktu - sejumlah uang bergerak dari satu simpul ke simpul lainnya dengan frekuensi tetap.

Mari kita lihat masing-masing pola ini secara lebih rinci:


Mengalir


Untuk memulainya, jumlah tingkat yang harus dilalui uang dipilih. Dalam implementasi kami, angka acak antara 2 dan 6 ini tidak dapat dikonfigurasi dan ditransfer dalam kode. Selanjutnya, dua simpul grafik dipilih - pengirim dan penerima. Jumlah acak juga dipilih, yang akan dikirim oleh pengirim ke penerima (sesuai dengan rumus pintar 50000 * random() + 50000 * random() ).


Setiap anggota jaringan ini mengambil semacam biaya untuk layanan mereka. Dalam implementasi kami, harga maksimum untuk mengirimkan uang melalui jaringan adalah 10% dari jumlah yang ditransfer oleh pengirim.


Transaksi yang dihasilkan memiliki pergeseran waktu dari transaksi relatif dari tingkat jaringan sebelumnya - yaitu, uang pertama kali datang ke tingkat n-1, dan baru kemudian pergi ke tingkat n. Penundaan dipilih secara acak dalam 4-5 hari. Juga, transaksi yang dihasilkan memiliki jumlah pseudo-acak (dibatasi oleh jumlah awal dan memperhitungkan biaya untuk setiap node)


Edaran


Ini dihasilkan sesuai dengan prinsip yang sama dengan Flow, tetapi bukannya pengirim dan penerima yang berbeda dan beberapa level dalam pola ini, uang bergerak dalam lingkaran dan kembali ke simpul asli. Semua node perantara membebankan biaya, seperti halnya dengan Flow, dan transaksi juga memiliki offset waktu.


Waktu


Pola paling sederhana. Jumlah tertentu dikirim dari pengirim ke penerima beberapa kali secara acak (dari 5 hingga 50, tidak dapat dikonfigurasi) dengan pseudo-random time shift.


Semua transaksi baru ditulis dengan cara yang sama untuk file .csv dalam batch.


Pengacakan grafik dan mengumpulkan semua transaksi dalam satu file


Pada tahap ini, kami memiliki beberapa file .csv:


  • 3 file dengan node (klien, perusahaan dan ATM)
  • 4 file transaksi: satu untuk transaksi reguler dan 3 berisi pola.

Script tambahan mencampur pola transaksi bersama dengan transaksi reguler sehingga tidak mungkin untuk melihat pola dalam grafik dalam urutan transaksi yang dicatat dalam file.


Dan apa yang harus dilakukan dengan semua ini?


Pada akhirnya, kami memiliki 4 file indah dengan node grafik dan transaksi di antara mereka. Anda dapat mengimpor ke Neo4J, Anda dapat mendistribusikan melalui REST, tetapi apa pun yang Anda suka, Anda dapat melakukannya dengan mereka.


Adapun kami, kami menerima umpan balik yang sangat positif dari para peserta hackathon, dan beberapa solusi yang sangat menarik untuk menemukan pola dalam grafik besar.

Source: https://habr.com/ru/post/id447626/


All Articles