5. Descriptivos

1 Descriptivos univariados y manejo de NA (salarios)

Objetivo: calcular e interpretar media, mediana, moda, varianza, desviación estándar, cuantiles, coeficiente de variación y extremos sobre salary, cuidando los NA.

Tip

Regla de oro con NA: si hay valores faltantes y no los ignoras (na.rm = TRUE), muchas funciones devuelven NA.

1.1 Vector de trabajo y verificación

Code
#| label: s5-vector
#| echo: true

# Partimos de BaseSal creado en la sección anterior:
# (si no existe, descomenta estas 3 líneas para crearlo rápido)
# library(readxl)
# Salaries <- read_excel("Datos/Salaries.xlsx")
# BaseSal  <- dplyr::select(Salaries, dplyr::any_of(c("rank","sex","yrs.service","salary")))

# Vector de salarios:
X <- BaseSal$salary
length(X); head(X)
[1] 397
[1] 139750 173200  79750 115000 141500  97000
Code
sum(is.na(X))  # cuántos NA hay
[1] 0

1.2 Media (promedio) y NA

Code
# Ejemplo didáctico con NA
f <- c(3, 4, 5, 6, NA, 8)

mean(f)                 # -> NA (no ignora NA)
[1] NA
Code
mean(f, na.rm = TRUE)   # ignora NA
[1] 5.2
Code
mean(na.omit(f))        # equivalente si quitas NA
[1] 5.2
Code
# Promedio de salary
mean(X, na.rm = TRUE)
[1] 113706.5

1.3 Mediana y Moda

Code
#| label: s5-mediana-moda
#| echo: true

# Mediana (50% de observaciones <= mediana)
median(X, na.rm = TRUE)
[1] 107300
Code
# Moda (valor más frecuente) sin paquetes extra:
tab <- sort(table(X), decreasing = TRUE)           # tabla de frecuencias
moda_base <- as.numeric(names(tab)[1])
moda_base
[1] 92000
Code
# Opción con 'modeest' (si lo tienes):
# install.packages("modeest")  # descomenta si hace falta
# library(modeest)
# mlv(X, method = "mfv", na.rm = TRUE)[1]

1.4 Dispersión: Varianza, Desviación, Cuantiles e IQR

Code
var(X, na.rm = TRUE)    # varianza
[1] 917425865
Code
sd(X, na.rm = TRUE)     # desviación estándar
[1] 30289.04
Code
# Cuantiles típicos: Q1, mediana (Q2), Q3
quantile(X, probs = c(0.25, 0.5, 0.75), na.rm = TRUE)
   25%    50%    75% 
 91000 107300 134185 
Code
# Rango intercuartílico (IQR = Q3 - Q1)
IQR(X, na.rm = TRUE)
[1] 43185

1.5 Coeficiente de Variación (CV) y extremos

Code
cv <- function(x) sd(x, na.rm = TRUE) / mean(x, na.rm = TRUE) * 100
cv(X)
[1] 26.63792
Code
min(X, na.rm = TRUE)
[1] 57800
Code
max(X, na.rm = TRUE)
[1] 231545
Code
summary(X)  # resumen rápido (Min, Q1, Mediana, Media, Q3, Máx)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  57800   91000  107300  113706  134185  231545 

1.6 Ejercicios

  1. Calcula el promedio truncado de salary quitando el 10% inferior y superior (mean(X, trim = 0.10, na.rm = TRUE)).

  2. Compara media vs mediana y di cuál representa mejor el “típico” salario si hay asimetría.

  3. Obtén los deciles de salary (quantile(X, probs = seq(0,1,0.1), na.rm = TRUE)).

  4. Construye un pequeño reporte con tibble que contenga: n, na, media, mediana, sd, iqr, cv, min, q1, q3, max.

Code
# 1) Promedio truncado (10%)
mean(X, trim = 0.10, na.rm = TRUE)
[1] 111401.6
Code
# 2) Media vs Mediana (inspecciona ambos)
c(media = mean(X, na.rm = TRUE), mediana = median(X, na.rm = TRUE))
   media  mediana 
113706.5 107300.0 
Code
# 3) Deciles
deciles <- quantile(X, probs = seq(0, 1, by = 0.1), na.rm = TRUE)
deciles
      0%      10%      20%      30%      40%      50%      60%      70% 
 57800.0  77380.8  87840.0  94260.8 102373.0 107300.0 116190.0 127182.4 
     80%      90%     100% 
140968.8 152946.0 231545.0 
Code
# 4) Mini-reporte en tibble
library(tibble)
Warning: package 'tibble' was built under R version 4.2.3
Code
reporte <- tibble(
  n      = sum(!is.na(X)),
  na     = sum(is.na(X)),
  media  = mean(X, na.rm = TRUE),
  mediana= median(X, na.rm = TRUE),
  sd     = sd(X, na.rm = TRUE),
  iqr    = IQR(X, na.rm = TRUE),
  cv     = cv(X),
  min    = min(X, na.rm = TRUE),
  q1     = quantile(X, .25, na.rm = TRUE),
  q3     = quantile(X, .75, na.rm = TRUE),
  max    = max(X, na.rm = TRUE)
)
reporte