El presente análisis utiliza un conjunto de datos enfocado en la detección de anemia, descargado de la plataforma Kaggle (https://www.kaggle.com/datasets/biswaranjanrao/anemia-dataset)
El conjunto de datos incluye las siguientes variables:
# Cargar las librerías
library(pander)
library(summarytools)
library(ggplot2)
library(plotly)
library(readr)
# Cargar la base de datos
anemia <- read_csv("anemia.csv")
pander(head(anemia),caption="Tabla 1: Primeras observaciones de la base")
| Gender | Hemoglobin | MCH | MCHC | MCV | Result |
|---|---|---|---|---|---|
| 1 | 14.9 | 22.7 | 29.1 | 83.7 | 0 |
| 0 | 15.9 | 25.4 | 28.3 | 72 | 0 |
| 0 | 9 | 21.5 | 29.6 | 71.2 | 1 |
| 0 | 14.9 | 16 | 31.4 | 87.5 | 0 |
| 1 | 14.7 | 22 | 28.2 | 99.5 | 0 |
| 0 | 11.6 | 22.3 | 30.9 | 74.5 | 1 |
En la Tabla 1 se aprecia la estructura de las primeras 6 observaciones de la base de datos escogida.
# Hacer factores las variables Gender y Result
anemia$Gender <- as.factor(anemia$Gender)
anemia$Result <- as.factor(anemia$Result)
pander(descr(anemia),caption="Estadísticas Descriptivas Variables Cuantitativas")
| Hemoglobin | MCH | MCHC | MCV | |
|---|---|---|---|---|
| Mean | 13.41 | 22.91 | 30.25 | 85.52 |
| Std.Dev | 1.975 | 3.969 | 1.401 | 9.637 |
| Min | 6.6 | 16 | 27.8 | 69.4 |
| Q1 | 11.7 | 19.4 | 29 | 77.3 |
| Median | 13.2 | 22.7 | 30.4 | 85.3 |
| Q3 | 15 | 26.2 | 31.4 | 94.2 |
| Max | 16.9 | 30 | 32.5 | 101.6 |
| MAD | 2.52 | 4.893 | 1.779 | 12.45 |
| IQR | 3.3 | 6.8 | 2.4 | 16.9 |
| CV | 0.1472 | 0.1733 | 0.04631 | 0.1127 |
| Skewness | 0.0227 | 0.0462 | -0.07722 | 0.03199 |
| SE.Skewness | 0.06491 | 0.06491 | 0.06491 | 0.06491 |
| Kurtosis | -0.8987 | -1.174 | -1.247 | -1.24 |
| N.Valid | 1421 | 1421 | 1421 | 1421 |
| Pct.Valid | 100 | 100 | 100 | 100 |
En la Tabla 2 se puede observar un resumen descriptivo de las variables cuantitativas de la base. De los resultados más relevantes, se puede observar lo siguiente:
En general, las distribuciones de las variables muestran un comportamiento relativamente simétrico, como lo evidencian los valores bajos de asimetría (skewness).
library(ggplot2)
library(dplyr)
library(gridExtra)
# Histograma y densidad para las variables cuantitativas
p1 <- ggplot(anemia, aes(x = Hemoglobin)) +
geom_histogram(aes(y = ..density..), bins = 30, fill = "skyblue", color = "black", alpha = 0.7) +
geom_density(color = "blue", size = 1) +
labs(title = "Distribución de Hemoglobina", x = "Hemoglobina", y = "Densidad") +
theme_minimal()
p2 <- ggplot(anemia, aes(x = MCH)) +
geom_histogram(aes(y = ..density..), bins = 30, fill = "lightgreen", color = "black", alpha = 0.7) +
geom_density(color = "darkgreen", size = 1) +
labs(title = "Distribución de MCH", x = "MCH", y = "Densidad") +
theme_minimal()
p3 <- ggplot(anemia, aes(x = MCHC)) +
geom_histogram(aes(y = ..density..), bins = 30, fill = "lightcoral", color = "black", alpha = 0.7) +
geom_density(color = "red", size = 1) +
labs(title = "Distribución de MCHC", x = "MCHC", y = "Densidad") +
theme_minimal()
p4 <- ggplot(anemia, aes(x = MCV)) +
geom_histogram(aes(y = ..density..), bins = 30, fill = "orange", color = "black", alpha = 0.7) +
geom_density(color = "darkorange", size = 1) +
labs(title = "Distribución de MCV", x = "MCV", y = "Densidad") +
theme_minimal()
# Mostrar gráficos en una cuadrícula
grid.arrange(p1, p2, p3, p4, nrow = 2)
Figura 1: Gráficos - Variables Cuantitativas
La Figura 1, muestra que la hemoglobina tiene una distribución algo bimodal, con picos alrededor de 11 y 15, lo que coincide con su media de 13.41, indicando que hay dos grupos de pacientes con diferentes niveles de hemoglobina. El MCH tiene una distribución más pareja, similar a su media de 22.91. La MCHC muestra una distribución más concentrada, con una media de 30.25, mientras que el MCV es más disperso, con una media de 85.52, lo que concuerda con su mayor rango de variación.
# Gráfico de barras para la variable Gender con porcentajes
p1 <- ggplot(anemia, aes(x = Gender, fill = Gender)) +
geom_bar(alpha = 0.7) +
geom_text(aes(label = scales::percent(..count../sum(..count..), accuracy = 0.1)),
stat = "count", vjust = -0.5, size = 3.5) +
labs(title = "Distribución por Género", x = "Género (0 = Hombre, 1 = Mujer)", y = "Frecuencia") +
scale_fill_manual(values = c("skyblue", "salmon"), labels = c("Hombre", "Mujer")) +theme_minimal()
# Gráfico de barras para la variable Result con porcentajes
p2 <- ggplot(anemia, aes(x = Result, fill = Result)) +
geom_bar(alpha = 0.7) +
geom_text(aes(label = scales::percent(..count../sum(..count..), accuracy = 0.1)),
stat = "count", vjust = -0.5, size = 3.5) +
labs(title = "Distribución por Resultado", x = "Resultado (0 = No Anemia, 1 = Anemia)", y = "Frecuencia") +
scale_fill_manual(values = c("lightgreen", "red"), labels = c("No Anemia", "Anemia")) +theme_minimal()
# Mostrar gráficos juntos
library(gridExtra)
grid.arrange(p1, p2, nrow = 1)
Figura 2: Gráficos - Variables Cualitativas
En los La Figura 2, se observa la distribución de los datos por género y resultado. En cuanto al género, hay una ligera mayoría de mujeres (52.1%) frente a hombres (47.9%). Respecto al resultado, la mayoría de los pacientes no presentan anemia (56.4%), mientras que una menor proporción sí presenta anemia (43.6%).
# Boxplots según el resultado (anemia o no)
p5 <- ggplot(anemia, aes(x = Result, y = Hemoglobin, fill = Result)) +
geom_boxplot(alpha = 0.7) +
labs(title = "Hemoglobina por Resultados", x = "Resultado (0 = No Anemia, 1 = Anemia)", y = "Hemoglobina") +
scale_fill_manual(values = c("skyblue", "salmon")) +
theme_minimal()
p6 <- ggplot(anemia, aes(x = Result, y = MCH, fill = Result)) +
geom_boxplot(alpha = 0.7) +
labs(title = "MCH por Resultados", x = "Resultado (0 = No Anemia, 1 = Anemia)", y = "MCH") +
scale_fill_manual(values = c("lightgreen", "salmon")) +
theme_minimal()
p7 <- ggplot(anemia, aes(x = Result, y = MCHC, fill = Result)) +
geom_boxplot(alpha = 0.7) +
labs(title = "MCHC por Resultados", x = "Resultado (0 = No Anemia, 1 = Anemia)", y = "MCHC") +
scale_fill_manual(values = c("lightcoral", "salmon")) +
theme_minimal()
p8 <- ggplot(anemia, aes(x = Result, y = MCV, fill = Result)) +
geom_boxplot(alpha = 0.7) +
labs(title = "MCV por Resultados", x = "Resultado (0 = No Anemia, 1 = Anemia)", y = "MCV") +
scale_fill_manual(values = c("orange", "salmon")) +
theme_minimal()
grid.arrange(p5, p6, p7, p8, nrow = 2)
Figura 3: Gráficos - Bivariado por resultado
Como se puede observar en la Figura 3, la diferencia más notoria por resultado se da en los niveles de hemoglobina, donde tiende a ser más alta en los pacientes cuyo resultado fue 0, es decir, no presentaban anemia, mientras que los niveles más bajos se presentan en pacientes cuyo resultado fue 1, es decir, pacientes con anemia. En el resto de las variables, los resultados no muestran diferencias tan marcadas.
p1 <- ggplot(anemia, aes(x = Gender, y = Hemoglobin, fill = Gender)) +
geom_boxplot(alpha = 0.7) +
labs(title = "Hemoglobina por Género", x = "Género (0 = Hombre, 1 = Mujer)", y = "Hemoglobina") +
scale_fill_manual(values = c("skyblue", "salmon")) +
theme_minimal()
p2 <- ggplot(anemia, aes(x = Gender, y = MCH, fill = Gender)) +
geom_boxplot(alpha = 0.7) +
labs(title = "MCH por Género", x = "Género (0 = Hombre, 1 = Mujer)", y = "MCH") +
scale_fill_manual(values = c("lightgreen", "salmon")) +
theme_minimal()
p3 <- ggplot(anemia, aes(x = Gender, y = MCHC, fill = Gender)) +
geom_boxplot(alpha = 0.7) +
labs(title = "MCHC por Género", x = "Género (0 = Hombre, 1 = Mujer)", y = "MCHC") +
scale_fill_manual(values = c("lightcoral", "salmon")) +
theme_minimal()
p4 <- ggplot(anemia, aes(x = Gender, y = MCV, fill = Gender)) +
geom_boxplot(alpha = 0.7) +
labs(title = "MCV por Género", x = "Género (0 = Hombre, 1 = Mujer)", y = "MCV") +
scale_fill_manual(values = c("orange", "salmon")) +
theme_minimal()
grid.arrange(p1, p2, p3, p4, nrow = 2)
Figura 4: Gráficos - Bivariado por género
En la Figura 4, se observa que al diferenciar por género, no se aprecian diferencias tan notorias en los niveles de hemoglobina ni los demás promedios de hemoglobina.
# Crear la tabla cruzada siempre fila x columna
tabla_cruzada <- round(prop.table(table(anemia$Gender, anemia$Result))*100,2)
# Asignar etiquetas a filas y columnas
rownames(tabla_cruzada) <- c("Hombre", "Mujer")
colnames(tabla_cruzada) <- c("No Anemia", "Sí Anemia")
# Convertir a formato de porcentaje con el símbolo "%"
tabla_cruzada <- apply(tabla_cruzada, c(1,2), function(x) paste0(x, "%"))
# Mostrar la tabla con pander
pander(tabla_cruzada, caption = "Tabla 2: Tabla cruzada entre Género y Resultado")
| No Anemia | Sí Anemia | |
|---|---|---|
| Hombre | 33.29% | 14.64% |
| Mujer | 23.08% | 28.99% |
# Gráfico de barras compuesto
# Cambiar los 0s y 1s por el significado de cada variabl
ggplot(anemia, aes(x=factor(Result, levels=c(0,1), labels=c("No Anemia", "Sí Anemia")), fill=Gender)) +
geom_bar(position="dodge", colour="gray") +
labs(x= "Resultado", y="Frecuencias", fill="Género") +
theme_minimal()+
geom_text(aes(label=paste0(round(..count../sum(..count..)*100,2),"%")), stat='count',
position=position_dodge(0.9), vjust=-0.5,
size=4.0) +
scale_fill_discrete(name = "Género", labels = c("Hombre", "Mujer"))
Figura 5: Gráficos de barras compuesto - Resultado x Genero
La Tabla 2 y la Figura 5, muestran que, del total de personas sin anemia (57.37% del total), el 33.29% son hombres y el 23.08% son mujeres. Por otro lado, del total de personas con anemia (42.63% del total), el 14.64% son hombres y el 28.99% son mujeres. Esto indica que, aunque los hombres representan un mayor porcentaje del total sin anemia, las mujeres tienen una proporción más alta de casos con anemia en comparación con los hombres, destacándose un mayor riesgo de anemia en las mujeres de esta muestra.
El análisis de los datos muestra que los niveles de hemoglobina son más bajos en los pacientes con anemia, en comparación con aquellos sin anemia. Además, se observa que las mujeres presentan una mayor proporción de casos de anemia en relación con los hombres. Estos hallazgos sugieren la importancia de considerar el género como un factor relevante al evaluar la presencia de anemia en la población estudiada.