Cuando se trata de valores faltantes tenemos dos aproximaciones para el tratamiento de los mismos:
Eliminacion de valores faltantes: La eliminación de valores faltantes asume que los valores faltantes están perdidos completamente al azar (MCAR). En cualquier otro caso, realizar una eliminación de valores faltantes podrá ocasionar sesgos en los análisis y modelos subsecuentes. Por tanto, es importante investigar que mecanismos tienen los datos para asi evitar los sesgos a la hora de eliminarlos
Imputacion de valores faltantes: consiste en añadir valores en los datos faltantes para mantener el registro en el dataset
Muchas gracias por sus aportes. Muy valiosos.
gracias...!!!
Pasos para la Eliminacion de Valores Faltantes
Observa el numero de observaciones y variables que tiene el conjunto de datos
riskfactors_df.shape
-->(245,34)
Pairwise deletion (Eliminacion por pares)
#Pandas por defecto,ignora los registros con datos faltantes a la hora de hacer algun calculo( riskfactors_df
.weight_lbs
.mean())-->174.26808510638298
Listwise deletion or Complete case (Eliminacion por lista o caso completo)
Con base a 1 columna
( riskfactors_df
.dropna( subset=['weight_lbs'],# indica la variable donde buscar los valores faltantes how='any'# any indica en cualquier registro que aparezca un valor faltante))
Con base a 2 columnas
( riskfactors_df
.dropna( subset=['weight_lbs','height_inch'],# indica el parametro donde buscar los valores faltantes how='any'# algoritmo con el que eliminar los registros).shape
)-->(234,34)
Con base a 2 columnas que tengan valores faltantes en los mismos registros
# elimina los registros en los que hayan valores faltantes en dos variables al mismo tiempo( riskfactors_df
.dropna( subset=['weight_lbs','height_inch'],# indica el parametro donde buscar los valores faltantes how='all'# all indica los registros donde hayan valores faltantes en ambas variables).shape
)-->(244,34)
Representacion Grafica tras la eliminacion de valores faltantes
Con any
( riskfactors_df
.dropna( subset=['weight_lbs','height_inch'],# indica el parametro donde buscar los valores faltantes how='any'# any indica en cualquier registro que aparezca un valor faltante).select_columns(['weight_lbs','height_inch']).pipe(missingno.matrix))
Con all
( riskfactors_df
.dropna( subset=['weight_lbs','height_inch'],# indica el parametro donde buscar los valores faltantes how='all'# algoritmo con el que eliminar los registros).select_columns(['weight_lbs','height_inch']).pipe(missingno.matrix))
Dejo aquí las imagenes que hice para entender mejor esta clase.
Al parecer, el parametro "how" solo tiene uso si hay mas de 2 variables en cuestion a las que identificaremos sus valores faltantes.
La eliminación de valores faltantes es una técnica común para manejar datos incompletos. Las dos principales estrategias son **eliminación por pares (pairwise deletion)** y **eliminación por lista (listwise deletion)**.
### 1. **Eliminación por Lista (Listwise Deletion)**
En este método, se eliminan las filas que contienen algún valor faltante en cualquiera de las variables involucradas en el análisis. Este enfoque es simple pero puede resultar en la pérdida de mucha información si hay muchos valores faltantes.
#### Ejemplo en Pandas:
import pandas as pd
\# Crear un DataFrame de ejemplo con algunos valores faltantes
data ={'Variable1': \[1,2,None,4,5],  'Variable2': \[5, None, 7, 8, 9],  'Variable3': \[None, 1, 2, None, 4]}df = pd.DataFrame(data)\# Eliminación por lista: se eliminan filas que contengan algún valor nulo
df\_listwise = df.dropna()print("DataFrame después de la eliminación por lista:")print(df\_listwise)
#### Ventajas:
- Fácil de implementar.
- Asegura que se utilicen solo datos completos.
#### Desventajas:
- Puede llevar a la eliminación de muchas filas si hay muchas variables con valores faltantes.
---
### 2. **Eliminación por Pares (Pairwise Deletion)**
En la eliminación por pares, se realiza un análisis variable por variable, eliminando solo las filas donde la variable involucrada tenga valores faltantes. Esto permite que se utilicen la mayor cantidad posible de datos, aunque algunas comparaciones se hacen con menos datos que otras.
Este enfoque es útil para calcular correlaciones o regresiones entre pares de variables, ya que solo se eliminan los valores faltantes en las variables involucradas en el análisis particular.
#### Ejemplo de correlación usando eliminación por pares:
\# Calcular correlación por pares (omitimos valores faltantes sólo para el par de columnas analizado)pairwise\_corr = df.corr(method='pearson',min\_periods=1)print("Correlación por pares:")print(pairwise\_corr)
#### Ventajas:
- Se utiliza la mayor cantidad posible de datos.
- Es útil cuando se tiene una gran cantidad de valores faltantes y no se quiere perder información.
#### Desventajas:
- Los resultados pueden no ser consistentes entre análisis de diferentes variables, ya que se usan subconjuntos distintos de datos.
---
### Comparación entre Listwise y Pairwise:
- **Listwise deletion** es más estricto y consistente pero puede resultar en una pérdida significativa de datos.
- **Pairwise deletion** conserva más información, pero las comparaciones entre diferentes análisis pueden basarse en distintos subconjuntos de datos, lo que puede complicar la interpretación.
Buenas 👋 me aventé una función para hacer un análisis rápido del conteo de nulos por columna. Cuando alguna de ellas tenga un porcentaje mayor a la "tolerancia de nulos" indicada, las agrupará en una lista llamada "too much nools", aquellas que tengan nulos, pero que no se acerquen a esta proporción, estarán en otra lista llamada "acceptable nulls", y también otra donde se indiquen aquellas que no tengan nulos.
Si a alguien se le ocurre cómo mejorarla, se agradecería una propuesta.
#-func 21-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
"""
Conteo de valores nulos en cada columna de un df.recibe un df y devuelve:-(1) diccionario con {'columna': número nulos}-(2) print de los valores nulos por columna(summary)Args:- df:DataFrame a analizar
- print_counts: imprimir conteo de nulos por col(OPCIONAL)- save_list: guardar el diccionario con los nulos(OPCIONAL)- acceptable_nuls: flotante que indica el porcentaje de nulos
aceptable en una columna.Default->(5%=>0.05)- summary: resumen de las columnas con nulos(OPCIONAL-Se recomienda activarlo)"""
def count_nulls_per_col(self,print_counts: bool=False,save_list: bool=False,acceptable_nulls: float =0.05,summary: bool=False)-> dict | str: df = self._obj dict_nulls ={}for col in df.columns: dict_nulls[col]= df[col].isnull().sum()ifprint_counts:print(f'\nCol: "{col}" tiene: {"-*"*3} {df[col].isnull().sum()}')ifsummary: calc = df.shape[0]* acceptable_nulls
#resumen
cols_no_nulls =([col for col, val in dict_nulls.items()if val ==0]) cols_acceptable_nulls =[col for col, val in dict_nulls.items()if val <= calc and val >0] cols_non_acceptable_nulls=[col for col, val in dict_nulls.items()if val > calc]print(f'ROWS number: {df.shape[0]}, COLUMNS number: {df.shape[1]}\n')print(f'- Columns without nulls: \n {cols_no_nulls}\n')print(f'- Acceptable columns (nulls less than {int(acceptable_nulls *100)}%):\n {cols_acceptable_nulls}\n')print(f'- Too much nulls:\n {cols_non_acceptable_nulls}\n')print(f'- Null value tolerance: {acceptable_nulls * 100}%')ifsave_list: dict_nulls ={key_col: nulls_num for key_col, nulls_num in dict_nulls.items()if nulls_num !=0}return dict_nulls
Si se fijaron, en dropna cuando puso el parámetro "all" quedaron más elementos que con el parámetro "any"
Esto se debe a que "all" solo elimina si todos los valores de las filas o columnas seleccionadas son NaN.
Y "any" elimina todas las filas o columnas seleccionadas si cualquiera de los valores son NaN.
Es decir, any elimina la fila si peso O talla son NaN
all elimina la fila SOLO SI peso Y talla son NaN (por eso solo elimina un valor)
Les dejo mi apunte sobre este tema
El parámetro how de la función dropna en Pandas es fundamental para determinar cómo se deben tratar las filas o columnas que contienen valores NaN (Not a Number) cuando se limpian los datos. Este parámetro define el criterio bajo el cual una fila o columna será eliminada de un DataFrame debido a la presencia de valores nulos.
Evaluación de Datos: Antes de decidir entre 'any' y 'all', es importante evaluar la naturaleza de los datos faltantes y el impacto de su eliminación en el análisis posterior.
Complemento confillna: Para minimizar la pérdida de datos, considere utilizar el método fillna para imputar valores faltantes antes de optar por eliminar filas o columnas con dropna.
Revisión Manual: En algunos casos, especialmente con datasets pequeños, una revisión manual de los datos puede ofrecer una mejor perspectiva sobre cómo manejar los valores NaN.
Uso
how:{'any','all'},default'any'
Descripción de los argumentos:
'any': Si se selecciona este valor, la función dropna eliminará cualquier fila o columna que contenga al menos un valor NaN. Es el valor por defecto porque es una opción conservadora que permite eliminar los datos incompletos sin descartar en exceso filas o columnas que podrían tener la mayoría de sus valores válidos.
'all': Al elegir 'all', dropna solo eliminará las filas o columnas donde todos los valores son NaN. Este enfoque es más permisivo y útil cuando solo se desea eliminar filas o columnas que estén completamente vacías, lo cual puede ser indicativo de datos faltantes en su totalidad o de registros que no fueron ingresados correctamente.
Buenas prácticas
Evaluación de Datos: Antes de decidir entre 'any' y 'all', es importante evaluar la naturaleza de los datos faltantes y el impacto de su eliminación en el análisis posterior.
Complemento confillna: Para minimizar la pérdida de datos, considere utilizar el método fillna para imputar valores faltantes antes de optar por eliminar filas o columnas con dropna.
Revisión Manual: En algunos casos, especialmente con datasets pequeños, una revisión manual de los datos puede ofrecer una mejor perspectiva sobre cómo manejar los valores NaN.
Por favor me pueden ayudar con el siguiente error cuando ejecuto el siguiente código:python riskfactors_df.mean(skipna=False)
```python
TypeError: 'Categorical' with dtype category does not support reduction 'mean'
Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...
Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...
Para solucionarlo pueden excluirse las columnas categoricas