Nota: En este documento el código se muestra arriba de cada salida y gráfico.
Se usa save_last_plot() para embeder las figuras y que se vean en RPubs.

1 1) Variable, población, muestra

n <- 150
encuesta <- tibble(
  id   = 1:n,
  uso  = sample(c("no usa","usa poco","usa mucho"), size = n, replace = TRUE, prob = c(.25,.45,.30)),
  viajes_mes = rpois(n, lambda = 10)
)
head(encuesta) %>% gt()
id uso viajes_mes
1 usa poco 13
2 no usa 9
3 usa poco 6
4 no usa 7
5 no usa 10
6 usa poco 11

2 2) Escalas de medición

ejemplos_escalas <- tribble(
  ~variable,            ~escala,     ~observaciones,
  "Lugar de nacimiento","Nominal",   "Santa Fe, Paraná, Rosario... (no hay orden)",
  "Grado de satisfacción","Ordinal", "Bajo < Medio < Alto (hay orden, no hay distancias)",
  "Temperatura (°C)",   "Intervalo", "Diferencias significan; 0°C no es 'ausencia' de temperatura",
  "Distancia (km)",     "Razón",     "Tiene cero absoluto; proporciones con sentido"
)
gt(ejemplos_escalas)
variable escala observaciones
Lugar de nacimiento Nominal Santa Fe, Paraná, Rosario... (no hay orden)
Grado de satisfacción Ordinal Bajo < Medio < Alto (hay orden, no hay distancias)
Temperatura (°C) Intervalo Diferencias significan; 0°C no es 'ausencia' de temperatura
Distancia (km) Razón Tiene cero absoluto; proporciones con sentido

3 3) Frecuencias (cuali y cuanti)

3.1 3.1) Cualitativa (uso de transporte)

tab_uso <- encuesta %>%
  tabyl(uso) %>%
  adorn_totals("row") %>%
  mutate(porcentaje = round(100 * n / sum(n), 1))
gt(tab_uso)
uso n percent porcentaje
no usa 39 0.2600000 13.0
usa mucho 41 0.2733333 13.7
usa poco 70 0.4666667 23.3
Total 150 1.0000000 50.0
ggplot(encuesta, aes(x = uso)) +
  geom_bar() +
  labs(x = "Categoría", y = "Frecuencia", title = "Uso de transporte — barras simples")

save_last_plot()

enc_uso_prop <- encuesta %>% count(uso) %>% mutate(prop = n/sum(n))

ggplot(enc_uso_prop, aes(x = "", y = prop, fill = uso)) +
  geom_col(width = 1) +
  coord_polar(theta = "y") +
  scale_y_continuous(labels = percent) +
  labs(title = "Uso de transporte — gráfico circular", x = NULL, y = NULL) +
  theme(axis.text = element_blank(), axis.ticks = element_blank())

save_last_plot()

3.2 3.2) Cuantitativa discreta (kiosco)

kiosk <- tibble(
  compras_semana = sample(0:9, size = 40, replace = TRUE, prob = c(.05,.08,.12,.15,.17,.15,.12,.08,.05,.03))
)

tab_kiosk <- kiosk %>%
  count(compras_semana, name = "fi") %>%
  mutate(hi  = fi / sum(fi), hiP = 100*hi, Fi  = cumsum(fi), Hi  = cumsum(hi), HiP = 100*Hi)
gt(tab_kiosk)
compras_semana fi hi hiP Fi Hi HiP
0 3 0.075 7.5 3 0.075 7.5
1 2 0.050 5.0 5 0.125 12.5
2 9 0.225 22.5 14 0.350 35.0
3 5 0.125 12.5 19 0.475 47.5
4 4 0.100 10.0 23 0.575 57.5
5 4 0.100 10.0 27 0.675 67.5
6 4 0.100 10.0 31 0.775 77.5
7 6 0.150 15.0 37 0.925 92.5
8 3 0.075 7.5 40 1.000 100.0
ggplot(kiosk, aes(x = compras_semana)) +
  geom_bar() +
  labs(x = "Compras en la semana", y = "Frecuencia", title = "Gráfico de bastones (discreta)")

save_last_plot()

kiosk_acum <- tab_kiosk %>% select(compras_semana, Fi)
ggplot(kiosk_acum, aes(x = compras_semana, y = Fi)) +
  geom_step(direction = "hv") + geom_point() +
  labs(x = "Compras en la semana", y = "Frecuencia acumulada", title = "Gráfico de escalones (acumulada)")

save_last_plot()

4 4) Agrupación en intervalos (continua)

caramelos <- tibble(gasto = round(rgamma(40, shape = 3, rate = 0.7),1))

K <- ceiling(1 + log2(nrow(caramelos)))
rango <- range(caramelos$gasto)
amplitud <- ceiling((rango[2] - rango[1]) / K * 10)/10

breaks <- seq(floor(rango[1]), ceiling(rango[2] + 1e-9), by = amplitud)
caramelos$clase <- cut(caramelos$gasto, breaks = breaks, right = FALSE, include.lowest = TRUE)

tab_caramelos <- caramelos %>%
  count(clase, name = "fi") %>%
  mutate(hi = fi/sum(fi), hiP = 100*hi,
         lim_inf = as.numeric(str_extract(clase, "(?<=\\[|\\().*(?=,)")),
         lim_sup = as.numeric(str_extract(clase, "(?<=,).*(?=\\]|\\))")),
         mid = (lim_inf + lim_sup)/2,
         Fi = cumsum(fi), Hi = cumsum(hi), HiP = 100*Hi)
gt(tab_caramelos)
clase fi hi hiP lim_inf lim_sup mid Fi Hi HiP
[0,1.5) 6 0.150 15.0 0.0 1.5 0.75 6 0.150 15.0
[1.5,3) 5 0.125 12.5 1.5 3.0 2.25 11 0.275 27.5
[3,4.5) 12 0.300 30.0 3.0 4.5 3.75 23 0.575 57.5
[4.5,6) 11 0.275 27.5 4.5 6.0 5.25 34 0.850 85.0
[6,7.5) 4 0.100 10.0 6.0 7.5 6.75 38 0.950 95.0
[7.5,9) 1 0.025 2.5 7.5 9.0 8.25 39 0.975 97.5
NA 1 0.025 2.5 NA NA NA 40 1.000 100.0
ggplot(caramelos, aes(x = gasto)) +
  geom_histogram(binwidth = amplitud, boundary = min(breaks), closed = "left", color = "white") +
  labs(x = "Gasto semanal ($)", y = "Frecuencia", title = "Histograma (Sturges)")

save_last_plot()

ggplot(tab_caramelos, aes(x = mid, y = fi)) +
  geom_point() + geom_line() +
  labs(x = "Punto medio de clase", y = "Frecuencia", title = "Polígono de frecuencias")

save_last_plot()

ggplot(tab_caramelos, aes(x = lim_sup, y = Fi)) +
  geom_step() + geom_point() +
  labs(x = "Límite superior de clase", y = "Frecuencia acumulada", title = "Ojiva creciente (<)")

save_last_plot()

tab_caramelos$Fi_desc <- rev(cumsum(rev(tab_caramelos$fi)))
ggplot(tab_caramelos, aes(x = lim_inf, y = Fi_desc)) +
  geom_step() + geom_point() +
  labs(x = "Límite inferior de clase", y = "Frecuencia acumulada", title = "Ojiva decreciente (≥)")

save_last_plot()

4.1 4.2) Clases heterogéneas (densidad)

breaks_het <- c(0, 3, 5, 9, 15, 25)
caramelos$clase_het <- cut(caramelos$gasto, breaks = breaks_het, right = FALSE, include.lowest = TRUE)

tab_het <- caramelos %>%
  count(clase_het, name="fi") %>%
  mutate(a_inf = as.numeric(str_extract(clase_het, "(?<=\\[|\\().*(?=,)")),
         a_sup = as.numeric(str_extract(clase_het, "(?<=,).*(?=\\]|\\))")),
         ancho = a_sup - a_inf, densidad = fi / ancho)
gt(tab_het)
clase_het fi a_inf a_sup ancho densidad
[0,3) 11 0 3 3 3.6666667
[3,5) 15 3 5 2 7.5000000
[5,9) 13 5 9 4 3.2500000
[9,15) 1 9 15 6 0.1666667
ggplot(tab_het, aes(x = a_inf, y = densidad, width = ancho)) +
  geom_col(position = "identity", align = "edge") +
  labs(x = "Gasto semanal ($)", y = "Frecuencia por unidad de intervalo", title = "Histograma con clases heterogéneas (densidad)")

save_last_plot()

5 5) Comparativos

areas <- c("Administración","Ventas","Producción","RRHH","IT")
dist_HL  <- c(20, 35, 30, 8, 7)
dist_TAL <- c(14, 40, 22, 12, 12)

personal <- tibble(
  area = factor(areas, levels = areas),
  HLy  = dist_HL,
  TALy = dist_TAL
) %>%
  pivot_longer(-area, names_to = "empresa", values_to = "n")
ggplot(personal, aes(x = area, y = n, fill = empresa)) +
  geom_col(position = position_dodge()) +
  labs(x = NULL, y = "Cantidad", title = "Distribución por área — barras agrupadas")

save_last_plot()

ggplot(personal, aes(x = area, y = n, fill = empresa)) +
  geom_col() +
  labs(x = NULL, y = "Cantidad", title = "Distribución por área — barras apiladas")

save_last_plot()

personal_pct <- personal %>% group_by(area) %>% mutate(p = n/sum(n))
ggplot(personal_pct, aes(x = area, y = p, fill = empresa)) +
  geom_col() +
  scale_y_continuous(labels = percent) +
  labs(x = NULL, y = "% dentro de cada área", title = "Distribución por área — barras segmentadas (100%)")

save_last_plot()

by_sex <- tibble(
  area = factor(areas, levels = areas),
  Mujeres = c(18, 22, 10, 7, 5),
  Varones = c(12, 28, 35, 6, 9)
) %>%
  pivot_longer(-area, names_to = "sexo", values_to = "n") %>%
  mutate(valor = if_else(sexo == "Mujeres", n, -n))

ggplot(by_sex, aes(x = area, y = valor, fill = sexo)) +
  geom_col() +
  coord_flip() +
  labs(x = NULL, y = "Mujeres (+) / Varones (–)", title = "Barras bidireccionales por área")

save_last_plot()

6 6) Dispersión y series

n2 <- 120
biv <- tibble(
  horas_estudio = round(runif(n2, 0, 10),1),
  puntaje       = 30 + 5*horas_estudio + rnorm(n2, sd = 6)
)
ggplot(biv, aes(horas_estudio, puntaje)) +
  geom_point(alpha = .7) +
  labs(x = "Horas de estudio (X)", y = "Puntaje (Y)", title = "Diagrama de dispersión")

save_last_plot()

serie <- tibble(
  fecha = seq(as.Date("2023-01-01"), by = "month", length.out = 24),
  ventas = 100 + 5*(1:24) + rnorm(24, sd = 12)
)

ggplot(serie, aes(fecha, ventas)) +
  geom_line() + geom_point() +
  labs(x = NULL, y = "Ventas (índice)", title = "Serie temporal — gráfico de líneas")

save_last_plot()

7 7) Medidas resumen y outliers

moda <- function(x){
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

res_viajes <- encuesta %>% summarize(
  n = n(),
  media = mean(viajes_mes),
  mediana = median(viajes_mes),
  moda = moda(viajes_mes),
  var = var(viajes_mes),
  sd = sd(viajes_mes),
  q1 = quantile(viajes_mes, .25),
  q3 = quantile(viajes_mes, .75),
  IQR = IQR(viajes_mes)
)
gt(res_viajes)
n media mediana moda var sd q1 q3 IQR
150 9.986667 10 11 9.650828 3.106578 8 12 4
IQR_val <- IQR(encuesta$viajes_mes)
q1 <- quantile(encuesta$viajes_mes, .25)
q3 <- quantile(encuesta$viajes_mes, .75)
LI <- q1 - 1.5*IQR_val
LS <- q3 + 1.5*IQR_val

outliers <- encuesta %>% filter(viajes_mes < LI | viajes_mes > LS)

ggplot(encuesta, aes(y = viajes_mes, x = "")) +
  geom_boxplot(outlier.colour = "red", width = .3) +
  geom_jitter(width = .1, alpha = .3) +
  labs(x = NULL, y = "Viajes/mes", title = "Boxplot con posibles outliers (regla 1.5*IQR)")

save_last_plot()

outliers