CursosEmpresasBlogLiveConfPrecios

Scatterplot con valores faltantes

Clase 16 de 21 • Curso de Manejo de Datos Faltantes: Detección y Exploración

Contenido del curso

Introducción a los valores faltantes

  • 1
    ¿Por qué explorar y lidiar con valores faltantes?

    ¿Por qué explorar y lidiar con valores faltantes?

    06:59 min
  • 2
    Operaciones con valores faltantes

    Operaciones con valores faltantes

    13:52 min
  • 3
    Conociendo datasets para manejo de datos faltantes

    Conociendo datasets para manejo de datos faltantes

    09:01 min
  • 4
    Ejecución de Notebooks en Deepnote con %run

    Ejecución de Notebooks en Deepnote con %run

    01:07 min
  • 5
    Extendiendo la API de Pandas

    Extendiendo la API de Pandas

    14:03 min
  • 6
    Tabulación de valores faltantes

    Tabulación de valores faltantes

    16:58 min
  • 7
    Visualización de valores faltantes

    Visualización de valores faltantes

    12:04 min

Manipulación inicial de valores faltantes

  • 8
    Codificación de valores faltantes

    Codificación de valores faltantes

    13:10 min
  • 9
    Conversión de valores faltantes implícitos en explícitos

    Conversión de valores faltantes implícitos en explícitos

    08:57 min
  • 10
    Exponer filas faltantes implícitas en explícitas

    Exponer filas faltantes implícitas en explícitas

    07:59 min
  • 11
    Tipos de valores faltantes

    Tipos de valores faltantes

    05:51 min
  • 12
    MCAR, MAR, MNAR en Python

    MCAR, MAR, MNAR en Python

    08:51 min

Búsqueda de relaciones de valores faltantes

  • 13
    Matriz de sombras: shadow matrix

    Matriz de sombras: shadow matrix

    14:34 min
  • 14
    Visualización de valores faltantes en una variable

    Visualización de valores faltantes en una variable

    10:06 min
  • 15
    Visualización de valores faltantes en dos variables

    Visualización de valores faltantes en dos variables

    10:00 min
  • 16
    Scatterplot con valores faltantes

    Scatterplot con valores faltantes

    Viendo ahora
  • 17
    Correlación de nulidad

    Correlación de nulidad

    07:00 min

Tratamiento de valores faltantes

  • 18
    Eliminación de valores faltantes: pairwise y listwise

    Eliminación de valores faltantes: pairwise y listwise

    14:28 min
  • 19
    Imputación básica de datos

    Imputación básica de datos

    10:53 min
  • 20
    Bonus: visualización múltiple de imputaciones

    Bonus: visualización múltiple de imputaciones

    07:50 min

Cierre de curso

  • 21
    Continúa aprendiendo sobre el manejo de valores faltantes

    Continúa aprendiendo sobre el manejo de valores faltantes

    03:21 min
Tomar examen

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads

      Comentarios

        Jeinfferson Bernal G

        Jeinfferson Bernal G

        student•
        hace 3 años

        Codigo de la grafica de dos variables con valores faltantes

        ( riskfactors_df .select_dtypes( exclude='category' # excluye las variables categoricas ) .pipe( lambda df: df[df.columns[df.isna().any()]] #seleccionar solo columnas que tengan valores faltantes ) .missing.bind_shadow_matrix(true_string = True, false_string = False) .apply( lambda column: column if '_NA' in column.name else column_fill_with_dummies(column, proportion_below=0.05, jitter=0.075) ) .assign( nullity = lambda df: df.weight_lbs_NA | df.height_inch_NA ) .pipe( lambda df: ( sns.scatterplot( data = df, x='weight_lbs', y= 'height_inch', hue='nullity' ) ) ) )
        graph33.jpg
          Neicer Vásquez

          Neicer Vásquez

          student•
          hace 2 años

          También, puedes usar otra alternativa a la manera de obtener las columnas que tienen valores faltantes.

          df.columns[df.isna().sum() > 0]
        Alfonso Andres Zapata Guzman

        Alfonso Andres Zapata Guzman

        student•
        hace 3 años
        • Si mejoran el codigo, colocar en una respuesta para yo tambien tomar el codigo y mejorar mis funciones, si pueden tambien documenten aun mejor las funciones de la manera mas clara y concisa para que sea mas entendible lo que hacen.
        • Para ejecutar el en cuaderno jupyter
        ( riskfactors_df .missing.missing_scatterplot_with_dummies( columns_NA1='weight_lbs_NA', columns_NA2='height_inch_NA', x='weight_lbs', y='height_inch' ) )

        Colocar esto en el area del archivo para extender las funciones:

        #metodo para obtener relleno de columna con dummies, para usar en funcion de scatterplot def column_fill_with_dummies( self, column: pd.Series, proportion_below: float=0.10, jitter: float=0.075, seed: int=42 ) -> pd.Series: column = column.copy(deep=True) # Extract values metadata. missing_mask = column.isna() number_missing_values = missing_mask.sum() column_range = column.max() - column.min() # Shift data column_shift = column.min() - column.min() * proportion_below # Create the "jitter" (noise) to be added around the points. np.random.seed(seed) column_jitter = (np.random.rand(number_missing_values) - 2) * column_range * jitter # Save new dummy data. column[missing_mask] = column_shift + column_jitter return column

        Y la parte importante:

        #metodo para visualizar valores NA y !NA desde una tabla a la que se relleno con dummies def missing_scatterplot_with_dummies( self, columns_NA1, columns_NA2, x, y ): return ( self._obj .select_dtypes( exclude="category" ) .pipe( lambda df: df[df.columns[df.isna().any()]] ) .missing.bind_shadow_matrix(true_string=True, false_string=False) .apply( lambda column: column if "_NA" in column.name else self.column_fill_with_dummies(column, proportion_below=0.05, jitter=0.075) ) .assign( nullity=lambda df: df[columns_NA1] | df[columns_NA2] ) .pipe( lambda df: ( sns.scatterplot( data=df, x=x, y=y, hue="nullity" ) ) ) )
          Fernando Jesús Núñez Valdez

          Fernando Jesús Núñez Valdez

          student•
          hace 3 años

          Solo le realice una pequeña reducción a la función, ahora ya simplemente toma las 2 variables y no todo el dataset para realizar lo del bind shadow matrix (y ni hacer la exclusion de las categoricas, aunque seria bueno crear un try, except para solo aceptar las numericas), y tambien ya solamente recibe 2 parametros (var1, var2).

          def missing_scatter_nullity_plot(self, var1: str, var2: str): """Plot a scatterplot with 2 numeric variables""" return ( # Just taking the 2 variables and not the whole dataset self._obj[[var1, var2]].missing.bind_shadow_matrix(true_string = True, false_string = False) # Filling with dummies .apply( lambda column: (column if "_NA" in column.name else self.column_fill_with_dummies(column)) # Asign nullity ).assign( nullity = lambda df: df[var1+"_NA"] | df[var2+"_NA"] ) # Graphing .pipe( lambda df: sns.scatterplot( data = df, x = var1, y = var2, hue = 'nullity' ) ) )
          Marco Antonio Candia Ortega

          Marco Antonio Candia Ortega

          student•
          hace 3 años

          No estoy muy seguro, pero creo que cuando en la parte del código que pones

          self.column_fill_with_dummies

          Me parece que estás usando la función que creamos en el archivo "live-exploration-missing-values" y no el que extiende a pandas del archivo "pandas-missing-extension". En el que cree llamé al método mediante el siguiente código

          self._obj.missing.column_fill_with_dummies

          Que es como vi que Jesús llamaba a los métodos de la clase.

        Jonatan David Acevedo Lopez

        Jonatan David Acevedo Lopez

        student•
        hace 3 años

        Pasar el código realizado durante la clase a las funciones del archivo "pandas-missing-extension.ipynb".

        Codigo de pandas-missing-extension.ipynb

        def column_fill_with_dummies( column:pd.Series, proportion_below: float=0.10, jitter: float=0.07, seed: int=42 ) -> pd.Series: column = column.copy(deep= True) #Extract values metada missing_maks = column.isna() number_missing_values = missing_maks.sum() column_range = column.max() - column.min() #Shift data columns_shift = column.min() - column.min() * proportion_below #Create the "jitter" (noise) to be added around the point np.random.seed(seed) column_jitter = (np.random.rand(number_missing_values) - 2) * column_range * jitter #Save new dummy data column[missing_maks] = columns_shift + column_jitter return column def variable_null_values(self, var1, var2): ( self._obj.select_dtypes( exclude='category' ) .pipe( lambda df: df[df.columns[df.isna().any()]] ) .missing.bind_shadow_matrix(true_string=True, false_string=False) .apply( lambda column: column if "_NA" in column.name else column_fill_with_dummies(column, proportion_below=0.05, jitter=0.075) ) .assign( nullity = lambda df: df[var1+'_NA'] | df[var2+'_NA'] ) .pipe( lambda df: ( sns.scatterplot( data = df, x=var1, y=var2, hue='nullity' ) ) ) )

        Ejecutar código en nuestro notebook de trabajo llamando a la función

        riskfactors_df.missing.variable_null_values('weight_lbs', 'height_inch')
          Roy Q

          Roy Q

          student•
          hace 3 años

          Hola Jonathan, buen aporte de tu parte. Solo hay un pequeño detalle y es que se te escapó el self como parámetro de la funcion column_fill_with_dummies porque se supone que estás definiendo un metodo dentro de la clase MissingMethods y no una funciión global. Y para llamarlo en la siguiente función variable_null_values debería llamarse usando el self también, como self.column_fill_with_dummies(column, proportion_below=0.05, jitter=0.075)

          Al final el código en pandas-missing-extension.ipynb quedaría como:

          def column_fill_with_dummies( self, column: pd.Series, proportion_below: float=0.10, jitter: float=0.07, seed: int=42 ) -> pd.Series: column = column.copy(deep= True) #Extract values metada missing_maks = column.isna() number_missing_values = missing_maks.sum() column_range = column.max() - column.min() #Shift data columns_shift = column.min() - column.min() * proportion_below #Create the "jitter" (noise) to be added around the point np.random.seed(seed) column_jitter = (np.random.rand(number_missing_values) - 2) * column_range * jitter #Save new dummy data column[missing_maks] = columns_shift + column_jitter return column def variable_null_values(self, var1, var2): return ( self._obj.select_dtypes( exclude='category' ) .pipe( lambda df: df[df.columns[df.isna().any()]] ) .missing.bind_shadow_matrix(true_string=True, false_string=False) .apply( lambda column: column if "_NA" in column.name else self.column_fill_with_dummies(column, proportion_below=0.05, jitter=0.075) ) .assign( nullity = lambda df: df[var1+'_NA'] | df[var2+'_NA'] ) .pipe( lambda df: ( sns.scatterplot( data = df, x=var1, y=var2, hue='nullity' ) ) ) )

          Para llamarlo desde exploration-missing-values.ipynb sería con:

          # Gráfica usando la función ( riskfactors_df .missing.variable_null_values( var1 = 'weight_lbs', var2 = 'height_inch' ) ) # Borrar los logs de la gráfica plt.show()
        Marco Antonio Candia Ortega

        Marco Antonio Candia Ortega

        student•
        hace 3 años

        Para el reto mi código que utilice en el archivo "live-exploration-missing-values.ipynb" fue el siguiente:

        ( riskfactors_df .missing .scatterplot_valores_faltantes( columna_1="weight_lbs", columna_2="height_inch" ) )

        Resultado:

        16.png

        Y el código que agregué al archivo "pandas-missing-extension.ipynb" fue el siguiente:

        def column_fill_with_dummies( self, column: pd.Series, proportion_below: float=0.10, jitter: float=0.075, seed: int=42 ) -> pd.Series: column = column.copy(deep=True) # Extract values metadata. missing_mask = column.isna() number_missing_values = missing_mask.sum() column_range = column.max() - column.min() # Shift data column_shift = column.min() - column.min() * proportion_below # Create the "jitter" (noise) to be added around the points. np.random.seed(seed) column_jitter = (np.random.rand(number_missing_values) - 2) * column_range * jitter # Save new dummy data. column[missing_mask] = column_shift + column_jitter return column def scatterplot_valores_faltantes(self, columna_1: str, columna_2: str) -> pd.DataFrame: columna_NA_1 = columna_1 + "_NA" columna_NA_2 = columna_2 + "_NA" plt.figure(figsize=(10, 10)) ( self._obj .select_dtypes(exclude="category") .pipe(lambda df: df[df.columns[df.isna().any()]]) .missing.bind_shadow_matrix(true_string=True, false_string=False) .apply( lambda column: column if "_NA" in column.name else self._obj.missing.column_fill_with_dummies(column, proportion_below=0.05, jitter=0.075) ) .assign(nullity=lambda df: df[columna_NA_1] | df[columna_NA_2]) .pipe( lambda df: ( sns.scatterplot( data=df, x=df[columna_1], y=df[columna_2], hue="nullity" ) ) ) )
        Jhampyer Daniel Hernández Naguas

        Jhampyer Daniel Hernández Naguas

        student•
        hace un año

        No entendi nada jajaja

        Diego Cesar Lerma Torres

        Diego Cesar Lerma Torres

        student•
        hace 2 años

        Les comparto mi solución al reto:

        A la función column_fill_with_dummies() no podemos ponerla a la misma altura que el resto de las funciones de nuestro archivo pandas-missing-extension, debido a que todas esas funciones están hechas para extender los dataframes de pandas y nuestra función column_fill_with_dummies trabaja con series.

        Entonces haríamos una nueva implementación al final de nuestro archivo de pandas-missing-extension para que este extienda series:

        Quedaría de la siguiente manera:

        @pd.api.extensions.register_series_accessor("missing") class MissingSeriesMethods: def __init__(self, pandas_obj): self._obj = pandas_obj def column_fill_with_dummies( self, proportion_below: float = 0.10, jitter: float = 0.075, seed: int = 42 ) -> pd.Series: """Fills a column with missing values with dummies, to be used in a scatterplot""" # We're going to create a new series for the dummy data # Extract values metadata missing_mask = self._obj.isna() number_missing_values = missing_mask.sum() column_range = self._obj.max() - self._obj.min() # Shift data column_shift = self._obj.min() - self._obj.min() * proportion_below # Create the "jitter" (noise) to be added around the points np.random.seed(seed) column_jitter = (np.random.rand(number_missing_values) - 2) * column_range * jitter # Create new series for dummy data with the same index as the missing values in the original series dummy_data = pd.Series(column_shift + column_jitter, index=self._obj[missing_mask].index) # Return a series combining original and dummy data return self._obj.fillna(dummy_data)

        Entonces, la función nullity_scatterplot podría quedar así:

        def nullity_scatterplot( self, x:str, y:str, **kwargs ): """Recieves a DataFrame and 2 strings with the names of the columns to be used as x and y. Plots a nullity scatterplot""" return( self._obj.select_dtypes( exclude='category' ) .pipe( lambda df : df[df.columns[df.isna().any()]] ) .missing.bind_shadow_matrix(true_string=True, false_string=False) .apply( lambda column: column if "_NA" in column.name else column.missing.column_fill_with_dummies( proportion_below=0.05, jitter=0.075) ) .assign( nullity = lambda df:df[x+'_NA'] | df[y+'_NA'] ) .pipe( lambda df:( sns.scatterplot( data=df, x=x, y=y, hue='nullity' ) ) ) )

        En mi caso tuve que reiniciar el Kernell para que procesara los cambios.

        Volví a cargar mi archivo %run pandas-missing-extension.ipynb

        Y finalmente quedó así implementado

        ( riskfactors_df .missing .nullity_scatterplot('weight_lbs', 'height_inch') )

        Me encantó lo sencilla que queda la llamada

        Mario Alexander Vargas Celis

        Mario Alexander Vargas Celis

        student•
        hace 2 años

        Para crear un **scatterplot** (gráfico de dispersión) que visualice los valores faltantes en un conjunto de datos, puedes aprovechar la capacidad de **Seaborn** o **Matplotlib** para resaltar los puntos con valores faltantes. Puedes usar diferentes colores o símbolos para mostrar si los puntos tienen valores faltantes o no.

        Aquí tienes un ejemplo usando Seaborn para crear un gráfico de dispersión que destaque los valores faltantes:

        ### Ejemplo de Scatterplot con Valores Faltantes

        import pandas as pd import seaborn as sns import matplotlib.pyplot as plt \# Crear un DataFrame de ejemplo con algunos valores faltantes data = {'Variable1': \[1, 2, None, 4, 5, 6, None, 8, 9, 10],   'Variable2': \[5, None, 7, 8, 9, 10, None, 12, 13, 14]} df = pd.DataFrame(data) \# Crear una nueva columna que indique si hay valores faltantes en alguna de las variables df\['missing'] = df.isnull().any(axis=1) \# Visualización con un scatterplot, donde los puntos faltantes se destacan por el color plt.figure(figsize=(8, 6)) sns.scatterplot(x='Variable1', y='Variable2', hue='missing', style='missing', data=df, palette='coolwarm', s=100) plt.title('Scatterplot con Valores Faltantes Destacados') plt.xlabel('Variable 1') plt.ylabel('Variable 2') plt.show()

        ### Explicación:

        - **hue='missing'**: Colorea los puntos basados en si tienen valores faltantes o no.

        - **style='missing'**: Cambia el estilo del marcador para diferenciar visualmente los valores faltantes (puedes usar formas diferentes para los puntos que tienen valores faltantes).

        - **palette='coolwarm'**: Proporciona una paleta de colores para diferenciar claramente los puntos que tienen o no valores faltantes.

        - **s=100**: Ajusta el tamaño de los puntos para que sean más visibles.

        ### Variaciones:

        Si quieres agregar etiquetas adicionales o cambiar el estilo del gráfico, puedes usar las opciones de **Seaborn** y **Matplotlib** para personalizar colores, tamaños de puntos o títulos.

        Este scatterplot te ayudará a visualizar cómo los valores faltantes afectan la relación entre dos variables.

        Mercedes Jue

        Mercedes Jue

        student•
        hace 9 meses

        Vengo siguiendo la ruta de data science y las últimas dos clases me fulminaron, el código es demasiado complejo y no lo explica bien :(

        Emmanuel Guerra Sánchez

        Emmanuel Guerra Sánchez

        student•
        hace 2 años

        Cuando hablamos de valores faltantes nos importa que en algún momento logremos preservar su estructura y sus relaciones

        Antonio Demarco Bonino

        Antonio Demarco Bonino

        student•
        hace 2 años

        Le agregué dos líneas negras para marcar los ejes:

        ( riskfactors_df .select_dtypes( exclude="category" ) .pipe( lambda df: df[df.columns[df.isna().any()]] ) .missing.bind_shadow_matrix(true_string = True, false_string = False) .apply( lambda column: column if "_NA" in column.name else column_fill_with_dummies(column, proportion_below=0.05, jitter=0.075) ) .assign( nullity = lambda df: df.weight_lbs_NA | df.height_inch_NA ) .pipe(lambda df: (sns.scatterplot(data = df, x='weight_lbs', y= 'height_inch', hue='nullity'))) ) plt.axhline(0, color='black', linewidth=1) plt.axvline(0, color='black', linewidth=1) plt.show() ```![](https://static.platzi.com/media/user_upload/image-fd0cbc10-1d8b-450f-83fc-b3e6b96289b1.jpg)
        Pável Hernández Reza

        Pável Hernández Reza

        student•
        hace 2 años

        Añadida la extensión. Pueden ver el código directamente en el repositorio:

        Pablo Alejandro Figueroa

        Pablo Alejandro Figueroa

        student•
        hace 2 años

        genial..!

        José Pablo Cabrera Romo

        José Pablo Cabrera Romo

        student•
        hace 3 años

        Mi codigo del reto:

        def missing_values_for_2variables_scatterplot( df: pd.DataFrame, x: str, y: str ): scatterplot = ( df .select_dtypes( exclude="category" ) .pipe( lambda df: df[df.columns[df.isna().any()]] ) .missing .bind_shadow_matrix(true_string = True, false_string = False) .apply( lambda column : column if "_NA" in column.name else column_fill_with_dummies(column, proportion_below=0.05, jitter= 0.075) ) .assign( Nullity = lambda df: df[f"{x}_NA"] | df[f"{y}_NA"] ) .pipe( lambda df: sns.scatterplot( data = df, x = x, y = y, hue = "Nullity" ) ) ) return scatterplot missing_values_for_2variables_scatterplot(riskfactors_df, x = "weight_lbs", y = "height_inch")
        Nelson Mauricio Bravo Caballero

        Nelson Mauricio Bravo Caballero

        student•
        hace 3 años

        Esta es mi funcion en pandas-missing-extension.ipynb:

        def missing_fill_with_dumies_scatterplot( self, col1, col2, proportion_below:0.05, jitter:0.050, seed: int=42): ( self._pd_obj.select_dtypes( exclude="category" ) .pipe( lambda df: df[df.columns[df.isna().any()]] ) .missing.bind_shadow_matrix(true_string = True, false_string = False) .apply( lambda column: column if "_NA" in column.name else column_fill_with_dumies(column, proportion_below, jitter, seed) ) .assign( nullity = lambda df: df.weight_lbs_NA | df.height_inch_NA ) .pipe( lambda df:( sns.scatterplot( data= df, x=col1, y=col2, hue="nullity" ) ) ) )
        Julián Cárdenas

        Julián Cárdenas

        student•
        hace 3 años
        plt.figure(figsize=(10, 10)) ( riskfactors_df .select_dtypes( exclude="category" ) .pipe( lambda df: df[df.columns[df.isna().any()]] ) .missing.bind_shadow_matrix(true_string=True, false_string=False) .apply( lambda column: column if "_NA" in column.name else column_fill_with_dummies(column, proportion_below=0.05, jitter=0.075) ) .assign( nullity=lambda df: df.weight_lbs_NA | df.height_inch_NA ) .pipe( lambda df: ( sns.scatterplot( data=df, x="weight_lbs", y="height_inch", hue="nullity" ) ) ) )
        Bryan David Vasquez Paz

        Bryan David Vasquez Paz

        student•
        hace 3 años

        This is my way

        # Made by Bryan: Column_fill_with_dummies and Scatterplot with missing data def column_fill_with_dummies( self, column: pd.Series, proportion_below: float=0.10, jitter: float=0.075, seed: int=42 ) -> pd.Series: column = column.copy(deep=True) missing_mask = column.isna() nuber_missing_values = missing_mask.sum() column_range = column.max() - column.min() column_shift = column.min() - column.min() * proportion_below np.random.seed(seed) column_jitter = (np.random.rand(nuber_missing_values) - 2) * column_range * jitter column[missing_mask] = column_shift + column_jitter return column def scatterplot_with_missing_data(self, variable_1: str, variable_2: str): ( self._obj.select_dtypes(exclude = "category") .pipe(lambda df : df[df.columns[df.isna().any()]]) .missing.bind_shadow_matrix(true_string = True, false_string = False) .apply( lambda column: column if "_NA" in column.name else self.column_fill_with_dummies(column, proportion_below=0.05, jitter=0.075) ) .assign( nullity = lambda df : df[f"{variable_1}_NA"] | df[f"{variable_2}_NA"] ) .pipe(lambda df: ( sns.scatterplot(data= df, x= variable_1, y= variable_2, hue="nullity") )) )

        and you can use just the names of the columns

        ( riskfactors_df.missing.scatterplot_with_missing_data("weight_lbs", "height_inch") )
        María José Medina

        María José Medina

        student•
        hace 3 años

        Mi solucion al reto: missing_bivariable_plot(variable_a: str, variable_b: str)

        Solo añadi 2 funciones:

        • column_fill_with_dummies(): como era de esperarse solo era copiar y pegar.
        • missing_bivariable_plot(): requería algunas modificaciones como hacer el jitter a las variables, crear la columna nullity y devolver el plot.

        Las añadi al final de exploration-missing-values.ipynb:

        # ****** Primera funcion ******* def column_fill_with_dummies( column: pd.Series, proportion_below: float=0.10, jitter: float=0.075, seed: int=42 ) -> pd.Series: column = column.copy(deep=True) # Extract values metadata. missing_mask = column.isna() number_missing_values = missing_mask.sum() column_range = column.max() - column.min() # Shift data column_shift = column.min() - column.min() * proportion_below # Create the "jitter" (noise) to be added around the points. np.random.seed(seed) column_jitter = (np.random.rand(number_missing_values) - 2) * column_range * jitter # Save new dummy data. column[missing_mask] = column_shift + column_jitter return column # ****** Segunda funcion ******* def missing_bivariable_plot(self, variable_a: str, variable_b: str): df = self._obj.missing.bind_shadow_matrix(true_string=True, false_string=False) df[variable_a] = column_fill_with_dummies(self._obj[variable_a]) df[variable_b] = column_fill_with_dummies(self._obj[variable_b]) df['nullity'] = df[f"{variable_a}_NA"] | df[f"{variable_b}_NA"] return ( sns.scatterplot( data=df, x=variable_a, y=variable_b, hue="nullity" ) )
        Mario Chavez

        Mario Chavez

        student•
        hace 3 años

        Yo lo hice asi

        def scatter_dummies(self, columns: list[str]): """Recibes a list of two strings with the name of the columns that are going to be plotted""" if len(columns) != 2: raise ValueError('Function needs different columns') def column_fill_with_dummy(column: pd.Series, proportion_below: float = 0.10, jitter: float = 0.075, seed: int = 42) -> pd.Series: """ Takes a column and if it has a missing value fills it with a outsider value """ column = column.copy(deep= True) missing_mask = column.isna() number_missing_values = missing_mask.sum() column_range = column.max() - column.min() # The new dummy values will be under the minimum column_shift = column.min() - column.min() * proportion_below np.random.seed(seed) column_jitter = (np.random.rand(number_missing_values) - 2) * jitter * column_range column[missing_mask] = column_shift + column_jitter return column ( self._obj[columns] .missing.bind_shadow_matrix( true_string= True, false_string= False ) .apply( lambda column: column if '_NA' in column.name else column_fill_with_dummy(column) ) .assign( nullity = lambda df: df[columns[0] + '_NA'] | df[columns[1] + '_NA'] ) .pipe( lambda df: sns.scatterplot( data= df, x= columns[0], y= columns[1], hue= 'nullity' ) ) )
        Bryan Carvajal

        Bryan Carvajal

        student•
        hace 3 años

        He logrado llevar crear el metodo en la clase missing y agregar la funcion column_fill_with_dummies en utils.py

        code.png