Tarea datos nulos

Author

Nicolas Rodriguez y Luis Peñaranda

Carga de Datos

library(tidyverse)
library(mice)
library(outliers)
library(ggplot2)
library(dplyr)
library(pracma)

# Cargar datos
df <- read.csv("diabetes.csv")

# Reemplazo de ceros por NA en variables relevantes
df[df == 0] <- NA

Exploración Inicial de Datos

summary(df)
  Pregnancies        Glucose      BloodPressure    SkinThickness  
 Min.   : 1.000   Min.   : 44.0   Min.   : 24.00   Min.   : 7.00  
 1st Qu.: 2.000   1st Qu.: 99.0   1st Qu.: 64.00   1st Qu.:22.00  
 Median : 4.000   Median :117.0   Median : 72.00   Median :29.00  
 Mean   : 4.495   Mean   :121.7   Mean   : 72.41   Mean   :29.15  
 3rd Qu.: 7.000   3rd Qu.:141.0   3rd Qu.: 80.00   3rd Qu.:36.00  
 Max.   :17.000   Max.   :199.0   Max.   :122.00   Max.   :99.00  
 NA's   :111      NA's   :5       NA's   :35       NA's   :227    
    Insulin            BMI        DiabetesPedigreeFunction      Age       
 Min.   : 14.00   Min.   :18.20   Min.   :0.0780           Min.   :21.00  
 1st Qu.: 76.25   1st Qu.:27.50   1st Qu.:0.2437           1st Qu.:24.00  
 Median :125.00   Median :32.30   Median :0.3725           Median :29.00  
 Mean   :155.55   Mean   :32.46   Mean   :0.4719           Mean   :33.24  
 3rd Qu.:190.00   3rd Qu.:36.60   3rd Qu.:0.6262           3rd Qu.:41.00  
 Max.   :846.00   Max.   :67.10   Max.   :2.4200           Max.   :81.00  
 NA's   :374      NA's   :11                                              
    Outcome   
 Min.   :1    
 1st Qu.:1    
 Median :1    
 Mean   :1    
 3rd Qu.:1    
 Max.   :1    
 NA's   :500  

Gráficos para Identificación de Datos Atípicos

# Histogramas
ggplot(df, aes(x = BMI)) + geom_histogram(binwidth = 2, fill = "blue", alpha = 0.7) + theme_minimal()

ggplot(df, aes(y = BMI)) + geom_boxplot(fill = "red", alpha = 0.5) + theme_minimal()

Imputación de Datos Faltantes

# Imputación con método pmm
imputed_data <- mice(df, method = "pmm", m = 5)

 iter imp variable
  1   1  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  1   2  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  1   3  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  1   4  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  1   5  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  2   1  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  2   2  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  2   3  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  2   4  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  2   5  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  3   1  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  3   2  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  3   3  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  3   4  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  3   5  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  4   1  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  4   2  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  4   3  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  4   4  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  4   5  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  5   1  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  5   2  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  5   3  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  5   4  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
  5   5  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin  BMI
df_imputed <- complete(imputed_data)

Tratamiento de Valores Atípicos

# Aplicar capping para valores extremos
Q1 <- quantile(df_imputed$BMI, 0.25, na.rm = TRUE)
Q3 <- quantile(df_imputed$BMI, 0.75, na.rm = TRUE)
IQR <- Q3 - Q1
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR
df_imputed$BMI <- ifelse(df_imputed$BMI < lower_bound, lower_bound, ifelse(df_imputed$BMI > upper_bound, upper_bound, df_imputed$BMI))

Gráficos Después del Ajuste

# Histogramas después del ajuste
ggplot(df_imputed, aes(x = BMI)) + geom_histogram(binwidth = 2, fill = "green", alpha = 0.7) + theme_minimal()

ggplot(df_imputed, aes(y = BMI)) + geom_boxplot(fill = "purple", alpha = 0.5) + theme_minimal()

Prueba de Kruskal-Wallis para Igualdad de Distribuciones

kruskal_test <- kruskal.test(list(df$BMI, df_imputed$BMI))
kruskal_test

    Kruskal-Wallis rank sum test

data:  list(df$BMI, df_imputed$BMI)
Kruskal-Wallis chi-squared = 0.00043099, df = 1, p-value = 0.9834

Basandonos en estos resultados podemos confirmar que la distribución entre el dataset inicial y el ajustado no tienen diferencias estadísticamente significativas.

Conclusiones

Se realizó una limpieza de datos, imputación de valores faltantes y tratamiento de valores atípicos.

Se compararon las distribuciones antes y después del ajuste mediante histogramas y la prueba de Kruskal-Wallis para verificar si la distribución se vio afectada.