Condividi tramite


Esercitazione: analizzare le dipendenze funzionali in un modello semantico

In questa esercitazione ci si basa sul lavoro svolto in precedenza da un analista di Power BI e archiviato sotto forma di modelli semantici (set di dati di Power BI). Usando SemPy (anteprima) nell'esperienza di Synapse Data Science all'interno di Microsoft Fabric, si analizzano le dipendenze funzionali presenti nelle colonne di un DataFrame. Questa analisi consente di individuare problemi di qualità dei dati non intermedi per ottenere informazioni più accurate.

In questa esercitazione apprenderai a:

  • Applicare le conoscenze del dominio per formulare ipotesi sulle dipendenze funzionali in un modello semantico.
  • Familiarizzare con i componenti del collegamento semantico della libreria Python (SemPy) che supportano l'integrazione con Power BI e consentono di automatizzare l'analisi della qualità dei dati. Questi componenti includono:
    • FabricDataFrame: una struttura simile a pandas migliorata con informazioni semantiche aggiuntive.
    • Funzioni utili per il pull di modelli semantici da un'area di lavoro Fabric nel tuo notebook.
    • Funzioni utili che automatizzano la valutazione delle ipotesi sulle dipendenze funzionali e che identificano le violazioni delle relazioni nei modelli semantici.

Prerequisiti

Seguire la procedura nel notebook

Il notebook powerbi_dependencies_tutorial.ipynb accompagna questa esercitazione.

Per aprire il notebook di accompagnamento per questa esercitazione, seguire le istruzioni riportate in Preparare il sistema per le esercitazioni di data science per importare il notebook nell'area di lavoro.

Se si preferisce copiare e incollare il codice da questa pagina, è possibile creare un nuovo notebook.

Assicurarsi di collegare un lakehouse al notebook prima di iniziare a eseguire il codice.

Configurare il notebook

In questa sezione viene configurato un ambiente notebook con i moduli e i dati necessari.

  1. Installare SemPy da PyPI usando la funzionalità di installazione in linea %pip all'interno del notebook:

    %pip install semantic-link
    
  2. Eseguire le importazioni necessarie di moduli che serviranno in un secondo momento:

    import sempy.fabric as fabric
    from sempy.dependencies import plot_dependency_metadata
    

Caricare e pre-elaborare i dati

Questa esercitazione usa un modello semantico di esempio standard Customer Profitability Sample.pbix. Per una descrizione del modello semantico, vedere Esempio di redditività dei clienti per Power BI.

  1. Caricare i dati di Power BI in FabricDataFrames usando la funzione read_table di SemPy:

    dataset = "Customer Profitability Sample"
    customer = fabric.read_table(dataset, "Customer")
    customer.head()
    
  2. Caricare la tabella State in un FabricDataFrame:

    state = fabric.read_table(dataset, "State")
    state.head()
    

    Mentre l'output di questo codice è simile a un DataFrame pandas, è stata effettivamente inizializzata una struttura di dati denominata FabricDataFrame che supporta alcune operazioni utili oltre a pandas.

  3. Verificare il tipo di dati di customer:

    type(customer)
    

    L'output conferma che customer è di tipo sempy.fabric._dataframe._fabric_dataframe.FabricDataFrame.`

  4. Unire i DataFrame customer e state:

    customer_state_df = customer.merge(state, left_on="State", right_on="StateCode",  how='left')
    customer_state_df.head()
    

Identificare le dipendenze funzionali

Una dipendenza funzionale si manifesta come una relazione uno-a-molti tra i valori in due o più colonne all'interno di un DataFrame. Queste relazioni possono essere usate per rilevare automaticamente i problemi di qualità dei dati.

  1. Eseguire la funzione find_dependencies di SemPy nel DataFrame unito per identificare eventuali dipendenze funzionali esistenti tra i valori nelle colonne:

    dependencies = customer_state_df.find_dependencies()
    dependencies
    
  2. Visualizzare le dipendenze identificate usando la funzione plot_dependency_metadata di SemPy:

    plot_dependency_metadata(dependencies)
    

    Screenshot che mostra il tracciato dei metadati delle dipendenze.

    Come previsto, il grafico delle dipendenze funzionali mostra che la colonna Customer determina alcune colonne come City, Postal Code e Name.

    Sorprendentemente, il grafico non mostra una dipendenza funzionale tra City e Postal Code, probabilmente perché esistono molte violazioni nelle relazioni tra le colonne. È possibile usare la funzione plot_dependency_violations di SemPy per visualizzare le violazioni delle dipendenze tra colonne specifiche.

Esplorare i dati per i problemi di qualità

  1. Disegnare un grafico con la funzione di visualizzazione plot_dependency_violations di SemPy.

    customer_state_df.plot_dependency_violations('Postal Code', 'City')
    

    Screenshot che mostra il tracciato delle violazioni delle dipendenze.

    Il tracciato delle violazioni delle dipendenze mostra i valori per Postal Code sul lato sinistro e i valori per City sul lato destro. Una linea collega un Postal Code sul lato sinistro del tracciato a una City sul lato destro dello stesso, se esiste almeno una riga che contiene entrambi i valori. Le linee vengono annotate con il conteggio delle righe corrispondenti. Ad esempio, ci sono due righe con codice postale 20004, una con città "North Tower" e l'altra con città "Washington".

    Inoltre, il tracciato mostra alcune violazioni e molti valori vuoti.

  2. Confermare il numero di valori vuoti per Postal Code:

    customer_state_df['Postal Code'].isna().sum()
    

    50 righe hanno NA per il codice postale.

  3. Eliminare righe con valori vuoti. Trovare quindi le dipendenze usando la funzione find_dependencies. Si noti il parametro aggiuntivo verbose=1 che offre un'occhiata ai lavori interni di SemPy:

    customer_state_df2=customer_state_df.dropna()
    customer_state_df2.find_dependencies(verbose=1)
    

    L'entropia condizionale per Postal Code e City è 0,049. Questo valore indica che sono presenti violazioni delle dipendenze funzionali. Prima di correggere le violazioni, aumentare la soglia sull'entropia condizionale dal valore predefinito di 0.01 a 0.05, solo per visualizzare le dipendenze. Le soglie inferiori comportano un minor numero di dipendenze (o una selettività superiore).

  4. Aumentare la soglia per l'entropia condizionale dal valore predefinito di 0.01 a 0.05:

    plot_dependency_metadata(customer_state_df2.find_dependencies(threshold=0.05))
    

    Tracciato dei metadati delle dipendenze con una soglia superiore per l'entropia.

    Se si applica la conoscenza del dominio di quale entità determina i valori di altre entità, questo grafico delle dipendenze sembra accurato.

  5. Esplorare altri problemi di qualità dei dati rilevati. Ad esempio, una freccia tratteggiata unisce City e Region, il che indica che la dipendenza è solo approssimativa. Questa relazione approssimativa potrebbe implicare che esiste una dipendenza funzionale parziale.

    customer_state_df.list_dependency_violations('City', 'Region')
    
  6. Esaminare in modo più approfondito ognuno dei casi in cui un valore nonempty Region causa una violazione:

    customer_state_df[customer_state_df.City=='Downers Grove']
    

    Il risultato mostra la città di Downers Grove presente in Illinois e Nebraska. Tuttavia, Downer's Grove è una città dell'Illinois, non del Nebraska.

  7. Dai un'occhiata alla città di Fremont:

    customer_state_df[customer_state_df.City=='Fremont']
    

    C'è una città chiamata Fremont in California. Tuttavia, per il Texas, il motore di ricerca restituisce Premont, non Fremont.

  8. È anche sospetto vedere le violazioni della dipendenza tra Name e Country/Region, come indicato dalla linea punteggiata nel grafico originale delle violazioni delle dipendenze (prima di eliminare le righe con valori vuoti).

    customer_state_df.list_dependency_violations('Name', 'Country/Region')
    

    Sembra che un cliente, SDI Design sia presente in due aree, Stati Uniti e Canada. Questa occorrenza può non essere una violazione semantica, ma può essere semplicemente un caso non comune. Comunque, vale la pena dare un'occhiata:

  9. Esaminare più in dettaglio al cliente SDI Design:

    customer_state_df[customer_state_df.Name=='SDI Design']
    

    Un'ulteriore ispezione mostra che sono in realtà due clienti diversi (da settori diversi) con lo stesso nome.

L'analisi esplorativa dei dati è un processo interessante e lo è anche la pulizia dei dati. C'è sempre qualcosa che i dati nascondono, a seconda di come si esaminano, cosa si vuole chiedere e così via. Il collegamento semantico offre nuovi strumenti che è possibile usare per ottenere di più con i dati.

Vedere altre esercitazioni per il collegamento semantico/SemPy: