Análisis de redes sociales con R:Mining para clústeres de Twitter

[ad_1]

Esta es la parte final de una serie de tres partes sobre el análisis de clústeres de Twitter usando R y Gephi. parte uno analiza acalorada discusión en línea sobre el famoso futbolista argentino Lionel Messi; Segunda parte profundizó el análisis para identificar mejor a los actores clave y comprender la distribución de los problemas.

La política se polariza. Cuando encontramos comunidades interesantes con opiniones drásticamente diferentes, los mensajes de Twitter generados a partir de estos campamentos tienden a agruparse estrechamente en torno a dos grupos de usuarios, con una ligera conexión entre ellos. Este tipo de agrupación y relación se denomina homofilia: la tendencia a interactuar con personas que son similares a nosotros.

En el artículo anterior de esta serie, nos enfocamos en técnicas computacionales basadas en conjuntos de datos de Twitter y pudimos generar visualizaciones informativas usando Gephi. Ahora usemos el análisis de conglomerados para comprender las conclusiones que podemos sacar de estas técnicas e identificar qué aspectos de los datos sociales son los más informativos.

Cambiaremos el tipo de datos que analizamos para resaltar este agrupamiento mediante la descarga de datos políticos de Estados Unidos del 10 al 20 de mayo de 2020. Estamos usando el mismo proceso de descarga de datos de Twitter que usamos en el primer artículo de esta serie y cambiamos los criterios de descarga al nombre del entonces presidente y no a "Messi".

La siguiente figura muestra el gráfico de interacción de la discusión política; Como en el primer artículo, trazamos estos datos con Gephi utilizando el diseño ForceAtlas2 y los coloreamos de acuerdo con las comunidades reconocidas por Louvain.

Un diagrama de interacción de clúster de datos binarios no identificado generado en Gephi
Diagrama de interacción de clúster de datos

Profundicemos en los datos disponibles.

Índice
  1. ¿Quién pertenece a estos grupos?
  2. comportamientos
  3. También en esta serie:
  4. Lectura adicional en el blog de ingeniería de Toptal:

¿Quién pertenece a estos grupos?

Como hemos discutido en esta serie, podemos caracterizar los clústeres por sus autoridades, pero Twitter nos brinda aún más datos para analizar. Por ejemplo, el campo de descripción del usuario, que permite a los usuarios de Twitter proporcionar una breve autobiografía. Usando una nube de palabras, podemos descubrir cómo los usuarios se describen a sí mismos. Este código genera dos nubes de palabras basadas en la frecuencia de las palabras que se encuentran en los datos de las descripciones de cada grupo y destaca cuán informativas son las autodescripciones de las personas de manera agregada:

# 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)

Los datos de elecciones estadounidenses anteriores muestran que los votantes están muy segregados por región geográfica. Profundicemos en nuestro análisis de identidad y centrémonos en otro campo: place_name, el campo que permite a los usuarios indicar dónde viven. Este código R genera nubes de palabras basadas en este campo:

# 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

Las nubes de palabras generadas por RStudio para cada grupo de datos
nubes de palabras

Los nombres de algunos lugares pueden aparecer en ambas nubes de palabras, ya que los votantes de ambos partidos viven en la mayoría de los lugares. Pero algunos estados, como Texas, Colorado, Oklahoma e Indiana, son fuertemente republicanos, mientras que algunas ciudades, como Nueva York, San Francisco y Filadelfia, están altamente correlacionadas con el Partido Demócrata.

comportamientos

Examinemos otra faceta de los datos centrándonos en el comportamiento del usuario y examinando la distribución de cuándo se crearon las cuentas dentro de cada grupo. Si no hay correlación entre la fecha de creación y el clúster, vemos una distribución uniforme de usuarios para cada día.

Dibujemos un histograma de la distribución:

# 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

Un histograma generado con RStudio que muestra la cantidad de usuarios republicanos creados para cada fecha dentro del conjunto de datos
Número de usuarios republicanos creados hasta la fecha

Un histograma generado con RStudio que muestra la cantidad de usuarios demócratas creados para cada fecha dentro del conjunto de datos
Número de usuarios democráticos creados por fecha

Vemos que los usuarios republicanos y demócratas no están distribuidos uniformemente. En ambos casos, el número de nuevas cuentas de usuarios alcanzó su punto máximo en enero de 2009 y enero de 2017, ambos meses en los que se llevaron a cabo las inauguraciones luego de las elecciones presidenciales de noviembre de años anteriores. ¿Será que estar tan cerca de estos eventos lleva a una mayor participación política? Eso tendría sentido considerando que analizamos tuits políticos.

También es interesante señalar: el pico más grande dentro de los datos republicanos se produce después de mediados de 2019 y alcanza su punto máximo a principios de 2020. ¿Este cambio de comportamiento podría estar relacionado con los hábitos digitales provocados por la pandemia?

Los datos de los demócratas también tuvieron un aumento durante este período, pero a un ritmo menor. ¿Quizás los partidarios republicanos alcanzaron su punto máximo porque tenían opiniones más fuertes sobre los bloqueos de COVID? Tendríamos que confiar más en el conocimiento político, la teoría y la evidencia para desarrollar mejores hipótesis, pero independientemente, hay tendencias de datos interesantes que podemos analizar desde una perspectiva política.

Otra forma de comparar comportamientos es analizar cómo los usuarios retuitean y responden. Cuando los usuarios retuitean, están difundiendo un mensaje; Sin embargo, cuando responden, están contribuyendo a una conversación o debate específico. Por lo general, el número de respuestas se correlaciona con el nivel de división, impopularidad o controversia de un tuit; Un usuario que marca un tweet como favorito muestra su aprobación del sentimiento. Examinemos la medida de la proporción entre el favoritos y respuestas un tuit

Según la homofilia, esperaríamos que los usuarios retuitearan a usuarios de la misma comunidad. Podemos comprobar esto con 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

Dos gráficos de anillos que muestran qué usuarios están retuiteando tuits de cada grupo. En cuanto a los retuits republicanos, el 76,3 % son de otros republicanos y el 1,3 % son de demócratas, mientras que el 22,4 % son de usuarios no agrupados. En cuanto a los retweets de los demócratas, el 75,3 % son de otros demócratas y el 2,4 % son de republicanos, mientras que el 22,3 % son de usuarios no agrupados.
Distribución de retweets por tipo de usuario

Como era de esperar, los republicanos tienden a retuitear a otros republicanos, y lo mismo ocurre con los demócratas. Veamos cómo la afiliación a un partido afecta las respuestas de los tuits.

Dos gráficos de anillos que muestran qué tipos de usuarios están respondiendo a los tweets de cada grupo. En cuanto a las respuestas a los tuits republicanos, el 36,5 % son de republicanos y el 16,2 % de demócratas, mientras que el 47,3 % son de usuarios no agrupados. En cuanto a las respuestas a los tuits demócratas, el 28 % son de demócratas y el 20,6 % son de republicanos, mientras que el 51,5 % son de usuarios no agrupados.
Tipo de usuario distribución de respuestas de tweet

Aquí surge un patrón muy diferente. Si bien es más probable que los usuarios respondan a los tuits de personas que comparten su afiliación partidaria, es mucho más probable que los retuiteen. Además, las personas que no pertenecen a ninguno de los grupos principales parecen más propensas a responder.

Mediante el uso de la técnica de modelado de temas presentada en la Parte 2 de esta serie, podemos predecir qué tipo de conversaciones tendrán los usuarios con personas de su mismo grupo y con personas del grupo opuesto.

La siguiente tabla enumera los dos temas principales discutidos en cada tipo de interacción:

Demócratas para demócratasdemócratas a republicanosrepublicanos a demócratasrepublicanos a republicanos
tema 1tema 2tema 1tema 2tema 1tema 2tema 1tema 2
falsopersonascarta de triunfoAmericanonoticiaspermanecerpersonasPorcelana
putínCOVID-19noticiascarta de triunfofalsoobamadineronoticias
elecciónvirusfalsomuertoCNNobamagatepaíspersonas
dinerotomarMentirpersonasleerJoséabiertomedios de comunicación
carta de triunfomuertoZorrofallecidosnoticias falsaspruebala parte de atrásfalso

Parece que las noticias falsas fueron un tema candente cuando los usuarios de nuestro conjunto de datos respondieron. Independientemente de la afiliación partidaria de un usuario, al responder a las personas de la otra parte, hablaron a través de los canales de mensajes que normalmente prefieren las personas de su partido en particular. En segundo lugar, cuando los demócratas respondieron a otros demócratas, era más probable que hablaran sobre Putin, elecciones falsas y COVID, mientras que los republicanos se centraron en detener el bloqueo y las noticias falsas de China.

ocurre la polarización

La polarización es un patrón común en las redes sociales y ocurre en todo el mundo, no solo en los EE. UU. Hemos visto cómo analizar la identidad y el comportamiento de una comunidad en un escenario polarizado. Con estas herramientas, cualquiera puede reproducir el análisis de conglomerados en un conjunto de datos de su interés para ver qué patrones emergen. Los patrones y resultados de estos análisis pueden esclarecer y ayudar a generar más investigaciones.

También en esta serie:

Lectura adicional en el blog de ingeniería de Toptal:

[ad_2]

Si quieres conocer otros artículos parecidos a Análisis de redes sociales con R:Mining para clústeres de Twitter puedes visitar la categoría Software.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir