library(rtweet)      # EXTRACCIÓN DE TWEETS
library(tidyverse)   # MANIPULACIÓN Y REPRESENTACIÓN DE DATOS
library(igraph)      # CREACIÓN DE GRAFOS
library(ggraph)      # REPRESENTACIÓN DE GRAFOS
library(twinetverse) # CREACIÓN (graphTweets) GRAFOS DE TWITTER, REPRESENTACIÓN GRAFOS (sigmajs)
## -- Attaching twinetverse ---------------------------------- twinetverse 0.0.2 --
library(hrbrthemes)  # TIPOGRAFIA DE GRÁFICOS
library(flextable)   # REPRESENTACIÓN DE TABLAS
library(RColorBrewer)# PALETAS DE COLORES
library(readxl)        # IMPORTACIÓN EXPORTACIÓN DE DATOS EXCEL

Introducción

Antecedentes

El presente documento contiene mis notas prepararoria para un trabajo de análisis de redes sociales sobre las percepciones de la población alrededor de la cuestión de las personas refugiadas. El trabajo globales debería consistir de 3 líneas: una encuesta sobre una muestra aleatoria de la población, unos grupos focales dirigidos a expertos en dicha temática y, precisamente, un análisis de redes sociales, del que estas notas representan un documento preparatorio.

Justificación

La movilidad humana (80 millones de personas), en particular la forzosa por conflictos y crisis humanitarias hace que la población huya de sus países en búsqueda de protección internacional. Hoy son 26 millones de personas refugiadas, cifra sin precedentes.

En los países receptores este fenómeno genera opiniones y sentimientos a menudo discordantes, y despierta debates encendidos. El sentimiento de rechazo hacia la acogida de los refugiados, parece crecer. Las organizaciones que trabajan en la protección de los refugiados y las instituciones de los países de acogida tienen cada vez más interés en conocer las opiniones, como se generan y cómo circulan en la sociedad.

Las técnicas que analizan los fenómenos humanos son cada vez más refinadas y variadas en función no sólo de los nuevos instrumentos de análisis que ofrecen las tecnologías de la información, sino también de los nuevos medios y patrones de comunicación que tenemos los humanos.

Cada vez más, para conocer mejor qué pensamos y cómo lo comunicamos los instrumentos cuali-cauntitativos tradicionales pueden complementarse con otros que pueden añadir nuevas perspectivas de análisis y de interpretación de los datos.

El análisis de redes sociales que ya representaba un recurso importante, ha tomado un impulso aún más importante con la mejora de las capacidades de computación y la introducción de algoritmos más eficientes.

Definición de red social y de análisis de redes sociales (SNA)

Comprender el comportamiento social humano es importante para comprender los sofisticados procesos que ocurren en la vida real. Las redes sociales, como medio de comunicación humana, pueden considerarse una fuente primaria de análisis del comportamiento social. El análisis de redes sociales (SNA), que se originó a partir de la teoría de los grafos, se ha convertido en una de las herramientas esenciales para el estudio de los movimientos sociales.

Twitter es una de las redes sociales más populares y un medio de noticias en línea que permite a los usuarios expresar sus puntos de vista y participar en una amplia gama de temas diferentes en el mundo. En el flujo de informaciones y opiniones contemporáneo, Twitter se encuentra entre los canales que permiten a los usuarios individuales interactuar de una manera más comprometida y autónoma. Twitter también se ha convertido en una plataforma mediante la cual se comparten y difunden diferentes puntos de vista en la sociedad, y juega un papel vital en los eventos y procesos sociales actuales.

Las redes sociales forman un entorno donde las personas expresan sus opiniones y colaboran para generar discusiones que afectan a los gobiernos a tomar las decisiones solicitadas. Además, también es un entorno en el que las personas expresan su gratitud, agradecimiento, disconformidad o enfado a los demás. Por lo tanto, estudiar y analizar las redes sociales podría revelar el flujo de información y los patrones que podrían usarse para orientar decisiones y políticas.

A menudo, las redes sociales se estudian basándose en la teoría de grafos. En matemáticas, la teoría de grafos es el estudio de grafo, que se utiliza para modelar relaciones por pares entre objetos. Por lo tanto, un gráfo está formado por vértices (o nodos), que están conectados por bordes (o enlaces). Sobre la base de la teoría de los grafos, han surgido muchos conceptos que se han utilizado para resolver problemas en el análisis de redes sociales.

Objetivos del trabajo

El propósito de este análisis será descubrir como se relacionan los usuarios en esta discusión; descubrir si forman grupos basados en su opinión; cómo se diferencian los niveles de popularidad, por ejemplo, en términos del número de seguidores, o de seguidores de seguidores.

Aspectos metodológicos previos

Redes analizadas: Twitter

Siendo un trabajo preparatorio y, no hay que esconderlo, debida mi relativa inexperiencia en el tema, he optado centrar el trabajo en una red social: Twtter. Su popularidad y eficacia en vehicular ideas y opiniones son aspectos que han pesado en orientarnos, pero también la eficacia de su API (Interfaz de Programación de Aplicaciones) en facilitar el acceso a los datos por parte de los desarrolladores es otro aspecto que ha pesado en este sentido.

Obtención de los datos

Los datos se rastrearon utilizando la API de búsqueda para la palabra clave “refugiados”. No se utilizaron hashtags, tipo #refugiados, porque sabemos que según la opinión que se tenga el usuario de Twitter puede utilizar unos hashtags u otros. La extracción de tweets se realizó entre los días XX/XX/2021 y XX/XX/2021. Utilizando el paquete rtweet, Twitter permite extraer tweets recientes de hasta 8 dias la función utilizada para la extración ha sido search_tweets() y la que se ha usado para guardar la base de datos ha sido write_as_csv().

# EXTRACCIÓN
refugiados <- search_tweets('refugiados', n=100000,
                                  token = TK,
                                  include_rts=TRUE,
                                  lang='es',
                                  retryonratelimit = TRUE)

# ALMACENAMIENTO
write_as_csv(refugiados, 
             file_name = "refug_twitter_00000.csv", 
             prepend_ids = TRUE, na = "", 
             fileEncoding = "UTF-8")

Se trata de un proceso que se ha realizado cíclicamente cada 8 días, durante el cual se han creado varios data frames que finalmente se han fusionado en uno solo.

Como resultado, el conjunto de datos contenia XXXXXXXXX tweets, con más de XXXXXXX usuarios. Las estadísticas del conjunto de datos se muestran en la Tabla XX.

Lectura fichero de tweets descargado anteriormente

El fichero incluye tweets y retweets. La lectura se realiza mediante una función específica de rtwitter:

ref <- read_twitter_csv("refug_twitter_08212_ret.csv")
dim(ref)
## [1] 107997     90

Dado el volumen muy grande de tweets que hay que procesar hemos decidido trabajar con una muestra aleatoria del 10% del total de tweets, utilizando la función sample() del paquete base de R.

set.seed(180662) # Fijar la muestra para que sea reproducible
indexsamp <- sample(1:nrow(ref), floor(nrow(ref)/10))
head(ref[indexsamp, ])
## # A tibble: 6 x 90
##   user_id         status_id created_at screen_name text  source display_text_wi~
##   <chr>           <chr>     <chr>      <chr>       <chr> <chr>             <int>
## 1 1875276487      14323510~ 2021-08-3~ RguzBel     "No ~ Twitt~              122
## 2 307035093       14316121~ 2021-08-2~ paauubbpp   "800~ Twitt~              140
## 3 51455988        14323147~ 2021-08-3~ loco_yiyo   "-Ch~ Twitt~              140
## 4 14229998875794~ 14317032~ 2021-08-2~ Manuela313~ "¿Pe~ Twitt~              108
## 5 10391432352125~ 14310227~ 2021-08-2~ elefantagr~ "Los~ Twitt~              140
## 6 78621431874015~ 14315816~ 2021-08-2~ Eudardo146  "¿Pe~ Twitt~              108
## # ... with 83 more variables: reply_to_status_id <chr>, reply_to_user_id <chr>,
## #   reply_to_screen_name <chr>, is_quote <lgl>, is_retweet <lgl>,
## #   favorite_count <int>, retweet_count <int>, quote_count <lgl>,
## #   reply_count <lgl>, hashtags <chr>, symbols <chr>, urls_url <chr>,
## #   urls_t.co <chr>, urls_expanded_url <chr>, media_url <chr>,
## #   media_t.co <chr>, media_expanded_url <chr>, media_type <chr>,
## #   ext_media_url <chr>, ext_media_t.co <chr>, ...

Heramientas específicas para generación y procesamiento de grafos

Hemos decidido seguir seguir un doble camino:

  • Utilizar igraph para el calculo de medidas de centralidad
  • Utilizar graphTweets y sigmajs para visualizar las redes.

Esto porque en nuestra pruebas previas la graficación de sigmajs nos ha aparecido más eficaz e interactiva para visualizar graficos tan densos, con tantos nodos.

Análisis de los retweets

Dentro de las diferentes posibilidades de creación de relaciones que ofrece esta red, el primer paso ha sido analizar los retweets. Ver como se relacionan las personas usuarias a través de este instrumento que les ofrece Twitter para que una persona dé visibilidad dentro de su red a la opinión de otra persona.

Generación, procesamiento y análisis de grafos

Construcción del data frame para igraph

Se filtran únicamente los retweets a través de la variable is_retweet.

ref1 <- ref[indexsamp, ] %>% filter(is_retweet == TRUE) %>% 
    select(screen_name, retweet_screen_name) %>% distinct() # el uso de "distinct()" es muy importante porque hemos podido comprobar que la función de "graph_from_data_frame()" no tiene en cuenta de los links repetidos. De esta manera el degree que se obtendrá con "igraph" será igual al que se encuentrará con "graphTweets".

El objeto creado se enchufa a la función graph_from_data_frame() para crear un grafo igraph.

ref1 %>% graph_from_data_frame() -> rt_g
summary(rt_g)
## IGRAPH d61c3d0 DN-- 9677 9472 -- 
## + attr: name (v/c)

Medidas locales de centralidad

La centralidad en cualquier red es una medida de cuán centrales son sus nodos más centrales. Hay varias métricas para la centralidad, incluidos el grado (degree), los vectores propios (eigenvector), la cercanía (closeness) y el PageRank.

También el grado de entrada (in-degree) y de salida (out-degree) dan una indicación de la centralidad en unos grafos dirigidos.

Las medidas locales de centralidad están basadas en el concepto general de centralidad (redes no dirigidas) o prestigio (redes dirigidas), una medida general de la posición de un actor en la estructura global de la red social. Se usan para identificar los actores clave de la red. Muestran como las relaciones se concentran en unos pocos individuos, dando una idea de su poder social.

Los actores con una “posición más central” (una mayor centralidad) tienen un acceso más fácil y rápido a los demás actores de la red (útil para acceder a recursos como información) y una mayor capacidad para ejercer un control del flujo entre ellos.

En el ámbito de este estudio nos vamos a centrar en tres de estas medidas: grado (grade), intermediación (betweenness) y pageRank

Grados (degrees)

Definición: Centralidad de grado de un actor (\(C_D\)) es el número de enlaces que lo conectan con otros. En nuesto caso serán los retweets. \[C_D(A)=k_A=1;C_D(B)=k_B=4\]

Definición: En redes dirigidas, se define el Prestigio de entrada (in-degree), denominado Soporte, y el Prestigio de salida (out-degree), denominado Influencia. En el caso de nuestros retweets, el sooporte / in-degree indica el número de retweets que recibe un usuario y la influencia (out-degree) indica cuántos retweets realiza un usuario. \[P^{in}_D(C)=k^{in}_D=2;P^{out}_D(C)=1\]

Se va a representar la distribución de los degrees. Vemos que esta distribución sigue una pauta muy común en las redes sociales: “muchos nodos con muy pocas conexiones y muy pocos nodos con muchísimas”.

ggplot(data_frame(y=degree_distribution(rt_g), x=1:length(y))) + # Dona la distribució dels degrees
    geom_segment(aes(x, y, xend=x, yend=0), color="red") +
    scale_y_continuous(expand=c(0,0), trans="sqrt") +
    labs(x="Degree", y="Density (sqrt scale)", title="Distribución de los 'degrees'")+
    theme_ipsum_rc(grid="Y", axis="x")

El objeto igraph se puede convertir en un dataframe con los grados de cada nodo ordenados en orden descendiente. Aquí visualizamos los 10 usuarios con crado más alto.

degrees <- degree(rt_g, mode = "in") %>%  data.frame()
degrees <- data.frame(nodes = row.names(degrees), degrees)
names(degrees) <- c("nodes", "degrees")
rownames(degrees) <- NULL
degrees %>% arrange(desc(degrees)) %>% head(10)
##             nodes degrees
## 1        Alvisepf     835
## 2        pablom_m     745
## 3        anluma99     383
## 4   edubarbaramos     318
## 5    VKseDefiende     305
## 6      PMunozLedo     235
## 7        okdiario     191
## 8      100_espana     151
## 9       aracelibs     146
## 10 ramiroaguilart     144

Clasificación de algunos nodos

Nuestro interés es poder clasificar algunos nodos en base al contenido de los tweets para poder de alguna manera asignarles algunos atributos y ver como éstos encajan con la distribución de la red. Vamos entonces a añadir un data frame a partir de nuestra muestra que incluya el texto, para poderlo clasificar

ref2 <- ref[indexsamp, ] %>% filter(is_retweet == TRUE) %>% 
  select(text,retweet_screen_name)

Vamos a evaluar el texto de los tweets con los usuarios con los grados más altos (esto es, sus tweets en nuestra selección tienen más “retweeteadores”:

deg_eval_excel <- degrees %>%
    left_join(ref2, by = c("nodes" = "retweet_screen_name")) %>% 
    distinct(nodes,degrees,text) %>% 
    arrange(desc(degrees)) %>% head(n=40)

# write.xlsx(deg_eval_excel,"deg_eval_excel.xlsx") 
# clasificación de los 40 retweets
# añadir columna con posicionamiento y eval.user que es la tipología de usuario

deg_eval <- read_xlsx("deg_eval_excel.xlsx",
                     sheet = "Sheet1")

deg_eval <- deg_eval %>% distinct(nodes,eval,eval.user) 
deg_eval %>% flextable()

Criterios para la clasificación

Esto nos va a proveer una tabla con unos usuarios con unas determinados atributos. Cabe decir que la clasificación manual que hemos realizado puede tener cierto grado de subjetividad.

Los posicionamientos (eval) pueden tener muchos matices:

  • con “contra” se identifican opiniones contrarias, críticas o desconfiadas en relación con la acogida de refugiados en el país propio (por las fechas durante las que se realizó la extracción el tema de discusión en muchos casos es sobre las personas refugiadas de Afganistan).
  • Con “favor” se identifican opiniones positivas hacia la acogida, aunque con reservas.
  • Con “neutro” se identifican opiniones que o no se formulan claramente o son en realidad sobre otra temática sobre refugiados (por ejemplo tweets sobre refugiados españoles de la Guerra Civil).

Por lo que se refiere a las características de los usuarios, hemos intentado identificar 3 categorías: particulares, medios de comunicación (media) y entidades. En el caso de los media hemos incluído también los periodistas (es el caso de los usuarios “anapastor” y “eduardoinda”, oorejemlo), ya que normalmente actúan como caja de resonancia del medio para el que trabajan.

Esto, como vamos a ver más adelante, se traducirá en nodos con colores y formas diferentes.

Construcción de una red con graphTweets

Para construir una red de retweets con graphTweets, vamos a utilizar el orden gt_edges, basado en screen_ name y retweet_screen_name (nombres de los usuarios cuyo tweet es retwiteado) que aporta el API de Twitter.

# building a network of Twitter retweets with graphTweets
 
retweets <- ref[indexsamp, ] %>% 
    filter(is_retweet == TRUE)

# crear nodos y edges
net <- retweets %>% 
  gt_edges(screen_name, retweet_screen_name, tl = FALSE) %>% # get edges. Put tl (tolower)=FALSE. IMPORTANTE PARA FUSIONAR DESPUEL EL DATA FRAME CON EL CUADRO deg_eval
  gt_nodes() %>% # get nodes
  gt_collect() # collect

c(edges, nodes) %<-% net

nodes <- nodes2sg(nodes)
edges <- edges2sg(edges)

Visualización del grafo de retweets

En este primer caso visualizaremos un grafo de retweets donde el tamaño de los nodos estará en función de su grado, es decir, tal y como lo hemos definido, el prestigio de cada usuario. Adicionalmente vamos a incorporar a la visualización de los nodos con mayor grado los atributos que hemos identificado anteriormente, utilizando para ello el color y la forma, creando dos variables adicionales en el data frame.

# Asignación de diferentes características gráficas a los atributos: el color para el posicionamiento (eval) y la forma para las caracterísiticas del usuario (eval.user)

nodes <- nodes %>% left_join(deg_eval, by = c("id"="nodes")) %>% 
  mutate(eval=if_else(is.na(eval), "",eval)) %>% 
  mutate(color= case_when(eval=="contra" ~ "red",
                          eval=="favor" ~ "yellow",
                          eval=="neutro" ~ "green",
                          eval=="" ~ "")) %>% 
  mutate(eval.user=if_else(is.na(eval.user), "",eval.user)) %>% 
  mutate(shapes= case_when(eval.user=="particular" ~ "circle",
                          eval.user=="media" ~ "square",
                          eval.user=="asociación" ~ "diamond",
                          eval.user=="" ~ ""))

Ahora podemos ejecutar la visualización utilizando la función sigmajs(). Los atributos y caracerísticas que hemos determinado se fijan en los parámetros de sg_nodes().

set.seed(180662)

sigmajs() %>% 
  sg_nodes(nodes, id, label, size, color=color, type=shapes) %>% 
  sg_edges(edges, id, source, target) %>% 
  sg_layout(layout = igraph::layout_components) %>% 
  
  sg_settings(
    minNodeSize = .5,
    maxNodeSize = 8,
    edgeColor = "default",
    defaultEdgeColor = "#d3d3d3",
    zoomMax = 8
  )

La visualización que se produce presents muchas aspectos interesantes. Vamos a destacar algunos:

  • Se forman dos grandes clusters. La distribución de los colores nos permite identificar claramente, por un lado, el cluster que de alguna forma (simplificando, obviamente) están a favor de la acogida de emigrantes y, por el otro, el de los que están en contra.
  • Primera observación: el algoritmo no sabe nada del contenido de los textos, ni tampoco sabe nada de como nosotros hemos clasificado algunos tweets. Sencillamente aplica una fórmula que mide las relaciones entre usuarios y sus retweets. Sin embargo se puede observar como separa claramente los usuarios que nosotros hemos identificado com “a favor” de un “lado” y en contra, del otro.


betweenness <- betweenness(rt_g) %>%  data.frame() # Por defecto es "directed = TRUE"
d <- data.frame(nodes = row.names(betweenness), betweenness)
names(d) <- c("nodes", "values")
rownames(d) <- NULL
d %>% arrange(desc(values)) %>% head(40)
##              nodes values
## 1       100_espana  755.0
## 2     DGuirilandia  487.0
## 3      jjdesmeules  380.0
## 4      PerujoMaria  219.0
## 5         okdiario  189.0
## 6        LadyAtila  129.0
## 7   ChovaresJavier  100.0
## 8       KimeScream   68.0
## 9          el_pais   62.0
## 10    rtvenoticias   59.0
## 11 REALFANCLUBDVOX   55.0
## 12     _anapastor_   20.0
## 13   seanmamo_11tw   13.5
## 14   blocobotanico   12.0
## 15    Mila87723614   12.0
## 16         rouco64   12.0
## 17     CapitanApio   11.0
## 18 rafaelgil251051   10.0
## 19    Miss_Bennet7   10.0
## 20        Machepa2    7.0
## 21     Sinolodigo2    7.0
## 22    Maria_PujolR    6.0
## 23  sanchezdelreal    6.0
## 24   UniversidadPe    5.0
## 25    DonutsComeme    5.0
## 26    Cris_Hispana    5.0
## 27     raqueltorrs    5.0
## 28         Dsagunt    5.0
## 29 Pedrosepulturas    5.0
## 30        AlbNavar    4.0
## 31           ea1wg    4.0
## 32        jatirado    4.0
## 33         Jjsb441    4.0
## 34  jesusccarrillo    4.0
## 35         Aryayol    3.5
## 36    NoticieroMAD    3.0
## 37  CristinaSegui_    3.0
## 38  IbehispIb__xx0    3.0
## 39   CarmenPerfume    3.0
## 40 Valeria21130533    3.0
# Unir el texto del los retweets (text) con betweenness más alto (60) para poderlo clasificar
d_eval_betw <- d %>%
    left_join(ref2, by = c("nodes" = "retweet_screen_name")) %>% 
    distinct(nodes,text,values) %>% 
    arrange(desc(values)) %>% head(60)
flextable(d_eval_betw) %>% 
    width(j = 3, width = 5)
# CLASIFICACIÓN MANUAL EN EXCEL DE LOS RETWEENTS, CREANDO DOS COLUMNAS, eval Y aval.user Y VUELTA A R
# write.xlsx(d_eval_betw,"d_eval_betw.xlsx")
# clasificación de los 60 retweets
# añadir columnas con posicionamiento y descripcion usuario
d_eval_betw2 <- readxl::read_xlsx("d_eval_betw.xlsx",
                          sheet = "Sheet1")
d_eval_betw2 <- d_eval_betw2 %>% distinct(nodes,values,eval,eval.user)

d_eval_betw2 %>% flextable()
# Volver a crear nodos y edges
net <- retweets %>% 
  gt_edges(screen_name, retweet_screen_name, tl = FALSE) %>% # get edges. Put tl (tolower)=FALSE. IMPORTANTE PARA FUSIONAR DESPUEL EL DATA FRAME CON EL CUADRO deg_eval
  gt_nodes() %>% # get nodes
  gt_collect() # collect

c(edges, nodes) %<-% net

nodes <- nodes2sg(nodes)
edges <- edges2sg(edges)

# Vuelta generar el data frame donde aplicar el gráfico

nodes1 <- nodes %>% left_join(d_eval_betw2, by = c("id"="nodes")) %>% 
  mutate(eval=if_else(is.na(eval), "",eval)) %>% 
  mutate(color= case_when(eval=="contra" ~ "red",
                          eval=="favor" ~ "yellow",
                          eval=="neutro" ~ "green",
                          eval=="" ~ "")) %>% 
  mutate(eval.user=if_else(is.na(eval.user), "",eval.user)) %>% 
  mutate(shapes= case_when(eval.user=="particular" ~ "circle",
                          eval.user=="media" ~ "square",
                          eval.user=="asociación" ~ "diamond",
                          eval.user=="" ~ ""))

set.seed(180662)

sigmajs() %>% 
  sg_nodes(nodes1, id, label, size=values, color=color, type=shapes) %>% 
  sg_edges(edges, id, source, target) %>% 
  sg_layout(layout = igraph::layout_components) %>% 
  
  sg_settings(
    minNodeSize = .8,
    maxNodeSize = 8,
    edgeColor = "default",
    defaultEdgeColor = "#d3d3d3",
    zoomMax = 12
  )


pagerank <- unlist(page.rank(rt_g)$vector) %>% data.frame() # Por defecto es directed = TRUE
e <- data.frame(nodes = row.names(pagerank), pagerank)
names(e) <- c("nodes", "values")
rownames(e) <- NULL
e %>% filter(nodes != "NA") %>%  arrange(desc(values)) %>% head(40)
##              nodes      values
## 1         Alvisepf 0.035881502
## 2         pablom_m 0.033310875
## 3         anluma99 0.016751480
## 4        LadyAtila 0.016463703
## 5    edubarbaramos 0.014409325
## 6  FernndezCrisfnb 0.014093259
## 7     VKseDefiende 0.013517736
## 8       PMunozLedo 0.010663852
## 9          el_pais 0.010569631
## 10  jesusccarrillo 0.009219911
## 11     eduardoinda 0.007408494
## 12        okdiario 0.007181738
## 13       aracelibs 0.006610999
## 14  ramiroaguilart 0.006565461
## 15     jjdesmeules 0.005988676
## 16      100_espana 0.005798260
## 17    AlanBarrosoA 0.005760962
## 18   Shine_McShine 0.005289647
## 19        adirecto 0.004986442
## 20    HoyPalestina 0.004975437
## 21         DAVlDcu 0.004920165
## 22        omarbula 0.004636068
## 23      rubnpulido 0.003900170
## 24     PerujoMaria 0.003661054
## 25  hermanntertsch 0.003579328
## 26     sergiosayas 0.003318625
## 27       LRsecreta 0.003259101
## 28  Dannyelsan1613 0.003233776
## 29 JuanfraEscudero 0.003106116
## 30      KimeScream 0.003029461
## 31       Seryo6661 0.002967985
## 32    DGuirilandia 0.002887195
## 33 arroyomatteucc1 0.002785834
## 34     aalvarez_96 0.002558146
## 35 veintimillapier 0.002552255
## 36      EsLaRadio2 0.002517834
## 37    Navegaciones 0.002467070
## 38    N_Trastamara 0.002343107
## 39 peruenlanoticia 0.002317258
## 40      MarDGamero 0.002240900
# Unir el texto del los retweets (text) con PageRank más alto (60) para poderlo clasificar
d_eval_pR <- e %>%
    left_join(ref2, by = c("nodes" = "retweet_screen_name")) %>% 
    distinct(nodes,text,values) %>% 
    arrange(desc(values)) %>% head(60)
flextable(d_eval_pR) %>% 
    width(j = 3, width = 5)
# CLASIFICACIÓN MANUAL EN EXCEL DE LOS RETWEENTS, CREANDO DOS COLUMNAS, eval Y aval.user Y VUELTA A R
# write.xlsx(d_eval_pR,"d_eval_pR.xlsx")
# clasificación de los 60 retweets
# añadir columnas con posicionamiento y descripcion usuario
d_eval_pR <- read_xlsx("d_eval_pR.xlsx",
                          sheet = "Sheet1")
d_eval_pR <- d_eval_pR %>% distinct(nodes,values,eval,eval.user)

d_eval_pR %>% flextable()
# Volver a crear nodos y edges
net <- retweets %>% 
  gt_edges(screen_name, retweet_screen_name, tl = FALSE) %>% # get edges. Put tl (tolower)=FALSE. IMPORTANTE PARA FUSIONAR DESPUEL EL DATA FRAME CON EL CUADRO deg_eval
  gt_nodes() %>% # get nodes
  gt_collect() # collect

c(edges, nodes) %<-% net

nodes <- nodes2sg(nodes)
edges <- edges2sg(edges)

# Vuelta generar el data frame donde aplicar el gráfico

nodes2 <- nodes %>% left_join(d_eval_pR, by = c("id"="nodes")) %>% 
  mutate(eval=if_else(is.na(eval), "",eval)) %>% 
  mutate(color= case_when(eval=="contra" ~ "red",
                          eval=="favor" ~ "yellow",
                          eval=="neutro" ~ "green",
                          eval=="" ~ "")) %>% 
  mutate(eval.user=if_else(is.na(eval.user), "",eval.user)) %>% 
  mutate(shapes= case_when(eval.user=="particular" ~ "circle",
                          eval.user=="media" ~ "square",
                          eval.user=="asociación" ~ "diamond",
                          eval.user=="" ~ ""))

set.seed(180662)

sigmajs() %>% 
  sg_nodes(nodes2, id, label, size=values, color=color, type=shapes) %>% 
  sg_edges(edges, id, source, target) %>% 
  sg_layout(layout = igraph::layout_components) %>% 
  
  sg_settings(
    minNodeSize = .8,
    maxNodeSize = 8,
    edgeColor = "default",
    defaultEdgeColor = "#d3d3d3",
    zoomMax = 12
  )