ทำความเข้าใจ Twitter Dynamics ด้วย R และ Gephi: การวิเคราะห์ข้อความและศูนย์กลาง
เผยแพร่แล้ว: 2022-07-22บทความนี้จะขยายและเจาะลึกการวิเคราะห์ที่นำเสนอในภาคแรกของชุดการวิเคราะห์เครือข่ายสังคมออนไลน์ของเรา เราใช้ชุดข้อมูล Twitter และเครือข่ายการโต้ตอบเดียวกันที่สร้างขึ้นในบทความแรก อย่างไรก็ตาม คราวนี้ แนวคิดคือการอนุมานตัวแสดงหลักได้ดีขึ้น ระบุหัวข้อการสนทนาของพวกเขา และทำความเข้าใจว่าหัวข้อเหล่านี้แพร่กระจายไปอย่างไร
ศูนย์กลางเครือข่ายสังคม
เพื่อให้บรรลุเป้าหมาย อันดับแรก เราต้องแนะนำแนวคิดเรื่องความเป็น ศูนย์กลาง ในวิทยาศาสตร์เครือข่าย ความเป็นศูนย์กลางหมายถึงโหนดที่มีอิทธิพลอย่างมากต่อเครือข่าย อิทธิพลเป็นแนวคิดที่คลุมเครือ สามารถเข้าใจได้หลายวิธี โหนดที่มีขอบจำนวนมากมีอิทธิพลมากกว่าโหนดที่มีขอบที่ "สำคัญ" น้อยกว่าหรือไม่ อะไรคือขอบที่สำคัญบนโซเชียลเน็ตเวิร์ก?
เพื่อจัดการกับความคลุมเครือเหล่านี้ นักวิทยาศาสตร์เครือข่ายได้พัฒนามาตรการหลายอย่างเกี่ยวกับศูนย์กลาง ในที่นี้ เราจะพูดถึงมาตรการที่ใช้กันทั่วไปสี่อย่าง แม้ว่าจะมีอีกมากมายให้เลือก
ระดับ
การวัดที่ใช้กันทั่วไปและเข้าใจง่ายที่สุดคือระดับความเป็นศูนย์กลาง แนวคิดเบื้องหลังความเป็นศูนย์กลางของดีกรีนั้นง่าย: วัดอิทธิพลจากดีกรีของโหนด สามารถมีรูปแบบต่างๆ ได้หากมีการกำหนดทิศทางของกราฟ ในกรณีนั้น คุณสามารถวัด indegree และ outdegree ได้ อันแรกเรียกว่าคะแนนฮับ และอันดับที่สองคือคะแนนของผู้มีอำนาจ
ในภาคแรกของชุดนี้ เราใช้แนวทางแบบไม่มีทิศทาง คราวนี้เราเน้นที่วิธีการ indegree ซึ่งช่วยให้วิเคราะห์ได้แม่นยำยิ่งขึ้นโดยเน้นผู้ใช้ที่ได้รับการรีทวีตจากผู้อื่นมากกว่าผู้ใช้ที่รีทวีตบ่อยๆ
Eigenvector
การวัดไอเกนเวคเตอร์สร้างขึ้นจากระดับศูนย์กลาง ยิ่งโหนดที่มีอิทธิพลชี้ไปที่โหนดที่กำหนดมากเท่าใด คะแนนก็จะยิ่งสูงขึ้น เราเริ่มต้นด้วย เมทริกซ์ ที่อยู่ติดกัน โดยที่แถวและคอลัมน์เป็นตัวแทนของโหนด และเราใช้ 1 หรือ 0 เพื่อระบุว่าโหนดที่เกี่ยวข้องของแถวและคอลัมน์ที่ระบุมีการเชื่อมต่อกันหรือไม่ การคำนวณหลักจะประมาณค่าเวกเตอร์ลักษณะเฉพาะของเมทริกซ์ เวกเตอร์ลักษณะเฉพาะหลักจะมีการวัดศูนย์กลางที่เราต้องการ โดยตำแหน่งที่ ฉัน จะถือคะแนนศูนย์กลางของโหนด i
จัดอันดับหน้า
PageRank คือการเปลี่ยนแปลงของการวัดเวกเตอร์ลักษณะเฉพาะที่เป็นแกนหลักของ Google ไม่ทราบวิธีการที่แน่นอนที่ Google ใช้ แต่แนวคิดทั่วไปคือแต่ละโหนดเริ่มต้นด้วยคะแนน 1 แล้วกระจายคะแนนในส่วนเท่าๆ กันไปยังแต่ละขอบ ตัวอย่างเช่น หากโหนดมีสามขอบยื่นออกมาจากโหนดนั้น โหนดจะ “ส่ง” หนึ่งในสามของคะแนนผ่านแต่ละขอบ ในเวลาเดียวกัน โหนดมีความสำคัญมากขึ้นโดยขอบที่ชี้ไปที่โหนดนั้น ซึ่งส่งผลให้ระบบแก้สมการ N กับ N ไม่ทราบ
ระหว่าง
การวัดที่สี่ ระหว่าง , ใช้วิธีการที่แตกต่างกันมาก ในที่นี้ กล่าวกันว่าโหนดมีอิทธิพลหากรวมอยู่ในเส้นทางสั้นๆ ระหว่างโหนดอื่นๆ กล่าวคือ มีหน้าที่ในการสื่อสารกับโหนดอื่น ๆ มากมาย เชื่อมต่อ "โลกที่แตกต่างกัน"
ตัวอย่างเช่น ในการวิเคราะห์เครือข่ายสังคม โหนดประเภทนี้สามารถเข้าใจได้ว่าเป็นประเภทของคนที่ช่วยผู้อื่นหางานใหม่หรือสร้างความสัมพันธ์ใหม่—เป็นประตูสู่วงสังคมที่ไม่เคยรู้จักมาก่อน
ฉันควรใช้อะไร?
การวัดศูนย์กลางที่เหมาะสมขึ้นอยู่กับเป้าหมายของการวิเคราะห์ของคุณ คุณต้องการทราบหรือไม่ว่าผู้ใช้รายใดที่ผู้อื่นมักแยกแยะในแง่ของปริมาณ? ระดับความเป็นศูนย์กลางน่าจะเป็นตัวเลือกที่ดีที่สุดของคุณ หรือคุณชอบมาตรการรวมศูนย์ที่พิจารณาคุณภาพ? ในกรณีนั้น eigenvector หรือ PageRank จะให้ผลลัพธ์ที่ดีกว่า หากคุณต้องการทราบว่าผู้ใช้รายใดทำหน้าที่เชื่อมระหว่างชุมชนต่างๆ ได้อย่างมีประสิทธิภาพมากที่สุด ระหว่างกันคือตัวเลือกที่ดีที่สุดของคุณ
เมื่อใช้การวัดที่คล้ายกันหลายอย่าง เช่น eigenvector และ PageRank คุณสามารถประมาณค่าทั้งหมดและดูว่าพวกเขาให้อันดับที่เท่ากันหรือไม่ หากไม่เป็นเช่นนั้น คุณสามารถวิเคราะห์ความแตกต่างให้ลึกซึ้งยิ่งขึ้นหรือสร้างการวัดใหม่โดยการรวมคะแนนเข้าด้วยกัน
อีกวิธีหนึ่งใช้การวิเคราะห์องค์ประกอบหลักในการประเมินว่าการวัดใดจะให้ข้อมูลเพิ่มเติมเกี่ยวกับอิทธิพลที่แท้จริงของโหนดในเครือข่ายของคุณ
การคำนวณจากศูนย์กลางโดยตรง
มาดูกันว่าเราสามารถคำนวณมาตรการเหล่านี้โดยใช้ R และ RStudio ได้อย่างไร (พวกเขาสามารถทำได้ด้วย Gephi)
อันดับแรก เราต้องโหลดไลบรารีทั้งหมดที่เราจะใช้ตลอดทั้งบทความนี้:
library("plyr") library(igraph) library(tidyverse) library(NLP) library("tm") library(RColorBrewer) library(wordcloud) library(topicmodels) library(SnowballC) library("textmineR")
ต่อไป เราจะลบโหนดที่แยกได้ออกจากข้อมูลที่เราเคยใช้ เนื่องจากไม่เป็นประโยชน์ต่อการวิเคราะห์นี้ จากนั้น เราจะใช้ฟังก์ชัน igraph
betweenness
, centr_eigen
, page_rank
และ degree
เพื่อประเมินมาตรการศูนย์กลาง สุดท้าย เราจะเก็บคะแนนไว้บนวัตถุ igraph
และบนกรอบข้อมูลเพื่อดูว่าผู้ใช้รายใดเป็นศูนย์กลางมากที่สุด
load("art1_tweets.RData") Isolated = which(degree(net)==0) net_clean = delete.vertices(net, Isolated) cent<-data.frame(bet=betweenness(net_clean),eig=centr_eigen(net_clean)$vector,prank=(page_rank(net_clean)$vector),degr=degree(net_clean, mode="in")) cent <- cbind(account = rownames(cent), cent)
ตอนนี้เราสามารถตรวจสอบผู้ใช้ส่วนกลางมากที่สุด 10 รายตามแต่ละการวัด:
ระดับ | |
Eigenvector | |
จัดอันดับหน้า | |
ระหว่าง | |
ผลลัพธ์:
ระดับ | Eigenvector | จัดอันดับหน้า | ระหว่าง | ||||
---|---|---|---|---|---|---|---|
ESPNFC | 5892 | PSG_inside | 1 | มุนโดดาโบลา | 0.037 | ยอดวิว | 77704 |
โทรลล์ฟุตบอล | 5755 | CrewsMat19 | 0.51 | AleLiparoti | 0.026 | EdmundOris | 76425 |
PSG_inside | 5194 | eh01195991 | 0.4 | PSG_inside | 0.017 | บา*****ลา | 63799 |
CrewsMat19 | 4344 | โมฮัมหมัด135680 | 0.37 | RoyNemer | 0.016 | FranciscoGaius | 63081 |
brfootball | 4054 | แอคทูฟุต_ | 0.34 | โทรลล์ฟุตบอล | 0.013 | เยมิฮาซาน | 62534 |
PSG_espanol | 3616 | marttvall | 0.34 | ESPNFC | 0.01 | แฮชแท็ก2weet | 61123 |
IbaiOut | 3258 | ESPNFC | 0.3 | PSG_espanol | 0.007 | Angela_FCB | 60991 |
แอคทูฟุต_ | 3175 | brfootball | 0.25 | lnstantFoot | 0.007 | ไซยอน_ | 57269 |
FootyHumor | 2976 | SaylorMoonArmy | 0.22 | IbaiOut | 0.006 | CrewsMat19 | 53758 |
มุนโดดาโบลา | 2778 | JohnsvillPat | 0.2 | 2010 MisterChip | 0.006 | MdeenOlawale | 49572 |
เราจะเห็นว่าสามมาตรการแรกมีผู้ใช้จำนวนหนึ่งร่วมกัน เช่น PSG_inside, ESPNFC, CrewsMat19 และ TrollFootball เราสามารถสรุปได้ว่าพวกเขามีอิทธิพลอย่างมากต่อการอภิปราย Betweenness มีวิธีการที่แตกต่างกันในการวัดศูนย์กลาง ดังนั้นจึงไม่แสดงทับซ้อนกับเทคนิคอื่นๆ มากนัก
หมายเหตุ: การดูที่แสดงโดยบัญชี Twitter ที่กล่าวถึงในบทความนี้ไม่ได้สะท้อนถึง Toptal หรือผู้เขียน
ในภาพต่อไปนี้ คุณสามารถดูกราฟเครือข่ายสีดั้งเดิมของเราพร้อมป้ายซ้อนทับสองป้ายสำหรับผู้ใช้ ในขั้นแรก โหนดจะถูกเน้นด้วยคะแนน PageRank และอันดับที่สองโดยคะแนนระหว่างคะแนน:
Gephi สามารถใช้เพื่อสร้างภาพเหล่านี้ได้ คุณสามารถประมาณคะแนนระหว่างคะแนนระหว่างคะแนนหรือคะแนนเพจโดยใช้ปุ่มเส้นผ่านศูนย์กลางเครือข่ายในแผงสถิติ จากนั้น คุณสามารถแสดงชื่อโหนดโดยใช้แอตทริบิวต์ตามที่แสดงในงวดแรกในชุดนี้
การวิเคราะห์ข้อความ: R และ LDA
นอกจากนี้เรายังสามารถวิเคราะห์การสนทนาบนเครือข่ายสังคมเพื่อระบุสิ่งที่ผู้ใช้กำลังพูดถึง มีหลายวิธีในการเข้าถึงสิ่งนี้ เราจะสร้างแบบจำลองหัวข้อโดยใช้ Latent Dirichlet Allocation (LDA) ซึ่งเป็นเทคนิคแมชชีนเลิร์นนิงแบบไม่มีผู้ดูแล ซึ่งช่วยให้เราประมาณได้ว่าชุดคำใดมีแนวโน้มที่จะปรากฏพร้อมกัน จากนั้น เราสามารถอนุมานหัวข้อที่กำลังสนทนาได้โดยใช้ชุดคำนั้น
ขั้นตอนแรกคือการฆ่าเชื้อข้อความ ในการทำเช่นนั้น เรากำหนดฟังก์ชันต่อไปนี้:
# This function normalizes text by removing Twitter-related terms and noisy characters sanitize_text <- function(text) { # Convert to ASCII to remove accented characters: text <- iconv(text, to = "ASCII", sub = " ") # Move to lower case and delete RT word (this is added by Twitter) text <- gsub("rt", " ", tolower(text)) # Delete links and user names: text <- gsub("@\\w+", " ", gsub("http.+ |http.+$", " ", text)) # Delete tabs and punctuation: text <- gsub("[ |\t]{2,}", " ", gsub("[[:punct:]]", " ", text)) text <- gsub("amp", " ", text) # Remove HTML special character # Delete leading and lagging blanks: text <- gsub("^ ", "", gsub(" $", "", text)) text <- gsub(" +", " ", text) # Delete extra spaces return(text) }
นอกจากนี้เรายังต้องลบคำหยุด คำที่ซ้ำกัน และรายการว่าง ต่อไป เราต้องแปลงข้อความของเราเป็นเมทริกซ์ระยะเอกสารเพื่อประมวลผลโดย LDA

ในชุดข้อมูลนี้ เรามีผู้ใช้ที่พูดหลายภาษา (อังกฤษ สเปน ฝรั่งเศส ฯลฯ) LDA จะทำงานได้ดีที่สุดหากเรามุ่งเน้นที่ภาษาเดียว เราจะนำไปใช้กับผู้ใช้ของชุมชนที่ใหญ่ที่สุดที่ตรวจพบในภาคแรกของชุดนี้ ซึ่งประกอบด้วยบัญชีที่มีผู้ใช้ที่พูดภาษาอังกฤษเป็นหลัก
# Detect communities: my.com.fast <-cluster_louvain(as.undirected(simplify(net))) largestCommunities <- order(sizes(my.com.fast), decreasing=TRUE)[1:3] # Save the usernames of the biggest community: community1 <- names(which(membership(my.com.fast) == largestCommunities[1])) # Sanitize the text of the users of the biggest community: text <- unique(sanitize_text(tweets.df[which(tweets.df$screen_name %in% community1),]$text)) text = text[text!=''] # Delete empty entries stopwords_regex = paste(stopwords('es'), collapse = '\\b|\\b') stopwords_regex = paste0('\\b', stopwords_regex, '\\b') # Remove English stopwords: text = stringr::str_replace_all(text, stopwords_regex, '') # Create the document term matrix: dtm <- CreateDtm(text, doc_names = seq(1:length(text)), ngram_window = c(1, 2))
จำนวนหัวข้อและคะแนนความสอดคล้อง
ไฮเปอร์พารามิเตอร์หลักที่เราจำเป็นต้องกำหนดใน LDA คือจำนวน (k) ของหัวข้อที่เราต้องการประมาณการ อย่างไรก็ตาม เราจะทราบล่วงหน้าได้อย่างไร วิธีการทั่วไปวิธีหนึ่งคือการฝึกแบบจำลอง LDA ผ่านค่า k ที่ต่างกันและวัดความสอดคล้องกันของค่าแต่ละค่า เราจะทำเช่นนี้สำหรับค่า k ตั้งแต่ 3 ถึง 20 เนื่องจากค่าที่อยู่นอกช่วงนี้ไม่คุ้มที่จะตรวจสอบจากประสบการณ์ของฉัน:
tf <- TermDocFreq(dtm = dtm) # Remove infrequent words: tf_trimmed = tf$term[ tf$term_freq > 1 & tf$doc_freq < nrow(dtm) / 2 ] # Create a folder to store trained models: model_dir <- paste0("models_", digest::digest(tf_trimmed, algo = "sha1")) if (!dir.exists(model_dir)) dir.create(model_dir) # Define a function to infer LDA topics: train_lda_model <- function(number_of_topics){ filename = file.path(model_dir, paste0(number_of_topics, "_topics.rda")) # Check if the model already exists: if (!file.exists(filename)) { # To get exactly the same output on each run, use a constant seed: set.seed(12345) lda_model = FitLdaModel(dtm = dtm, k = number_of_topics, iterations = 500) lda_model$k = number_of_topics lda_model$coherence = CalcProbCoherence(phi = lda_model$phi, dtm = dtm, M = 5) save(lda_model, file = filename) } else { load(filename) } lda_model } # The number of topics that we are going to infer in each LDA training run: topic_count = seq(3, 20, by = 1) # Train through the TmParallelApply function models = TmParallelApply(X = topic_count, FUN = train_lda_model, export = c("dtm", "model_dir"))
ต่อไป เราสร้างกราฟค่าการเชื่อมโยงกันของแต่ละรายการ:
coherence_by_topics_quantity = data.frame( topic_number = sapply(models, function(model_instance) nrow(model_instance$phi)), score_coherence = sapply(models, function(model_instance) mean(model_instance$coherence)), stringsAsFactors = FALSE) ggplot(coherence_by_topics_quantity, aes(x = topic_number, y = score_coherence)) + geom_point() + geom_line(group = 1) + ggtitle("Coherence by Topic") + theme_minimal() + scale_x_continuous(breaks = seq(1,20,1)) + ylab("Coherence Score") + xlab("Number of topics")
ค่าความเชื่อมโยงกันสูงจะแสดงการแบ่งส่วนข้อความออกเป็นหัวข้อได้ดีขึ้น:
เราบรรลุคะแนนความเชื่อมโยงสูงสุดด้วย k = 13 ดังนั้นเราจะใช้แบบจำลอง LDA ที่ฝึกด้วย 13 หัวข้อ ด้วยฟังก์ชัน GetTopTerms เราจะเห็นคำศัพท์หลัก 10 คำสำหรับแต่ละหัวข้อและประเมินความหมายของหัวข้อผ่านคำเหล่านี้:
best_model <- models[which.max(coherence_by_topics_quantity$score_coherence)][[ 1 ]] # Most important terms by topic: best_model$top_terms <- GetTopTerms(phi = best_model$phi, M = 20) top10 <- as.data.frame(best_model$top_terms) top10
ตารางต่อไปนี้ให้รายละเอียดหัวข้อที่สำคัญที่สุดห้าหัวข้อที่ตรวจพบและคำศัพท์หลัก 10 คำที่เป็นตัวอย่าง:
t_1 | t_2 | t_3 | t_4 | t_5 | |
---|---|---|---|---|---|
1 | เมสซี | เมสซี | เมสซี | เมสซี | เมสซี |
2 | ไลโอเนล | อินสตาแกรม | ลีก | est | psg |
3 | lionel_messi | โพสต์ | ชนะ | อิล | สิงห์ |
4 | psg | ล้าน | เป้าหมาย | au | leo_messi |
5 | มาดริด | ชอบ | ch | เท | ahora |
6 | จริง | สปอ | ไอออน | ปะ | compa |
7 | บาร์เซโลน่า | แพะ | ch_ions | avec | วา |
8 | ปารีส | psg | ucl | ดู | ser |
9 | real_madrid | บาร์ | ลูกโป่ง | qui | jugador |
10 | mbapp | ใหญ่กว่า | โลก | เจ | mejor |
แม้ว่าผู้ใช้ส่วนใหญ่ในชุมชนนี้จะพูดภาษาอังกฤษ แต่ก็ยังมีผู้พูดภาษาฝรั่งเศสและสเปนจำนวนหนึ่ง (t_4 และ t_5 ในตาราง) เราสามารถอนุมานได้ว่าหัวข้อแรกเกี่ยวข้องกับทีมก่อนหน้าของเมสซี่ (FC Barcelona) หัวข้อที่สองเกี่ยวกับโพสต์ของเมสซี่บน Instagram และหัวข้อที่สามเน้นที่ความสำเร็จของเมสซี่
ตอนนี้เรามีหัวข้อแล้ว เราก็สามารถคาดเดาได้ว่าหัวข้อใดถูกกล่าวถึงมากที่สุด ในการทำเช่นนั้น ก่อนอื่นเราจะทำการต่อทวีตโดยผู้ใช้ (อีกครั้งจากชุมชนที่ใหญ่ที่สุด):
tweets.df.com1 = tweets.df[which(tweets.df$screen_name %in% community1),] users_text <- ddply(tweets.df.com1, ~screen_name, summarise, text = paste(text, collapse = " "))
จากนั้นเราก็ทำให้ข้อความสะอาดเหมือนเดิมและสร้าง DTM หลังจากนั้น เราเรียกฟังก์ชันการ predict
โดยใช้แบบจำลอง LDA และ DTM เป็นอาร์กิวเมนต์ นอกจากนี้เรายังตั้งค่าวิธีการเป็น Gibbs เพื่อปรับปรุงเวลาในการคำนวณ เนื่องจากเรามีข้อความจำนวนมากที่ต้องวิเคราะห์:
users_text$text <- sanitize_text(users_text$text) # Get rid of duplicates stopwords_regex = paste(stopwords('en'), collapse = '\\b|\\b') stopwords_regex = paste0('\\b', stopwords_regex, '\\b') users_text$text = stringr::str_replace_all(users_text$text, stopwords_regex, '') dtm.users.com1 <- CreateDtm(users_text$text, doc_names = users_text$screen_name, ngram_window = c(1, 2)) com1.users.topics = predict(best_model, dtm.users.com1, method="gibbs", iterations=100)
ตอนนี้ ในกรอบข้อมูล com1.users.topics
เราจะเห็นว่าผู้ใช้แต่ละคนพูดถึงแต่ละหัวข้อมากน้อยเพียงใด:
บัญชี | t_1 | t_2 | t_3 | t_4 | t_5 | […] |
---|---|---|---|---|---|---|
___99th | 0.02716049 | 0.86666666 | 0.00246913 | 0.00246913 | 0.00246913 | |
เจ้านาย__ | 0.05185185 | 0.84197530 | 0.00246913 | 0.00246913 | 0.00246913 | |
เมมฟิส | 0.00327868 | 0.00327868 | 0.03606557 | 0.00327868 | 0.00327868 | |
___อเล็กซ์1 | 0.00952380 | 0.00952380 | 0.00952380 | 0.00952380 | 0.00952380 | |
[…] |
สุดท้าย ด้วยข้อมูลนี้ เราสามารถสร้างแอตทริบิวต์ใหม่บนกราฟโหนดเพื่อกำหนดว่าผู้ใช้คนใดพูดถึงหัวข้อใดมากที่สุด จากนั้น เราสามารถสร้างไฟล์ GML ใหม่เพื่อแสดงภาพใน Gephi:
# Get the subgraph of the first community: net.com1 = induced_subgraph(net,community1) # Estimate the topic with the max score for each user: com1.users.maxtopic = cbind(users_text$screen_name, colnames(com1.users.topics)[apply(com1.users.topics, 1, which.max)]) # Order the users topic data frame by the users' order in the graph: com1.users.maxtopic = com1.users.maxtopic[match(V(net.com1)$name, com1.users.maxtopic[,1]),] # Create a new attr of the graph by the topic most discussed by each user: V(net.com1)$topic = com1.users.maxtopic[,2] # Create a new graph: write_graph(simplify(net.com1), "messi_graph_topics.gml", format = "gml")
อนุมานหัวข้อสำคัญและการประยุกต์ใช้ศูนย์กลางเครือข่ายสังคม
ในภาคแรกของชุดนี้ เราได้เรียนรู้วิธีรับข้อมูลจาก Twitter สร้างกราฟการโต้ตอบ วางแผนผ่าน Gephi และตรวจหาชุมชนและผู้ใช้ที่สำคัญ ในงวดนี้ เราได้ขยายการวิเคราะห์นี้โดยแสดงให้เห็นถึงการใช้เกณฑ์เพิ่มเติมเพื่อตรวจหาผู้ใช้ที่มีอิทธิพล เรายังสาธิตวิธีการตรวจจับและอนุมานว่าผู้ใช้กำลังพูดถึงอะไรและวางแผนอะไรในเครือข่าย
ในบทความถัดไป เราจะทำการวิเคราะห์นี้ให้ลึกซึ้งยิ่งขึ้นต่อไปโดยแสดงให้เห็นว่าผู้ใช้สามารถตรวจจับการระบาดของโซเชียลมีเดียได้อย่างไร: สแปมบอทและโทรลล์
อ่านเพิ่มเติมในบล็อก Toptal Engineering:
- การวิเคราะห์เครือข่ายโซเชียลโดยใช้ Power BI และ R: A Custom Visuals Guide