Introducción

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)

Descripción de las variables

El conjunto de datos incluye las siguientes variables:

  • Gender (cualitativa, nominal): Género del paciente, codificado como 0 (hombre) y 1 (mujer).
  • Hemoglobin (cuantitativa, continua): Concentración de hemoglobina en la sangre. La hemoglobina es una proteína presente en los glóbulos rojos encargada de transportar oxígeno a los tejidos del cuerpo y dióxido de carbono hacia los pulmones.
  • MCH (cuantitativa, continua): “Mean Corpuscular Hemoglobin”, cantidad promedio de hemoglobina en cada glóbulo rojo.
  • MCHC (cuantitativa, continua): “Mean Corpuscular Hemoglobin Concentration”, concentración promedio de hemoglobina dentro de un glóbulo rojo.
  • MCV (cuantitativa, continua): “Mean Corpuscular Volume”, tamaño promedio de los glóbulos rojos.
  • Results (cualitativa, binaria): Variable objetivo que indica si el paciente es anémico (1) o no (0).

Análisis Exploratorio - Univariado

Carga de la base de datos

# 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")
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.

Variables Cuantitativas

# 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")
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:

  • La concentración promedio de Hemoglobina es de 13.41, con un rango que varía entre 6.6 y 16.9. Esto indica una dispersión moderada, reflejada en un coeficiente de variación (CV) de 0.1472.
  • En el caso del MCH, que mide la cantidad promedio de hemoglobina por glóbulo rojo, el valor promedio es de 22.91 y tiene una mayor variabilidad relativa con un CV de 0.1733.
  • Para el MCHC, que mide la concentración promedio de hemoglobina dentro de un glóbulo rojo, el promedio es de 30.25, con una variabilidad menor (CV de 0.04631), lo que sugiere una distribución más homogénea.
  • El MCV, que mide el tamaño promedio de los glóbulos rojos, tiene un valor medio de 85.52, con un rango amplio entre 69.4 y 101.6, reflejando cierta dispersión con un CV de 0.1127.

En general, las distribuciones de las variables muestran un comportamiento relativamente simétrico, como lo evidencian los valores bajos de asimetría (skewness).

Gráficos
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

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.

Variables Cualitativas

# 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

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%).

Análisis Exploratorio - Bivariado

# 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

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

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.

Tabla Cruzada Genero-Resultado

# 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")
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

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.

Conclusión:

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.