Создавайте индивидуальные оценки местоположений с помощью Places Insights

Обзор

Объект недвижимости с рейтингом Pet-Owner Paradise Score 9,1, основанным на наличии близлежащих парков и мест, где разрешено содержать собак.

Стандартные данные о местоположении могут подсказать, что находится поблизости, но они часто не отвечают на более важный вопрос: «Насколько хорошо мне подходит этот район?» Потребности ваших пользователей индивидуальны. У семьи с маленькими детьми иные приоритеты, чем у молодого специалиста с собакой. Чтобы помочь им принимать уверенные решения, необходимо предоставить информацию, учитывающую эти конкретные потребности. Индивидуальная оценка местоположения — мощный инструмент для предоставления этой ценности и создания дифференцированного пользовательского опыта.

В этом документе описывается, как создавать индивидуальные многоаспектные оценки местоположения с помощью набора данных Places Insights в BigQuery. Преобразуя данные о точках интереса (POI) в значимые метрики, вы сможете улучшить свои приложения для сферы недвижимости, розничной торговли или туризма, предоставив пользователям необходимую информацию. Мы также предоставляем возможность использовать API Gemini Developer API для эффективного вычисления оценок местоположения.

Повышайте ценность бизнеса с помощью индивидуальных оценок

Следующие примеры иллюстрируют, как можно преобразовать необработанные данные о местоположении в эффективные, ориентированные на пользователя метрики для улучшения вашего приложения.

  • Застройщики могут создать «Рейтинг удобства для семьи» или «Рейтинг мечты для тех, кто регулярно ездит на работу», чтобы помочь покупателям и арендаторам выбрать идеальный район, соответствующий их образу жизни, что приведет к повышению вовлеченности пользователей, повышению качества лидов и ускорению конверсий.
  • Специалисты по туризму и гостеприимству могут создать «Рейтинг ночной жизни» или «Райский рейтинг экскурсантов», чтобы помочь путешественникам выбрать отель, соответствующий их стилю отдыха, тем самым повышая показатели бронирования и удовлетворенности клиентов.
  • Аналитики розничной торговли могут создать «Рейтинг фитнеса и благополучия», чтобы определить оптимальное место для нового тренажерного зала или магазина здорового питания на основе близлежащих дополнительных предприятий, максимально увеличивая потенциал для охвата нужной демографической группы пользователей.

В этом руководстве вы познакомитесь с гибкой трёхэтапной методологией построения любой пользовательской оценки местоположения с использованием данных Places непосредственно в BigQuery. Мы проиллюстрируем этот подход на примере двух отдельных оценок: оценки семейного комфорта и оценки райских условий для владельцев домашних животных . Такой подход позволяет выйти за рамки количества мест и воспользоваться богатым набором подробных атрибутов в наборе данных Places Insights. Вы можете использовать такую ​​информацию, как часы работы, подходит ли место для детей или разрешено ли приходить с собаками, для создания сложных и содержательных метрик для ваших пользователей.

Рабочий процесс решения

Трехэтапная схема рабочего процесса: определение местоположений, поиск близлежащих мест и нормализация результатов для получения окончательной оценки.

В этом руководстве используется один мощный SQL-запрос для построения индивидуальной оценки, которую можно адаптировать к любому варианту использования. Мы рассмотрим этот процесс на примере построения двух примеров оценок для гипотетического набора объявлений о продаже квартир.

Предпосылки

Прежде чем начать, следуйте этим инструкциям по настройке Places Insights.

1. Создайте основу: места, представляющие для вас интерес

Прежде чем создавать оценки, вам потребуется список локаций, которые вы хотите проанализировать. Первым шагом является обеспечение наличия этих данных в таблице BigQuery. Ключевым моментом является наличие уникального идентификатора для каждой локации и столбца GEOGRAPHY , в котором хранятся её координаты.

Вы можете создать и заполнить таблицу местоположений для оценки с помощью такого запроса:

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
  . . . ;

Выполнение SELECT * для данных о местоположении будет выглядеть примерно так.

Результаты запроса BigQuery содержат таблицу объявлений о квартирах с идентификатором, названием и координатами местоположения.

2. Разработайте основную логику: запрос оценки

После определения местоположения следующим шагом будет поиск, фильтрация и подсчёт близлежащих мест, соответствующих вашему индивидуальному рейтингу. Всё это делается одним оператором SELECT .

Найдите то, что находится поблизости, с помощью геопространственного поиска

Сначала вам нужно найти все места из набора данных Places Insights, которые находятся на определённом расстоянии от каждого из ваших местоположений. Функция BigQuery ST_DWITHIN идеально подходит для этого. Мы выполним операцию JOIN между нашей таблицей apartment_listings и таблицей places_insights , чтобы найти все места в радиусе 800 метров. LEFT JOIN гарантирует, что все ваши исходные местоположения будут включены в результаты, даже если поблизости не найдено ни одного подходящего места.

Фильтр по релевантности с расширенными атрибутами

Здесь вы преобразуете абстрактную концепцию оценки в конкретные фильтры данных. Для наших двух примеров оценок критерии различны:

  • При оценке «Семейного туризма» мы учитываем парки, музеи и рестораны, которые однозначно полезны для детей.
  • Для рейтинга «Рай для владельцев домашних животных» мы учитываем парки, ветеринарные клиники, зоомагазины, а также любые рестораны и кафе, куда можно приходить с собаками.

Вы можете фильтровать эти конкретные атрибуты непосредственно в предложении WHERE вашего запроса.

Объедините данные по каждому местоположению

Наконец, вам нужно подсчитать, сколько подходящих мест вы нашли для каждой квартиры. Функция GROUP BY объединяет результаты, а функция COUNTIF подсчитывает количество мест, соответствующих определённым критериям для каждого из наших рейтингов.

Запрос ниже объединяет эти три шага, вычисляя необработанные значения для обеих оценок за один проход:

-- 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;

Результат этого запроса будет аналогичен этому.

Результаты BigQuery показывают приблизительное количество удобств, таких как парки, рестораны и услуги для домашних животных, для каждого объявления о продаже квартир.

Мы будем опираться на эти результаты в следующем разделе.

3. Создайте счет

Теперь, когда у вас есть данные о количестве мест и весовых коэффициентах для каждого типа каждого местоположения, вы можете сгенерировать индивидуальный рейтинг местоположения. В этом разделе мы рассмотрим два варианта: использование собственного расчёта в BigQuery или использование API разработчика Gemini .

Вариант 1: использование собственных расчетов в BigQuery

Первичные данные, полученные на предыдущем этапе, дают ценную информацию, но наша цель — получить единую, удобную для пользователя оценку. Последний шаг — объединить эти данные, используя весовые коэффициенты, и нормализовать результат по шкале от 0 до 10.

Применение пользовательских весовых коэффициентов . Выбор весовых коэффициентов — это одновременно искусство и наука. Они должны отражать приоритеты вашего бизнеса или то, что, по вашему мнению, наиболее важно для ваших пользователей. Для оценки «Семейного посещения» вы можете решить, что парк вдвое важнее музея. Начните с самых надежных предположений и корректируйте их, основываясь на отзывах пользователей.

Нормализация оценки. В запросе ниже используются два общих табличных выражения (CTE): первое вычисляет исходные значения, как и раньше, а второе — взвешенные оценки. Последний оператор SELECT затем выполняет нормализацию взвешенных оценок по минимуму и максимуму. Выводится столбец location из таблицы apartment_listings , что позволяет визуализировать данные на карте.

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;

Результаты запроса будут аналогичны приведённым ниже. Последние два столбца — нормализованные оценки.

Окончательные результаты запроса, показывающие как сырые взвешенные оценки, так и нормализованные оценки от 0 до 10 для каждого объявления о продаже квартир.

Понять нормализованную оценку

Важно понимать, почему этот последний этап нормализации так ценен. Исходные взвешенные оценки могут варьироваться от 0 до потенциально очень большого значения в зависимости от плотности городского населения в вашем регионе. Оценка 500 не имеет смысла для пользователя без контекста.

Нормализация преобразует эти абстрактные числа в относительный рейтинг. Масштабируя результаты от 0 до 10, оценка наглядно показывает, как каждое местоположение соотносится с другими в вашем наборе данных:

  • Оценка 10 присваивается месту с наивысшим предварительным баллом, что отмечает его как лучший вариант в текущем наборе.
  • Местоположение с наименьшим предварительным баллом получает оценку 0 , что делает его базовым для сравнения. Это не означает, что в данном месте нет никаких удобств, а скорее означает, что оно наименее подходящее по сравнению с другими рассматриваемыми вариантами.
  • Все остальные оценки пропорционально располагаются между ними, предоставляя вашим пользователям простой и интуитивно понятный способ сравнения своих вариантов.

Вариант 2: использование API разработчика Gemini

В качестве альтернативы использованию фиксированной математической формулы в BigQuery API Gemini Developer предлагает мощный способ вычисления детальных пользовательских оценок местоположения.

Хотя вариант 1 отлично подходит для чисто количественной оценки, основанной на количестве удобств, он не позволяет легко учитывать качественные данные. Используя Gemini, вы можете объединить данные из запроса Places Insights с неструктурированными данными, такими как текстовое описание объявления о продаже апартаментов (например, «Это место подходит для семей, и в этом районе тихо ночью») или особые предпочтения пользователя (например, «Этот пользователь бронирует жилье для семьи и предпочитает тихий район в центре города»), чтобы получить более детальную оценку.

Подготовьте данные для Gemini

Чтобы использовать этот метод, преобразуйте результаты агрегации BigQuery (из шага 2 ) в формат Markdown и объедините их с качественными данными, такими как Listing Description .

В этом примере у нас есть два объявления с очень разными характеристиками. Мы также добавляем Target User Profile , чтобы Gemini понимал, для кого мы их оцениваем:

## 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.
Системные инструкции

Gemini требуются системные инструкции, чтобы знать, как взвешивать эти различные точки данных. Вы можете явно указать модели, насколько важны конкретные удобства, а также указать ей, что нужно учитывать тональность текстовых описаний.

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.
Структурированный вывод

Чтобы обеспечить надёжность интеграции ИИ в ваше приложение, не стоит полагаться только на запросы формата вывода. Вместо этого используйте функцию структурированного вывода Gemini. Предоставляя responseSchema , вы гарантируете, что модель вернёт чистый, пригодный для анализа JSON-массив, который точно соответствует вашим системным требованиям.

В нашем примере мы можем реализовать следующую схему:

{
  "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"
      }
    }
  }
}
Пример вывода

При отправке приглашения с определенной responseSchema , Gemini возвращает структурированный массив JSON, готовый к непосредственному использованию вашим приложением.

Обратите внимание на то, как Gemini справляется с компромиссами в результатах. В районе «The Downtowner» невероятно много парков, но Gemini считает описание «шумно по выходным» серьёзным недостатком для малышей. В то же время, «Suburban Oasis» получает почти высший балл, сочетая отличную плотность инфраструктуры с такими качественными характеристиками, как «тихая, усаженная деревьями улица».

[
  {
    "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
  }
]

Этот метод позволяет вам предоставлять высокоперсонализированные оценки, которые понятны и соответствуют потребностям каждого отдельного пользователя.

4. Визуализируйте свои результаты на карте.

BigQuery Studio включает интегрированную визуализацию карты для любого результата запроса, содержащего столбец GEOGRAPHY . Поскольку наш запрос возвращает столбец location , вы можете сразу визуализировать свои оценки.

При нажатии на вкладку Visualization откроется карта, а раскрывающийся Data Column позволяет настроить визуализируемый рейтинг местоположения. В этом примере normalized_pet_score визуализируется из примера Варианта 1. Обратите внимание, что для этого примера в таблицу apartment_listings были добавлены дополнительные местоположения.

Карта, на которой визуализируется нормализованный рейтинг питомцев для различных локаций, где более тёмные зелёные точки представляют более высокие, более благоприятные оценки.

Визуализация данных позволяет сразу определить наиболее подходящие местоположения для созданного показателя: в данном случае более тёмно-зелёные круги соответствуют местоположениям с более высоким значением normalized_pet_score . Дополнительные возможности визуализации данных Places Insights см. в разделе «Визуализация результатов запроса» .

Заключение

Теперь у вас есть мощная и воспроизводимая методология для создания детальных оценок местоположения. Начав с ваших местоположений, вы создали один SQL-запрос в BigQuery, который находит близлежащие места с помощью ST_DWITHIN , фильтрует их по расширенным атрибутам, таким как good_for_children и allows_dogs , и агрегирует результаты с помощью COUNTIF . Применяя пользовательские весовые коэффициенты и нормализуя результат, вы получили единую, удобную для пользователя оценку, которая обеспечивает глубокий и практически применимый анализ. Вы можете напрямую применить этот шаблон для преобразования необработанных данных о местоположении в существенное конкурентное преимущество.

Следующие действия

Теперь ваша очередь создавать. В этом руководстве представлен шаблон. Вы можете использовать обширные данные, доступные в схеме Places Insights, для создания оценок, наиболее необходимых для вашего варианта использования. Рассмотрим другие оценки, которые вы можете создать:

  • «Оценка ночной жизни»: Объедините фильтры по primary_type ( bar , night_club ), price_level и часам работы в ночное время, чтобы найти самые оживленные места после наступления темноты.
  • «Оценка фитнеса и хорошего самочувствия»: подсчитайте близлежащие gyms , parks и health_food_stores , а также отфильтруйте рестораны, в которых подается serves_vegetarian_food , чтобы оценить местоположения для пользователей, заботящихся о своем здоровье.
  • «Оценка мечты пассажира»: найдите места с высокой плотностью близлежащих transit_station и parking мест, чтобы помочь пользователям, которые ценят доступ к транспорту.

Авторы

Хенрик Валв | Инженер DevX