Explorando Datos Numéricos

Tendencia Central

Media (promedio)

\[\bar{x} = \frac{\sum_{i=1}^{n} x_i}{n}\] donde:

  • \(\bar{x}\) es la media muestral (\(\mu\) sería la media poblacional)
  • \(x_i\) son los valores individuales de la variable
  • \(n\) es el número total de observaciones en la muestra (\(N\) sería el número total de observaciones en la población)

Vamos a calcular, con la fórmula, la media de un conjunto de datos sobre la altura (en pulgadas) de un grupo de 9 personas.

# Cálculo manual de la media
x <- c(54,77,67,68,46,64,62,56,38)
n <- length(x)
mean_x <- sum(x) / n
mean_x
## [1] 59.11111

R provee el comando mean() para calcular la media de una variable numérica.

# Cálculo de la media con la función mean()
mean(x)
## [1] 59.11111

EJERCICIO: Transformar los datos a centímetros (1 pulgada = 2.54 cm) y calcular la media en centímetros.

Mediana

La mediana es el valor que separa la mitad superior de la mitad inferior de un conjunto de datos ordenados. Si el número de observaciones es impar, la mediana es el valor central. Si el número de observaciones es par, la mediana es el promedio de los dos valores centrales.

Vamos a calcular manualmente la mediana de los datos de altura en pulgadas.

# Ordenar los datos
x_sorted <- sort(x)
n <- length(x_sorted)
x_sorted
## [1] 38 46 54 56 62 64 67 68 77
# Calcular la mediana
if (n %% 2 == 1) { # %% operador módulo, para detectar si n es impar
  median_x <- x_sorted[(n + 1) / 2]
} else {
  median_x <- (x_sorted[n / 2] + x_sorted[n / 2
 + 1]) / 2
}
median_x
## [1] 62

R provee el comando median() para calcular la mediana de una variable numérica. Con este comando, no es necesario ordenar los datos.

# Cálculo de la mediana con la función median()
median(x)
## [1] 62

EJERCICIO: Cambiar el dato de 38 pulgadas por 24 pulgadas y calcular la media y la mediana nuevamente. ¿Qué observas?

Moda

La moda es el valor que aparece con mayor frecuencia en un conjunto de datos. Un conjunto de datos puede tener una sola moda (unimodal), más de una moda (bimodal o multimodal), o no tener moda si todos los valores son únicos.

Vamos a calcular la moda de los datos de altura en pulgadas.

# modificamos los datos para tener una moda
x_moda <- c(54,77,67,68,46,64,62,54,56)
x_moda
## [1] 54 77 67 68 46 64 62 54 56
# Función para calcular la moda
mode_function <- function(v) {
  uniqv <- unique(v)
  uniqv[which.max(tabulate(match(v, uniqv)))]
}
# Calcular la moda
mode_x <- mode_function(x)
mode_x
## [1] 54

Media Ponderada

La media ponderada es una medida de tendencia central que toma en cuenta la importancia relativa de cada valor en un conjunto de datos. Se calcula multiplicando cada valor por su peso correspondiente, sumando estos productos y dividiendo por la suma de los pesos.

\[\bar{x}_w = \frac{\sum_{i=1}^{n} w_i x_i}{\sum_{i=1}^{n} w_i}\]

donde:

- \(\bar{x}_w\) es la media ponderada
- \(x_i\) son los valores individuales de la variable
- \(w_i\) son los pesos correspondientes a cada valor
- \(n\) es el número total de observaciones

Una aplicación común de la media ponderada es el cálculo del ‘promedio’ (GPA, Grade Point Average) de un estudiante, donde las calificaciones de los cursos (valores de las variable ‘notas’) se ponderan según los créditos de cada curso (pesos de cada valor).

Vamos a calcular el GPA de un estudiante utilizando las calificaciones de sus cursos.

# Crear vectores de cursos, créditos y notas
cursos <- c("BIOL111", "HUMA111", "INGL1111", "QUIM1111", "MATE1111", "BIOL2222")
creditos <- c(3, 3, 2, 3, 4, 4)
notas <- c(3.0, 4.0, 3.0, 2.0, 3.0, 4.0)
# Crear data.frame con las calificaciones
calificaciones <- data.frame(cursos, creditos, notas)
# Calcular el GPA
gpa <- sum(calificaciones$creditos * calificaciones$notas) / sum(calificaciones$creditos)
# Mostrar el GPA
gpa
## [1] 3.210526

EJERCICIO: Calcula el GPA de tu semestre pasado (o el que esperas obtener este semestre) utilizando las calificaciones de tus cursos y los créditos correspondientes.

Dispersión de los datos

Rango

El rango es la diferencia entre el valor máximo y el valor mínimo en un conjunto de datos. Proporciona una medida simple de la dispersión de los datos.
\[Rango = x_{max} - x_{min}\]
donde:
- \(x_{max}\) es el valor máximo en el conjunto de datos
- \(x_{min}\) es el valor mínimo en el conjunto de datos

Vamos a calcular el rango de los datos de altura en pulgadas.

# Calcular el rango con la fórmula
rango_x <- max(x) - min(x)
rango_x
## [1] 39
# Calcular el rango con la función range()
range_x <- range(x) # devuelve un vector con el valor mínimo y máximo
range_x
## [1] 38 77
rango <- range_x[2] - range_x[1]
rango
## [1] 39

Varianza

La varianza es una medida de la dispersión de un conjunto de datos. Indica qué tan lejos están los valores individuales del promedio (media) del conjunto de datos. La varianza se calcula como el promedio de las diferencias al cuadrado entre cada valor y la media.

\[s^2 = \frac{\sum_{i=1}^{n} (x_i - \bar{x})^2}{n - 1}\]

donde:
- \(s^2\) es la varianza muestral (\(\sigma^2\) sería la varianza poblacional)
- \(x_i\) son los valores individuales de la variable
- \(\bar{x}\) es la media muestral
- \(n\) es el número total de observaciones en la muestra (\(N\) sería el número total de observaciones en la población)

Vamos a calcular la varianza de los datos de altura en pulgadas.

# Calcular la varianza con la fórmula
mean_x <- mean(x)
varianza_x <- sum((x - mean_x)^2) / (length(x) - 1)
varianza_x
## [1] 143.3611
# Calcular la varianza con la función var()
varianza_x_func <- var(x)
varianza_x_func
## [1] 143.3611

Desviación estándar

La desviación estándar es la raíz cuadrada de la varianza y proporciona una medida de la dispersión de un conjunto de datos en las mismas unidades que los datos originales. Indica qué tan lejos, en promedio, están los valores individuales del promedio (media) del conjunto de datos.

\[s = \sqrt{s^2}\]

donde:
- \(s\) es la desviación estándar muestral (\(\sigma\) sería la desvi ción estándar poblacional)
- \(s^2\) es la varianza muestral

Vamos a calcular la desviación estándar de los datos de altura en pulgadas.

# Calcular la desviación estándar con la fórmula
desviacion_x <- sqrt(varianza_x)
desviacion_x
## [1] 11.97335
# Calcular la desviación estándar con la función sd()
desviacion_x_func <- sd(x)
desviacion_x_func
## [1] 11.97335

EJERCICIO: Calcula, con un código R, los valores de la media más y menos la desviación estándar.

Error estándar de la media

El error estándar de la media (SEM) es una medida de la precisión con la que la media muestral estima la media poblacional. Se calcula dividiendo la desviación estándar de la muestra por la raíz cuadrada del tamaño de la muestra.

\[SEM = \frac{s}{\sqrt{n}}\]

donde:
- \(SEM\) es el error estándar de la media
- \(s\) es la desviación estándar muestral
- \(n\) es el número total de observaciones en la muestra

Vamos a calcular el error estándar de la media de los datos de altura en pulgadas.

# Calcular el error estándar de la media
sem_x <- sd(x) / sqrt(length(x))
sem_x
## [1] 3.991117

Coeficiente de variación

El coeficiente de variación (CV) es una medida de la dispersión relativa de un conjunto de datos. Se calcula dividiendo la desviación estándar por la media y multiplicando por 100 para expresarlo como un porcentaje.

\[CV = \frac{s}{\bar{x}} \times 100\]

donde:
- \(CV\) es el coeficiente de variación
- \(s\) es la desviación estándar muestral
- \(\bar{x}\) es la media muestral

Vamos a calcular el coeficiente de variación de los datos de altura en pulgadas.

# Calcular el coeficiente de variación
cv_x <- (sd(x) / mean(x)) * 100
cv_x
## [1] 20.25567

EJERCICIO: Calcula la desviación estándar, el error estándar de la media y el coeficiente de variación para los datos de altura en centímetros (transforma los datos primero). Compara con los resultados en pulgadas.

Percentiles y cuartiles

Los percentiles son valores que dividen un conjunto de datos ordenados en 100 partes iguales. El percentil \(P_k\) es el valor por debajo del cual se encuentra el \(k\)% de los datos. Por ejemplo, el percentil 25 (P25) es el valor por debajo del cual se encuentra el 25% de los datos.

Los cuartiles son un caso especial de percentiles que dividen un conjunto de datos ordenados en cuatro partes iguales. El primer cuartil (Q1) es el percentil 25, el segundo cuartil (Q2) es la mediana (percentil 50), y el tercer cuartil (Q3) es el percentil 75.

Vamos a calcular los percentiles y cuartiles de los datos de altura en pulgadas.

# Calcular percentiles y cuartiles con la fórmula
x_sorted <- sort(x)
n <- length(x_sorted)
percentil_25 <- x_sorted[ceiling(0.25 * n)] # ceiling redondea hacia arriba la posición en el vector
percentil_50 <- x_sorted[ceiling(0.50 * n)]
percentil_75 <- x_sorted[ceiling(0.95 * n)]
percentiles <- c(percentil_25, percentil_50, percentil_75)
percentiles
## [1] 54 62 77
# Calcular percentiles y cuartiles con la función quantile()
percentiles_x <- quantile(x, probs = c(0.25, 0.5, 0.75))
percentiles_x
## 25% 50% 75% 
##  54  62  67

EJERCICIO: Calcula el percentil 95% de los datos de altura en pulgadas, usando ceiling() y la función quantile(). Compara los resultados.

Visualización de la tendencia central y la dispersión de los datos

Histograma

Un histograma es una representación gráfica de la distribución de un conjunto de datos numéricos. Se utiliza para visualizar la frecuencia de los valores en diferentes intervalos (‘bins’) y para identificar patrones, tendencias y posibles datos extremos o ‘outliers’.

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 del antebrazo, 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 la variable Glucose

Utilizaremos el comando summary() para obtener un resumen estadístico de las variables numéricas de diabetes. Para los procedimientos siguientes estaremos utilizando comandos del paquete tidyverse.

library(tidyverse)
# Seleccionamos las variables numéricas solamente
diabetes_num <- diabetes %>% select(where(is.numeric))
# Estadísticas de las variables numéricas solamente
summary(diabetes_num)
##   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

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

# Estadísticas descriptivas de las variables numéricas glucosa, eliminando los ceros
diabetes %>% # esto es un pipe y sirve para encadenar comandos
  filter(Glucose != 0) %>% # filtra los ceros en Glucose
  summarise(
    median_glucose = median(Glucose),
    mean_glucose = mean(Glucose),
    sd_glucose = sd(Glucose)
  )
##   median_glucose mean_glucose sd_glucose
## 1            117     121.6868   30.53564
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(dplyr)
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") +
  geom_vline(aes(xintercept = mean(Glucose) - sd(Glucose)), color = "darkgreen", linetype = "dotdash") +
  geom_vline(aes(xintercept = mean(Glucose) + sd(Glucose)), color = "darkgreen", linetype = "dotdash") +
  labs(
    x = "Glucosa en Plasma",
    y = "Frecuencia"
  )

EJERCICIO: Escribe la leyenda correspondiente a esta gráfica (Figura 1. Histograma de …).

Gráfico de caja y bigote

Un gráfico de caja y bigote (‘boxplot’) es una representación gráfica que muestra la distribución de un conjunto de datos numéricos a través de sus cuartiles. El gráfico incluye una caja que representa el rango intercuartílico (IQR), que abarca desde el primer cuartil (Q1) hasta el tercer cuartil (Q3), y “bigotes” que se extienden hasta 1.5 veces el IQR por encima de Q3 y por debajo de Q1. Los puntos fuera de los bigotes se consideran valores atípicos o ‘outliers’.

Gráfico de caja y bigote 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") +
  stat_summary(fun = mean, geom = "point", shape = 23, size = 3, fill = "red")

Figura 2. Gráfico de caja de la variable Glucose en diabetes. El punto rojo representa la media.

Valores representados en el gráfico de caja

Vamos a utilizar el paquete dplyr para calcular los valores representados en el gráfico de caja de la variable Glucose en diabetes, sin los valores de cero.

# Valores representados en el gráfico de caja
diabetes %>%
  filter(Glucose != 0) %>%
  summarise(
    min = min(Glucose),
    Q1 = quantile(Glucose, 0.25),
    median = median(Glucose),
    mean = mean(Glucose),
    Q3 = quantile(Glucose, 0.75),
    max = max(Glucose),
    IQR = IQR(Glucose), # Igual a Q3 - Q1
    lower_whisker = Q1 - 1.5 * IQR,
    upper_whisker = Q3 + 1.5 * IQR
  )
##   min Q1 median     mean  Q3 max IQR lower_whisker upper_whisker
## 1  44 99    117 121.6868 141 199  42            36           204

EJERCICIO: El gráfico de caja no muestra ‘outliers’ (valores atípicos). Explícalo con los cálculos anteriores.