این آخرین قسمت از یک سری سه قسمتی در تحلیل های خوشه ای توییتر با استفاده از R و Gephi است. بخش اول بحث داغ آنلاین را تجزیه و تحلیل کرد درباره فوتبالیست مشهور آرژانتینی لیونل مسی؛ بخش دوم تحلیل را عمیق تر کرد برای شناسایی بهتر بازیگران اصلی و درک گسترش موضوع.
سیاست در حال قطبی شدن است. وقتی جوامع جالبی با نظرات کاملاً متفاوت پیدا میکنیم، پیامهای توییتری که از درون این اردوگاهها تولید میشوند، بهطور متراکم در اطراف دو گروه از کاربران جمع میشوند، با یک ارتباط جزئی بین آنها. این نوع گروه بندی و رابطه نامیده می شود همجنسگرا: تمایل به تعامل با افراد مشابه ما.
در مقاله قبلی این مجموعه، ما بر روی تکنیکهای محاسباتی مبتنی بر مجموعه دادههای توییتر تمرکز کردیم و توانستیم تجسمهای آموزنده را از طریق ایجاد کنیم. جایی که؟. اکنون میخواهیم از تحلیل خوشهای استفاده کنیم تا نتیجهگیریهایی را که میتوانیم از آن تکنیکها بگیریم و شناسایی کنیم که کدام جنبههای داده اجتماعی آموزندهتر هستند، استفاده کنیم.
ما نوع دادههایی را که تجزیه و تحلیل میکنیم تغییر میدهیم تا این خوشهبندی را برجسته کنیم، دادههای سیاسی ایالات متحده را از 10 می 2020 تا 20 مه 2020 بارگیری میکنیم. از همان فرآیند دانلود دادههای توییتر استفاده میکنیم که در مقاله اول در این مقاله استفاده کردیم. این سریال، معیار دانلود را به جای «مسی» به نام رئیس جمهور وقت تغییر داد.
شکل زیر نمودار تعامل بحث سیاسی را نشان می دهد. همانطور که در مقاله اول انجام دادیم، این داده ها را با Gephi با استفاده از طرح ForceAtlas2 ترسیم کردیم و توسط جوامعی که توسط Louvain شناسایی شده بود رنگ آمیزی کردیم.
بیایید عمیق تر به داده های موجود بپردازیم.
چه کسانی در این خوشه ها هستند؟
همانطور که در طول این مجموعه بحث کردیم، میتوانیم خوشهها را بر اساس مقامات آنها مشخص کنیم، اما توییتر حتی دادههای بیشتری را به ما میدهد که بتوانیم آنها را تجزیه کنیم. به عنوان مثال، فیلد توضیحات کاربر، که در آن کاربران توییتر می توانند زندگی نامه مختصری ارائه دهند. با استفاده از ابر کلمه، ما می توانیم کشف کنیم که کاربران چگونه خود را توصیف می کنند. این کد دو ابر کلمه را بر اساس فراوانی کلمه موجود در دادههای توصیفات هر خوشه ایجاد میکند و نشان میدهد که چگونه توصیفهای خود افراد به صورت کلی آموزنده است:
# Load necessary libraries
library(rtweet)
library(igraph)
library(tidyverse)
library(wordcloud)
library(tidyverse)
library(NLP)
library("tm")
library(RColorBrewer)
# First, identify the communities through Louvain
my.com.fast = cluster_louvain(as.undirected(simplify(net)),resolution=0.4)
# Next, get the users that conform to the two biggest clusters
largestCommunities <- order(sizes(my.com.fast), decreasing=TRUE)[1:4]
community1 <- names(which(membership(my.com.fast) == largestCommunities[1]))
community2 <- names(which(membership(my.com.fast) == largestCommunities[2]))
# Now, split the tweets’ data frames by their communities
# (i.e., 'republicans' and 'democrats')
republicans = tweets.df[which(tweets.df$screen_name %in% community1),]
democrats = tweets.df[which(tweets.df$screen_name %in% community2),]
# Next, given that we have one row per tweet and we want to analyze users,
# let’s keep only one row by user
accounts_r = republicans[!duplicated(republicans[,c('screen_name')]),]
accounts_d = democrats[!duplicated(democrats[,c('screen_name')]),]
# Finally, plot the word clouds of the user’s descriptions by cluster
## Generate the Republican word cloud
## First, convert descriptions to tm corpus
corpus <- Corpus(VectorSource(unique(accounts_r$description)))
### Remove English stop words
corpus <- tm_map(corpus, removeWords, stopwords("en"))
### Remove numbers because they are not meaningful at this step
corpus <- tm_map(corpus, removeNumbers)
### Plot the word cloud showing a maximum of 30 words
### Also, filter out words that appear only once
pal <- brewer.pal(8, "Dark2")
wordcloud(corpus, min.freq=2, max.words = 30, random.order = TRUE, col = pal)
## Generate the Democratic word cloud
corpus <- Corpus(VectorSource(unique(accounts_d$description)))
corpus <- tm_map(corpus, removeWords, stopwords("en"))
pal <- brewer.pal(8, "Dark2")
wordcloud(corpus, min.freq=2, max.words = 30, random.order = TRUE, col = pal)
داده های انتخابات قبلی ایالات متحده این را نشان می دهد رای دهندگان بر اساس منطقه جغرافیایی بسیار تفکیک شده اند. بیایید تجزیه و تحلیل هویت خود را عمیق تر کنیم و روی یک زمینه دیگر تمرکز کنیم: مکان_نام، زمینه ای که کاربران می توانند محل زندگی خود را ارائه دهند. این کد R بر اساس این فیلد ابرهای کلمه ایجاد می کند:
# Convert place names to tm corpus corpus <- Corpus(VectorSource(accounts_d[!is.na(accounts_d$place_name),]$place_name))
# Remove English stop words
corpus <- tm_map(corpus, removeWords, stopwords("en"))
# Remove numbers
corpus <- tm_map(corpus, removeNumbers)
# Plot
pal <- brewer.pal(8, "Dark2")
wordcloud(corpus, min.freq=2, max.words = 30, random.order = TRUE, col = pal)
## Do the same for accounts_r
نام برخی از مکان ها ممکن است در هر دو ابر کلمه ظاهر شود زیرا رای دهندگان هر دو حزب در اکثر مکان ها زندگی می کنند. اما برخی از ایالت ها مانند تگزاس، کلرادو، اوکلاهاما و ایندیانا به شدت نماینده حزب جمهوری خواه هستند در حالی که برخی از شهرها مانند نیویورک، سانفرانسیسکو و فیلادلفیا به شدت با حزب دموکرات ارتباط دارند.
رفتار
بیایید جنبه دیگری از داده ها را بررسی کنیم، با تمرکز بر رفتار کاربر و بررسی توزیع زمانی که حساب ها در هر خوشه ایجاد شده اند. اگر بین تاریخ ایجاد و خوشه ارتباطی وجود نداشته باشد، شاهد توزیع یکنواخت کاربران برای هر روز خواهیم بود.
بیایید هیستوگرام توزیع را رسم کنیم:
# First we need to format the account date field to be effectively read as Date
## Note that we are using the accounts_r and accounts_d data frame, this is because we want to focus on unique users and don’t distort the plot by the number of tweets that each user has submitted
accounts_r$date_account <- as.Date(format(as.POSIXct(accounts_r$account_created_at,format="%Y-%m-%d %H:%M:%S"),format="%Y-%m-%d"))
# Now we plot the histogram
ggplot(accounts_r, aes(date_account)) + geom_histogram(stat="count")+scale_x_date(date_breaks = "1 year", date_labels = "%b %Y")
## Do the same for accounts_d
می بینیم که کاربران جمهوری خواه و دموکرات به طور یکسان توزیع نمی شوند. در هر دو مورد، تعداد حساب های کاربری جدید در ژانویه 2009 و ژانویه 2017 به اوج خود رسید، هر دو ماه زمانی که مراسم تحلیف پس از انتخابات ریاست جمهوری در نوامبر سال های گذشته اتفاق افتاد. آیا ممکن است نزدیکی به آن رویدادها باعث افزایش تعهد سیاسی شود؟ با توجه به اینکه ما در حال تحلیل توییت های سیاسی هستیم، این منطقی است.
همچنین جالب توجه است: بزرگترین اوج در داده های جمهوری خواهان پس از اواسط سال 2019 رخ می دهد و در اوایل سال 2020 به بالاترین مقدار خود می رسد. آیا این تغییر در رفتار می تواند مربوط به عادات دیجیتال ناشی از همه گیری باشد؟
دادههای مربوط به دموکراتها نیز در این دوره افزایش یافت اما با ارزش کمتر. شاید حامیان جمهوری خواه اوج بالاتری را به نمایش گذاشتند زیرا نظرات قوی تری در مورد قرنطینه کووید داشتند؟ برای ایجاد فرضیه های بهتر باید بیشتر بر دانش، نظریه ها و یافته های سیاسی تکیه کنیم، اما صرف نظر از این، روندهای داده های جالبی وجود دارد که می توانیم از منظر سیاسی تحلیل کنیم.
روش دیگر برای مقایسه رفتارها، تجزیه و تحلیل چگونگی کاربران است ریتوئیت کنید و پاسخ دهید. هنگامی که کاربران بازتوییت می کنند، پیامی را منتشر می کنند. با این حال، هنگامی که آنها پاسخ می دهند، به یک گفتگو یا بحث خاص کمک می کنند. به طور معمول، تعداد پاسخها با درجه تفرقه، عدم محبوبیت یا جنجال یک توییت مرتبط است. کاربری که توییتی را مورد علاقه خود قرار می دهد، نشان می دهد که با آن احساس موافق است. بیایید بررسی کنیم اندازه گیری نسبت بین موارد دلخواه و پاسخ می دهد از یک توییت
بر اساس هموفیلی، از کاربران انتظار داریم که کاربران همان انجمن را ریتوییت کنند. ما می توانیم این را با R تأیید کنیم:
# Get users who have been retweeted by both sides
rt_d = democrats[which(!is.na(democrats$retweet_screen_name)),]
rt_r = republicans[which(!is.na(republicans$retweet_screen_name)),]
# Retweets from democrats to republicans
rt_d_unique = rt_d[!duplicated(rt_d[,c('retweet_screen_name')]),]
rt_dem_to_rep = dim(rt_d_unique[which(rt_d_unique$retweet_screen_name %in% unique(republicans$screen_name)),])[1]/dim(rt_d_unique)[1]
# Retweets from democrats to democrats
rt_dem_to_dem = dim(rt_d_unique[which(rt_d_unique$retweet_screen_name %in% unique(democrats$screen_name)),])[1]/dim(rt_d_unique)[1]
# The remainder
rest = 1 - rt_dem_to_dem - rt_dem_to_rep
# Create a dataframe to make the plot
data <- data.frame(
category=c( "Democrats","Republicans","Others"),
count=c(round(rt_dem_to_dem*100,1),round(rt_dem_to_rep*100,1),round(rest*100,1))
)
# Compute percentages
data$fraction <- data$count / sum(data$count)
# Compute the cumulative percentages (top of each rectangle)
data$ymax <- cumsum(data$fraction)
# Compute the bottom of each rectangle
data$ymin <- c(0, head(data$ymax, n=-1))
# Compute label position
data$labelPosition <- (data$ymax + data$ymin) / 2
# Compute a good label
data$label <- paste0(data$category, "\n ", data$count)
# Make the plot
ggplot(data, aes(ymax=ymax, ymin=ymin, xmax=4, xmin=3, fill=c('red','blue','green'))) +
geom_rect() +
geom_text( x=1, aes(y=labelPosition, label=label, color=c('red','blue','green')), size=6) + # x here controls label position (inner / outer)
coord_polar(theta="y") +
xlim(c(-1, 4)) +
theme_void() +
theme(legend.position = "none")
# Do the same for rt_r
همانطور که انتظار می رفت، جمهوری خواهان تمایل دارند جمهوری خواهان دیگر را بازتوییت کنند و همین امر در مورد دموکرات ها نیز صادق است. بیایید ببینیم که وابستگی حزبی در پاسخهای توییت چگونه اعمال میشود.
یک الگوی بسیار متفاوت در اینجا ظاهر می شود. در حالی که کاربران تمایل دارند بیشتر به توییتهای افرادی که وابستگی حزبی خود را به اشتراک میگذارند، پاسخ دهند، اما احتمال اینکه آنها را بازتوییت کنند بسیار بیشتر است. همچنین، به نظر میرسد افرادی که در دو خوشه اصلی قرار نمیگیرند، ترجیح میدهند پاسخ دهند.
با استفاده از تکنیک مدلسازی موضوعی که در قسمت دوم این مجموعه ارائه شده است، میتوانیم پیشبینی کنیم که کاربران چه نوع مکالمههایی را با افراد همگروه خود و با افراد گروه مقابل انتخاب میکنند.
جدول زیر دو موضوع مهم مورد بحث در هر نوع تعامل را شرح می دهد:
دموکرات ها به دموکرات ها | دموکرات ها به جمهوری خواهان | جمهوری خواهان به دموکرات ها | جمهوری خواهان به جمهوری خواهان | ||||
مبحث 1 | مبحث 2 | مبحث 1 | مبحث 2 | مبحث 1 | مبحث 2 | مبحث 1 | مبحث 2 |
جعلی | مردم | ترامپ | آمریکایی ها | اخبار | بایدن | مردم | چین |
پوتین | کووید | اخبار | ترامپ | جعلی | اوباما | پول | اخبار |
انتخابات | ویروس | جعلی | مرده | cnn | اوباماگات | کشور | مردم |
پول | گرفتن | دروغ | مردم | خواندن | جو | باز کن | رسانه ها |
ترامپ | مرده | روباه | فوتشدگان | اخبار جعلی | شواهد و مدارک | بازگشت | جعلی |
به نظر می رسد زمانی که کاربران در مجموعه داده ما پاسخ دادند، اخبار جعلی موضوع داغی بود. صرف نظر از وابستگی حزبی کاربر، وقتی به افراد طرف مقابل پاسخ میداد، در مورد کانالهای خبری که معمولاً مورد علاقه افراد حزب خاص است صحبت میکردند. ثانیاً، وقتی دموکراتها به سایر دموکراتها پاسخ دادند، تمایل داشتند درباره پوتین، انتخابات جعلی و کووید صحبت کنند، در حالی که جمهوریخواهان بر توقف قرنطینه و اخبار جعلی از چین تمرکز کردند.
قطبی شدن اتفاق می افتد
قطبی شدن یک الگوی رایج در رسانه های اجتماعی است که در سراسر جهان اتفاق می افتد، نه فقط در ایالات متحده. ما دیدهایم که چگونه میتوانیم هویت و رفتار جامعه را در یک سناریوی قطبی شده تحلیل کنیم. با استفاده از این ابزارها، هر کسی می تواند تجزیه و تحلیل خوشه ای را بر روی مجموعه داده های مورد علاقه خود بازتولید کند تا ببیند چه الگوهایی ظاهر می شوند. الگوها و نتایج حاصل از این تحلیلها میتوانند هم آموزش دهند و هم به ایجاد کاوش بیشتر کمک کنند.