Introducción

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.


0. Estructura de Datos Base

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
cat("Tamaño de la muestra (n):", n, "\n")
#> Tamaño de la muestra (n): 9

1. Media Aritmética (\(\bar{x}\))

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

2. Mediana (\(\tilde{x}\))

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

3. Moda (\(\hat{x}\))

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

4. Rango (\(R\))

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

5. Varianza Muestral (\(s^2\))

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

6. Desviación Estándar Muestral (\(s\))

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

7. Error Típico / Estándar de la Media (\(SE\))

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

8. Coeficiente de Asimetría (Skewness)

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

9. Curtosis (Exceso)

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

10. Cuartiles (Ej. Q1)

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