تحليل الشبكة الاجتماعية هو عملية استكشاف أنظمة مختلفة باستخدام نظرية الشبكة. بدأ استخدامه على نطاق واسع فقط عندما أصبح من الواضح أن عددًا كبيرًا من الشبكات الموجودة (الاجتماعية والاقتصادية والبيولوجية) لها خصائص عالمية: بعد دراسة نوع واحد ، يمكنك فهم بنية أي شبكات أخرى ومعرفة كيفية عمل تنبؤات منها.
تتكون أي شبكة من مشاركين فرديين (أشخاص أو أشياء في الشبكة) والعلاقات بينهم. غالبًا ما يتم تصور الشبكات باستخدام الرسوم البيانية - هياكل تتكون من العديد من النقاط والخطوط التي تمثل الروابط بين هذه النقاط. يتم تمثيل المشاركين كعقد للشبكة ، ويتم تمثيل علاقاتهم كخطوط تربطهم. يساعد هذا التصور في الحصول على تقييم نوعي وكمي للشبكات:
الشكل: 1. رسم بياني اتجاهي يوضح معدل دوران الأموال بين البنوك التي تشكل سوق الصرف الأجنبي (1). تتميز بنوك الاتحاد الأوروبي باللون الأحمر ، وأمريكا الشمالية - باللون الأزرق ، ودول أخرى - باللون الأخضر.
الشكل: 2. رسم بياني يوضح تعاون شركاء التدقيق في الدنمارك في 2010-2014 (2)
باستخدام تحليل الشبكات الاجتماعية ، من الممكن تحليل مجموعة متنوعة من التفاعلات وعمليات تبادل الموارد ، المادية منها والمعلوماتية. على سبيل المثال ، من خلال تحليل شبكة المعاملات بين عملاء البنك (حيث تكون العقد عملاء البنك ، والحواف عبارة عن تحويلات فيما بينهم) ، يمكن تحديد دائرة الأشخاص المتورطين في معاملات احتيالية ، أو تحديد انتهاكات اللوائح الداخلية من قبل موظفي البنك.
يمكنك أيضًا بناء شبكة من علاقات العمل (باستخدام مثال لأنواع مختلفة من التواصل بين الموظفين) ، والتي يمكن أن تساعد في فهم البنية الاجتماعية للمؤسسة وموقع كل موظف في هذا الهيكل. بالنظر إلى البيانات المتعلقة بنوع الاتصال لكل موظف ، يمكن للمرء حتى تحليل كيف تؤثر خصائص مثل القيادة والتوجيه والتعاون على حياته المهنية ، وبناءً على المعرفة المكتسبة ، حدد الأهداف المهنية واقترح برامج تدريبية لتحقيقها.
بالإضافة إلى ذلك ، يمكن توقع الأحداث باستخدام مثال الشبكات. على سبيل المثال ، هناك نماذج تقدر احتمالية فشل البرنامج ، وبعضها يعتبر الناس مصدرًا للتنبؤات - بعد كل شيء ، الأشخاص هم الذين يطورون المنتجات ويختبرونها قبل الإصدار. تشكل تفاعلاتهم شبكة: يمكنك التفكير في المطورين كعقد ، وما إذا كانوا يعملون معًا في نفس الملف في نفس الإصدار ، مثل حواف الشبكة. إن فهم التفاعلات والمعلومات المتعلقة بالفشل السابق سيخبر الكثير عن موثوقية المنتج النهائي ويشير إلى الملفات التي من المرجح أن تفشل.
الآن دعنا نحاول تطبيق تحليل الوسائط الاجتماعية في الممارسة. للقيام بذلك ، سنستخدم لغة برمجة Python ، أو بالأحرى مكتبة networkx للعمل مع الرسوم البيانية ، ومكتبة matplotlib للتصور ، ومكتبة المجتمع لتسليط الضوء على المجتمعات داخل الشبكة. دعنا نستوردها:
1. import community
2. import networkx as nx
3. import matplotlib.cm as cm
4. import matplotlib.pyplot as plt
1. استيراد البيانات وتحويلها إلى رسم بياني
كمجموعة بيانات ، لنأخذ مراسلات عبر البريد الإلكتروني من جامعة أوروبية كبيرة ، والتي تحتوي على معلومات مجهولة المصدر حول جميع رسائل البريد الإلكتروني الواردة والصادرة بين أعضاء مؤسسة بحثية (رابط). تحتوي مجموعة البيانات على ملف txt حيث يسرد كل سطر أزواج من العقد المرتبطة ببعضها البعض.
1. G = nx.read_edgelist('email-Eu-core.txt', create_using=nx.DiGraph())
2. print(' : {}'.format(G.number_of_nodes()))
3. print(' : {}'.format(G. number_of_edges()))
4. print(' : {}'.format(round(G.number_of_edges() / float(G.number_of_nodes()), 4)))
: 1005
: 25571
: 25.4438
في الكود أعلاه ، تم استيراد مجموعة البيانات وتحويلها إلى رسم بياني. ثم استنتجنا بشكل تسلسلي المعلمات الرئيسية للرسم البياني: عدد العقد والحواف ومتوسط عدد الجيران للعقد في الرسم البياني. تعكس المعلمة الأخيرة مدى ارتباط العقد ببعضها البعض.
2. الخصائص الرئيسية للرسوم البيانية
لفهم كيف يمكنك العمل مع كل رسم بياني محدد ، عليك أولاً أن تفهم كيف يعمل. دعنا نلقي نظرة سريعة على الخصائص التي يمكنك من خلالها فهم بنية الرسم البياني.
بادئ ذي بدء ، فكر في مفاهيم الاتصال والاتجاه. يسمى الرسم البياني متصل إذا كان كل زوج من العقد في الرسم البياني مترابطًا ، أي من أي عقدة يمكنك الوصول إلى أي عقدة أخرى. إذا تم فصل الرسم البياني ، فيمكن تقسيمه إلى مخططات فرعية متصلة بأقصى حد (تسمى المكونات). أيضا ، يمكن توجيه الرسوم البيانية وعدم توجيهها. يتم تحديد ذلك من خلال وجود اتجاه العلاقة بين المشتركين. أحد الأمثلة على الشبكة الموجهة هو المعاملات بين عملاء البنك ، حيث يمكن لكل عميل الحصول على مدفوعات واردة وصادرة.
في الحالة العامة ، في الرسوم البيانية الموجهة ، لا تكون الاتصالات متبادلة ؛ لذلك ، بالنسبة للرسوم البيانية الموجهة ، بدلاً من مفهوم الاتصال ، يتم تمييز مفاهيم مكونات الاتصال الضعيف والقوي. يعتبر المكون مرتبطًا بشكل ضعيف إذا كان تجاهل الاتجاه يؤدي إلى رسم بياني متصل. يمكن أن يكون أحد مكونات الاتصال القوي مثل هذا إذا كانت جميع رؤوسه قابلة للوصول بشكل متبادل. دعنا نلقي نظرة على هيكل الرسم البياني من مجموعة بيانات البريد الإلكتروني لدينا:
1. if nx.is_directed(G):
2. if nx.is_weakly_connected(G):
3. print(' .')
4. else:
5. print(' .')
6. else:
7. if nx.is_connected(G):
8. print(' .')
9. else:
10. print(' .')
الرسم البياني اتجاهي ويتكون من عدة مكونات.
هنا تحققنا من اتجاه واتصال الرسم البياني واكتشفنا أن الرسم البياني من مجموعة البيانات موجه ويحتوي على عدة مكونات غير متصلة. دعنا نحاول إلقاء نظرة فاحصة على أكبر مكونات الاتصال القوي والضعيف:
1. G_weak = G.subgraph(max(nx.weakly_connected_components(G), key=len))
2. print(' : {}'.format(G_weak.number_of_nodes()))
3. print(' : {}'.format(G_weak.number_of_edges()))
4. print(' : {}'.format(round(G_weak.number_of_edges() / float(G_weak.number_of_nodes()), 4)))
5.
6. G_strong = G.subgraph(max(nx.strongly_connected_components(G), key=len))
7. print(' : {}'.format(G_strong.number_of_nodes()))
8. print(' : {}'.format(G_strong.number_of_edges()))
9. print(' : {}'.format(round(G_strong.number_of_edges() / float(G_strong.number_of_nodes()), 4)))
: 986
: 25552
: 25.9148
: 803
: 24729
: 30.7958
لذلك ، حصلنا على الخصائص الرئيسية للمكون المتصل بشكل ضعيف وللمكون المتصل القوي المتضمن فيه. دعونا نرى ما هي الاستنتاجات التي يمكننا استخلاصها في هذه المرحلة. نرى أنه من بين 1005 مشارك ، يتواصل 986 شخصًا مع بعضهم البعض ، بينما أرسل 183 منهم رسائل بريد إلكتروني إلى أشخاص آخرين من جانب واحد ، وحافظ 803 أشخاص فقط على اتصال ثنائي الاتجاه. في 823 حالة ، فشلت محاولة إنشاء اتصال عبر البريد الإلكتروني. نرى أيضًا أن أكثر المشاركين نشاطًا (المشمولون في مكون الترابط القوي) يتواصلون مع 30 شخصًا في المتوسط.
لنلقِ نظرة على الخصائص الرئيسية الأخرى للرسوم البيانية التي تحدد هيكلها. تعتبر الرسوم البيانية مرجحة إذا كانت العلاقات بين العقد لا تعكس فقط وجود الاتصال فحسب ، بل تعكس أيضًا وزنًا معينًا ، مما يعكس قوة هذا الاتصال. لا يتم ترجيح مجموعة البيانات الخاصة بنا التي تحتوي على رسائل البريد الإلكتروني ، حيث إنها تأخذ في الاعتبار حقيقة المراسلات فقط ، ولكن ليس عدد رسائل البريد الإلكتروني المرسلة.
بالإضافة إلى ذلك ، يمكن للعقد والروابط إنشاء أنواع مختلفة من الشبكات: أحادية الفلقة أو ثنائية الفلقة أو متعددة المستويات. تتكون الشبكات أحادية الفلقة من نوع واحد من المشاركين والصلات بينهم. تتكون الشبكات الثنائية من نوعين مختلفين من المشاركين ، حيث يرتبط أحد أنواع العقد بالنوع الآخر فقط. تتضمن الشبكات متعددة المستويات أيضًا نوعين من المشاركين ، ولكن الروابط يمكن أن تربط كلا النوعين المختلفين من المشاركين ونفس النوع من المشاركين (على سبيل المثال ، العلاقات بين المديرين والعلاقات بين المشاريع). مجموعة البيانات التي أخذناها للبحث هي شبكة أحادية الفلقة ، لأنها تتكون من نوع واحد فقط من المشاركين والصلات بينهم.
3. تصور الرسم البياني
الآن دعنا نحاول تصور مجموعة البيانات التي أخذناها. لهذا نحتاج إلى مكتبة matplotlib ، والتي قمنا باستيرادها بالفعل أعلاه:
1. plt.figure(figsize=(15, 15))
2. plt.title('E-mails')
3. nx.draw(G, node_size=5)
4. plt.show()
يحدد السطر الأول حجم الصورة المستقبلية ، والتي يتم بعد ذلك تعيين اسم محدد لها. يمرر السطر الثالث من وظيفة الرسم رسمًا بيانيًا ويحدد حجم العقد ، وبعد ذلك يتم عرض الرسم البياني على الشاشة. دعونا نلقي نظرة عليه:
التين. 3. رسم بياني لتفاعلات المستخدم مع المعلومات حول جميع رسائل البريد الإلكتروني الواردة والصادرة بين أعضاء مؤسسة البحث.
في الرسم البياني الناتج ، نرى أن هناك عددًا من النقاط غير المرتبطة ببقية المشاركين في الاتصال. هؤلاء الأشخاص ، غير المرتبطين ببقية المشاركين ، دخلوا على الرسم البياني ، لأنهم أرسلوا رسائل إلى أنفسهم حصريًا. يمكنك أيضًا ملاحظة أنه يوجد على الأطراف عدد من النقاط المرتبطة ببقية الرسم البياني من خلال عدد قليل من الاتصالات الواردة - هؤلاء هم المشاركون الذين وقعوا في المكون ضعيف الاتصال في الرسم البياني الخاص بنا ، لكنهم لم يقعوا في المكون القوي المتصل.
لنلقِ نظرة أيضًا على رسم بياني يوضح مكون الترابط القوي - الأشخاص الذين لديهم اتصال ثنائي الاتجاه مع أعضاء آخرين في مؤسسة البحث:
الشكل. 4. عنصر اتصال قوي بالمعلومات حول جميع رسائل البريد الإلكتروني الواردة والصادرة بين أعضاء مؤسسة البحث...
4. درجة العقدة وتوزيع درجات العقد
الآن بعد أن عرفنا بنية الرسم البياني وأصبحنا قادرين على تصور ذلك ، دعنا ننتقل إلى تحليل أكثر تفصيلاً. كل عقدة في الرسم البياني لها درجة - عدد أقرب جيران لتلك العقدة. في الشبكات الموجهة ، يمكن للمرء التمييز بين درجة الدخول (عدد الاتصالات الواردة إلى العقدة) ودرجة الخروج (عدد الاتصالات الصادرة من العقدة). إذا قمنا بحساب درجة كل عقدة في الرسم البياني ، فيمكننا تحديد توزيع درجات العقد. دعنا نلقي نظرة عليها من أجل الرسم البياني للبريد الإلكتروني:
1. degree = dict(G.degree())
2. degree_values = sorted(set(degree.values()))
3. hist = [list(degree.values()).count(x) for x in degree_values]
4. plt.figure(figsize=(10, 10))
5. plt.plot(degree_values, hist, 'ro-')
6. plt.legend(['Degree'])
7. plt.xlabel('Degree')
8. plt.ylabel('Number of nodes')
9. plt.show()
الشكل: 5. توزيع الدرجات في رسم بياني يحتوي على معلومات حول جميع رسائل البريد الإلكتروني الواردة والصادرة بين أعضاء مؤسسة البحث
على الرسم البياني الناتج ، نرى توزيع درجات العقد: عدد كبير من العقد له اتصالات قليلة بالجيران ، لكن هناك عددًا قليلاً من العقد الكبيرة التي لها عدد من الاتصالات مع الآخرين عدد المشاركين ضخم. يسمى هذا الاتجاه بقانون السلطة للتوزيع ، وهو نموذجي جدًا للشبكات الكبيرة. يمكن أن يصف هذا القانون توزيع السكان في المدن المختلفة ، وترتيب المواقع على الإنترنت وحتى توزيع الثروة بين الناس.
5. المسار والقطر ومتوسط المسافة في الرسم البياني
الآن دعنا نحدد مدى اتصال أعضاء التمثيل البياني لدينا. أولاً ، دعنا نتحدث عن الأنواع المختلفة لتباعد العقد.
أي تسلسل من الحواف التي تربط العقد يسمى مسار. في أغلب الأحيان ، يعتبر البحث مسارًا بسيطًا ، أي مسار بدون دورات وعقد متكررة. يُطلق على أقصر مسار بين عقدتين اسم المسافة الجيوديسية. يُطلق على أطول مسار أقصر في الرسم البياني قطره ، ولكنه حساس للغاية للانحرافات (يمكن لسلسلة واحدة في الرسم البياني بملايين الدولارات أن تغير قطرها). في الرسوم البيانية الموجهة ، يمكن استخدام مفهوم القطر فقط لمكون الاتصال القوي ، لأنه لحساب القطر ، من الضروري أن يكون لكل زوج من العقد مسارًا بينهما. في الرسوم البيانية غير الموجهة ، يكفي أن يكون المكون قيد النظر متصل.
هناك خاصية أخرى مفيدة للغاية وهي متوسط المسافة بين العقد ، والتي يمكن الحصول عليها من خلال أخذ متوسط جميع أقصر المسارات في الرسم البياني. يتم تحديد متوسط المسافة من خلال بنية الرسم البياني: إذا تم إنشاء الرسم البياني على شكل سلسلة ، فسيكون كبيرًا ، ولكن كلما اقتربت العقد ، كلما قل متوسط المسافة. يمكن حساب متوسط المسافة لكل من المكون المتصل القوي والمكون المتصل بشكل ضعيف:
1. print (': ', nx.diameter(G_strong))
2. print (' : ', nx.average_shortest_path_length(G_strong))
3. print (' : ', nx.average_shortest_path_length(G_weak))
: 6
: 2.5474824768713336
: 2.164486568301397
دعنا نلقي نظرة على النتائج. يوضح لنا القطر في هذه الحالة أقصى مسافة بين شخصين غريبين ، وهنا ، كما هو الحال في النظرية المعروفة المتمثلة في ستة مصافحة ، هذه المسافة هي 6. متوسط المسافة في المكونات صغير أيضًا ، في المتوسط ، تكفي "مصافحتان" لغربان. يمكن أيضًا رؤية ظاهرة مثيرة للاهتمام هنا: متوسط المسافة في المكون المتصل القوي أقل قليلاً منه في المكون ضعيف الاتصال. يمكن تفسير ذلك من خلال حقيقة أن اتجاه الروابط لا يؤخذ في الاعتبار للمكون ضعيف الاتصال (فقط حقيقة وجوده). وبسبب هذا ، يظهر الاتصال في المكون الضعيف حيث كان غائبًا عن المكون القوي.
6. تجميع وتخصيص المجتمعات
بعد تحديد المسافات بين المشاركين ، دعنا ننتقل إلى الظواهر الأخرى التي تعكس كيفية ارتباط المشاركين في الرسم البياني ببعضهم البعض: التجميع والمجتمعات.
يوضح معامل الكتلة أن عنصرين من الرسم البياني ، متصلين من خلال العنصر الثالث ، بدرجة احتمالية عالية ، مرتبطان ببعضهما البعض. حتى لو لم يتم ربطهما ، فإن احتمالية ارتباطهما في المستقبل أعلى بكثير من العقدتين الأخريين اللتين تم أخذهما عشوائيًا. هذه الظاهرة ، التي تسمى التجميع أو الانتقالي ، شائعة للغاية في الرسوم البيانية الاجتماعية.
تتميز الرسوم البيانية ذات الدرجة العالية من التجميع بوجود عدد كبير من التوائم الثلاثة المتصلة (ثلاث عقد متصلة ببعضها البعض). إنها لبنة بناء العديد من الشبكات الاجتماعية ، حيث يكون عدد مثل هذه المثلثات كبيرًا جدًا. في كثير من الأحيان لا تظهر مثلثات ، ولكن تكوينات عنقودية كاملة ، تسمى المجتمعات ، ترتبط ارتباطًا وثيقًا ببعضها البعض أكثر من بقية الرسم البياني.
لنلقِ نظرة على التجميع ومعامل الكتلة للمكون ضعيف التوصيل:
1. print (': ', nx.transitivity(G_strong))
2. print (' : ', nx.average_clustering(G_strong))
: 0.2201493109315837
: 0.37270757578876434
بالنسبة لعنصر اتصال قوي ، يمكننا الحصول على نفس الخصائص ، وكذلك تحديد عدد العقد المركزية (العقد التي ترتبط ارتباطًا وثيقًا بالبقية) وعدد العقد في محيط الرسم البياني:
1. print (': ', nx.transitivity(G_strong))
2. print (' : ', nx.average_clustering(G_strong))
3. print (' : ', len(nx.center(G_strong)))
4. print (' : ', len(nx.periphery(G_strong)))
: 0.2328022090200813
: 0.3905903756516427
: 46
: 3
في الحالة الثانية ، زاد معامل الكتلة ومعامل الكتلة ، مما يعكس أن المكون القوي المتصل يحتوي على عدد أكبر من التوائم الثلاثة المتصلة. دعنا نحاول معًا تحديد المجتمعات الرئيسية في المكون غير المترابط:
1. G_undirected = G_weak.to_undirected()
2. partition = community.best_partition(G_undirected)
3. communities = set(partition.values())
4. communities_dict = {c: [k for k, v in partition.items() if v == c] for c in communities}
5. highest_degree = {k: sorted(v, key=lambda x: G.degree(x))[-5:] for k, v in communities_dict.items()}
6. print(' : ', len(highest_degree))
7. print(' :', ', '.join([str(len(highest_degree[key])) for key in highest_degree]))
: 8
: 113, 114, 125, 131, 169, 188, 54, 92
لذلك ، في العمود الذي يحتوي على المراسلات الإلكترونية ، يمكن التمييز بين 8 مجتمعات ، والتي ترتبط ارتباطًا وثيقًا ببعضها البعض أكثر من بقية العمود. أصغر المجتمعات لديها 54 عضوا ، وأكبرها تضم 188 عضوا. بالنسبة للشبكات التي تحتوي على مجتمعات متداخلة أو متداخلة ، قد يكون من الصعب تحديد التقسيم الأمثل. لذلك ، في كل مرة تقوم فيها بتشغيل الكود ، قد يختلف تكوين المجتمعات. دعنا نرى تصور الانقسام الذي حصلنا عليه:
1. pos = nx.spring_layout(G)
2. plt.figure(figsize=(15, 15))
3. cmap = cm.get_cmap('gist_rainbow', max(partition.values()) + 1)
4. nx.draw_networkx_nodes(G, pos, partition.keys(), node_size=20, cmap=cmap, node_color=list(partition.values()))
5. nx.draw_networkx_edges(G, pos, alpha=0.5)
6. plt.show()
الشكل: 6. عرض مجتمعات مختلفة في مكون غير مترابط مع معلومات حول جميع رسائل البريد الإلكتروني الواردة والصادرة بين أعضاء مؤسسة البحث.
في الرسم البياني أعلاه ، نرى توزيع المشاركين حسب المجتمع ، حيث يصف لون العقد الانتماء إلى مجتمع معين.
7. العلاقات المتبادلة
بالإضافة إلى الخصائص التي تم وصفها بالفعل ، هناك أيضًا شيء مثل المعاملة بالمثل في شبكة موجهة. تصف هذه الخاصية النسبة المئوية للروابط الصادرة التي تحتوي على تعليقات وارتباطات واردة. من أجل معرفة ذلك ، نستخدم الوظيفة الخاصة بالمعاملة الكلية لمكتبة networkx وننظر إلى مستوى المعاملة بالمثل في الرسم البياني ومكوناته:
1. print (' : ', nx.overall_reciprocity(G))
2. print (' : ', nx.overall_reciprocity(G_weak))
3. print (' : ', nx.overall_reciprocity(G_strong))
: 0.6933635759258535
: 0.6938791484032562
: 0.7169719762222492
في 71٪ من الحالات ، تلقى المستخدمون ردودًا على رسائلهم في مكون الاتصال القوي. بالنسبة للمكون المتصل بشكل ضعيف والرسم البياني بأكمله ككل ، يكون المستوى أقل بشكل متوقع.
8. الخصائص العالمية للشبكات
للتلخيص ، الشبكات المعقدة بشكل عام لها خصائص معينة وبعضها مميز للعديد من الشبكات. يدعم تحليلنا لمجموعة بيانات البريد الإلكتروني هذه الاتجاهات جيدًا:
- . , , . : web-, , , (Wikipedia, Microsoft). , .
- . , , « ». : , .
- , , : 80% , . – , , . , , .
- , . , .
قمنا بتحليل وتأكيد جميع الاتجاهات المدرجة أعلاه لمجموعة بيانات مع مراسلات البريد الإلكتروني: تم العثور على مكون كبير متصل في الرسم البياني ، يحتوي على أكثر من 80٪ من جميع العقد. ضمن هذا المكون ، تميزت معظم العقد بعدد صغير ، ومع ذلك ، كانت هناك نسبة صغيرة من المشاركين الذين لديهم عدد كبير من الجيران. رأينا أيضًا أن القطر ومتوسط المسافة بين المشاركين في الرسم البياني صغير: متوسط المسافة في المكون ضعيف الاتصال الذي يحتوي على 986 مشاركًا كان 2.1 فقط ، مما يعني أن معظم المشاركين متصلون ببعضهم البعض بعد "مصافحتين" فقط. بالإضافة إلى ذلك ، يتميز الرسم البياني بدرجة عالية من المعاملة بالمثل: حافظ 69٪ من جميع المشاركين على اتصال ثنائي الاتجاه مع بعضهم البعض.
ملاحظات
يمكن العثور على النص الكامل للبحث في كتاب نيكولاي فيكتوروفيتش أورسول "الحقيقة الكاملة حول الفوركس" (2019).
تم وصف البحث في مقال "تطبيق تحليل الشبكة الاجتماعية على المحاسبة والتدقيق" سلوبودان كاكانسكي ، دين لوشر (2017 ، رابط ).