Preparación previa para realizar el estudio (importacion de librerías)

Seleccionamos el epicentro del estudio en el Parque Fundidora

#Obtenemos lugar céntrico en la ciudad
CNC <- leaflet() %>% 
  addTiles() %>% 
  setView(-100.284553, 25.678665, zoom = 11.4) %>% 
  addMarkers(-100.284553, 25.678665, popup = "Parque Fundidora, Monterrey, Nuevo León")
CNC

Establecemos un radio de 15km desde nuestro epicentro y definimos la unidad de negocio de interés “Hotelels”

Para el desarrollo de esta actividad, investigaremos las tendencias actuales en hoteles y centros comerciales, con el objetivo de identificar posibles relaciones entre ambos sectores y analizar cómo pueden influir en el turismo de la zona.

### Map coordinates of Parque Fundidora (Starting Point)
latitude  <- 25.678665
longitude <- -100.284553
r <- 15000

# Primera llamada
search_str <- google_places(
  search_string = 'Hotel', 
  location = c(latitude, longitude), 
  radius = r, 
  key = gmaps_key
)

# Espera 2 segundos para que el page_token sea válido
Sys.sleep(2)

# Segunda página
search_str_add_one <- google_places(
  search_string = 'Hotel', 
  location = c(latitude, longitude), 
  radius = r, 
  key = gmaps_key, 
  page_token = search_str$next_page_token
)

Sys.sleep(2)

# Tercera página
search_str_add_two <- google_places(
  search_string = 'Hotel', 
  location = c(latitude, longitude), 
  radius = r, 
  key = gmaps_key, 
  page_token = search_str_add_one$next_page_token
)

Realizamos la consulta de 60 hoteles obteniendo datos como el nombre, calificación en google maps, total de calificaciones, su place_id y su ubicación

### The data frame will give you a wealth of information about each place, including its address, latitude & longitude coordinates, price level, star rating, number of ratings, categories, and more.
business_name <- c(search_str$results$name, search_str_add_one$results$name, search_str_add_two$results$name)
business_rating <- c(search_str$results$rating, search_str_add_one$results$rating, search_str_add_two$results$rating)
user_ratings_total <- c(search_str$results$user_ratings_total, search_str_add_one$results$user_ratings_total,search_str_add_two$results$user_ratings_total)
place_id <- c(search_str$results$place_id, search_str_add_one$results$place_id, search_str_add_two$results$place_id)
lat <- c(search_str$results$geometry$location$lat, search_str_add_one$results$geometry$location$lat, search_str_add_two$results$geometry$location$lat)
lon <- c(search_str$results$geometry$location$lng, search_str_add_one$results$geometry$location$lng, search_str_add_two$results$geometry$location$lng)
# write.csv(data, "D:\\CD2001C_AD2024\\Power_BI_Data_AD2024\\data_location_intl.csv", row.names=TRUE)

Juntamos los datos obtenidos de la consulta y los agrupamos en un dataframe

data_hotel<- data.frame(business_name,business_rating,user_ratings_total,place_id,lat,lon)
# write.csv(data, "D:\\CD2001C_AD2024\\Power_BI_Data_AD2024\\data_location_intl.csv", row.names=TRUE)
data_hotel <- data_hotel %>%
  distinct(place_id, .keep_all = TRUE)

#View(data_hotel)

Ordenamos los hoteles según su cantidad de reseñas tomando en cuenta el top 40

# Top 50 con mayor número de reseñas
top_reviews_hoteles <- data_hotel %>%
  arrange(desc(user_ratings_total)) %>%
  head(40)

# Gráfico
ggplot(top_reviews_hoteles, aes(x = reorder(business_name, user_ratings_total), y = user_ratings_total)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  coord_flip() +
  labs(
    title = " Hoteles - Mayor Número de Reseñas",
    x = NULL,
    y = "Número de Reseñas"
  ) +
  theme_minimal()

Graficamos el top 40 de hoteles con mas reseñas de la Zona Metropolitana de Monterrey para poder identificar áreas de aglomeración (clusters)

# Registrar la API de Google para ggmap
register_google(key = gmaps_key)

# Obtener el mapa base centrado en Parque Fundidora
mapa_base <- get_googlemap(
  center = c(lon = longitude, lat = latitude),
  zoom = 12,
  scale = 2,
  size = c(640, 640),
  maptype = "roadmap"
)

# Mapa de densidad + puntos negros
ggmap(mapa_base) +
  stat_density2d(
    data = top_reviews_hoteles,
    aes(x = lon, y = lat, fill = after_stat(level)),
    geom = "polygon",
    alpha = 0.4
  ) +
  scale_fill_gradient(low = "green", high = "red", guide = "none") +
  geom_point(
    data = data_hotel,
    aes(x = lon, y = lat),
    color = "black",
    size = 1.8
  ) +
  labs(
    title = "Hoteles con más reseñas (zonas calientes)",
    x = "",
    y = ""
  ) +
  theme_minimal()

## Definimos los clusters utilizando K-means para poder agrupar según la distancia y así poder obetner centroides

# Escogemos el número de clusters (puedes ajustar este valor)
set.seed(123)  # Reproducibilidad
num_clusters <- 5

# Aplicamos K-means sobre lat y lon
kmeans_result <- kmeans(top_reviews_hoteles[, c("lon", "lat")], centers = num_clusters)

# Añadimos el resultado al dataframe
top_reviews_hoteles$cluster <- as.factor(kmeans_result$cluster)
centroides <- as.data.frame(kmeans_result$centers)

Visualizamos estos clusters y sus centroides

# Mapa base
mapa_base <- get_googlemap(
  center = c(lon = longitude, lat = latitude),
  zoom = 12,
  scale = 2,
  size = c(1100, 1100),
  maptype = "roadmap"
)

# Visualización con clusters y centroides
ggmap(mapa_base) +
  geom_point(
    data = top_reviews_hoteles,
    aes(x = lon, y = lat, color = cluster),
    size = 2
  ) +
  geom_point(
    data = centroides,
    aes(x = lon, y = lat),
    color = "black",
    size = 4,
    shape = 8
  ) +
  labs(
    title = paste0("Clustering de hoteles top (k = ", num_clusters, ")"),
    x = "", y = ""
  ) +
  theme_minimal() +
  theme(legend.position = "bottom") +
  scale_color_brewer(palette = "Set1")

Obtenemos las coordenadas de los centroides para poder volver a identificar los hoteles cercanos más importantes

# Creamos tabla resumen de clusters
tabla_clusters <- top_reviews_hoteles %>%
  group_by(cluster) %>%
  summarise(
    Num_Hoteles = n(),
    Centroide_Lon = mean(lon),
    Centroide_Lat = mean(lat)
  ) %>%
  arrange(desc(Num_Hoteles))

# Mostramos tabla
print(tabla_clusters)
## # A tibble: 5 × 4
##   cluster Num_Hoteles Centroide_Lon Centroide_Lat
##   <fct>         <int>         <dbl>         <dbl>
## 1 5                19         -100.          25.7
## 2 2                 8         -100.          25.7
## 3 1                 6         -100.          25.7
## 4 3                 4         -100.          25.8
## 5 4                 3         -100.          25.7

Establecemos de nuevo un radio de 1.5km para poder realizar estas nuevas consultas para los 3 clusters seleccionados

Comenzamos con el cluster de la Avenida Miguel Alemán, establecemos las coordenadas de l centroide y de nuevo la unidad de negocio es “Hotel”

# Coordenadas del Cluster Avenida Miguel Alemán
lat1 <- 25.72456
lon1 <- -100.2174

cluster_1 <- google_places(
  search_string = "Hotel",
  location = c(lat1, lon1),
  radius = 5000,
  key = gmaps_key
)

cluster_miguel_aleman <- data.frame(
  business_name = cluster_1$results$name,
  business_rating = cluster_1$results$rating,
  user_ratings_total = cluster_1$results$user_ratings_total,
  place_id = cluster_1$results$place_id,
  lat = cluster_1$results$geometry$location$lat,
  lon = cluster_1$results$geometry$location$lng
) %>%
  distinct(place_id, .keep_all = TRUE) %>%
  arrange(desc(user_ratings_total))
cluster_miguel_aleman <- head(cluster_miguel_aleman, 10)
#view(df_cluster_1)

Nuestro segundo cluster es la Zona Centro de Monterrey que incluye hoteles cercanos al Tec de Monterrey y Paruqe Fundidora

# Coordenadas del Cluster Zona Centro de Monterrey
lat3 <- 25.66944
lon3 <- -100.29941

cluster_3 <- google_places(
  search_string = "Hotel",
  location = c(lat3, lon3),
  radius = 2000,
  key = gmaps_key
)

cluster_mty_centro <- data.frame(
  business_name = cluster_3$results$name,
  business_rating = cluster_3$results$rating,
  user_ratings_total = cluster_3$results$user_ratings_total,
  place_id = cluster_3$results$place_id,
  lat = cluster_3$results$geometry$location$lat,
  lon = cluster_3$results$geometry$location$lng
) %>%
  distinct(place_id, .keep_all = TRUE) %>%
  arrange(desc(user_ratings_total))
cluster_mty_centro <- head(cluster_mty_centro, 15)

Nuestro tercer y último cluster importante es la Zona Hotelera de San Pedro Garza García

# Coordenadas del Cluster San Pedro Garza García
lat5 <- 25.654582 
lon5 <- -100.343557

cluster_5 <- google_places(
  search_string = "Hotel",
  location = c(lat5, lon5),
  radius = 1250,
  key = gmaps_key
)

cluster_san_pedro <- data.frame(
  business_name = cluster_5$results$name,
  business_rating = cluster_5$results$rating,
  user_ratings_total = cluster_5$results$user_ratings_total,
  place_id = cluster_5$results$place_id,
  lat = cluster_5$results$geometry$location$lat,
  lon = cluster_5$results$geometry$location$lng
) %>%
  distinct(place_id, .keep_all = TRUE) %>%
  arrange(desc(user_ratings_total))
cluster_san_pedro <- head(cluster_san_pedro, 10)

Visualizamos los hoteles más importantes para cada uno de los clusters en un mapa

# Agregar columna de cluster
cluster_miguel_aleman$cluster <- "Cluster Avenida Miguel Alemán"
cluster_mty_centro$cluster <- "Cluster Zona Centro Mty"
cluster_san_pedro$cluster <- "Cluster Zona S.P.G.G."

# Unir todos los dataframes
df_top_hoteles <- bind_rows(cluster_miguel_aleman, cluster_mty_centro, cluster_san_pedro)
library(leaflet)
# Crear data frame con los centroides
centroides <- data.frame(
  lat = c(lat1, lat3, lat5),
  lon = c(lon1, lon3, lon5),
  cluster = c("Cluster Avenida Miguel Alemán", "Cluster Zona Centro Mty", "Cluster Zona S.P.G.G.")
)
# Crear mapa base
mapa_clusters <- leaflet(df_top_hoteles) %>%
  addTiles() %>%
  addCircleMarkers(
    ~lon, ~lat,
    radius = 6,
    color = ~case_when(
      cluster == "Cluster Avenida Miguel Alemán" ~ "red",
      cluster == "Cluster Zona Centro Mty" ~ "blue",
      cluster == "Cluster Zona S.P.G.G." ~ "purple"
    ),
    label = ~paste(business_name, "<br>⭐", business_rating, "<br>📊", user_ratings_total, "reseñas"),
    popup = ~paste0("<b>", business_name, "</b><br>⭐ Calificación: ", business_rating,
                    "<br>📊 Reseñas: ", user_ratings_total,
                    "<br>📍 Cluster: ", cluster),
    fillOpacity = 0.9,
    stroke = FALSE
  ) %>%
  
    # Centroides como estrellas
  addAwesomeMarkers(
    data = centroides,
    ~lon, ~lat,
    icon = awesomeIcons(
      icon = "circle",
      iconColor = "white",
      library = "fa"
    ),
    label = ~paste("Centroide -", cluster),
    popup = ~paste("<b>Centroide:</b><br>", cluster)
  ) %>%
  
  addLegend(
    position = "bottomright",
    colors = c("red", "blue", "purple"),
    labels = c("Cluster Avenida Miguel Alemán", "Cluster Zona Centro Mty", "Cluster Zona S.P.G.G."),
    title = "Clusters Hoteleros"
  )

# Mostrar mapa
mapa_clusters

Mostramos los Hoteles a los que tendrá cobertura cada uno de los circuitos según el cluster al que pertenecen

head(cluster_miguel_aleman[, c("business_name", "business_rating", "user_ratings_total")], 10)
##                                           business_name business_rating
## 1  Holiday Inn Monterrey-Parque Fundidora, an IHG Hotel             4.5
## 2                        Fiesta Inn Monterrey Fundidora             4.4
## 3                             ibis Monterrey Aeropuerto             3.8
## 4                            Fiesta Inn Monterrey La Fe             4.3
## 5                              Hotel NH Monterrey La Fe             4.5
## 6         City Express by Marriott Monterrey Aeropuerto             4.2
## 7       Hotel Misión Express Monterrey Aeropuerto La Fé             3.9
## 8     City Express Plus by Marriott Monterrey Nuevo Sur             4.5
## 9                  Extended Suites Monterrey Aeropuerto             4.1
## 10                          Quality Inn Monterrey La Fe             4.4
##    user_ratings_total
## 1                6207
## 2                3791
## 3                3157
## 4                2576
## 5                2417
## 6                2319
## 7                2314
## 8                2234
## 9                1877
## 10               1848
head(cluster_mty_centro[, c("business_name", "business_rating", "user_ratings_total")], 15)
##                                           business_name business_rating
## 1                  Crowne Plaza Monterrey, an IHG Hotel             4.5
## 2  Holiday Inn Monterrey-Parque Fundidora, an IHG Hotel             4.5
## 3                            CHN Hotel Monterrey Centro             4.2
## 4                            Hotel Monterrey Macroplaza             4.2
## 5                     Gamma Monterrey Gran Hotel Ancira             4.5
## 6                   Wyndham Monterrey Ambassador Centro             4.3
## 7                                     Hotel Safi Centro             4.5
## 8                               Hotel Krystal Monterrey             4.4
## 9               Hotel Misión Monterrey Centro Histórico             3.5
## 10                              Hotel Antaris Cintermex             4.2
## 11                     Fiesta Inn Monterrey Tecnológico             4.4
## 12                          Fiesta Americana Pabellón M             4.7
## 13                  Fiesta Inn Express Monterrey Centro             4.4
## 14                                       El Regio Hotel             3.6
## 15                                Hotel Kavia Monterrey             4.2
##    user_ratings_total
## 1                8673
## 2                6207
## 3                5847
## 4                5506
## 5                5078
## 6                5068
## 7                4816
## 8                4371
## 9                3761
## 10               3329
## 11               3175
## 12               2797
## 13               1475
## 14               1126
## 15               1045
head(cluster_san_pedro[, c("business_name", "business_rating", "user_ratings_total")], 10)
##                                       business_name business_rating
## 1                     Hotel Safi Royal Luxury Valle             4.6
## 2                     Hotel Novotel Monterrey Valle             4.3
## 3                             Camino Real Monterrey             4.5
## 4                            Hotel Antaris Galerías             4.1
## 5           Hotel NH Collection Monterrey San Pedro             4.4
## 6  City Express Plus by Marriott Monterrey Galerias             4.4
## 7                Holiday Inn Monterrey Valle by IHG             4.4
## 8                                       Quinta Real             4.7
## 9                       Comfort Inn Monterrey Valle             4.2
## 10                             ibis Monterrey Valle             3.8
##    user_ratings_total
## 1                5309
## 2                3780
## 3                3261
## 4                3106
## 5                2829
## 6                2788
## 7                2621
## 8                2434
## 9                2110
## 10               1637