Este documento sirve como referencia rápida (Cheat Sheet) para calcular las principales medidas de estadística descriptiva en R.
Cada sección está dividida en dos enfoques para fines didácticos y analíticos: 1. Enfoque Nativo: Utilizando las funciones integradas y optimizadas de R. 2. Lógica Manual (Desde cero): Escribiendo el algoritmo paso a paso sin depender de funciones estadísticas directas, ideal para comprender las matemáticas y la estructura de datos detrás de cada medida.
Para todos los ejemplos, utilizaremos el siguiente vector de edades:
# Definición de la muestra
x <- c(62, 28, 22, 22, 26, 23, 18, 26, 23)
n <- length(x) # Tamaño de la muestra
cat("Vector de datos:", x, "\n")#> Vector de datos: 62 28 22 22 26 23 18 26 23
#> Tamaño de la muestra (n): 9
Lógica: Sumar todos los elementos del conjunto y dividir entre el número total de observaciones (\(n\)). \[ \bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i \]
# --- 1. FUNCIÓN NATIVA ---
media_nativa <- mean(x)
# --- 2. LÓGICA MANUAL ---
suma_acumulada <- 0
for (val in x) {
suma_acumulada <- suma_acumulada + val
}
media_manual <- suma_acumulada / n
# Comprobación
cat("Media Nativa:", media_nativa, "\nMedia Manual:", media_manual)#> Media Nativa: 27.77778
#> Media Manual: 27.77778
Lógica: Ordenar el conjunto de menor a mayor. Si \(n\) es impar, se toma el valor central. Si \(n\) es par, se promedian los dos valores centrales.
# --- 1. FUNCIÓN NATIVA ---
mediana_nativa <- median(x)
# --- 2. LÓGICA MANUAL ---
x_ord <- sort(x) # Ordenar vector de menor a mayor
if (n %% 2 != 0) {
# Si n es impar: Posición central exacta
mediana_manual <- x_ord[(n + 1) / 2]
} else {
# Si n es par: Promedio de los dos elementos centrales
pos1 <- n / 2
pos2 <- (n / 2) + 1
mediana_manual <- (x_ord[pos1] + x_ord[pos2]) / 2
}
# Comprobación
cat("Mediana Nativa:", mediana_nativa, "\nMediana Manual:", mediana_manual)#> Mediana Nativa: 23
#> Mediana Manual: 23
Lógica: Contar la frecuencia absoluta con la que aparece cada elemento y extraer la observación que tenga el valor de frecuencia máxima. (R base no tiene una función directa simple para la moda, por lo que armamos tablas).
# --- 1. FUNCIÓN (Usando table) ---
tabla_freq <- table(x)
moda_nativa <- as.numeric(names(tabla_freq)[which.max(tabla_freq)])
# --- 2. LÓGICA MANUAL ---
valores_unicos <- unique(x)
conteo <- numeric(length(valores_unicos))
# Contar apariciones de cada valor único
for (i in 1:length(valores_unicos)) {
conteo[i] <- sum(x == valores_unicos[i])
}
# Extraer el valor con mayor número de apariciones
posicion_maxima <- which(conteo == max(conteo))
moda_manual <- valores_unicos[posicion_maxima]
# Comprobación (Puede haber más de una moda, imprimimos todas)
cat("Moda Nativa:", moda_nativa, "\nModa Manual:", paste(moda_manual, collapse = ", "))#> Moda Nativa: 22
#> Moda Manual: 22, 26, 23
Lógica: Restar el valor mínimo del valor máximo del conjunto de datos. \[ R = x_{\max} - x_{\min} \]
# --- 1. FUNCIÓN NATIVA ---
rango_nativo <- max(x) - min(x) # También diff(range(x))
# --- 2. LÓGICA MANUAL ---
# Aprovechamos el vector ordenado del paso de la mediana
minimo_manual <- x_ord[1]
maximo_manual <- x_ord[length(x_ord)]
rango_manual <- maximo_manual - minimo_manual
# Comprobación
cat("Rango Nativo:", rango_nativo, "\nRango Manual:", rango_manual)#> Rango Nativo: 44
#> Rango Manual: 44
Lógica: Sumar las diferencias cuadráticas de cada dato respecto a la media, divididas entre \(n - 1\) (Corrección de Bessel). \[ s^2 = \frac{\sum_{i=1}^{n} (x_i - \bar{x})^2}{n - 1} \]
# --- 1. FUNCIÓN NATIVA ---
var_nativa <- var(x)
# --- 2. LÓGICA MANUAL ---
suma_sq <- 0
for (val in x) {
suma_sq <- suma_sq + (val - media_manual)^2
}
var_manual <- suma_sq / (n - 1)
# Comprobación
cat("Varianza Nativa:", var_nativa, "\nVarianza Manual:", var_manual)#> Varianza Nativa: 173.1944
#> Varianza Manual: 173.1944
Lógica: Es la raíz cuadrada positiva de la varianza muestral. Expresa la dispersión en las mismas unidades que los datos originales. \[ s = \sqrt{s^2} \]
# --- 1. FUNCIÓN NATIVA ---
sd_nativa <- sd(x)
# --- 2. LÓGICA MANUAL ---
sd_manual <- var_manual^(1/2) # Equivalente a sqrt(var_manual)
# Comprobación
cat("SD Nativa:", sd_nativa, "\nSD Manual:", sd_manual)#> SD Nativa: 13.16034
#> SD Manual: 13.16034
Lógica: Es la desviación estándar muestral dividida entre la raíz cuadrada del tamaño de la muestra. \[ SE = \frac{s}{\sqrt{n}} \]
# --- 1. FUNCIÓN NATIVA (Combinada) ---
se_nativo <- sd(x) / sqrt(n)
# --- 2. LÓGICA MANUAL ---
se_manual <- sd_manual / (n^(1/2))
# Comprobación
cat("SE Nativo:", se_nativo, "\nSE Manual:", se_manual)#> SE Nativo: 4.386779
#> SE Manual: 4.386779
Lógica: Mide la falta de simetría de los datos. Se
calcula utilizando el tercer momento estándar. (Nota: La librería
e1071 o moments en R suelen usarse para la
función nativa). \[ g_1 =
\frac{\frac{1}{n} \sum_{i=1}^{n} (x_i - \bar{x})^3}{s_p^3} \]
# --- LÓGICA MANUAL (Asimetría Poblacional) ---
m <- media_manual
# Desviación estándar poblacional (dividido entre n, no n-1)
s_poblacional <- sqrt(sum((x - m)^2) / n)
tercer_momento <- sum((x - m)^3) / n
asimetria_manual <- tercer_momento / (s_poblacional^3)
cat("Asimetría Manual:", asimetria_manual)#> Asimetría Manual: 2.241208
Lógica: Mide el grado de concentración / apuntamiento de la distribución. Se utiliza el cuarto momento estándar restándole 3 (distribución normal). \[ g_2 = \frac{\frac{1}{n} \sum_{i=1}^{n} (x_i - \bar{x})^4}{s_p^4} - 3 \]
# --- LÓGICA MANUAL (Exceso de Curtosis) ---
cuarto_momento <- sum((x - m)^4) / n
curtosis_manual <- (cuarto_momento / (s_poblacional^4)) - 3
cat("Exceso de Curtosis Manual:", curtosis_manual)#> Exceso de Curtosis Manual: 3.488523
Lógica: Encontrar la posición proporcional en el vector ordenado. Si no es un número entero, se aplica una interpolación lineal entre los dos valores más cercanos.
# --- 1. FUNCIÓN NATIVA ---
q1_nativo <- unname(quantile(x, probs = 0.25))
# --- 2. LÓGICA MANUAL ---
p <- 0.25 # Percentil 25
posicion <- p * (n - 1) + 1
k <- floor(posicion) # Índice inferior
d <- posicion - k # Fracción decimal para interpolar
# Interpolar entre el valor en la posición k y k+1
q1_manual <- x_ord[k] + d * (x_ord[k + 1] - x_ord[k])
# Comprobación
cat("Q1 Nativo:", q1_nativo, "\nQ1 Manual:", q1_manual)#> Q1 Nativo: 22
#> Q1 Manual: 22