Si tuvieras la oportunidad de abrir todos los sobres para llenar el álbum de la Copa Mundial de la FIFA 2022, ¿cuántos necesitarías? Para descubrirlo vamos a hacer una simulación computacional en la que recrearemos cada sobre con 5 stickers y los pegaremos en el álbum hasta llenarlo. Lo haremos muchas veces hasta llegar a varias conclusiones.
He preparado un repositorio en GitHub con el código de este proyecto para que puedas clonarlo, e incluso mejorarlo.
Para seguir te recomiendo tener las bases de conocimiento en Python y estadística. Puedes tomar los siguientes cursos:
Lo primero que necesitamos es definir las variables que ingresarán a nuestro modelo matemático. En nuestro caso, según las especificaciones de Panini (el fabricante del álbum oficial del Mundial Qatar 2022), encontramos que:
Puedes encontrar esta información sobre los stickers o datos sobre el álbum.
Ya conocemos las variables que utilizaremos y es hora de crear el modelo. Primero te explicaré el proceso paso a paso y luego escribiremos el código en Python. Consideremos lo siguiente:
Ahora lo que vamos a hacer es:
Este procedimiento lo podemos repetir una y otra vez. Te recomiendo hacerlo mínimo 1000 veces. El código se vería así:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
simul = 1000
amount = []
for i in range(1, simul+1):
stickers = (list(np.arange(1, 639)))
iterations = 0while len(stickers) >0:
val_to_remove = np.random.randint(1, 639, size=5)
for val in val_to_remove:
if val in stickers:
stickers.remove(val)
iterations += 1
amount.append(iterations)
Como observas, tenemos la variable amount
que inicialmente fue declarada como un array vacío. Ahora iremos almacenando el número de iteraciones (stickers abiertos) necesarios hasta llenar el álbum. Como hicimos 1000 simulaciones, tenemos que graficar la distribución así:
fig, ax = plt.subplots(figsize=(12, 7))
plt.hist(amount, bins=30)
plt.title('Simulation of opening 1000 packages', size=16)
plt.xlabel('Packages')
plt.ylabel('Count')
plt.show()
Ya tenemos una idea más clara de cuántos sobres tenemos que abrir, pero exploremos este proceso con más profundidad. Para ello vamos a convertir nuestro array amount
en un data frame y obtendremos sus estadísticos descriptivos a partir de él.
amount_df = pd.DataFrame(amount)
print(amount_df.describe())
Esto nos da como resultado:
count 1000.000000
mean 902.181000
std 163.262828
min 572.000000
25% 792.000000
50% 873.000000
75% 984.250000
max 1693.000000
También podemos obtener un intervalo de confianza. Generalmente, se usa el 95%.
ci_2_5, ci_97_5 = np.percentile(amount, [2.5, 97.5])
print(f'CI 95%: {ci_2_5}, {ci_97_5}')
Y así obtenemos:
CI 95%: 659.975, 1307.2999999999997
Dado que estamos involucrando aleatoriedad, hablamos de un proceso estocástico. No podemos decir exactamente un número X de paquetes a abrir. Por lo tanto, conviene mejor hablar de un rango de valores.
Con base en los resultados obtenidos, podemos decir que:
Todo esto lo podemos visualizar mejor en una curva de probabilidad acumulada. Para hacerlo tenemos que crear una función.
defecdf(data):"""Compute ECDF for a one-dimensional array of measurements."""# Number of data points: n
n = len(data)
# x-data for the ECDF: x
x = np.sort(data)
# y-data for the ECDF: y
y = np.arange(1, n+1) / n
return x, y
Ahora calculamos y graficamos:
x_norm, y_norm = ecdf(amount)
#Plot
fig, ax = plt.subplots(figsize=(12, 7))
plt.plot(x_norm, y_norm)
plt.title('ECDF of 1000 opened packages', size=16)
plt.xlabel('Opened packages')
plt.ylabel('Cumulative probability')
plt.show()
Con esta curva podemos visualizar mejor las probabilidades de llenar el álbum con X cantidad de paquetes. Por ejemplo, al abrir el paquete 1108, ya tendremos una probabilidad del 90%.
El enfoque que le hemos dado aquí es abrir tantos paquetes como podamos hasta completar el álbum del Mundial Qatar 2022. Pero normalmente, como coleccionistas, solemos intercambiar figuritas y/o comprarlas de forma individual, aunque esto resulte más costoso.
Ahora me gustaría preguntarte, ¿cuál crees que sería la forma óptima de completar el álbum? ¿Existe un punto en el que conviene dejar de comprar paquetes e ir a comprar las figuritas de forma individual? ¿Cómo modelarías este proceso? Te leo en los comentarios.
Me gustó mucho el blog, creo que sería importante tener en cuenta, ya que no lo he encontrado, que panini pueda producir unos stickers más que otros, osea que algunos sean más escasos
Justo eso pensaba, la posibilidad de que Panini, mañosamente baje la probabilidad de algunos jugadores. 😏😅
Por supuesto, Axl, tú hiciste lo correcto. Buen post, saludos. 😃
Uhh! Super genial este post
⚽🥅🏆
Excelente trabajo, tratare de replicarlo!!
¡Genial, Javier! 😄
Para complementar el post, una buena pregunta es ¿cuanto vale entonces segun los datos llenar el album complento?,
los precios los voy a sacar en pesos colombianos y al final el total en dolares
Para esto solo necesitamos dos variables precio album precio sobre
el album por si solo tiene un costo de 20.000 cop y este valor va ser fijo
ahora bien, estamos diciendo que el rango promedio es de 660 a 1307 sobres por lo cual sacaremos un promedio del rango (660+1307)/2 = 986 aprox, en colombia un sobre individual puede cosatar 700cop por lo cual 986 x 700 = 690.200
En un aproximado del 95% las personas gasta casi unos 710.000 COP lo que equivale a 163 dolares(con la trm del dia que hize el calculo. puede vairar) para llenar el album
claramente este valor no es exacto puede depender de la suerte y trueques con los stickers.
ya saben muchachos de 660 a 1307 sobres para llenarlo con un promedio de 163 dolares
impresionanti 😳
⚽⚽🏆