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.
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")
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 ...
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
¿Estamos conformes con los resultados de las estadísticas descriptivas? ¿Qué podemos decir sobre los datos de cada variable?
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
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.
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áfico de histograma y caja para la variable
Insulin
Vamos a utilizar datos generados por IA para explorar variables categóricas.
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")
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" ...
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 |
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
.
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
.
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
.
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 |
```