Compartilhar via


Tutorial: Limpar dados com dependências funcionais

Use dependências funcionais para limpar dados. Existe uma dependência funcional quando uma coluna em um modelo semântico (um conjunto de dados do Power BI) depende de outra coluna. Por exemplo, uma ZIP code coluna pode determinar o valor em uma city coluna. Uma dependência funcional aparece como uma relação um-para-muitos entre valores em duas ou mais colunas em um DataFrame. Este tutorial usa o conjunto de dados do Synthea para mostrar como as dependências funcionais ajudam a detectar problemas de qualidade de dados.

Neste tutorial, você aprenderá a:

  • Aplique conhecimento de domínio para formar hipóteses sobre dependências funcionais em um modelo semântico.
  • Familiarize-se com os componentes da semântica biblioteca Python (SemPy) que automatizam a análise de qualidade de dados. Esses componentes incluem:
    • FabricDataFrame— uma estrutura semelhante a pandas com informações semânticas adicionais.
    • Funções que automatizam a avaliação de hipóteses sobre dependências funcionais e identificam violações em seus modelos semânticos.

Pré-requisitos

  • Selecione Workspaces no painel de navegação e selecione seu workspace para defini-lo como o workspace atual.

Acompanhar no notebook

Use o notebook data_cleaning_functional_dependencies_tutorial.ipynb para seguir este tutorial.

Configurar o notebook

Nesta seção, você configurará um ambiente de notebook.

  1. Verifique sua versão do Spark. Se você estiver usando o Spark 3.4 ou posterior no Microsoft Fabric, o Link Semântico será incluído por padrão, portanto, você não precisará instalá-lo. Se você estiver usando o Spark 3.3 ou anterior ou quiser atualizar para o Link Semântico mais recente, execute o comando a seguir.

    %pip install -U semantic-link
    
  2. Importe os módulos que você usa neste notebook.

    import pandas as pd
    import sempy.fabric as fabric
    from sempy.fabric import FabricDataFrame
    from sempy.dependencies import plot_dependency_metadata
    
  3. Baixe os dados de exemplo. Neste tutorial, use o conjunto de dados synthea de registros médicos sintéticos (versão pequena para simplificar).

    download_synthea(which='small')
    

Explorar os dados

  1. Inicialize um FabricDataFrame com o conteúdo do arquivo providers.csv .

    providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv"))
    providers.head()
    
  2. Verifique se há problemas de qualidade de dados com a função do find_dependencies SemPy plotando um grafo de dependências funcionais detectadas automaticamente.

    deps = providers.find_dependencies()
    plot_dependency_metadata(deps)
    

    Captura de tela de um grafo de dependência funcional mostrando que a ID determina NOME e ORGANIZAÇÃO.

    O grafo mostra que Id determina NAME e ORGANIZATION. Esse resultado é esperado porque Id é exclusivo.

  3. Confirme se isso Id é exclusivo.

    providers.Id.is_unique
    

    O código retorna True para confirmar se o Id é exclusivo.

Analisar as dependências funcionais em profundidade

O grafo de dependências funcionais também mostra que ORGANIZATION determina ADDRESS e ZIP, conforme o esperado. No entanto, você pode esperar que ZIP também determine CITY, mas a seta tracejada indica que a dependência é apenas aproximada, apontando para um problema de qualidade de dados.

Há outras peculiaridades no grafo. Por exemplo, NAME não determina GENDER, Id, SPECIALITYou ORGANIZATION. Cada uma dessas peculiaridades pode valer a pena investigar.

  1. Examine mais detalhadamente a relação aproximada entre ZIP e CITY usando a função do list_dependency_violations SemPy para listar as violações:
providers.list_dependency_violations('ZIP', 'CITY')
  1. Desenhe um grafo com a função de visualização plot_dependency_violations do SemPy. Esse grafo será útil se o número de violações for pequeno:
providers.plot_dependency_violations('ZIP', 'CITY')

Captura de tela do gráfico de violações de dependência.

O gráfico de violações de dependência mostra valores para ZIP o lado esquerdo e valores para CITY o lado direito. Uma aresta conecta um CEP no lado esquerdo do diagrama com uma cidade 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 CEP 02747-1242, uma linha com a cidade "NORTH DARTHMOUTH" e a outra com a cidade "DARTHMOUTH", como mostrado no gráfico anterior e no código a seguir.

  1. Confirme as observações do gráfico executando o seguinte código:
providers[providers.ZIP == '02747-1242'].CITY.value_counts()
  1. O gráfico também mostra que, entre as linhas que têm CITY como "DARTHMOUTH", nove linhas têm um ZIP 02747-1262. Uma linha tem um ZIP 02747-1242. Uma linha tem um ZIP 02747-2537. Confirme estas observações com o seguinte código:

    providers[providers.CITY == 'DARTHMOUTH'].ZIP.value_counts()
    
  2. Há outros cep associados a "DARTMOUTH", mas esses cep não são mostrados no grafo de violações de dependência porque eles não sugerem problemas de qualidade de dados. Por exemplo, o cep "02747-4302" é associado exclusivamente a "DARTMOUTH" e não aparece no grafo de violações de dependência. Confirme executando o seguinte código:

    providers[providers.ZIP == '02747-4302'].CITY.value_counts()
    

Resumir problemas de qualidade de dados detectados com o SemPy

O grafo de violações de dependência mostra vários problemas de qualidade de dados neste modelo semântico:

  • Alguns nomes de cidade são maiúsculos. Use métodos de cadeia de caracteres para corrigir esse problema.
  • Alguns nomes de cidade têm qualificadores (ou prefixos), como "Norte" e "Leste". Por exemplo, o CEP "2128" mapeia para "EAST BOSTON" uma vez e para "BOSTON" uma vez. Um problema semelhante ocorre entre "NORTH DARTMOUTH" e "DARTMOUTH". Solte esses qualificadores ou mapeie os CEP para a cidade com a ocorrência mais comum.
  • Há erros de digitação em alguns nomes de cidade, como "PITTSFIELD" vs. "PITTSFILED" e "NEWBURGPORT" vs. "NEWBURYPORT". Para "NEWBURGPORT", corrija esse erro de digitação usando a ocorrência mais comum. Para "PITTSFIELD", com apenas uma ocorrência cada, a desambiguação automática é muito mais difícil sem conhecimento externo ou um modelo de linguagem.
  • Às vezes, prefixos como "West" são abreviados para a única letra "W". Substitua "W" por "West" se todas as ocorrências de "W" forem para "Oeste".
  • O CEP "02130" mapeia para "BOSTON" uma vez e "Jamaica Plain" uma vez. Esse problema não é fácil de corrigir. Com mais dados, mapeie para a ocorrência mais comum.

Limpar os dados

  1. Corrija a capitalização alterando valores para maiúsculas e minúsculas.

    providers['CITY'] = providers.CITY.str.title()
    
  2. Execute a detecção de violação novamente para confirmar que há menos ambiguidades.

    providers.list_dependency_violations('ZIP', 'CITY')
    

Refinar os dados manualmente ou soltar linhas que violam restrições funcionais entre colunas usando a função semPy drop_dependency_violations .

Para cada valor da variável determinante, drop_dependency_violations escolhe o valor mais comum da variável dependente e descarta todas as linhas com outros valores. Aplique essa operação somente se você estiver confiante de que essa heurística estatística leva a resultados corretos para seus dados. Caso contrário, escreva seu próprio código para lidar com as violações detectadas.

  1. Execute a drop_dependency_violations função nas colunas e ZIP nas CITY colunas.

    providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
    
  2. Listar quaisquer violações de dependência entre ZIP e CITY.

    providers_clean.list_dependency_violations('ZIP', 'CITY')
    

O código retorna uma lista vazia para indicar que não há mais violações da restrição ZIP -> CITYfuncional.

Consulte outros tutoriais para link semântico ou SemPy: