Analizzare il rendimento del sito con Places Insights e BigQuery ML

immagine

Perché un sito prospera mentre un altro ha un rendimento inferiore nonostante pratiche operative, di inventario e di personale coerenti? Le attività con più sedi spesso faticano a spiegare questa variazione del rendimento nel loro portafoglio. La risposta di solito si trova nascosta nell'ambiente esterno. Sfruttando i dati sui punti di interesse (PDI), possiamo andare oltre le spiegazioni aneddotiche e quantificare esattamente in che modo la densità competitiva locale e le caratteristiche del quartiere determinano il successo di un sito.

Questa guida mostra come quantificare l'impatto dell'ambiente locale sul successo del sito utilizzando Places Insights e BigQuery ML. Combinerai i dati proprietari sul rendimento del sito con indicatori geospaziali esterni per diagnosticare i fattori che determinano il rendimento.

Utilizzeremo un set di dati di siti a Londra per creare un modello di regressione lineare. Questo flusso di lavoro utilizza l'indicizzazione spaziale H3, un sistema che divide la città in celle esagonali uniformi. Aggregando i dati ambientali in queste celle, puoi addestrare un modello per prevedere il potenziale di rendimento di qualsiasi quartiere della città, non solo dei tuoi siti esistenti.

Imparerai a:

  1. Funzionalità per ingegneri:conteggi aggregati di punti di interesse (PDI) come palestre, scuole e stazioni di transito in un raggio di 500 metri dai tuoi siti.
  2. Addestra un modello: utilizza BigQuery ML per creare un modello di regressione che correli queste caratteristiche ambientali con le tue metriche di rendimento interne.
  3. Score the City: applica il modello addestrato all'intera griglia H3 di Londra per identificare gli hotspot ad alto potenziale per l'espansione futura.

Se non hai mai utilizzato BigQuery ML, consulta Introduzione a BigQuery ML per scoprire i concetti di base e i tipi di modelli supportati.

immagine

Per esplorare questo flusso di lavoro in un ambiente interattivo, esegui il seguente notebook. Mostra come creare un modello predittivo con BigQuery ML e visualizzare le opportunità a livello di città utilizzando l'indicizzazione spaziale H3.

Prerequisiti

Prima di iniziare, assicurati di disporre di quanto segue:

  • Progetto Google Cloud:

    • Un progetto Google Cloud con la fatturazione abilitata.
  • Accesso ai dati:

  • Google Maps Platform:

  • Ambiente e librerie Python:

    • Un ambiente Python come Colab Enterprise nella console Google Cloud.
    • Sono installate le seguenti librerie:
      Raccolta Descrizione
      pandas-gbq Interazione con BigQuery.
      geopandas Gestione delle operazioni sui dati geospaziali.
      folium Creare mappe interattive.
      shapely Manipolazioni geometriche.
  • Autorizzazioni IAM:

    • Assicurati che il tuo utente o service account disponga dei seguenti ruoli IAM:
      Ruolo ID
      BigQuery Data Editor roles/bigquery.dataEditor
      Utente BigQuery roles/bigquery.user
  • Consapevolezza dei costi:

    • Questo tutorial utilizza i componenti fatturabili di Google Cloud. Tieni presente i potenziali costi relativi a:
      • BigQuery ML: addebito per gli slot di calcolo utilizzati. Consulta i prezzi di BigQuery ML.
      • Places Insights:addebito basato sull'utilizzo delle query.

Feature engineering con Approfondimenti di Places

Per isolare i fattori esterni che determinano il rendimento del sito, devi trasformare i dati grezzi dei PDI in funzionalità quantificabili. Calcolerai la densità di servizi o tipi di luoghi specifici, come palestre, scuole e stazioni di transito, in un raggio di 500 metri da ogni sito. I servizi che selezioni dipenderanno da ciò che ritieni possa essere più pertinente per la tua attività.

immagine

Per questo passaggio utilizziamo Python e la libreria pandas-gbq. Questo approccio ti consente di eseguire la query SELECT WITH AGGREGATION_THRESHOLD, necessaria per accedere al set di dati Places Insights, e salvare i risultati in una nuova tabella del tuo progetto. Per saperne di più su come lavorare con i dati di Places Insights, consulta Eseguire query direttamente sul set di dati.

Esegui la query di feature engineering

Esegui il seguente script Python nel tuo ambiente (ad es. Colab Enterprise). Questo script collega i dati interni del sito al set di dati Approfondimenti di Places.

from google.cloud import bigquery
import pandas_gbq

# Configuration
project_id = 'your_project_id'
dataset_id = 'your_dataset_id'
features_table_id = f'{dataset_id}.site_features'

client = bigquery.Client(project=project_id)

# Define the Feature Engineering Query
# We count specific amenities within 500m of each site in London.
sql = f"""
SELECT WITH AGGREGATION_THRESHOLD
    internal.store_id,
    internal.store_performance,

    -- Feature Engineering: count nearby POIs by type
    COUNTIF('gym' IN UNNEST(places.types)) AS gym_count,
    COUNTIF('restaurant' IN UNNEST(places.types)) AS restaurant_count,
    COUNTIF('school' IN UNNEST(places.types)) AS school_count,
    COUNTIF('transit_station' IN UNNEST(places.types)) AS transit_count,
    COUNTIF('clothing_store' IN UNNEST(places.types)) AS clothing_store_count

FROM
    `{dataset_id}.site_performance` AS internal
JOIN
    `places_insights___gb.places` AS places
    ON ST_DWITHIN(internal.location, places.point, 500)
WHERE
    places.business_status = 'OPERATIONAL'
GROUP BY
    internal.store_id, internal.store_performance
"""

print("1. Running Feature Engineering Query...")

# Execute the query and download results to a Pandas DataFrame
df_features = client.query(sql).to_dataframe()

print(f"2. Saving features to: {features_table_id}...")

# Upload the engineered features to a permanent BigQuery table
pandas_gbq.to_gbq(
    dataframe=df_features,
    destination_table=features_table_id,
    project_id=project_id,
    if_exists='replace'
)

print("   Success! Training data ready.")

Comprendere la query

  1. ST_DWITHIN: questa funzione geospaziale crea un buffer di 500 metri intorno a ogni posizione del sito e identifica tutti i punti Places Insights che rientrano in questo raggio.
  2. COUNTIF: questa funzione calcola la densità di tipi di luoghi specifici (ad es. "palestra", "scuola") per ogni sito. Questi conteggi diventano le funzionalità di input (X) per il modello di machine learning.
  3. pandas_gbq.to_gbq: questa funzione salva i risultati della query in una nuova tabella (site_features). Questa tabella permanente funge da set di dati di addestramento pulito per il modello BigQuery ML.

Per applicazioni reali più avanzate, valuta la possibilità di calcolare le funzionalità a distanze multiple (ad es. 250 m, 500 m, 1 km) ed esplora altri attributi di Places Insights come rating, price_level o regular_opening_hours. Consulta i tipi di luoghi supportati e il riferimento allo schema principale per l'elenco completo degli attributi di Places Insights.

Addestra il modello con BigQuery ML

Con le funzionalità create salvate nella tabella site_features, ora puoi addestrare un modello di regressione lineare.

Questo modello apprende i pesi ottimali (β) per ogni caratteristica ambientale (X) per prevedere il rendimento del tuo sito (Y).

immagine

Gestire gli outlier con la scalabilità robusta

I dati geospaziali spesso contengono valori anomali estremi che possono distorcere i modelli lineari standard. Ad esempio, un sito nel West End di Londra potrebbe avere 200 ristoranti entro 500 metri, mentre un sito suburbano ne ha solo 2. Se utilizzi la scalabilità standard (media/deviazione standard), il valore anomalo (200) distorce la distribuzione e costringe il modello a dare la priorità all'adattamento a questo valore estremo.

Per risolvere questo problema, utilizziamo Robust Scaling (ML.ROBUST_SCALER) all'interno della definizione del modello. Questa tecnica ridimensiona le funzionalità in base alla mediana e all'intervallo interquartile (IQR), rendendo il modello resiliente agli outlier e garantendo che apprenda dalla distribuzione tipica dei tuoi siti.

Crea il modello

Esegui la seguente query SQL in BigQuery per creare e addestrare il modello.

Utilizziamo la clausola TRANSFORM per applicare uno scaling efficace a tutte le caratteristiche di input. Abbiamo anche impostato optimize_strategy = 'NORMAL_EQUATION' perché è il metodo di addestramento più efficiente per set di dati relativamente piccoli, come un tipico portafoglio di sedi di negozi. Infine, filtriamo gli outlier con prestazioni elevate (store_performance < 75) per concentrare il modello sulla previsione dei modelli di crescita tipici.

CREATE OR REPLACE MODEL `your_project.your_dataset.site_performance_model`
TRANSFORM(
  store_performance,
  -- Feature Engineering inside the model artifact
  -- These stats are calculated on the TRAINING split only
  ML.ROBUST_SCALER(gym_count) OVER() AS scaled_gym_count,
  ML.ROBUST_SCALER(restaurant_count) OVER() AS scaled_restaurant_count,
  ML.ROBUST_SCALER(school_count) OVER() AS scaled_school_count,
  ML.ROBUST_SCALER(transit_count) OVER() AS scaled_transit_count,
  ML.ROBUST_SCALER(clothing_store_count) OVER() AS scaled_clothing_store_count
)
OPTIONS(
    model_type = 'LINEAR_REG',
    input_label_cols = ['store_performance'],

    -- OPTIMIZATION PARAMETERS
    optimize_strategy = 'NORMAL_EQUATION', -- Exact mathematical solution (fast for small data)
    data_split_method = 'AUTO_SPLIT',      -- Automatically reserves ~20% for evaluation

    -- DIAGNOSTICS
    enable_global_explain = TRUE -- Essential to see feature importance
)
AS
SELECT
    gym_count,
    restaurant_count,
    school_count,
    transit_count,
    clothing_store_count,
    store_performance
FROM
    `your_project.your_dataset.site_features`
WHERE
    store_performance < 75;

Valutare le prestazioni del modello

Prima di poter fare affidamento sugli approfondimenti del modello su ciò che determina il rendimento del sito, devi verificare che le sue previsioni siano accurate.

Dopo l'addestramento, utilizza la funzione ML.EVALUATE per valutare le previsioni del modello rispetto a un set di dati "holdout" che non è stato utilizzato durante l'addestramento.

SELECT
  *
FROM
  ML.EVALUATE(MODEL `your_project.your_dataset.site_performance_model`);

Controlla il punteggio R2 (r2_score) e l'errore assoluto medio (mean_absolute_error) per determinare se il modello è pronto per la produzione:

  • Un punteggio R2 misura la varianza del rendimento effettivamente spiegata dai fattori ambientali esterni (PDI nelle vicinanze). Un punteggio R2 di 0,70 indica che il 70% del successo di un sito è legato all'ambiente locale. Più il valore è vicino a 1,0, più forte è la correlazione tra i servizi ambientali e il rendimento del sito.
  • L'errore assoluto medio (MAE) indica l'errore medio in punti. Ad esempio, un MAE di 1,5 significa che le previsioni del modello rientrano in genere in un intervallo di +/- 1,5 punti rispetto al punteggio di rendimento effettivo.

Risoluzione dei problemi relativi ai punteggi bassi

Se il punteggio R2 è basso, valuta i seguenti miglioramenti:

  • Espandi tipi di funzionalità:aggiungi diversi tipi di luoghi alla query (ad es. tourist_attraction, subway_station).
  • Regola il raggio di copertura:modifica la distanza ST_DWITHIN. Un raggio di 500 metri potrebbe essere troppo ampio per una caffetteria, ma troppo piccolo per un negozio di mobili.
  • Aumenta le dimensioni dei dati:assicurati di eseguire l'addestramento su un numero sufficiente di sedi dei negozi per trovare un pattern statisticamente significativo.

Assegnare un punteggio alla città con l'indicizzazione spaziale H3

Utilizziamo l'indicizzazione spaziale H3 per dividere la città di Londra in una griglia uniforme di celle esagonali (risoluzione 8, circa 0,7 km²). Aggregando i dati di Places Insights in queste celle, possiamo applicare il nostro modello addestrato a ogni quartiere, identificando le aree ad alto potenziale che corrispondono al profilo ambientale dei tuoi siti con il rendimento migliore.

Esegui la query di prospezione

Per generare questa griglia, utilizziamo la funzione PLACES_COUNT_PER_H3 fornita dal set di dati Places Insights (scopri di più su come eseguire query su Places Insights utilizzando le funzioni Places Count). Questa funzione calcola i conteggi dei PDI per le celle della griglia H3 in una singola operazione.

Esegui la seguente query SQL per eseguire tre passaggi in una singola esecuzione:

  1. Indicizzazione e conteggio H3: chiamiamo PLACES_COUNT_PER_H3 utilizzando un oggetto di configurazione JSON per trovare tutti i luoghi operativi in un raggio di 25 km dal centro di Londra. Eseguiamo query separate per ogni tipo di servizio (palestre, scuole e così via) e le combiniamo utilizzando UNION ALL.
  2. Pivot (feature engineering): poiché il nostro modello di machine learning prevede colonne di caratteristiche distinte (come gym_count e restaurant_count), raggruppiamo le celle e utilizziamo l'aggregazione condizionale (SUM(IF(...))) per pivotare i dati nello schema corretto.
  3. Previsione:inseriamo queste funzionalità della griglia pivot direttamente nella funzione ML.PREDICT per generare un punteggio di rendimento per ogni quartiere.
WITH combined_counts AS (
    -- Gyms
    SELECT h3_cell_index, geography, count, 'gym' AS type
    FROM `places_insights___gb.PLACES_COUNT_PER_H3`(
        JSON_OBJECT(
            'geography', ST_BUFFER(ST_GEOGPOINT(-0.1278, 51.5074), 25000), -- 25km radius around London
            'h3_resolution', 8,
            'business_status', ['OPERATIONAL'],
            'types', ['gym']
        )
    )
    UNION ALL
    -- Restaurants
    SELECT h3_cell_index, geography, count, 'restaurant' AS type
    FROM `places_insights___gb.PLACES_COUNT_PER_H3`(
        JSON_OBJECT(
            'geography', ST_BUFFER(ST_GEOGPOINT(-0.1278, 51.5074), 25000),
            'h3_resolution', 8,
            'business_status', ['OPERATIONAL'],
            'types', ['restaurant']
        )
    )
    UNION ALL
    -- Schools
    SELECT h3_cell_index, geography, count, 'school' AS type
    FROM `places_insights___gb.PLACES_COUNT_PER_H3`(
        JSON_OBJECT(
            'geography', ST_BUFFER(ST_GEOGPOINT(-0.1278, 51.5074), 25000),
            'h3_resolution', 8,
            'business_status', ['OPERATIONAL'],
            'types', ['school']
        )
    )
    UNION ALL
    -- Transit Stations
    SELECT h3_cell_index, geography, count, 'transit_station' AS type
    FROM `places_insights___gb.PLACES_COUNT_PER_H3`(
        JSON_OBJECT(
            'geography', ST_BUFFER(ST_GEOGPOINT(-0.1278, 51.5074), 25000),
            'h3_resolution', 8,
            'business_status', ['OPERATIONAL'],
            'types', ['transit_station']
        )
    )
    UNION ALL
    -- Clothing Stores
    SELECT h3_cell_index, geography, count, 'clothing_store' AS type
    FROM `places_insights___gb.PLACES_COUNT_PER_H3`(
        JSON_OBJECT(
            'geography', ST_BUFFER(ST_GEOGPOINT(-0.1278, 51.5074), 25000),
            'h3_resolution', 8,
            'business_status', ['OPERATIONAL'],
            'types', ['clothing_store']
        )
    )
),
aggregated_features AS (
    -- Pivot the stacked rows back into standard feature columns for the ML Model
    SELECT
        h3_cell_index AS h3_index,
        ANY_VALUE(geography) AS h3_geography,
        SUM(IF(type = 'gym', count, 0)) AS gym_count,
        SUM(IF(type = 'restaurant', count, 0)) AS restaurant_count,
        SUM(IF(type = 'school', count, 0)) AS school_count,
        SUM(IF(type = 'transit_station', count, 0)) AS transit_count,
        SUM(IF(type = 'clothing_store', count, 0)) AS clothing_store_count
    FROM
        combined_counts
    GROUP BY
        h3_cell_index
)

-- Feed the pivoted features into the model
SELECT
    h3_index,
    predicted_store_performance,
    h3_geography,
    gym_count,
    restaurant_count
FROM
    ML.PREDICT(MODEL `your_project.your_dataset.site_performance_model`,
      (SELECT * FROM aggregated_features)
    )
ORDER BY
    predicted_store_performance DESC;

Interpretare i risultati

La query restituisce una tabella in cui ogni riga rappresenta un'area esagonale di Londra.

  • h3_index: l'identificatore univoco della cella esagonale.
  • predicted_store_performance: il punteggio stimato del modello per un sito situato in questa cella, basato esclusivamente sull'ambiente circostante.
  • h3_geography: la geometria poligonale della cella, che utilizzeremo per la visualizzazione nel passaggio successivo.

Valori elevati indicano aree in cui la densità di scuole, palestre e trasporti corrisponde ai pattern riscontrati intorno ai tuoi siti esistenti di maggior successo.

Visualizzare la mappa della prospezione

Per rendere i dati utilizzabili, visualizza i risultati su una mappa. Mentre l'output tabellare fornisce i punteggi grezzi, una mappa rivela cluster spaziali e corridoi di alto potenziale che non sono evidenti in un elenco.

Nel notebook di accompagnamento, utilizziamo la libreria geopandas per analizzare la geometria del poligono H3 e folium per eseguire il rendering di una mappa interattiva.

Il risultato è una mappa coropletica in cui ogni cella esagonale è colorata in base al punteggio previsto.

immagine

Interpretare la mappa:

  • Hotspot (gialli/verdi): queste aree hanno punteggi di rendimento previsti elevati. Hanno la densità ottimale di scuole, palestre e mezzi di trasporto che corrisponde a quella dei tuoi siti di successo. Questi sono i candidati ideali per la selezione di nuovi siti.
  • Zone fredde (viola): queste aree non dispongono delle caratteristiche ambientali di supporto che si trovano vicino ai tuoi contenuti con il rendimento migliore.
  • Ispezione interattiva:nell'ambiente del notebook, puoi passare il mouse sopra qualsiasi cella per visualizzare i conteggi specifici dei servizi (ad es. "Palestre: 12") che hanno contribuito a quel punteggio specifico.

Conclusione

Hai combinato correttamente i dati operativi interni con Places Insights per diagnosticare il rendimento del sito. Analizzando i pesi del modello, hai identificato le caratteristiche specifiche del quartiere che sono correlate alle tue metriche esistenti. Utilizzando l'indicizzazione spaziale H3, hai ampliato questa analisi da poche centinaia di siti a migliaia di potenziali quartieri di Londra.

Azioni successive

  • Espandi il feature engineering:aggiungi tipi di luoghi più specifici alla query per acquisire i fattori di nicchia del traffico pedonale.
  • Esplora modelli avanzati: mentre la regressione lineare fornisce una spiegabilità chiara, prova BOOSTED_TREE_REGRESSOR in BigQuery ML in combinazione con una strategia di convalida incrociata appropriata per acquisire relazioni non lineari.
  • Rendere operativa la mappa:esporta i risultati della griglia H3 in una dashboard personalizzata utilizzando l'API Maps JavaScript per condividere queste informazioni con il tuo team.

Collaboratori