Crea Puntuaciones de ubicación personalizadas con Estadísticas de Lugares

Descripción general

Una ficha de bienes raíces que muestra una puntuación personalizada de Paraíso para dueños de mascotas de 9.1, basada en parques cercanos y lugares aptos para perros.

Los datos de ubicación estándar pueden decirte qué hay cerca, pero a menudo no responden la pregunta más importante: "¿Qué tan buena es esta zona para mí?". Las necesidades de tus usuarios son complejas. Una familia con niños pequeños tiene prioridades diferentes en comparación con un joven profesional con un perro. Para ayudarlos a tomar decisiones con confianza, debes proporcionar estadísticas que reflejen estas necesidades específicas. Una puntuación de ubicación personalizada es una herramienta poderosa para ofrecer este valor y crear una experiencia del usuario diferenciada y significativa.

En este documento, se describe cómo crear puntuaciones de ubicación personalizadas y multifacéticas con el conjunto de datos de Estadísticas de Lugares en BigQuery. Si transformas los datos de PDI en métricas significativas, puedes enriquecer tus aplicaciones de bienes raíces, venta minorista o viajes, y proporcionar a los usuarios la información pertinente que necesitan. También proporcionamos una opción para usar la API de Gemini Developer como una forma eficaz de calcular tus puntuaciones de ubicación.

Genera valor empresarial con las puntuaciones personalizadas

En los siguientes ejemplos, se ilustra cómo puedes traducir los datos de ubicación sin procesar en métricas potentes y centradas en el usuario para mejorar tu aplicación.

  • Los desarrolladores inmobiliarios pueden crear una "Puntuación de aptitud para familias" o una "Puntuación de sueño para quienes viajan a diario" para ayudar a los compradores y arrendatarios a elegir el vecindario perfecto que se adapte a su estilo de vida, lo que genera una mayor participación de los usuarios, clientes potenciales de mayor calidad y conversiones más rápidas.
  • Los ingenieros de viajes y hotelería pueden crear una "Puntuación de vida nocturna" o una "Puntuación de paraíso para los turistas" para ayudar a los viajeros a elegir un hotel que coincida con su estilo de vacaciones, lo que aumenta las tasas de reserva y la satisfacción del cliente.
  • Los analistas de comercio minorista pueden generar una "Puntuación de aptitud física y bienestar" para identificar la ubicación óptima de un gimnasio o una tienda de alimentos saludables nuevos en función de los negocios complementarios cercanos, lo que maximiza el potencial para segmentar los anuncios para el grupo demográfico de usuarios adecuado.

En esta guía, aprenderás una metodología flexible de tres partes para crear cualquier tipo de puntuación de ubicación personalizada con datos de Places directamente en BigQuery. Ilustraremos este patrón creando dos ejemplos de puntuación distintos: una puntuación de aptitud para la familia y una puntuación de paraíso para dueños de mascotas. Este enfoque te permite ir más allá de los recuentos de lugares y aprovechar los atributos detallados y enriquecidos del conjunto de datos de Places Insights. Puedes usar información como el horario de atención, si un lugar es adecuado para niños o si admite perros para crear métricas sofisticadas y significativas para tus usuarios.

Flujo de trabajo de la solución

Un diagrama de flujo de trabajo de tres pasos: establecer ubicaciones, consultar lugares cercanos y normalizar los resultados para crear una puntuación final.

En este instructivo, se usa una sola y potente consulta en SQL para crear una puntuación personalizada que puedes adaptar a cualquier caso de uso. Para ello, crearemos dos ejemplos de puntuación para un conjunto hipotético de fichas de apartamentos.

Requisitos previos

Antes de comenzar, sigue estas instrucciones para configurar Places Insights.

1. Establece una base: tus ubicaciones de interés

Antes de crear las puntuaciones, necesitas una lista de las ubicaciones que deseas analizar. El primer paso es asegurarte de que estos datos existan como una tabla en BigQuery. La clave es tener un identificador único para cada ubicación y una columna GEOGRAPHY que almacene sus coordenadas.

Puedes crear y propagar una tabla de ubicaciones para calificar con una consulta como esta:

CREATE OR REPLACE TABLE `your_project.your_dataset.apartment_listings`
(
  id INT64,
  name STRING,
  location GEOGRAPHY
);

INSERT INTO `your_project.your_dataset.apartment_listings` VALUES
  (1, 'The Downtowner', ST_GEOGPOINT(-74.0077, 40.7093)),
  (2, 'Suburban Oasis', ST_GEOGPOINT(-73.9825, 40.7507)),
  (3, 'Riverside Lofts', ST_GEOGPOINT(-73.9470, 40.8079))
  -- More rows can be added here
  . . . ;

Realizar un SELECT * en tus datos de ubicación se vería de manera similar a esto.

Resultados de la consulta de BigQuery que muestran una tabla de publicaciones de apartamentos con ID, nombre y coordenadas de ubicación.

2. Desarrolla la lógica principal: la consulta de puntuación

Una vez que establezcas tus ubicaciones, el siguiente paso es encontrar, filtrar y contar los lugares cercanos que son relevantes para tu puntuación personalizada. Todo esto se realiza dentro de una sola instrucción SELECT.

Cómo encontrar lugares cercanos con una búsqueda geoespacial

Primero, debes encontrar todos los lugares del conjunto de datos de Places Insights que se encuentren a una distancia determinada de cada una de tus ubicaciones. La función ST_DWITHIN de BigQuery es perfecta para esto. Realizaremos una operación JOIN entre nuestra tabla apartment_listings y la tabla places_insights para encontrar todos los lugares dentro de un radio de 800 metros. Un LEFT JOIN garantiza que todas tus ubicaciones originales se incluyan en los resultados, incluso si no se encuentran lugares cercanos que coincidan.

Filtro de relevancia con atributos avanzados

Aquí es donde traduces el concepto abstracto de una puntuación en filtros de datos concretos. En el caso de nuestras dos puntuaciones de ejemplo, los criterios son diferentes:

  • En el caso de la "Puntuación de aptitud para la familia", nos interesan los parques, los museos y los restaurantes que son explícitamente buenos para los niños.
  • Para la "Puntuación de paraíso para dueños de mascotas", tenemos en cuenta los parques, las clínicas veterinarias, las tiendas de mascotas y cualquier restaurante o cafetería que permita perros.

Puedes filtrar por estos atributos específicos directamente en la cláusula WHERE de tu búsqueda.

Agrega las estadísticas de cada ubicación

Por último, debes contar cuántos lugares relevantes encontraste para cada departamento. La cláusula GROUP BY agrega los resultados, y la función COUNTIF cuenta los lugares que coinciden con los criterios específicos de cada una de nuestras puntuaciones.

La siguiente consulta combina estos tres pasos y calcula los recuentos sin procesar para ambas puntuaciones en una sola pasada:

-- This Common Table Expression (CTE) will hold the raw counts for each score component.
WITH insight_counts AS (
  SELECT WITH AGGREGATION_THRESHOLD -- Correctly includes the mandatory aggregation threshold
    apartments.id,
    apartments.name,
    COUNTIF(places.primary_type = 'park') AS park_count,
    COUNTIF(places.primary_type = 'museum') AS museum_count,
    COUNTIF(places.primary_type = 'restaurant' AND places.good_for_children = TRUE) AS family_restaurant_count,
    COUNTIF(places.primary_type IN ('veterinary_care', 'pet_store')) AS pet_service_count,
    COUNTIF(places.allows_dogs = TRUE) AS dog_friendly_place_count
  FROM
    `your_project.your_dataset.apartment_listings` AS apartments
  LEFT JOIN
    `your-project.places_insights___us.places` AS places -- Corrected table name for the US dataset
    ON ST_DWITHIN(apartments.location, places.point, 800) -- Find places within 800 meters
  GROUP BY
    apartments.id, apartments.name
)
SELECT * FROM insight_counts;

El resultado de esta consulta será similar al siguiente.

Resultados de BigQuery que muestran los recuentos sin procesar de servicios como parques, restaurantes y servicios para mascotas para cada ficha de departamento.

En la siguiente sección, profundizaremos en estos resultados.

3. Crea la puntuación

Ahora que tienes el recuento de lugares y la ponderación para cada tipo de lugar en cada ubicación, puedes generar la puntuación de ubicación personalizada. En esta sección, analizaremos dos opciones: usar tu propio cálculo personalizado en BigQuery o usar la API de Gemini Developer.

Opción 1: Usa tu propio cálculo personalizado en BigQuery

Los recuentos sin procesar del paso anterior son útiles, pero el objetivo es obtener una sola puntuación fácil de usar. El paso final es combinar estos recuentos con pesos y, luego, normalizar el resultado en una escala de 0 a 10.

Cómo aplicar pesos personalizados: Elegir tus pesos es un arte y una ciencia. Deben reflejar las prioridades de tu empresa o lo que crees que es más importante para tus usuarios. Para una puntuación de "Apto para la familia", podrías decidir que un parque es dos veces más importante que un museo. Comienza con tus mejores suposiciones y realiza iteraciones en función de los comentarios de los usuarios.

Normalización de la puntuación: La siguiente consulta usa dos expresiones de tabla comunes (CTE): la primera calcula los recuentos sin procesar como antes, y la segunda calcula las puntuaciones ponderadas. Luego, la instrucción SELECT final realiza una normalización de min-max en las puntuaciones ponderadas. Se genera la columna location de la tabla de ejemplo apartment_listings para habilitar la visualización de datos en un mapa.

WITH
  -- CTE 1: Count nearby amenities of interest for each apartment listing.
  insight_counts AS (
    SELECT WITH AGGREGATION_THRESHOLD
      apartments.id,
      apartments.name,
      COUNTIF(places.primary_type = 'park') AS park_count,
      COUNTIF(places.primary_type = 'museum') AS museum_count,
      COUNTIF(places.primary_type = 'restaurant' AND places.good_for_children = TRUE) AS family_restaurant_count,
      COUNTIF(places.primary_type IN ('veterinary_care', 'pet_store')) AS pet_service_count,
      COUNTIF(places.allows_dogs = TRUE) AS dog_friendly_place_count
    FROM
      `your_project.your_dataset.apartment_listings` AS apartments
    LEFT JOIN
      `your-project.places_insights___us.places` AS places
      ON ST_DWITHIN(apartments.location, places.point, 800)
    GROUP BY
      apartments.id,
      apartments.name
  ),
  -- CTE 2: Apply custom weighting to the amenity counts to generate raw scores.
  raw_scores AS (
    SELECT
      id,
      name,
      (park_count * 3.0) + (museum_count * 1.5) + (family_restaurant_count * 2.5) AS family_friendliness_score,
      (park_count * 2.0) + (pet_service_count * 3.5) + (dog_friendly_place_count * 2.5) AS pet_paradise_score
    FROM
      insight_counts
  )
-- Final Step: Normalize scores to a 0-10 scale and rejoin to retrieve the location geometry.
SELECT
  raw_scores.id,
  raw_scores.name,
  apartments.location,
  raw_scores.family_friendliness_score,
  raw_scores.pet_paradise_score,
  -- Normalize Family Score using a MIN/MAX window function.
  ROUND(
    COALESCE(
      SAFE_DIVIDE(
        (raw_scores.family_friendliness_score - MIN(raw_scores.family_friendliness_score) OVER ()),
        (MAX(raw_scores.family_friendliness_score) OVER () - MIN(raw_scores.family_friendliness_score) OVER ())
      ) * 10,
      0
    ),
    2
  ) AS normalized_family_score,
  -- Normalize Pet Score using a MIN/MAX window function.
  ROUND(
    COALESCE(
      SAFE_DIVIDE(
        (raw_scores.pet_paradise_score - MIN(raw_scores.pet_paradise_score) OVER ()),
        (MAX(raw_scores.pet_paradise_score) OVER () - MIN(raw_scores.pet_paradise_score) OVER ())
      ) * 10,
      0
    ),
    2
  ) AS normalized_pet_score
FROM
  raw_scores
JOIN
  `your_project.your_dataset.apartment_listings` AS apartments
  ON raw_scores.id = apartments.id;

Los resultados de la búsqueda serán similares a los que se muestran a continuación. Las últimas dos columnas son las puntuaciones normalizadas.

Resultados finales de la búsqueda que muestran las puntuaciones ponderadas sin procesar y las puntuaciones normalizadas de 0 a 10 para cada ficha de departamento.

Información sobre la puntuación normalizada

Es importante comprender por qué este paso final de normalización es tan valioso. Las puntuaciones ponderadas sin procesar pueden variar de 0 a un número potencialmente muy grande, según la densidad urbana de tus ubicaciones. Una puntuación de 500 no tiene sentido para un usuario sin contexto.

La normalización transforma estos números abstractos en una clasificación relativa. Al ajustar los resultados en una escala del 0 al 10, la puntuación comunica claramente cómo se compara cada ubicación con las demás en tu conjunto de datos específico:

  • Se asigna una puntuación de 10 a la ubicación con la puntuación sin procesar más alta, lo que la marca como la mejor opción en el conjunto actual.
  • Se asigna una puntuación de 0 a la ubicación con la puntuación sin procesar más baja, lo que la convierte en el valor de referencia para la comparación. Esto no significa que la ubicación no tenga servicios, sino que es la menos adecuada en relación con las otras opciones que se evalúan.
  • Todas las demás puntuaciones se encuentran proporcionalmente entre estos dos extremos, lo que les brinda a los usuarios una forma clara e intuitiva de comparar sus opciones de un vistazo.

Opción 2: Usa la API de Gemini Developer

Como alternativa a usar una fórmula matemática fija en BigQuery, la API de Gemini Developer ofrece una forma eficaz de calcular puntuaciones de ubicación personalizadas y matizadas.

Si bien la opción 1 es excelente para la puntuación puramente cuantitativa basada en el recuento de servicios, no puede tener en cuenta fácilmente los datos cualitativos. Con Gemini, puedes combinar las cifras de tu consulta de Places Insights con datos no estructurados, como la descripción de texto del anuncio de un departamento (p.ej., "Esta ubicación es adecuada para familias y la zona es tranquila por la noche") o preferencias específicas del perfil del usuario (p.ej., "Este usuario está reservando para una familia y prefiere una zona tranquila en una ubicación central"), para generar una puntuación más detallada.

Prepara los datos para Gemini

Para usar este método, transforma los resultados de tu agregación de BigQuery (del paso 2) en formato Markdown y combínalos con tus datos cualitativos, como un Listing Description.

En este ejemplo, tenemos dos fichas con características muy diferentes. También incluimos un Target User Profile para que Gemini sepa para quiénes estamos calificando estas respuestas:

## Listing 1: The Downtowner

*   **ID:** 1
*   **Amenity Counts:**
    *   Parks: 70
    *   Museums: 34
    *   Family-Friendly Restaurants: 141
*   **Listing Description:** A vibrant apartment in the heart of the city.
    Great for nightlife, but can be noisy on weekends. Close to several
    small playgrounds.
*   **Target User Profile:** Young family with a toddler, looking for a
    balance of activity and quiet.

---

## Listing 2: Suburban Oasis

*   **ID:** 2
*   **Amenity Counts:**
    *   Parks: 34
    *   Museums: 30
    *   Family-Friendly Restaurants: 318
*   **Listing Description:** Quiet, tree-lined street. Large backyard and easy
    walking distance to a major park and elementary school.
*   **Target User Profile:** Young family with a toddler, looking for a
    balance of activity and quiet.
Instrucciones del sistema

Gemini requiere instrucciones del sistema para saber cómo ponderar estos diferentes puntos de datos. Puedes indicarle al modelo de forma explícita la importancia de servicios específicos y, al mismo tiempo, darle instrucciones para que tenga en cuenta el sentimiento de las descripciones de texto.

You are an expert real estate analyst. Your goal is to generate a
"Family-Friendliness Score" between 0.0 and 10.0 for a list of apartment
locations.

For each location, you will be given quantitative data (amenity counts)
and qualitative data (descriptions and user profiles).

Scoring Criteria:
-   High importance: Proximity to parks and a high count of family-friendly
    restaurants.
-   Medium importance: Proximity to museums.
-   Negative modifiers: Descriptions indicating excessive noise, lack of
    safe play areas, or mismatch with the user profile.
-   Positive modifiers: Descriptions indicating quiet areas, safe streets,
    or extra space (e.g., backyards).

Analyze the provided data and generate scores based on these criteria.
Resultados estructurados

Para garantizar la confiabilidad cuando integres la IA en tu aplicación, no debes depender solo de las instrucciones para el formato de salida. En su lugar, usa la función de salida estructurada de Gemini. Si proporcionas un responseSchema, garantizas que el modelo devuelva un array JSON limpio y analizable que coincida con los requisitos exactos de tu sistema.

En nuestro ejemplo, podemos aplicar el siguiente esquema:

{
  "type": "ARRAY",
  "items": {
    "type": "OBJECT",
    "required": ["location_id", "name", "score", "reasoning"],
    "properties": {
      "location_id": {"type": "STRING"},
      "name": {"type": "STRING"},
      "score": {
        "type": "NUMBER"
      },
      "reasoning": {
        "type": "STRING"
      }
    }
  }
}
Ejemplo de resultado:

Cuando envías la instrucción con el responseSchema definido, Gemini devuelve un array JSON estructurado que tu aplicación puede usar directamente.

Observa en el resultado cómo Gemini maneja las desventajas. "The Downtowner" tiene una cantidad increíblemente alta de parques, pero Gemini identifica la descripción "ruidoso los fines de semana" como un factor negativo importante para un niño pequeño. Mientras tanto, "Oasis suburbano" obtiene una puntuación casi perfecta, ya que combina una excelente densidad de servicios con características cualitativas aplicables, como "calle tranquila y arbolada".

[
  {
    "id": 1,
    "location_name": "The Downtowner",
    "analysis_notes": "Excellent amenity counts (parks, restaurants, museums), fulfilling
    quantitative metrics. However, the qualitative data indicates excessive weekend
    noise and a strong nightlife focus, conflicting directly with the target
    user's need for quiet and suitability for a toddler. This mismatch
    significantly lowers the final score.",
    "family_friendliness_score": 5.5
  },
  {
    "id": 2,
    "location_name": "Suburban Oasis",
    "analysis_notes": "Outstanding quantitative data, especially the very high count of
    family-friendly restaurants. The qualitative description (quiet, tree-lined street,
    large backyard, proximity to elementary school and major park) aligns perfectly with
    and exceeds the needs of the target family profile. High positive modifiers
    result in a near-perfect score.",
    "family_friendliness_score": 9.8
  }
]

Este método te permite ofrecer una puntuación altamente personalizada que se siente inteligible y adaptada a cada usuario individual.

4. Visualiza tus puntuaciones en un mapa

BigQuery Studio incluye una visualización de mapa integrada para cualquier resultado de consulta que contenga una columna GEOGRAPHY. Dado que nuestra consulta genera la columna location, puedes visualizar tus puntuaciones de inmediato.

Si haces clic en la pestaña Visualization, aparecerá el mapa, y el menú desplegable Data Column controla la puntuación de ubicación que se visualizará. En este ejemplo, el normalized_pet_score se visualiza desde el ejemplo de la opción 1. Ten en cuenta que, en este ejemplo, se agregaron más ubicaciones a la tabla apartment_listings.

Un mapa que visualiza la puntuación de mascotas normalizada para varias ubicaciones, en el que los puntos verdes más oscuros representan puntuaciones más altas y favorables.

La visualización de los datos revela de un vistazo las ubicaciones más adecuadas para la puntuación creada. Los círculos verdes más oscuros representan las ubicaciones con un normalized_pet_score más alto, en este caso. Para obtener más opciones de visualización de los datos de Estadísticas de Lugares, consulta Visualiza los resultados de la búsqueda.

Conclusión

Ahora tienes una metodología potente y repetible para crear puntuaciones de ubicación detalladas. Comenzando con tus ubicaciones, creaste una sola consulta en SQL en BigQuery que encuentra lugares cercanos con ST_DWITHIN, los filtra por atributos avanzados como good_for_children y allows_dogs, y agrega los resultados con COUNTIF. Al aplicar pesos personalizados y normalizar el resultado, obtuviste una sola puntuación fácil de usar que proporciona estadísticas detalladas y prácticas. Puedes aplicar este patrón directamente para transformar los datos de ubicación sin procesar en una ventaja competitiva significativa.

Próximas acciones

Ahora es tu turno de crear. En este instructivo, se proporciona una plantilla. Puedes usar los datos enriquecidos disponibles en el esquema de Estadísticas de Lugares para crear las puntuaciones más necesarias para tu caso de uso. Considera estos otros modelos de puntuación que podrías crear:

  • "Puntuación de vida nocturna": Combina filtros para primary_type (bar, night_club), price_level y horarios de apertura nocturnos para encontrar las áreas más vibrantes después del anochecer.
  • "Puntuación de fitness y bienestar": Cuenta los gyms, parks y health_food_stores cercanos, y filtra los restaurantes para aquellos que tengan serves_vegetarian_food y así calificar las ubicaciones para los usuarios que se preocupan por su salud.
  • "Puntuación de ensueño para los viajeros": Encuentra ubicaciones con una alta densidad de lugares transit_station y parking cercanos para ayudar a los usuarios que valoran el acceso al transporte.

Colaboradores

Henrik Valve | Ingeniero de DevX