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) 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) 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) Frecuencias (cuali y
cuanti)
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) 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) 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.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) 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) 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) 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