Compartilhar via


Tutorial: Analisar dependências funcionais em um modelo semântico

Neste tutorial, você se baseia em trabalhos anteriores feitos por um analista do Power BI e armazenados na forma de modelos semânticos (Power BI). Ao usar o SemPy (versão prévia) na experiência de Ciência de Dados do Synapse no Microsoft Fabric, você analisa as dependências funcionais que existem em colunas de um DataFrame. Essa análise ajuda a descobrir problemas de qualidade de dados não triviais para obter insights mais precisos.

Neste tutorial, você aprenderá a:

  • Aplique conhecimento de domínio para formular hipóteses sobre dependências funcionais em um modelo semântico.
  • Familiarize-se com os componentes da biblioteca Python do link semântico (SemPy) que dão suporte à integração com o Power BI e ajudam a automatizar a análise da qualidade dos dados. Esses componentes incluem:
    • FabricDataFrame - uma estrutura semelhante a pandas aprimorada com informações semânticas adicionais.
    • Funções úteis para extrair modelos semânticos de um workspace do Fabric para o seu notebook.
    • Funções úteis que automatizam a avaliação de hipóteses sobre as dependências funcionais e que identificam as violações de relações nos modelos semânticos.

Pré-requisitos

Acompanhar no notebook

O notebook powerbi_dependencies_tutorial.ipynb acompanha este tutorial.

Para abrir o notebook que acompanha este tutorial, siga as instruções em Preparar seu sistema para tutoriais de ciência de dados para importar os notebooks para seu workspace.

Se preferir copiar e colar o código a partir dessa página, você poderá criar um novo notebook.

Certifique-se de anexar um lakehouse ao notebook antes de começar a executar o código.

Configurar o notebook

Nesta seção, você configura um ambiente de notebook com os módulos e dados necessários.

  1. Instale SemPy por meio do PyPI usando a funcionalidade de instalação em linha %pip dentro do notebook:

    %pip install semantic-link
    
  2. Execute as importações necessárias de módulos que você precisará mais tarde:

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

Carregar e pré-processar os dados

Este tutorial usa um modelo semântico de exemplo padrão Customer Profitability Sample.pbix. Para obter uma descrição do modelo semântico, confira o Exemplo de Rentabilidade do Cliente para o Power BI.

  1. Carregue os dados do Power BI em FabricDataFrames usando a função SemPy read_table:

    dataset = "Customer Profitability Sample"
    customer = fabric.read_table(dataset, "Customer")
    customer.head()
    
  2. Carregue a tabela State em um FabricDataFrame:

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

    Embora a saída desse código pareça um DataFrame pandas, você realmente inicializou uma estrutura de dados chamada FabricDataFrame que dá suporte a algumas operações úteis sobre pandas.

  3. Verifique o tipo de dados de customer:

    type(customer)
    

    A saída confirma que customer é do tipo sempy.fabric._dataframe._fabric_dataframe.FabricDataFrame.`

  4. Ingressar no DataFrames customer e state:

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

Identificar dependências funcionais

Uma dependência funcional se manifesta como uma relação um-para-muitos entre os valores em duas (ou mais) colunas em um DataFrame. Essas relações podem ser usadas para detectar automaticamente problemas de qualidade de dados.

  1. Execute a função SemPy find_dependencies no DataFrame mesclado para identificar quaisquer dependências funcionais existentes entre valores nas colunas:

    dependencies = customer_state_df.find_dependencies()
    dependencies
    
  2. Visualize as dependências identificadas usando a função SemPy plot_dependency_metadata:

    plot_dependency_metadata(dependencies)
    

    Captura de tela que mostra o gráfico de metadados de dependências.

    Como esperado, o grafo de dependências funcionais mostra que a coluna Customer determina algumas colunas como City, Postal Code e Name.

    Surpreendentemente, o grafo não mostra uma dependência funcional entre City e Postal Code, provavelmente, porque há muitas violações nas relações entre as colunas. Você pode usar a função SemPy plot_dependency_violations para visualizar violações de dependências entre colunas específicas.

Explorar os dados para problemas de qualidade

  1. Desenhe um grafo com a função de visualização plot_dependency_violations do SemPy.

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

    Captura de tela que mostra o gráfico de violações de dependência.

    O gráfico de violações de dependência mostra valores para Postal Code no lado esquerdo e valores para City no lado direito. Uma borda conecta um Postal Code no lado esquerdo com um City no lado direito se houver uma linha que contenha esses dois valores. As bordas são anotadas com a contagem dessas linhas. Por exemplo, há duas linhas com o código postal 20004, uma com a cidade "North Tower" e outra com a cidade "Washington".

    Além disso, o gráfico mostra algumas violações e muitos valores vazios.

  2. Confirme o número de valores vazios para Postal Code:

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

    50 linhas têm NA para código postal.

  3. Solte linhas com valores vazios. Em seguida, localize dependências usando a função find_dependencies. Observe o parâmetro extra verbose=1 que oferece uma visão rápida do funcionamento interno do SemPy:

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

    A entropia condicional para Postal Code e City é 0,049. Esse valor indica que há violações de dependência funcional. Antes de corrigir as violações, eleve o limite de entropia condicional do valor padrão de 0.01 para 0.05, apenas para ver as dependências. Limites inferiores resultam em menos dependências (ou maior seletividade).

  4. Aumente o limite na entropia condicional do valor padrão de 0.01 para 0.05:

    plot_dependency_metadata(customer_state_df2.find_dependencies(threshold=0.05))
    

    Gráfico dos metadados de dependências com um limiar mais alto para entropia.

    Se você aplicar o conhecimento de domínio de qual entidade determina valores de outras entidades, esse grafo de dependências parece preciso.

  5. Explore mais problemas de qualidade de dados detectados. Por exemplo, uma seta tracejada une City e Region, que indica que a dependência é apenas aproximada. Essa relação aproximada pode implicar que há uma dependência funcional parcial.

    customer_state_df.list_dependency_violations('City', 'Region')
    
  6. Dê uma olhada mais de perto em cada um dos casos em que um valor Region não inteiro causa uma violação:

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

    O resultado mostra a cidade de Downer's Grove ocorrendo em Illinois e Nebraska. No entanto, Downer's Grove é uma cidade em Illinois, não Nebraska.

  7. Dê uma olhada na cidade de Fremont:

    customer_state_df[customer_state_df.City=='Fremont']
    

    Há uma cidade chamada Fremont na Califórnia. No entanto, para o Texas, o mecanismo de busca retorna Premont, não Fremont.

  8. Também é suspeito ver violações da dependência entre Name e Country/Region, conforme especificado pela linha pontilhada no grafo original de violações de dependência (antes de remover as linhas com valores vazios).

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

    Parece que um cliente, o Design SDI está presente em duas regiões: Estados Unidos e Canadá. Essa ocorrência pode não ser uma violação semântica, mas pode ser apenas um caso incomum. Ainda assim, vale a pena dar uma olhada de perto:

  9. Dê uma olhada mais de perto no Design SDI do cliente:

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

    Uma inspeção adicional mostra que na verdade são dois clientes diferentes (de setores diferentes) com o mesmo nome.

A análise de dados exploratórios é um processo interessante, assim como a limpeza de dados. Há sempre algo que os dados estão ocultando, dependendo de como você olha para ele, o que você quer perguntar e assim por diante. O link semântico fornece novas ferramentas que você pode utilizar para obter mais resultados com seus dados.

Faça o check-out de outros tutoriais sobre link semântico / SemPy: