Compartir a través de


Tutorial: Análisis de dependencias funcionales en un modelo semántico

En este tutorial, va a basarse en el trabajo anterior realizado por un analista de Power BI almacenado en forma de modelos semánticos (conjuntos de datos de Power BI). Al usar SemPy (versión preliminar) en la experiencia de Ciencia de datos de Synapse en Microsoft Fabric, se analizan las dependencias funcionales que existen en columnas de un DataFrame. Este análisis ayuda a detectar problemas de calidad de datos no triviales con el fin de obtener información más precisa.

En este tutorial, aprenderá a:

  • Aplique sus conocimientos de dominio para formular hipótesis sobre las dependencias funcionales de un modelo semántico.
  • Familiarícese con los componentes de la biblioteca Python de vínculo semántico (SemPy), que admiten la integración con Power BI y le ayudarán a automatizar el análisis de calidad de los datos. Estos componentes incluyen:
    • FabricDataFrame: una estructura similar a Pandas mejorada con información semántica adicional.
    • Funciones útiles ara extraer modelos semánticos de un área de trabajo de Fabric en el cuaderno.
    • Funciones útiles que automatizan la evaluación de hipótesis sobre dependencias funcionales y que identifican infracciones de relaciones en los modelos semánticos.

Requisitos previos

Seguimiento en el cuaderno

El cuaderno powerbi_relationships_tutorial.ipynb acompaña a este tutorial.

Para abrir el cuaderno complementario para este tutorial, siga las instrucciones en Preparación del sistema para los tutoriales de ciencia de datos para importar el cuaderno en el área de trabajo.

Si prefiere copiar y pegar el código de esta página, puede crear un cuaderno nuevo.

Asegúrese de adjuntar una instancia de LakeHouse al cuaderno antes de empezar a ejecutar código.

Configuración del cuaderno

En esta sección, configurará un entorno de cuaderno con los módulos y los datos necesarios.

  1. Instale SemPy desde PyPI mediante la funcionalidad de instalación en línea %pip en el cuaderno:

    %pip install semantic-link
    
  2. Realice las importaciones necesarias de módulos que necesitará más adelante:

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

Carga y preprocesamiento de los datos

En este tutorial se usa un modelo semántico de ejemplo estándar Customer Profitability Sample.pbix. Para obtener una descripción del modelo semántico, consulte Ejemplo de rentabilidad del cliente para Power BI.

  1. Cargue los datos de Power BI en FabricDataFrames mediante la función read_table de SemPy:

    dataset = "Customer Profitability Sample"
    customer = fabric.read_table(dataset, "Customer")
    customer.head()
    
  2. Cargue la tabla State en un FabricDataFrame:

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

    Aunque la salida de este código es similar a un DataFrame de Pandas, en realidad ha inicializado una estructura de datos denominada FabricDataFrame que admite algunas operaciones útiles sobre Pandas.

  3. Compruebe el tipo de datos de customer:

    type(customer)
    

    La salida confirma que customer es de tipo sempy.fabric._dataframe._fabric_dataframe.FabricDataFrame.

  4. Únase a los DataFrames customer y state:

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

Identificación de las dependencias funcionales

Una dependencia funcional se manifiesta como una relación uno a varios entre los valores de dos (o más) columnas dentro de un DataFrame. Estas relaciones se pueden usar para detectar automáticamente problemas de calidad de datos.

  1. Ejecute la función find_dependencies de SemPy en el DataFrame combinado para identificar las dependencias funcionales existentes entre los valores de las columnas:

    dependencies = customer_state_df.find_dependencies()
    dependencies
    
  2. Visualice las dependencias identificadas mediante la función plot_dependency_metadata de SemPy:

    plot_dependency_metadata(dependencies)
    

    Captura de pantalla en la que se muestra el trazado de los metadatos de la dependencia.

    Como se esperaba, el grafo de dependencias funcionales muestra que la columna Customer determina algunas columnas como City, Postal Code y Name.

    Sorprendentemente, el grafo no muestra una dependencia funcional entre City y Postal Code, probablemente porque hay muchas infracciones en las relaciones entre las columnas. Puede usar la función plot_dependency_violations de SemPy para visualizar infracciones de dependencias entre columnas específicas.

Exploración de los datos para buscar problemas de calidad

  1. Dibuje un grafo con la función de visualización plot_dependency_violations de SemPy.

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

    Captura de pantalla en la que se muestra el trazado de infracciones de dependencia.

    El trazado de infracciones de dependencia muestra los valores de Postal Code en el lado izquierdo y los valores de City en el lado derecho. Un borde conecta un Postal Code en el lado izquierdo con una City en el lado derecho, si hay una fila que contiene estos dos valores. Los bordes se anotan con el recuento de dichas filas. Por ejemplo, hay dos filas con código postal 20004, una con la ciudad "North Tower" y la otra con la ciudad "Washington".

    Además, el trazado muestra algunas infracciones y muchos valores vacíos.

  2. Confirme el número de valores vacíos para Postal Code:

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

    50 filas tienen NA en el código postal.

  3. Quite filas con valores vacíos. A continuación, busque las dependencias mediante la función find_dependencies. Observe el parámetro adicional verbose=1 que ofrece una visión del funcionamiento interno de SemPy:

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

    La entropía condicional para Postal Code y City es 0,049. Este valor indica que hay infracciones de la dependencia funcional. Antes de corregir las infracciones, aumente el umbral de la entropía condicional del valor predeterminado de 0.01 a 0.05, solo para ver las dependencias. Los umbrales inferiores dan lugar a menos dependencias (o una mayor selectividad).

  4. Aumente el umbral de la entropía condicional del valor predeterminado de 0.01 a 0.05:

    plot_dependency_metadata(customer_state_df2.find_dependencies(threshold=0.05))
    

    Trazado de los metadatos de la dependencia con un umbral superior para la entropía.

    Si aplica conocimientos de dominio de qué entidad determina los valores de otras entidades, este grafo de dependencias parece preciso.

  5. Explore más problemas de calidad de datos detectados. Por ejemplo, una flecha discontinua combina City y Region, lo que indica que la dependencia solo es aproximada. Esta relación aproximada podría implicar que hay una dependencia funcional parcial.

    customer_state_df.list_dependency_violations('City', 'Region')
    
  6. Eche un vistazo a cada uno de los casos en los que un valor Region no vacío provoca una infracción:

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

    El resultado muestra que la ciudad de Downers Grove está en Illinois y Nebraska. Sin embargo, Downer's Grove es una ciudad de Illinois, no Nebraska.

  7. Eche un vistazo a la ciudad de Fremont:

    customer_state_df[customer_state_df.City=='Fremont']
    

    Hay una ciudad llamada Fremont en California. Sin embargo, para Texas, el motor de búsqueda devuelve Premont, no Fremont.

  8. También es sospechoso ver infracciones de la dependencia entre Name y Country/Region, como indica la línea de puntos del grafo original de infracciones de dependencia (antes de quitar las filas con valores vacíos).

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

    Parece que un cliente, SDI Design está presente en dos regiones: Estados Unidos y Canadá. Esta aparición puede no ser una infracción semántica, pero puede ser un caso poco común. Sin embargo, vale la pena echar un vistazo:

  9. Eche un vistazo al cliente SDI Design:

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

    Una inspección adicional muestra que realmente se trata de dos clientes diferentes (de diferentes sectores) con el mismo nombre.

El análisis exploratorio de datos es un proceso apasionante, al igual que la limpieza de datos. Siempre hay algo que los datos ocultan, dependiendo de cómo se miren, de lo que se quiera preguntar, etc. El vínculo semántico proporciona nuevas herramientas que puede usar para lograr más con los datos.

Consulte otros tutoriales para el vínculo semántico/SemPy: