Lewati ke konten utama

Analisis Jejaring Sosial di Python

Saat ini jaringan adalah bagian dari keseharian kita. Mari pelajari cara memvisualisasikan dan memahami jejaring sosial di Python menggunakan NetworkX.
· 12 mnt Baca

Jelajahi bersama AI

Jika Anda ingin mempelajari Analisis Jaringan, ikuti kursus Network Analysis in Python (Part 1) dari DataCamp.

Jaringan ada di mana-mana: jaringan jalan, jaringan teman dan pengikut di media sosial, serta jaringan rekan kantor. Jaringan memainkan peran penting dalam kehidupan kita sehari-hari, mulai dari menyebarkan informasi bermanfaat hingga memengaruhi pemilu nasional. Kemampuan menganalisis jaringan ini dan mengambil keputusan berdasarkan hasil analisis merupakan keterampilan penting bagi setiap analis data.

Fokus tutorial ini adalah mengajarkan social network analysis (SNA) menggunakan Python dan NetworkX, sebuah pustaka Python untuk mempelajari struktur, dinamika, dan fungsi jaringan kompleks. Tutorial ini berasumsi pembaca sudah memahami sintaks dasar Python; tidak diperlukan pengetahuan SNA sebelumnya.

Pendahuluan

Mari mulai dengan memahami apa yang dimaksud dengan Jejaring Sosial. Di bawah ini Anda melihat jaringan aktor Bollywood sebagai node. Mereka terhubung dengan garis tebal jika pernah bekerja sama setidaknya dalam satu film.

aktor bollywood

Terlihat bahwa Amitabh Bachchan dan Abhishek Bachchan pernah berakting dengan semua aktor dalam jaringan, sementara Akshay Kumar hanya pernah bekerja sama dengan dua Bachchan. Menarik, bukan!

Ini juga merupakan jejaring sosial. Setiap jaringan dengan koneksi antarindividu, di mana koneksi tersebut menangkap hubungan di antara mereka, adalah jejaring sosial. Menganalisis jaringan ini dapat memberikan wawasan berharga tentang orang-orang dalam jaringan, seperti siapa yang benar-benar berpengaruh, siapa yang paling terhubung, dan sebagainya.

Setiap jaringan terdiri dari:

  • Node: Individu yang jejaringnya sedang kita bangun. Dalam contoh di atas: para aktor.
  • Edge: Koneksi antar-node. Ini merepresentasikan hubungan antar-node dalam jaringan. Dalam contoh kita, hubungannya adalah para aktor pernah bekerja sama.

Membuat jaringan menggunakan NetworkX

Ada banyak jenis jaringan. Kita akan menggunakan NetworkX untuk membangun dan menganalisis berbagai jaringan ini. Untuk memulai, Anda perlu memasang NetworkX: Anda dapat menggunakan salah satu dari:

pip install networkx

atau jika bekerja di Anaconda

conda install -c anaconda networkx

Perintah ini akan memasang versi terbaru networkx. Kode dalam tutorial ini dijalankan pada Python=3.5, NetworkX = versi 2.0.

Jaringan Simetris

Jaringan aktor yang kita buat di atas adalah jaringan simetris karena hubungan "bekerja sama dalam sebuah film" bersifat simetris. Jika A berhubungan dengan B, maka B juga berhubungan dengan A. Mari kita buat jaringan yang kita lihat di atas menggunakan NetworkX.

Kita akan menggunakan metode Graph() untuk membuat jaringan baru dan add_edge() untuk menambahkan edge antara dua node.

import networkx as nx
G_symmetric = nx.Graph()
G_symmetric.add_edge('Amitabh Bachchan','Abhishek Bachchan')
G_symmetric.add_edge('Amitabh Bachchan','Aamir Khan')
G_symmetric.add_edge('Amitabh Bachchan','Akshay Kumar')
G_symmetric.add_edge('Amitabh Bachchan','Dev Anand')
G_symmetric.add_edge('Abhishek Bachchan','Aamir Khan')
G_symmetric.add_edge('Abhishek Bachchan','Akshay Kumar')
G_symmetric.add_edge('Abhishek Bachchan','Dev Anand')
G_symmetric.add_edge('Dev Anand','Aamir Khan')

Sekarang mari memvisualisasikan jaringan yang baru saja kita bangun menggunakan nx.draw_networkx(G_symmetric).

jaringan tervisualisasi

Jaringan Asimetris

Bagaimana jika hubungan antar-node adalah 'anak dari'? Maka hubungannya tidak lagi simetris. Jika A adalah anak dari B, maka B bukan anak dari A. Jaringan dengan hubungan yang asimetris (A berhubungan dengan B tidak serta-merta berarti B berhubungan dengan A) disebut jaringan asimetris. Kita dapat membangun jaringan asimetris di NetworkX menggunakan metode DiGraph, singkatan dari Directional Graph. Mari buat sebuah graf asimetris.

G_asymmetric = nx.DiGraph()
G_asymmetric.add_edge('A','B')
G_asymmetric.add_edge('A','D')
G_asymmetric.add_edge('C','A')
G_asymmetric.add_edge('D','E')

Sekarang kita visualisasikan. Kita bisa menggunakan fungsi draw_networkx() seperti sebelumnya. Namun, mungkin saja node tidak tersebar dan tidak terlihat jelas dalam jaringan yang digambar. Untuk mengatasinya, kita bisa menggunakan fungsi untuk memaksa tata letak, yang memosisikan node agar terlihat jelas. Kita dapat melakukannya dengan fungsi spring_layout(), lalu diikuti dengan fungsi draw_networkx().

nx.spring_layout(G_asymmetric)
nx.draw_networkx(G_asymmetric)

Di bawah ini Anda dapat melihat jaringan dengan dan tanpa menggunakan perintah tata letak. Yang dibuat dengan perintah tata letak terlihat lebih jelas.

jaringan tervisualisasi 2

Jaringan Berbobot

Sejauh ini kita menggunakan jaringan tanpa bobot, tetapi memungkinkan juga jaringan dibuat dengan bobot. Misalnya, jika pada jaringan awal kita mempertimbangkan jumlah film yang dikerjakan bersama sebagai bobot, kita akan mendapatkan Jaringan Berbobot. Mari buat lagi jaringan para aktor, tetapi kali ini kita tambahkan bobot pada jaringan; setiap edge memiliki bobot yang menandakan jumlah film yang mereka kerjakan bersama.

G_weighted = nx.Graph()
G_weighted.add_edge('Amitabh Bachchan','Abhishek Bachchan', weight=25)
G_weighted.add_edge('Amitabh Bachchan','Aaamir Khan', weight=8)
G_weighted.add_edge('Amitabh Bachchan','Akshay Kumar', weight=11)
G_weighted.add_edge('Amitabh Bachchan','Dev Anand', weight=1)
G_weighted.add_edge('Abhishek Bachchan','Aaamir Khan', weight=4)
G_weighted.add_edge('Abhishek Bachchan','Akshay Kumar',weight=7)
G_weighted.add_edge('Abhishek Bachchan','Dev Anand', weight=1)
G_weighted.add_edge('Dev Anand','Aaamir Khan',weight=1)
jaringan berbobot

Gambar di atas menampilkan jaringan berbobot para aktor dalam tata letak circular. Lebar edge menunjukkan bobot antara dua node.

Multigraf

Kita bisa memberikan atribut berbeda pada edge. Misalnya, kita bisa mendefinisikan relasi tetangga antara dua node 'A' dan 'B' menggunakan atribut relation. Jika dalam satu jaringan dua node dihubungkan dengan dua edge berbeda (relasi berbeda), kita memiliki multigraf. Kita dapat membuat multigraf menggunakan kelas MultiGraph.

G = nx.MultiGraph()
G.add_edge('A','B',relation ='neighbor')
G.add_edge('A','B',relation='friend)
G.add_edge('B','C', relation='neighbor')
G.add_edge('D','C',relation='friend')

Kode ini akan membangun graf dengan dua edge antara A dan B. Kita dapat memeriksa koneksi menggunakan G.edges(), keluarannya akan menampilkan:

MultiEdgeDataView([('A', 'B', {'relation': 'neighbor'}), ('A', 'B', {'relation': 'friend'}), ('B', 'C', {'relation': 'neighbor'}), ('B', 'D', {'relation': 'neighbor'}), ('C', 'D', {'relation': 'friend'})])

Konektivitas Jaringan

Sekarang jaringannya sudah dibuat, bisakah kita mengetahui lebih banyak tentang node tertentu dalam jaringan? Tentu saja, mari kita telusuri beberapa di antaranya.

Derajat (Degree)

Derajat sebuah node mendefinisikan jumlah koneksi yang dimilikinya. NetworkX memiliki fungsi degree yang dapat kita gunakan untuk menentukan derajat sebuah node dalam jaringan.

nx.degree(G_symmetric, 'Dev Anand`)

Ini akan mengembalikan nilai 3, karena Dev Anand hanya pernah bekerja sama dengan tiga aktor dalam jaringan.

Koefisien Klaster

Teramati bahwa orang-orang yang berbagi koneksi dalam jejaring sosial cenderung membentuk asosiasi. Dengan kata lain, ada kecenderungan dalam jejaring sosial untuk membentuk klaster. Kita dapat menentukan klaster suatu node, yaitu Koefisien Klaster Lokal, yang merupakan fraksi dari pasangan teman node (koneksinya) yang saling terhubung. Untuk menentukan koefisien klaster lokal, kita menggunakan fungsi nx.clustering(Graph, Node).

Dalam jaringan simetris para aktor, Anda akan menemukan bahwa Dev Anand memiliki koefisien klaster lokal sebesar 1 dan Abhishek Bachchan memiliki koefisien klaster lokal sebesar 0,67.

Rata-rata koefisien klaster (jumlah semua koefisien klaster lokal dibagi jumlah node) untuk jaringan simetris para aktor adalah 0,867. Kita bisa mendapatkannya menggunakan:

nx.average_clustering(G_symmetric)

Jarak

Kita juga dapat menentukan lintasan terpendek antara dua node dan panjangnya di NetworkX menggunakan fungsi nx.shortest_path(Graph, Node1, Node2) dan nx.shortest_path_length(Graph, Node1, Node2).

Menjalankan

nx.shortest_path(G_symmetric, 'Dev Anand', 'Akshay Kumar')

Mengembalikan

['Dev Anand', 'Amitabh Bachchan', 'Akshay Kumar']

Kita dapat menemukan jarak sebuah node dari setiap node lain dalam jaringan menggunakan algoritma breadth-first search, mulai dari node tersebut. NetworkX menyediakan fungsi bfs_tree untuk melakukannya. Jadi jika Anda mencoba T = nx.bfs_tree(G_symmetric, 'Dev Anand') dan lalu menggambar pohon ini, kita akan mendapatkan struktur jaringan yang memberi tahu bagaimana kita dapat mencapai node-node lain dalam jaringan mulai dari Dev Anand

node

Eksentrisitas

Eksentrisitas sebuah node A didefinisikan sebagai jarak terbesar antara A dan semua node lainnya. Ini dapat ditemukan menggunakan fungsi nx.eccentricity(). Dalam jaringan simetris para aktor, Dev Anand memiliki eksentrisitas 2, dan Abhishek Bachchan memiliki eksentrisitas 1 (terhubung ke semua).

Influencer Jaringan

Di atas kita mempelajari beberapa ukuran jarak jaringan; ukuran-ukuran ini berguna untuk mengetahui bagaimana informasi akan menyebar melalui jaringan. Pada bagian ini, kita akan mempelajari cara menemukan node (individu) paling penting dalam jaringan. Parameter-parameter ini disebut ukuran sentralitas.

Ingat siswi paling populer di sekolah menengah Anda atau pemain baseball andalan sekolah? Mereka adalah orang-orang yang bisa membuat pengalaman sekolah Anda menjadi sangat buruk atau sangat menyenangkan. Apa yang memberi mereka kekuatan ini? Ukuran Sentralitas dapat membantu kita mengidentifikasi popularitas, yang paling disukai, dan influencer terbesar dalam jaringan.

Sentralitas Derajat

Mereka yang paling populer atau paling disukai biasanya memiliki lebih banyak teman. Sentralitas derajat adalah ukuran jumlah koneksi yang dimiliki node tertentu dalam jaringan. Ini didasarkan pada fakta bahwa node penting memiliki banyak koneksi. NetworkX memiliki fungsi degree_centrality() untuk menghitung sentralitas derajat semua node dalam sebuah jaringan.

Sentralitas Eigenvector

Bukan hanya berapa banyak individu yang terhubung dengan seseorang, tetapi juga siapa yang terhubung dengannya yang dapat menentukan pentingnya sebuah node. Di jalanan Delhi, ketika polisi lalu lintas menangkap seseorang karena melanggar aturan, kalimat pertama yang sering terdengar adalah "Apakah Anda tahu saya berhubungan dengan siapa?".

Sentralitas eigenvector mengukur hal ini secara tepat. Ukuran ini menyatakan bahwa sebuah node penting jika terhubung dengan node-node penting lainnya. Kita bisa menggunakan fungsi eigenvector_centrality() dari NetworkX untuk menghitung sentralitas eigenvector semua node dalam jaringan.

Algoritma Pagerank Google adalah varian dari algoritma sentralitas eigenvector.

Sentralitas Keterjembatan (Betweenness)

Sentralitas betweenness adalah sentralitas kendali. Ini merepresentasikan frekuensi suatu titik muncul pada geodesik (lintasan terpendek) yang menghubungkan pasangan titik. Ukuran ini mengkuantifikasi berapa kali sebuah node tertentu muncul pada lintasan terpendek yang dipilih antara dua node lain. Node dengan sentralitas betweenness tinggi memainkan peran penting dalam aliran komunikasi/informasi dalam jaringan. Node-node tersebut dapat memiliki kendali strategis dan pengaruh terhadap yang lain. Individu pada posisi strategis semacam itu dapat memengaruhi seluruh kelompok, dengan menahan atau memodifikasi informasi yang ditransmisikan.

NetworkX memiliki fungsi betweenness_centrality() untuk mengukurnya pada jaringan. Fungsi ini menyediakan opsi untuk memilih apakah nilai betweenness akan dinormalisasi atau tidak, apakah bobot akan disertakan dalam perhitungan sentralitas atau tidak, serta apakah titik ujung akan disertakan dalam perhitungan jumlah lintasan terpendek atau tidak.

Menggabungkan semuanya

Mari mulai dengan data Facebook; untuk analisis di sini kita akan menggunakan dataset combined ego networks Facebook, yang memuat jaringan gabungan dari daftar teman Facebook milik sepuluh individu. Anda dapat mengunduh berkas facebook_combined.txt dari situs Stanford University.

Anda dapat memperoleh data Facebook/Twitter Anda sendiri menggunakan API Facebook/Twitter. Nantikan tutorial selanjutnya di mana kita akan mempelajari cara menggunakan API Facebook dan Twitter untuk mendapatkan data dan menggunakan informasi yang dipelajari di sini untuk menganalisisnya.

Kita baca berkasnya dan bangun Graf:

G_fb = nx.read_edgelist("facebook_combined.txt", create_using = nx.Graph(), nodetype=int)

Jaringan ini terdiri dari 4.039 node, terhubung melalui 88.234 edge! Ya, ini jaringan besar. Anda bisa mendapatkan informasi tersebut menggunakan fungsi info().

[In]: print(nx.info(G_fb))


[Out]: Name:
       Type: Graph
       Number of nodes: 4039
       Number of edges: 88234
       Average degree:  43.6910

Di bawah ini Anda dapat melihat jaringannya:

jaringan

Kita juga dapat memvisualisasikan jaringan sehingga warna node bervariasi sesuai Derajat dan ukuran node sesuai Sentralitas Betweenness. Kode untuk melakukannya adalah:

pos = nx.spring_layout(G_fb)
betCent = nx.betweenness_centrality(G_fb, normalized=True, endpoints=True)
node_color = [20000.0 * G_fb.degree(v) for v in G_fb]
node_size =  [v * 10000 for v in betCent.values()]
plt.figure(figsize=(20,20))
nx.draw_networkx(G_fb, pos=pos, with_labels=False,
                 node_color=node_color,
                 node_size=node_size )
plt.axis('off')

Dan graf yang dihasilkan adalah:

graf hasil

Anda juga dapat mengetahui label node dengan sentralitas betweenness tertinggi menggunakan:

sorted(betCent, key=betCent.get, reverse=True)[:5]

Tabel di bawah ini mencantumkan lima label node dengan ukuran sentralitas tertinggi.

Sentralitas DerajatSentralitas EigenvectorSentralitas Betweenness
1071912107
168422661684
191222063437
343722331912
024641085

Kita dapat melihat bahwa beberapa node sama antara Sentralitas Derajat, yang mengukur derajat, dan Sentralitas Betweenness yang mengendalikan aliran informasi. Wajar jika node yang lebih terhubung juga berada pada lintasan terpendek antara node-node lain. Node 1912 adalah node penting karena krusial menurut ketiga ukuran sentralitas yang kita pertimbangkan.

Referensi

  • Data aktor diperoleh dari situs IMDB
  • Tempat terbaik untuk mengetahui lebih lanjut tentang NetworkX dan fungsinya adalah dokumentasinya

Jika Anda ingin mempelajari lebih lanjut tentang Social Network Analysis di Python, ikuti kursus Analyzing Social Media Data in Python dari DataCamp.

Topik

Terkait

blogs

Spaghetti Plot dan Jalur Badai

blogs

Tutorial Korelasi di R

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026