Tutorial: Analisar dependências funcionais em um modelo semântico
Neste tutorial, você se baseia em um trabalho anterior feito por um analista do Power BI e armazenado na forma de modelos semânticos (conjuntos de dados do Power BI). Usando 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ãotriviais 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 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 de qualidade de 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 espaço de trabalho do Fabric para o notebook.
- Funções úteis que automatizam a avaliação de hipóteses sobre dependências funcionais e que identificam violações de relações em seus modelos semânticos.
Pré-requisitos
Obtenha uma assinatura do Microsoft Fabric. Ou inscreva-se para experimentar gratuitamente o Microsoft Fabric .
Entre no Microsoft Fabric.
Use o botão de alternância de experiência no canto inferior esquerdo da página inicial para mudar para o Fabric.
Selecione Workspaces no painel de navegação esquerdo para localizar e selecionar seu workspace. Esse espaço de trabalho se torna o seu espaço de trabalho atual.
Baixe o modelo semântico Customer Profitability Sample.pbix do repositório GitHub de exemplos do Fabric.
Em seu workspace, selecione Importar>Relatório ou Relatório Paginado>Deste computador para carregar o arquivo Customer Profitability Sample.pbix para seu workspace.
Acompanhar no notebook
O notebook powerbi_dependencies_tutorial.ipynb acompanha este tutorial.
Para abrir o bloco de anotações que acompanha este tutorial, siga as instruções em Preparar seu sistema para tutoriais de ciência de dados para importar o bloco de anotações para sua área de trabalho.
Se você prefere copiar e colar o código desta página, pode criar um 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ê configurará um ambiente de notebook com os módulos e dados necessários.
Instale
SemPy
do PyPI usando o recurso de instalação%pip
em linha dentro do notebook:%pip install semantic-link
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, consulte exemplo de Rentabilidade do Cliente para o Power BI.
Carregue os dados do Power BI no FabricDataFrames usando a função
read_table
do SemPy:dataset = "Customer Profitability Sample" customer = fabric.read_table(dataset, "Customer") customer.head()
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ê de fato inicializou uma estrutura de dados chamada
FabricDataFrame
, que dá suporte a algumas operações úteis com pandas.Verifique o tipo de dados de
customer
:type(customer)
A saída confirma que
customer
é do tiposempy.fabric._dataframe._fabric_dataframe.FabricDataFrame
.'Ingresse os DataFrames
customer
estate
: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.
Execute a função
find_dependencies
do SemPy no DataFrame mesclado para identificar quaisquer dependências funcionais existentes entre valores nas colunas:dependencies = customer_state_df.find_dependencies() dependencies
Visualize as dependências identificadas usando a função
plot_dependency_metadata
do SemPy:plot_dependency_metadata(dependencies)
Como esperado, o grafo de dependências funcionais mostra que a coluna
Customer
determina algumas colunas comoCity
,Postal Code
eName
.Surpreendentemente, o grafo não mostra uma dependência funcional entre
City
ePostal Code
, provavelmente porque há muitas violações nas relações entre as colunas. Você pode usar a funçãoplot_dependency_violations
do SemPy para visualizar violações de dependências entre colunas específicas.
Verificar os dados para questões de qualidade
Desenhe um grafo com a função de visualização
plot_dependency_violations
do SemPy.customer_state_df.plot_dependency_violations('Postal Code', 'City')
O gráfico de violações de dependência mostra valores para
Postal Code
no lado esquerdo e valores paraCity
no lado direito. Uma borda conecta umPostal Code
no lado esquerdo com umCity
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.
Confirme o número de valores vazios para
Postal Code
:customer_state_df['Postal Code'].isna().sum()
50 linhas têm NA como código postal.
Remova linhas com valores vazios. Em seguida, localize dependências usando a função
find_dependencies
. Observe o parâmetro extraverbose=1
que oferece um vislumbre 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
eCity
é 0,049. Esse valor indica que há violações de dependência funcional. Antes de corrigir as violações, aumente o limite de entropia condicional do valor padrão de0.01
para0.05
, apenas para ver as dependências. Limites inferiores resultam em menos dependências (ou maior seletividade).Aumente o limite na entropia condicional do valor padrão de
0.01
para0.05
:plot_dependency_metadata(customer_state_df2.find_dependencies(threshold=0.05))
Se você aplicar o conhecimento de domínio de qual entidade determina valores de outras entidades, esse grafo de dependências parece preciso.
Explore mais problemas de qualidade de dados detectados. Por exemplo, uma seta tracejada une
City
eRegion
, o 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')
Dê uma olhada mais de perto em cada um dos casos em que um valor de
Region
não inteiro causa uma violação:customer_state_df[customer_state_df.City=='Downers Grove']
O resultado mostra a cidade de Downers Grove ocorrendo em Illinois e Nebraska. No entanto, Downer's Grove é uma cidade em Illinois, não Nebraska.
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 pesquisa retorna Premont, não Fremont.
Também é suspeito ver violações da dependência entre
Name
eCountry/Region
, conforme indicado 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, SDI Design 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:
Examine mais de perto no Design de 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 usar para obter mais com seus dados.
Conteúdo relacionado
Confira outros tutoriais para link semântico/SemPy:
- Tutorial : Limpar Dados com Dependências Funcionais
- Tutorial: Extrair e calcular medidas do Power BI de um Jupyter Notebook
- Tutorial: descobrir relações em um modelo semântico usando o link semântico
- Tutorial: descobrir relações no conjunto de dados do Synthea usando o link semântico
- Tutorial : validar dados usando SemPy e grandes expectativas (GX)