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] <- NATarea datos nulos
Carga de Datos
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.