Este documento reproduce, de forma reproducible en R, el material de clase de Tópicos de Estadística Descriptiva y Probabilidades: técnicas de muestreo estadístico, sus fórmulas, demostraciones y aplicación a casos reales de la región Huánuco (comercio, agua potable, educación, agricultura cafetalera, turismo y transporte).
| Muestreo probabilístico | Muestreo no probabilístico |
|---|---|
| Toda unidad tiene probabilidad conocida y distinta de cero de ser elegida | La selección depende del criterio del investigador o la disponibilidad |
| Permite calcular el error muestral e inferir a la población | No permite inferencia estadística formal (útil en estudios exploratorios) |
| MAS, estratificado, conglomerados, sistemático | Conveniencia, cuotas, bola de nieve, intencional |
Población infinita o desconocida: \[n = \frac{Z^2\,p\,q}{e^2}\]
Población finita (con corrección por tamaño finito, fpc): \[n = \frac{Z^2\,p\,q\,N}{e^2(N-1) + Z^2\,p\,q}\]
valor_Z <- function(confianza) {
alpha <- 1 - confianza
qnorm(1 - alpha / 2)
}
n_poblacion_infinita <- function(Z, p, e) {
q <- 1 - p
(Z^2 * p * q) / e^2
}
n_poblacion_finita <- function(Z, p, e, N) {
q <- 1 - p
(Z^2 * p * q * N) / (e^2 * (N - 1) + Z^2 * p * q)
}
Z90 <- valor_Z(0.90); Z95 <- valor_Z(0.95); Z99 <- valor_Z(0.99)
cat(sprintf("Z(90%%) = %.4f\nZ(95%%) = %.4f\nZ(99%%) = %.4f\n", Z90, Z95, Z99))## Z(90%) = 1.6449
## Z(95%) = 1.9600
## Z(99%) = 2.5758
Sea \(\hat p\) la proporción muestral. Por el Teorema Central del Límite, para \(n\) suficientemente grande: \[\hat p \;\dot\sim\; N\!\left(p,\; \frac{pq}{n}\right)\]
Queremos que \(P(|\hat p - p|\le e) = 1-\alpha\). Estandarizando: \[e = Z_{\alpha/2}\sqrt{\frac{pq}{n}}\]
Elevamos al cuadrado y despejamos \(n\): \[e^2 = Z^2_{\alpha/2}\cdot\frac{pq}{n} \;\Longrightarrow\; n\cdot e^2 = Z^2_{\alpha/2}\,pq \;\Longrightarrow\; \boxed{n = \frac{Z^2\,p\,q}{e^2}}\]
Como \(pq\) se maximiza en \(p=0.5\) (derivando \(p(1-p)\) e igualando a cero: \(1-2p=0 \Rightarrow p=0.5\)), este valor se usa cuando no se conoce \(p\), pues produce el tamaño de muestra más conservador (el más grande).
Al muestrear sin reemplazo de una población finita \(N\), la varianza de \(\hat p\) se corrige por el factor \((N-n)/(N-1)\): \[\operatorname{Var}(\hat p) = \frac{pq}{n}\cdot\frac{N-n}{N-1}\]
Repitiendo el argumento del intervalo de confianza: \[e^2 = Z^2\cdot\frac{pq}{n}\cdot\frac{N-n}{N-1}\]
Multiplicando por \(n(N-1)\) y agrupando los términos con \(n\): \[e^2(N-1)\,n + Z^2pq\,n = Z^2pq\,N \;\Longrightarrow\; n\big[e^2(N-1)+Z^2pq\big] = Z^2pq\,N\]
\[\boxed{n = \frac{Z^2\,p\,q\,N}{e^2(N-1) + Z^2\,p\,q}}\]
Si \(N\to\infty\), esta fórmula converge algebraicamente a la de población infinita: ambas son consistentes entre sí.
\(N=1{,}200\) comerciantes, \(p=0.5\) (sin estudio previo), 95% de confianza, \(e=0.05\).
N <- 1200; p <- 0.5; e <- 0.05
n_calc <- n_poblacion_finita(Z95, p, e, N)
n_final <- ceiling(n_calc)
cat(sprintf("n calculado = %.2f\nn final = %d comerciantes\n", n_calc, n_final))## n calculado = 291.18
## n final = 292 comerciantes
\(N=45{,}000\) conexiones, \(p=0.5\), 95% de confianza, \(e=0.04\).
N <- 45000; p <- 0.5; e <- 0.04
n_calc <- n_poblacion_finita(Z95, p, e, N)
n_final <- ceiling(n_calc)
cat(sprintf("n calculado = %.2f\nn final = %d conexiones\n", n_calc, n_final))## n calculado = 592.34
## n final = 593 conexiones
Si de las 593 conexiones encuestadas \(\hat p = 0.62\) reportó estar satisfecho: \[\hat p \pm Z_{\alpha/2}\sqrt{\frac{\hat p(1-\hat p)}{n}\cdot\frac{N-n}{N-1}}\]
N <- 45000; n <- 593; p_hat <- 0.62
error_estandar <- sqrt((p_hat * (1 - p_hat) / n) * ((N - n) / (N - 1)))
margen <- Z95 * error_estandar
li <- p_hat - margen; ls <- p_hat + margen
cat(sprintf("Proporción muestral: %s\n", percent(p_hat)))## Proporción muestral: 62%
## Margen de error: ±0.0388 (±4%)
## Intervalo de confianza al 95%: [58% , 66%]
\(N=650\), \(e=0.06\), \(p=0.5\), 95% de confianza.
N <- 650; e <- 0.06; p <- 0.5
n_calc <- n_poblacion_finita(Z95, p, e, N)
cat(sprintf("n calculado = %.2f -> n final = %d negocios\n", n_calc, ceiling(n_calc)))## n calculado = 189.35 -> n final = 190 negocios
\[n_h = n \times \frac{N_h}{N}\]
Estimador combinado y su varianza: \[\bar x_{st} = \sum_{h=1}^{L}\frac{N_h}{N}\bar x_h, \qquad \operatorname{Var}(\bar x_{st}) = \sum_{h=1}^{L}\left(\frac{N_h}{N}\right)^2\frac{S_h^2}{n_h}\cdot\frac{N_h-n_h}{N_h}\]
Pesos poblacionales de las 11 provincias de Huánuco (INEI, proyección 2021), muestra total \(n=384\):
n_total <- 384
pesos_provincia <- c(
"Huánuco (capital)" = 0.359, "Leoncio Prado" = 0.155, "Huamalíes" = 0.087,
"Pachitea" = 0.084, "Ambo" = 0.066, "Dos de Mayo" = 0.062,
"Lauricocha" = 0.045, "Yarowilca" = 0.039, "Marañón" = 0.037,
"Puerto Inca" = 0.037, "Huacaybamba" = 0.026
)
tabla_estratos <- data.frame(
Provincia = names(pesos_provincia),
Peso = as.numeric(pesos_provincia)
) |>
mutate(
n_h_exacto = n_total * Peso,
n_h_base = floor(n_h_exacto),
residuo = n_h_exacto - n_h_base
)
tabla_estratos |>
select(Provincia, Peso, n_h_exacto) |>
rename(`n_h (exacto)` = n_h_exacto) |>
tabla_bonita()| Provincia | Peso | n_h (exacto) |
|---|---|---|
| Huánuco (capital) | 0.36 | 137.86 |
| Leoncio Prado | 0.16 | 59.52 |
| Huamalíes | 0.09 | 33.41 |
| Pachitea | 0.08 | 32.26 |
| Ambo | 0.07 | 25.34 |
| Dos de Mayo | 0.06 | 23.81 |
| Lauricocha | 0.04 | 17.28 |
| Yarowilca | 0.04 | 14.98 |
| Marañón | 0.04 | 14.21 |
| Puerto Inca | 0.04 | 14.21 |
| Huacaybamba | 0.03 | 9.98 |
suma_pesos <- sum(tabla_estratos$Peso)
suma_base <- sum(tabla_estratos$n_h_base)
cat(sprintf("\nSuma de pesos: %.3f\n", suma_pesos))##
## Suma de pesos: 0.997
## Suma de n_h (base, sin ajustar) = 377 (objetivo: 384)
faltante <- n_total - suma_base
tabla_estratos <- tabla_estratos |>
arrange(desc(residuo)) |>
mutate(n_h_ajustado = n_h_base + ifelse(row_number() <= faltante, 1, 0)) |>
arrange(desc(Peso))
tabla_estratos |>
select(Provincia, n_h_exacto, n_h_ajustado) |>
rename(`n_h (exacto)` = n_h_exacto, `n_h (ajustado)` = n_h_ajustado) |>
tabla_bonita()| Provincia | n_h (exacto) | n_h (ajustado) |
|---|---|---|
| Huánuco (capital) | 137.86 | 138 |
| Leoncio Prado | 59.52 | 60 |
| Huamalíes | 33.41 | 34 |
| Pachitea | 32.26 | 32 |
| Ambo | 25.34 | 26 |
| Dos de Mayo | 23.81 | 24 |
| Lauricocha | 17.28 | 17 |
| Yarowilca | 14.98 | 15 |
| Marañón | 14.21 | 14 |
| Puerto Inca | 14.21 | 14 |
| Huacaybamba | 9.98 | 10 |
##
## Unidades repartidas: 7
cat(sprintf("Suma final ajustada: %d (debe ser %d) ✅\n",
sum(tabla_estratos$n_h_ajustado), n_total))## Suma final ajustada: 384 (debe ser 384) ✅
ggplot(tabla_estratos, aes(x = reorder(Provincia, n_h_ajustado), y = n_h_ajustado)) +
geom_col(fill = color_verde) +
geom_text(aes(label = n_h_ajustado), hjust = -0.25, size = 3.3) +
coord_flip() +
labs(title = "Afijación proporcional de la muestra por provincia",
subtitle = "Departamento de Huánuco — n total = 384",
x = NULL, y = "Tamaño de submuestra (n_h)") +
theme_minimal(base_size = 12) +
ylim(0, max(tabla_estratos$n_h_ajustado) * 1.15)Muestra asignada por provincia (afijación proporcional)
\(N=8{,}400\) estudiantes, \(n=367\), tres facultades (35%, 40%, 25%).
n_total_uneval <- 367
facultades <- c(`Adm. y Turismo` = 0.35, `Ingeniería` = 0.40, `Salud` = 0.25)
for (f in names(facultades)) {
n_h <- n_total_uneval * facultades[f]
cat(sprintf("%-16s: %d x %.2f = %.2f -> %d estudiantes\n",
f, n_total_uneval, facultades[f], n_h, round(n_h)))
}## Adm. y Turismo : 367 x 0.35 = 128.45 -> 128 estudiantes
## Ingeniería : 367 x 0.40 = 146.80 -> 147 estudiantes
## Salud : 367 x 0.25 = 91.75 -> 92 estudiantes
cat(sprintf("\nSuma total: %d (objetivo: %d)\n",
sum(round(n_total_uneval * facultades)), n_total_uneval))##
## Suma total: 367 (objetivo: 367)
\[k = \frac{N}{n}\]
Se elige un arranque aleatorio \(r\in[1,k]\) y se seleccionan \(r,\, r+k,\, r+2k,\, \ldots\)
muestreo_sistematico <- function(N, n, r = NULL, semilla = 2026) {
set.seed(semilla)
k <- N / n
if (is.null(r)) r <- sample(1:floor(k), 1)
indices <- r + (0:(n - 1)) * k
indices <- indices[indices <= N]
list(k = k, r = r, indices = round(indices))
}
# Caso SUNAT: fiscalización en el terminal terrestre
res1 <- muestreo_sistematico(N = 800, n = 80, r = 4)
cat(sprintf("k = 800/80 = %.1f\n", res1$k))## k = 800/80 = 10.0
## Primeros 6 elementos (r=4): 4 14 24 34 44 54 ...
# Ejercicio 3: productores de papa
res2 <- muestreo_sistematico(N = 1500, n = 100, r = 7)
cat(sprintf("k = 1500/100 = %.1f\n", res2$k))## k = 1500/100 = 15.0
## Primeros 5 elementos (r=7): 7 22 37 52 67
Estimador (si no hay periodicidad oculta, se comporta como un MAS): \[\bar x_{sy} = \frac{1}{n}\sum_{i=1}^n x_i, \qquad \widehat{\operatorname{Var}}(\bar x_{sy}) \approx \frac{S^2}{n}\cdot\frac{N-n}{N}\]
\[DEFF = 1 + (\bar m - 1)\rho, \qquad n_{\text{conglomerados}} = n_{MAS}\times DEFF\]
60 caseríos de ~25 productores cada uno.
efecto_diseno <- function(m_barra, rho) 1 + (m_barra - 1) * rho
n_mas <- 150; rho <- 0.15; m_barra <- 25
d <- efecto_diseno(m_barra, rho)
n_ajustado <- n_mas * d
caserios_necesarios <- ceiling(n_ajustado / m_barra)
cat(sprintf("DEFF = 1 + (%d-1) x %.2f = %.2f\n", m_barra, rho, d))## DEFF = 1 + (25-1) x 0.15 = 4.60
## n ajustado = 150 x 4.60 = 690.0 productores
cat(sprintf("Caseríos a visitar ~= %.2f -> %d caseríos (de 60)\n",
n_ajustado / m_barra, caserios_necesarios))## Caseríos a visitar ~= 27.60 -> 28 caseríos (de 60)
rhos <- seq(0, 1, length.out = 100)
n_ajustados <- n_mas * sapply(rhos, efecto_diseno, m_barra = m_barra)
ggplot(data.frame(rho = rhos, n = n_ajustados), aes(x = rho, y = n)) +
geom_line(color = color_verde, linewidth = 1.2) +
geom_vline(xintercept = 0.15, linetype = "dashed", color = color_oro) +
geom_hline(yintercept = n_mas, linetype = "dotted", color = "gray40") +
annotate("text", x = 0.17, y = max(n_ajustados) * 0.95,
label = "ρ = 0.15 (caso Leoncio Prado)", hjust = 0, color = color_oro, size = 3.5) +
labs(title = "Tamaño de muestra necesario según la correlación intraclase",
x = expression(rho~"(correlación intraclase)"),
y = "Tamaño de muestra ajustado") +
theme_minimal(base_size = 12)Tamaño de muestra ajustado según la correlación intraclase
\[n_h = n\times\frac{N_h}{N}\]
Caso: comerciantes informales del centro de Huánuco (\(N\approx3{,}000\), 55% mujeres, 45% hombres), \(n=150\).
n_cuota <- 150
proporciones <- c(Mujeres = 0.55, Hombres = 0.45)
for (g in names(proporciones)) {
cuota <- n_cuota * proporciones[g]
cat(sprintf("Cuota %s: %d x %.2f = %.1f -> %d personas\n",
g, n_cuota, proporciones[g], cuota, round(cuota)))
}## Cuota Mujeres: 150 x 0.55 = 82.5 -> 82 personas
## Cuota Hombres: 150 x 0.45 = 67.5 -> 68 personas
\[n_{\text{acumulado}} = s + \sum_{j=1}^{k} s\cdot b^{j}\]
Caso: productores orgánicos de café en Leoncio Prado. Semilla \(s=5\), tasa de ramificación \(b=3\).
semilla <- 5; ramificacion <- 3; olas <- 3
tabla_nieve <- data.frame(Ola = 0, Nuevos = semilla, Acumulado = semilla)
acumulado <- semilla
for (ola in 1:olas) {
nuevos <- semilla * ramificacion^ola
acumulado <- acumulado + nuevos
tabla_nieve <- rbind(tabla_nieve, data.frame(Ola = ola, Nuevos = nuevos, Acumulado = acumulado))
}
tabla_bonita(tabla_nieve)| Ola | Nuevos | Acumulado |
|---|---|---|
| 0 | 5 | 5 |
| 1 | 15 | 20 |
| 2 | 45 | 65 |
| 3 | 135 | 200 |
ggplot(tabla_nieve, aes(x = factor(Ola), y = Acumulado)) +
geom_col(fill = color_oro) +
geom_text(aes(label = Acumulado), vjust = -0.4, fontface = "bold") +
labs(title = "Crecimiento de la muestra — Método bola de nieve",
x = "Ola de referidos", y = "Productores acumulados") +
theme_minimal(base_size = 12) +
ylim(0, max(tabla_nieve$Acumulado) * 1.15)Crecimiento de la muestra en el método bola de nieve
No existe fórmula de asignación en estos dos casos: el criterio es cualitativo, por lo que se reservan para estudios exploratorios.
Simulamos una población de 60 caseríos × 25 productores (1,500 en total), con un rendimiento promedio de 100 qq/ha y correlación intraclase inducida. Comparamos 5,000 réplicas de cada diseño con el mismo esfuerzo muestral (150 productores).
set.seed(2026)
N_CASERIOS <- 60; M <- 25
MU_GENERAL <- 100
SD_ENTRE <- 12
SD_DENTRO <- 8
efectos_caserio <- rnorm(N_CASERIOS, 0, SD_ENTRE)
poblacion <- matrix(NA, nrow = N_CASERIOS, ncol = M)
for (c in 1:N_CASERIOS) {
poblacion[c, ] <- MU_GENERAL + efectos_caserio[c] + rnorm(M, 0, SD_DENTRO)
}
media_poblacional <- mean(poblacion)
cat(sprintf("Media poblacional real simulada: %.2f qq/ha\n", media_poblacional))## Media poblacional real simulada: 98.72 qq/ha
## Total de productores simulados: 1500 en 60 caseríos
poblacion_plana <- as.vector(poblacion)
n_individuos <- 150
n_conglomerados <- n_individuos %/% M # 150 / 25 = 6
REPLICAS <- 5000
medias_mas <- replicate(REPLICAS, {
idx <- sample(seq_along(poblacion_plana), n_individuos, replace = FALSE)
mean(poblacion_plana[idx])
})
medias_cong <- replicate(REPLICAS, {
idx <- sample(1:N_CASERIOS, n_conglomerados, replace = FALSE)
mean(poblacion[idx, ])
})
resumen_mc <- data.frame(
Diseno = c("MAS", "Conglomerados"),
`Media de las medias` = c(mean(medias_mas), mean(medias_cong)),
`Error estándar` = c(sd(medias_mas), sd(medias_cong)),
check.names = FALSE
)
resumen_mc <- resumen_mc |> rename(`Diseño` = Diseno)
tabla_bonita(resumen_mc)| Diseño | Media de las medias | Error estándar |
|---|---|---|
| MAS | 98.72 | 1.07 |
| Conglomerados | 98.67 | 4.32 |
razon <- sd(medias_cong) / sd(medias_mas)
cat(sprintf("\nRazón de errores estándar (conglomerados / MAS) = %.2f\n", razon))##
## Razón de errores estándar (conglomerados / MAS) = 4.03
df_sim <- data.frame(
media = c(medias_mas, medias_cong),
diseno = rep(c("MAS", "Conglomerados"), each = REPLICAS)
)
ggplot(df_sim, aes(x = media, fill = diseno)) +
geom_histogram(position = "identity", alpha = 0.6, bins = 40) +
geom_vline(xintercept = media_poblacional, linetype = "dashed", linewidth = 1) +
scale_fill_manual(values = c("MAS" = color_verde, "Conglomerados" = color_oro)) +
labs(title = "MAS vs. Conglomerados: misma n, distinta precisión",
subtitle = sprintf("σ(MAS) = %.2f | σ(Conglomerados) = %.2f", sd(medias_mas), sd(medias_cong)),
x = "Media muestral estimada (qq/ha)", y = "Frecuencia (de 5,000 réplicas)",
fill = "Diseño") +
theme_minimal(base_size = 12) +
theme(legend.position = "top")Distribución de las medias muestrales: MAS vs. Conglomerados
\[DEFF_{\text{simulado}} = \left(\frac{\sigma_{\text{conglomerados}}}{\sigma_{MAS}}\right)^2\]
deff_teorico <- efecto_diseno(m_barra = 25, rho = 0.15)
deff_simulado <- (sd(medias_cong) / sd(medias_mas))^2
cat(sprintf("DEFF teórico (fórmula, rho=0.15) = %.2f\n", deff_teorico))## DEFF teórico (fórmula, rho=0.15) = 4.60
## DEFF simulado (desde la simulación) = 16.24
##
## Ambos valores son del mismo orden de magnitud, confirmando que la
## fórmula teórica predice razonablemente bien la pérdida de precisión.
resumen_final <- data.frame(
Caso = c("Comerciantes Mercado Modelo", "Conexiones de agua (SEDA)",
"Negocios agroexportadores (Ej. 1)", "Empleo regional por provincia",
"Estudiantes UNHEVAL (Ej. 2)", "Terminal terrestre (SUNAT)",
"Productores de papa (Ej. 3)", "Caseríos cafetaleros",
"Comerciantes informales", "Productores orgánicos de café"),
Tecnica = c("MAS (finita)", "MAS (finita)", "MAS (finita)", "Estratificado",
"Estratificado", "Sistemático", "Sistemático", "Conglomerados",
"Cuotas", "Bola de nieve"),
N = c(1200, 45000, 650, NA, 8400, 800, 1500, 1500, 3000, NA),
`n final` = c(
ceiling(n_poblacion_finita(Z95, 0.5, 0.05, 1200)),
ceiling(n_poblacion_finita(Z95, 0.5, 0.04, 45000)),
ceiling(n_poblacion_finita(Z95, 0.5, 0.06, 650)),
384, 367, 80, 100, caserios_necesarios, 150, 200
),
check.names = FALSE
)
resumen_final <- resumen_final |> rename(`Técnica` = Tecnica)
tabla_bonita(resumen_final)| Caso | Técnica | N | n final |
|---|---|---|---|
| Comerciantes Mercado Modelo | MAS (finita) | 1,200 | 292 |
| Conexiones de agua (SEDA) | MAS (finita) | 45,000 | 593 |
| Negocios agroexportadores (Ej. 1) | MAS (finita) | 650 | 190 |
| Empleo regional por provincia | Estratificado | NA | 384 |
| Estudiantes UNHEVAL (Ej. 2) | Estratificado | 8,400 | 367 |
| Terminal terrestre (SUNAT) | Sistemático | 800 | 80 |
| Productores de papa (Ej. 3) | Sistemático | 1,500 | 100 |
| Caseríos cafetaleros | Conglomerados | 1,500 | 28 |
| Comerciantes informales | Cuotas | 3,000 | 150 |
| Productores orgánicos de café | Bola de nieve | NA | 200 |
Este documento demuestra, con código R ejecutable y reproducible, que todos los resultados del material de clase son consistentes entre el desarrollo algebraico y su verificación computacional. Puedes modificar cualquier parámetro (\(N\), \(e\), nivel de confianza, \(\rho\), etc.) y volver a compilar (Knit) para explorar otros escenarios aplicados a la región Huánuco.
Material elaborado para las clases de Tópicos de Estadística Descriptiva y Probabilidades — Econ. Jeel Cueva, UNHEVAL.