\[\bar{x} = \frac{\sum_{i=1}^{n} x_i}{n}\] donde:
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.
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?
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
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.
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
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
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.
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
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.
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.
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.
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 ...
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
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 …).
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’.
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.
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.