Introducción.

  1. Definir el problema

R. Explorar y analizar el texto compartido mediate la red social Twitter para los Peregrinos en Santiago de Compostela.

  1. Identificación de los datos y método de recolección. —————–

R. Twitter es un servicio de mensajeria ampliamente difundida por más de 500 millones de usuarios, los cuales generan alrededor de 65 millones de “tweets” diarios. Los Tweets, son mensajes articulados en 140 caracteres, lo cuál, hace precisar el mensaje a comunicar. La recolección se realizo por medio de la API de Twitter, descargados como datos semiestructurados (Json). Periodo de tiempo (abril, 2016 - abril, 2019) La importancia de este formato es su capacidad de almacenar multiples atributos de diferente caracteristica.

file.choose() 3. Organización del texto. ———————————————-

library(readr)
tweet <- read_csv("Desktop/Datos/CSC_Tweets/select_Twitter0619.csv")
## Parsed with column specification:
## cols(
##   id_viaje = col_character(),
##   OBJECTID_1 = col_double(),
##   created_at = col_character(),
##   user_id_st = col_double(),
##   grid_code = col_double(),
##   textFix = col_character(),
##   lang = col_character(),
##   X_Corrd = col_double(),
##   Y_Coord = col_double(),
##   date_tweet = col_date(format = ""),
##   min_date = col_date(format = ""),
##   max_date = col_date(format = ""),
##   date_dif = col_double(),
##   count = col_double()
## )
tweet
## # A tibble: 36,384 x 14
##    id_viaje OBJECTID_1 created_at user_id_st grid_code textFix lang  X_Corrd
##    <chr>         <dbl> <chr>           <dbl>     <dbl> <chr>   <chr>   <dbl>
##  1 1000314…          4 2018/09/1…    1.00e18      3384 pilgri… en      -7.4 
##  2 1000314…          4 2018/09/1…    1.00e18      2565 great … en      -8.16
##  3 1000314…          4 2018/09/1…    1.00e18      2558 we mad… en      -8.55
##  4 1005339…         62 2016/07/2…    1.01e 8      6884 <NA>    es      -2.44
##  5 1005339…         62 2016/08/2…    1.01e 8      6746 <NA>    es      -2.44
##  6 1005339…         62 2016/08/2…    1.01e 8      6746 <NA>    es      -2.45
##  7 1005339…         62 2016/08/2…    1.01e 8      6746 <NA>    es      -2.45
##  8 1005339…         62 2016/08/2…    1.01e 8      6746 <NA>    es      -2.45
##  9 1005339…         62 2016/08/2…    1.01e 8      6746 <NA>    es      -2.44
## 10 1005339…         62 2016/08/1…    1.01e 8      6746 <NA>    es      -2.45
## # … with 36,374 more rows, and 6 more variables: Y_Coord <dbl>,
## #   date_tweet <date>, min_date <date>, max_date <date>, date_dif <dbl>,
## #   count <dbl>
sum(is.na(tweet)) # cantidad de columnas con datos vacios "NA"
## [1] 10519
Twitter <- na.omit(tweet) # eliminamos los registros sin información "NA"
library(tidyverse)
## ── Attaching packages ───────────────────────────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.2     ✓ dplyr   1.0.0
## ✓ tibble  3.0.3     ✓ stringr 1.4.0
## ✓ tidyr   1.1.0     ✓ forcats 0.5.0
## ✓ purrr   0.3.4
## ── Conflicts ──────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
colnames(Twitter) # conozcamos las variables.
##  [1] "id_viaje"   "OBJECTID_1" "created_at" "user_id_st" "grid_code" 
##  [6] "textFix"    "lang"       "X_Corrd"    "Y_Coord"    "date_tweet"
## [11] "min_date"   "max_date"   "date_dif"   "count"
tweets <- Twitter %>% select(id_viaje, created_at, user_id_st, textFix) ## Selección de variables.
tweets <- tweets %>% rename(autor = id_viaje, fecha = created_at,
                            texto = textFix, tweet_id = user_id_st) ## Renombrar variables.
head(tweets)
## # A tibble: 6 x 4
##   autor         fecha          tweet_id texto                                   
##   <chr>         <chr>             <dbl> <chr>                                   
## 1 100031406522… 2018/09/10 20…  1.00e18 pilgrims' passports stamped. map studie…
## 2 100031406522… 2018/09/14 13…  1.00e18 great sight when finishing our 4th day …
## 3 100031406522… 2018/09/16 14…  1.00e18 we made it! camino de santiago: sarria …
## 4 101163887574… 2018/08/04 08…  1.01e18 neeeeeniiii neeeeeniiii neeeeeniiii nee…
## 5 101163887574… 2018/07/27 08…  1.01e18 neeenii neeenii neeenii #teamneni https…
## 6 101163887574… 2018/07/26 19…  1.01e18 neeniii neeniii neeniii neeniii neeniii…
  1. Extracción de caracteristicas. —————————————

para está practica, el principal objetivo es estudiar el perfil lingüístico de los usuarios y analizar el sentimiento que transmiten, procedemos a eliminar:

+ Patrones no informativos (urls de paginas web). 
+ Signos de puntuación.
+ Etiquetas HTML.
+ Caracteres sueltos.
+ Números y datos vacios (NA).

Tokenizar un texto consiste en dividir el texto en las unidades que lo conforman, entendiendo por unidad el elemento más sencillo, en este ccaso, las palabras. ## Existen múltiples librerias que automatizan en gran medida la limpieza y tokenización de texto, por ejemplo, “tokenizers” o “quanteda”.

Limpiar_tokenizar <- function(texto){
    nuevo_texto <- tolower(texto)
    nuevo_texto <- str_replace_all(nuevo_texto, "http\\S*", "")
    nuevo_texto <- str_replace_all(nuevo_texto, "NA", "")
    nuevo_texto <- str_replace_all(nuevo_texto, "[[:punct:]]", " ")
    nuevo_texto <- str_replace_all(nuevo_texto, "[[:digit:]]", " ")
    nuevo_texto <- str_replace_all(nuevo_texto, "[\\s]+", " ")
    nuevo_texto <- str_split(nuevo_texto, " ")[[1]]
    nuevo_texto <- keep(.x = nuevo_texto, .p = function(x){str_length(x) > 1})
    return(nuevo_texto)
}

Ejemplo de limpieza de texto.

test = "Esto es 1 NA ejemplo de 1 'limpieza de6 TEXTO http://t.co/rnHPgyhx4z @JoaquinAmatRodrigo #textmining"
Limpiar_tokenizar(texto =  test)
##  [1] "esto"               "es"                 "na"                
##  [4] "ejemplo"            "de"                 "limpieza"          
##  [7] "de"                 "texto"              "joaquinamatrodrigo"
## [10] "textmining"

Es momento de hacer limpieza y tokenización a nuestra base de datos.

tweets <- tweets %>% mutate(texto_tokenizado = map(.x = texto,
                                                   .f = Limpiar_tokenizar))
tweets %>% select(texto_tokenizado) %>% head()
## # A tibble: 6 x 1
##   texto_tokenizado
##   <list>          
## 1 <chr [22]>      
## 2 <chr [15]>      
## 3 <chr [20]>      
## 4 <chr [10]>      
## 5 <chr [4]>       
## 6 <chr [6]>
tweets %>% slice(1) %>% select(texto_tokenizado) %>% pull() ### cada elemento de la columna "texto_tokenizado" es una lista con un vector de tipo "caracter" que contiene los token generados.
## [[1]]
##  [1] "pilgrims"  "passports" "stamped"   "map"       "studied"   "boots"    
##  [7] "polished"  "we"        "re"        "ready"     "to"        "go"       
## [13] "it"        "ll"        "be"        "an"        "early"     "start"    
## [19] "to"        "beat"      "the"       "he"
  1. ANÁLISIS EXPLORATORIO………..

En “R” la estructura por excelencia para el análisis exploratorio son el DATAFRAME y TIBBLE, que es la forma como se encuentra almacenada la información en los “TWEETS”. Sin embargo, al realizar la tokenización, ha habido un cambio importante los elementos de estudio texto, se encontraban en en filas “observaciones”, al reaizar la tokenizacion, el elemento de estudio ha pasado a ser cada “TOKEN” <>.

tweets_tidy <- tweets %>% select(-texto) %>% unnest()
## Warning: `cols` is now required when using unnest().
## Please use `cols = c(texto_tokenizado)`
tweets_tidy <- tweets_tidy %>% rename(token = texto_tokenizado)
head(tweets_tidy) 
## # A tibble: 6 x 4
##   autor                 fecha                   tweet_id token    
##   <chr>                 <chr>                      <dbl> <chr>    
## 1 1000314065229697024_1 2018/09/10 20:49:45.000  1.00e18 pilgrims 
## 2 1000314065229697024_1 2018/09/10 20:49:45.000  1.00e18 passports
## 3 1000314065229697024_1 2018/09/10 20:49:45.000  1.00e18 stamped  
## 4 1000314065229697024_1 2018/09/10 20:49:45.000  1.00e18 map      
## 5 1000314065229697024_1 2018/09/10 20:49:45.000  1.00e18 studied  
## 6 1000314065229697024_1 2018/09/10 20:49:45.000  1.00e18 boots

Introducción

alt text

alt text

rnorm(20)->datos
head(datos)
## [1] -0.4842950 -1.7874155  0.9080146  0.2687006 -0.4446077 -1.8475488
mean(datos)
## [1] -0.3604432
hist(datos, col=234, main = "Histograma",
     xlab = "latitud",
     ylab = "longitud")

Fuente

Fuente

Fuente

Fuente

Fuente

Fuente

Fuente Cursiva

Fuente Negrita

Fuente Negrita cursiva

Fuente

Header 1

Header 2

Header 3

list: ## Listas

  • Item 1

  • Item 2

    • Item 2a

Ordered List: ## Ordenar listas.

  1. Item 1
  2. Item 2
  3. Item 3
    • Item 3a
    • Item 3b
    • Item 3c

para obtener acceso directo de la web link de la pagina ##Obtener acceso de la web.

Esta base de datos cuenta con unos 36,684 tweets que representan 1789 “usuarios”. Muchas gracias…

FIN