Explorando Datos Numéricos

Vamos a usar de ejemplo los datos sobre un estudio de diabetes en mujeres indígenas Pima. Los Pima son un grupo de nativos americanos que viven en el sur de Arizona. Los datos contienen información sobre 768 mujeres indígenas Pima, incluyendo el número de embarazos, la concentración de glucosa en plasma, la presión arterial diastólica, el grosor de la piel, la insulina en suero, el índice de masa corporal, la función de pedigrí de la diabetes, la edad y el diagnóstico previo de diabetes mellitus.

Cargar los datos

El archivo diabetes.csv contiene los datos que vamos a utilizar. Vamos a cargar los datos en un objeto llamado diabetes.

# Cargar datos en un objeto llamado diabetes
diabetes <- read.csv("diabetes.csv")

Tipos de variables

Vamos a utilizar la función str() para identificar los tipos de variables en diabetes.

# Tipos de variables en diabetes
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 ...

Estadísticas descriptivas de las variables

Vamos a obtener un resumen estadístico de las variables numéricas en diabetes utilizando la función básica summary().

# Resumen de las variables numéricas
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

Pregunta sobre los datos

¿Estamos conformes con los resultados de las estadísticas descriptivas? ¿Qué podemos decir sobre los datos de cada variable?

Otra manera de obtener estadísticas descriptivas

Vamos a utilizar el paquete tidyverse para obtener estadísticas descriptivas de las variables numéricas en diabetes, filtrando los ceros en las variables de glucosa e insulina y utilizando la función summarise().

# Cargar el paquete tidyverse
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Estadísticas descriptivas de las variables numéricas de glucosa e insulina, eliminando los ceros
diabetes %>%
  filter(Glucose != 0 & Insulin != 0) %>%
  summarise(
    median_glucose = median(Glucose),
    mean_glucose = mean(Glucose),
    sd_glucose = sd(Glucose),
    median_insulin = median(Insulin),
    mean_insulin = mean(Insulin),
    sd_insulin = sd(Insulin)
  )
##   median_glucose mean_glucose sd_glucose median_insulin mean_insulin sd_insulin
## 1            119     122.6158   30.82228            125     155.8855   118.7382

Histograma de la variable Glucose

Vamos a utilizar el paquete ggplot2 para crear un histograma de la variable Glucose en diabetes. Igualmente vamos a filtrar los ceros en la variable Glucose.

# histograma de la variable Glucose con ggplot2
library(ggplot2)

diabetes %>%
  filter(Glucose != 0) %>%
  ggplot(aes(x = Glucose)) +
  geom_histogram(binwidth = 10, fill = "skyblue", color = "black") +
  geom_vline(aes(xintercept = mean(Glucose)), color = "red", linetype = "dashed") +
  geom_vline(aes(xintercept = median(Glucose)), color = "blue", linetype = "dashed") +
  labs(
       x = "Glucosa en Plasma",
       y = "Frecuencia")

Figura 1. Histograma de la variable Glucose en diabetes. La línea roja representa la media y la línea azul la mediana.

Gráfico de caja para la variable Glucose

Vamos a utilizar el paquete ggplot2 para crear un gráfico de caja horizontal de la variable Glucose en diabetes, sin los valores de cero.

# Gráfico de caja horizontal para la variable Glucose con ggplot2
# rotar 90 grados
diabetes %>%
  filter(Glucose != 0) %>%
  ggplot(aes(x = "", y = Glucose)) +
  geom_boxplot(fill = "skyblue", color = "black") +
  coord_flip() +
  labs(
       x = "",
       y = "Glucosa en Plasma")

Figura 2. Gráfico de caja de la variable Glucose en diabetes.

Gráficas para otras variables

Gráfico de histograma y caja para la variable Insulin

Explorando Datos Categóricos

Vamos a utilizar datos generados por IA para explorar variables categóricas.

Cargar los datos

El archivo data-patient-monica.csv contiene los datos que vamos a utilizar. Vamos a cargar los datos en un objeto llamado pacientes.

# Cargar datos en un objeto llamado pacientes
pacientes <- read.csv("data-patients-monica.csv")

Tipos de variables

Vamos a utilizar la función str() para identificar los tipos de variables en pacientes.

# Tipos de variables en pacientes
str(pacientes)
## 'data.frame':    100 obs. of  5 variables:
##  $ Patient_ID    : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Gender        : chr  "Female" "Male" "Male" "Male" ...
##  $ Blood_Type    : chr  "A" "O" "O" "O" ...
##  $ Smoking_Status: chr  "Non-Smoker" "Non-Smoker" "Non-Smoker" "Smoker" ...
##  $ Diagnosis     : chr  "Healthy" "Asthma" "Healthy" "Asthma" ...

Tablas de frecuencia

Vamos a crear tablas de frecuencia absoluta y relativa para la variable Diagnosis en pacientes. Usaremos además el paquete gt para crear tablas con un formato más atractivo.

# Tabla de frecuencia de la variable Diagnosis
tabfrecabs <- table(pacientes$Diagnosis)
tabfrecabs
## 
##        Asthma      Diabetes       Healthy Heart Disease  Hypertension 
##            16            23            28            18            15
# Crear una tabla de frecuencia relativa
tabfrecrel <- prop.table(table(pacientes$Diagnosis))
tabfrecrel
## 
##        Asthma      Diabetes       Healthy Heart Disease  Hypertension 
##          0.16          0.23          0.28          0.18          0.15
# Crear tablas con gt
library(gt)

# Tabla de frecuencia absoluta
gt(as.data.frame(tabfrecabs)) %>% 
  tab_header(title = "Tabla 1. Frecuencias de Diagnósticos") %>%
  cols_label(Var1 = "Diagnosis", Freq = "Frecuencia")
Tabla 1. Frecuencias de Diagnósticos
Diagnosis Frecuencia
Asthma 16
Diabetes 23
Healthy 28
Heart Disease 18
Hypertension 15

Gráficos de barras para Diagnosis

Vamos a crear un gráfico de barras para la variable Diagnosis en pacientes utilizando el paquete ggplot2.

# Gráfico de barras de la variable Diagnosis con ggplot2
library(ggplot2)

ggplot(pacientes, aes(x = Diagnosis)) +
  geom_bar(fill = "skyblue") +
  labs(
       x = "Diagnosis",
       y = "Frecuencia")

Figura 3. Gráfico de barras de la variable Diagnosis en pacientes.

Gráfico de barras horizontales ordenadas para Diagnosis

Vamos a crear un gráfico de barras horizontales ordenadas para la variable Diagnosis en pacientes utilizando el paquete ggplot2.

# Create a data frame of Diagnosis frequencies
diagnosis_counts <- as.data.frame(table(pacientes$Diagnosis))

# Rename columns for clarity
colnames(diagnosis_counts) <- c("Diagnosis", "Frequency")

# Order the data by Frequency in descending order
diagnosis_counts <- diagnosis_counts[order(-diagnosis_counts$Frequency), ]

# Create the horizontal bar plot
ggplot(diagnosis_counts, aes(x = reorder(Diagnosis, Frequency), y = Frequency)) +
  geom_bar(stat = "identity", fill = "skyblue") +
  coord_flip() +  # Flip coordinates to make bars horizontal
  labs(
    x = "Diagnóstico",
    y = "Frecuencia"
  ) +
  theme_minimal()

Figura 4. Gráfico de barras horizontales ordenadas de la variable Diagnosis en pacientes.

Gráfico de barras para Diagnosis por Gender

Vamos a crear un gráfico de barras apiladas para la variable Diagnosis en pacientes por Gender utilizando el paquete ggplot2.

# Load necessary library
library(ggplot2)

# Create the stacked bar plot
ggplot(pacientes, aes(x = Gender, fill = Diagnosis)) +
  geom_bar(position = "stack") +
  labs(
    x = "Género",
    y = "Cantidad",
    fill = "Diagnosis"
  ) +
  theme_minimal()

Figura 5. Gráfico de barras apiladas de la variable Diagnosis en pacientes por Gender.

Tabla de contingencia

Vamos a crear una tabla de contingencia para las variables Diagnosis y Gender en pacientes utilizando la función xtabs().

# Create a contingency table
contingency_table <- xtabs(~ Gender + Diagnosis, data = pacientes)

# Add row and column sums to the contingency table
contingency_table_with_sums <- addmargins(contingency_table)

# Print the contingency table with sums
contingency_table_with_sums
##         Diagnosis
## Gender   Asthma Diabetes Healthy Heart Disease Hypertension Sum
##   Female      8       11      10            13            8  50
##   Male        8       12      18             5            7  50
##   Sum        16       23      28            18           15 100

Vamos a producir la tabla de contingencia utilizando el paquete gt.

# Load necessary library
library(gt)

# Convert the contingency table with sums to a data frame
contingency_table_df <- as.data.frame.matrix(contingency_table_with_sums)

# Add row names (Gender) as the first column
contingency_table_df <- cbind(Gender = rownames(contingency_table_df), contingency_table_df)

# Create the gt table
gt_table <- gt(contingency_table_df) %>%
  tab_header(
    title = "Tabla 2. Tabla de Contingencia de Diagnóstico por Género.  Incluye la suma por filas y columnas.") %>%
  fmt_number(
    columns = everything(),
    decimals = 0  # Ensure counts are shown without decimals
  ) %>%
  cols_label(
    Gender = "Género / Total",
    Sum = "Total Fila"
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_column_labels(everything())
  )

# Print the gt table
gt_table
Tabla 2. Tabla de Contingencia de Diagnóstico por Género. Incluye la suma por filas y columnas.
Género / Total Asthma Diabetes Healthy Heart Disease Hypertension Total Fila
Female 8 11 10 13 8 50
Male 8 12 18 5 7 50
Sum 16 23 28 18 15 100

```