Tworzenie niestandardowych wyników lokalizacji za pomocą Places Insights

Przegląd

Ogłoszenie nieruchomości z niestandardowym wynikiem 9,1 w skali „Raj dla właścicieli zwierząt”, który jest obliczany na podstawie 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 informacje. Udostępniamy też opcję korzystania z generatywnej AI w BigQuery, która jest skutecznym 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ą tworzyć „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 wartościowych potencjalnych klientów 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 Statystyk 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 etapó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, aby ocenić je 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ę ofert mieszkań z identyfikatorem, nazwą i współrzędnymi lokalizacji.

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

Po ustaleniu lokalizacji następnym krokiem jest znalezienie, filtrowanie i zliczanie 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ą wyraźnie odpowiednie dla dzieci.
  • W przypadku „oceny dla miłośników 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 wartości 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żywanie własnych obliczeń niestandardowych w BigQuery lub korzystanie z funkcji generatywnej sztucznej inteligencji (AI) w BigQuery.

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

Surowe dane z poprzedniego kroku są przydatne, ale celem jest uzyskanie jednego, łatwego w użyciu 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 Zapytanie poniżej używa 2 zapytań CTE (Common Table Expression): pierwsze oblicza surowe liczby tak jak wcześniej, a drugie oblicza ważone wyniki. Ostateczne SELECT przeprowadza normalizację min-max ważonych wyników. Kolumna location tabeli przykładowejapartment_listings jest eksportowana, 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 zawierają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 jasno pokazuje, jak każda lokalizacja wypada 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 surowym, co czyni ją punktem odniesienia do porównania. Nie oznacza to, że w danej 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żywanie funkcji AI.GENERATE (Gemini)

Zamiast korzystać ze stałego wzoru matematycznego, możesz użyć funkcji AI.GENERATE BigQuery, aby obliczać niestandardowe wyniki lokalizacji bezpośrednio w przepływie pracy SQL.

Sposób 1 doskonale sprawdza się w przypadku czysto ilościowej oceny na podstawie liczby udogodnień, ale nie uwzględnia danych jakościowych. Funkcja AI.GENERATE umożliwia łączenie liczb z zapytania Places Insights z nieustrukturyzowanymi danymi, takimi jak tekstowy opis oferty mieszkania (np. „Ta lokalizacja jest odpowiednia dla rodzin, a w nocy jest tu cicho”) lub konkretne preferencje profilu użytkownika (np. „Ten użytkownik rezerwuje pobyt dla rodziny i woli cichą okolicę w centralnej lokalizacji”). Pozwala to wygenerować bardziej zniuansowany wynik, który wykrywa subtelności, które mogą umknąć ścisłemu zliczaniu, np. lokalizację o dużej gęstości udogodnień, ale opisaną jako „zbyt głośną dla dzieci”.

Tworzenie prompta

Aby użyć tej funkcji, wyniki agregacji (z kroku 2) są formatowane w prompt w języku naturalnym. Można to zrobić dynamicznie w SQL, łącząc kolumny danych z instrukcjami dla modelu.

W zapytaniu poniżej insight_counts są łączone z opisem tekstowym mieszkania, aby utworzyć prompt dla każdego wiersza. Określony jest też profil użytkownika docelowego, który pomaga w ocenie.

Generowanie wyniku za pomocą SQL

Poniższe zapytanie wykonuje całą operację w BigQuery. Oto one:

  1. Agreguje liczbę miejsc (zgodnie z opisem w kroku 2).
  2. Tworzy prompt dla każdej lokalizacji.
  3. Wywołuje funkcję AI.GENERATE, aby przeanalizować prompta za pomocą modelu Gemini.
  4. Analizuje wynik i przekształca go w uporządkowany format gotowy do użycia w Twojej aplikacji.
WITH
  -- CTE 1: Aggregate Place counts (Same as Step 2)
  insight_counts AS (
    SELECT WITH AGGREGATION_THRESHOLD
      apartments.id,
      apartments.name,
      apartments.description, -- Assuming your table has a description column
      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
    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, apartments.description
  ),

  -- CTE 2: Construct the Prompt
  prepared_prompts AS (
    SELECT
      id,
      name,
      FORMAT("""
        You are an expert real estate analyst. Generate a 'Family-Friendliness Score' (0-10) for this location.

        Target User: Young family with a toddler, looking for a balance of activity and quiet.

        Location Data:
        - Name: %s
        - Description: %s
        - Parks nearby: %d
        - Museums nearby: %d
        - Family-friendly restaurants nearby: %d

        Scoring Rules:
        - High importance: Proximity to parks and high restaurant count.
        - Negative modifiers: Descriptions indicating excessive noise or nightlife focus.
        - Positive modifiers: Descriptions indicating quiet streets or backyards.
      """, name, description, park_count, museum_count, family_restaurant_count) AS prompt_text
    FROM insight_counts
    )

-- Final Step: Call AI.GENERATE
SELECT
  id,
  name,
  -- Access the structured fields returned by the model
  generated.family_friendliness_score,
  generated.reasoning
FROM
  prepared_prompts,
  AI.GENERATE(
    prompt_text,
    endpoint => 'gemini-flash-latest',
    output_schema => 'family_friendliness_score FLOAT64, reasoning STRING'
  ) AS generated;
Informacje o konfiguracji
  • Świadomość kosztów: ta funkcja przekazuje dane wejściowe do modelu Gemini i za każdym razem, gdy jest wywoływana, generuje opłaty w Vertex AI. Jeśli analizowana jest duża liczba lokalizacji (np. tysiące ofert mieszkań), zalecamy najpierw odfiltrować zbiór danych, aby wybrać najbardziej odpowiednie kandydatury. Więcej informacji o minimalizowaniu kosztów znajdziesz w sekcji Sprawdzone metody.
  • endpoint: w tym przykładzie określono gemini-flash-latest, aby nadać priorytet szybkości i opłacalności. Możesz jednak wybrać model, który najlepiej odpowiada Twoim potrzebom. W dokumentacji modeli Gemini znajdziesz informacje o eksperymentowaniu z różnymi wersjami (np. Gemini Pro do bardziej złożonych zadań wymagających rozumowania) i wybierz najlepszy model do swojego przypadku użycia.
  • output_schema: zamiast analizować zwykły tekst, wymuszana jest struktura (FLOAT64 w przypadku wyniku i STRING w przypadku uzasadnienia). Dzięki temu dane wyjściowe są od razu gotowe do użycia w aplikacji lub narzędziach do wizualizacji bez konieczności przetwarzania końcowego.
Przykładowe dane wyjściowe

Zapytanie zwraca standardową tabelę BigQuery z niestandardowym wynikiem i uzasadnieniem modelu.

id nazwa family_friendliness_score rozumowanie,
1 The Downtowner 5,5 Wysoka liczba udogodnień (parki, restauracje) spełniająca kryteria ilościowe. Dane jakościowe wskazują jednak na nadmierny hałas w weekendy i duże natężenie życia nocnego, co jest sprzeczne z potrzebą ciszy u docelowego użytkownika.
2 Suburban Oasis 9.8 Wyjątkowe dane ilościowe połączone z opisem („cicha, wysadzana drzewami ulica”), który idealnie pasuje do profilu rodziny docelowej. Wysokie modyfikatory pozytywne dają niemal idealny wynik.

Ta procedura umożliwia dostarczanie wysoce spersonalizowanych wyników, które są zrozumiałe i dopasowane do każdego użytkownika, a wszystko to w ramach jednego zapytania SQL.

4. Wizualizacja wyników na mapie

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

Kliknięcie karty Visualization spowoduje wyświetlenie mapy, a menu Data Column umożliwi wizualizację wyniku lokalizacji. 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, korzystniejsze 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 Places Insights 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 znormalizowaniu 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żyć bogatych danych dostępnych w schemacie Places Insights, aby utworzyć 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”: zliczanie pobliskich gyms, parkshealth_food_stores oraz filtrowanie restauracji 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, dla których ważny jest dostęp do transportu.

Współtwórcy

Henrik Valve | Inżynier DevX