Analisis jaringan sosial adalah proses mengeksplorasi berbagai sistem menggunakan teori jaringan. Ini mulai digunakan secara luas ketika menjadi jelas bahwa sejumlah besar jaringan yang ada (sosial, ekonomi, biologis) memiliki sifat universal: setelah mempelajari satu jenis, Anda dapat memahami struktur jaringan lain dan belajar cara membuat prediksi dari jaringan tersebut.
Setiap jaringan terdiri dari peserta individu (orang atau benda dalam jaringan) dan hubungan di antara mereka. Jaringan sangat sering divisualisasikan menggunakan grafik - struktur yang terdiri dari banyak titik dan garis yang merepresentasikan hubungan antara titik-titik ini. Peserta direpresentasikan sebagai node jaringan, dan hubungannya direpresentasikan sebagai garis yang menghubungkannya. Visualisasi semacam itu membantu mendapatkan penilaian jaringan secara kualitatif dan kuantitatif:
Angka: 1. Grafik arah yang menggambarkan perputaran uang antar bank yang membentuk pasar valuta asing (1). Bank Uni Eropa ditandai dengan warna merah, Amerika Utara - dengan warna biru, dan negara lainnya - dengan warna hijau.
Angka: 2. Grafik yang menunjukkan kerjasama mitra audit di Denmark tahun 2010-2014 (2)
Dengan menggunakan analisis jejaring sosial, dimungkinkan untuk menganalisis berbagai interaksi dan proses pertukaran sumber daya, baik material maupun informasional. Misalnya, dengan menganalisis jaringan transaksi antara klien bank (di mana node adalah klien bank, dan ujung-ujungnya adalah transfer di antara mereka), dimungkinkan untuk menentukan lingkaran orang yang terlibat dalam transaksi penipuan, atau untuk mengidentifikasi pelanggaran peraturan internal oleh karyawan bank.
Anda juga dapat membangun jaringan hubungan kerja (menggunakan contoh berbagai jenis komunikasi antar karyawan), yang dapat membantu dalam memahami struktur sosial organisasi dan posisi setiap karyawan dalam struktur ini. Dengan adanya data tentang jenis komunikasi untuk setiap karyawan, seseorang bahkan dapat menganalisis bagaimana karakteristik seperti kepemimpinan, pendampingan, dan kerja sama memengaruhi kariernya, dan, berdasarkan pengetahuan yang diperoleh, menentukan tujuan karier dan mengusulkan program pelatihan untuk mencapainya.
Selain itu, peristiwa dapat diprediksi menggunakan contoh jaringan. Misalnya, ada model yang memperkirakan kemungkinan kegagalan perangkat lunak, beberapa di antaranya menganggap orang sebagai sumber prediksi - lagipula, orang-orang yang mengembangkan dan menguji produk sebelum rilis. Interaksi mereka membentuk jaringan: Anda dapat menganggap pengembang sebagai node, dan apakah mereka bekerja bersama pada file yang sama dalam rilis yang sama, sebagai tepi jaringan. Memahami interaksi dan informasi tentang kegagalan sebelumnya akan memberi tahu banyak tentang keandalan produk akhir dan menunjukkan file yang paling mungkin gagal.
Sekarang mari kita coba menerapkan analisis jejaring sosial dalam praktiknya. Untuk melakukan ini, kita akan menggunakan bahasa pemrograman Python, atau lebih tepatnya pustaka networkx untuk bekerja dengan grafik, pustaka matplotlib untuk visualisasi, dan pustaka komunitas untuk menyorot komunitas dalam jaringan. Mari impor mereka:
1. import community
2. import networkx as nx
3. import matplotlib.cm as cm
4. import matplotlib.pyplot as plt
1. Mengimpor data dan mengubahnya menjadi grafik
Sebagai kumpulan data, mari kita ambil korespondensi email dari universitas besar Eropa, yang berisi informasi anonim tentang semua email masuk dan keluar antara anggota lembaga penelitian (tautan). Dataset berisi file txt di mana setiap baris mencantumkan pasangan node yang terkait satu sama lain.
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
Pada kode di atas, dataset telah diimpor dan diubah menjadi grafik. Kemudian kami secara berurutan menyimpulkan parameter utama grafik: jumlah node, tepi dan jumlah rata-rata tetangga node dalam grafik. Parameter terakhir mencerminkan seberapa dekat node terhubung satu sama lain.
2. Karakteristik utama grafik
Untuk memahami bagaimana Anda dapat bekerja dengan setiap grafik tertentu, Anda harus terlebih dahulu memahami cara kerjanya. Mari kita lihat sekilas karakteristik yang dengannya Anda dapat memahami struktur grafik.
Pertama-tama, pertimbangkan konsep konektivitas dan arah. Grafik disebut terhubung jika setiap pasangan node dalam grafik saling berhubungan, mis. dari simpul mana pun Anda bisa datang ke simpul lain. Jika grafik terputus, maka grafik tersebut dapat dibagi menjadi subgraf yang terhubung secara maksimal (disebut komponen). Juga, grafik dapat diarahkan dan tidak diarahkan. Ini ditentukan oleh adanya arah koneksi antara kedua partisipan. Salah satu contoh jaringan terarah adalah transaksi antar nasabah bank, di mana setiap nasabah dapat memiliki pembayaran masuk dan keluar.
Dalam kasus umum, dalam grafik terarah, koneksi tidak timbal balik; oleh karena itu, untuk grafik terarah, alih-alih konsep koneksi, konsep komponen koneksi lemah dan kuat dibedakan. Suatu komponen dianggap terhubung lemah jika mengabaikan arah menghasilkan grafik yang terhubung. Komponen konektivitas yang kuat dapat menjadi seperti itu jika semua simpulnya dapat dijangkau bersama. Mari kita lihat struktur grafik dari dataset email kita:
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(' .')
Grafiknya terarah dan terdiri dari beberapa komponen.
Di sini kami memeriksa arah dan konektivitas grafik dan menemukan bahwa grafik dari dataset diarahkan dan berisi beberapa komponen yang terputus. Mari kita lihat lebih dekat komponen terbesar dari konektivitas kuat dan lemah:
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
Jadi, kita telah mendapatkan karakteristik utama untuk komponen yang terkoneksi lemah dan untuk komponen terkoneksi kuat yang termasuk di dalamnya. Mari kita lihat kesimpulan apa yang bisa kita tarik pada tahap ini. Kami melihat dari 1005 peserta, 986 orang saling berkomunikasi, sedangkan 183 orang di antaranya mengirim email ke orang lain secara sepihak, dan hanya 803 orang yang melakukan komunikasi dua arah. Dalam 823 kasus, upaya untuk menjalin komunikasi melalui email gagal. Kami juga melihat bahwa peserta paling aktif (termasuk dalam komponen keterhubungan yang kuat) berkomunikasi dengan rata-rata 30 orang.
Mari kita lihat karakteristik utama grafik lainnya yang menentukan strukturnya. Grafik dianggap berbobot jika hubungan antara node mencerminkan tidak hanya keberadaan koneksi, tetapi juga bobot tertentu, yang mencerminkan kekuatan koneksi ini. Dataset kami dengan pesan email tidak berbobot, karena hanya memperhitungkan fakta korespondensi, tetapi bukan jumlah surat yang dikirim.
Selain itu, node dan tautan dapat membuat berbagai jenis jaringan: monokotil, dikotil, atau multi-level. Jaringan monokotil terdiri dari satu jenis peserta dan koneksi di antara mereka. Jaringan bipartit terdiri dari dua tipe partisipan yang berbeda, dimana salah satu tipe node dikaitkan hanya dengan tipe lainnya. Jaringan multilevel juga menyertakan dua tipe peserta, tetapi tautan bisa menghubungkan kedua tipe peserta yang berbeda dan tipe peserta yang sama (misalnya, hubungan antara manajer dan hubungan antar proyek). Dataset yang kami ambil untuk penelitian adalah jaringan monokotil, karena hanya terdiri dari satu jenis peserta dan koneksi di antara mereka.
3. Visualisasi grafik
Sekarang mari kita coba untuk memvisualisasikan dataset yang telah kita ambil. Untuk ini kita membutuhkan pustaka matplotlib, yang sudah kita impor di atas:
1. plt.figure(figsize=(15, 15))
2. plt.title('E-mails')
3. nx.draw(G, node_size=5)
4. plt.show()
Baris pertama menentukan ukuran gambar yang akan datang, yang kemudian diberi nama tertentu. Baris ketiga dari fungsi gambar melewati grafik dan menentukan ukuran node, setelah itu grafik ditampilkan di layar. Mari kita lihat:
Gambar. 3. Grafik interaksi pengguna dengan informasi tentang semua email yang masuk dan keluar antar anggota lembaga penelitian.
Pada grafik yang dihasilkan, kami melihat bahwa ada sejumlah titik yang tidak terhubung dengan peserta komunikasi lainnya. Orang-orang ini, yang tidak berhubungan dengan peserta lainnya, mendapatkan grafik, karena mereka mengirim surat secara eksklusif kepada diri mereka sendiri. Anda juga dapat melihat bahwa di pinggiran terdapat sejumlah titik yang terhubung dengan sisa grafik dengan beberapa koneksi masuk - ini adalah peserta yang termasuk dalam komponen yang terhubung secara lemah untuk grafik kami, tetapi tidak termasuk dalam komponen yang terhubung kuat.
Mari kita lihat juga grafik yang mengilustrasikan komponen keterhubungan yang kuat - orang-orang yang memiliki komunikasi dua arah dengan anggota lain dari lembaga penelitian:
Gambar. 4. Komponen konektivitas yang kuat dengan informasi tentang semua email masuk dan keluar antara anggota lembaga penelitian...
4. Derajat simpul dan distribusi derajat simpul
Sekarang setelah kita mengetahui struktur grafik kita dan dapat memvisualisasikannya, mari beralih ke analisis yang lebih detail. Setiap node dalam grafik memiliki derajat - jumlah tetangga terdekat dari node tersebut. Dalam jaringan terarah, seseorang dapat membedakan baik derajat masuk (jumlah koneksi masuk ke node) dan derajat keluar (jumlah koneksi keluar dari node). Jika kita menghitung derajat untuk setiap node pada grafik, kita dapat menentukan distribusi derajat dari node tersebut. Mari kita lihat grafik emailnya:
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()
Angka: 5. Distribusi derajat dalam grafik dengan informasi tentang semua email masuk dan keluar antara anggota lembaga penelitian
Pada grafik yang dihasilkan kita melihat distribusi derajat node: sejumlah besar node memiliki sedikit koneksi dengan tetangga, tetapi ada sejumlah kecil node besar yang memiliki sejumlah koneksi dengan orang lain peserta sangat besar. Tren ini disebut kekuatan hukum distribusi, dan ini sangat umum untuk jaringan besar. Undang-undang ini dapat menjelaskan distribusi penduduk di berbagai kota, peringkat situs di Internet, dan bahkan distribusi kekayaan di antara orang-orang.
5. Jalur, diameter dan jarak rata-rata pada grafik
Sekarang mari kita tentukan seberapa terhubung anggota grafik kita. Pertama, mari kita bicara tentang berbagai jenis jarak node.
Setiap urutan tepi yang menghubungkan node disebut jalur. Paling sering, penelitian mempertimbangkan jalur sederhana, yaitu jalur tanpa siklus dan node berulang. Jalur terpendek antara dua node disebut jarak geodetik. Jalur terpendek terpanjang dalam grafik disebut diameternya, tetapi sangat sensitif terhadap deviasi (satu rantai dalam grafik jutaan dolar dapat mengubah diameternya). Pada graf berarah, konsep diameter hanya dapat digunakan untuk komponen konektivitas yang kuat, karena untuk menghitung diameter perlu adanya jalur di antara setiap pasangan node. Dalam grafik tidak berarah, komponen yang dipertimbangkan cukup dihubungkan.
Karakteristik lain yang sangat informatif adalah jarak rata-rata antar node, yang dapat diperoleh dengan mengambil nilai rata-rata dari semua jalur terpendek dalam grafik. Jarak rata-rata ditentukan oleh struktur grafik: jika grafik dibangun dalam bentuk rantai, maka akan besar, tetapi semakin dekat simpul-simpul terhubung maka semakin kecil jarak rata-rata. Jarak rata-rata dapat dihitung untuk komponen yang terhubung kuat dan komponen yang terhubung lemah:
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
Mari kita lihat hasilnya. Diameter dalam hal ini menunjukkan kepada kita jarak maksimum antara dua orang asing, dan di sini, seperti dalam teori enam jabat tangan yang terkenal, jarak ini adalah 6. Jarak rata-rata dalam komponen juga kecil, rata-rata, dua "jabat tangan" sudah cukup untuk dua orang asing. Fenomena menarik juga dapat dilihat di sini: jarak rata-rata pada komponen yang terhubung kuat sedikit lebih rendah daripada pada komponen yang terhubung lemah. Hal ini dapat dijelaskan oleh fakta bahwa arah ikatan tidak diperhitungkan untuk komponen yang terhubung lemah (hanya fakta keberadaannya). Karenanya, sambungan pada komponen lemah muncul di mana komponen kuat tidak ada.
6. Pengelompokan dan alokasi komunitas
Setelah mengetahui jarak antara peserta, mari beralih ke fenomena lain yang mencerminkan bagaimana peserta dalam grafik terhubung satu sama lain: pengelompokan dan komunitas.
Koefisien cluster menunjukkan bahwa dua elemen grafik, yang terhubung melalui elemen ketiga, dengan tingkat probabilitas yang tinggi, terhubung satu sama lain. Bahkan jika mereka tidak ditautkan, kemungkinan bahwa mereka akan ditautkan di masa depan jauh lebih tinggi daripada dua node lain yang diambil secara acak. Fenomena ini, yang disebut pengelompokan atau transitivitas, sangat umum dalam grafik sosial.
Grafik dengan tingkat pengelompokan yang tinggi dicirikan dengan adanya sejumlah besar triplet yang terhubung (tiga node terhubung satu sama lain). Mereka adalah blok pembangun banyak jejaring sosial, di mana jumlah segitiga seperti itu sangat besar. Seringkali bahkan tidak muncul segitiga, tetapi seluruh formasi gugus, yang disebut komunitas, yang lebih erat kaitannya satu sama lain daripada dengan bagian grafik lainnya.
Mari kita lihat clustering dan koefisien cluster untuk komponen yang terhubung lemah:
1. print (': ', nx.transitivity(G_strong))
2. print (' : ', nx.average_clustering(G_strong))
: 0.2201493109315837
: 0.37270757578876434
Untuk komponen konektivitas yang kuat, kita dapat memperoleh karakteristik yang sama, dan juga menentukan jumlah node pusat (node ββyang paling dekat hubungannya dengan yang lain) dan jumlah node di pinggiran grafik:
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
Dalam kasus kedua, koefisien pengelompokan dan pengelompokan meningkat, mencerminkan bahwa komponen terhubung yang kuat berisi lebih banyak triplet terkait. Mari kita coba bersama untuk menentukan komunitas utama dalam komponen yang digabungkan secara longgar:
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
Jadi, di kolom korespondensi elektronik, 8 komunitas dapat dibedakan, yang lebih erat kaitannya satu sama lain dibandingkan dengan kolom lainnya. Komunitas terkecil memiliki 54 anggota, dan yang terbesar memiliki 188 anggota. Untuk jaringan yang berisi komunitas yang tumpang tindih atau bertingkat, akan lebih sulit untuk menentukan partisi yang optimal. Oleh karena itu, setiap kali Anda menjalankan kode, komposisi komunitas mungkin berbeda. Mari kita lihat visualisasi untuk perpecahan yang kita dapatkan:
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()
Angka: 6. Tampilan berbagai komunitas secara longgar digabungkan dengan informasi tentang semua email yang masuk dan keluar antar anggota lembaga penelitian
Pada grafik di atas terlihat sebaran partisipan menurut komunitas, dimana warna node menggambarkan kepemilikan komunitas tertentu.
7. Hubungan timbal balik
Selain properti yang sudah dijelaskan, ada juga yang disebut timbal balik dalam jaringan terarah. Karakteristik ini menggambarkan berapa persen dari tautan keluar yang memiliki umpan balik, tautan masuk. Untuk mengetahuinya, kami menggunakan fungsi khusus overall_reciprocity dari pustaka networkx dan melihat tingkat timbal balik dalam grafik dan komponennya:
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
Dalam 71% kasus, pengguna menerima balasan untuk pesan mereka dalam komponen konektivitas yang kuat. Untuk komponen yang terhubung secara lemah dan seluruh grafik secara keseluruhan, levelnya diperkirakan lebih rendah.
8. Sifat universal jaringan
Singkatnya, jaringan kompleks, secara umum, memiliki properti tertentu dan beberapa merupakan karakteristik dari banyak jaringan. Analisis kami atas kumpulan data email mendukung tren ini dengan baik:
- . , , . : web-, , , (Wikipedia, Microsoft). , .
- . , , Β« Β». : , .
- , , : 80% , . β , , . , , .
- , . , .
Kami menganalisis dan mengonfirmasi semua tren yang tercantum di atas untuk kumpulan data dengan korespondensi email: komponen besar yang terhubung ditemukan di grafik, berisi lebih dari 80% dari semua node. Dalam komponen ini, sebagian besar node dikarakterisasi oleh sejumlah kecil, namun, ada sebagian kecil peserta yang memiliki banyak tetangga. Kami juga melihat bahwa diameter dan jarak rata-rata antara partisipan dalam grafik kecil: jarak rata-rata dalam komponen terkoneksi lemah yang berisi 986 partisipan hanya 2,1, yang berarti bahwa sebagian besar partisipan terhubung satu sama lain setelah hanya dua "jabat tangan". Selain itu, grafik dicirikan oleh tingkat timbal balik yang tinggi: 69% dari semua peserta mempertahankan kontak dua arah satu sama lain.
Catatan
Teks lengkap dari penelitian ini dapat ditemukan dalam buku Nikolai Viktorovich Ursul "The Whole Truth About Forex" (2019).
Penelitian tersebut dijelaskan dalam artikel "Penerapan Analisis Jejaring Sosial pada Akuntansi dan Audit" Slobodan Kacanski, Dean Lusher (2017, link ).