Está en la página 1de 20

UNIVERSIDAD TECNICA DE MANABI

FACUlTAD DE CIENCIA INFoRMáTICA

INTEGRANTES:

❖ GABRIEl ENRIqUE MolINA PISCo

❖ RoSA ElENA CARRASCo ARREAGA

❖ VAlESkA SCARlET INDIo BARBERAN

MINERíA DE DAToS

ING. ERMENSoN oRDoñEz

Actividad # 6 - Resolución de problemas de Asociación

oNlINE

6 SEMESTRE
Tabla de contenido
Objetivo de la Actividad ...................................................................................................... 4

Desarrollo de la Actividad ................................................................................................... 4

Librerías a usar. .............................................................................................................. 4

Carga de datos ................................................................................................................ 4

Tratamiento de datos ...................................................................................................... 5

Cambiar el formato de fecha ....................................................................................... 5

Renombrar Columnas ................................................................................................. 5

Limpieza y Tokenización ................................................................................................. 6

Análisis Exploratorio ........................................................................................................ 7

Distribución temporal de los tweets ................................................................................ 7

Histograma .................................................................................................................. 8

Frecuencia de palabras................................................................................................... 9

Total de palabras usadas................................................................................................ 9

Gráfica de total de palabras usadas. ........................................................................ 10

Longitud media de los tweets ....................................................................................... 10

Gráfica de la longitud media de los tweets ............................................................... 10

Palabras más utilizadas ................................................................................................ 11

Stopwords...................................................................................................................... 11

Filtrado de stopwords ................................................................................................ 12

Representación gráfica de las frecuencias................................................................... 12

Wordcloud de un término. ............................................................................................. 13


Bigramas (frecuencias de 2 términos) .......................................................................... 14

Wordcloud de 2 términos. ............................................................................................. 16

Análisis de Sentimientos ............................................................................................... 16

Conclusión…………………………………………………………………………………..20
Objetivo de la Actividad

Resolución de problemas de clasificación.

Desarrollo de la Actividad

Librerías a usar.

library(rtweet)

library(tidyverse)

library(knitr)

library(lubridate)

library(wordcloud)

library(RColorBrewer)

library(RWeka)

library(tidytext)

library(wordcloud2)

library(ggwordcloud)

library(igraph)

library(ggraph)

library(quanteda)

library(tm)

Carga de datos

tweets<-read.csv("Datos/CamiloMusica.csv")

Para la actividad se tomó el dataset: datos_tweets_@CamiloMusica.csv


Tratamiento de datos

Cambiar el formato de fecha

tweets$created_at <- format(as.POSIXct(tweets$created_at, format = "%Y-%m-

%dT%H:%M:%SZ"), format = "%Y-%m-%d %H:%M:%S")

view(tweets)

Renombrar Columnas

tweets <- tweets %>% select(created_at, user_id, text, retweet_count,

favorite_count,screen_name)

tweets <- tweets %>% rename(fecha = created_at, tweet_id = user_id, texto =

text, conteo = retweet_count, favoritos = favorite_count, nombre =

screen_name)

view(tweets)
Limpieza y Tokenización

limpiar_tokenizar <- function(texto){

# El orden de la limpieza no es arbitrario


# Se convierte todo el texto a minúsculas
nuevo_texto <- tolower(texto)
# Eliminación de páginas web (palabras que empiezan por "http." seguidas
# de cualquier cosa que no sea un espacio)
nuevo_texto <- str_replace_all(nuevo_texto,"http\\S*", "")

# Eliminación de signos de puntuación

nuevo_texto <- str_replace_all(nuevo_texto,"[[:punct:]]", " ")

# Eliminación de números

nuevo_texto <- str_replace_all(nuevo_texto,"[[:digit:]]", " ")

# Eliminación de espacios en blanco múltiples

nuevo_texto <- str_replace_all(nuevo_texto,"[\\s]+", " ")

# Tokenización por palabras individuales

nuevo_texto <- str_split(nuevo_texto, " ")[[1]]

# Eliminación de tokens con una longitud < 2

nuevo_texto <- keep(.x = nuevo_texto, .p = function(x){str_length(x) > 1})

return(nuevo_texto)

# Se aplica la función de limpieza y tokenización a cada tweet

tweets <- tweets %>% mutate(texto_tokenizado = map(.x = texto,

.f = limpiar_tokenizar))

tweets %>% select(texto_tokenizado) %>% head()

tweets %>% slice(1) %>% select(texto_tokenizado) %>% pull()


Análisis Exploratorio

tweets_tidy <- tweets %>% select(-texto) %>% unnest(cols =

c(texto_tokenizado))

tweets_tidy <- tweets_tidy %>% rename(token = texto_tokenizado)

head(tweets_tidy)

Podemos Observar que en la fecha mencionada (24/01/2023), a las 22:00:36 hubo

una cantidad de 142 retweets y a las 22:00:54 hubo una cantidad de 445 retweets

de las cuales en el segundo 36 se usaron 2256 veces las palabras van, amar, y

en el segundo 54 se usaron 4242 veces las palabras camilos, camila, cabello y

\U0001f525\U0001f525\U0001f525, con lo cual podemos concluir que Camilo

demuestra en sus tweets que se centra mucho en hablar de sí mismo, así como de

su romanticismo de sus canciones.

Distribución temporal de los tweets

ggplot(tweets, aes(x = as.Date(fecha), fill = nombre)) +

geom_histogram(position = "identity", bins = 20, show.legend = FALSE) +

scale_x_date(date_labels = "%m-%Y", date_breaks = "5 month") +

labs(x = "fecha de publicación", y = "número de tweets") +

theme_bw() +

theme(axis.text.x = element_text(angle = 90))


Podemos apreciar que Camilo tuvo su mayor interacción de tweets en febrero del

2022 donde obtuvo su mayor interacción con sus seguidores alcanzando un promedio

de 30 tweets por mes estudiado, siendo diciembre de 2022 el de menor interacción

con sus seguidores alcanzando un valor <1 tweet por mes.

Histograma

tweets_mes_anyo <- tweets %>% mutate(mes_anyo = format.Date(fecha, "%Y-%m"))

tweets_mes_anyo %>% group_by(nombre, mes_anyo) %>% summarise(n = n()) %>%

ggplot(aes(x = mes_anyo, y = n, color = nombre)) +

geom_line(aes(group = nombre)) +

labs(title = "Número de tweets publicados", x = "fecha de publicación",

y = "número de tweets") +

theme_bw() +
theme(axis.text.x = element_text(angle = 90, size = 6),

legend.position = "bottom")

Podemos apreciar que conforme van pasando los meses su interacción con su

audiencia fue en decrecimiento, teniendo un pico de subida en junio 2022 y

luego de nuevo su interacción fue bajando lo que hace suponer que Camilo no

tiene una interacción regular en sus redes sociales (Twitter).

Frecuencia de palabras.

Total de palabras usadas.

tweets_tidy %>% group_by(nombre) %>% summarise(n = n())


Gráfica de total de palabras usadas.

Longitud media de los tweets

tweets_tidy %>% group_by(nombre, tweet_id) %>% summarise(longitud = n()) %>%

group_by(nombre) %>% summarise(media_longitud = mean(longitud),sd_longitud =

sd(longitud))

Gráfica de la longitud media de los tweets

tweets_tidy %>% group_by(nombre, tweet_id) %>% summarise(longitud = n()) %>%

group_by(nombre) %>%

summarise(media_longitud = mean(longitud),

sd_longitud = sd(longitud)) %>%

ggplot(aes(x = nombre, y = media_longitud)) +

geom_col() +

geom_errorbar(aes(ymin = media_longitud - sd_longitud,

ymax = media_longitud + sd_longitud)) +

coord_flip() + theme_bw()
Palabras más utilizadas

tweets_tidy %>% group_by(nombre, token) %>% count(token) %>% group_by(nombre)

%>%

top_n(10, n) %>% arrange(nombre, desc(n)) %>% print(n=30)

Stopwords

lista_stopwords <- c('de', 'que', 'en', 'la', 'el', 'mi', 'con',

'por','los','lo')
Filtrado de stopwords

tweets_tidy <- tweets_tidy %>% filter(!(token %in% lista_stopwords))

print(tweets_tidy)

Representación gráfica de las frecuencias

tweets_tidy %>% group_by(nombre, token) %>% count(token) %>% group_by(nombre)

%>%

top_n(10, n) %>% arrange(nombre, desc(n)) %>%

ggplot(aes(x = reorder(token,n), y = n, fill = nombre)) +

geom_col() +

theme_bw() +

labs(y = "", x = "") +

theme(legend.position = "none") +

coord_flip() +

facet_wrap(~nombre,scales = "free", ncol = 1, drop = TRUE)


Wordcloud de un término.

wordcloud_custom <- function(grupo, df){

print(grupo)

wordcloud(words = df$token, freq = df$frecuencia,

max.words = 400, random.order = FALSE, rot.per = 0.35,

colors = brewer.pal(8, "Dark2"))

df_grouped <- tweets_tidy %>% group_by(nombre, token) %>% count(token) %>%

group_by(nombre) %>% mutate(frecuencia = n / n()) %>%

arrange(nombre, desc(frecuencia)) %>% nest()

walk2(.x = df_grouped$`nombre`, .y = df_grouped$data, .f = wordcloud_custom)


Podemos notar que la gran mayoría de las palabras usadas por Camilo, son

preposiciones, es decir, usa palabras muy cortas para referiste en sus tweets.

Bigramas (frecuencias de 2 términos)

# Crear un corpus a partir del texto en la columna que deseas analizar

(supongamos que es "texto")

corpus <- VCorpus(VectorSource(tweets$texto))

# Preprocesar el corpus

corpus <- tm_map(corpus, content_transformer(tolower))

corpus <- tm_map(corpus, removePunctuation)

corpus <- tm_map(corpus, removeNumbers)

corpus <- tm_map(corpus, removeWords, stopwords("spanish"))

corpus <- tm_map(corpus, stripWhitespace)

# Crear bigramas

bigram_tokenizer <- function(x) unlist(lapply(ngrams(words(x), 2), paste,

collapse = " "))

dtm <- DocumentTermMatrix(corpus, control = list(tokenize =

bigram_tokenizer))

# Convertir la matriz de términos a un dataframe

df_bigramas <- as.data.frame(as.matrix(dtm))

colnames(df_bigramas) <- colnames(dtm)

# Calcular la frecuencia de los bigramas

frecuencias <- colSums(df_bigramas)

# Crear un dataframe con los bigramas y sus frecuencias

df_frecuencias <- data.frame(Bigrama = names(frecuencias), Frecuencia =

frecuencias)
# Ordenar los bigramas por frecuencia descendente

df_frecuencias <- df_frecuencias[order(-df_frecuencias$Frecuencia), ]

# Graficar los 30 bigramas más frecuentes

library(ggplot2)

ggplot(head(df_frecuencias, 30), aes(x = reorder(Bigrama, Frecuencia), y =

Frecuencia)) +

geom_bar(stat = "identity") +

coord_flip() +

labs(x = "Bigrama", y = "Frecuencia") +

theme_minimal()

Observando el bigrama podemos deducir que Camilo siempre saluda a sus fans y

que habla de sus conciertos y en donde estos se realizarán.


Wordcloud de 2 términos.

set.seed(123) # Opcional: establece una semilla para la reproducibilidad

wordcloud(words = df_frecuencias$Bigrama, freq = df_frecuencias$Frecuencia,

min.freq = 1, scale = c(3, 0.5), colors = brewer.pal(8, "Dark2"))

Análisis de Sentimientos

# En este ejercicio se emplea la clasificación positiva/negativo proporcionada

por el diccionario bing.

sentimientos <- get_sentiments(lexicon = "bing")

head(sentimientos)

# Para facilitar el cálculo de sentimientos globales (autor, tweet…) se

recodifican los sentimientos como +1 para positivo y -1 para negativo.


sentimientos <- sentimientos %>%

mutate(valor = if_else(sentiment == "negative", -1, 1))

# Sentimiento promedio de cada tweet

# Al disponer de los datos en formato tidy (una palabra por fila), mediante un

inner join se añade a cada palabra su sentimiento y se filtran automáticamente

todas aquellas palabras para las que no hay información disponible.

tweets_sent <- inner_join(x = tweets_tidy, y = sentimientos,

by = c("token" = "word"))

# Se suman los sentimientos de las palabras que forman cada tweet.

tweets_sent %>% group_by(nombre, tweet_id) %>%

summarise(sentimiento_promedio = sum(valor)) %>%

head()

# Porcentaje de tweets positivos, negativos y neutros por autor

tweets_sent %>% group_by(nombre, tweet_id) %>%

summarise(sentimiento_promedio = sum(valor)) %>%

group_by(nombre) %>%

summarise(positivos = 100 * sum(sentimiento_promedio > 0) / n(),

neutros = 100 * sum(sentimiento_promedio == 0) / n(),

negativos = 100 * sum(sentimiento_promedio < 0) / n())


tweets_sent %>% group_by(nombre, tweet_id) %>%

summarise(sentimiento_promedio = sum(valor)) %>%

group_by(nombre) %>%

summarise(positivos = 100*sum(sentimiento_promedio > 0) / n(),

neutros = 100*sum(sentimiento_promedio == 0) / n(),

negativos = 100*sum(sentimiento_promedio < 0) / n()) %>%

ungroup() %>%

gather(key = "sentimiento", value = "valor", -nombre) %>%

ggplot(aes(x = nombre, y = valor, fill = sentimiento)) +

geom_col(position = "dodge", color = "black") + coord_flip() +

theme_bw()
Como podemos analizar en la gráfica todos los tweets de Camilo son positivos,

ya que siempre está hablando de amor, cariño, saludando a sus fans, dando

detalles de sus lugares de concierto, etc.

# Evolución de los sentimientos en función del tiempo.

# A continuación, se estudia como varía el sentimiento promedio de los tweets

agrupados por intervalos de un mes para cada uno de los usuarios.

tweets_sent %>% mutate(anyo = year(fecha),

mes = month(fecha),

anyo_mes = ymd(paste(anyo, mes, sep="-"),truncated=2))

%>%

group_by(nombre, anyo_mes) %>%

summarise(sentimiento = mean(valor)) %>%

ungroup() %>%

ggplot(aes(x = anyo_mes, y = sentimiento, color = nombre)) +

geom_point() +

geom_smooth() +

labs(x = "fecha de publicación") +

facet_wrap(~ nombre, ncol = 1) +

theme_bw() +

theme(legend.position = "none")
CONCLUSIONES

Conforme como fuimos haciendo el ejercicio fuimos haciendo limpieza y tonificación en cada
paso, también la eliminación de página web
Se aprendió a como varía el sentimiento promedio de los tweets agrupados por intervalos de
un mes para cada uno de los usuarios.
El conocimiento adquirido sobre la preparación de datos, selección de parámetros y
visualización de resultados puede aplicarse en diversos contextos comerciales y de análisis de
datos.
También podemos notar que la gran mayoría de las palabras usadas por Camilo, son
preposiciones

También podría gustarte