Tworzenie niestandardowych wyników lokalizacji za pomocą Places Insights

Przegląd

Ogłoszenie nieruchomości z niestandardowym wynikiem 9,1 punktu w kategorii „Raj dla właścicieli zwierząt”, który jest obliczany na podstawie liczby pobliskich parków i miejsc przyjaznych psom.

Standardowe dane o lokalizacji mogą Ci powiedzieć, co znajduje się w pobliżu, ale często nie odpowiadają na ważniejsze pytanie: „Jak dobra jest ta okolica dla mnie?”. Potrzeby użytkowników są zróżnicowane. Rodzina z małymi dziećmi ma inne priorytety niż młody pracownik z psem. Aby pomóc im w podejmowaniu trafnych decyzji, musisz dostarczać statystyki odzwierciedlające te konkretne potrzeby. Niestandardowy wynik lokalizacji to skuteczne narzędzie, które pozwala dostarczać tę wartość i zapewniać użytkownikom znacznie lepsze wrażenia.

Z tego dokumentu dowiesz się, jak tworzyć niestandardowe, wieloaspektowe oceny lokalizacji za pomocą zbioru danych Places Insights w BigQuery. Przekształcając dane o punktach POI w przydatne wskaźniki, możesz wzbogacić aplikacje z branży nieruchomości, handlu detalicznego lub turystyki i zapewnić użytkownikom potrzebne im informacje. Udostępniamy też opcję korzystania z interfejsu Gemini Developer API, który jest zaawansowanym sposobem obliczania wyników lokalizacji.

Zwiększanie wartości biznesowej dzięki dostosowanym wynikom

Poniższe przykłady pokazują, jak przekształcić surowe dane o lokalizacji w przydatne dane o użytkownikach, aby ulepszyć aplikację.

  • Deweloperzy mogą utworzyć „ocenę przyjazności dla rodzin” lub „ocenę dla osób dojeżdżających do pracy”, aby pomóc kupującym i najemcom wybrać idealną okolicę, która odpowiada ich stylowi życia. Prowadzi to do zwiększenia zaangażowania użytkowników, uzyskiwania większej liczby potencjalnych klientów o wyższej jakości i szybszych konwersji.
  • Inżynierowie z branży turystycznej i hotelarskiej mogą opracować „ocenę życia nocnego” lub „ocenę dla miłośników zwiedzania”, aby pomóc podróżnym wybrać hotel dopasowany do ich stylu wypoczynku, co zwiększy liczbę rezerwacji i zadowolenie klientów.
  • Analitycy handlu detalicznego mogą generować „Wynik dotyczący fitnessu i zdrowia”, aby określić optymalną lokalizację nowej siłowni lub sklepu ze zdrową żywnością na podstawie pobliskich firm uzupełniających, co pozwala zmaksymalizować potencjał kierowania reklam na odpowiednią grupę demograficzną użytkowników.

Z tego przewodnika dowiesz się, jak za pomocą danych Miejsc bezpośrednio w BigQuery utworzyć dowolny rodzaj niestandardowego wyniku lokalizacji. Ten wzorzec zilustrujemy, tworząc 2 różne przykładowe oceny: ocenę przyjazności dla rodzinocenę przyjazności dla właścicieli zwierząt. To podejście pozwala wyjść poza liczbę miejsc i skorzystać z bogatych, szczegółowych atrybutów w zbiorze danych Statystyki miejsc. Możesz używać informacji takich jak godziny otwarcia, czy miejsce jest odpowiednie dla dzieci lub czy można wejść do niego z psem, aby tworzyć zaawansowane i przydatne dane dla użytkowników.

Przepływ pracy rozwiązania

Diagram przepływu pracy składający się z 3 kroków: ustalanie lokalizacji, wysyłanie zapytań o miejsca w pobliżu i normalizowanie wyników w celu utworzenia końcowego wyniku.

W tym samouczku używamy jednego, zaawansowanego zapytania SQL do utworzenia niestandardowego wyniku, który możesz dostosować do dowolnego przypadku użycia. Przeprowadzimy Cię przez ten proces, tworząc 2 przykładowe wyniki dla hipotetycznego zestawu ofert mieszkań.

Wymagania wstępne

Zanim zaczniesz, wykonaj te instrukcje, aby skonfigurować Statystyki Miejsc.

1. Stwórz podstawy: lokalizacje interesujące użytkowników

Zanim utworzysz wyniki, musisz mieć listę lokalizacji, które chcesz analizować. Pierwszym krokiem jest sprawdzenie, czy te dane są dostępne w BigQuery w postaci tabeli. Kluczem jest posiadanie unikalnego identyfikatora dla każdej lokalizacji i GEOGRAPHYkolumny, w której są przechowywane jej współrzędne.

Możesz utworzyć i wypełnić tabelę lokalizacji do oceny za pomocą zapytania takiego jak to:

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

Wykonanie SELECT * na danych o lokalizacji wyglądałoby podobnie do tego.

Wyniki zapytania BigQuery przedstawiające tabelę z ofertami mieszkań z identyfikatorem, nazwą i współrzędnymi lokalizacji.

2. Opracuj podstawową logikę: zapytanie dotyczące oceny

Po ustaleniu lokalizacji kolejnym krokiem jest znalezienie, filtrowanie i zliczenie pobliskich miejsc, które są istotne dla Twojego wyniku niestandardowego. Wszystko to odbywa się w ramach jednej instrukcji SELECT.

Znajdowanie tego, co jest w pobliżu, za pomocą wyszukiwania geoprzestrzennego

Najpierw musisz znaleźć wszystkie miejsca ze zbioru danych Places Insights, które znajdują się w określonej odległości od każdej z Twoich lokalizacji. Funkcja BigQuery ST_DWITHIN idealnie się do tego nadaje. Wykonamy JOIN między naszą tabelą apartment_listings a tabelą places_insights, aby znaleźć wszystkie miejsca w promieniu 800 metrów. Symbol LEFT JOIN zapewnia, że w wynikach zostaną uwzględnione wszystkie Twoje pierwotne lokalizacje, nawet jeśli w pobliżu nie zostaną znalezione żadne pasujące miejsca.

Filtrowanie według trafności za pomocą atrybutów zaawansowanych

W tym miejscu przekształcasz abstrakcyjną koncepcję wyniku w konkretne filtry danych. W przypadku 2 przykładowych wyników kryteria są różne:

  • W przypadku „oceny przyjazności dla rodzin” bierzemy pod uwagę parki, muzea i restauracje, które są szczególnie odpowiednie dla dzieci.
  • W przypadku „oceny dla właścicieli zwierząt” bierzemy pod uwagę parki, kliniki weterynaryjne, sklepy zoologiczne oraz restauracje i kawiarnie, w których można przebywać z psami.

Te konkretne atrybuty możesz filtrować bezpośrednio w klauzuli WHERE zapytania.

Zbieranie statystyk dla każdej lokalizacji

Na koniec musisz policzyć, ile odpowiednich miejsc udało Ci się znaleźć w przypadku każdego mieszkania. Klauzula GROUP BY agreguje wyniki, a funkcja COUNTIF zlicza miejsca, które spełniają określone kryteria dla każdego z naszych wyników.

Poniższe zapytanie łączy te 3 kroki, obliczając surowe liczby dla obu wyników w jednym przebiegu:

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

Wynik tego zapytania będzie podobny do tego.

Wyniki BigQuery pokazujące surowe liczby udogodnień, takich jak parki, restauracje i usługi dla zwierząt, dla każdej oferty mieszkania.

W następnej sekcji wykorzystamy te wyniki.

3. Tworzenie wyniku

Teraz masz liczbę miejsc i wagi dla każdego typu miejsca w każdej lokalizacji, więc możesz wygenerować niestandardowy wynik lokalizacji. W tej sekcji omówimy 2 opcje: użycie własnych obliczeń niestandardowych w BigQuery lub użycie Gemini Developer API.

Opcja 1. Użyj własnych obliczeń niestandardowych w BigQuery

Surowe dane z poprzedniego kroku są przydatne, ale celem jest uzyskanie jednego, łatwego w interpretacji wyniku. Ostatnim krokiem jest połączenie tych wartości za pomocą wag, a następnie znormalizowanie wyniku do skali 0–10.

Stosowanie wag niestandardowych Wybór wag to zarówno sztuka, jak i nauka. Powinny one odzwierciedlać priorytety Twojej firmy lub to, co Twoim zdaniem jest najważniejsze dla użytkowników. W przypadku oceny „Przyjazność dla rodzin” możesz uznać, że park jest 2 razy ważniejszy niż muzeum. Zacznij od najlepszych założeń i wprowadzaj zmiany na podstawie opinii użytkowników.

Normalizowanie wyniku Poniższe zapytanie używa dwóch zapytań CTE (Common Table Expression): pierwsze oblicza surowe liczby jak poprzednio, a drugie oblicza ważone wyniki. Ostateczna instrukcja SELECT przeprowadza normalizację min-max na ważonych wynikach. Wyświetlana jest kolumna location tabeli przykładowejapartment_listings, aby umożliwić wizualizację danych na mapie.

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;

Wyniki zapytania będą podobne do tych poniżej. Dwie ostatnie kolumny zawierają znormalizowane wyniki.

Końcowe wyniki zapytania pokazujące zarówno surowe ważone wyniki, jak i znormalizowane wyniki w skali 0–10 dla każdej oferty mieszkania.

Interpretowanie znormalizowanej oceny

Warto zrozumieć, dlaczego ten ostatni krok normalizacji jest tak cenny. Surowe ważone wyniki mogą się wahać od 0 do potencjalnie bardzo dużej liczby w zależności od gęstości zaludnienia w Twoich lokalizacjach. Wynik 500 jest bez kontekstu bez znaczenia dla użytkownika.

Normalizacja przekształca te abstrakcyjne liczby w ranking względny. Skalując wyniki od 0 do 10, wynik wyraźnie pokazuje, jak poszczególne lokalizacje wypadają na tle innych w Twoim konkretnym zbiorze danych:

  • Wynik 10 jest przypisywany do lokalizacji z najwyższym wynikiem surowym, co oznacza, że jest to najlepsza opcja w bieżącym zbiorze.
  • Wynik 0 jest przypisywany do lokalizacji z najniższym wynikiem pierwotnym, co czyni ją punktem odniesienia do porównania. Nie oznacza to, że w tej lokalizacji nie ma żadnych udogodnień, ale że jest ona najmniej odpowiednia w porównaniu z innymi rozważanymi opcjami.
  • Wszystkie inne wyniki są proporcjonalnie rozłożone pomiędzy tymi wartościami, co pozwala użytkownikom szybko i intuicyjnie porównać dostępne opcje.

Opcja 2. Użyj interfejsu Gemini Developer API

Interfejs Gemini Developer API to zaawansowany sposób obliczania niuansowanych niestandardowych wyników lokalizacji, który może zastąpić stałą formułę matematyczną w BigQuery.

Sposób 1 doskonale sprawdza się w przypadku czysto ilościowej oceny na podstawie liczby udogodnień, ale nie uwzględnia danych jakościowych. Korzystając z Gemini, możesz łączyć liczby z zapytania Statystyk miejsc z danymi nieustrukturyzowanymi, takimi jak tekstowy opis oferty mieszkania (np. „Ta lokalizacja jest odpowiednia dla rodzin, a w nocy jest tu cicho”) lub preferencje konkretnego profilu użytkownika (np. „Ten użytkownik rezerwuje pobyt dla rodziny i woli spokojną okolicę w centralnej lokalizacji”), aby wygenerować bardziej szczegółową ocenę.

Przygotowywanie danych dla Gemini

Aby użyć tej metody, przekształć wyniki agregacji BigQuery (z kroku 2) do formatu Markdown i połącz je z danymi jakościowymi, np. z Listing Description.

W tym przykładzie mamy 2 wizytówki o bardzo różnych cechach. Dodajemy też symbol Target User Profile, aby poinformować Gemini, dla kogo oceniamy te treści:

## 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.
Instrukcje systemowe

Gemini potrzebuje instrukcji systemowych, aby wiedzieć, jak traktować te różne punkty danych. Możesz wyraźnie określić, jak ważne są poszczególne udogodnienia, a także poinstruować model, aby uwzględniał nastawienie w opisach tekstowych.

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.
Uporządkowane dane wyjściowe

Aby zapewnić niezawodność podczas integrowania AI z aplikacją, nie polegaj wyłącznie na promptach w zakresie formatu danych wyjściowych. Zamiast tego użyj funkcji danych strukturalnych w Gemini. Podając responseSchema, masz pewność, że model zwróci czystą, możliwą do przeanalizowania tablicę JSON, która spełnia Twoje wymagania systemowe.

W naszym przykładzie możemy wymusić ten schemat:

{
  "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"
      }
    }
  }
}
Przykładowe dane wyjściowe

Gdy wyślesz prompta z określonym responseSchema, Gemini zwróci uporządkowaną tablicę JSON, która jest gotowa do bezpośredniego użycia w Twojej aplikacji.

Zwróć uwagę na to, jak Gemini radzi sobie z kompromisami. „The Downtowner” ma bardzo dużo parków, ale Gemini uznaje opis „głośno w weekendy” za duży minus dla małego dziecka. Z kolei „Suburban Oasis” uzyskał niemal idealny wynik, ponieważ łączy doskonałą gęstość udogodnień z odpowiednimi cechami jakościowymi, takimi jak „cicha ulica z drzewami”.

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

Ta metoda umożliwia dostarczanie wysoce spersonalizowanych wyników, które są zrozumiałe i dostosowane do każdego użytkownika.

4. Wizualizacja wyników na mapie

BigQuery Studio zawiera zintegrowaną wizualizację mapy dla każdego wyniku zapytania, który zawiera kolumnę GEOGRAPHY. Ponieważ zapytanie zwraca kolumnę location, możesz od razu wizualizować wyniki.

Kliknięcie karty Visualization spowoduje wyświetlenie mapy, a menu Data Column umożliwia kontrolowanie wyniku lokalizacji, który ma być wizualizowany. W tym przykładzie normalized_pet_score jest wizualizowany na podstawie przykładu opcji 1. Zwróć uwagę, że w tym przykładzie do tabeli apartment_listings dodano więcej lokalizacji.

Mapa przedstawiająca znormalizowany wynik dotyczący zwierząt w różnych lokalizacjach. Ciemniejsze zielone kropki oznaczają wyższe, bardziej korzystne wyniki.

Wizualizacja danych pozwala na pierwszy rzut oka określić najbardziej odpowiednie lokalizacje dla utworzonego wyniku. Ciemniejsze zielone kółka oznaczają lokalizacje o wyższym wskaźniku normalized_pet_score w tym przypadku. Więcej opcji wizualizacji danych Statystyk Miejsc znajdziesz w artykule Wizualizacja wyników zapytania.

Podsumowanie

Masz teraz do dyspozycji skuteczną i powtarzalną metodę tworzenia szczegółowych wyników lokalizacji. Na podstawie lokalizacji utworzono w BigQuery jedno zapytanie SQL, które wyszukuje pobliskie miejsca z ST_DWITHIN, filtruje je według zaawansowanych atrybutów, takich jak good_for_childrenallows_dogs, oraz agreguje wyniki za pomocą funkcji COUNTIF. Dzięki zastosowaniu niestandardowych wag i normalizacji wyniku udało Ci się uzyskać jeden, łatwy w użyciu wynik, który dostarcza szczegółowych i przydatnych informacji. Możesz bezpośrednio zastosować ten wzorzec, aby przekształcić surowe dane o lokalizacji w znaczącą przewagę konkurencyjną.

Następne działania

Teraz Twoja kolej na budowanie. Ten samouczek zawiera szablon. Możesz używać bogatych danych dostępnych w schemacie Statystyk miejsc, aby tworzyć wyniki, które są najbardziej potrzebne w Twoim przypadku użycia. Możesz też utworzyć inne oceny:

  • „Ocena życia nocnego”: połącz filtry primary_type (bar,night_club), price_level i godziny otwarcia w nocy, aby znaleźć najbardziej tętniące życiem miejsca po zmroku.
  • „Ocena fitnessu i dobrego samopoczucia”: zlicz pobliskie gyms, parkshealth_food_stores oraz filtruj restauracje pod kątem tych, które mają serves_vegetarian_food, aby oceniać lokalizacje pod kątem użytkowników dbających o zdrowie.
  • „Ocena dla dojeżdżających do pracy”: znajdź miejsca z dużą liczbą pobliskich miejsc transit_stationparking, aby pomóc użytkownikom, którzy cenią sobie dostęp do transportu.

Współtwórcy

Henrik Valve | Inżynier DevX