Proceso de análisis y limpieza de datos

2/17
Recursos

Aportes 17

Preguntas 4

Ordenar por:

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

Esto es lo que dice ChatGPT sobre NHANES:

  • NHANES (National Health and Nutrition Examination Survey) es una encuesta realizada por el gobierno de los Estados Unidos que recopila información sobre la salud y la nutrición de la población estadounidense. En Python, NHANES se refiere al conjunto de datos de esta encuesta que se han puesto a disposición del público en formato de archivo.

  • El conjunto de datos de NHANES en Python puede ser utilizado por investigadores, científicos de datos y profesionales de la salud para realizar análisis estadísticos y epidemiológicos. El conjunto de datos incluye información sobre una amplia variedad de variables, como edad, sexo, raza, antecedentes médicos, medidas antropométricas, resultados de laboratorio y encuestas de dieta.

  • En Python, existen paquetes especializados que permiten a los usuarios cargar y manipular los datos de NHANES, como Pandas y NumPy. Además, también existen librerías de visualización de datos, como Matplotlib y Seaborn, que pueden utilizarse para visualizar los datos de NHANES.

  • En resumen, NHANES en Python es una herramienta útil para la investigación en salud y nutrición, que permite a los usuarios realizar análisis estadísticos y epidemiológicos basados en datos confiables y de gran calidad.

A pesar que se eliminaron los registros con valores faltantes para la variable diabetes debe tenerse argumentos bien claros por lo que se hizo. Esto se debe a que se pierde informacion en otras variables que podrian ser relevantes. Todo depende del analisis que se quiere realizar.

¿Por qué “Borderline” realmente no nos interesa?
No es un dato faltante, puede ser una condición de pre-diabetes?

2. Proceso de análisis y limpieza de datos

nhanes_raw_df = (
    nhanes.load.load_NHANES_data(year='2017-2018')
    .clean_names(case_type='snake')
    
)
nhanes_raw_df.shape

nhanes_df = (
    nhanes_raw_df
    .select_columns(
        'general_health_condition',
        'age_in_years_at_screening',
        'gender',
        'current_selfreported_height_inches',
        'current_selfreported_weight_pounds',
        'doctor_told_you_have_diabetes',
        '60_sec_pulse30_sec_pulse2',
        'total_cholesterol_mgdl'
        
    )
    .rename_columns(
        {
            'age_in_years_at_screening': 'age',
            'current_selfreported_height_inches': 'height',
            'current_selfreported_weight_pounds': 'weight',
            'doctor_told_you_have_diabetes': 'diabetes',
            '60_sec_pulse30_sec_pulse2': 'pulse',
            'total_cholesterol_mgdl': 'total_cholesterol'
        }
    )
    .replace(
        {
            'height': {
                9999: np.nan,
                7777: np.nan,
            },
            'weight': {
                9999: np.nan,
                7777: np.nan,
            },
            'diabetes': {
                'Borderline': np.nan
            }
        }
    )
    .missing.sort_variables_by_missingness()
    .dropna(
        subset = ['diabetes'],
        how = 'any'
    )
    .transform_column(
        column_name = 'diabetes',
        function = lambda s: s.astype(int),
        elementwise = False
    )
)
nhanes_df.head()

Cambiar nombres de las variables

nhanes_df = (
    nhanes_raw_df
    .select_columns(
        "general_health_condition",
        "age_in_years_at_screening",
        "gender",
        "current_selfreported_height_inches",
        "current_selfreported_weight_pounds",
        "doctor_told_you_have_diabetes",
        "60_sec_pulse30_sec_pulse2",
        "total_cholesterol_mgdl"
    )   # cambiar nombre de las columnas seleccionadas mediante un dict
    .rename_columns(
        {
            "age_in_years_at_screening":"age",
            "current_selfreported_height_inches":"height",
            "current_selfreported_weight_pounds":"weight",
            "doctor_told_you_have_diabetes":"diabetes",
            "60_sec_pulse30_sec_pulse2":"pulse",
            "total_cholesterol_mgdl":"total_cholesterol"
        }
    )

Una funcion muy util!

El proceso de análisis y limpieza de datos es crucial en el trabajo con datos para garantizar que los datos sean precisos, consistentes y listos para el análisis. Aquí te presento un proceso general que puedes seguir para el análisis y limpieza de datos: \### 1. \*\*Recolección de Datos\*\* \- \*\*Fuentes de Datos:\*\* Identifica y recolecta datos de diversas fuentes como bases de datos, archivos CSV, API, etc. \- \*\*Formato y Estructura:\*\* Asegúrate de que los datos estén en un formato estructurado adecuado (p. ej., CSV, Excel, JSON). \### 2. \*\*Exploración de Datos\*\* \- \*\*Carga de Datos:\*\* Utiliza herramientas como Pandas para cargar los datos en un DataFrame. ```python import pandas as pd df = pd.read\_csv('datos.csv') ``` \- \*\*Resumen Inicial:\*\* Examina un resumen general de los datos. ```python print(df.head()) print(df.info()) print(df.describe()) ``` \- \*\*Identificación de Valores Faltantes:\*\* Revisa la presencia de valores faltantes. ```python print(df.isnull().sum()) ``` \### 3. \*\*Limpieza de Datos\*\* \- \*\*Manejo de Valores Faltantes:\*\* \- \*\*Eliminación:\*\* Elimina filas o columnas con valores faltantes si es aceptable. ```python df.dropna() # Elimina filas con valores faltantes ``` \- \*\*Imputación:\*\* Reemplaza valores faltantes con valores estadísticos como la media, mediana, moda o utilizando técnicas más avanzadas. ```python df.fillna(df.mean()) # Reemplaza valores faltantes con la media ``` \- \*\*Corrección de Errores:\*\* \- \*\*Valores Incorrectos:\*\* Identifica y corrige errores en los datos. ```python df\['column'] = df\['column'].replace('incorrect\_value', 'correct\_value') ``` \- \*\*Duplicados:\*\* Elimina filas duplicadas si es necesario. ```python df.drop\_duplicates() ``` \- \*\*Normalización y Transformación:\*\* \- \*\*Escalado:\*\* Normaliza o escala los datos si es necesario. ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() df\[\['column']] = scaler.fit\_transform(df\[\['column']]) ``` \- \*\*Codificación:\*\* Codifica variables categóricas si es necesario. ```python df = pd.get\_dummies(df, columns=\['categorical\_column']) ``` \### 4. \*\*Visualización de Datos\*\* \- \*\*Gráficos Básicos:\*\* Utiliza gráficos básicos para explorar la distribución y las relaciones en los datos. ```python import matplotlib.pyplot as plt df\['column'].hist() plt.show() ``` \- \*\*Visualización de Valores Faltantes:\*\* Utiliza gráficos para visualizar los patrones de los valores faltantes. ```python import seaborn as sns sns.heatmap(df.isnull(), cbar=False, cmap='viridis') plt.show() ``` \### 5. \*\*Análisis de Datos\*\* \- \*\*Estadísticas Descriptivas:\*\* Calcula estadísticas descriptivas y explora la distribución de los datos. ```python print(df.describe()) ``` \- \*\*Correlación:\*\* Examina la correlación entre variables. ```python print(df.corr()) sns.heatmap(df.corr(), annot=True) plt.show() ``` \### 6. \*\*Documentación y Reporte\*\* \- \*\*Documentación:\*\* Documenta todos los pasos tomados, decisiones y transformaciones realizadas. \- \*\*Reporte:\*\* Genera informes que resuman el estado de los datos y los resultados del análisis. \### Herramientas Comunes \- \*\*Python Libraries:\*\* Pandas, NumPy, Matplotlib, Seaborn, Scikit-learn. \- \*\*Software de BI:\*\* Power BI, Tableau. \- \*\*Jupyter Notebooks:\*\* Para documentar y ejecutar el análisis de manera interactiva. Este proceso puede variar según el contexto y los requisitos específicos del proyecto, pero estos pasos proporcionan una guía general para el análisis y la limpieza de datos.

Alguien me puede ayudar? cada vez que duplico el proyecto y lo trabajo funciona perfecto, pero cuando se apaga el notebook, y lo vuelvo a encender y trato de ejecutar empieza a dar errores con los import y librerias, y la unica forma de solucionarlo es borrando el proyecto y creandolo de nuevo

chequeado:


# Ordenar solo la columna de mayor a menor
sorted_heights = nhanes_raw_df['current_selfreported_height_inches'].sort_values(ascending=False)
sorted_weights = nhanes_raw_df['current_selfreported_weight_pounds'].sort_values(ascending=False)

# Imprimir la columna ordenada
print(sorted_heights)
print(sorted_weights)

por si acaso…

Para confirmar si tenemos datos tipo MCAR o MAR podemos usar la prueba de chi squared: <https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chi2_contingency.html> ```js #from scipy.stats import chi2_contingency def chi_square_test(df: pd.DataFrame): for col in df.columns: if df[col].isnull().sum() > 0: for col2 in df.columns: if col != col2 and df[col2].isnull().sum() == 0: table = pd.crosstab(df[col].isnull(), df[col2]) chi2, p, dof, ex = chi2_contingency(table) print(f'Chi-square test between {col} and {col2}: p-value = {p}') chi_square_test(df_nh) ```resultados: ![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-07-25%20a%20la%28s%29%206.28.17p.m.-ab2fde90-47b9-48d8-ae29-9a2fdf6a9a96.jpg) donde **p-value**: es una medida de la evidencia contra una hipótesis nula. Un valor p bajo indica una fuerte evidencia contra la hipótesis nula *(a partir de ahora H\_0)*. * en nuestro contexto de los datos nulos, H\_0 indica que los nulos son completamente al azar *(o sea MCAR)* ![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-07-25%20a%20la%28s%29%206.51.11p.m.-6f47c69c-a04f-4b1b-ae68-d400f50edbe5.jpg) **interpretación**: en estos casos se observa una fuerte evidencia contra H\_0 de que los datos nulos son MCAR. * Por lo tanto, *es probable* que estos nulos en esas variables estén relacionados con otras variables en el dataset. Lo cual sugiere que los datos podríasn ser MAR ![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-07-25%20a%20la%28s%29%206.51.16p.m.-fe15128d-7713-4300-b7c8-4f51ffe1a29b.jpg) **interpretación**: en estas otras relaciones observamos que no hay suficiente evidencia para rechazar H\_0. * Lo cual sugiere que los nulos en estas variables podrían ser MCAR con respecto a las variables analizadas (*en este caso, el género)* **¿Y ahora qué?** Si los datos son **MCAR**: imputamos :D Si los datos son **MAR**: deberíamos usar métodologías más avanzadas de imputación (como **MICE**) o modelos predictivos, confirmamos que no salgan cosas raras *(análisis descriptivos)* y hacer pruebas de sensibilidad para evaluar cómo diferentes métodos de imputación afectan los resultados y asegurarnos de no haberla c\*\*\*
Yo lo cambie de la siguiente manera: ```js (nhanes_raw_df.select_columns( "general_health_condition", "age_in_years_at_screening", "gender", "current_selfreported_height_inches", "current_selfreported_weight_pounds", "doctor_told_you_have_diabetes", "60_sec_pulse30_sec_pulse2", "total_cholesterol_mgdl" ) .rename(columns={'general_health_condition': 'health_condition'}) .rename(columns={'age_in_years_at_screening': 'age'}) .rename(columns={'current_selfreported_height_inches': 'height_inches'}) .rename(columns={'current_selfreported_weight_pounds': 'weight_pounds'}) .rename(columns={'doctor_told_you_have_diabetes': 'diabetes'}) .rename(columns={'60_sec_pulse30_sec_pulse2': 'pulse'}) .rename(columns={'total_cholesterol_mgdl': 'cholesterol'}) ) ```(nhanes\_raw\_df.select\_columns(    "general\_health\_condition",    "age\_in\_years\_at\_screening",    "gender",    "current\_selfreported\_height\_inches",    "current\_selfreported\_weight\_pounds",    "doctor\_told\_you\_have\_diabetes",    "60\_sec\_pulse30\_sec\_pulse2",    "total\_cholesterol\_mgdl").rename(columns={'general\_health\_condition': 'health\_condition'}).rename(columns={'age\_in\_years\_at\_screening': 'age'}).rename(columns={'current\_selfreported\_height\_inches': 'height\_inches'}).rename(columns={'current\_selfreported\_weight\_pounds': 'weight\_pounds'}).rename(columns={'doctor\_told\_you\_have\_diabetes': 'diabetes'}).rename(columns={'60\_sec\_pulse30\_sec\_pulse2': 'pulse'}).rename(columns={'total\_cholesterol\_mgdl': 'cholesterol'}) )
```js .dropna( subset = ["diabetes"], how = "any" ) ```En esta parte no es necesario colocar any ya que esta por defecto en dropna :)
📝 **Mi resumen de la clase** 📌 Limpiar los datos antes de imputarlos. **Pasos de la limpieza de datos:** 1. Selección de variables: Dejar solo las variables necesarias para el análisis. 2. Cambio de nombre a las variables: Definir nombres más legibles. 3. Cambio de representación de valores faltantes: Identificar como están codificados los valores faltantes y reemplazarlo por un `np.nan`. 4. Ordenar dataset: De mayor a menor cantidad de valores faltantes 5. Eliminar observaciones con valores faltantes: observaciones de valores faltantes en una variable cuando sea una proporción no significativa o muy pequeña 6. Cambio de tipo de datos: Si la variable solo tiene valores enteros y la herramienta nos dice que son tipo Object, modificarlo al tipo de dato correspondiente.

para ver los máximos y los minimos:

# Seleccionar solo las columnas numéricas
numeric_columns = nhanes_raw_df.select_dtypes(include='number')

# Encontrar el valor máximo y mínimo de cada columna
max_values = numeric_columns.max()
min_values = numeric_columns.min()

# Configurar la visualización para mostrar todas las filas y columnas
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)

print("Valores máximos:")
print(max_values)

print("\nValores mínimos:")
print(min_values)
Hola familia! Perdón pero tengo una duda, estoy trabajando desde jupyter notebooks en vscode y quería saber si conocen una manera de que al cargar los dataframes muestren la displot con los datos faltantes arriba de cada columna como en deepnote. Gracias!