Descripción general
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

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.

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.

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.

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.

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_levely horarios de apertura nocturnos para encontrar las áreas más vibrantes después del anochecer. - "Puntuación de fitness y bienestar": Cuenta los
gyms,parksyhealth_food_storescercanos, y filtra los restaurantes para aquellos que tenganserves_vegetarian_foody 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_stationyparkingcercanos para ayudar a los usuarios que valoran el acceso al transporte.
Colaboradores
Henrik Valve | Ingeniero de DevX