Korzystanie z osadzonych informacji o dynamice populacji

Przygotowywanie danych podstawowych

Aby używać wektorów dystrybucyjnych dynamiki populacji, dane podstawowe muszą być zagregowane do obsługiwanego obszaru geograficznego. Typy granic administracyjnych różnią się na całym świecie, dlatego możesz dopasować dane za pomocą uniwersalnych matematycznych systemów siatki (np. komórek S2) lub lokalnych regionów administracyjnych (np. powiatów lub okręgów, w zależności od konkretnego zbioru danych kraju).

Opcja 1. Włączanie wektorów dystrybucyjnych do istniejącego modelu

  • Przygotuj dane podstawowe na podstawie istniejącego modelu: użyj wektorów dystrybucyjnych jako kowariantów geoprzestrzennych, aby ulepszyć istniejący model.
  • Trenuj model korekty błędów: ulepsz istniejący model, integrując wektory dystrybucyjne z modelem, który wykorzystuje dane wyjściowe oryginalnego modelu, oczekiwaną wartość lub dane podstawowe oraz wektory dystrybucyjne, aby nauczyć się nowego modelu korekty błędów.

Opcja 2. Dostosowywanie do konkretnych przypadków użycia

  • Wybierz model predykcyjny: do prognozowania można użyć dowolnego modelu, np. GBDT, MLP lub liniowego.
  • Używaj wektorów dystrybucyjnych do prognozowania: używaj wektorów dystrybucyjnych dynamiki populacji jako cech wejściowych wraz z innymi danymi kontekstowymi, aby zwiększyć dokładność prognozowania.

Agregacja niestandardowych granic

Jeśli dane podstawowe używają niestandardowych wielokątów, takich jak kody pocztowe, izochrony czasu dojazdu lub obszary handlowe, możesz przeprowadzić agregację granic. Ten proces łączy wiele wektorów komórek S2 w jedną reprezentację dla docelowego wielokąta. Wybór odpowiedniej metodologii ważenia zapewnia, że zagregowany wektor dystrybucyjny dokładnie odzwierciedla cele modelowania.

W przypadku przypadków użycia skoncentrowanych na ludziach, takich jak skuteczność sklepu detalicznego lub modelowanie zachowań konsumentów, używaj agregacji ważonej populacją.

Używanie agregacji przestrzennej ważonej obszarem w przypadku danych demograficznych może zniekształcić cechy uczenia maszynowego. Dzieje się tak, gdy niezamieszkane obszary, takie jak parki, strefy przemysłowe lub zbiorniki wodne, zniekształcają profil rzeczywistych mieszkańców.

Aby rozwiązać ten problem, możesz obliczyć średnią ważoną populacją w BigQuery. To podejście wykorzystuje zbiory danych demograficznych o wysokiej rozdzielczości, takie jak WorldPop w katalogu danych Earth Engine, do obliczania dokładnej gęstości każdego przecinającego się segmentu komórki S2.

Aby zobaczyć pełny przykład implementacji przepływu pracy ważonego populacją, uruchom interaktywny notatnik.

2. Średnia ważona obszarem

W przypadku zastosowań środowiskowych lub fizycznych używaj zamiast tego agregacji ważonej obszarem. Jest to przydatne w przypadku analizy użytkowania gruntów, badań środowiska zabudowanego lub planowania infrastruktury, gdy trzeba ocenić regiony niezależnie od rozmieszczenia ludności.

W tych scenariuszach powierzchnia fizyczna jest bardziej istotna niż gęstość zaludnienia. Dzięki temu każdy kilometr kwadratowy w obrębie granicy wielokąta w równym stopniu przyczynia się do zagregowanego wektora.

W tej metodzie wektor dystrybucyjny każdej komórki S2 jest ważony przez powierzchnię geograficzną, którą obejmuje w obrębie docelowego wielokąta.

Operacje geoprzestrzenne i konwersja komórek S2

Statystyki dotyczące dynamiki populacji używają tokenów komórek S2 na poziomie 12 (przechowywanych w kolumnie geo_id jako 7-znakowe ciągi szesnastkowe) jako podstawowej jednostki przestrzennej. Możesz użyć wbudowanych funkcji geograficznych w BigQuery, aby przekonwertować współrzędne punktów lub niestandardowe granice przestrzenne na pasujące tokeny komórek S2. Aby przekonwertować tokeny komórek S2 na geometrie wielokątów na potrzeby wizualizacji, możesz użyć bibliotek po stronie klienta. Więcej informacji znajdziesz w artykule Pobieranie geometrii komórki S2 z tokena szesnastkowego S2 na poziomie 12.

Konwertowanie współrzędnych punktów na tokeny szesnastkowe S2 na poziomie 12

Aby dopasować współrzędne punktów szerokości i długości geograficznej do kolumny geo_id w statystykach dotyczących dynamiki populacji, użyj funkcji BigQuery S2_CELLIDFROMPOINT w połączeniu z ST_GEOGPOINT.

BigQuery przechowuje identyfikatory komórek S2 jako podpisane wartości INT64, co powoduje, że identyfikatory komórek w niektórych regionach są oceniane jako liczby ujemne. W przykładach poniżej definiujemy funkcję pomocniczą o nazwie TO_S2_HEX, która konwertuje liczbę całkowitą na standardowy token szesnastkowy i usuwa końcowe zera zgodnie ze specyfikacją geometrii S2.

To zapytanie konwertuje współrzędne punktów dla Times Square w Nowym Jorku (szerokość geograficzna 40.75796, długość geograficzna -73.98554) na odpowiadający im token szesnastkowy S2 na poziomie 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')
);

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

Aby przekonwertować istniejącą tabelę punktów z kolumnami latitude i longitude na tokeny S2, które można złączyć:

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`;

Generowanie tokenów komórek S2 na poziomie 12 obejmujących wielokąt

Jeśli Twoje dane używają niestandardowych granic obszarów (takich jak obszary handlowe, strefy dostawy lub kody pocztowe w formacie WKT lub GeoJSON), przekonwertuj reprezentację tekstową na GEOGRAPHY za pomocą ST_GEOGFROM i użyj S2_COVERINGCELLIDS, aby wyodrębnić wszystkie przecinające się komórki S2 na poziomie 12.

To zapytanie wyodrębnia wszystkie tokeny szesnastkowe S2 na poziomie 12 obejmujące niestandardowy wielokąt w Midtown Manhattan:

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;

Pobieranie geometrii komórki S2 z tokena szesnastkowego S2 na poziomie 12

Funkcje GIS w BigQuery to konwertery jednokierunkowe (geometria → identyfikator komórki S2), które nie zawierają funkcji konwertowania tokena komórki S2 na GEOGRAPHY wielokąta. Aby uzyskać geometrię wielokąta tokena komórki S2 na potrzeby wizualizacji lub analizy przestrzennej, użyj biblioteki po stronie klienta w Pythonie, takiej jak s2sphere aby zdekodować 7-znakowy token komórki S2 na jego współrzędne graniczne, oraz shapely aby utworzyć wielokąt na potrzeby narzędzi do mapowania, takich jak 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)

Przykładowe zapytania

Zastąp your-project.your_dataset.embeddings_table rzeczywistą nazwą projektu, zbioru danych i tabeli docelowej.

SQL: pobieranie wektorów dystrybucyjnych

To zapytanie pobiera wektor dystrybucyjny i metadane administracyjne komórek S2 w udostępnionym zbiorze danych.

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: znajdowanie podobnych lokalizacji

To zapytanie identyfikuje lokalizacje podobne pod względem zachowań bez konieczności korzystania z danych zewnętrznych.

Używa funkcji ML.DISTANCE do obliczania podobieństwa cosinusowego, zwracając najlepsze dopasowania dla docelowej komórki S2. To podejście obsługuje scenariusze planowania ekspansji, takie jak określanie, gdzie otworzyć nowy sklep na podstawie profilu istniejącej lokalizacji, która odnosi sukces.

Aby wizualizować komórki S2 na mapie, musisz przekonwertować identyfikator komórki S2 na odpowiadającą mu geometrię wielokąta lub złączyć z nią, ponieważ ten zbiór danych używa tokenów komórek S2 zamiast punktów szerokości i długości geograficznej.

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: łączenie danych klientów

Ten przykład pokazuje, jak wzbogacić własne dane wewnętrzne (np. tabelę skuteczności sklepu) o wektory dystrybucyjne zachowań. Upewnij się, że dane wewnętrzne zawierają pasujące tokeny komórek S2 (ciągi szesnastkowe).

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: wczytywanie danych na potrzeby uczenia maszynowego

Wektory dystrybucyjne są przechowywane jako tablice BigQuery. Aby używać ich w bibliotekach uczenia maszynowego, musisz przekonwertować kolumnę na macierz 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)