Cargo algunas librerías útiles:
library(ggplot2)
library(cowplot)
library(dplyr)
“Un coleccionista quiere llenar un álbum de \(500\) figuritas comprando sobres de \(5\) figuritas distintas.”
FIGURITAS <- 1:500
sobre_nuevo <- function() {
sample(FIGURITAS, size = 5)
}
“Va comprando sobres hasta que logra completar el álbum. Las figuritas repetidas las descarta.”
llenar_el_album <- function() {
album <- c()
sobres_necesarios <- 0
while (length(album) < length(FIGURITAS)) {
album <- union(album, sobre_nuevo())
sobres_necesarios <- sobres_necesarios + 1
}
sobres_necesarios
}
“Estime por simulación el valor esperado de sobres que habrá de comprar.”
correr_k_simulaciones <- function(k) {
resultados <- c()
media <- NULL
for (i in 1:k) {
resultados <- c(resultados, llenar_el_album())
}
round(mean(resultados), 2)
}
“Sea \(k\) la cantidad de simulaciones que se usan para estimar el valor esperado de sobres. Buscamos obtener una idea de la distribución de \(a_k\), que dependerá seguramente de \(k\). Para \(k = 5\), \(10\), \(50\), \(100\) repita el ensayo una cantidad \(n = 100\) veces y vaya guardando los resultados de la estimación.”
library(progress)
k_values <- c(5, 10, 50, 100)
n <- 100
resultados <- data.frame()
for (k in k_values) {
resultados_para_este_k <- c()
print(sprintf('Corriendo %s simulaciones con k = %s', n, k))
pb <- progress_bar$new(total = n)
for (i in 1:n) {
resultados_para_este_k <- c(resultados_para_este_k, correr_k_simulaciones(k))
pb$tick()
}
resultados <-
resultados %>%
bind_rows(data.frame(k = k, values = resultados_para_este_k))
}
[1] "Corriendo 100 simulaciones con k = 5"
[1] "Corriendo 100 simulaciones con k = 10"
[1] "Corriendo 100 simulaciones con k = 50"
[1] "Corriendo 100 simulaciones con k = 100"
“1. Arme una tabla con estadı́sticos resumen para cada valor de \(k\) considerado.”
resultados %>%
group_by(k) %>%
summarise(
n = n(),
mean = mean(values),
IQR = IQR(values),
sd = sd(values),
min = min(values),
q25 = quantile(values, .25),
median = median(values),
q75 = quantile(values, .75),
max = max(values),
mad = mad(values)
) %>%
mutate_all(round)
“2. Arme boxplots en paralelo de los resultados obtenidos, un boxplot para cada valor de \(k\).”
resultados$k <- as.factor(resultados$k)
resultados %>%
ggplot(aes(x = k, y = values)) +
geom_boxplot(width = 0.2) +
labs(
title = 'Menor spread a mayor valor de k',
x = 'k',
y = 'Sobres necesarios para llenar el álbum'
) +
theme_minimal()

“3. Arme histogramas para cada valor de \(k\).”
plots <- list()
shared_xlim <- c(min(resultados$values) * 0.9,
max(resultados$values) * 1.1)
for (k_value in unique(resultados$k)) {
p <-
resultados %>%
filter(k == k_value) %>%
ggplot() +
aes(x = values) +
geom_histogram(bins = 30) +
xlim(shared_xlim) +
geom_vline(
aes(xintercept = median(values)),
colour="White",
linetype = 'dashed',
size = 0.25
) +
labs(
title = sprintf('k = %s', k_value),
x = 'Nro. de Sobres'
) +
theme_minimal()
plots[[length(plots) + 1]] <- p
}
plot_grid(plotlist = plots, ncol = 2, nrow = 2)
Removed 1 rows containing missing values (geom_bar).Removed 1 rows containing missing values (geom_bar).Removed 1 rows containing missing values (geom_bar).Removed 1 rows containing missing values (geom_bar).

LS0tCnRpdGxlOiAiQUVEIH4gRWplcmNpY2lvIFByw6FjdGljYSAxIHkgMiIKZGF0ZTogQXByaWwgMTQsIDIwMTgKYXV0aG9yOiBKdWFuIE1hbnVlbCBCZXJyb3MKb3V0cHV0OiBodG1sX25vdGVib29rCiMgb3V0cHV0OgojICAgcGRmX2RvY3VtZW50OgojICAgICBoaWdobGlnaHQ6IHRhbmdvCiMgICAgIGRmX3ByaW50OiB0aWJibGUgIyBrYWJsZSAjIHRpYmJsZSB8IGRlZmF1bHQgfCBrYWJsZQotLS0KCkNhcmdvIGFsZ3VuYXMgbGlicmVyw61hcyDDunRpbGVzOgpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkoZHBseXIpCmBgYAoKIlVuIGNvbGVjY2lvbmlzdGEgcXVpZXJlIGxsZW5hciB1biDDoWxidW0gZGUgJDUwMCQgZmlndXJpdGFzIGNvbXByYW5kbyBzb2JyZXMgZGUgJDUkIGZpZ3VyaXRhcyBkaXN0aW50YXMuIgpgYGB7cn0KRklHVVJJVEFTIDwtIDE6NTAwCgpzb2JyZV9udWV2byA8LSBmdW5jdGlvbigpIHsKICBzYW1wbGUoRklHVVJJVEFTLCBzaXplID0gNSkKfQpgYGAKCiJWYSBjb21wcmFuZG8gc29icmVzIGhhc3RhIHF1ZSBsb2dyYSBjb21wbGV0YXIgZWwgw6FsYnVtLiBMYXMgZmlndXJpdGFzIHJlcGV0aWRhcyBsYXMgZGVzY2FydGEuIgpgYGB7cn0KbGxlbmFyX2VsX2FsYnVtIDwtIGZ1bmN0aW9uKCkgewogICAgYWxidW0gPC0gYygpCiAgICBzb2JyZXNfbmVjZXNhcmlvcyA8LSAwCiAgICB3aGlsZSAobGVuZ3RoKGFsYnVtKSA8IGxlbmd0aChGSUdVUklUQVMpKSB7CiAgICAgICAgYWxidW0gPC0gdW5pb24oYWxidW0sIHNvYnJlX251ZXZvKCkpCiAgICAgICAgc29icmVzX25lY2VzYXJpb3MgPC0gc29icmVzX25lY2VzYXJpb3MgKyAxCiAgICB9CiAgICBzb2JyZXNfbmVjZXNhcmlvcwp9CmBgYAoKIkVzdGltZSBwb3Igc2ltdWxhY2nDs24gZWwgdmFsb3IgZXNwZXJhZG8gZGUgc29icmVzIHF1ZSBoYWJyw6EgZGUgY29tcHJhci4iCmBgYHtyfQpjb3JyZXJfa19zaW11bGFjaW9uZXMgPC0gZnVuY3Rpb24oaykgewogIHJlc3VsdGFkb3MgPC0gYygpCiAgbWVkaWEgPC0gTlVMTAogIAogIGZvciAoaSBpbiAxOmspIHsKICAgIHJlc3VsdGFkb3MgPC0gYyhyZXN1bHRhZG9zLCBsbGVuYXJfZWxfYWxidW0oKSkKICB9CiAgCiAgcm91bmQobWVhbihyZXN1bHRhZG9zKSwgMikKfQpgYGAKCiJTZWEgJGskIGxhIGNhbnRpZGFkIGRlIHNpbXVsYWNpb25lcyBxdWUgc2UgdXNhbiBwYXJhIGVzdGltYXIgZWwgdmFsb3IgZXNwZXJhZG8gZGUgc29icmVzLiBCdXNjYW1vcyBvYnRlbmVyIHVuYSBpZGVhIGRlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgJGFfayQsIHF1ZSBkZXBlbmRlcsOhIHNlZ3VyYW1lbnRlIGRlICRrJC4gUGFyYSAkayA9IDUkLCAkMTAkLCAkNTAkLCAkMTAwJCByZXBpdGEgZWwgZW5zYXlvIHVuYSBjYW50aWRhZCAkbiA9IDEwMCQgdmVjZXMgeSB2YXlhIGd1YXJkYW5kbyBsb3MgcmVzdWx0YWRvcyBkZSBsYSBlc3RpbWFjacOzbi4iCmBgYHtyfQprX3ZhbHVlcyA8LSBjKDUsIDEwLCA1MCwgMTAwKQpuIDwtIDEwMApyZXN1bHRhZG9zIDwtIGRhdGEuZnJhbWUoKQoKZm9yIChrIGluIGtfdmFsdWVzKSB7CiAgcmVzdWx0YWRvc19wYXJhX2VzdGVfayA8LSBjKCkKICBwcmludChzcHJpbnRmKCdDb3JyaWVuZG8gJXMgc2ltdWxhY2lvbmVzIGNvbiBrID0gJXMnLCBuLCBrKSkKICAKICBmb3IgKGkgaW4gMTpuKSB7CiAgICByZXN1bHRhZG9zX3BhcmFfZXN0ZV9rIDwtIGMocmVzdWx0YWRvc19wYXJhX2VzdGVfaywgY29ycmVyX2tfc2ltdWxhY2lvbmVzKGspKQogIH0KICAKICByZXN1bHRhZG9zIDwtCiAgICByZXN1bHRhZG9zICU+JQogICAgYmluZF9yb3dzKGRhdGEuZnJhbWUoayA9IGssIHZhbHVlcyA9IHJlc3VsdGFkb3NfcGFyYV9lc3RlX2spKQp9CmBgYAoKIjEuIEFybWUgdW5hIHRhYmxhIGNvbiBlc3RhZMSxzIFzdGljb3MgcmVzdW1lbiBwYXJhIGNhZGEgdmFsb3IgZGUgJGskIGNvbnNpZGVyYWRvLiIKYGBge3J9CnJlc3VsdGFkb3MgJT4lCiAgZ3JvdXBfYnkoaykgJT4lCiAgc3VtbWFyaXNlKAogICAgbiA9IG4oKSwKICAgIG1lYW4gPSBtZWFuKHZhbHVlcyksCiAgICBJUVIgPSBJUVIodmFsdWVzKSwKICAgIHNkID0gc2QodmFsdWVzKSwKICAgIAogICAgbWluID0gbWluKHZhbHVlcyksCiAgICBxMjUgPSBxdWFudGlsZSh2YWx1ZXMsIC4yNSksCiAgICBtZWRpYW4gPSBtZWRpYW4odmFsdWVzKSwKICAgIHE3NSA9IHF1YW50aWxlKHZhbHVlcywgLjc1KSwKICAgIG1heCA9IG1heCh2YWx1ZXMpLAoKICAgIG1hZCA9IG1hZCh2YWx1ZXMpCiAgKSAlPiUKICBtdXRhdGVfYWxsKHJvdW5kKQpgYGAKCiIyLiBBcm1lIGJveHBsb3RzIGVuIHBhcmFsZWxvIGRlIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcywgdW4gYm94cGxvdCBwYXJhIGNhZGEgdmFsb3IgZGUgJGskLiIKYGBge3J9CnJlc3VsdGFkb3MkayA8LSBhcy5mYWN0b3IocmVzdWx0YWRvcyRrKQoKcmVzdWx0YWRvcyAlPiUKICBnZ3Bsb3QoYWVzKHggPSBrLCB5ID0gdmFsdWVzKSkgKwogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICdNZW5vciBzcHJlYWQgYSBtYXlvciB2YWxvciBkZSBrJywKICAgIHggPSAnaycsCiAgICB5ID0gJ1NvYnJlcyBuZWNlc2FyaW9zIHBhcmEgbGxlbmFyIGVsIMOhbGJ1bScKICApICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoiMy4gQXJtZSBoaXN0b2dyYW1hcyBwYXJhIGNhZGEgdmFsb3IgZGUgJGskLiIKYGBge3J9CgpwbG90cyA8LSBsaXN0KCkKc2hhcmVkX3hsaW0gPC0gYyhtaW4ocmVzdWx0YWRvcyR2YWx1ZXMpICogMC45LAogICAgICAgICAgICAgICAgIG1heChyZXN1bHRhZG9zJHZhbHVlcykgKiAxLjEpCgpmb3IgKGtfdmFsdWUgaW4gdW5pcXVlKHJlc3VsdGFkb3MkaykpIHsKICBwIDwtCiAgICByZXN1bHRhZG9zICU+JQogICAgZmlsdGVyKGsgPT0ga192YWx1ZSkgJT4lCiAgICBnZ3Bsb3QoKSArCiAgICAgIGFlcyh4ID0gdmFsdWVzKSArCiAgICAgIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCkgKwogICAgICB4bGltKHNoYXJlZF94bGltKSArCiAgICAgIGdlb21fdmxpbmUoCiAgICAgICAgYWVzKHhpbnRlcmNlcHQgPSBtZWRpYW4odmFsdWVzKSksCiAgICAgICAgY29sb3VyPSJXaGl0ZSIsCiAgICAgICAgbGluZXR5cGUgPSAnZGFzaGVkJywKICAgICAgICBzaXplID0gMC4yNQogICAgICApICsKICAgICAgbGFicygKICAgICAgICB0aXRsZSA9IHNwcmludGYoJ2sgPSAlcycsIGtfdmFsdWUpLAogICAgICAgIHggPSAnTnJvLiBkZSBTb2JyZXMnCiAgICAgICkgKwogICAgICB0aGVtZV9taW5pbWFsKCkKICAgIAogIHBsb3RzW1tsZW5ndGgocGxvdHMpICsgMV1dIDwtIHAKfQoKcGxvdF9ncmlkKHBsb3RsaXN0ID0gcGxvdHMsIG5jb2wgPSAyLCBucm93ID0gMikKYGBg