Prasyarat SNA-01:
- SMA-01: https://taudata.blogspot.com/2022/04/sma-01.html (Memahami dasar Social Media Analytics dengan baik)
- ADSP-01 & 02: https://taudata.blogspot.com/2022/04/adsp-01.html (Memahami dasar Python dengan baik)
- Kalkulus Dasar
Code Lesson SNA-01:
Code dari lesson ini dapat di akses di Link berikut (wajib login ke Google/Gmail): Code SNA-01
Di link tersebut anda langsung bisa merubah code dan menjalankannya. Keterangan lebih lanjut di Video.
Sangat disarankan untuk membuka code dan video "side-by-side" untuk mendapatkan pengalaman belajar yang baik (Gambar dibawah). SIlahkan modifikasi (coba-coba) hal lain, selain yang ditunjukkan di video untuk mendapatkan pengalaman belajar yang lebih mendalam. Tentu saja juga silahkan akses berbagai referensi lain untuk memperkaya pengetahuan lalu diskusikan di forum yang telah disediakan.
Social Network Analysis (SNA)
https://taudata.blogspot.com
SNA-01: Pendahuluan Analisa Jaringan Sosial
https://taudata.blogspot.com/2022/04/sna-01.html
(C) Taufik Sutanto
Outline:¶
- Basic Graph in NetworkX (Python)
- Creating Graph (adding nodes & Edges, and weights)
- Basic Visualization
- Degree, shortest path, Spanning Tree
- Social Network Analytics
- Community Detection
- Partition Analysis
- Centrality Analysis
- Advanced Visualization
import warnings; warnings.simplefilter('ignore')
import nltk
try:
import google.colab
IN_COLAB = True
!wget https://raw.githubusercontent.com/taudata-indonesia/eLearning/master/taudataEDA02CTA.py
!wget https://raw.githubusercontent.com/taudata-indonesia/eLearning/master/taudata_sna.py
!mkdir data
!wget -P data/ https://raw.githubusercontent.com/taudata-indonesia/eLearning/master/data/slang.dic
!wget -P data/ https://raw.githubusercontent.com/taudata-indonesia/eLearning/master/data/slang.txt
!wget -P data/ https://raw.githubusercontent.com/taudata-indonesia/eLearning/master/data/stopwords_id.txt
!wget -P data/ https://raw.githubusercontent.com/taudata-indonesia/eLearning/master/data/stopwords_en.txt
!wget -P data/ https://raw.githubusercontent.com/taudata-indonesia/eLearning/master/data/kata_dasar.txt
!wget -P data/ https://raw.githubusercontent.com/taudata-indonesia/eLearning/master/data/wn-ind-def.tab
!wget -P data/ https://raw.githubusercontent.com/taudata-indonesia/eLearning/master/data/wn-msa-all.tab
!wget -P data/ https://raw.githubusercontent.com/taudata-indonesia/eLearning/master/data/ind_SA.csv
!wget -P data/ https://raw.githubusercontent.com/taudata-indonesia/eLearning/master/data/all_indo_man_tag_corpus_model.crf.tagger
!pip install --upgrade spacy python-crfsuite unidecode textblob sastrawi sklearn-pycrfsuite
!pip install --upgrade unidecode twython tweepy beautifulsoup4 pyLDAvis
!pip install --upgrade networkx scipy
!python -m spacy download xx_ent_wiki_sm
!python -m spacy download en_core_web_sm
nltk.download('popular')
except:
IN_COLAB = False
print("Running the code locally, please make sure all the python module versions agree with colab environment and all data/assets downloaded")
# import beberapa module yg dibutuhkan di WorkShop ini:
import graphviz, taudata_sna as tau
import time, numpy as np, matplotlib.pyplot as plt, pandas as pd, networkx as nx
import pyLDAvis, pyLDAvis.sklearn; pyLDAvis.enable_notebook()
from graphviz import Digraph
Tipe Graph di Python (NetworkX)¶
# Di NetworkX: inisialisasi graph kosong dilakukan seperti ini:
G1 = nx.Graph() # Di kesempatan ini Graph tak Berarah ini yang akan lebih banyak kita gunakan
G2 = nx.DiGraph()
G3 = nx.MultiGraph()
G4 = nx.MultiDiGraph()
Contoh Graph Umum¶
G = nx.complete_graph(5)
G
Visualisasi Graph¶
- Graph mirip vector: tidak memiliki info lokasi
- Maka pertama kali kita tentukan cara menggambar vertexnya dulu: pos (position)
# Contoh
pos = nx.spiral_layout(G)
pos
# Menggambar
nx.draw_networkx_nodes(G,pos) # ini sekedar menggambar noktah vertex
nx.draw_networkx_labels(G,pos) # ini kemudian memberikan label di setiap vertex pada langkah sebelumnya
nx.draw_networkx_edges(G,pos) # ini menggambar edge di graph G
plt.show()
# Contoh lain
G = nx.wheel_graph(7)
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G,pos) # ini sekedar menggambar noktah vertex
nx.draw_networkx_labels(G,pos) # ini kemudian memberikan label di setiap vertex pada langkah sebelumnya
nx.draw_networkx_edges(G,pos) # ini menggambar edge di graph G
plt.show()
# Contoh lain lagi
import networkx as nx, matplotlib.pyplot as plt
g = nx.karate_club_graph()
pos = nx.spring_layout(g) # Spring LayOut
nx.draw_networkx_nodes(g,pos, alpha=0.2,node_color='blue',node_size=600) # Gambar Vertex
nx.draw_networkx_edges(g,pos,width=2,alpha=0.1) # Gambar edges
nx.draw_networkx_labels(g,pos) #Gambar Label Nodes
plt.show() # Show the graph
for node in g.edges(data=True):
print(node)
break
for u,v in g.edges():
print(u,v, end=', ')
f = Digraph('finite_state_machine', filename='fsm.gv')
f.attr(rankdir='LR', size='8,5')
f.attr('node', shape='doublecircle')
f.node('LR_0')
f.node('LR_3')
f.node('LR_4')
f.node('LR_8')
f.attr('node', shape='circle')
f.edge('LR_0', 'LR_2', label='SS(B)')
f.edge('LR_0', 'LR_1', label='SS(S)')
f.edge('LR_1', 'LR_3', label='S($end)')
f.edge('LR_2', 'LR_6', label='SS(b)')
f.edge('LR_2', 'LR_5', label='SS(a)')
f.edge('LR_2', 'LR_4', label='S(A)')
f.edge('LR_5', 'LR_7', label='S(b)')
f.edge('LR_5', 'LR_5', label='S(a)')
f.edge('LR_6', 'LR_6', label='S(b)')
f.edge('LR_6', 'LR_5', label='S(a)')
f.edge('LR_7', 'LR_8', label='S(b)')
f.edge('LR_7', 'LR_5', label='S(a)')
f.edge('LR_8', 'LR_6', label='S(b)')
f.edge('LR_8', 'LR_5', label='S(a)')
f.view()
with open("fsm.gv") as f:
dot_graph = f.read()
graphviz.Source(dot_graph)
G = nx.Graph() # Graph Kosong
G
G.nodes(), G.edges()
# ini adalah cara sederhana menambahkan node ke graph satu persatu
G.add_node(1)
G.add_node(99)
G.add_node(1) # "Himpunan"
print(G.nodes())
# ini cara menambahkan array of vertices ke Graph kita
V = [1,2,5,6,8,33,65,88] # vertices
for vertex in V:
G.add_node(vertex)
print( G.nodes() )
print( G.edges() )
# ini cara menambahkan Edge secara manual satu per satu
G.add_edge(5, 8)
G.add_edge(8, 65)
print( G.nodes() )
print( G.edges() )
# Kita bisa menambahkan edge walaupun di Graph kita belum ada vertexnya, vertex tersebut akan automatis ditambahkan ke graphnya
# ini cara menambahkan Edge secara manual satu per satu
# misal di contoh ini vertex 77 dan vertex "A" tidak ada sebelumnya di Graph G
G.add_edge(77, 8)
G.add_edge('Depok', 88)
print( G.nodes() )
print( G.edges() )
# ini memahami bagaimana looping atas Array dari pasangan terurut dilakukan di python
E = [(1,33), (1,88), (6,88), (2,5), (2,8)]
for sisi in E:
G.add_edge(sisi[0], sisi[1])
print( G.nodes() )
print( G.edges() )
plt.subplots(figsize=(12,8))
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G,pos) # ini sekedar menggambar noktah vertex
nx.draw_networkx_labels(G,pos) # ini kemudian memberikan label di setiap vertex pada langkah sebelumnya
nx.draw_networkx_edges(G,pos) # ini menggambar edge di graph G
plt.show()
# Cara lain
G = nx.Graph() # Graph Kosong Baru
V = [1, 2, 7, 9, 12, 19] # Bisa juga string, misal "A" atau nama "Budi"
E = [(1,2), (2,19), (9,2), (9,1), (2,8), (8,10), (12,7),(7,2), (7,9)] # Perhatikan "8" dan "10" TIDAK ADA di V
G.add_nodes_from(V)
G.add_edges_from(E)
print('Banyak vertex = ', G.number_of_nodes())
print('Banyak Edges = ', G.number_of_edges())
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G,pos, alpha=0.9,node_color='green',node_size=800) # ini sekedar menggambar noktah vertex
nx.draw_networkx_labels(G,pos) # ini kemudian memberikan label di setiap vertex pada langkah sebelumnya
nx.draw_networkx_edges(G,pos) # ini menggambar edge di graph G
plt.show()
Manipulasi graph: Menghapus Node atau sub-graph¶
v = [7, 12, 19]
G.remove_nodes_from(v)
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G,pos, alpha=0.8,node_color='green',node_size=800) # ini sekedar menggambar noktah vertex
nx.draw_networkx_labels(G,pos) # ini kemudian memberikan label di setiap vertex pada langkah sebelumnya
nx.draw_networkx_edges(G,pos) # ini menggambar edge di graph G
plt.show()
Remove Edges¶
E = [(1,9)]
G.remove_edges_from(E)
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G,pos, alpha=0.8,node_color='green',node_size=800) # ini sekedar menggambar noktah vertex
nx.draw_networkx_labels(G,pos) # ini kemudian memberikan label di setiap vertex pada langkah sebelumnya
nx.draw_networkx_edges(G,pos, edge_color='blue') # ini menggambar edge di graph G
plt.show()
Adding Graph weights/properties¶
V = ['Depok', 'Jakarta', 'Bogor', 'Bekasi', 'Tangerang']
Vluas = [12.3, 44.5, 1.2, 0.6, 23] # contoh parameter "luas"
E = [('Depok', 'Bogor'), ('Jakarta', 'Bekasi'), ('Bekasi', 'Bogor'),
('Depok', 'Bekasi'), ('Tangerang', 'Bekasi')] # ini adalah edgenya
# ini "contoh" nanti jadi parameter ke-2 dari setiap Edge di E
Ejrk = [22.4, 1.2, 5.6, 7.8, 9]
G = nx.Graph() # graph sebelumnya tertimpa dan jadi Graph kosong kembali
# Kemudian kita akan tambahkan vertex, edge, beserta setiap parameter yg didefinisikan di atas ke graph G
for vertex, area in zip(V, Vluas):
# nama variable parameter di setiap vertexnya di contoh ini adalah "waktu" dan "orang"
G.add_node(vertex, luas=area)
for sisi, dist in zip(E, Ejrk):
G.add_edge(sisi[0], sisi[1], jarak=dist)
print(G.nodes())
print(G.edges())
print('Luas Depok = ', G.nodes['Depok']['luas'])
plt.subplots(figsize=(12,8))
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G,pos,node_size=3000) # ini sekedar menggambar noktah vertex
nx.draw_networkx_labels(G,pos) # ini kemudian memberikan label di setiap vertex pada langkah sebelumnya
nx.draw_networkx_edges(G,pos) # ini menggambar edge di graph G
nx.draw_networkx_edge_labels(G,pos,edge_labels=nx.get_edge_attributes(G,'jarak')) # ini label dari edgenya
plt.show()
Degree/Derajat Vertex
d = nx.degree(G)
d
[d[node] for node in G.nodes()]
Menggunakan degree untuk membuat gambar graph yang lebih baik¶
plt.subplots(figsize=(12,8))
pos = nx.spring_layout(G) # Spring LayOut
D = [d[node]*1000 for node in G.nodes()]
nx.draw_networkx_nodes(G,pos,node_size=D) # Gambar Vertex
nx.draw_networkx_edges(G,pos,width=2,alpha=0.15) # Gambar edges
nx.draw_networkx_labels(G,pos) #Gambar Label Nodes
plt.show() # Show the graph
Menambahkan informasi warna¶
plt.subplots(figsize=(12,8))
warna = D
pos = nx.spring_layout(G) # Spring LayOut
nx.draw_networkx_nodes(G,pos, node_color=warna,node_size=D, alpha=0.5) # Gambar Vertex
nx.draw_networkx_edges(G,pos,width=2,alpha=0.1) # Gambar edges
nx.draw_networkx_labels(G,pos) #Gambar Label Nodes
plt.show() # Show the graph
(Shortest) Path
SP = nx.shortest_path(G, source='Jakarta', target='Bogor')
SP
H = G.subgraph(SP)
pos = nx.spring_layout(H) # Spring LayOut
nx.draw_networkx_nodes(H,pos,alpha=0.5) # Gambar Vertex
nx.draw_networkx_edges(H,pos,width=2,alpha=0.1) # Gambar edges
nx.draw_networkx_labels(H,pos) #Gambar Label Nodes
plt.show() # Show the graph
Graph From Social media
Mentions, Followers, Friends
Centrality Analysis
Bertujuan untuk menemukan pengguna yang paling berpengaruh dalam suatu topik pembicaraan di media sosial. Analisanya biasanya dilakukan melalui data graph dari hubungan jaringan pertemanan (follower/friend) antar pengguna atau komunikasi antar pengguna (mentions).
Community Detection
CD dilakukan pada data jaringan media sosial untuk menemukan komunitas-komunitas dalam pertemanan atau pembicaraan di media sosial. Secara sederhana CD dapat dimengerti sebagai proses clustering (pengelompokan) , namun atas suatu graph.
Case Study: twitter¶
- Gunakan FireFox untuk menuju ke URL: https://twitter.com/search-advanced
- Gunakan sembarang keywords untuk mengambil sampel status media sosial (misal trending topic)
- Save as html complete (misal data.html)
- Upload ke Google Colab
# import data
import taudataEDA02CTA as tau2
import graphviz, taudata_sna as tau
import json, urllib.request, requests, tweepy
from urllib.request import Request, urlopen
from tqdm import tqdm
# Contoh API Keys (Sesuaikan dengan API keys masing-masing)
Ck = 'NKrHwVBVDMAKVOv' # consumer_key
Cs = '8dDb7cYmaP1YIX8ueb5LuQWJfRL4QEvp' # consumer_secret
At = '2214118411-lyBCVZ2TN5q0HaHWxU' # access_token
As = 'SzSYbjjDiAx4v2DIJbQ6byifcF' # access_secret
'Done'
# Pengambilan Data dan-atau Loading Data
qry = "data Indonesia" # Ganti dengan sembarang query lain
tweetFile = 'D:/Desktop/tweet_{}_EDA02CTA.json'.format(qry) # RUBAH Path ini
try:
data = tau2.loadTweets(file=tweetFile)
print("Local Data loaded, processing {} tweets.".format(len(data)))
except Exception as Err_:
print("Local data not available, importing data directly from twitter ... ")
api = tau2.connect(key=(Ck, Cs, At, As))
data = tau2.crawlTwitter(api, qry, N=1000)
tau2.saveTweets(data, file=tweetFile) # Save untuk lain waktu
tweets = [t['full_text'] for t in data] # Hanya mengambil tweeet saja .
Usernames = [t['user']['screen_name'] for t in data] # Hanya mengambil username saja .
Usernames[:5]
# Draw the Tweet Graph
plt.subplots(figsize=(12,8))
G = tau.Graph([Usernames,tweets], Label = False, layOut='circular', plain=True) # layOut = spring, circular, random, shells, spectral
I. Centrality Analysis
Bertujuan untuk menemukan pengguna yang paling berpengaruh dalam suatu topik pembicaraan di media sosial. Analisanya biasanya dilakukan melalui data graph dari hubungan jaringan pertemanan (follower/friend) antar pengguna atau komunikasi antar pengguna (mentions).
Centrality by Degree
Apakah interpretasinya?¶
# Let's now examine, who are the most "important" users in this Graph?
Gt = tau.Centrality(G, N=10, method='degree', outliers=False, Label = True, layOut='spring')
tau.drawGraph(Gt, True, layOut='circular')
Closeness Centrality
Gt = tau.Centrality(G, N=10, method='closeness', outliers=False, Label = True, layOut='spring')
tau.drawGraph(Gt, True, layOut='circular')
Betweenness Centrality
Gt = tau.Centrality(G, N=10, method='betweeness', outliers=False, Label = True, layOut='spring')
tau.drawGraph(Gt, True, layOut='circular')
Gt = tau.Centrality(G, N=10, method='eigen', outliers=False, Label = True, layOut='spring')
tau.drawGraph(Gt, True, layOut='circular')
Summary
Centrality dapat digunakan untuk membuat visualisasi graph yang lebih baik¶
plt.subplots(figsize=(12,8))
g = nx.karate_club_graph()
pos = nx.spring_layout(g) # Spring LayOut
nx.draw_networkx_nodes(g,pos, alpha=0.2,node_color='blue',node_size=600) # Gambar Vertex
nx.draw_networkx_edges(g,pos,width=2,alpha=0.1) # Gambar edges
nx.draw_networkx_labels(g,pos) #Gambar Label Nodes
plt.show() # Show the graph
# Menggunakan Centrality measure (misal degree) untuk merubah ukuran node
plt.subplots(figsize=(12,8))
K = 100 # Scale factor
d = nx.degree(g)
d = [d[node]*K for node in g.nodes()]
pos = nx.spring_layout(g) # Spring LayOut
nx.draw_networkx_nodes(g,pos,node_size=d) # Gambar Vertex
nx.draw_networkx_edges(g,pos,width=2,alpha=0.15) # Gambar edges
nx.draw_networkx_labels(g,pos) #Gambar Label Nodes
plt.show() # Show the graph
print(d)
# Menggunakan tingkat "kepentingan" sebagai warna
ranking = nx.degree_centrality(g)
warna = list(ranking.values())
print(warna)
plt.subplots(figsize=(12,8))
pos = nx.spring_layout(g) # Spring LayOut
nx.draw_networkx_nodes(g,pos, node_color=warna,node_size=d) # Gambar Vertex
nx.draw_networkx_edges(g,pos,width=2,alpha=0.1) # Gambar edges
nx.draw_networkx_labels(g,pos) #Gambar Label Nodes
plt.show() # Show the graph
Bipartition (Bisection) Partitioning¶
- This algorithm paritions a network into two sets by iteratively swapping pairs of nodes to reduce the edge cut between the two sets.
- https://www.youtube.com/watch?v=MMlf66PQdN8
- Paper: Kernighan, B. W.; Lin, Shen (1970). “An efficient heuristic procedure for partitioning graphs.” Bell Systems Technical Journal 49: 291–307. Oxford University Press 2011.
B = nx.algorithms.community.kernighan_lin_bisection(g)
B
warna = []
for v in B[0]:
warna.append(1)
for v in B[1]:
warna.append(2)
pos = nx.shell_layout(g, B)
nx.draw_networkx_nodes(g,pos, node_color=warna,node_size=d) # Gambar Vertex
nx.draw_networkx_edges(g,pos,width=2,alpha=0.1) # Gambar edges
nx.draw_networkx_labels(g,pos) #Gambar Label Nodes
plt.show() # Show the graph
Graph Clustering via "Modularity"¶
- Modules biasa disebut juga groups, clusters atau communities
- Terdapat berbagai cara dalam menghitung "Modularity" (contoh dibawah)
- Graph with high modularity have dense connections between the nodes within "modules" but sparse connections between nodes in different modules.
- Salah satu metodenya : Greedy Modularity Maximization (GMM)
- GMM begins with each node in its own community and joins the pair of communities that most increases modularity until no such pair exists.
- Clauset, A., Newman, M. E., & Moore, C. “Finding community structure in very large networks.” Physical Review E 70(6), 2004.
- Other resources for study: https://slideplayer.com/slide/7050174/
# WARNING!!!... Hanya bisa jika networkX versi 2.2 ke atas
M = nx.algorithms.community.greedy_modularity_communities(g)
print(M)
W = []
warna = 1
for module in M:
for node in module:
W.append(warna)
warna = warna +1
print(W)
K = 100 # Scale factor
d = nx.degree(g)
d = [d[node]*K for node in g.nodes()]
plt.subplots(figsize=(12,8))
pos = nx.shell_layout(g, M)
nx.draw_networkx_nodes(g,pos, node_color=W,node_size=d) # Gambar Vertex
nx.draw_networkx_edges(g,pos,width=2,alpha=0.1) # Gambar edges
nx.draw_networkx_labels(g,pos) #Gambar Label Nodes
plt.show() # Show the graph
II. Community Detection (CD)
CD dilakukan pada data jaringan media sosial untuk menemukan komunitas-komunitas dalam pertemanan atau pembicaraan di media sosial. Secara sederhana CD dapat dimengerti sebagai proses "semacam clustering" (pengelompokan) , namun atas suatu graph.
# Clustering pada Graph = Community Detection
Gt = nx.algorithms.community.greedy_modularity_communities(G)
for community in Gt:
print(community)
End of Module.
Referensi Social Network Analytics (SNA):
- PM, K. R., Mohan, A., & Srinivasa, K. G. (2018). Practical Social Network Analysis with Python. Springer International Publishing.
- Fu, X., Luo, J. D., & Boos, M. (Eds.). (2017). Social network analysis: interdisciplinary approaches and case studies. CRC Press.
- Siddhartha Chatterjee, Michal Krystyanczuk. (2017).Python Social Media Analytics. Packt Publishing Ltd.
- Farzindar, A., & Inkpen, D. (2017). Natural language processing for social media. Synthesis Lectures on Human Language Technologies, 10(2), 1-195.
- Kao, A., & Poteet, S. R. (Eds.). (2007). Natural language processing and text mining. Springer Science & Business Media.
Tidak ada komentar:
Posting Komentar
Relevant & Respectful Comments Only.