Genel Bakış
Standart konum verileri yakında neler olduğunu söyleyebilir ancak genellikle daha önemli olan "Bu bölge benim için ne kadar uygun?" sorusunu yanıtlayamaz. Kullanıcılarınızın ihtiyaçları farklılık gösterir. Küçük çocukları olan bir aile ile köpeği olan genç bir profesyonelin öncelikleri farklıdır. Kullanıcıların güvenle karar vermesine yardımcı olmak için bu özel ihtiyaçları yansıtan analizler sağlamanız gerekir. Özel konum puanı, bu değeri sunmak ve önemli ölçüde farklılaşan bir kullanıcı deneyimi oluşturmak için güçlü bir araçtır.
Bu belgede, BigQuery'deki Places Insights veri kümesini kullanarak özel, çok yönlü konum puanlarının nasıl oluşturulacağı açıklanmaktadır. Önemli yer verilerini anlamlı metriklere dönüştürerek gayrimenkul, perakende veya seyahat uygulamalarınızı zenginleştirebilir ve kullanıcılarınıza ihtiyaç duydukları alakalı bilgileri sağlayabilirsiniz. Ayrıca, konum puanlarınızı hesaplamak için güçlü bir yöntem olarak Gemini Developer API'yi kullanma seçeneği de sunuyoruz.
Özelleştirilmiş puanlarla işletme değerini artırma
Aşağıdaki örneklerde, uygulamanızı geliştirmek için ham konum verilerini nasıl güçlü ve kullanıcı odaklı metriklere dönüştürebileceğiniz gösterilmektedir.
- Gayrimenkul geliştiriciler, alıcıların ve kiracıların yaşam tarzlarına uygun mükemmel mahalleyi seçmelerine yardımcı olmak için "Aile Dostu Puanı" veya "İş Yolu Puanı" oluşturabilir. Bu sayede kullanıcı etkileşimi artar, daha kaliteli potansiyel müşteriler elde edilir ve dönüşümler daha hızlı gerçekleşir.
- Seyahat ve konaklama mühendisleri, gezginlerin tatil tarzlarına uygun bir otel seçmelerine yardımcı olmak için "Gece Hayatı Puanı" veya "Gezgin Cenneti Puanı" oluşturabilir. Bu sayede rezervasyon oranları ve müşteri memnuniyeti artırılabilir.
- Perakende analistleri, yakındaki tamamlayıcı işletmelere göre yeni bir spor salonu veya sağlıklı gıda mağazası için en uygun konumu belirlemek amacıyla "Fitness ve Sağlık Puanı" oluşturabilir. Bu sayede doğru kullanıcı demografisini hedefleme potansiyeli en üst düzeye çıkarılır.
Bu kılavuzda, doğrudan BigQuery'de Places verilerini kullanarak her türlü özel konum puanını oluşturmaya yönelik esnek ve üç bölümlü bir metodoloji öğreneceksiniz. Bu kalıbı, iki farklı örnek puan oluşturarak açıklayacağız: Aile Dostu Puanı ve Evcil Hayvan Sahipleri İçin Cennet Puanı. Bu yaklaşım, yer sayılarının ötesine geçmenize ve Yer Analizleri veri kümesindeki zengin ve ayrıntılı özelliklerden yararlanmanıza olanak tanır. Kullanıcılarınız için gelişmiş ve anlamlı metrikler oluşturmak üzere çalışma saatleri, bir yerin çocuklar için uygun olup olmadığı veya köpeklerin kabul edilip edilmediği gibi bilgileri kullanabilirsiniz.
Çözüm İş Akışı

Bu eğitimde, herhangi bir kullanım alanına uyarlayabileceğiniz özel bir puan oluşturmak için tek ve güçlü bir SQL sorgusu kullanılır. Varsayımsal bir apartman listeleri grubu için iki örnek puanımızı oluşturarak bu süreci adım adım inceleyeceğiz.
Ön koşullar
Başlamadan önce Yerler Analizleri'ni ayarlamak için bu talimatları uygulayın.
1. Temel oluşturma: İlgilenilen konumlarınız
Puan oluşturabilmek için analiz etmek istediğiniz konumların listesi gerekir. İlk adım, bu verilerin BigQuery'de tablo olarak bulunduğundan emin olmaktır.
Önemli olan, her konum için benzersiz bir tanımlayıcıya ve koordinatlarını depolayan bir GEOGRAPHYsütuna sahip olmaktır.
Aşağıdaki gibi bir sorguyla puanlanacak konumların tablosunu oluşturup doldurabilirsiniz:
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
. . . ;
Konum verilerinizde SELECT * işlemi yapıldığında sonuç buna benzer görünür.

2. Temel mantığı geliştirme: Puanlama sorgusu
Konumlarınız belirlendikten sonraki adım, özel puanınızla alakalı yakındaki yerleri bulmak, filtrelemek ve saymaktır. Bu işlemlerin tümü tek bir SELECT ifadesi içinde yapılır.
Coğrafi arama ile yakındaki yerleri bulma
Öncelikle, Places Insights veri kümesindeki tüm yerleri, konumlarınızın her birine belirli bir mesafede olacak şekilde bulmanız gerekir. Bu işlem için BigQuery işlevi
ST_DWITHIN idealdir. 800 metre yarıçapındaki tüm yerleri bulmak için JOIN tablomuz ile apartment_listings tablosu arasında places_insights işlemi yapacağız. LEFT JOIN, yakında eşleşen yerler bulunmasa bile tüm orijinal konumlarınızın sonuçlara dahil edilmesini sağlar.
Gelişmiş özelliklerle alaka düzeyine göre filtreleme
Burada, soyut bir puan kavramını somut veri filtrelerine dönüştürürsünüz. İki örnek puanımız için ölçütler farklıdır:
- "Aile Dostu Puanı" için çocuklara uygun parklar, müzeler ve restoranlar önemlidir.
- "Evcil hayvan sahipleri için cennet puanı" için parklar, veteriner klinikleri, evcil hayvan mağazaları ve köpeklere izin veren restoran veya kafeler önemlidir.
Bu özellikleri doğrudan sorgunuzun WHERE ifadesinde filtreleyebilirsiniz.
Her Konum İçin Analizleri Toplama
Son olarak, her daire için kaç tane alakalı yer bulduğunuzu saymanız gerekir. GROUP BY ifadesi sonuçları toplar ve COUNTIF işlevi, puanlarımızın her biri için belirli ölçütlerle eşleşen yerleri sayar.
Aşağıdaki sorgu bu üç adımı birleştirerek her iki puanın ham sayılarını tek bir geçişte hesaplar:
-- 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;
Bu sorgunun sonucu aşağıdaki gibi olur.

Bu sonuçları bir sonraki bölümde kullanacağız.
3. Puanı oluşturma
Artık her konum için yer sayısını ve her yer türü için ağırlıklandırmayı bildiğinize göre özel konum puanını oluşturabilirsiniz. Bu bölümde iki seçeneği ele alacağız: BigQuery'de kendi özel hesaplamanızı kullanma veya Gemini Developer API'yi kullanma.
1. seçenek: BigQuery'de kendi özel hesaplamanızı kullanma
Önceki adımdaki ham sayılar faydalı bilgiler sunar ancak hedef, tek bir kullanıcı dostu puan elde etmektir. Son adım, bu sayıları ağırlıklar kullanarak birleştirmek ve sonucu 0-10 ölçeğinde normalleştirmektir.
Özel Ağırlıklar Uygulama Ağırlıklarınızı seçmek hem sanat hem de bilimdir. Bu hedefler, işletme önceliklerinizi veya kullanıcılarınız için en önemli olduğunu düşündüğünüz şeyleri yansıtmalıdır. "Aile dostu" puanı için bir parkın müzeden iki kat daha önemli olduğuna karar verebilirsiniz. En iyi varsayımlarınızla başlayın ve kullanıcı geri bildirimlerimize göre yineleyin.
Puanı Normalleştirme Aşağıdaki sorguda iki Ortak Tablo İfadesi (CTE) kullanılmaktadır: Birincisi, ham sayıları daha önce olduğu gibi hesaplar, ikincisi ise ağırlıklı puanları hesaplar. Son SELECT ifadesi, ağırlıklı puanlarda min-maks normalleştirme gerçekleştirir. Haritada veri görselleştirmeyi etkinleştirmek için örnek location tablosunun apartment_listings sütunu çıkış olarak verilir.
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;
Sorgunun sonuçları aşağıdakine benzer olacaktır. Son iki sütun, normalleştirilmiş puanlardır.

Normalleştirilmiş puanı anlama
Bu son normalleştirme adımının neden bu kadar değerli olduğunu anlamak önemlidir.
Ağırlıklı ham puanlar, konumlarınızın kentsel yoğunluğuna bağlı olarak 0 ile çok büyük bir sayı arasında değişebilir. 500 puanı, bağlamı olmayan bir kullanıcı için anlamsızdır.
Normalleştirme, bu soyut sayıları göreceli bir sıralamaya dönüştürür. Sonuçlar 0 ile 10 arasında ölçeklendirilerek puan, her konumun belirli veri kümenizdeki diğer konumlarla nasıl karşılaştırıldığını net bir şekilde gösterir:
- En yüksek ham puana sahip konuma 10 puan atanır ve bu konum, mevcut gruptaki en iyi seçenek olarak işaretlenir.
- En düşük ham puana sahip konuma 0 puan atanır. Bu konum, karşılaştırma için temel alınır. Bu, konumda hiç olanak olmadığı anlamına gelmez. Bunun yerine, değerlendirilen diğer seçeneklere kıyasla en az uygun olan seçenektir.
- Diğer tüm puanlar orantılı olarak bu iki puan arasında yer alır. Böylece kullanıcılarınız, seçeneklerini bir bakışta karşılaştırmak için net ve sezgisel bir yöntem kullanabilir.
2. seçenek: Gemini Developer API'yi kullanma
BigQuery'de sabit bir matematiksel formül kullanmaya alternatif olarak Gemini Developer API, ayrıntılı özel konum puanları hesaplamak için güçlü bir yöntem sunar.
1. seçenek, tamamen olanak sayısına dayalı nicel puanlama için mükemmel olsa da nitel verileri kolayca hesaba katamaz. Gemini'ı kullanarak Places Insights sorgunuzdaki sayıları, apartman listelemesinin metin açıklaması gibi yapılandırılmamış verilerle birleştirebilirsiniz (ör. "Bu konum aileler için uygundur ve gece saatlerinde sessizdir") veya belirli kullanıcı profili tercihlerine (ör. "Bu kullanıcı, ailesi için rezervasyon yapıyor ve merkezi bir konumda sessiz bir bölgeyi tercih ediyor") gibi daha ayrıntılı bir puan oluşturmak için kullanılır.
Verileri Gemini için hazırlama
Bu yöntemi kullanmak için BigQuery toplama işleminizin sonuçlarını (2. adım) Markdown biçimine dönüştürün ve Listing Description gibi nitel verilerinizle birleştirin.
Bu örnekte, özellikleri birbirinden çok farklı iki giriş var. Ayrıca, Gemini'a bu puanları kimin için verdiğimizi bildirmek üzere Target User Profile ekliyoruz:
## 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.
Sistem talimatları
Gemini, bu farklı veri noktalarını nasıl değerlendireceğini bilmek için sistem talimatlarına ihtiyaç duyar. Modele belirli olanakların ne kadar önemli olduğunu açıkça söyleyebilir, aynı zamanda metin açıklamalarının duygusunu dikkate almasını da isteyebilirsiniz.
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.
Yapılandırılmış çıkış
Yapay zekayı uygulamanıza entegre ederken güvenilirliği sağlamak için çıkış biçimi konusunda yalnızca istemlere güvenmemelisiniz. Bunun yerine Gemini'ın yapılandırılmış
çıktı özelliğini kullanın. responseSchema sağlayarak modelin, tam sistem gereksinimlerinize uygun temiz ve ayrıştırılabilir bir JSON dizisi döndürmesini garanti edersiniz.
Örneğimizde aşağıdaki şemayı zorunlu kılabiliriz:
{
"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"
}
}
}
}
Örnek çıkış
İstemi tanımlanmış responseSchema ile gönderdiğinizde Gemini, uygulamanız tarafından doğrudan kullanılmaya hazır yapılandırılmış bir JSON dizisi döndürür.
Çıkışta Gemini'ın ödünleri nasıl ele aldığını inceleyin. "The Downtowner"ın park sayısı çok yüksek ancak Gemini, "hafta sonları gürültülü" açıklamasını küçük çocuklar için büyük bir dezavantaj olarak tanımlıyor. Bu arada, "Suburban Oasis" mükemmel olanak yoğunluğunu "sakin, ağaçlı cadde" gibi geçerli niteliksel özelliklerle birleştirerek neredeyse mükemmel bir puan alıyor.
[
{
"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
}
]
Bu yöntem, her bir kullanıcıya göre uyarlanmış ve anlaşılır bir puanlama sunmanıza olanak tanır.
4. Puanlarınızı haritada görselleştirme
BigQuery Studio, GEOGRAPHY sütunu içeren tüm sorgu sonuçları için entegre bir harita görselleştirmesi içerir. Sorgumuz location sütununu çıkardığı için puanlarınızı hemen görselleştirebilirsiniz.
Visualization sekmesini tıkladığınızda harita açılır ve Data Column açılır listesi, görselleştirilecek konum puanını kontrol eder. Bu örnekte, 1. Seçenek örneğindeki
normalized_pet_score görselleştirilmiştir. Bu örnekte apartment_listings tablosuna daha fazla konum eklendiğini unutmayın.

Verilerin görselleştirilmesi, oluşturulan puan için en uygun konumları bir bakışta gösterir. Daha koyu yeşil daireler, bu durumda daha yüksek bir normalized_pet_score değerine sahip konumları temsil eder. Daha fazla Places Insights verisi görselleştirme seçeneği için Sorgu sonuçlarını görselleştirme başlıklı makaleyi inceleyin.
Sonuç
Artık ayrıntılı konum puanları oluşturmak için güçlü ve tekrarlanabilir bir metodolojiye sahipsiniz. Konumlarınızdan başlayarak BigQuery'de ST_DWITHIN ile yakındaki yerleri bulan, good_for_children ve allows_dogs gibi gelişmiş özelliklere göre filtreleyen ve sonuçları COUNTIF ile toplayan tek bir SQL sorgusu oluşturdunuz. Özel ağırlıklar uygulayarak ve sonucu normalleştirerek, derin ve uygulanabilir analizler sunan tek bir kullanıcı dostu puan elde ettiniz. Bu kalıbı doğrudan uygulayarak ham konum verilerini önemli bir rekabet avantajına dönüştürebilirsiniz.
Sonraki İşlemler
Şimdi geliştirme sırası sizde. Bu eğitimde bir şablon sunulmaktadır. Kullanım alanınız için en gerekli puanları oluşturmak üzere Places Insights şemasında bulunan zengin verilerden yararlanabilirsiniz. Oluşturabileceğiniz diğer puanlar:
- "Gece Hayatı Puanı":
primary_type(bar,night_club),price_levelve gece geç saatlere kadar açık olma filtrelerini birleştirerek karanlık çöktükten sonra en hareketli bölgeleri bulun. - "Fitness ve Sağlıklı Yaşam Puanı": Yakındaki
gyms,parksvehealth_food_storescihazlarını sayın ve sağlıklı yaşam konusunda bilinçli kullanıcılar için konumları puanlamak üzere restoranlarıserves_vegetarian_foodolanlara göre filtreleyin. - "Toplu Taşıma Tutkunlarının Rüyası Puanı": Toplu taşıma erişimine önem veren kullanıcılara yardımcı olmak için yakındaki
transit_stationveparkingyerlerin yoğun olduğu konumları bulun.
Katkıda bulunanlar
Henrik Valve | DevX Engineer