class: center, middle, inverse <img src="logo.png" width="250px" /> # COMPARACIÓN ENTRE APPLE Y SAMSUNG A TRAVÉS DEL TEXT MINING EN TWITTER ## BIG DATA ### Estudiantes: ### Fabiola Aguilar - Cristóbal Matamala - Javiera Ramiréz ### Prof. Mauricio Huerta --- class: center, middle # **PLANTEAMIENTO DEL PROBLEMA** *** .pull-left[ .center[<img src="apple.jpeg" width="250px" />] ] .pull-right[ .center[<img src="samsung.jpeg" width="310px" />] ] ## Las empresas Apple y Samsung son competidoras entre sí en algunos de sus productos y se basan principalmente en lo que opinan sus clientes sobre estos. En este estudio se realizará una minería de opiniones o análisis de sentimientos en base a los Tweets de las personas para realizar una comparación entre Apple y Samsung. --- class: center, middle # **MOTIVACIÓN** *** <img style="border-radius: 50%;" src="motivacion.png" width="200px" /> ## Nos motiva el poder llegar a las opiniones tanto positivas como negativas de los usuarios (en la red social Twitter) sobre las marcas Apple y Samsung para así realizar un análisis comparativo y descriptivo de ellas. --- class: center, middle # **PREGUNTAS DE INVESTIGACIÓN** *** .pull-left[ + ## ¿Qué marca tiene mayor proporción de opiniones positivas en la red social Twitter? + ## ¿Cuál es la proporción o porcentaje de opiniones positivas y negativas sobre la marca Apple en la red social Twitter?] .pull-right[ + ## ¿Qué marca tiene mayor proporción de opiniones negativas en la red social Twitter? + ## ¿Cuál es la proporción o porcentaje de opiniones positivas y negativas sobre la marca Samsung en la red social Twitter?] --- class: center, middle # **OBJETIVOS** *** .left-column[ # **OBJETIVO GENERAL** ### **Implementar una estrategia para extraer la opinión de los usuarios en Twitter, a través del Text Mining, para poder clasificar los tweets.** ] .right-column[ # OBJETIVOS ESPECIFICOS .pull-left[ + ###Construir un conjunto de datos de la red social Twitter en base a tweets sobre la marca Apple. + ###Construir un conjunto de datos de la red social Twitter en base a tweets sobre la marca Samsung.] .pull-right[ + ###Comparar la marca Apple y Samsung basado en Text Mining de la red social Twitter. + ###Describir la marca Apple y Samsung basado en Text Mining de la red social Twitter.] ] --- class: center, middle # **ALCANCE DE INVESTIGACIÓN** *** <img style="border-radius: 50%;" src="alcance.jpeg" width="200px" /> ## Alcance Descriptivo --- class: middle # **HIPÓTESIS DE INVESTIGACIÓN** *** + ## La marca Apple tiene mayor proporción de opiniones positivas. + ## En la red social Twitter se encuentran más opiniones positivas que negativas de ambas marcas. + ## La marca Samsung tiene mayor proporción de opiniones negativas. --- class: middle # **RECOPILACIÓN DE DATOS** *** + Utilizamos la librería rtweet que nos permite interactuar con la API de Twitter y extraer los datos ```r install.packages("rtweet") *library(rtweet) ``` + Consideramos sólo los tweets en español y no incluimos retweets. _(Ejemplo de Samsung)_ ```r Samsung <- search_tweets("Samsung OR #samsung OR samsung OR #Samsung", n = 3000, * include_rts = FALSE, * lang = "es", retryonratelimit = TRUE) ``` + Cantidad de tweets: 17.996 de Apple y 8.819 de Samsung --- class: middle # **RECOPILACIÓN DE DATOS** *** + Los datos obtenidos se ven de la siguiente forma
--- class: middle # **RECOPILACIÓN DE DATOS** *** + Guardamos los datos extraidos en un archivo *.rds*, repitiendo el procedimiento durante 5 días (23-28 nov). ```r write_rds(samsung, file = file.path("TRABAJO-BIGDATA, paste0(Sys.Date(), " Samsung.rds"))) ``` + Se leen los datos recopilados y se compilan. ```r RDS_file_samsung <- grep(list.files(here("TRABAJO-BIGDATA"), full.names = T), pattern = "Samsung.rds", value = T) patron <- "Samsung.rds" directorio <- here("TRABAJO-BIGDATA") samsung <- pmap_df(list(RDS_file_samsung, patron, directorio), leerRDS) leerRDS <- function(rds_file,patron,directorio){ rds_filename <- gsub(rds_file,pattern = paste0(directorio,"/"), replacement = "") rds_fecha <- gsub(rds_filename, pattern = patron, replacement = "") readRDS(rds_file) %>% mutate(harvest_date = as.Date(rds_fecha)) } ``` --- class: middle # **RECOPILACIÓN DE DATOS** *** + Se unen los datos para trabajarlos de mejor forma. ```r samsung <- pmap_df(list(RDS_file_samsung, patron, directorio),leer) ``` --- class: middle # **PREPROCESAMIENTO** *** + Seleccionamos solo algunas variables que son las que nos interesan. ```r samsung <- Samsung %>% select(user_id, created_at, text, favorite_count, reply_count, retweet_count, followers_count) ``` + Renombramos las variables con nombres más prácticos. ```r samsung <- samsung %>% rename(Autor = user_id, Fecha = created_at, Texto = text, Respuestas = reply_count, Likes = favorite_count, Retweets = retweet_count, Seguidores = followers_count) ``` --- class: middle # **PREPROCESAMIENTO** *** + Se utiliza una función llamada `limpiar_tokenizar` para limpiar los tweets. ```r nuevo_Texto <- tolower(Texto) # Eliminación de páginas web nuevo_Texto <- str_replace_all(nuevo_Texto,"http\\S*", "") # Eliminación de menciones con @ nuevo_Texto <- str_replace_all(nuevo_Texto,"@\\S*", "") # Eliminacion de hashtag nuevo_Texto <- str_replace_all(nuevo_Texto,"#\\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]+", " ") ``` --- class: middle # **PREPROCESAMIENTO** *** + Seleccionamos un tweet por usuario, el que tenga más likes (para tweets duplicados). ```r samsung_nd <- samsungtext %>% arrange(Likes) %>% filter(!duplicated(Texto)) ``` + La cantidad de datos se redujo a 83838 y 838383 para Apple y Samsung respectivamente. + Creamos un data frame con las palabras que queremos evitar más adelante, en el análisis. ```r samsung_words <- c("galaxyzflip","galaxy") stop_words1 <- data.frame(Palabras = c(stopwords(kind = "es"), samsung_words)) ``` --- class: middle # **ANÁLISIS** *** + Se calcula la frecuencia con la que cada autor ocupa una palabra. + Agrupamos las palabras iguales y sumamos el total de veces que aparecen. + Quitamos todas las palabras que solo se repiten una vez. --- class: middle # **ANÁLISIS** *** .pull-left[ .center[**SAMSUNG**] <table> <thead> <tr> <th style="text-align:left;"> word </th> <th style="text-align:right;"> m </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> precio </td> <td style="text-align:right;"> 693 </td> </tr> <tr> <td style="text-align:left;"> iphone </td> <td style="text-align:right;"> 657 </td> </tr> <tr> <td style="text-align:left;"> qled </td> <td style="text-align:right;"> 533 </td> </tr> <tr> <td style="text-align:left;"> mejor </td> <td style="text-align:right;"> 491 </td> </tr> <tr> <td style="text-align:left;"> oferta </td> <td style="text-align:right;"> 428 </td> </tr> <tr> <td style="text-align:left;"> ahora </td> <td style="text-align:right;"> 406 </td> </tr> </tbody> </table> ] .pull-rigth[ .center[**APPLE**] <table> <thead> <tr> <th style="text-align:left;"> word </th> <th style="text-align:right;"> m </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> app </td> <td style="text-align:right;"> 2289 </td> </tr> <tr> <td style="text-align:left;"> now </td> <td style="text-align:right;"> 1393 </td> </tr> <tr> <td style="text-align:left;"> spotify </td> <td style="text-align:right;"> 1322 </td> </tr> <tr> <td style="text-align:left;"> mejor </td> <td style="text-align:right;"> 1235 </td> </tr> <tr> <td style="text-align:left;"> radio </td> <td style="text-align:right;"> 1151 </td> </tr> <tr> <td style="text-align:left;"> android </td> <td style="text-align:right;"> 1126 </td> </tr> </tbody> </table> ] --- class: middle # **ANÁLISIS** *** .pull-left[ .center[**SAMSUNG**] <!-- --> ] .pull-right[ .center[**APPLE**] <!-- --> ] --- class: middle # **ANÁLISIS** *** .pull-left[ .center[**SAMSUNG**] <!-- --> ] .pull-right[ .center[**APPLE**] <!-- --> ] --- class: middle # **ANÁLISIS** *** .pull-left[ .center[**APPLE EN SAMSUNG**] <!-- --> ] .pull-right[ .center[**SAMSUNG EN APPLE**] <!-- --> ] --- class: middle # **ANÁLISIS DE SENTIMIENTOS** *** + Leemos el archivo _.csv_ de sentimientos. ```r afinn <- read.csv("lexico_afinn.en.es.csv", stringsAsFactors = F, fileEncoding = "latin1") %>% tbl_df() ``` + Quitamos las palabras duplicadas. ```r afinn <- afinn %>% arrange(Puntuacion) %>% filter(!duplicated(Palabra)) ``` --- class: middle # **ANÁLISIS DE SENTIMIENTOS** *** + Tomamos el data frame de la frecuencia de palabras y hacemos una intercepción con el data frame de sentimientos. Creamos una nueva variable que es el puntaje total por cada palabra y otra que indiza si es una valoración positiva o negativa. ```r analisis <- frec %>% inner_join(afinn,by =c("word"="Palabra"))%>% mutate(Ponderacion = m*Puntuacion, Apreciacion = ifelse(Puntuacion<0,"Negativo","Positivo")) ``` + Calculamos la proporcion de palabras negativas y positivas. ```r analisis %>% group_by(Apreciacion)%>% summarise(total = sum(m))%>% mutate(proporcion = total/sum(total)) ``` --- class: middle # **ANÁLISIS DE SENTIMIENTOS** *** .pull-left[ .center[*SAMSUNG*] <table> <thead> <tr> <th style="text-align:left;"> Apreciacion </th> <th style="text-align:right;"> total </th> <th style="text-align:right;"> proporcion </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Negativo </td> <td style="text-align:right;"> 2947 </td> <td style="text-align:right;"> 0.4189055 </td> </tr> <tr> <td style="text-align:left;"> Positivo </td> <td style="text-align:right;"> 4088 </td> <td style="text-align:right;"> 0.5810945 </td> </tr> </tbody> </table> ] .pull-right[ .center[*APPLE*] <table> <thead> <tr> <th style="text-align:left;"> Apreciacion </th> <th style="text-align:right;"> total </th> <th style="text-align:right;"> proporcion </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Negativo </td> <td style="text-align:right;"> 7610 </td> <td style="text-align:right;"> 0.4907461 </td> </tr> <tr> <td style="text-align:left;"> Positivo </td> <td style="text-align:right;"> 7897 </td> <td style="text-align:right;"> 0.5092539 </td> </tr> </tbody> </table> ] --- class: middle # **ANÁLISIS DE SENTIMIENTOS** *** .pull-left[ .center[*SAMSUNG*] <table> <thead> <tr> <th style="text-align:right;"> Promedio </th> <th style="text-align:right;"> Varianza </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 0.3179815 </td> <td style="text-align:right;"> 5.440386 </td> </tr> </tbody> </table> ] .pull-right[ .center[*APPLE*] <table> <thead> <tr> <th style="text-align:right;"> Promedio </th> <th style="text-align:right;"> Varianza </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 0.0628103 </td> <td style="text-align:right;"> 5.044552 </td> </tr> </tbody> </table> ] --- class: middle # **ANÁLISIS DE SENTIMIENTOS** *** .pull-left[ .center[*SAMSUNG*] <!-- --> ] .pull-right[ .center[*APPLE*] <!-- --> ] --- class: middle # **COMPLICACIONES** *** + ### Cantidad de tweets. + ### Tweets de publicidad. + ### Tweets iguales. + ### Palabras sin sentido (como símbolos). + ### Los paquetes para realizar el análisis de sentimientos en idiomas diferentes del español. + ### Traducción de palabras mal echa. --- class: center, middle, inverse # ¡GRACIAS POR SU ATENCIÓN!