שימוש בהטמעות של תובנות לגבי דינמיקה של אוכלוסייה

הכנת נתוני אמת קרקע

כדי להשתמש בהטמעות של Population Dynamics, צריך לצבור את נתוני אמת הקרקע (ground truth) לגבול גיאוגרפי נתמך. סוגי הגבולות המנהליים משתנים ברחבי העולם, ולכן אתם יכולים להתאים את הנתונים באמצעות מערכות רשת מתמטיות אוניברסליות (כמו תאי S2) או אזורים מנהליים מקומיים (כמו מחוזות או נפות, בהתאם לקבוצת הנתונים הספציפית של המדינה).

אפשרות 1: שילוב הטמעות במודל קיים

  • הכנת נתוני אמת קרקע (ground truth) קיימים שמבוססים על מודל: משתמשים בהטמעות כמשתני עזר גיאוספציאליים כדי לשפר מודל קיים.
  • לאמן מודל לתיקון שגיאות: משפרים מודל קיים על ידי שילוב של ההטמעות במודל שמקבל את הפלט מהמודל המקורי, את הערך הצפוי או את אמת הקרקע (ground truth) ואת ההטמעות כדי ללמוד מודל חדש לתיקון שגיאות.

אפשרות 2: כוונון לתרחישי שימוש ספציפיים

  • בחירת מודל חיזוי: אפשר להשתמש בכל מודל לחיזויים, כמו GBDT,‏ MLP או מודל לינארי.
  • שימוש בהטמעות לחיזוי: אפשר להשתמש בהטמעות של נתונים דינמיים של אוכלוסייה כמאפייני קלט, לצד נתונים הקשריים אחרים, כדי לשפר את דיוק החיזוי.

צבירה של גבולות בהתאמה אישית

אם נתוני אמת הקרקע (ground truth) שלכם משתמשים במצולעים בהתאמה אישית, כמו מספרי מיקוד, איזוכרונים של זמן נסיעה או אזורי מסחר, אתם יכולים לבצע צבירת נתונים לפי גבולות. בתהליך הזה, כמה וקטורים של תאי S2 משולבים לייצוג אחד של פוליגון היעד. בחירה נכונה של מתודולוגיית השקלול מבטיחה שה-embedding המצטבר ישקף בצורה מדויקת את יעדי המידול שלכם במורד הזרם.

השתמשו בצבירה משוקללת לפי אוכלוסייה בתרחישי שימוש שמתמקדים באנשים, כמו ביצועים של חנות קמעונאית או בניית מודלים של התנהגות צרכנים.

שימוש בצבירה מרחבית משוקללת לפי אזור לנתונים דמוגרפיים עלול לעוות את התכונות של למידת המכונה. המצב הזה קורה כשבאזורים לא מאוכלסים, כמו פארקים, אזורי תעשייה או מקווי מים, יש שיבוש בפרופיל של התושבים בפועל.

כדי לפתור את הבעיה, אפשר לבצע ממוצע משוקלל לפי אוכלוסייה ב-BigQuery. בגישה הזו משתמשים במערכי נתונים דמוגרפיים ברזולוציה גבוהה, כמו WorldPop בקטלוג הנתונים של Earth Engine, כדי לחשב את הצפיפות המדויקת של כל קטע מצטלב של תא S2.

כדי לראות דוגמה מלאה להטמעה של תהליך עבודה משוקלל לפי אוכלוסייה, מריצים את ה-notebook האינטראקטיבי.

2. ממוצע משוקלל לפי שטח

בתרחישי שימוש סביבתיים או פיזיים, צריך להשתמש במקום זאת בצבירה משוקללת לפי אזור. הנתונים האלה עוזרים לנתח את השימוש בקרקע, לחקור סביבות בנויות או לתכנן תשתיות שבהן צריך להעריך אזורים בלי קשר להתפלגות האוכלוסייה.

במקרים כאלה, שטח הקרקע הפיזי רלוונטי יותר מצפיפות האוכלוסייה. כך כל קילומטר רבוע בתוך גבולות הפוליגון תורם באופן שווה לווקטור המצטבר.

בשיטה הזו, וקטור ההטמעה של כל תא S2 שמרכיב את הפוליגון משוקלל לפי שטח הפנים הגיאוגרפי שהוא מכסה בתוך פוליגון היעד.

פעולות גיאוגרפיות-מרחביות והמרת תאי S2

התובנות בקשר לדינמיקה של האוכלוסייה משתמשות באסימונים ברמה 12 של תאי S2 (שמאוחסנים בעמודה geo_id כמחרוזות הקסדצימליות באורך 7 תווים) כיחידה המרחבית העיקרית שלהן. אתם יכולים להשתמש בפונקציות הגיאוגרפיה המובנות ב-BigQuery כדי להמיר קואורדינטות של נקודות או גבולות מרחביים מותאמים אישית לטוקנים תואמים של תאי S2. כדי להמיר אסימוני תאים של S2 לצורות גיאומטריות של מצולעים לצורך ויזואליזציה, אפשר להשתמש בספריות בצד הלקוח. מידע נוסף זמין במאמר קבלת גיאומטריה של תא S2 מאסימון הקסדצימלי של S2 ברמה 12.

המרת קואורדינטות של נקודות לאסימונים הקסדצימליים של S2 ברמה 12

כדי להתאים בין קואורדינטות של נקודות בקווי רוחב ואורך לבין העמודה 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`;

יצירת אסימוני תאים ברמה 12 של S2 שמכסים פוליגון

אם הנתונים שלכם כוללים גבולות של אזורים בהתאמה אישית (כמו אזורי מסחר, אזורי חלוקה או מיקודים בפורמט WKT או GeoJSON), המירו את ייצוג הטקסט ל-GEOGRAPHY באמצעות ST_GEOGFROM והשתמשו ב-S2_COVERINGCELLIDS כדי לחלץ את כל תאי S2 ברמה 12 שנחתכים.

השאילתה הבאה מחלצת את כל אסימוני ההקסדצימליים של S2 ברמה 12 שמכסים פוליגון בהתאמה אישית במרכז מנהטן:

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

פונקציות ה-GIS של BigQuery הן ממירים חד-כיווניים (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. כדי להשתמש בהם בספריות של ML, צריך להמיר את העמודה למטריצה של 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)