Membuat Skor Lokasi Kustom dengan Insight Tempat

Ringkasan

Listingan properti yang menampilkan Skor Surga Pemilik Hewan Peliharaan khusus sebesar 9,1, berdasarkan taman di sekitar dan tempat yang ramah.

Data lokasi standar dapat memberi tahu Anda apa yang ada di sekitar, tetapi sering kali gagal menjawab pertanyaan yang lebih penting: "Seberapa bagus area ini bagi saya?" Kebutuhan pengguna Anda sangat beragam. Keluarga dengan anak kecil memiliki prioritas yang berbeda dibandingkan dengan profesional muda yang memiliki. Untuk membantu mereka membuat keputusan yang tepat, Anda perlu memberikan insight yang mencerminkan kebutuhan spesifik ini. Skor lokasi kustom adalah alat yang efektif untuk memberikan nilai ini dan menciptakan pengalaman pengguna yang berbeda secara signifikan.

Dokumen ini menjelaskan cara membuat skor lokasi multifaset kustom menggunakan set data Insight Tempat di BigQuery. Dengan mengubah data POI menjadi metrik yang bermakna, Anda dapat memperkaya aplikasi real estate, retail, atau perjalanan dan memberikan informasi relevan yang dibutuhkan pengguna. Kami juga menyediakan opsi untuk menggunakan Gemini Developer API sebagai cara yang efektif untuk menghitung skor lokasi Anda.

Mendorong Nilai Bisnis dengan Skor yang Disesuaikan

Contoh berikut mengilustrasikan cara menerjemahkan data lokasi mentah menjadi metrik yang efektif dan berfokus pada pengguna untuk meningkatkan kualitas aplikasi Anda.

  • Developer Real Estate dapat membuat "Skor Ramah Keluarga" atau "Skor Impian Komuter" untuk membantu pembeli dan penyewa memilih lingkungan yang sempurna dan sesuai dengan gaya hidup mereka, sehingga meningkatkan engagement pengguna, prospek yang berkualitas lebih tinggi, dan konversi yang lebih cepat.
  • Travel & Hospitality Engineers dapat membuat "Skor Kehidupan Malam" atau "Skor Surga Wisatawan" untuk membantu wisatawan memilih hotel yang sesuai dengan gaya liburan mereka, sehingga meningkatkan rasio pemesanan dan kepuasan pelanggan
  • Analis Retail dapat membuat "Skor Kebugaran & Kesehatan" untuk mengidentifikasi lokasi optimal bagi pusat kebugaran atau toko makanan sehat baru berdasarkan bisnis pelengkap di sekitar, sehingga memaksimalkan potensi untuk menargetkan demografi pengguna yang tepat.

Dalam panduan ini, Anda akan mempelajari metodologi tiga bagian yang fleksibel untuk membuat skor lokasi kustom apa pun menggunakan data Places langsung di BigQuery. Kita akan menggambarkan pola ini dengan membuat dua contoh skor yang berbeda: Skor Ramah Keluarga dan Skor Surga Pemilik Hewan Peliharaan. Dengan pendekatan ini, Anda dapat melampaui jumlah tempat dan memanfaatkan atribut yang kaya dan mendetail dalam set data Insight Tempat. Anda dapat menggunakan informasi seperti jam buka, apakah suatu tempat cocok untuk anak-anak, atau apakah diperbolehkan, untuk membuat metrik yang canggih dan bermakna bagi pengguna Anda.

Alur Kerja Solusi

Diagram alur kerja tiga langkah: tetapkan lokasi, kueri tempat terdekat, dan normalisasi hasil untuk membuat skor akhir.

Tutorial ini menggunakan satu kueri SQL yang canggih untuk membuat skor kustom yang dapat Anda sesuaikan dengan kasus penggunaan apa pun. Kita akan membahas proses ini dengan membuat dua contoh skor untuk kumpulan listingan apartemen hipotetis.

Prasyarat

Sebelum memulai, ikuti petunjuk ini untuk menyiapkan Insight Tempat.

1. Membangun Fondasi: Lokasi Minat Anda

Sebelum dapat membuat skor, Anda memerlukan daftar lokasi yang ingin dianalisis. Langkah pertama adalah memastikan data ini ada sebagai tabel di BigQuery. Kuncinya adalah memiliki ID unik untuk setiap lokasi dan kolom GEOGRAPHY yang menyimpan koordinatnya.

Anda dapat membuat dan mengisi tabel lokasi untuk diberi skor dengan kueri seperti ini:

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

Melakukan SELECT * pada data lokasi Anda akan terlihat seperti ini.

Hasil kueri BigQuery yang menampilkan tabel listingan apartemen dengan ID, nama, dan koordinat lokasi.

2. Mengembangkan Logika Inti: Kueri Pemberian Skor

Setelah lokasi Anda ditetapkan, langkah selanjutnya adalah menemukan, memfilter, dan menghitung tempat terdekat yang relevan dengan skor kustom Anda. Semua ini dilakukan dalam satu pernyataan SELECT.

Menemukan Apa yang Ada di Sekitar dengan Penelusuran Geospasial

Pertama, Anda perlu menemukan semua tempat dari set data Insight Tempat yang berada dalam jarak tertentu dari setiap lokasi Anda. Fungsi BigQuery ST_DWITHIN sangat cocok untuk tugas ini. Kita akan melakukan JOIN antara tabel apartment_listings dan tabel places_insights untuk menemukan semua tempat dalam radius 800 meter. LEFT JOIN memastikan semua lokasi asli Anda disertakan dalam hasil, meskipun tidak ada tempat yang cocok di sekitar.

Filter untuk Relevansi dengan Atribut Lanjutan

Di sinilah Anda menerjemahkan konsep abstrak skor menjadi filter data konkret. Untuk dua contoh skor kami, kriteria yang digunakan berbeda:

  • Untuk "Skor Ramah Keluarga", kami memperhatikan taman, museum, dan restoran yang secara eksplisit bagus untuk anak-anak.
  • Untuk "Skor Surga Pemilik Hewan Peliharaan", kami memperhatikan taman, klinik hewan, toko hewan peliharaan, dan restoran atau kafe yang mengizinkan.

Anda dapat memfilter atribut tertentu ini langsung dalam klausa WHERE dari kueri Anda.

Menggabungkan Insight untuk Setiap Lokasi

Terakhir, Anda perlu menghitung berapa banyak tempat yang relevan yang Anda temukan untuk setiap apartemen. Klausul GROUP BY menggabungkan hasil, dan fungsi COUNTIF menghitung tempat yang cocok dengan kriteria tertentu untuk setiap skor kami.

Kueri di bawah menggabungkan ketiga langkah ini, menghitung jumlah mentah untuk kedua skor dalam satu proses:

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

Hasil kueri ini akan mirip dengan ini.

Hasil BigQuery yang menampilkan jumlah mentah fasilitas seperti taman, restoran, dan layanan hewan peliharaan untuk setiap listingan apartemen.

Kita akan membahas hasil ini lebih lanjut di bagian berikutnya.

3. Membuat Skor

Setelah memiliki jumlah tempat dan pembobotan untuk setiap jenis tempat di setiap lokasi, Anda kini dapat membuat skor lokasi kustom. Kita akan membahas dua opsi di bagian ini: menggunakan penghitungan kustom Anda sendiri di BigQuery atau menggunakan Gemini Developer API.

Opsi 1: Menggunakan penghitungan kustom Anda sendiri di BigQuery

Jumlah mentah dari langkah sebelumnya memberikan insight, tetapi tujuannya adalah satu skor yang mudah digunakan. Langkah terakhir adalah menggabungkan jumlah ini menggunakan bobot, lalu menormalisasi hasilnya ke skala 0-10.

Menerapkan Bobot Kustom Memilih bobot adalah seni dan sains. Hal ini harus mencerminkan prioritas bisnis Anda atau apa yang menurut Anda paling penting bagi pengguna. Untuk Skor "Kesesuaian keluarga", Anda dapat memutuskan bahwa taman dua kali lebih penting daripada museum. Mulai dengan asumsi terbaik Anda dan lakukan iterasi berdasarkan masukan pengguna kami.

Menormalisasi Skor Kueri di bawah menggunakan dua Ekspresi Tabel Umum (CTE): yang pertama menghitung jumlah mentah seperti sebelumnya, dan yang kedua menghitung skor berbobot. Pernyataan SELECT akhir kemudian melakukan normalisasi min-maks pada skor berbobot. Kolom location dari contoh tabel apartment_listings ditampilkan, untuk mengaktifkan visualisasi data di peta.

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;

Hasil kueri akan mirip dengan di bawah ini. Dua kolom terakhir adalah skor yang dinormalisasi.

Hasil kueri akhir yang menampilkan skor berbobot mentah dan skor 0-10 yang dinormalisasi untuk setiap listingan apartemen.

Memahami Skor yang Dinormalisasi

Penting untuk memahami mengapa langkah normalisasi akhir ini sangat berharga. Skor berbobot mentah dapat berkisar dari 0 hingga angka yang berpotensi sangat besar, bergantung pada kepadatan perkotaan di lokasi Anda. Skor 500 tidak berarti bagi pengguna tanpa konteks.

Normalisasi mengubah angka abstrak ini menjadi peringkat relatif. Dengan menskalakan hasil dari 0 hingga 10, skor mengomunikasikan dengan jelas perbandingan setiap lokasi dengan lokasi lain dalam set data spesifik Anda:

  • Skor 10 ditetapkan ke lokasi dengan skor mentah tertinggi, menandainya sebagai opsi terbaik dalam set saat ini.
  • Skor 0 diberikan ke lokasi dengan skor mentah terendah, sehingga menjadi dasar perbandingan. Hal ini tidak berarti lokasi tersebut tidak memiliki fasilitas, tetapi merupakan lokasi yang paling tidak sesuai dibandingkan dengan opsi lain yang sedang dievaluasi.
  • Semua skor lainnya berada di antara kedua skor tersebut secara proporsional, sehingga memberikan cara yang jelas dan intuitif bagi pengguna untuk membandingkan opsi mereka secara sekilas.

Opsi 2: Menggunakan Gemini Developer API

Sebagai alternatif untuk menggunakan formula matematika tetap di BigQuery, Gemini Developer API menawarkan cara yang efektif untuk menghitung skor lokasi kustom yang bernuansa.

Meskipun Opsi 1 sangat baik untuk pemberian skor kuantitatif murni berdasarkan jumlah fasilitas, opsi ini tidak dapat dengan mudah memperhitungkan data kualitatif. Dengan menggunakan Gemini, Anda dapat menggabungkan angka dari kueri Places Insights dengan data tidak terstruktur, seperti deskripsi teks listingan apartemen (misalnya, "Lokasi ini cocok untuk keluarga dan area ini tenang pada malam hari") atau preferensi profil pengguna tertentu (misalnya, "Pengguna ini memesan untuk keluarga dan lebih memilih area yang tenang di lokasi pusat"), untuk menghasilkan skor yang lebih bernuansa.

Menyiapkan data untuk Gemini

Untuk menggunakan metode ini, ubah hasil agregasi BigQuery Anda (dari Langkah 2) ke dalam format Markdown dan gabungkan dengan data kualitatif Anda, seperti Listing Description.

Dalam contoh ini, kita memiliki dua listingan dengan karakteristik yang sangat berbeda. Kami juga menyertakan Target User Profile untuk memberi tahu Gemini siapa yang kami beri skor untuk permintaan ini:

## 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.
Petunjuk sistem

Gemini memerlukan petunjuk sistem untuk mengetahui cara mempertimbangkan berbagai titik data ini. Anda dapat secara eksplisit memberi tahu model seberapa penting fasilitas tertentu, sekaligus menginstruksikannya untuk memperhitungkan sentimen deskripsi teks.

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.
Output terstruktur

Untuk memastikan keandalan saat mengintegrasikan AI ke dalam aplikasi, Anda tidak boleh hanya mengandalkan perintah untuk format output. Sebagai gantinya, gunakan fitur output terstruktur Gemini. Dengan memberikan responseSchema, Anda menjamin bahwa model akan menampilkan array JSON yang bersih dan dapat diuraikan yang sesuai dengan persyaratan sistem Anda.

Untuk contoh kita, kita dapat menerapkan skema berikut:

{
  "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"
      }
    }
  }
}
Contoh output

Saat Anda mengirim perintah dengan responseSchema yang ditentukan, Gemini akan menampilkan array JSON terstruktur yang siap digunakan langsung oleh aplikasi Anda.

Perhatikan di output bagaimana Gemini menangani konsekuensi. "The Downtowner" memiliki jumlah taman yang sangat tinggi, tetapi Gemini mengidentifikasi deskripsi "bising di akhir pekan" sebagai hal negatif utama bagi balita. Sementara itu, "Suburban Oasis" mendapat skor hampir sempurna dengan menggabungkan kepadatan fasilitas yang sangat baik dengan fitur kualitatif yang berlaku seperti "jalan yang tenang dan rimbun".

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

Dengan metode ini, Anda dapat memberikan pemberian skor yang sangat dipersonalisasi, yang terasa mudah dipahami dan disesuaikan untuk setiap pengguna.

4. Memvisualisasikan skor Anda di peta

BigQuery Studio menyertakan visualisasi peta terintegrasi untuk hasil kueri apa pun yang berisi kolom GEOGRAPHY. Karena kueri kita menghasilkan kolom location, Anda dapat langsung memvisualisasikan skor.

Mengklik tab Visualization akan menampilkan peta, dan drop-down Data Column mengontrol skor lokasi yang akan divisualisasikan. Dalam contoh ini, normalized_pet_score divisualisasikan dari contoh Opsi 1. Perhatikan bahwa lebih banyak lokasi ditambahkan ke tabel apartment_listings, untuk contoh ini.

Peta yang memvisualisasikan skor hewan peliharaan yang dinormalisasi untuk berbagai lokasi, dengan titik hijau yang lebih gelap menunjukkan skor yang lebih tinggi dan lebih baik.

Visualisasi data akan menunjukkan sekilas lokasi yang paling sesuai untuk skor yang dibuat, dengan lingkaran hijau yang lebih gelap mewakili lokasi dengan normalized_pet_score yang lebih tinggi, dalam hal ini. Untuk opsi visualisasi data Places Insights lebih lanjut, lihat Memvisualisasikan hasil kueri.

Kesimpulan

Sekarang Anda memiliki metodologi yang efektif dan dapat diulang untuk membuat skor lokasi yang bernuansa. Dengan memulai dari lokasi Anda, Anda membuat satu kueri SQL di BigQuery yang menemukan tempat terdekat dengan ST_DWITHIN, memfilternya menurut atribut lanjutan seperti good_for_children dan allows_dogs, serta menggabungkan hasilnya dengan COUNTIF. Dengan menerapkan bobot kustom dan menormalisasi hasilnya, Anda menghasilkan skor tunggal yang mudah digunakan dan memberikan insight mendalam yang dapat ditindaklanjuti. Anda dapat menerapkan pola ini secara langsung untuk mengubah data lokasi mentah menjadi keunggulan kompetitif yang signifikan.

Tindakan Berikutnya

Sekarang giliran Anda untuk membangun. Tutorial ini menyediakan template. Anda dapat menggunakan data lengkap yang tersedia dalam skema Insight Tempat untuk membuat skor yang paling diperlukan untuk kasus penggunaan Anda. Pertimbangkan skor lainnya yang dapat Anda bangun:

  • "Skor Kehidupan Malam": Gabungkan filter untuk primary_type (bar, night_club), price_level, dan jam buka larut malam untuk menemukan area paling ramai setelah hari gelap.
  • "Skor Kebugaran & Kesehatan": Menghitung jumlah gyms, parks, dan health_food_stores di sekitar, serta memfilter restoran yang memiliki serves_vegetarian_food untuk memberi skor lokasi bagi pengguna yang peduli kesehatan.
  • "Skor Impian Komuter": Temukan lokasi dengan kepadatan tinggi tempat transit_station dan parking di sekitar untuk membantu pengguna yang menghargai akses ke transportasi.

Kontributor

Henrik Valve | DevX Engineer