Aprendizaje supervisado: Tenemos una variable dependiente (output) continua o categórica, y queremos predecirla con un conjunto disponible de variables explicativas (input).
Problema de regresión: Tenemos como variable dependiente una del tipo continua (i.e. numérica) que buscamos predecir.
A continuación podemos ver qué algoritmos podremos usar acorde a la variable que buscamos predecir dentro del aprendizaje supervisado.
Estos algoritmos se explicarán a medida que sean usados.
Alrededor del mundo, es muy difícil para muchos tipos de negocios el analizar las causas de los comentarios que obtienen de sus clientes, tanto por la cantidad de información que tendrían que revisar, así como por la falta de una herramienta analítica que logre tal objetivo. Dicho análisis podría tener gran influencia tanto en las estrategias que puedan adoptar para mejorar su imagen ante el público, así como en sus rendimiento económico, reputacional, etc. Como sabemos bien, no siempre se trata del precio.
En este contexto, la tarea de predecir el ranking que generen distintos tipos de comentarios acerca de un negocio, podría ayudar a los dueños de los mismos a mejorar en áreas clave que sus clientes sugieran, incrementando así sus ganancias.
En este caso de estudio analizaremos el ranking de 220 restaurantes en diez ciudades ecuatorianas: Quito, Guayaquil, Ibarra, Latacunga, Ambato, Cuenca, Loja, Machala, Manta y Santo Domingo. Estos datos fueron obtenidos a través de la librería googleway, la cual nos permite interactuar con APIs de Google Maps.
Para iniciar este ejercicio cargaremos la librerías necesarias en esta sección. Estas se enlistan a continuación:
library(tidyverse)
library(tidytext)
library(udpipe)
library(stopwords)
library(syuzhet)
library(summarytools)
library(tmap)
library(sp)
Una vez que las librerías han sido cargadas, exploraremos los datos disponibilizados por el profesor. Estos se pueden encontrar en la carpeta de Google Drive. Para cargarlos ejecutaremos la siguiente línea de código, asegurándonos de que los datos hayan sido correctamente cargados. En total se disponibilizan 2 conjuntos de datos.
En primer lugar, se ofrece datos de la ubicación geográfica de cada uno de los restaurantes, así como metadata resumen de cada uno de ellos:
places_df = readRDS("Data/PrediccionRankingLugares/places_df.RDS")
places_df %>% filter(place_id=="ChIJY1m7mJ-a1ZERqgSTlHcXa4o")
Así también, se presentan datos de los comentarios dejados acerca de cada lugar:
places_reviews_df = readRDS("Data/PrediccionRankingLugares/places_reviews_df.RDS")
places_reviews_df %>% filter(place_id=="ChIJY1m7mJ-a1ZERqgSTlHcXa4o")
De los dos datasets, utilizaremos el segundo para realizar el ejercicio de regresión, y el primero se lo provee al estudiante por si desea profundizar en el análisis.
Como exploración inicial, visualicemos los restaurantes ubicados en Quito, y el momento de publicación de los comentarios para dichos restaurantes.
# Creación de data espacial
places_spdf = SpatialPointsDataFrame(coords = data.frame(longitud = places_df$geometry$location$lng,
latitud = places_df$geometry$location$lat),
data = places_df,
proj4string = CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"))
# Mapeo de restaurantes en Quito
tmap_leaflet(tm_basemap("OpenStreetMap")+
tm_shape(places_spdf[places_spdf$ciudad=="Quito",])+
tm_dots(col = "rating", id="name", size=0.1))
CRS object has comment, which is lost in outputcolumn "geometry" will be overwritten by geometry columnLinking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1
# Gráfico de cuentas por tipo de tweet
places_reviews_df %>%
inner_join(places_df %>% filter(ciudad=="Quito"), by="place_id") %>%
count(relative_time_description) %>%
ggplot(aes(x=reorder(relative_time_description, n), y=n, fill=relative_time_description))+
geom_col()+
labs(x="Descripción relativa del tiempo")+
coord_flip()+
theme(legend.position = "none",
text = element_text(size=11))
Para estos datos se puede observar gran mayoría de comentarios se han dado en el último mes. Además los negocios analizadas se encuentran sobretodo en el norte de la ciudad de Quito.
Una vez que hemos cargado los datos y ya habiendo explorado el marco de acción de este caso, pasemos a la creación de las variables input y output.
En el contexto del problema de regresión, usaremos la siguiente variable objetivo a predecir, definida como:
\[ y = \text{Ranking, entre 1 (malo) y 5 (bueno), definido para cada uno de los comentarios} \]
Su histograma se presenta a continuación.
# Creación de variable target e identificador por fila
places_reviews_df = places_reviews_df %>%
select(place_id, target_rating = rating, relative_time_description, text) %>%
mutate(comment_id = paste0(row_number()))
# Comprobación
places_reviews_df %>%
ggplot(aes(x=target_rating))+
geom_histogram()+
theme(legend.position = "bottom",
text = element_text(size=11))
Para esta variable podemos notar que la mayoría de rankings se acumulan entre 4 y 5, con pocos comentarios entre 1 y 3. En la resolución del problema notaremos qué factores influyen en las calificaciones bajas.
Para la creación de variables explicativas utilizaremos tanto criterios cualitativos como cuantitativos explotados a partir de los datos de texto de los cometarios publicados.
places_reviews_df %>%
group_by(target_rating) %>%
slice_sample(n = 1) %>%
select(text)
Adding missing grouping variables: `target_rating`
En primer lugar crearemos una variable que cuente tanto el número de símbolos de admiración como interrogación que se utilicen en el texto, debido a que comentarios expresivos o de duda podrían inclinar el rating hacia uno de los dos lados. Para corroborar su creación, verificaremos medidas descriptivas para cada nivel de rating.
# Creación de variables
places_reviews_df = places_reviews_df %>%
mutate(n_signos_admiracion = str_count(text, "\\!"),
n_signos_interrogacion = str_count(text, "\\?"))
# Descriptiva de variables
places_reviews_df %>%
group_by(target_rating) %>%
summarise(n_signos_admiracion=mean(n_signos_admiracion),
n_signos_interrogacion=mean(n_signos_interrogacion)) %>%
pivot_longer(c(n_signos_admiracion, n_signos_interrogacion)) %>%
ggplot(aes(x=target_rating, y=value, fill=as.factor(name)))+
geom_col(position="dodge")+
theme(legend.position = "bottom",
text = element_text(size=11))
En esta gráfica podemos notar que los comentarios con signos de interrogación son los que entregan el peor rating, mientras que aquellos con más signos de admiración, dan la mejor puntuación.
Ahora calcularemos el tamaño y variedad del diccionario de cada comentario, además del número de palabras usado por cada tipo de etiqueta POS, en la misma línea de pensamiento anterior.
# Carga de modelo udpipe
# udpipe_download_model(language = "spanish")
model_spanish = udpipe_load_model("spanish-gsd-ud-2.5-191206.udpipe")
# Anotación de datos
places_reviews_ann_df = udpipe_annotate(model_spanish, x = places_reviews_df$text,
doc_id = places_reviews_df$comment_id) %>%
as_tibble()
# Creación de variables respecto al diccionario
places_reviews_dict_df = places_reviews_ann_df %>%
group_by(doc_id) %>%
summarise(n_palabras = n(),
n_palabras_unicas = n_distinct(tolower(lemma)))
# Creación de variables respecto a la etiqueta POS
places_reviews_pos_df = places_reviews_ann_df %>%
filter(upos %in% c("ADJ","NOUN","PROPN","PUNCT","VERB","ADV","PRON","DET"),!is.na(upos)) %>%
filter(!tolower(lemma) %in% stopwords(language = "es",source = "nltk")) %>%
group_by(doc_id, upos) %>%
summarise(n_palabras = n(),
n_palabras_unicas = n_distinct(lemma)) %>%
pivot_wider(names_from = "upos", values_from = c("n_palabras","n_palabras_unicas"),
values_fill = 0)
`summarise()` has grouped output by 'doc_id'. You can override using the `.groups` argument.
# Unión al dataset original
places_reviews_df = places_reviews_df %>%
inner_join(places_reviews_dict_df, by=c("comment_id"="doc_id")) %>%
inner_join(places_reviews_pos_df, by=c("comment_id"="doc_id"))
# Descriptiva de variables
places_reviews_df %>%
group_by(target_rating) %>%
summarise(n_palabras=mean(n_palabras),
n_palabras_unicas=mean(n_palabras_unicas),
n_palabras_ADJ=mean(n_palabras_ADJ),
n_palabras_NOUN=mean(n_palabras_NOUN),
n_palabras_PROPN=mean(n_palabras_PROPN),
n_palabras_PUNCT=mean(n_palabras_PUNCT),
n_palabras_VERB=mean(n_palabras_VERB),
n_palabras_ADV=mean(n_palabras_ADV),
n_palabras_PRON=mean(n_palabras_PRON),
n_palabras_DET=mean(n_palabras_DET),
n_palabras_unicas_ADJ=mean(n_palabras_ADJ),
n_palabras_unicas_NOUN=mean(n_palabras_NOUN),
n_palabras_unicas_PROPN=mean(n_palabras_PROPN),
n_palabras_unicas_PUNCT=mean(n_palabras_PUNCT),
n_palabras_unicas_VERB=mean(n_palabras_VERB),
n_palabras_unicas_ADV=mean(n_palabras_ADV),
n_palabras_unicas_PRON=mean(n_palabras_PRON),
n_palabras_unicas_DET=mean(n_palabras_DET)) %>%
pivot_longer(-c(target_rating)) %>%
mutate(tipo=case_when(name %in% c("n_palabras","n_palabras_unicas")~"general",
T~"upos")) %>%
ggplot(aes(x=target_rating, y=value, fill=as.factor(name)))+
geom_col(position="dodge")+
facet_wrap(vars(tipo), scales = "free", ncol = 1)+
theme(legend.position = "bottom",
text = element_text(size=11))
En estas gráficas se nota en cambio que los ratings más bajos están más cargados de palabras.
Adicionalmente, añadiremos también variables que identifiquen con sentimientos cada uno los comentarios analizados, dado que los malos ratings podrían expresar más cierto tipos de sentimientos, sobretodo negativos.
# Categorización de sentimientos
places_reviews_sent_df = get_nrc_sentiment(places_reviews_df$text, language = "spanish")
places_reviews_sent_df = places_reviews_sent_df %>%
mutate(across(everything(), function(x)(x-min(x))/(max(x)-min(x))))
# Unión a datos originales
places_reviews_df = bind_cols(places_reviews_df, places_reviews_sent_df)
# Comprobación
places_reviews_df %>%
group_by(target_rating) %>%
summarise(anger=mean(anger),
anticipation=mean(anticipation),
disgust=mean(disgust),
fear=mean(fear),
joy=mean(joy),
sadness=mean(sadness),
surprise=mean(surprise),
trust=mean(trust),
negative=mean(negative),
positive=mean(positive)) %>%
pivot_longer(-c(target_rating)) %>%
ggplot(aes(x=target_rating, y=value, fill=as.factor(name)))+
geom_col(position="dodge")+
theme(legend.position = "bottom",
text = element_text(size=11))
Como podemos notar, los sentimientos negativos como el enfado y el disgusto son más pesados en los ratings negativos.
Finalmente, para darnos cuenta de lo que más se menciona acerca de ciertos niveles de rating, crearemos una variable basada en las palabras más frecuentes por cada nivel, como se muestra a continuación.
# Número de palabras a tomar
numero_palabras = 30
# Número de palabras por rating
top_words_rating_df = places_reviews_ann_df %>%
filter(upos %in% c("ADJ","NOUN","VERB"), !is.na(upos)) %>%
select(comment_id = doc_id, lemma) %>%
inner_join(places_reviews_df %>% select(comment_id, target_rating)) %>%
group_by(target_rating) %>%
mutate(n_palabras_rating = n()) %>%
group_by(target_rating, lemma) %>%
mutate(n_veces_palabra = n(),
pct_palabra = n_veces_palabra / n_palabras_rating * 100) %>%
select(lemma, target_rating, n_palabras_rating, n_veces_palabra, pct_palabra) %>%
distinct() %>%
group_by(target_rating) %>%
slice_max(n=numero_palabras, order_by = desc(pct_palabra), with_ties = F) %>%
select(target_rating, lemma, pct_palabra)
Joining, by = "comment_id"
# Removemos aquellas palabras que están en más de un rating
top_words_df = top_words_rating_df %>%
ungroup() %>%
group_by(lemma) %>%
mutate(multi_rating = n()) %>%
filter(multi_rating < 2) %>%
select(target_rating, lemma)
# Revisamos un par de ejemplos
top_words_df %>%
group_by(target_rating) %>%
slice_sample(n=1)
# Calculamos la variable de conteo de palabras
places_reviews_ann_df = places_reviews_ann_df %>%
mutate(pin_rtg_1 = case_when(lemma %in% top_words_df[top_words_df$target_rating==1,
"lemma",drop=T]~1,T~0),
pin_rtg_2 = case_when(lemma %in% top_words_df[top_words_df$target_rating==2,
"lemma",drop=T]~1,T~0),
pin_rtg_3 = case_when(lemma %in% top_words_df[top_words_df$target_rating==3,
"lemma",drop=T]~1,T~0),
pin_rtg_4 = case_when(lemma %in% top_words_df[top_words_df$target_rating==4,
"lemma",drop=T]~1,T~0),
pin_rtg_5 = case_when(lemma %in% top_words_df[top_words_df$target_rating==5,
"lemma",drop=T]~1,T~0))
# Creamos el conteo por comentario
places_reviews_topw_df = places_reviews_ann_df %>%
group_by(doc_id) %>%
summarise(across(c(pin_rtg_1,pin_rtg_2,pin_rtg_3,pin_rtg_4,pin_rtg_5),
sum))
# Revisión
places_reviews_topw_df %>% head()
# Unimos a los datos
places_reviews_df = places_reviews_df %>%
inner_join(places_reviews_topw_df, by=c("comment_id"="doc_id"))
Luego de la creación de variables nos quedamos con las aquellas que usaremos en el análisis de la siguiente sección.
# Selección de variables
places_reviews_model_df = places_reviews_df %>%
select(comment_id, target_rating, text,
n_signos_interrogacion, n_signos_admiracion,
n_palabras, n_palabras_unicas, n_palabras_ADJ, n_palabras_NOUN,
n_palabras_PROPN, n_palabras_PUNCT, n_palabras_VERB, n_palabras_ADV,
n_palabras_PRON, n_palabras_DET, n_palabras_unicas_ADJ, n_palabras_unicas_NOUN,
n_palabras_unicas_PROPN, n_palabras_unicas_PUNCT, n_palabras_unicas_VERB,
n_palabras_unicas_ADV, n_palabras_unicas_PRON, n_palabras_unicas_DET,
anger, anticipation, disgust, fear, joy, sadness, surprise, trust,
negative, positive,
pin_rtg_1, pin_rtg_2, pin_rtg_3, pin_rtg_4, pin_rtg_5,
relative_time_description)
# Ejemplos de datos
places_reviews_model_df %>%
group_by(target_rating) %>%
slice_sample(n = 1)
Y con ellas crearemos un reporte resumen gracias a la librería summarytools con una sola línea de código.
dfSummary(places_reviews_model_df, varnumbers = F, valid.col = F) %>% view(method="render")
| Variable | Stats / Values | Freqs (% of Valid) | Graph | Missing | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| comment_id [character] | 1. 1 2. 10 3. 100 4. 1001 5. 1002 6. 1003 7. 1004 8. 1005 9. 1006 10. 1007 [ 1012 others ] |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| target_rating [integer] | Mean (sd) : 4.6 (0.8) min < med < max: 1 < 5 < 5 IQR (CV) : 1 (0.2) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| text [character] | 1. Excelente 2. Muy bueno 3. Muy buena comida 4. Buena comida 5. Excelente comida 6. Buen lugar 7. Buen servicio 8. Deliciosa comida 9. Delicioso 10. Excelente sabor [ 979 others ] |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_signos_interrogacion [integer] | Min : 0 Mean : 0 Max : 1 |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_signos_admiracion [integer] | Mean (sd) : 0.2 (0.7) min < med < max: 0 < 0 < 7 IQR (CV) : 0 (3.3) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_palabras [integer] | Mean (sd) : 19.6 (22.1) min < med < max: 1 < 13 < 228 IQR (CV) : 18 (1.1) | 91 distinct values | 0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_palabras_unicas [integer] | Mean (sd) : 15.4 (13.5) min < med < max: 1 < 12 < 105 IQR (CV) : 14 (0.9) | 66 distinct values | 0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_palabras_ADJ [integer] | Mean (sd) : 2.7 (2.1) min < med < max: 0 < 2 < 14 IQR (CV) : 3 (0.8) | 15 distinct values | 0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_palabras_NOUN [integer] | Mean (sd) : 4.1 (4.2) min < med < max: 0 < 3 < 28 IQR (CV) : 4 (1) | 28 distinct values | 0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_palabras_PROPN [integer] | Mean (sd) : 0.4 (1.1) min < med < max: 0 < 0 < 22 IQR (CV) : 0 (3.2) | 12 distinct values | 0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_palabras_PUNCT [integer] | Mean (sd) : 2.2 (2.7) min < med < max: 0 < 2 < 22 IQR (CV) : 3 (1.2) | 19 distinct values | 0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_palabras_VERB [integer] | Mean (sd) : 1.5 (2.5) min < med < max: 0 < 1 < 30 IQR (CV) : 2 (1.7) | 17 distinct values | 0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_palabras_ADV [integer] | Mean (sd) : 0.4 (0.9) min < med < max: 0 < 0 < 9 IQR (CV) : 1 (2.1) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_palabras_PRON [integer] | Mean (sd) : 0 (0.2) min < med < max: 0 < 0 < 2 IQR (CV) : 0 (5.2) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_palabras_DET [integer] | Mean (sd) : 0.1 (0.3) min < med < max: 0 < 0 < 2 IQR (CV) : 0 (4.1) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_palabras_unicas_ADJ [integer] | Mean (sd) : 2.5 (2) min < med < max: 0 < 2 < 12 IQR (CV) : 2 (0.8) | 13 distinct values | 0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_palabras_unicas_NOUN [integer] | Mean (sd) : 4 (3.8) min < med < max: 0 < 3 < 26 IQR (CV) : 4 (1) | 24 distinct values | 0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_palabras_unicas_PROPN [integer] | Mean (sd) : 0.3 (1.1) min < med < max: 0 < 0 < 19 IQR (CV) : 0 (3) | 11 distinct values | 0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_palabras_unicas_PUNCT [integer] | Mean (sd) : 1.2 (1) min < med < max: 0 < 1 < 6 IQR (CV) : 2 (0.9) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_palabras_unicas_VERB [integer] | Mean (sd) : 1.5 (2.3) min < med < max: 0 < 1 < 29 IQR (CV) : 2 (1.6) | 17 distinct values | 0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_palabras_unicas_ADV [integer] | Mean (sd) : 0.4 (0.8) min < med < max: 0 < 0 < 8 IQR (CV) : 1 (2) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_palabras_unicas_PRON [integer] | Mean (sd) : 0 (0.2) min < med < max: 0 < 0 < 2 IQR (CV) : 0 (5.2) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| n_palabras_unicas_DET [integer] | Min : 0 Mean : 0.1 Max : 1 |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| anger [numeric] | Mean (sd) : 0 (0.1) min < med < max: 0 < 0 < 1 IQR (CV) : 0 (4.3) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| anticipation [numeric] | Mean (sd) : 0.1 (0.2) min < med < max: 0 < 0 < 1 IQR (CV) : 0.2 (1.7) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| disgust [numeric] | Mean (sd) : 0 (0.1) min < med < max: 0 < 0 < 1 IQR (CV) : 0 (3) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fear [numeric] | Mean (sd) : 0 (0.1) min < med < max: 0 < 0 < 1 IQR (CV) : 0 (3.5) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| joy [numeric] | Mean (sd) : 0.2 (0.2) min < med < max: 0 < 0.1 < 1 IQR (CV) : 0.1 (0.9) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| sadness [numeric] | Mean (sd) : 0.1 (0.1) min < med < max: 0 < 0.1 < 1 IQR (CV) : 0.1 (1.2) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| surprise [numeric] | Mean (sd) : 0.1 (0.1) min < med < max: 0 < 0 < 1 IQR (CV) : 0 (2.4) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| trust [numeric] | Mean (sd) : 0.2 (0.2) min < med < max: 0 < 0.1 < 1 IQR (CV) : 0.1 (0.9) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| negative [numeric] | Mean (sd) : 0.1 (0.1) min < med < max: 0 < 0.1 < 1 IQR (CV) : 0.1 (1.4) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| positive [numeric] | Mean (sd) : 0.2 (0.2) min < med < max: 0 < 0.1 < 1 IQR (CV) : 0.1 (1) | 15 distinct values | 0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| pin_rtg_1 [numeric] | Mean (sd) : 0.2 (0.9) min < med < max: 0 < 0 < 26 IQR (CV) : 0 (5.6) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| pin_rtg_2 [numeric] | Mean (sd) : 0.3 (0.8) min < med < max: 0 < 0 < 11 IQR (CV) : 1 (2.2) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| pin_rtg_3 [numeric] | Mean (sd) : 0.2 (0.6) min < med < max: 0 < 0 < 13 IQR (CV) : 0 (3.8) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| pin_rtg_4 [numeric] | Mean (sd) : 0.1 (0.3) min < med < max: 0 < 0 < 4 IQR (CV) : 0 (5.3) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| pin_rtg_5 [numeric] | Mean (sd) : 0.1 (0.4) min < med < max: 0 < 0 < 5 IQR (CV) : 0 (5.7) |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| relative_time_description [character] | 1. Hace un año 2. Hace 1 mes 3. Hace 2 meses 4. Hace 3 meses 5. Hace 5 meses 6. en la última semana 7. Hace 4 meses 8. Hace 6 meses 9. Hace 2 semanas 10. Hace una semana [ 11 others ] |
|
0 (0.0%) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Generated by summarytools 0.9.8 (R version 4.0.3)
2021-03-12
Una vez que hemos explorado los datos analizados procedemos a guardar el conjunto de datos procesado para cargarlo cuando realicemos el modelamiento.
saveRDS(places_reviews_model_df, "Caso5_PrediccionRankingLugares/places_reviews_model_df.RDS")