Ringkasan
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

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.

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.

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.

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.

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, danhealth_food_storesdi sekitar, serta memfilter restoran yang memilikiserves_vegetarian_fooduntuk memberi skor lokasi bagi pengguna yang peduli kesehatan. - "Skor Impian Komuter": Temukan lokasi dengan kepadatan tinggi tempat
transit_stationdanparkingdi sekitar untuk membantu pengguna yang menghargai akses ke transportasi.
Kontributor
Henrik Valve | DevX Engineer