El link url proporcionado para el taller es la página web de
bookings y despliega titulo, descripcion y precio de hoteles. Por lo que
se descargo los 3 parametros en un dataframe.
# Librerías necesarias
library(jsonlite)
library(httr)
library(rvest)
library(xml2)
library(stringr)
library(flexdashboard)
library(ggplot2)
library(highcharter)
library(tidyverse)
library(dplyr)
library(lubridate)
library(wordcloud2)
library(ggraph)
library(igraph)
library(tm)
library(plotly)
library(tidytext)
library(textdata)
# URL
url <- "https://www.booking.com/city/mx/mexico.es-ar.html?aid=1234230"
# Leer HTML
pagina <- read_html(url)
# Scraping: encabezados
nom.prod <- pagina %>%
html_nodes('div.ff0d627d92') %>%
html_nodes('a') %>%
html_text2()
# Scraping: descripciones
desc.prod <- pagina %>%
html_nodes('div.ff0d627d92') %>%
html_nodes('p.b99b6ef58f.cdac6d30fc') %>%
html_text2()
# Scraping: precios
valor <- pagina %>%
html_nodes('div.ab35512885 div.f54cd6e81f span.de73b3d2d3.f82d0d24de') %>%
html_text2() %>%
gsub("[^0-9,]", "", .) %>%
gsub(",", ".", .) %>%
as.numeric()
# Uniendo datos
booking <- data.frame(articulo = nom.prod,
descripcion = desc.prod,
precio = valor) %>%
filter(!is.na(precio))
Gráfico de precios
La línea sube y baja, lo que indica que no hay un tendencia
constante de precios; hay hoteles baratos y caros distribuidos a lo
largo del listado.
Histograma y Boxplot de precios

Se observa una concentración de precios bajos, especialmente entre
50 y 70 USD, lo cual sugiere que muchos alojamientos económicos están
disponibles.
Hay precios más altos que generan la distribución hacia la derecha,
aunque son menos frecuentes.
El promedio (91.80 USD) está ligeramente por debajo del valor del
tercer cuartil (110.42).

El 50% central de los precio va del 1er cuartil (60.80) al 3er
cuartil (110.42).
Línea dentro de la caja: La mediana (92.59), ligeramente desplazada
hacia el extremo inferior, lo que indica una leve concentración de
precios bajos.
Extremos (bigotes): Se extienden hacia el mínimo (52.21) y el máximo
(159.20).
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 52.21 60.80 92.59 91.80 110.42 159.20
Hay bastante variación: los precios van desde $52.21 hasta
$159.20.
La media (~91.8) está muy cerca de la mediana (~92.6) lo que sugiere
que la distribución es más o menos simétrica.
El rango intercuartílico (Q3 - Q1) es de 49.62 USD, indicando
dispersión en el 50% central de los hoteles.
Puede haber algunos precios altos que estiran el máximo, pero no son
extremos exagerados.
Análisis de texto: TÍTULOS
booking_1 <- booking$articulo
booking_1 <- iconv(booking_1, to = "ASCII", sub = "")
booking_1 <- gsub("(RT|via)((?:\\b\\W*@\\w+)+)", "", booking_1)
booking_1 = gsub("http.+ |http.+$", " ", booking_1)
booking_1 = gsub("http[[:alnum:]]*", "", booking_1)
booking_1 = gsub("[[:punct:]]", " ", booking_1)
booking_1 = gsub("[ |\t]{2,}", " ", booking_1)
booking_1 = gsub("^ ", "", booking_1)
booking_1 = gsub(" $", "", booking_1)
booking_1 = gsub(" +", " ", booking_1)
booking_1 = gsub("[[:cntrl:]]", " ", booking_1)
booking_1 = tolower(booking_1)
booking_1 = removeWords(booking_1, words = stopwords("spanish"))
booking_1 = removePunctuation(booking_1)
booking_1 = removeNumbers(booking_1)
booking_1 = stripWhitespace(booking_1)
booking_1 = unique(booking_1)
corpus <- Corpus(VectorSource(booking_1))
### limpieza usando la libreria TM
corpus <- tm_map(corpus, removeWords, stopwords("spanish"))
corpus <- tm_map(corpus, removeNumbers)
corpus <- tm_map(corpus, stemDocument)
#Nube de Palabras
dtm = DocumentTermMatrix(corpus)
matrix <- as.matrix(dtm)
words <- sort(rowSums(matrix),decreasing=TRUE)
####
doc.length = apply(dtm, 1, sum)
dtm = dtm[doc.length > 7,]
#dtm
freq = colSums(as.matrix(dtm))
#length(freq)
ord = order(freq, decreasing = TRUE)
# Palabras Frecuentes y Word Cloud
plot = data.frame(words = names(freq), count = freq)
plot = subset(plot, plot$count > 1)
Las palabras Mexico y Hotel son las que muentran mayor repetición,
teniendo 12 cada uno y ciudad con 8.
Análisis de texto: DESCRIPCIONES
# Limpieza del texto, removiendo carácteres especiales
booking_2 <- booking$descripcion
booking_2 <- iconv(booking_2, to = "ASCII", sub = "")
booking_2 <- gsub("(RT|via)((?:\\b\\W*@\\w+)+)", "", booking_2)
booking_2 = gsub("http.+ |http.+$", " ", booking_2)
booking_2 = gsub("http[[:alnum:]]*", "", booking_2)
booking_2 = gsub("[[:punct:]]", " ", booking_2)
booking_2 = gsub("[ |\t]{2,}", " ", booking_2)
booking_2 = gsub("^ ", "", booking_2)
booking_2 = gsub(" $", "", booking_2)
booking_2 = gsub(" +", " ", booking_2)
booking_2 = gsub("[[:cntrl:]]", " ", booking_2)
booking_2 = tolower(booking_2)
booking_2 = removeWords(booking_2, words = stopwords("spanish"))
booking_2 = removePunctuation(booking_2)
booking_2 = removeNumbers(booking_2)
booking_2 = stripWhitespace(booking_2)
# booking_2 = unique(booking_2)
corpus2 <- Corpus(VectorSource(booking_2))
# limpieza usando la libreria
corpus2 <- tm_map(corpus2, removeWords, stopwords("spanish"))
corpus2 <- tm_map(corpus2, removeNumbers)
corpus2 <- tm_map(corpus2, stemDocument)
# Nube de Palabras
dtm2 = DocumentTermMatrix(corpus2)
matrix2 <- as.matrix(dtm2)
words2 <- sort(rowSums(matrix2),decreasing=TRUE)
doc.length2 = apply(dtm2, 1, sum)
dtm2 = dtm2[doc.length2 >= 1,]
freq2 = colSums(as.matrix(dtm2))
ord2 = order(freq2, decreasing = TRUE)
# Palabras Frecuentes y Word Cloud
plot2 = data.frame(words = names(freq2), count = freq2)
plot2 = subset(plot2, plot2$count >= 1)
Las palabras Ciudad y mxico son las que muentran mayor repetición,
teniendo 11 cada uno y hotel con 9. Las demas palabras menos de 5
repeticiones