استخدام عمليات التضمين في "إحصاءات حول ديناميات السكان"

إعداد بيانات الحقيقة الأساسية

لاستخدام عمليات التضمين في "ديناميكية السكان"، يجب تجميع بياناتك الأساسية ضمن حدود جغرافية متوافقة. بما أنّ أنواع الحدود الإدارية تختلف على مستوى العالم، يمكنك مطابقة بياناتك باستخدام أنظمة شبكات رياضية عالمية (مثل خلايا S2) أو مناطق إدارية محلية (مثل المقاطعات أو المناطق، حسب مجموعة بيانات البلد المحدّد).

الخيار 1: دمج التضمينات في نموذج حالي

  • إعداد بيانات الحقيقة الأساسية المستندة إلى النموذج الحالي: استخدِم عمليات التضمين كمتغيرات مكانية مشتركة لتحسين نموذج حالي.
  • تدريب نموذج لتصحيح الأخطاء: يمكنك تحسين نموذج حالي من خلال دمج التضمينات في نموذج يأخذ مخرجات النموذج الأصلي والقيمة المتوقّعة أو الحقيقة الأساسية والتضمينات لتعلُّم نموذج جديد لتصحيح الأخطاء.

الخيار 2: التحسين لحالات استخدام معيّنة

  • اختَر نموذج توقّع: يمكن استخدام أي نموذج، مثل GBDT أو MLP أو نموذج خطي، لوضع التوقّعات.
  • استخدام التضمينات لإجراء التوقّعات: استخدِم تضمينات "ديناميكيات السكان" كميزات إدخال، إلى جانب بيانات سياقية أخرى، لتحسين دقة التوقّعات.

تجميع الحدود المخصّصة

إذا كانت بياناتك الأساسية تستخدم مضلّعات مخصّصة، مثل الرموز البريدية أو منحنيات تساوي الوقت المستغرَق في القيادة أو المناطق التجارية، يمكنك إجراء عملية تجميع الحدود. تجمع هذه العملية بين متجهات خلايا S2 متعددة في تمثيل واحد للمضلّع المستهدَف. يضمن اختيار منهجية الترجيح المناسبة أن يعكس التضمين المجمّع أهداف نمذجة البيانات النهائية بدقة.

استخدِم التجميع المرجّح حسب عدد السكان لحالات الاستخدام التي تركّز على الإنسان، مثل أداء متاجر البيع بالتجزئة أو وضع نماذج لسلوك المستهلكين.

يمكن أن يؤدي استخدام تجميع مكاني مرجّح حسب المساحة للبيانات الديمغرافية إلى تشويه ميزات تعلُّم الآلة. يحدث ذلك عندما تشوّه المناطق غير المأهولة، مثل المتنزّهات أو المناطق الصناعية أو المسطحات المائية، الملف الشخصي للسكان الفعليين.

لحلّ هذه المشكلة، يمكنك إجراء عملية حسابية للمتوسط المرجّح حسب عدد السكان في BigQuery. يستخدم هذا النهج مجموعات بيانات ديمغرافية عالية الدقة، مثل WorldPop في كتالوج بيانات Earth Engine، لحساب الكثافة الدقيقة لكل جزء من خلية S2 متقاطعة.

للاطّلاع على مثال كامل على عملية تنفيذ سير عمل مرجّح حسب عدد السكان، شغِّل دفتر الملاحظات التفاعلي.

2. المتوسط الموزون حسب المساحة

بالنسبة إلى حالات الاستخدام البيئية أو المادية، استخدِم التجميع المرجّح حسب المساحة بدلاً من ذلك. هذه البيانات مفيدة في تحليل استخدام الأراضي أو دراسات البيئة المبنية أو تخطيط البنية التحتية حيث يجب تقييم المناطق بغض النظر عن توزيع السكان.

في هذه السيناريوهات، تكون مساحة الأرض المادية أكثر صلة من الكثافة السكانية. يضمن ذلك أنّ كل كيلومتر مربّع ضمن حدود المضلّع يساهم بشكل متساوٍ في المتّجه المجمّع.

بموجب هذه الطريقة، يتم ترجيح كل متجه تضمين لخلية S2 مكوّنة حسب مساحة السطح الجغرافي التي تغطيها داخل المضلّع المستهدَف.

العمليات الجغرافية المكانية وتحويل الخلايا S2

تستخدِم "إحصاءات حول ديناميات السكان" رموزًا مميزة لمربّعات S2 من المستوى 12 (مخزَّنة في العمود geo_id كسلاسل سداسية عشرية مكوّنة من 7 أحرف) كوحدة مكانية أساسية. يمكنك استخدام دوال الجغرافيا المضمّنة في BigQuery لتحويل إحداثيات النقاط أو الحدود المكانية المخصّصة إلى رموز مميّزة متطابقة لخلايا S2. لتحويل رموز خلايا S2 إلى أشكال هندسية مضلّعة بغرض العرض المرئي، يمكنك استخدام مكتبات من جهة العميل. لمزيد من المعلومات، راجِع الحصول على هندسة خلية S2 من رمز مميز سداسي عشري من المستوى 12 في S2.

تحويل إحداثيات النقاط إلى رموز سداسية عشرية من المستوى 12 في S2

لمطابقة إحداثيات نقاط خطوط الطول والعرض مع العمود geo_id في "إحصاءات ديناميكية السكان"، استخدِم الدالة S2_CELLIDFROMPOINT في BigQuery مع ST_GEOGPOINT.

يخزّن BigQuery أرقام تعريف خلايا S2 كقيم INT64 موقّعة، ما يؤدي إلى تقييم أرقام تعريف الخلايا في مناطق معيّنة كأعداد صحيحة سالبة. في الأمثلة أدناه، نحدّد دالة مساعدة باسم TO_S2_HEX تحوّل العدد الصحيح إلى رمز سداسي عشري عادي وتزيل الأصفار اللاحقة وفقًا لمواصفات S2 Geometry.

يحوّل طلب البحث التالي إحداثيات النقطة في ميدان تايمز سكوير في مدينة نيويورك (خط العرض 40.75796، خط الطول -73.98554) إلى الرمز المميز السداسي العشري المقابل من المستوى 12 في نظام S2:

CREATE TEMP FUNCTION TO_S2_HEX(s2_int INT64) RETURNS STRING AS (
  RTRIM(FORMAT('%x%015x', (s2_int >> 60) & 0xF, s2_int & 0x0FFFFFFFFFFFFFFF), '0')
);

SELECT
  'Times Square, NYC' AS location_name,
  TO_S2_HEX(S2_CELLIDFROMPOINT(ST_GEOGPOINT(-73.98554, 40.75796), level => 12)) AS geo_id;

لتحويل جدول نقاط حالي يتضمّن العمودَين latitude وlongitude إلى رموز مميّزة من S2 يمكن ربطها:

CREATE TEMP FUNCTION TO_S2_HEX(s2_int INT64) RETURNS STRING AS (
  RTRIM(FORMAT('%x%015x', (s2_int >> 60) & 0xF, s2_int & 0x0FFFFFFFFFFFFFFF), '0')
);

SELECT
  store_id,
  TO_S2_HEX(S2_CELLIDFROMPOINT(ST_GEOGPOINT(longitude, latitude), level => 12)) AS geo_id
FROM
  `your-project.internal_data.store_locations`;

إنشاء رموز مميّزة لخلايا S2 من المستوى 12 تغطي مضلّعًا

إذا كانت بياناتك تستخدم حدودًا مخصّصة للمناطق (مثل المناطق التجارية أو مناطق التوصيل أو الرموز البريدية بتنسيق WKT أو GeoJSON)، عليك تحويل التمثيل النصي إلى GEOGRAPHY باستخدام ST_GEOGFROM واستخدام S2_COVERINGCELLIDS لاستخراج جميع خلايا S2 المستوى 12 المتقاطعة.

يستخرج طلب البحث التالي جميع الرموز المميزة السداسية العشرية من المستوى 12 في S2 التي تغطي مضلّعًا مخصّصًا في وسط مانهاتن:

CREATE TEMP FUNCTION TO_S2_HEX(s2_int INT64) RETURNS STRING AS (
  RTRIM(FORMAT('%x%015x', (s2_int >> 60) & 0xF, s2_int & 0x0FFFFFFFFFFFFFFF), '0')
);

WITH CustomBoundary AS (
  SELECT ST_GEOGFROM('POLYGON((-73.99 40.75, -73.97 40.75, -73.97 40.76, -73.99 40.76, -73.99 40.75))') AS geom
)
SELECT
  TO_S2_HEX(s2_id) AS geo_id
FROM
  CustomBoundary,
  UNNEST(S2_COVERINGCELLIDS(geom, min_level => 12, max_level => 12)) AS s2_id;

الحصول على شكل خلية S2 من رمز سداسي عشري من المستوى 12 في S2

إنّ دوال BigQuery GIS هي محوّلات أحادية الاتجاه (Geometry → S2 Cell ID) ولا تتضمّن دالة لتحويل رمز مميّز لخلية S2 إلى مضلّع GEOGRAPHY. للحصول على شكل هندسي لمضلّع رمز مميّز لخلايا S2 من أجل العرض المرئي أو التحليل المكاني، استخدِم مكتبة من جهة العميل في Python، مثل s2sphere لتحويل رمز مميّز لخلايا S2 يتألف من 7 أحرف إلى إحداثيات الحدود، وshapely لإنشاء مضلّع لأدوات التعيين، مثل Folium:

import s2sphere
from shapely.geometry import Polygon

def s2_token_to_polygon(s2_token: str) -> Polygon:
    """Converts a 7-character S2 cell token into a Shapely Polygon."""
    cell_id = s2sphere.CellId.from_token(s2_token)
    cell = s2sphere.Cell(cell_id)

    # Extract the 4 corner vertices of the S2 cell
    vertices = []
    for i in range(4):
        vertex = cell.get_vertex(i)
        lat_lng = s2sphere.LatLng.from_point(vertex)
        vertices.append((lat_lng.lng().degrees, lat_lng.lat().degrees))

    # Close the polygon loop
    vertices.append(vertices[0])
    return Polygon(vertices)

# Example: Get boundary for S2 token '549056f'
cell_polygon = s2_token_to_polygon('549056f')
print(cell_polygon.wkt)

أمثلة على طلبات البحث

استبدِل your-project.your_dataset.embeddings_table باسم مشروعك ومجموعة البيانات واسم الجدول المستهدف الفعلي.

SQL: جلب التضمينات

يستردّ هذا الاستعلام متّجه التضمين والبيانات الوصفية الإدارية لخلايا S2 في مجموعة البيانات المتوفّرة لديك.

SELECT
  geo_id,
  administrative_area_level_1_name AS state,
  administrative_area_level_2_name AS county,
  features -- The 330-dim vector
FROM
  `your-project.your_dataset.embeddings_table`
LIMIT 10;

SQL: البحث عن مواقع جغرافية مشابهة

يحدّد طلب البحث هذا المواقع الجغرافية المتشابهة سلوكيًا بدون الحاجة إلى بيانات خارجية.

تستخدم هذه الدالة ML.DISTANCE لحساب التشابه في جيب التمام، وتعرض أفضل المطابقات لخلية S2 مستهدَفة. يدعم هذا الأسلوب سيناريوهات تخطيط التوسّع، مثل تحديد مكان فتح متجر جديد استنادًا إلى الملف الشخصي لموقع جغرافي حالي ناجح.

لتصوّر خلايا S2 على خريطة، عليك تحويل معرّف خلية S2 أو دمجه مع شكل المضلّع الهندسي المقابل، لأنّ مجموعة البيانات هذه تستخدم رموز خلايا S2 بدلاً من نقاط خطوط الطول والعرض.

WITH TargetLocation AS (
  SELECT features AS target_vector
  FROM `your-project.your_dataset.embeddings_table`
  -- Replace with your target S2 hex token (e.g., '80ead45')
  WHERE geo_id = 'YOUR_TARGET_S2_TOKEN'
)

SELECT
  t.geo_id,
  t.administrative_area_level_1_name AS state,
  t.administrative_area_level_2_name AS county,
  -- Calculate Similarity (1.0 is identical, 0.0 is dissimilar)
  (1 - ML.DISTANCE(t.features, p.target_vector, 'COSINE')) AS similarity_score
FROM
  `your-project.your_dataset.embeddings_table` t,
  TargetLocation p
WHERE
  t.geo_id != 'YOUR_TARGET_S2_TOKEN' -- Exclude the target itself
ORDER BY
  similarity_score DESC
LIMIT 20;

‫SQL: ربط بيانات العملاء

يوضّح هذا المثال كيفية إثراء بياناتك الداخلية (على سبيل المثال، جدول أداء المتجر) باستخدام التضمينات السلوكية. تأكَّد من أنّ بياناتك الداخلية تتضمّن رموزًا مميّزة متطابقة لخلايا S2 (سلاسل سداسية عشرية).

SELECT
  store.store_id,
  store.s2_token,
  store.total_revenue,
  embeddings.features AS pdfm_vector
FROM
  `your-project.internal_data.store_performance` AS store
JOIN
  `your-project.your_dataset.embeddings_table` AS embeddings
ON
  -- Join based on the S2 hex token string
  store.s2_token = embeddings.geo_id

Python: تحميل البيانات لتعلُّم الآلة

يتم تخزين التضمينات كمصفوفات BigQuery. لاستخدامها في مكتبات تعلُّم الآلة، يجب تحويل العمود إلى مصفوفة NumPy.

from google.cloud import bigquery
import numpy as np
import pandas as pd

client = bigquery.Client()

query = """
    SELECT
        geo_id,
        features -- Returns as a list of floats
    FROM
        `your-project.your_dataset.embeddings_table`
    LIMIT 1000
"""

# 1. Load data into DataFrame
df = client.query(query).to_dataframe()

# 2. Convert the 'features' column (Series of Lists) into a Matrix (2D Array)
X_matrix = np.stack(df['features'].values)

print(f"Data Loaded. Matrix Shape: {X_matrix.shape}")
# Output: Data Loaded. Matrix Shape: (1000, 330)