Places Insights ile özel konum puanları oluşturma

Genel Bakış

Yakındaki parklara ve köpek dostu yerlere göre 9, 1 puanlık özel bir Evcil Hayvan Sahibi Cenneti Puanı gösteren emlak listelemesi.

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ışı

Üç adımlı iş akışı şeması: konumları belirleyin, yakındaki yerler için sorgu gönderin ve sonuçları normalleştirerek nihai bir puan oluşturun.

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.

BigQuery sorgu sonuçlarında, kimlik, ad ve konum koordinatları içeren bir apartman listesi tablosu gösteriliyor.

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.

Her bir daire listelemesi için parklar, restoranlar ve evcil hayvan hizmetleri gibi olanakların ham sayılarını gösteren BigQuery sonuçları.

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.

Her bir daire listelemesi için hem ham ağırlıklı puanları hem de normalleştirilmiş 0-10 puanlarını gösteren nihai sorgu sonuçları.

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.

Çeşitli konumlar için normalleştirilmiş evcil hayvan puanını görselleştiren bir harita. Daha koyu yeşil noktalar daha yüksek ve daha uygun puanları temsil eder.

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_level ve 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, parks ve health_food_stores cihazlarını sayın ve sağlıklı yaşam konusunda bilinçli kullanıcılar için konumları puanlamak üzere restoranları serves_vegetarian_food olanlara 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_station ve parking yerlerin yoğun olduğu konumları bulun.

Katkıda bulunanlar

Henrik Valve | DevX Engineer