
منذ عامين ، كان لدى فريقي (الامتثال في أحد البنوك السويسرية) مهمة مثيرة للتنفيذ - كان علينا إنشاء رسم عشوائي ضخم للمعاملات المالية بين العملاء والشركات وأجهزة الصراف الآلي. علاوة على ذلك ، أردنا أن يحتوي هذا الرسم البياني على بعض أنماط غسل الأموال وغيرها من أنماط الجرائم المالية جنبًا إلى جنب مع وصف العقد مثل الأسماء والعناوين والعملات وما إلى ذلك. من الواضح ، يجب أن يتم إنشاء جميع البيانات بشكل عشوائي من نقطة الصفر طالما أننا لا نستطيع استخدام أي بيانات حقيقية لأسباب واضحة.
كحل كتبنا مولدًا أود مشاركته معك. تشرح هذه المقالة سبب احتياجنا إليها وكيف يعمل هذا المولد ، ولكن إذا كنت لا ترغب في قراءته وترغب في تجربته بنفسك ، فهناك الرمز:
https://github.com/MGrin/transactions-graph- مولد . آمل أن تكون تجربتنا مفيدة لأي منكم.
لماذا كنا مهتمين بهذا المولد؟
قرر فريقنا رعاية
hackaton LauzHack. كان أحد شروط الرعاة هو توفير مهمة عمل حقيقية للمشاركين ، وبالصدفة في الوقت نفسه ، كان لدينا مشروع مثير للاهتمام يتعلق باكتشاف غسل الأموال بين الرسم البياني للمعاملة. بالطبع ، قررنا إعطاء نفس المهمة للمشاركين hackaton.
كما قلت سابقًا ، لم نتمكن من استخدام بيانات حقيقية ، لذلك كنا بحاجة إلى إنشائها. لجعل المهمة أقرب ما تكون إلى العالم الحقيقي قدر الإمكان ، لدينا بعض الإحصاءات من البيانات الخاصة بنا وحاولنا إنشاء بيانات تم إنشاؤها لمتابعة توزيعات مماثلة. كما أننا لم نرغب في الحصول على رسم بياني صغير - فنحن نعمل يوميًا مع مليارات المعاملات بين ملايين العقد ، وأردنا منح المشاركين القدرة على تجربة أفكارهم على نفس النطاق.
ماذا حصل نتيجة لذلك؟
يمكننا بناء مولد رسم بياني سريع ومثير للاهتمام وقابل للتكوين! دعونا نرى المزيد من التفاصيل:
أنواع العقد
المشاركون في نظامنا المالي الناتج:
- عميل - حساب عميل بنك مجردة. يحتوي على مجالات مثل الاسم والبريد الإلكتروني والعمر والمهنة والتعليم والجنسية والعنوان.
- شركة - كيان تجاري في نظامنا المالي. يحتوي على حقول مثل النوع والاسم والدولة.
- أجهزة الصراف الآلي - نقطة خروج للأموال من الرسم البياني المالي لدينا إلى الخارج حيث لا يمكن تتبعها بعد الآن. يحتوي على إحداثيات GPS.
- المعاملة - سجل تحويل الأموال بين عقدتي رسم بياني. يحتوي على مؤشرات إلى المصدر والعقد المستهدفة والمبلغ والعملة وتاريخ ووقت التنفيذ.
لإنشاء هذه البيانات ، استخدمنا
Mimesis ، وهي مكتبة رائعة لإنشاء بيانات مزيفة.
توليد الرسم البياني: الكيانات الأساسية
يبدأ المولد بإنشاء كيانات أساسية - العملاء والشركات وأجهزة الصراف الآلي. يأخذ البرنامج النصي عددًا من العملاء المطلوبين كمدخلات ، وبناءً على هذا الرقم يحسب عدد الشركات وأجهزة الصراف الآلي التي يتعين إنشاؤها. لقد استنتجنا أن عدد الشركات يساوي 2.5٪ من إجمالي عدد العملاء ، وأن عدد أجهزة الصراف الآلي يساوي 0.05٪. يتم حساب متوسط هذه المعلمات ومضمون داخل المولد نفسه.
يتم حفظ جميع المعلومات التي تم إنشاؤها في ملفات .csv. تتم الكتابة على هذه الملفات بواسطة مجموعات من الصفوف k ، ككونها معلمة قابلة للتكوين. أيضا ، يتم إنشاء كل نوع من العقدة بالتوازي لتسريع العملية برمتها.
توليد الرسم البياني: الحواف بين الكيانات
بعد إنشاء الكيانات الأساسية ، نبدأ في ربطها ببعضها البعض. في هذه المرحلة ، لا نقوم بإنشاء معاملات بعد ، ولكن فقط حقيقة وجود عقدتين متصلتين. لقد فعلنا ذلك بهذه الطريقة لتسريع العملية وهي تعمل كما يلي: إذا كان هناك حافة بين عقدتين ، فسيكون هناك عدد من المعاملات مفصولة في الوقت المناسب. لا الحافة - لا المعاملات على الإطلاق.
الاحتمال إذا والحافة بين العقدتين وأنواع الحافة الممكنة هي:
- العميل -> العميل ، ع = 0.4 ٪
- العميل -> الشركة ، ع = 1 ٪
- العميل -> أجهزة الصراف الآلي ، P = 3 ٪
- الشركة -> العميل ، ع = 0.5 ٪
يمكن تكوين هذه الاحتمالات باستخدام معلمات المولد.
تمامًا مثل العقد ، يتم إنشاء جميع أنواع الحواف بالتوازي ويتم كتابتها في ملفات على دفعات.
توليد الرسم البياني: المعاملات
وجود العقد والحواف وجود التوزيع المطلوب ، يمكننا البدء في إنشاء المعاملات. هذه العملية مباشرة إلى الأمام ولكن يصعب موازنتها تمامًا. بسبب ذلك في هذه المرحلة ، هناك خيطان فقط يعملان - أحدهما من أجل إنشاء معاملات منبع العميل ، والآخر - من أجل إنشاء معاملات من مصادر الشركة. عدد المعاملات للحافة عشوائي وفصل عشوائي في الوقت المناسب.
مثل أي شيء أعلاه ، تتم كتابة المعاملات التي تم إنشاؤها في ملفات .csv على دفعات.
توليد الرسم البياني: الأنماط
هذا هو المكان الذي تصبح الأمور مثيرة للاهتمام. لقد حددنا ثلاثة أنماط أردنا أن نوفرها في الرسم البياني الخاص بنا:
- التدفق - يتم إرسال مبلغ كبير من المال من عقدة المصدر إلى العقد N ، ويقوم أي من هذه العقد N بإرسال الأموال إلى عقد K أخرى ، إلخ. حتى ترسل الطبقة الأخيرة من هذه الشبكة جميع الأموال المستلمة إلى عقدة الهدف.
- دائري - يمر مبلغ كبير من المال بعقد مختلفة ويعود إلى العقدة المصدر.
- الوقت - يتم نقل بعض المبلغ من العقدة A إلى العقدة B عدة مرات ، مفصولة بزمن عشوائي زائف.
دعونا اكتشاف هذه الأنماط واحدا تلو الآخر.
تدفق
نبدأ بتحديد عدد من طبقات الشبكة. في إدراكنا ، يكون رقمًا عشوائيًا بين 2 و 6 ، وهذه القيم غير قابلة للتكوين. ثم نختار عشوائيا العقدتين - المصدر والهدف. كما يتم إنشاء المبلغ الذي سيصدر بواسطة عقدة مصدر بشكل عشوائي على أنه 50000 * عشوائي () + 50000 * عشوائي ().
يأخذ كل مشارك في هذه الشبكة مدفوعات مقابل خدمته. في إدراكنا ، لن يتجاوز إجمالي الدفع مقابل استخدام الشبكة بالكامل 10٪ من المبلغ المصدر.
يتم تأخير جميع المعاملات التي تم إنشاؤها في الوقت المناسب من طبقة إلى أخرى. التأخيرات عشوائية ولا تتجاوز 5 أيام.
دائري
يشبه نمط التدفق إلا أن العقدتين المستهدفة والعقدة متطابقتان ، وهناك عقدة واحدة فقط لكل طبقة وسيطة.
وقت
أسهل نمط. يتم إرسال مبلغ عشوائي من العقدة A إلى العقدة B عدة مرات (رقم عشوائي بين 5 و 50 ، غير قابل للتكوين) مع تأخير عشوائي شبه بين المعاملات.
المعاملات النهائية العشوائية
في هذه المرحلة ، لدينا عدد من ملفات .csv:
- 3 ملفات تحتوي على معلومات العقد (العملاء والشركات وأجهزة الصراف الآلي)
- 4 ملفات مع المعاملات: واحد للمعاملات المعتادة و 3 للمعاملات من الأنماط التي تم إنشاؤها.
هناك برنامج نصي آخر يعشوئ جميع المعاملات ويضعها في ملف معاملات واحد.
ما يجب القيام به مع إخراج هذا المولد
في نهاية اليوم ، لدينا 4 ملفات بتنسيق .csv جميلة مع عقد بيانية ومعاملات. يمكننا استيراد هذا الرسم البياني إلى Neo4J أو خدمته على واجهة برمجة تطبيقات REST - بشكل أساسي يمكننا أن نفعل أي شيء به! يمكن أن يكون حجم الرسم البياني كبيرًا كما تريد (لقد انتهى الأمر بإنشاء رسم بياني يحتوي على 2 مليار عميل واستغرق حوالي 8 ساعات في MacBook 2014).
لدينا الكثير من الملاحظات الإيجابية من المشاركين في hackaton بالإضافة إلى اثنين من الحلول الجيدة لمشكلة اكتشاف الأنماط في الرسوم البيانية الكبيرة.
شكرا لك على وقتك ، وهنا هو الرابط للمولد:
https://github.com/MGrin/transactions-graph-generator