—7 title: “Diabetes” author: “Mariana Castañeda & Shadia Jaafar” date: “2024-04-03” output: html_document —
library(readr)
## Warning: package 'readr' was built under R version 4.3.3
library(lattice)
## Warning: package 'lattice' was built under R version 4.3.3
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.1
library(gridExtra)
## Warning: package 'gridExtra' was built under R version 4.3.2
library(visdat)
## Warning: package 'visdat' was built under R version 4.3.3
library(outliers)
## Warning: package 'outliers' was built under R version 4.3.1
library(EnvStats)
## Warning: package 'EnvStats' was built under R version 4.3.3
##
## Attaching package: 'EnvStats'
## The following objects are masked from 'package:stats':
##
## predict, predict.lm
library(mice)
## Warning: package 'mice' was built under R version 4.3.3
##
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
##
## filter
## The following objects are masked from 'package:base':
##
## cbind, rbind
library(VIM)
## Warning: package 'VIM' was built under R version 4.3.3
## Loading required package: colorspace
## Loading required package: grid
## VIM is ready to use.
## Suggestions and bug-reports can be submitted at: https://github.com/statistikat/VIM/issues
##
## Attaching package: 'VIM'
## The following object is masked from 'package:datasets':
##
## sleep
library(ggplot2)
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.1
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.3 ✔ stringr 1.5.0
## ✔ forcats 1.0.0 ✔ tibble 3.2.1
## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0
## ✔ purrr 1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::combine() masks gridExtra::combine()
## ✖ dplyr::filter() masks mice::filter(), stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(hrbrthemes)
## Warning: package 'hrbrthemes' was built under R version 4.3.3
library(gridExtra)
library(foreign)
## Warning: package 'foreign' was built under R version 4.3.2
url <- "https://raw.githubusercontent.com/lihkir/Data/main/diabetes.csv"
diabetes<- read.csv(url)
names(diabetes)
## [1] "Pregnancies" "Glucose"
## [3] "BloodPressure" "SkinThickness"
## [5] "Insulin" "BMI"
## [7] "DiabetesPedigreeFunction" "Age"
## [9] "Outcome"
head(diabetes)
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 1 6 148 72 35 0 33.6
## 2 1 85 66 29 0 26.6
## 3 8 183 64 0 0 23.3
## 4 1 89 66 23 94 28.1
## 5 0 137 40 35 168 43.1
## 6 5 116 74 0 0 25.6
## DiabetesPedigreeFunction Age Outcome
## 1 0.627 50 1
## 2 0.351 31 0
## 3 0.672 32 1
## 4 0.167 21 0
## 5 2.288 33 1
## 6 0.201 30 0
str(diabetes)
## 'data.frame': 768 obs. of 9 variables:
## $ Pregnancies : int 6 1 8 1 0 5 3 10 2 8 ...
## $ Glucose : int 148 85 183 89 137 116 78 115 197 125 ...
## $ BloodPressure : int 72 66 64 66 40 74 50 0 70 96 ...
## $ SkinThickness : int 35 29 0 23 35 0 32 0 45 0 ...
## $ Insulin : int 0 0 0 94 168 0 88 0 543 0 ...
## $ BMI : num 33.6 26.6 23.3 28.1 43.1 25.6 31 35.3 30.5 0 ...
## $ DiabetesPedigreeFunction: num 0.627 0.351 0.672 0.167 2.288 ...
## $ Age : int 50 31 32 21 33 30 26 29 53 54 ...
## $ Outcome : int 1 0 1 0 1 0 1 0 1 1 ...
summary(diabetes)
## Pregnancies Glucose BloodPressure SkinThickness
## Min. : 0.000 Min. : 0.0 Min. : 0.00 Min. : 0.00
## 1st Qu.: 1.000 1st Qu.: 99.0 1st Qu.: 62.00 1st Qu.: 0.00
## Median : 3.000 Median :117.0 Median : 72.00 Median :23.00
## Mean : 3.845 Mean :120.9 Mean : 69.11 Mean :20.54
## 3rd Qu.: 6.000 3rd Qu.:140.2 3rd Qu.: 80.00 3rd Qu.:32.00
## Max. :17.000 Max. :199.0 Max. :122.00 Max. :99.00
## Insulin BMI DiabetesPedigreeFunction Age
## Min. : 0.0 Min. : 0.00 Min. :0.0780 Min. :21.00
## 1st Qu.: 0.0 1st Qu.:27.30 1st Qu.:0.2437 1st Qu.:24.00
## Median : 30.5 Median :32.00 Median :0.3725 Median :29.00
## Mean : 79.8 Mean :31.99 Mean :0.4719 Mean :33.24
## 3rd Qu.:127.2 3rd Qu.:36.60 3rd Qu.:0.6262 3rd Qu.:41.00
## Max. :846.0 Max. :67.10 Max. :2.4200 Max. :81.00
## Outcome
## Min. :0.000
## 1st Qu.:0.000
## Median :0.000
## Mean :0.349
## 3rd Qu.:1.000
## Max. :1.000
Embarazos (Pregnancies): Varían de 0 a 17, con una mediana de 3, lo que sugiere que la mitad de las mujeres en el estudio han tenido 3 o menos embarazos.
Glucosa: Los niveles oscilan entre 0 y 199, con una mediana de 72. Un valor mínimo de 0 puede ser un error de medición o un dato faltante, ya que no es un valor plausible para niveles de glucosa.
Presión Arterial (BloodPressure): Los valores van de 0 a 122, con una mediana de 72. Al igual que con la glucosa, un valor mínimo de 0 podría ser un dato erróneo.
Espesor de la piel (SkinThickness): Rangos de 0 a 99, con una mediana de 23. Los valores mínimos de 0 podrían ser valores perdidos o errores.
Insulina: Oscila entre 0.0780 y 846.0, con una mediana de 30.5. Los valores extremadamente altos o bajos pueden indicar condiciones médicas anormales o errores en los datos.
Índice de Masa Corporal (BMI): Rangos de 0.0 a 67.10. Un BMI de 0 no es plausible y podría ser un valor faltante.
Función del Pedigrí de Diabetes (DiabetesPedigreeFunction): Varía de -2.4200 (valor que no es posible clínicamente y probablemente es un error) a 2.4200, con una media de 0.4719.
Edad (Age): Va de 21 a 81 años, lo que indica que la población del estudio está compuesta principalmente de adultos.
Resultado (Outcome): Es una variable binaria con valores de 0 y 1. La media es 0.349, lo que sugiere que alrededor del 34.9% de los participantes en el estudio tienen diabetes, asumiendo que 1 indica la presencia de la enfermedad.
diabetes$Glucose <- ifelse(diabetes$Glucose == 0.0, NA, diabetes$Glucose)
diabetes$BloodPressure <- ifelse(diabetes$BloodPressure == 0.0, NA, diabetes$BloodPressure)
diabetes$SkinThickness <- ifelse(diabetes$SkinThickness == 0.0, NA, diabetes$SkinThickness)
diabetes$Insulin <- ifelse(diabetes$Insulin == 0.0, NA, diabetes$Insulin)
diabetes$BMI <- ifelse(diabetes$BMI == 0.0, NA, diabetes$BMI)
table(diabetes$Outcome)
##
## 0 1
## 500 268
g <- ggplot(diabetes, aes(x = factor(Outcome), fill = factor(Outcome))) +
geom_bar() +
scale_x_discrete(labels = c("No diabetes", "Diabetes")) +
scale_fill_manual(values = c("green", "red")) +
labs(title = "Histograma de Outcome", x = "Outcome", y = "Frecuencia") +
theme(legend.position = "none")
# Mostrar el gráfico
print(g)
Según el histograma, hay más observaciones de individuos sin diabetes
que de aquellos con diabetes en este conjunto de datos. Esto puede
indicar una prevalencia más baja de diabetes dentro de la población
estudiada
# Crear el gráfico
g0 <- ggplot(diabetes, aes(x = factor(Pregnancies), fill = factor(Outcome))) +
geom_bar(position = "dodge") +
scale_fill_manual(values = c("green", "red")) +
labs(title = "Histograma de Embarazos por Outcome", x = "Embarazos", y = "Frecuencia")
# Mostrar el gráfico
print(g0)
Hay mayor frecuencia de personas sin diabetes en todo el rango de
embarazos. La frecuencia de embarazos disminuye a medida que aumenta su
número, y hay una mayor proporción de personas sin diabetes en el rango
de 0 a 2 embarazos. La diferencia entre las frecuencias de personas con
y sin diabetes se reduce en aquellos con un mayor número de
embarazos.
g1 <- ggplot(diabetes, aes(x = factor(Glucose), fill = factor(Outcome))) +
geom_bar(position = "dodge") +
scale_fill_manual(values = c("green", "red"), name = "Outcome") +
labs(title = "Histograma de glucosa por Outcome", x = "Glucosa", y = "Frecuencia")
# Mostrar el gráfico
print(g1)
Las barras verdes, representativas de individuos sin diabetes, muestran una distribución más concentrada en niveles de glucosa más bajos, mientras que las barras rojas, correspondientes a individuos con diabetes, se observan en todo el rango de glucosa, siendo más frecuentes en niveles más altos. Esta mayor concentración de barras verdes en el rango inferior es coherente con la idea de que los individuos sin diabetes tienden a tener niveles de glucosa más bajos.
# Crear el gráfico para BloodPressure y Outcome
g2 <- ggplot(diabetes, aes(x = factor(BloodPressure), fill = factor(Outcome))) +
geom_bar(position = "dodge") +
scale_fill_manual(values = c("green", "red"), name = "Outcome") +
labs(title = "Presión Sanguínea por Outcome", x = "Presión Sanguínea", y = "Frecuencia")
print(g2)
La mayoría de las observaciones, tanto para individuos sin diabetes como
con diabetes, se concentran en lo que parece ser el rango medio de
presión sanguínea. Las barras verdes (sin diabetes) son generalmente más
altas que las rojas (con diabetes), lo que indica una mayor frecuencia
de presión sanguínea en el grupo sin diabetes. Sin emabrgo,el histograma
que sugiere que la presión sanguínea por sí sola no es un indicador
definitivo de diabetes dado que ambos grupos parecen distriburise se
manera similar.
g3 <- ggplot(diabetes, aes(x = factor(SkinThickness), fill = factor(Outcome))) +
geom_bar(position = "dodge") +
scale_fill_manual(values = c("green", "red"), name = "Outcome") +
labs(title = "Grosor de Piel por Outcome", x = "Grosor de Piel", y = "Frecuencia")
print(g3)
las barras de ambas categorias están distribuidas a lo largo del eje del
grosor de la piel, con alturas que varían pero generalmente menores en
el grupo con diabetes. Esto podría interpretarse como que no hay una
diferencia sustancial en la distribución del grosor de la piel entre
tener y no tener diabetes
(vemos que hay una cantidad de Nas en ambos casos)
g4 <- ggplot(diabetes, aes(x = factor(Insulin), fill = factor(Outcome))) +
geom_bar(position = "dodge") +
scale_fill_manual(values = c("green", "red"), name = "Outcome") +
labs(title = "Insulina por Outcome", x = "Insulina", y = "Frecuencia")
print(g4)
la distribución, tanto verde como roja, se mantienen relativamente bajas
y dispersas a lo largo del eje de insulina, sin embargo hay una
presenecia significativa de Nas.
# Gráfico para Age y Outcome
g5 <- ggplot(diabetes, aes(x = factor(Age), fill = factor(Outcome))) +
geom_bar(position = "dodge") +
scale_fill_manual(values = c("green", "red"), name = "Outcome") +
labs(title = "Edad por Outcome", x = "Edad", y = "Frecuencia")
print(g5)
las personas sin diabetes, tienen una frecuencia más alta en edades
menores, y la frecuencia de estas disminuye de manera más pronunciada
con la edad que las barras rojas. Esto puede sugerir que hay mayor
proporción de individuos más jóvenes sin diabetes. Las barras rojas, que
representan a las personas con diabetes, también disminuyen con la edad,
pero la disminución parece más gradua
# Gráfico para DiabetesPedigreeFunction y Outcome
g6 <- ggplot(diabetes, aes(x = factor(DiabetesPedigreeFunction), fill = factor(Outcome))) +
geom_bar(position = "dodge") +
scale_fill_manual(values = c("green", "red"), name = "Outcome") +
labs(title = "Función de Pedigrí de Diabetes por Outcome", x = "Función de Pedigrí de Diabetes", y = "Frecuencia")
print(g6)
El gráfico muestra que mientras hay una amplia variabilidad en los
valores de la función de pedigrí en ambos grupos, no hay una distinción
clara entre los dos grupos basada únicamente en esta medida, aunque
vemos que la clase sin diabetes presenta en general, picos mas altos
# Gráfico para BMI y Outcome
g7 <- ggplot(diabetes, aes(x = factor(BMI), fill = factor(Outcome))) +
geom_bar(position = "dodge") +
scale_fill_manual(values = c("green", "red"), name = "Outcome") +
labs(title = "Índice de Masa Corporal (BMI) por Outcome", x = "BMI", y = "Frecuencia") +
theme(legend.position = "none")
print(g7)
Se observa que las barras verdes son predominantes en la mayoría de los
rangos de BMI, indicando una mayor frecuencia de individuos sin diabetes
a través de varios niveles de BMI. Las barras rojas, que señalan
individuos con diabetes, también están presentes a lo largo de todo el
rango, pero con menos frecuencia y sesgado un poco mas a la derecha
out <- boxplot.stats(diabetes$Pregnancies)$out
boxplot(diabetes$Pregnancies,
ylab = "Embarazos",
main = "Boxplot de Embarazo"
)
mtext(paste("Outliers: ", paste(out, collapse = ", ")))
length(out)
## [1] 4
la mayoría de las mujeres han tenido un número de embarazos que cae dentro del rango de la caja y los bigotes. La presencia de valores atípicos sugiere que hay algunas mujeres que han tenido un número significativamente más alto de embarazos comparado con el resto (14, 15 17 embarazos), sin embargo, más de la mitad de las mujeres han tenido menos de 5 embarazos.
out <- boxplot.stats(diabetes$Glucose)$out
boxplot(diabetes$Glucose,
ylab = "Glucosa",
main = "Boxplot de Glucosa"
)
mtext(paste("Outliers: ", paste(out, collapse = ", ")))
length(out)
## [1] 0
Parece que no hay valores atípicos, ya que no se observan puntos individuales que excedan los límites de los bigotes. La mediana está ubicada por debajo del nivel de glucosa de 120 mg/dl, que es el umbral comúnmente utilizado para determinar el nivel de glucosa en ayunas. Esto sugiere que más de la mitad de los individuos en el conjunto de datos tienen niveles normales en glucosa
out <- boxplot.stats(diabetes$BloodPressure)$out
boxplot(diabetes$BloodPressure,
ylab = "Presión Sanguíneo",
main = "Boxplot de Presión Sanguínea"
)
mtext(paste("Outliers: ", paste(out, collapse = ", ")))
length(out)
## [1] 14
La mediana está en un rango que podría considerarse normal para la presión sanguínea, probablemente alrededor de 70-80 mmHg. ademáas, este gráfico indica que, si bien la mayoría de los datos se agrupan dentro de un rango considerado normal o prehipertenso, hay una cantidad notable de valores extremadamente bajos y altos.
out <- boxplot.stats(diabetes$SkinThickness)$out
boxplot(diabetes$SkinThickness,
ylab = "Grosor de Piel",
main = "Boxplot de Grosor de Piel"
)
mtext(paste("Outliers: ", paste(out, collapse = ", ")))
length(out)
## [1] 3
El grosor de la piel se concentra principalmente en el rango de aproximadamente 20 a 30 unidades, con la mediana alrededor de 25.
Se identifican tres valores atípicos: 60, 63 y 99. Estos valores están notablemente más altos que la mayoría de las otras medidas de grosor de piel en el conjunto de datos.
out <- boxplot.stats(diabetes$Insulin)$out
boxplot(diabetes$Insulin,
ylab = "Insulina",
main = "Boxplot de Insulina"
)
mtext(paste("Outliers: ", paste(out, collapse = ", ")))
length(out)
## [1] 24
Existen numerosos valores atípicos identificados en la parte superior del gráfico, los cuales están significativamente por encima del tercer cuartil, indicando que hay individuos con niveles de insulina excepcionalmente altos. La mediana de los niveles de insulina está cerca del borde inferior de la caja, lo que sugiere que la mayoría de los individuos tienen niveles de insulina más bajos, mientras que una menor cantidad de individuos tiene niveles significativamente más altos.
out <- boxplot.stats(diabetes$BMI)$out
boxplot(diabetes$Insulin,
ylab = "BMI",
main = "Boxplot de BMI"
)
mtext(paste("Outliers: ", paste(out, collapse = ", ")))
length(out)
## [1] 8
La caja del boxplot, se sitúa relativamente baja en la escala, lo que sugiere que la mayoría de los valores de BMI se encuentran en un rango más bajo.Por otro lado, la mediana, está más cercana al primer cuartil que al tercer cuartil, sugiriendo un sesgo en la distribución. Los valores atípicos están todos en el extremo superior de la escala, y hay un número significativo de ellos, lo que indica que hay individuos con BMIs muy altos en comparación con el resto. No hay valores atípicos en el extremo inferior de la escala.
out <- boxplot.stats(diabetes$Age)$out
boxplot(diabetes$Age,
ylab = "Edad",
main = "Boxplot de Edad"
)
mtext(paste("Outliers: ", paste(out, collapse = ", ")))
length(out)
## [1] 9
Hay varios valores atípicos indicados, todos los cuales están en el extremo superior de la escala de edad, con edades como 69, 67, 72, 81, etc., que están por encima del rango normal. La mediana parece estar en los 30 años, indicando que más de la mitad de las personas en el conjunto de datos están por debajo de esta edad
out <- boxplot.stats(diabetes$DiabetesPedigreeFunction)$out
boxplot(diabetes$DiabetesPedigreeFunction,
ylab = "Pedigrí",
main = "Boxplot de Pedigrí"
)
mtext(paste("Outliers: ", paste(out, collapse = ", ")))
length(out)
## [1] 29
Hay una serie de valores atípicos en el extremo superior, lo que indica que hay individuos con valores altos de la función de pedigrí de la diabetes, considerablemente más altos que la mayoría de los datos. La distribución de la función de pedigrí de la diabetes tiene un sesgo positivo, con una cola de valores que se extiende hacia la derecha, más allá del tercer cuartil. ## Percentiles
find_outliers <- function(data, variable) {
df_omit<-na.omit(data)
lower_bound <- quantile(df_omit[[variable]], 0.025, na.rm = TRUE)
upper_bound <- quantile(df_omit[[variable]], 0.975, na.rm = TRUE)
outlier_ind <- which(df_omit[[variable]] < lower_bound | df_omit[[variable]] > upper_bound)
outliers_df <- df_omit[outlier_ind, ]
return(outliers_df)
}
outliers_Pregnancies <- find_outliers(diabetes, "Pregnancies")
outliers_Pregnancies
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 29 13 145 82 19 110 22.2
## 89 15 136 70 32 110 37.1
## 160 17 163 72 41 114 40.9
## 299 14 100 78 25 184 36.6
## 324 13 152 90 33 29 26.8
## 745 13 153 88 37 140 40.6
## DiabetesPedigreeFunction Age Outcome
## 29 0.245 57 0
## 89 0.153 43 1
## 160 0.817 47 1
## 299 0.412 46 1
## 324 0.731 43 1
## 745 1.174 39 0
num_outliers<- nrow(outliers_Pregnancies)
num_outliers
## [1] 6
Tomando los percentiles 25% y 75% se identifican los anteriores 6 datos atipicos.
outliers_Glucose <- find_outliers(diabetes, "Glucose")
outliers_Glucose
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 9 2 197 70 45 543 30.5
## 14 1 189 60 23 846 30.1
## 98 1 71 48 18 76 20.4
## 175 2 75 64 24 55 29.7
## 207 8 196 76 29 280 37.5
## 229 4 197 70 39 744 36.7
## 235 3 74 68 28 45 29.7
## 259 1 193 50 16 375 25.9
## 261 3 191 68 15 130 30.9
## 274 1 71 78 50 45 33.2
## 360 1 196 76 36 249 36.5
## 361 5 189 64 33 325 31.2
## 463 8 74 70 40 49 35.3
## 467 0 74 52 10 36 27.8
## 499 7 195 70 33 145 25.1
## 521 2 68 70 32 66 25.0
## 562 0 198 66 32 274 41.3
## 618 2 68 62 13 15 20.1
## 673 10 68 106 23 49 35.5
## 681 2 56 56 28 45 24.2
## DiabetesPedigreeFunction Age Outcome
## 9 0.158 53 1
## 14 0.398 59 1
## 98 0.323 22 0
## 175 0.370 33 0
## 207 0.605 57 1
## 229 2.329 31 0
## 235 0.293 23 0
## 259 0.655 24 0
## 261 0.299 34 0
## 274 0.422 21 0
## 360 0.875 29 1
## 361 0.583 29 1
## 463 0.705 39 0
## 467 0.269 22 0
## 499 0.163 55 1
## 521 0.187 25 0
## 562 0.502 28 1
## 618 0.257 23 0
## 673 0.285 47 0
## 681 0.332 22 0
num_outliers<- nrow(outliers_Glucose)
num_outliers
## [1] 20
Tomando los percentiles 25% y 75% se identifican los anteriores 20 datos atipicos.
outliers_BloodPressure <- find_outliers(diabetes, "BloodPressure")
outliers_BloodPressure
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 5 0 137 40 35 168 43.1
## 19 1 103 30 38 83 43.3
## 25 11 143 94 33 146 36.6
## 44 9 171 110 24 240 45.4
## 126 1 88 30 42 99 55.0
## 178 0 129 110 46 130 67.1
## 188 1 128 98 41 58 32.0
## 347 1 139 46 19 83 28.7
## 370 1 133 102 28 140 32.8
## 380 0 93 100 39 72 43.4
## 429 0 135 94 46 145 40.6
## 576 1 119 44 47 63 35.5
## 577 6 108 44 20 130 24.0
## 598 1 89 24 19 25 27.8
## 600 1 109 38 18 120 23.1
## 663 8 167 106 46 231 37.6
## 673 10 68 106 23 49 35.5
## 674 3 123 100 35 240 57.3
## 708 2 127 46 21 335 34.4
## 742 3 102 44 20 94 30.8
## DiabetesPedigreeFunction Age Outcome
## 5 2.288 33 1
## 19 0.183 33 0
## 25 0.254 51 1
## 44 0.721 54 1
## 126 0.496 26 1
## 178 0.319 26 1
## 188 1.321 33 1
## 347 0.654 22 0
## 370 0.234 45 1
## 380 1.021 35 0
## 429 0.284 26 0
## 576 0.280 25 0
## 577 0.813 35 0
## 598 0.559 21 0
## 600 0.407 26 0
## 663 0.165 43 1
## 673 0.285 47 0
## 674 0.880 22 0
## 708 0.176 22 0
## 742 0.400 26 0
num_outliers<- nrow(outliers_BloodPressure)
num_outliers
## [1] 20
Tomando los percentiles 25% y 75% se identifican los anteriores 20 datos atipicos.
outliers_SkinThickness <- find_outliers(diabetes, "SkinThickness")
outliers_SkinThickness
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 58 0 100 88 60 110 46.8
## 100 1 122 90 51 220 49.7
## 121 0 162 76 56 100 53.2
## 151 1 136 74 50 204 37.4
## 255 12 92 62 7 258 27.6
## 274 1 71 78 50 45 33.2
## 276 2 100 70 52 57 40.5
## 280 2 108 62 10 278 25.3
## 314 3 113 50 10 85 29.5
## 383 1 109 60 8 182 25.4
## 446 0 180 78 63 14 59.4
## 467 0 74 52 10 36 27.8
## 520 6 129 90 7 326 19.6
## 533 1 86 66 52 65 41.3
## 592 2 112 78 50 140 39.4
## DiabetesPedigreeFunction Age Outcome
## 58 0.962 31 0
## 100 0.325 31 1
## 121 0.759 25 1
## 151 0.399 24 0
## 255 0.926 44 1
## 274 0.422 21 0
## 276 0.677 25 0
## 280 0.881 22 0
## 314 0.626 25 0
## 383 0.947 21 0
## 446 2.420 25 1
## 467 0.269 22 0
## 520 0.582 60 0
## 533 0.917 29 0
## 592 0.175 24 0
num_outliers<- nrow(outliers_SkinThickness)
num_outliers
## [1] 15
Tomando los percentiles 25% y 75% se identifican los anteriores 15 datos atipicos.
outliers_Insulin <- find_outliers(diabetes, "Insulin")
outliers_Insulin
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 9 2 197 70 45 543 30.5
## 14 1 189 60 23 846 30.1
## 53 5 88 66 21 23 24.4
## 109 3 83 58 31 18 34.3
## 226 1 87 78 27 32 34.6
## 229 4 197 70 39 744 36.7
## 248 0 165 90 33 680 52.3
## 287 5 155 84 44 545 38.7
## 324 13 152 90 33 29 26.8
## 410 1 172 68 49 579 42.4
## 446 0 180 78 63 14 59.4
## 567 1 99 72 30 18 38.6
## 585 8 124 76 24 600 28.7
## 598 1 89 24 19 25 27.8
## 618 2 68 62 13 15 20.1
## 656 2 155 52 27 540 38.7
## 712 5 126 78 27 22 29.6
## 754 0 181 88 44 510 43.3
## 761 2 88 58 26 16 28.4
## DiabetesPedigreeFunction Age Outcome
## 9 0.158 53 1
## 14 0.398 59 1
## 53 0.342 30 0
## 109 0.336 25 0
## 226 0.101 22 0
## 229 2.329 31 0
## 248 0.427 23 0
## 287 0.619 34 0
## 324 0.731 43 1
## 410 0.702 28 1
## 446 2.420 25 1
## 567 0.412 21 0
## 585 0.687 52 1
## 598 0.559 21 0
## 618 0.257 23 0
## 656 0.240 25 1
## 712 0.439 40 0
## 754 0.222 26 1
## 761 0.766 22 0
num_outliers<- nrow(outliers_Insulin)
num_outliers
## [1] 19
Tomando los percentiles 25% y 75% se identifican los anteriores 19 datos atipicos.
outliers_BMI <- find_outliers(diabetes, "BMI")
outliers_BMI
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 51 1 103 80 11 82 19.4
## 58 0 100 88 60 110 46.8
## 69 1 95 66 13 38 19.6
## 93 7 81 78 40 48 46.7
## 98 1 71 48 18 76 20.4
## 100 1 122 90 51 220 49.7
## 121 0 162 76 56 100 53.2
## 126 1 88 30 42 99 55.0
## 178 0 129 110 46 130 67.1
## 204 2 99 70 16 44 20.4
## 248 0 165 90 33 680 52.3
## 317 3 99 80 11 64 19.3
## 336 0 165 76 43 255 47.9
## 446 0 180 78 63 14 59.4
## 520 6 129 90 7 326 19.6
## 527 1 97 64 19 82 18.2
## 608 1 92 62 25 41 19.5
## 618 2 68 62 13 15 20.1
## 640 1 100 74 12 46 19.5
## 674 3 123 100 35 240 57.3
## DiabetesPedigreeFunction Age Outcome
## 51 0.491 22 0
## 58 0.962 31 0
## 69 0.334 25 0
## 93 0.261 42 0
## 98 0.323 22 0
## 100 0.325 31 1
## 121 0.759 25 1
## 126 0.496 26 1
## 178 0.319 26 1
## 204 0.235 27 0
## 248 0.427 23 0
## 317 0.284 30 0
## 336 0.259 26 0
## 446 2.420 25 1
## 520 0.582 60 0
## 527 0.299 21 0
## 608 0.482 25 0
## 618 0.257 23 0
## 640 0.149 28 0
## 674 0.880 22 0
num_outliers<- nrow(outliers_BMI)
num_outliers
## [1] 20
Tomando los percentiles 25% y 75% se identifican los anteriores 19 datos atipicos.
outliers_Pedigree <- find_outliers(diabetes, "DiabetesPedigreeFunction")
outliers_Pedigree
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 5 0 137 40 35 168 43.1
## 40 4 111 72 47 207 37.1
## 136 2 125 60 20 140 33.8
## 148 2 106 64 35 119 30.5
## 226 1 87 78 27 32 34.6
## 229 4 197 70 39 744 36.7
## 230 0 117 80 31 53 45.2
## 260 11 155 76 28 150 33.3
## 309 0 128 68 19 180 30.5
## 326 1 157 72 21 168 25.6
## 329 2 102 86 36 120 45.5
## 330 6 105 70 32 68 30.8
## 371 3 173 82 48 465 38.4
## 396 2 127 58 24 275 27.7
## 446 0 180 78 63 14 59.4
## 528 3 116 74 15 105 26.3
## 568 6 92 62 32 126 32.0
## 594 2 82 52 22 115 28.5
## 634 1 128 82 17 183 27.5
## 705 4 110 76 20 100 28.4
## DiabetesPedigreeFunction Age Outcome
## 5 2.288 33 1
## 40 1.390 56 1
## 136 0.088 31 0
## 148 1.400 34 0
## 226 0.101 22 0
## 229 2.329 31 0
## 230 0.089 24 0
## 260 1.353 51 1
## 309 1.391 25 1
## 326 0.123 24 0
## 329 0.127 23 1
## 330 0.122 37 0
## 371 2.137 25 1
## 396 1.600 25 0
## 446 2.420 25 1
## 528 0.107 24 0
## 568 0.085 46 0
## 594 1.699 25 0
## 634 0.115 22 0
## 705 0.118 27 0
num_outliers<- nrow(outliers_Pedigree)
num_outliers
## [1] 20
Tomando los percentiles 25% y 75% se identifican los anteriores 20 datos atipicos.
lower_bound <- median(diabetes$Pregnancies) - 3 * mad(diabetes$Pregnancies, constant = 1)
upper_bound <- median(diabetes$Pregnancies) + 3 * mad(diabetes$Pregnancies, constant = 1)
outlier_ind <- which(diabetes$Pregnancies < lower_bound | diabetes$Pregnancies > upper_bound)
outliersP <- diabetes[outlier_ind, ]
print(paste("Número de outliers de'Pregnancies':", length(outlier_ind)))
## [1] "Número de outliers de'Pregnancies': 58"
outliersP
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 8 10 115 NA NA NA 35.3
## 12 10 168 74 NA NA 38.0
## 13 10 139 80 NA NA 27.1
## 25 11 143 94 33 146 36.6
## 26 10 125 70 26 115 31.1
## 29 13 145 82 19 110 22.2
## 35 10 122 78 31 NA 27.6
## 37 11 138 76 NA NA 33.2
## 73 13 126 90 NA NA 43.4
## 87 13 106 72 54 NA 36.6
## 89 15 136 70 32 110 37.1
## 144 10 108 66 NA NA 32.4
## 160 17 163 72 41 114 40.9
## 194 11 135 NA NA NA 52.3
## 216 12 151 70 40 271 41.8
## 247 10 122 68 NA NA 31.2
## 255 12 92 62 7 258 27.6
## 260 11 155 76 28 150 33.3
## 271 10 101 86 37 NA 45.6
## 275 13 106 70 NA NA 34.2
## 282 10 129 76 28 122 35.9
## 299 14 100 78 25 184 36.6
## 307 10 161 68 23 132 25.5
## 324 13 152 90 33 29 26.8
## 328 10 179 70 NA NA 35.1
## 334 12 106 80 NA NA 23.6
## 358 13 129 NA 30 NA 39.9
## 359 12 88 74 40 54 35.3
## 376 12 140 82 43 325 39.2
## 437 12 140 85 33 NA 37.4
## 456 14 175 62 30 NA 33.6
## 459 10 148 84 48 237 37.6
## 465 10 115 98 NA NA 24.0
## 506 10 75 82 NA NA 33.3
## 511 12 84 72 31 NA 29.7
## 519 13 76 60 NA NA 32.8
## 543 10 90 85 32 NA 34.9
## 559 11 103 68 40 NA 46.2
## 560 11 85 74 NA NA 30.1
## 579 10 133 68 NA NA 27.0
## 583 12 121 78 17 NA 26.5
## 591 11 111 84 40 NA 46.8
## 615 11 138 74 26 144 36.1
## 635 10 92 62 NA NA 25.9
## 636 13 104 72 NA NA 31.2
## 649 11 136 84 35 130 28.3
## 659 11 127 106 NA NA 39.0
## 661 10 162 84 NA NA 27.7
## 668 10 111 70 27 NA 27.5
## 673 10 68 106 23 49 35.5
## 692 13 158 114 NA NA 42.3
## 707 10 115 NA NA NA NA
## 713 10 129 62 36 NA 41.2
## 718 10 94 72 18 NA 23.1
## 741 11 120 80 37 150 42.3
## 745 13 153 88 37 140 40.6
## 746 12 100 84 33 105 30.0
## 764 10 101 76 48 180 32.9
## DiabetesPedigreeFunction Age Outcome
## 8 0.134 29 0
## 12 0.537 34 1
## 13 1.441 57 0
## 25 0.254 51 1
## 26 0.205 41 1
## 29 0.245 57 0
## 35 0.512 45 0
## 37 0.420 35 0
## 73 0.583 42 1
## 87 0.178 45 0
## 89 0.153 43 1
## 144 0.272 42 1
## 160 0.817 47 1
## 194 0.578 40 1
## 216 0.742 38 1
## 247 0.258 41 0
## 255 0.926 44 1
## 260 1.353 51 1
## 271 1.136 38 1
## 275 0.251 52 0
## 282 0.280 39 0
## 299 0.412 46 1
## 307 0.326 47 1
## 324 0.731 43 1
## 328 0.200 37 0
## 334 0.137 44 0
## 358 0.569 44 1
## 359 0.378 48 0
## 376 0.528 58 1
## 437 0.244 41 0
## 456 0.212 38 1
## 459 1.001 51 1
## 465 1.022 34 0
## 506 0.263 38 0
## 511 0.297 46 1
## 519 0.180 41 0
## 543 0.825 56 1
## 559 0.126 42 0
## 560 0.300 35 0
## 579 0.245 36 0
## 583 0.259 62 0
## 591 0.925 45 1
## 615 0.557 50 1
## 635 0.167 31 0
## 636 0.465 38 1
## 649 0.260 42 1
## 659 0.190 51 0
## 661 0.182 54 0
## 668 0.141 40 1
## 673 0.285 47 0
## 692 0.257 44 1
## 707 0.261 30 1
## 713 0.441 38 1
## 718 0.595 56 0
## 741 0.785 48 1
## 745 1.174 39 0
## 746 0.488 46 0
## 764 0.171 63 0
Realizando el filtro de Hampel, donde se consideran como valores atípicos los valores entre más o menos 3 desviaciones absolutas de la mediana, obtenemos 58 datos atipicos. ### Glucose
df_omit<-na.omit(diabetes)
lower_bound <- median(df_omit$Glucose) - 3 * mad(df_omit$Glucose, constant = 1)
upper_bound <- median(df_omit$Glucose) + 3 * mad(df_omit$Glucose, constant = 1)
outlier_ind <- which(df_omit$Glucose < lower_bound | df_omit$Glucose > upper_bound)
outliersP <-diabetes[outlier_ind, ]
print(paste("Número de outliers de'Glucose':", length(outlier_ind)))
## [1] "Número de outliers de'Glucose': 17"
print(outliersP)
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 4 1 89 66 23 94 28.1
## 5 0 137 40 35 168 43.1
## 26 10 125 70 26 115 31.1
## 100 1 122 90 51 220 49.7
## 111 3 171 72 33 135 33.3
## 124 5 132 80 NA NA 26.8
## 126 1 88 30 42 99 55.0
## 179 5 143 78 NA NA 45.0
## 180 5 130 82 NA NA 39.1
## 218 6 125 68 30 120 30.0
## 255 12 92 62 7 258 27.6
## 281 0 146 70 NA NA 37.9
## 282 10 129 76 28 122 35.9
## 289 4 96 56 17 49 20.8
## 307 10 161 68 23 132 25.5
## 368 0 101 64 17 NA 21.0
## 386 1 119 54 13 50 22.3
## DiabetesPedigreeFunction Age Outcome
## 4 0.167 21 0
## 5 2.288 33 1
## 26 0.205 41 1
## 100 0.325 31 1
## 111 0.199 24 1
## 124 0.186 69 0
## 126 0.496 26 1
## 179 0.190 47 0
## 180 0.956 37 1
## 218 0.464 32 0
## 255 0.926 44 1
## 281 0.334 28 1
## 282 0.280 39 0
## 289 0.340 26 0
## 307 0.326 47 1
## 368 0.252 21 0
## 386 0.205 24 0
Omitiendo datos faltantes y realizando el filtro de Hampel, se tiene 17 datos atipicos. ### BloodPressure
df_omit<-na.omit(diabetes)
lower_bound <- median(diabetes$BloodPressure) - 3 * mad(diabetes$BloodPressure, constant = 1)
upper_bound <- median(diabetes$BloodPressure) + 3 * mad(diabetes$BloodPressure, constant = 1)
outlier_ind <- which(diabetes$BloodPressure < lower_bound | diabetes$BloodPressure > upper_bound)
outliers <- diabetes[outlier_ind, ]
print(paste("Número de outliers de'BloodPressure':", length(outlier_ind)))
## [1] "Número de outliers de'BloodPressure': 0"
print(outliers)
## [1] Pregnancies Glucose BloodPressure
## [4] SkinThickness Insulin BMI
## [7] DiabetesPedigreeFunction Age Outcome
## <0 rows> (or 0-length row.names)
en este caso se obtienen 0 datos atipicos ### SkinThickness
df_omit<-na.omit(diabetes)
lower_bound <- median(df_omit$SkinThickness) - 3 * mad(df_omit$SkinThickness, constant = 1)
upper_bound <- median(df_omit$SkinThickness) + 3 * mad(df_omit$SkinThickness, constant = 1)
outlier_ind <- which(df_omit$SkinThickness < lower_bound | df_omit$SkinThickness > upper_bound)
outliersS<-diabetes[outlier_ind, ]
print(paste("Número de outliers de'SkinThickness':", length(outlier_ind)))
## [1] "Número de outliers de'SkinThickness': 3"
print(outliersS)
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 27 7 147 76 NA NA 39.4
## 56 1 73 50 10 NA 23.0
## 226 1 87 78 27 32 34.6
## DiabetesPedigreeFunction Age Outcome
## 27 0.257 43 1
## 56 0.248 21 0
## 226 0.101 22 0
aqui obtenemos 3 datos atipicos. ### Insulin
df_omit<-na.omit(diabetes)
lower_bound <- median(df_omit$Insulin) - 3 * mad(df_omit$Insulin, constant = 1)
upper_bound <- median(df_omit$Insulin) + 3 * mad(df_omit$Insulin, constant = 1)
outlier_ind <- which(df_omit$Insulin < lower_bound | df_omit$Insulin > upper_bound)
outliersI<-diabetes[outlier_ind, ]
print(paste("Número de outliers de'Insulin':", length(outlier_ind)))
## [1] "Número de outliers de'Insulin': 41"
print(outliersI)
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 4 1 89 66 23 94 28.1
## 5 0 137 40 35 168 43.1
## 24 9 119 80 35 NA 29.0
## 25 11 143 94 33 146 36.6
## 26 10 125 70 26 115 31.1
## 52 1 101 50 15 36 24.2
## 68 2 109 92 NA NA 42.7
## 74 4 129 86 20 270 35.1
## 89 15 136 70 32 110 37.1
## 97 2 92 62 28 NA 31.6
## 107 1 96 122 NA NA 22.4
## 111 3 171 72 33 135 33.3
## 113 1 89 76 34 37 31.2
## 120 4 99 76 15 51 23.2
## 121 0 162 76 56 100 53.2
## 124 5 132 80 NA NA 26.8
## 136 2 125 60 20 140 33.8
## 145 4 154 62 31 284 32.8
## 180 5 130 82 NA NA 39.1
## 181 6 87 80 NA NA 23.2
## 185 4 141 74 NA NA 27.6
## 189 8 109 76 39 114 27.9
## 201 0 113 80 16 NA 31.0
## 207 8 196 76 29 280 37.5
## 209 1 96 64 27 87 33.2
## 212 0 147 85 54 NA 42.8
## 246 9 184 85 15 NA 30.0
## 250 1 111 86 19 NA 30.1
## 266 5 96 74 18 67 33.6
## 299 14 100 78 25 184 36.6
## 302 2 144 58 33 135 31.6
## 311 6 80 66 30 NA 26.2
## 317 3 99 80 11 64 19.3
## 330 6 105 70 32 68 30.8
## 338 5 115 76 NA NA 31.2
## 358 13 129 NA 30 NA 39.9
## 363 5 103 108 37 NA 39.2
## 365 4 147 74 25 293 34.9
## 367 6 124 72 NA NA 27.6
## 368 0 101 64 17 NA 21.0
## 388 8 105 100 36 NA 43.3
## DiabetesPedigreeFunction Age Outcome
## 4 0.167 21 0
## 5 2.288 33 1
## 24 0.263 29 1
## 25 0.254 51 1
## 26 0.205 41 1
## 52 0.526 26 0
## 68 0.845 54 0
## 74 0.231 23 0
## 89 0.153 43 1
## 97 0.130 24 0
## 107 0.207 27 0
## 111 0.199 24 1
## 113 0.192 23 0
## 120 0.223 21 0
## 121 0.759 25 1
## 124 0.186 69 0
## 136 0.088 31 0
## 145 0.237 23 0
## 180 0.956 37 1
## 181 0.084 32 0
## 185 0.244 40 0
## 189 0.640 31 1
## 201 0.874 21 0
## 207 0.605 57 1
## 209 0.289 21 0
## 212 0.375 24 0
## 246 1.213 49 1
## 250 0.143 23 0
## 266 0.997 43 0
## 299 0.412 46 1
## 302 0.422 25 1
## 311 0.313 41 0
## 317 0.284 30 0
## 330 0.122 37 0
## 338 0.343 44 1
## 358 0.569 44 1
## 363 0.305 65 0
## 365 0.385 30 0
## 367 0.368 29 1
## 368 0.252 21 0
## 388 0.239 45 1
realizando el filtro de Hampel, se tiene 41 datos atipicos ### BMI
df_omit<-na.omit(diabetes)
lower_bound <- median(df_omit$BMI) - 3 * mad(df_omit$BMI, constant = 1)
upper_bound <- median(df_omit$BMI) + 3 * mad(df_omit$BMI, constant = 1)
outlier_ind <- which(df_omit$BMI < lower_bound | df_omit$BMI > upper_bound)
outliersB<-diabetes[outlier_ind, ]
print(paste("Número de outliers de'BMI':", length(outlier_ind)))
## [1] "Número de outliers de'BMI': 16"
print(outliersB)
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 21 3 126 88 41 235 39.3
## 27 7 147 76 NA NA 39.4
## 30 5 117 92 NA NA 34.1
## 45 7 159 64 NA NA 27.4
## 56 1 73 50 10 NA 23.0
## 58 0 100 88 60 110 46.8
## 87 13 106 72 54 NA 36.6
## 120 4 99 76 15 51 23.2
## 159 2 88 74 19 53 29.0
## 169 4 110 66 NA NA 31.9
## 226 1 87 78 27 32 34.6
## 266 5 96 74 18 67 33.6
## 269 0 102 52 NA NA 25.1
## 312 0 106 70 37 148 39.4
## 327 1 122 64 32 156 35.1
## 349 3 99 62 19 74 21.8
## DiabetesPedigreeFunction Age Outcome
## 21 0.704 27 0
## 27 0.257 43 1
## 30 0.337 38 0
## 45 0.294 40 0
## 56 0.248 21 0
## 58 0.962 31 0
## 87 0.178 45 0
## 120 0.223 21 0
## 159 0.229 22 0
## 169 0.471 29 0
## 226 0.101 22 0
## 266 0.997 43 0
## 269 0.078 21 0
## 312 0.605 22 0
## 327 0.692 30 1
## 349 0.279 26 0
hay un total de 16 outliears ### DiabetesPedigreeFunction
df_omit<-na.omit(diabetes)
lower_bound <- median(df_omit$DiabetesPedigreeFunction) - 3 * mad(df_omit$DiabetesPedigreeFunction, constant = 1)
upper_bound <- median(df_omit$DiabetesPedigreeFunction) + 3 * mad(df_omit$DiabetesPedigreeFunction, constant = 1)
outlier_ind <- which(df_omit$DiabetesPedigreeFunction < lower_bound | df_omit$DiabetesPedigreeFunction > upper_bound)
outliersD<-diabetes[outlier_ind, ]
print(paste("Número de outliers de'DiabetesPedigreeFunction':", length(outlier_ind)))
## [1] "Número de outliers de'DiabetesPedigreeFunction': 28"
print(outliersD)
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 2 1 85 66 29 NA 26.6
## 18 7 107 74 NA NA 29.6
## 71 2 100 66 20 90 32.9
## 73 13 126 90 NA NA 43.4
## 90 1 107 68 19 NA 26.5
## 107 1 96 122 NA NA 22.4
## 111 3 171 72 33 135 33.3
## 118 5 78 48 NA NA 33.7
## 125 0 113 76 NA NA 33.3
## 142 5 106 82 30 NA 39.5
## 153 9 156 86 28 155 34.3
## 185 4 141 74 NA NA 27.6
## 195 8 85 55 20 NA 24.4
## 203 0 108 68 20 NA 27.3
## 209 1 96 64 27 87 33.2
## 226 1 87 78 27 32 34.6
## 251 9 106 52 NA NA 31.2
## 253 2 90 80 14 55 24.4
## 274 1 71 78 50 45 33.2
## 282 10 129 76 28 122 35.9
## 303 5 77 82 41 42 35.8
## 305 3 150 76 NA NA 21.0
## 311 6 80 66 30 NA 26.2
## 340 7 178 84 NA NA 39.9
## 341 1 130 70 13 105 25.9
## 383 1 109 60 8 182 25.4
## 385 1 125 70 24 110 24.3
## 389 5 144 82 26 285 32.0
## DiabetesPedigreeFunction Age Outcome
## 2 0.351 31 0
## 18 0.254 31 1
## 71 0.867 28 1
## 73 0.583 42 1
## 90 0.165 24 0
## 107 0.207 27 0
## 111 0.199 24 1
## 118 0.654 25 0
## 125 0.278 23 1
## 142 0.286 38 0
## 153 1.189 42 1
## 185 0.244 40 0
## 195 0.136 42 0
## 203 0.787 32 0
## 209 0.289 21 0
## 226 0.101 22 0
## 251 0.380 42 0
## 253 0.249 24 0
## 274 0.422 21 0
## 282 0.280 39 0
## 303 0.156 35 0
## 305 0.207 37 0
## 311 0.313 41 0
## 340 0.331 41 1
## 341 0.472 22 0
## 383 0.947 21 0
## 385 0.221 25 0
## 389 0.452 58 1
28 datos atipicos ### Age
df_omit<-na.omit(diabetes)
lower_bound <- median(df_omit$Age) - 3 * mad(df_omit$Age, constant = 1)
upper_bound <- median(df_omit$Age) + 3 * mad(df_omit$Age, constant = 1)
outlier_ind <- which(df_omit$Age < lower_bound | df_omit$Age > upper_bound)
outliersA<-diabetes[outlier_ind, ]
print(paste("Número de outliers de'Age':", length(outlier_ind)))
## [1] "Número de outliers de'Age': 58"
print(outliersA)
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 4 1 89 66 23 94 28.1
## 5 0 137 40 35 168 43.1
## 6 5 116 74 NA NA 25.6
## 11 4 110 92 NA NA 37.6
## 14 1 189 60 23 846 30.1
## 18 7 107 74 NA NA 29.6
## 20 1 115 70 30 96 34.6
## 24 9 119 80 35 NA 29.0
## 38 9 102 76 37 NA 32.9
## 52 1 101 50 15 36 24.2
## 78 5 95 72 33 NA 37.7
## 79 0 131 NA NA NA 43.2
## 89 15 136 70 32 110 37.1
## 99 6 93 50 30 64 28.7
## 100 1 122 90 51 220 49.7
## 108 4 144 58 28 140 29.5
## 113 1 89 76 34 37 31.2
## 116 4 146 92 NA NA 31.2
## 123 2 107 74 30 100 33.6
## 125 0 113 76 NA NA 33.3
## 127 3 120 70 30 135 42.9
## 135 2 96 68 13 49 21.1
## 147 9 57 80 37 NA 32.8
## 151 1 136 74 50 204 37.4
## 162 7 102 74 40 105 37.2
## 173 2 87 NA 23 NA 28.9
## 178 0 129 110 46 130 67.1
## 184 5 73 60 NA NA 26.8
## 189 8 109 76 39 114 27.9
## 198 3 107 62 13 48 22.9
## 221 0 177 60 29 478 34.6
## 235 3 74 68 28 45 29.7
## 236 4 171 72 NA NA 43.6
## 237 7 181 84 21 192 35.9
## 251 9 106 52 NA NA 31.2
## 253 2 90 80 14 55 24.4
## 255 12 92 62 7 258 27.6
## 265 4 123 62 NA NA 32.0
## 266 5 96 74 18 67 33.6
## 277 7 106 60 24 NA 26.5
## 282 10 129 76 28 122 35.9
## 284 7 161 86 NA NA 30.4
## 294 1 128 48 45 194 40.5
## 302 2 144 58 33 135 31.6
## 303 5 77 82 41 42 35.8
## 310 2 124 68 28 205 32.9
## 318 3 182 74 NA NA 30.5
## 342 1 95 74 21 73 25.9
## 345 8 95 72 NA NA 36.8
## 346 8 126 88 36 108 38.5
## 347 1 139 46 19 83 28.7
## 348 3 116 NA NA NA 23.5
## 355 3 90 78 NA NA 42.7
## 357 1 125 50 40 167 33.3
## 358 13 129 NA 30 NA 39.9
## 380 0 93 100 39 72 43.4
## 384 1 90 62 18 59 25.1
## 391 1 100 66 29 196 32.0
## DiabetesPedigreeFunction Age Outcome
## 4 0.167 21 0
## 5 2.288 33 1
## 6 0.201 30 0
## 11 0.191 30 0
## 14 0.398 59 1
## 18 0.254 31 1
## 20 0.529 32 1
## 24 0.263 29 1
## 38 0.665 46 1
## 52 0.526 26 0
## 78 0.370 27 0
## 79 0.270 26 1
## 89 0.153 43 1
## 99 0.356 23 0
## 100 0.325 31 1
## 108 0.287 37 0
## 113 0.192 23 0
## 116 0.539 61 1
## 123 0.404 23 0
## 125 0.278 23 1
## 127 0.452 30 0
## 135 0.647 26 0
## 147 0.096 41 0
## 151 0.399 24 0
## 162 0.204 45 0
## 173 0.773 25 0
## 178 0.319 26 1
## 184 0.268 27 0
## 189 0.640 31 1
## 198 0.678 23 1
## 221 1.072 21 1
## 235 0.293 23 0
## 236 0.479 26 1
## 237 0.586 51 1
## 251 0.380 42 0
## 253 0.249 24 0
## 255 0.926 44 1
## 265 0.226 35 1
## 266 0.997 43 0
## 277 0.296 29 1
## 282 0.280 39 0
## 284 0.165 47 1
## 294 0.613 24 1
## 302 0.422 25 1
## 303 0.156 35 0
## 310 0.875 30 1
## 318 0.345 29 1
## 342 0.673 36 0
## 345 0.485 57 0
## 346 0.349 49 0
## 347 0.654 22 0
## 348 0.187 23 0
## 355 0.559 21 0
## 357 0.962 28 1
## 358 0.569 44 1
## 380 1.021 35 0
## 384 1.268 25 0
## 391 0.444 42 0
hay un total de 58 datos atipicos en la variable Age
testD <- grubbs.test(diabetes$Pregnancies)
testD
##
## Grubbs test for one outlier
##
## data: diabetes$Pregnancies
## G = 3.9040, U = 0.9801, p-value = 0.03367
## alternative hypothesis: highest value 17 is an outlier
testD <- grubbs.test(diabetes$Pregnancies, opposite = TRUE)
testD
##
## Grubbs test for one outlier
##
## data: diabetes$Pregnancies
## G = 1.1411, U = 0.9983, p-value = 1
## alternative hypothesis: lowest value 0 is an outlier
Con un nivel de significación del 5%, rechazamos la hipótesis nula de que el valor más alto no es un valor atípico, ya que el valor p es menor que 0.05. Por lo tanto, tenemos evidencia suficiente para considerar que el valor más alto es un valor atípico.
Para el valor más bajo en los datos de embarazos: Con un nivel de significación del 5%, no rechazamos la hipótesis nula de que el valor más bajo no es un valor atípico, ya que el valor p es mayor que 0.05. No tenemos evidencia suficiente para decir que un valor de 0 embarazos es un valor atípico. ### Glucose
testG <- grubbs.test(diabetes$Glucose)
testG
##
## Grubbs test for one outlier
##
## data: diabetes$Glucose
## G = 2.54413, U = 0.99149, p-value = 1
## alternative hypothesis: lowest value 44 is an outlier
testG <- grubbs.test(diabetes$Glucose,opposite = TRUE )
testG
##
## Grubbs test for one outlier
##
## data: diabetes$Glucose
## G = 2.53190, U = 0.99158, p-value = 1
## alternative hypothesis: highest value 199 is an outlier
En ambas pruebas, la falta de evidencia para rechazar la hipótesis nula indica que, según el test de Grubbs, no hay valores atípicos significativos en los extremos bajo o alto de los niveles de glucosa en este conjunto de datos. ### BloodPressure
testG <- grubbs.test(diabetes$BloodPressure)
testG
##
## Grubbs test for one outlier
##
## data: diabetes$BloodPressure
## G = 4.00535, U = 0.97805, p-value = 0.02077
## alternative hypothesis: highest value 122 is an outlier
testG <- grubbs.test(diabetes$BloodPressure,opposite = TRUE)
testG
##
## Grubbs test for one outlier
##
## data: diabetes$BloodPressure
## G = 3.90927, U = 0.97909, p-value = 0.03132
## alternative hypothesis: lowest value 24 is an outlier
el valor más bajo y el más alto de presión arterial, se consideran estadísticamente valores atípicos en el conjunto de datos.
testS <- grubbs.test(diabetes$SkinThickness)
testS
##
## Grubbs test for one outlier
##
## data: diabetes$SkinThickness
## G = 6.66667, U = 0.91754, p-value = 2.687e-09
## alternative hypothesis: highest value 99 is an outlier
testS <- grubbs.test(diabetes$SkinThickness,opposite = TRUE)
testS
##
## Grubbs test for one outlier
##
## data: diabetes$SkinThickness
## G = 2.1145, U = 0.9917, p-value = 1
## alternative hypothesis: lowest value 7 is an outlier
Con un nivel de significación del 5%, rechazamos la hipótesis nula de que el valor más alto no es un valor atípico, lo que sugiere que 99 es un valor atípico estadísticamente significativo.
Con un valor p de 1, no hay evidencia estadística para rechazar la hipótesis nula; por lo tanto, no consideramos que el valor más bajo sea un valor atípico. ### Insulin
testI <- grubbs.test(diabetes$Insulin)
testI
##
## Grubbs test for one outlier
##
## data: diabetes$Insulin
## G = 5.8131, U = 0.9138, p-value = 5.589e-07
## alternative hypothesis: highest value 846 is an outlier
testI <- grubbs.test(diabetes$Insulin, opposite = TRUE)
testI
##
## Grubbs test for one outlier
##
## data: diabetes$Insulin
## G = 1.19173, U = 0.99638, p-value = 1
## alternative hypothesis: lowest value 14 is an outlier
Para el valor más alto (posiblemente 846): Con un valor p tan bajo, rechazamos la hipótesis nula y concluimos que el valor más alto es un valor atípico significativo.Para el valor más bajo (posiblemente 14):Con un valor p de 1, no hay evidencia para rechazar la hipótesis nula, por lo que no consideramos que el valor más bajo sea un valor atípico. ### BMI
testB <- grubbs.test(diabetes$BMI)
testB
##
## Grubbs test for one outlier
##
## data: diabetes$BMI
## G = 5.00254, U = 0.96685, p-value = 0.0001734
## alternative hypothesis: highest value 67.1 is an outlier
testB <- grubbs.test(diabetes$BMI, opposite = TRUE)
testB
##
## Grubbs test for one outlier
##
## data: diabetes$BMI
## G = 2.05884, U = 0.99439, p-value = 1
## alternative hypothesis: lowest value 18.2 is an outlier
En ambos casos, los valores extremos se consideran estadísticamente atípicos en este conjunto de datos de BMI.
testA <- grubbs.test(diabetes$Age)
testA
##
## Grubbs test for one outlier
##
## data: diabetes$Age
## G = 4.06107, U = 0.97847, p-value = 0.01716
## alternative hypothesis: highest value 81 is an outlier
testA <- grubbs.test(diabetes$Age, opposite = TRUE)
testA
##
## Grubbs test for one outlier
##
## data: diabetes$Age
## G = 1.04087, U = 0.99859, p-value = 1
## alternative hypothesis: lowest value 21 is an outlier
En conclusión, hay suficiente evidencia estadística para clasificar el valor más alto de edad como un valor atípico, mientras que el valor más bajo no se considera atípico según la prueba de Grubbs.
Dado que este prueba es ultil para muestras de pequeño tamaño (normalmente n≤25 ) esta no sera tomada en cuenta ya que contamos con una muestra de tamaño de 768.
Tomando los k datos atipicos teniendo en el grafico Boxplot, realizaremos la prueba de Rosner
test <- rosnerTest(diabetes$Pregnancies, k = 4)
test$all.stats
## i Mean.i SD.i Value Obs.Num R.i+1 lambda.i+1 Outlier
## 1 0 3.845052 3.369578 17 160 3.904034 3.974092 FALSE
## 2 1 3.827901 3.338063 15 89 3.346880 3.973762 FALSE
## 3 2 3.813316 3.315699 14 299 3.072258 3.973432 FALSE
## 4 3 3.800000 3.297310 14 456 3.093431 3.973102 FALSE
segun la prueba, ninguno de los 5 datos que señala el boxplot, no son ### Glucose
test <- rosnerTest(diabetes$Glucose, k = 5)
## Warning in rosnerTest(diabetes$Glucose, k = 5): 5 observations with NA/NaN/Inf
## in 'x' removed.
test$all.stats
## i Mean.i SD.i Value Obs.Num R.i+1 lambda.i+1 Outlier
## 1 0 121.6868 30.53564 44 63 2.544134 3.972440 FALSE
## 2 1 121.7887 30.42548 199 662 2.537718 3.972108 FALSE
## 3 2 121.6873 30.31622 198 562 2.517225 3.971776 FALSE
## 4 3 121.5868 30.20929 197 9 2.496357 3.971443 FALSE
## 5 4 121.4875 30.10469 197 229 2.508331 3.971110 FALSE
Tomando los datos atipicos sugeridos en el grafico Boxplot, ningun dato es atipico bajo esta prueba. ### BloodPressure
test <- rosnerTest(diabetes$BloodPressure, k=14)
## Warning in rosnerTest(diabetes$BloodPressure, k = 14): 35 observations with
## NA/NaN/Inf in 'x' removed.
## Warning in rosnerTest(diabetes$BloodPressure, k = 14): The true Type I error may be larger than assumed.
## Although the help file for 'rosnerTest' has a table with information
## on the estimated Type I error level,
## simulations were not run for k > 10 or k > floor(n/2).
test$all.stats
## i Mean.i SD.i Value Obs.Num R.i+1 lambda.i+1 Outlier
## 1 0 72.40518 12.38216 122 107 4.005345 3.962273 TRUE
## 2 1 72.33743 12.25391 24 598 3.944655 3.961926 FALSE
## 3 2 72.40356 12.13090 30 19 3.495498 3.961579 FALSE
## 4 3 72.46164 12.03706 30 126 3.527576 3.961231 FALSE
## 5 4 72.51989 11.94194 114 692 3.473483 3.960883 FALSE
## 6 5 72.46291 11.85057 110 44 3.167534 3.960534 FALSE
## 7 6 72.41128 11.77650 110 178 3.191841 3.960185 FALSE
## 8 7 72.35950 11.70153 110 550 3.216716 3.959835 FALSE
## 9 8 72.30759 11.62563 108 85 3.070149 3.959484 FALSE
## 10 9 72.25829 11.55758 108 363 3.092490 3.959133 FALSE
## 11 10 72.20885 11.48873 38 600 2.977600 3.958782 FALSE
## 12 11 72.25623 11.42579 106 659 2.953298 3.958430 FALSE
## 13 12 72.20943 11.36426 106 663 2.973407 3.958077 FALSE
## 14 13 72.16250 11.30202 106 673 2.993933 3.957724 FALSE
con un k de 14, solo el valor más alto fue el unico clasificado como valor atipico segun la prueba ### SkinThickness
test <- rosnerTest(diabetes$SkinThickness, k = 3)
## Warning in rosnerTest(diabetes$SkinThickness, k = 3): 227 observations with
## NA/NaN/Inf in 'x' removed.
test$all.stats
## i Mean.i SD.i Value Obs.Num R.i+1 lambda.i+1 Outlier
## 1 0 29.15342 10.476982 99 580 6.666670 3.883895 TRUE
## 2 1 29.02407 10.045046 63 446 3.382357 3.883409 FALSE
## 3 2 28.96104 9.946902 60 58 3.120465 3.882923 FALSE
En la prueba de Rosner se identifica que solo un dato es atipico
test <- rosnerTest(diabetes$Insulin, k = 24)
## Warning in rosnerTest(diabetes$Insulin, k = 24): 374 observations with
## NA/NaN/Inf in 'x' removed.
## Warning in rosnerTest(diabetes$Insulin, k = 24): The true Type I error may be larger than assumed.
## Although the help file for 'rosnerTest' has a table with information
## on the estimated Type I error level,
## simulations were not run for k > 10 or k > floor(n/2).
test$all.stats
## i Mean.i SD.i Value Obs.Num R.i+1 lambda.i+1 Outlier
## 1 0 155.5482 118.77586 846 14 5.813065 3.799155 TRUE
## 2 1 153.7913 113.68582 744 229 5.191576 3.798462 TRUE
## 3 2 152.2857 109.83778 680 248 4.804488 3.797768 TRUE
## 4 3 150.9361 106.67422 600 585 4.209677 3.797071 TRUE
## 5 4 149.7846 104.34994 579 410 4.113231 3.796373 TRUE
## 6 5 148.6812 102.18094 545 287 3.878598 3.795672 TRUE
## 7 6 147.6598 100.30461 543 9 3.941396 3.794970 TRUE
## 8 7 146.6382 98.39272 540 656 3.997875 3.794265 TRUE
## 9 8 145.6192 96.45376 510 754 3.777777 3.793558 TRUE
## 10 9 144.6727 94.76757 495 112 3.696700 3.792850 TRUE
## 11 10 143.7604 93.18297 495 187 3.769354 3.792139 TRUE
## 12 11 142.8433 91.55324 485 154 3.737242 3.791426 TRUE
## 13 12 141.9476 89.97732 480 487 3.757084 3.790711 TRUE
## 14 13 141.0604 88.40644 480 696 3.833879 3.789994 TRUE
## 15 14 140.1684 86.78946 478 221 3.892542 3.789275 TRUE
## 16 15 139.2770 85.14463 474 416 3.931228 3.788554 TRUE
## 17 16 138.3915 83.49171 465 371 3.911867 3.787830 TRUE
## 18 17 137.5252 81.88374 440 646 3.693954 3.787104 FALSE
## 19 18 136.7207 80.48728 415 393 3.457432 3.786377 FALSE
## 20 19 135.9787 79.29637 402 249 3.354773 3.785646 FALSE
## 21 20 135.2674 78.19552 392 716 3.283214 3.784914 FALSE
## 22 21 134.5791 77.15776 387 711 3.271491 3.784180 FALSE
## 23 22 133.9005 76.13910 375 259 3.166566 3.783443 FALSE
## 24 23 133.2507 75.20174 370 232 3.148189 3.782704 FALSE
17 de los 24 datos ### BMI
test <- rosnerTest(diabetes$BMI, k = 8)
## Warning in rosnerTest(diabetes$BMI, k = 8): 11 observations with NA/NaN/Inf in
## 'x' removed.
test$all.stats
## i Mean.i SD.i Value Obs.Num R.i+1 lambda.i+1 Outlier
## 1 0 32.45746 6.924988 67.1 178 5.002541 3.970442 TRUE
## 2 1 32.41164 6.813761 59.4 446 3.960861 3.970107 FALSE
## 3 2 32.37589 6.746971 57.3 674 3.694118 3.969772 FALSE
## 4 3 32.34284 6.689992 55.0 126 3.386725 3.969437 FALSE
## 5 4 32.31275 6.643189 53.2 121 3.144160 3.969101 FALSE
## 6 5 32.28497 6.603713 52.9 304 3.121733 3.968764 FALSE
## 7 6 32.25752 6.565042 52.3 194 3.052909 3.968427 FALSE
## 8 7 32.23080 6.528422 52.3 248 3.074127 3.968089 FALSE
En el caso de BMI el valor más alto clasifica como valor atipico ### Edad
test <- rosnerTest(diabetes$Age, k = 9)
test$all.stats
## i Mean.i SD.i Value Obs.Num R.i+1 lambda.i+1 Outlier
## 1 0 33.24089 11.76023 81 460 4.061069 3.974092 TRUE
## 2 1 33.17862 11.64053 72 454 3.335018 3.973762 FALSE
## 3 2 33.12794 11.56315 70 667 3.188755 3.973432 FALSE
## 4 3 33.07974 11.49346 69 124 3.125278 3.973102 FALSE
## 5 4 33.03272 11.42714 69 685 3.147531 3.972771 FALSE
## 6 5 32.98558 11.36006 68 675 3.082239 3.972440 FALSE
## 7 6 32.93963 11.29634 67 364 3.015167 3.972108 FALSE
## 8 7 32.89488 11.23596 67 490 3.035354 3.971776 FALSE
## 9 8 32.85000 11.17491 67 538 3.055953 3.971443 FALSE
Tomando los 9 datos atipicos sugeridos en el grafico Boxplot y realizando la prueba de Rosner se identifica que solo un dato es atipico ### pedigri
test <- rosnerTest(diabetes$DiabetesPedigreeFunction, k = 29)
## Warning in rosnerTest(diabetes$DiabetesPedigreeFunction, k = 29): The true Type I error may be larger than assumed.
## Although the help file for 'rosnerTest' has a table with information
## on the estimated Type I error level,
## simulations were not run for k > 10 or k > floor(n/2).
test$all.stats
## i Mean.i SD.i Value Obs.Num R.i+1 lambda.i+1 Outlier
## 1 0 0.4718763 0.3313286 2.420 446 5.879733 3.974092 TRUE
## 2 1 0.4693364 0.3239768 2.329 229 5.740114 3.973762 TRUE
## 3 2 0.4669086 0.3171301 2.288 5 5.742410 3.973432 TRUE
## 4 3 0.4645281 0.3104137 2.137 371 5.387880 3.973102 TRUE
## 5 4 0.4623390 0.3046509 1.893 46 4.696067 3.972771 TRUE
## 6 5 0.4604640 0.3004070 1.781 59 4.395823 3.972440 TRUE
## 7 6 0.4587310 0.2967633 1.731 372 4.287150 3.972108 TRUE
## 8 7 0.4570591 0.2933457 1.699 594 4.233710 3.971776 TRUE
## 9 8 0.4554250 0.2900522 1.698 622 4.283971 3.971443 TRUE
## 10 9 0.4537879 0.2867083 1.600 396 3.997834 3.971110 TRUE
## 11 10 0.4522757 0.2838528 1.476 331 3.606533 3.970776 FALSE
## 12 11 0.4509234 0.2815864 1.461 623 3.587093 3.970442 FALSE
## 13 12 0.4495873 0.2793614 1.441 13 3.548854 3.970107 FALSE
## 14 13 0.4482742 0.2772021 1.400 148 3.433329 3.969772 FALSE
## 15 14 0.4470119 0.2752064 1.394 662 3.441011 3.969437 FALSE
## 16 15 0.4457543 0.2732126 1.391 309 3.459744 3.969101 FALSE
## 17 16 0.4444973 0.2712070 1.390 40 3.486277 3.968764 FALSE
## 18 17 0.4432383 0.2691797 1.353 260 3.379755 3.968427 FALSE
## 19 18 0.4420253 0.2672975 1.321 188 3.288376 3.968089 FALSE
## 20 19 0.4408518 0.2655357 1.318 244 3.303315 3.967751 FALSE
## 21 20 0.4396791 0.2637656 1.292 660 3.231358 3.967412 FALSE
## 22 21 0.4385382 0.2620886 1.282 619 3.218232 3.967073 FALSE
## 23 22 0.4374075 0.2604350 1.268 384 3.189250 3.966734 FALSE
## 24 23 0.4362926 0.2588225 1.258 607 3.174792 3.966394 FALSE
## 25 24 0.4351882 0.2572339 1.251 535 3.171479 3.966053 FALSE
## 26 25 0.4340902 0.2556565 1.224 219 3.089731 3.965712 FALSE
## 27 26 0.4330256 0.2541757 1.224 293 3.111920 3.965370 FALSE
## 28 27 0.4319582 0.2526776 1.222 101 3.126679 3.965028 FALSE
## 29 28 0.4308905 0.2511705 1.213 246 3.113858 3.964686 FALSE
la prueba rosner identifico 10 outliers ## Valores Faltantes
pMiss <- function(x){sum(is.na(x))/length(x)*100}
apply(diabetes,2,pMiss)
## Pregnancies Glucose BloodPressure
## 0.0000000 0.6510417 4.5572917
## SkinThickness Insulin BMI
## 29.5572917 48.6979167 1.4322917
## DiabetesPedigreeFunction Age Outcome
## 0.0000000 0.0000000 0.0000000
esta función da cuenta de cuantos datos flatantes hay en cada columna de datos
vis_miss(diabetes)
md.pattern(diabetes, rotate.names = TRUE)
## Pregnancies DiabetesPedigreeFunction Age Outcome Glucose BMI BloodPressure
## 392 1 1 1 1 1 1 1
## 140 1 1 1 1 1 1 1
## 192 1 1 1 1 1 1 1
## 2 1 1 1 1 1 1 0
## 26 1 1 1 1 1 1 0
## 1 1 1 1 1 1 0 1
## 1 1 1 1 1 1 0 1
## 2 1 1 1 1 1 0 1
## 7 1 1 1 1 1 0 0
## 1 1 1 1 1 0 1 1
## 4 1 1 1 1 0 1 1
## 0 0 0 0 5 11 35
## SkinThickness Insulin
## 392 1 1 0
## 140 1 0 1
## 192 0 0 2
## 2 1 0 2
## 26 0 0 3
## 1 1 1 1
## 1 1 0 2
## 2 0 0 3
## 7 0 0 4
## 1 1 1 1
## 4 1 0 2
## 227 374 652
aqui podemos ver que tenemos un 9,4% de datos faltantes. Glucose: 5 datos faltantes.
BMI: 11 datos faltantes.
BloodPressure: 35 datos faltantes.
SkinThickness: 227 datos faltantes.
Insulin: 374 datos faltantes.
En total el data set Diabetes presenta 652 datos faltantes.
aggr_plot <- aggr(diabetes, col=c('navyblue','red'), numbers=TRUE, sortVars=TRUE, labels=names(diabetes),
cex.axis=.7, gap=3, ylab=c("Histogram of missing data","Pattern"))
##
## Variables sorted by number of missings:
## Variable Count
## Insulin 0.486979167
## SkinThickness 0.295572917
## BloodPressure 0.045572917
## BMI 0.014322917
## Glucose 0.006510417
## Pregnancies 0.000000000
## DiabetesPedigreeFunction 0.000000000
## Age 0.000000000
## Outcome 0.000000000
Este gráfico de barras muestra la proporción de datos faltantes para cada variable. La barra más alta corresponde a la variable ‘Insulina’, lo que indica que esta es la variable con la mayor cantidad de datos faltantes. Le sigue ‘Grosor de Piel’, que también tiene una cantidad significativa de datos faltantes. Las variables ‘BMI’, ‘Glucosa’, ‘Embarazos’, ‘Edad’ y ‘Outcome’ tienen menos datos faltantes, como se indica por las barras más cortas.
La matriz de la derecha parece mostrar los patrones de datos faltantes en el conjunto de datos. Las celdas azules representan observaciones donde los datos están presentes, mientras que las celdas rojas indican la ausencia de datos (datos faltantes). La proporción de patrones de ausencia se muestra en el eje derecho, con algunos patrones que ocurren con mayor frecuencia, como indican los valores mayores (0.5104, 0.2500, etc.).
na_omit <- na.omit(diabetes)
head(na_omit)
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 4 1 89 66 23 94 28.1
## 5 0 137 40 35 168 43.1
## 7 3 78 50 32 88 31.0
## 9 2 197 70 45 543 30.5
## 14 1 189 60 23 846 30.1
## 15 5 166 72 19 175 25.8
## DiabetesPedigreeFunction Age Outcome
## 4 0.167 21 0
## 5 2.288 33 1
## 7 0.248 26 1
## 9 0.158 53 1
## 14 0.398 59 1
## 15 0.587 51 1
plot_comparison <- function(df_original, df_no_na, column_name) {
ggp1 <- ggplot(data.frame(value = df_original[[column_name]]), aes(x = value)) +
geom_histogram(fill = "#FBD000", color = "#E52521", alpha = 0.9) +
ggtitle("Original data") +
xlab(column_name) + ylab('Frequency') +
theme_minimal() +
theme(plot.title = element_text(size = 15))
ggp2 <- ggplot(data.frame(value = df_no_na[[column_name]]), aes(x = value)) +
geom_histogram(fill = "#43B047", color = "#049CD8", alpha = 0.9) +
ggtitle("Data without NAs") +
xlab(column_name) + ylab('Frequency') +
theme_minimal() +
theme(plot.title = element_text(size = 15))
grid.arrange(ggp1, ggp2, ncol = 2)
}
plot_comparison(diabetes, na_omit, "Glucose")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 5 rows containing non-finite values (`stat_bin()`).
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
El histograma de la derecha, en verde, muestra la distribución de los
niveles de glucosa después de eliminar los valores no disponibles (NAs).
La distribución sigue siendo similar a la de los datos originales, pero
las frecuencias son más bajas, lo que sugiere que se han eliminado
algunos datos. La moda parece estar en el mismo rango, aunque la
distribución de la izquierda parece más suave, lo que puede indicar que
al eliminar los datos faltantes, se ha perdido algo de la variabilidad
natural. ### BloodPressure
plot_comparison(diabetes, na_omit, "BloodPressure")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 35 rows containing non-finite values (`stat_bin()`).
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Aunque la forma general de la distribución es similar a la de los datos
originales, las frecuencias son menores, lo que indica que se han
removido algunas observaciones. La moda y la distribución central
parecen consistentes con los datos originales, aunque el histograma
parece menos suave, lo cual puede ser resultado de una menor cantidad de
datos y, por tanto, de una menor frecuencia en cada bin. ###
SkinThickness
plot_comparison(diabetes, na_omit, "SkinThickness")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 227 rows containing non-finite values (`stat_bin()`).
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
La distribución es similar a la de los datos originales, pero la
concentración de las frecuencias es más alta en un rango estrecho y el
histograma parece menos suave, probablemente debido a la reducción del
tamaño del conjunto de datos. Esto podría ser indicativo de que los
valores NAs estaban distribuidos uniformemente a través del rango de
datos. ### Insulin
plot_comparison(diabetes, na_omit, "Insulin")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 374 rows containing non-finite values (`stat_bin()`).
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
La distribución general se mantiene, pero la frecuencia en los bins de
insulina baja es mayor en proporción a los bins de insulina alta, en
comparación con los datos originales. ### BMI
plot_comparison(diabetes, na_omit, "BMI")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 11 rows containing non-finite values (`stat_bin()`).
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Esta distribución mantiene una forma similar a la de los datos
originales, pero con una frecuencia más alta en el pico, lo que sugiere
que los valores eliminados pueden haber estado más dispersos o en los
extremos de la distribución.
imp <- mice(diabetes, m=5, maxit=50, method ='pmm', seed=500, printFlag = FALSE)
imp_df <- complete(imp)
head(imp_df)
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 1 6 148 72 35 83 33.6
## 2 1 85 66 29 55 26.6
## 3 8 183 64 20 175 23.3
## 4 1 89 66 23 94 28.1
## 5 0 137 40 35 168 43.1
## 6 5 116 74 24 175 25.6
## DiabetesPedigreeFunction Age Outcome
## 1 0.627 50 1
## 2 0.351 31 0
## 3 0.672 32 1
## 4 0.167 21 0
## 5 2.288 33 1
## 6 0.201 30 0
xyplot(imp, Insulin ~ SkinThickness
+ BloodPressure
+ BMI
+ Glucose
+ Outcome
+ Age
+ DiabetesPedigreeFunction
+ Pregnancies, pch=18, cex=1)
Esta similitud en la distribución nos indica que los valores imputados
representan de manera fiable y plausible la información ausente.
densityplot(imp)
Para cada conjunto de datos imputados, la densidad se muestra en rojo, en contraposición a la densidad de los datos observados, que se presenta en azul. esperamos que ambas distribuciones exhiban una similitud significativa.
plot(imp);
La media (mean): Muestra cómo la media de cada variable fluctúa en cada
uno de los conjuntos imputados. Las líneas se mantienen relativamente
consistentes entre sí, indicando que la imputación es estable en
términos de la media. La desviación estándar (sd): Muestra las
fluctuaciones en la variabilidad de cada variable a través de los
distintos conjuntos imputados. De nuevo, las líneas son bastante
consistentes, lo que indica que la imputación mantiene una variabilidad
similar entre los conjuntos.
imp_regress <- mice(diabetes, method="norm.predict", m=1, maxit=1)
##
## iter imp variable
## 1 1 Glucose BloodPressure SkinThickness Insulin BMI
imp_data <- complete(imp_regress)
head(imp_data)
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 1 6 148 72 35.00000 220.65056 33.6
## 2 1 85 66 29.00000 69.90585 26.6
## 3 8 183 64 21.09747 256.47480 23.3
## 4 1 89 66 23.00000 94.00000 28.1
## 5 0 137 40 35.00000 168.00000 43.1
## 6 5 116 74 22.11040 117.65456 25.6
## DiabetesPedigreeFunction Age Outcome
## 1 0.627 50 1
## 2 0.351 31 0
## 3 0.672 32 1
## 4 0.167 21 0
## 5 2.288 33 1
## 6 0.201 30 0
xyplot(imp_regress, Insulin ~ SkinThickness
+ BloodPressure
+ BMI
+ Glucose
+ Outcome
+ Age
+ DiabetesPedigreeFunction
+ Pregnancies, pch=18, cex=1)
densityplot(imp_regress)
plot(imp_data);
En los graficos podemos notar, que si bien en la imputación no se pierde
la distribución y el comportamiento de los datos, aparetemente en la
imputacion, se oscilaron en valores mas cercanos entre ellos en cada
columna.
imp_regress <- mice(diabetes, method="norm.nob", m=1, maxit=1)
##
## iter imp variable
## 1 1 Glucose BloodPressure SkinThickness Insulin BMI
imp_data <- complete(imp_regress)
head(imp_data)
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 1 6 148 72 35.00000 300.57436 33.6
## 2 1 85 66 29.00000 91.20010 26.6
## 3 8 183 64 12.60417 271.47221 23.3
## 4 1 89 66 23.00000 94.00000 28.1
## 5 0 137 40 35.00000 168.00000 43.1
## 6 5 116 74 23.59787 -22.44932 25.6
## DiabetesPedigreeFunction Age Outcome
## 1 0.627 50 1
## 2 0.351 31 0
## 3 0.672 32 1
## 4 0.167 21 0
## 5 2.288 33 1
## 6 0.201 30 0
xyplot(imp_regress, Insulin ~ SkinThickness
+ BloodPressure
+ BMI
+ Glucose
+ Outcome
+ Age
+ DiabetesPedigreeFunction
+ Pregnancies, pch=18, cex=1)
densityplot(imp_regress)
como podemor notar en los graficos, esta imputación se ajusta mejor al comportamiento de los datos originales en comparacion a la anterior.
imp_regress <- mice(diabetes, method="norm", m=1, maxit=1)
##
## iter imp variable
## 1 1 Glucose BloodPressure SkinThickness Insulin BMI
imp_data <- complete(imp_regress)
head(imp_data)
## Pregnancies Glucose BloodPressure SkinThickness Insulin BMI
## 1 6 148 72 35.00000 133.56778 33.6
## 2 1 85 66 29.00000 42.64137 26.6
## 3 8 183 64 18.89756 110.87973 23.3
## 4 1 89 66 23.00000 94.00000 28.1
## 5 0 137 40 35.00000 168.00000 43.1
## 6 5 116 74 19.09168 70.14276 25.6
## DiabetesPedigreeFunction Age Outcome
## 1 0.627 50 1
## 2 0.351 31 0
## 3 0.672 32 1
## 4 0.167 21 0
## 5 2.288 33 1
## 6 0.201 30 0
xyplot(imp_regress, Insulin ~ SkinThickness
+ BloodPressure
+ BMI
+ Glucose
+ Outcome
+ Age
+ DiabetesPedigreeFunction
+ Pregnancies, pch=18, cex=1)
densityplot(imp_regress)
Se puede percibir en ambos gráficos que en esta imputación se logró capturar de mejor manera el comportamiento general de los datos.