El problema de trabajar con valores faltantes

1/17
Recursos

Aportes 33

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Estoy tratando de aplicar lo aprendido en el curso de pro config en los proyectos/cursos que vamos haciendo, el environment.yml quedaria asi para este curso

# conda env create --file environment.yml
# mamba env create --file environment.yml
name: handling_missing_data
channels:
  - anaconda
  - conda-forge
  - defaults
dependencies:
  - black
  - invoke
  - jupyter
  - jupyterlab
  - keras
  - lightgbm
  - matplotlib
  - missingno
  - nbdime
  - numpy
  - pandas
  - pandas-flavor
  - pandas-profiling
  - plotly
  - pyjanitor
  - pylint
  - pyprojroot
  - pyspark
  - scikit-learn
  - seaborn
  - statsmodels
  - tensorflow
  - pip
  - python=3.9
  - python-dotenv
  - session-info
  - pyreadr
  - upsetplot
  - statsmodels==0.13.2
  - fancyimpute
  - scipy
  - pip:
    - nhanes
    - nhanes==0.5.1
    - ozon3

O pueden hacer un pip install -r requirements tmb :p

Al abrir la notebook en deepnote me daba un error diciendo que no se podía inicializar correctamente. Lo pude solucionar cambiando en el archivo requirements.txt la librería sklearn por scikit-learn.

sklearn    <------- Eliminar
scikit-learn   <----- Agregar

Con el siguiente código en el reto:

(
    smf.ols(
        formula="death ~ C(chapter)",
        data = survival_df
    )
    .fit()
    .summary()
    .tables[0]
)

obtengo en R-squared un valor -inf. ¿Ese es el efecto que tienen los datos faltantes? Si voy agregando más variables, el valor no cambia, hasta que elimino chapter.

He estado haciendo los modelos logísticos para ‘death’ y también me ha fallado con ‘chapter’, al principio pensaba que podría ser porque tiene valores faltantes, cosa que no es cierto pues con ‘creatinine’ el modelo sí se crea.

Leyendo por aquí buscando el error en internet (Perfect separation error) y revisando desde la tabla la relación entre ‘chapter’ y ‘death’ se observa que:

Cada vez que ‘death’ es 1 hay una ‘chapter’ clasificado; y que cuando ‘death’ es 0, ‘chapter’ tiene registrado un valor faltante. Esto de alguna manera que desconozco -posiblemente induce a error en la funcion sigmoide o no encuentra un coeficiente- afecta a que el módelo se cree o similar. Si hay algun experto, agredeceré su aporte.

PD: Usando el nombre ‘lambda’ (la variable) también manda a error del módelo pero si se cambia el nombre desde el comienzo funcionará.

Para complementar el manejo de Datos, excelente.

Me sale ese error, ¿Alguien sabe como solucionarlo? ¿Y cómo lo solucionaron?
Me podrían ayudar por favor. Gracias

Esta combinación de variables me permitió obtener una correlación de 0.51.

(
smf.ols(
formula=“death ~ futime + age”,
data = survival_df
)
.fit()
.summary()
.tables[0]
)

Cuando creo un modelo logistico con la variable chapter siempre me sale este error, busqué en stack overflow pero la verdad… no entendí el porqué ocurría xD.
alguien me explica el error?

El manejo de datos faltantes a través de la imputación es un proceso crucial en el análisis de datos para mejorar la calidad y la utilidad del conjunto de datos. La imputación implica estimar y reemplazar los valores faltantes con valores calculados o predichos para que el análisis y los modelos sean más precisos. Aquí tienes un resumen de técnicas comunes de imputación: \### 1. \*\*Imputación con la Media, Mediana o Moda\*\* \- \*\*Media\*\*: Sustituye los valores faltantes por el promedio de los valores presentes en esa columna. Útil para datos numéricos que no tienen muchos valores atípicos. \- \*\*Mediana\*\*: Sustituye los valores faltantes por el valor central cuando los datos están ordenados. Es menos sensible a los valores atípicos que la media. \- \*\*Moda\*\*: Sustituye los valores faltantes por el valor más frecuente en la columna. Utilizado para datos categóricos. ```python import pandas as pd \# Imputación con la media df\['column\_name'].fillna(df\['column\_name'].mean(), inplace=True) \# Imputación con la mediana df\['column\_name'].fillna(df\['column\_name'].median(), inplace=True) \# Imputación con la moda df\['column\_name'].fillna(df\['column\_name'].mode()\[0], inplace=True) ``` \### 2. \*\*Imputación Basada en Modelos\*\* \- \*\*Regresión\*\*: Usa una variable dependiente para predecir el valor faltante basado en otras variables independientes. \- \*\*k-Nearest Neighbors (k-NN)\*\*: Imputa valores basándose en la similitud entre los datos. Busca los k vecinos más cercanos y utiliza sus valores para la imputación. ```python from sklearn.impute import KNNImputer \# Imputación con k-NN imputer = KNNImputer(n\_neighbors=5) df\_imputed = imputer.fit\_transform(df) ``` \### 3. \*\*Imputación por Interpolación\*\* \- \*\*Lineal\*\*: Interpola los valores faltantes usando una función lineal entre los valores existentes. \- \*\*Polinómica\*\*: Utiliza polinomios para la interpolación. ```python \# Imputación lineal df\['column\_name'] = df\['column\_name'].interpolate(method='linear') ``` \### 4. \*\*Imputación por Valores Predeterminados\*\* \- Sustituye los valores faltantes con un valor específico que tenga sentido en el contexto del conjunto de datos (por ejemplo, 0, 'desconocido'). ```python \# Imputación con un valor específico df\['column\_name'].fillna('Unknown', inplace=True) ``` \### 5. \*\*Imputación con Datos de Vecinos\*\* \- Utiliza datos similares de otras observaciones para imputar los valores faltantes. ```python from sklearn.impute import SimpleImputer \# Imputación con la mediana por defecto imputer = SimpleImputer(strategy='median') df\_imputed = imputer.fit\_transform(df) ``` \### 6. \*\*Múltiples Imputaciones\*\* \- \*\*Multiple Imputation by Chained Equations (MICE)\*\*: Imputa los valores faltantes múltiples veces y combina los resultados para tener en cuenta la incertidumbre en la imputación. ```python from miceforest import MultipleImputedData mice\_data = MultipleImputedData(df) df\_imputed = mice\_data.complete\_data() ``` Cada técnica tiene sus ventajas y desventajas, y la elección del método adecuado dependerá de la naturaleza de los datos y del contexto del análisis. La imputación adecuada puede mejorar la precisión del análisis y la calidad de los modelos predictivos.

Para Ubuntu con WSL2:

# Tener varias versiones de python en WSL2 (https://levelup.gitconnected.com/install-multiple-python-versions-in-wsl2-ba81f21109d6)
## Con esta linea  descargo la version
pyenv install 3.9.15
## Con esta linea coloca la version local en una carpeta
pyenv local 3.9.15
# crear una carpeta con
mkdir
# entrar a dicha carpeta con 
cd
# Crear el entorno virtual alli con 
python3 -m venv env
# Activar el entorno virtual
source env/bin/activate
# instalar archivo requirements.txt presente en el repositorio de github de esta clase
pip3 install -r requirements.txt
# abrir con windows code insiders (deberia instalar automaticamente)
code-insiders .

En ozono y solar_r podemos afirmar que hay valores faltantes.
En el resto de las variables aún no podemos afirmar que no existen datos faltanes, pueden estar enmascarados.

airquality_df = (
    sm.datasets.get_rdataset('airquality')
    .data
    .clean_names(
        case_type='snake'
    )
    .add_column('year', 1973)
    .assign(
        date=lambda df: pd.to_datetime(df[['year', 'month', 'day']])
    )
    .sort_values(by='date')
    .set_index('date')
)

airquality_df

Al crear un modelo de regresión logística y entrenarlo con valores faltantes, simplemente me sale este error:

Muy buena aclaracion sobre la forma en que cometemos el error de no considerar los errores faltantes a pesar de que el algoritmo corra sin arrojar un warning

Aunque se quisiera comparar ambos modelos mediante su valor de R cuadrado para saber cual de los dos se ajusto mejor, es un error hacerlo debido a que los modelos estan basados sobre diferentes numeros de observaciones.

Reto: lo primero que hice es ver como se repartian las variables categoricas de la tabla chapter# Resumen de variables con valores faltantessurvival\_df.missing.missing\_variable\_summary()import missingno as msno# Visualizar los datos faltantesmsno.matrix(survival\_df)plt.show()from sklearn.model\_selection import train\_test\_splitfrom sklearn.linear\_model import LogisticRegressionfrom sklearn.metrics import accuracy\_score, confusion\_matrix, classification\_report \# Separar las variables predictoras y la variable objetivoX = survival\_df\_imputed.drop(columns=\['death'])y = survival\_df\_imputed\['death'] \# Dividir los datos en conjuntos de entrenamiento y pruebaX\_train, X\_test, y\_train, y\_test = train\_test\_split(X, y, test\_size=0.2, random\_state=42) \# Crear y ajustar el modelomodel = LogisticRegression(max\_iter=1000)model.fit(X\_train, y\_train) \# Realizar prediccionesy\_pred = model.predict(X\_test) \# Evaluar el modeloprint("Accuracy:", accuracy\_score(y\_test, y\_pred))print("Confusion Matrix:\n", confusion\_matrix(y\_test, y\_pred))print("Classification Report:\n", classification\_report(y\_test, y\_pred)) \# Visualización de datos faltantessurvival\_df.missing.missing\_variable\_plot() ```js # Ver las categorías únicas de la variable "chapter" categorias_chapter = survival_df['chapter'].value_counts() print(categorias_chapter) ```Output:chapter Circulatory 745 Neoplasms 567 Respiratory 245 Mental 144 Nervous 130 Digestive 66 External Causes 66 Endocrine 48 Genitourinary 42 Ill Defined 38 Infectious 32 Injury and Poisoning 21 Musculoskeletal 14 Blood 4 Skin 4 Congenital 3 Name: count, dtype: int64 2\. Luego cheque cuantos datos se estan perdiendo con estos dos graficos ```js # Resumen de variables con valores faltantes survival_df.missing.missing_variable_summary() # Visualización de datos faltantes survival_df.missing.missing_variable_plot() ```![](https://static.platzi.com/media/user_upload/image-858b8c32-1846-402c-b027-084d09219e68.jpg) ```js import missingno as msno # Visualizar los datos faltantes msno.matrix(survival_df) plt.show() ```![](https://static.platzi.com/media/user_upload/image-00730d2b-7db6-4074-a2b9-41310dc40357.jpg) y por ultimo este fue el codigo: ```js from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, confusion_matrix, classification_report # Separar las variables predictoras y la variable objetivo X = survival_df_imputed.drop(columns=['death']) y = survival_df_imputed['death'] # Dividir los datos en conjuntos de entrenamiento y prueba X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Crear y ajustar el modelo model = LogisticRegression(max_iter=1000) model.fit(X_train, y_train) # Realizar predicciones y_pred = model.predict(X_test) # Evaluar el modelo print("Accuracy:", accuracy_score(y_test, y_pred)) print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred)) print("Classification Report:\n", classification_report(y_test, y_pred)) ```
despues de vario tiempo con el problema de janitor ya que pues detro de esa libreria estaba escrito como ConfigParser y la version de python que se utilizo no la reconocia por las letras en mayuscula y queria pues acceder a la libreria para cambiarlo manualmenta a configparser con minusuclas e inclive lo intente con codigo y no pude entonces encontre esta solucion que ya me hizo que puediera compilar y fue simple y elegante desinstales y vuelvan a instalarlo eso solucionara el problema aqui les dejo el codigo: !pip uninstall janitor!pip install pyjanitor ```python !pip uninstall janitor !pip install pyjanitor ```
\ \<caption>OLS Regression Results\</caption> \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
Dep. Variable:\death\ R-squared: \ -inf\
Model:\OLS\ Adj. R-squared: \ -inf\
Method:\Least Squares\ F-statistic: \ -143.5\
Date:\Fri, 30 Aug 2024\ Prob (F-statistic):\ 1.00\
Time:\20:21:15\ Log-Likelihood: \ 67281.\
No. Observations:\ 2169\ AIC: \-1.345e+05\
Df Residuals:\ 2153\ BIC: \-1.344e+05\
Df Model:\ 15\ \ \
Covariance Type:\nonrobust\ \ \
OLS Regression ResultsDep. Variable:deathR-squared:-infModel:OLSAdj. R-squared:-infMethod:Least SquaresF-statistic:-143.5Date:Fri, 30 Aug 2024Prob (F-statistic):1.00Time:20:21:15Log-Likelihood:67281.No. Observations:2169AIC:-1.345e+05Df Residuals:2153BIC:-1.344e+05Df Model:15Covariance Type:nonrobust
Finalmente, el último curso antes de la sección de Machine Learning, he aprendido más de lo que podría haber esperado. El profesor es justo la clase de profesional que espero llegar a ser algún día.
como alternativa a janitor, podemos cargar el dataset de la siguiente forma: ```js df_airquality = sm.datasets.get_rdataset("airquality").data # renombrar cols -> snake_case df_airquality.columns = (df_airquality.columns.str.lower() .str.replace(' ', '_') .str.replace('.', '_')) df_airquality['year'] = 1973 # nueva columna -> year df_airquality['date'] = pd.to_datetime(df_airquality[['year', # columna 'date' tipo datetime 'month', 'day']]) df_airquality = df_airquality.sort_values('date') # ordenar por fecha df_airquality = df_airquality.set_index('date') ```Nada en contra de janitor *versión 0.27*, sin embargo no he encontrado la forma de resolver los warnings (sin apagarlos) Si alguien ha podido resolverlo porfa avísenme.
Con este modelo: ```python ( smf.ols( formula="death ~ futime + age + sex", data=survival_df ) .fit() .summary() .tables[0] ) ```Alcance una correlación del 51.5% con "death". ![](file:///C:/Users/adema/OneDrive/Escritorio/DatosFaltantes/Captura%20de%20pantalla%202024-06-20%20221543.png)
QUe buenas Clase!! !!
Solución al reto con KNeighborsRegressor curiosamente el accuracy me dio 1.0 y el MAE 0, los NaN en chapter fueron tomados como una categoría por el LabelEncoder ```js from sklearn.preprocessing import StandardScaler from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import train_test_split label_encoder_chapter = LabelEncoder() label_encoder_sex = LabelEncoder() survival_df['chapter_encoded'] = label_encoder_chapter.fit_transform(survival_df['chapter']) survival_df['sex_encoded'] = label_encoder_sex.fit_transform(survival_df['sex']) X_train = survival_df[['chapter_encoded', 'sex_encoded']] y_train = survival_df["death"] X_train, X_test, y_train, y_test = train_test_split(X_train, y_train, test_size=0.3, random_state=42) ``````js from sklearn.neighbors import KNeighborsRegressor from sklearn.metrics import mean_absolute_error KNR = KNeighborsRegressor() KNR.fit(X_train,y_train) preds = KNR.predict(X_test) acc_neigh = KNR.score(X_test,y_test) mae_neigh = mean_absolute_error(y_test, preds) print("Accuracy:",acc_neigh) print("Mean Absolute Error:", mae_neigh) ```
Hace tiempo esperaba un curso como este 😎
![](https://static.platzi.com/media/user_upload/imagen-68725d32-e13a-42b1-932c-de10b9cb0447.jpg)
Por si quieren entender mejor la base de datos del reto: ### Análisis del conjunto de datos `flchain` del paquete `survival` en R #### Concepto El conjunto de datos `flchain` del paquete `survival` en R contiene datos de un estudio sobre la cadena ligera libre del suero y su relación con la mortalidad. Este estudio involucra a sujetos mayores de 40 años a los que se les midió la concentración sérica de cadena ligera libre (FLC) kappa y lambda, junto con otros indicadores clínicos y demográficos, como la edad, el sexo, la raza, el nivel de creatinina sérica, y más. El propósito principal es analizar cómo estas medidas están asociadas con el riesgo de muerte. El conjunto de datos `flchain` del paquete `survival` en R contiene información sobre 7874 individuos y se utiliza para estudiar la relación entre la cadena ligera libre en suero (FLC) y la mortalidad. A continuación, describo cada una de las columnas basándome en la documentación oficial y en el análisis realizado por terceros: 1. **age**: Edad del sujeto en años. Es una variable numérica que refleja la edad de los participantes en el momento del estudio​​​​. 2. **sex**: Género del sujeto, indicado como F para femenino y M para masculino. Esta variable se ajustó a 'Female' y 'Male' para una mejor interpretación en análisis posteriores​​​​. 3. **sample.yr**: Año calendario en el que se obtuvo la muestra de sangre. Es una variable numérica que indica el año en el que se recolectó la muestra para cada participante​​​​. 4. **kappa**: Porción kappa de la cadena ligera libre en suero. Es una variable numérica que mide la concentración de la cadena ligera kappa en el suero​​​​. 5. **lambda**: Porción lambda de la cadena ligera libre en suero. Similar a kappa, esta variable numérica mide la concentración de la cadena ligera lambda en el suero​​​​. 6. **flc.grp**: Grupo de FLC del sujeto, utilizado en el análisis original. Esta variable numérica agrupa a los sujetos según sus niveles de cadena ligera libre en suero​​​​. 7. **creatinine**: Creatinina sérica. Es una variable numérica que mide el nivel de creatinina en suero, lo cual es un indicador de la función renal​​​​. 8. **mgus**: Indica si al sujeto se le había diagnosticado gammapatía monoclonal de significado incierto (MGUS) antes del estudio. Es una variable binaria (0 = no, 1 = sí), que se transformó en un factor para mejorar la interpretación​​​​. 9. **futime**: Días desde el enrolamiento hasta la muerte. Esta variable numérica cuenta los días desde que el sujeto se unió al estudio hasta su fallecimiento o último contacto​​​​. 10. **death**: Indica si el sujeto estaba vivo o muerto en la última fecha de contacto. Es una variable binaria (0 = vivo, 1 = muerto) que se ajustó para análisis posteriores​​​​. 11. **chapter**: Para aquellos que fallecieron, agrupación de su causa principal de muerte por encabezados de capítulo del Código Internacional de Enfermedades ICD-9. Esta variable categórica refleja la causa principal de la muerte​​​​. Este conjunto de datos proporciona una rica fuente de información para investigar la asociación entre los niveles de cadena ligera libre en suero y la mortalidad, además de explorar otros factores como la edad, el género, el año de la muestra, y la función renal. La interpretación correcta y el análisis detallado de cada variable permiten comprender mejor la relación entre las cadenas ligeras libres en suero y la salud en general.
Alguien podría pasar las versiones especificas con las que corren? un pip freeze o algo? es muy complicado intentar hacer que sirvan las versiones. Gracias

Siempre trabajando dentro de un enviroment

Ecce requirements.txt:

numpy
pandas
pandas-flavor
matplotlib
seaborn
plotly
statsmodels
scikit-learn
scipy
ipywidgets
ozon3
pyjanitor
pyreadr
fancyimpute
missingno
nhanes
session-info
upsetplot

Es empezar un curso de programación y encontrarse con 4 mil errores :’(

Si alguien esta replicando paso a paso el ejecicio en otros lugar diferente a Deep note, y les sale este error

AttributeError: 'DataFrame' object has no attribute 'clean_names'

La solucion es facil, ya que lo unico qu deben hacer es importar janitor, ya que clean_name forma parte de esta libreria

import janitor

codigo airquality_df

airquality_df = (
    sm.datasets.get_rdataset("airquality")
    .data
    .clean_names(
        case_type = "snake"
    )
    .add_column("year", 1973)
    #.assign(
    #    date = lambda df: df.to_datetime(df[["year","month","day"]])
    #)
    #.sort_values(by="date")
    #.set_index("date")
)
airquality_df