Simulando cuántos sobres hacen falta para llenar el álbum del mundial

Por Ernesto Mislej (Socio Fundador de 7Puentes)

Se acerca el mundial de fútbol Rusia 2018 y acompañando a este vital evento para todos los fanáticos del deporte, nos sucede otro de importancia semejante al primero: llenar el álbum de figuritas con las imágenes de nuestros ídolos. Esta edición, el álbum será de 669 figuritas y los sobres serán de 5 figuritas cada uno. Si tuviésemos toda la suerte del mundo, con 134 sobres (lo que equivale a 669 dividido 5) lo llenaríamos, pero sabemos que para eso tenemos que tener mucha suerte.

Album de Figuritas Rusia 2018

Volviendo a nuestro álbum, ¿cuántos sobres son necesarios para llenarlo? Para averiguarlo tenemos 2 maneras, acudir a la teoría estadística -cosa que no nos asusta, pero implica tener bastante conocimiento previo- o hacer una simulación con un programa de computadoras. Vamos por la segunda.

Tomamos el caso de llenar el álbum para ejemplificar cómo encarar una situación problemática desde una perspectiva formal y poder medir eficazmente los insumos y demás recursos necesarios para tomar mejores decisiones. Compartimos esta nota con ejemplos y explicaciones sobre el proceso de diseño de una solución.

Esperamos la disfruten.

Comencemos la simulación

Una simulación -según Wikipedia- es un artificio contextual que referencia la investigación de una hipótesis o un conjunto de hipótesis de trabajo utilizando modelos para la enseñanza y el aprendizaje. En nuestro caso, la simulación tendrá como objetivo medir cuántos sobres (de 5 figuritas cada uno) se necesitan para llenar un álbum de 669. Y para ello necesitaremos construir un modelo computacional que contemplen los sobres, las figuritas y el álbum.

Python

Haremos un pequeño programa en Python, un lenguaje de programación muy popular que tiene una sintaxis muy simple de entender (para quienes necesiten una ayuda extra, pueden leer estos recursos introductorios preparados por la PyAr – Comunidad Python Argentina ).

In [1]:
print "Cuántos sobres se necesitan para llenar el album usando Python"
Cuántos sobres se necesitan para llenar el album usando Python

El azar y la computadora

La simulación consiste en realizar numerosas corridas de un sistema estocástico, es decir, una situación que está regulada por la aleatoriedad o la suerte, como nuestro caso de ir abriendo sobres de figuritas sin saber de ante mano cuales son las que te van a tocar. Necesitaremos entonces alguna forma que simular el contenido de los sobres de manera azarosa utilizando nuestro modelo computacional. Y eso es todo un tema, porque las computadoras no saben de azar: justamente, son aparatos guiados por el determinismo de los ceros y unos.

Pero no desesperemos, este tema ha sido tratado desde hace mucho tiempo y Python implementa un módulo de generación de números pseudo-aleatorios, que a los efectos de nuestra simulación nos alcanza de sobra.

In [2]:
import random

#la funcion randint(a, b) devuelve un numero entero pseudo-aleatorio N talque 
#a <= N <= b. 
dado = random.randint(1, 6)

print dado
2

Para modelar el sobre de figuritas utilizaremos la funcion sample(seq, k), que toma k elementos de la secuencia seq; en nuestro caso 5 números del intervalo [0, 660). La forma de extraer los números es sin reposición, es decir, los sobres estarán compuestos por figuritas no repetidas.

In [3]:
#para modelar el sobre utilizaremos la funcion sample. 
sobre = random.sample(xrange(669), 5)

print sobre
[586, 414, 255, 474, 12]

Otras librerías

Para esta simulación vamos a incluir otras 2 librerías muy utilizadas en análisis de datos:

  • NumPy para el manejo de estructuras de datos eficiente (listas o vectores).
  • Matplotlib para realizar las gráficas.
In [0]:
import numpy as np
import matplotlib.pyplot as plt

Seteamos las constantes de la simulación, en nuestro caso las FIGURITAS_POR_PAQUETE, las FIGURITAS_POR_ALBUM y la CANTIDAD_DE_CORRIDAS que tendrá nuestra simulación.

Cuántas más corridas hagamos, más preciso será nuestro resultado, pero también más costoso computacionalmente será. Unas 10000 corridas está OK, y la simulación tardará unos 5-10 minutos.

In [0]:
#las constantes de la simulacion
FIGURITAS_POR_PAQUETE = 5
FIGURITAS_POR_ALBUM = 669
CANTIDAD_DE_CORRIDAS = 1000

Iremos registrando cuántos sobres serán necesarios en cada corrida.

In [0]:
#inicializo el vector simulacion
#alli voy a ir registrando cuantos sobres necesito en cada corrida
simulacion = np.empty(CANTIDAD_DE_CORRIDAS)

Ciclo principal de la simulación

El siguiente bloque es el ciclo principal de la simulación. Cuántas más corridas hacemos, más preciso será nuestra estimación.

In [0]:
#voy a realizar tantas corridas como dice la constante CANTIDAD_DE_CORRIDAS
for i in xrange(CANTIDAD_DE_CORRIDAS):

	#modelo el album vacio como un vector lleno de ceros
	album = np.zeros(FIGURITAS_POR_ALBUM, dtype=int)

	#en esta variable contabilizare cuantos sobres se necesitan 
	cantidad_de_sobres = 0

	#voy abriendo sobres nuevos hasta llenar el album
	#si el vector contiene algun 0 en alguna posicion significa 
	#que aun no esta completo esa condicion la podemos expresar de muchas 
	#formas la que elegi es min(album) == 0, 
	#tambien podria ser len( album [ album == 0 ] ) > 0 
	while min(album) == 0:

		#un nuevo sobre formado por figuritas tomadas de manera aleatoria
		sobre = random.sample(xrange(FIGURITAS_POR_ALBUM), FIGURITAS_POR_PAQUETE)

		#voy llenando el album
		#sumo 1 en cada posicion correspondiente a cada una de las figuritas 
    #del sobre
    #
    #Nota: para quienes conocen otros lenguajes de programacion, esta 
    #operacion puede llegar a causar confusion. La libreria NumPy permite
    #realizar operaciones sobre multiples indices a la vez. 
    #Aprovechenla, es muy util.
		album[sobre] += 1

		#incremento la cantidad de sobres en 1
		cantidad_de_sobres += 1

	#para llenar este album he necesitado tantos sobres como 
  #lo dice cantidad_de_sobres
	simulacion[i] = cantidad_de_sobres

Presentación visual de los resultados

Luego de finalizar las corridas, tenemos muchos resultados. Presentaremos la información de una manera visual utilizando un histograma.

In [8]:
#cuantos sobres necesitamos en promedio para llenar el album
sobres_promedio = simulacion.mean()

#visualizamos la simulacion con un histograma de las corridas
plt.hist(simulacion, bins=50)
plt.axvline(sobres_promedio, color='r')
plt.legend(["%.2f sobres" % sobres_promedio])
plt.title("Cantidad de sobres en promedio para llenar 1 album")
plt.show()

Llenar el álbum costará…

Por su condición de experimentos aleatorios, las simulaciones darán resultados levemente distintos, pero sí podemos ver que para llenar el álbum se necesitarán aproximadamente 941 sobres. A $15 por sobre, llenar el álbum de esta manera costará… ¡un ojo de la cara!

In [9]:
print "Llenar el album costará... %2.f pesos. Y qué hago con las %d repetidas!" % (sobres_promedio * 15, sobres_promedio * FIGURITAS_POR_PAQUETE - FIGURITAS_POR_ALBUM)
Llenar el album costará... 14085 pesos. Y qué hago con las 4026 repetidas!

…más el costo de álbum en sí, que ya a esta altura parecen monedas.

Con amigos todo es mejor

Como vimos, para llenar un álbum de 669 figuritas necesitaremos aproximadamente 341 sobres y nos sobrarán 4000 figuritas repetidas. Con tantas repetidas estamos muy cerca de llenar un 2º y 3º álbum; y las que nos sobran las podemos cambiar con algún otro amigo que las necesite. Sin duda si nos juntamos con otros amigos, llenar todos los álbumes es mucho más rápido, barato y divertido.

Cuánto costará llenar n álbumes

Démosle una vuelta al problema y pensemos cuántos sobres son necesarios para llenar n álbumes.

Agreguemos la constante CANTIDAD_DE_ALBUMES

In [0]:
#pensemos un grupo de 20 amigos que se juntan para llenar cada uno su album
CANTIDAD_DE_ALBUMES = 20

El vector simulación ahora registrará cuántos sobres se necesitan para llenar 1, 2, 3, … , 20 álbums. Ésto lo haremos con un vector de 2 dimensiones (cuando el vector tiene 2 dimensiones suele llamarse matriz, aunque cuando tiene 3 dimensiones o más, vuelve a llamarse vector, cosas que pasan…).

In [0]:
#inicializo el vector simulacion_grupo con 2 dimensiones 
simulacion_grupo = np.zeros([CANTIDAD_DE_ALBUMES+1, 
                             CANTIDAD_DE_CORRIDAS], dtype=int)

Ciclo principal de la simulación de grupo

Con algunas pocos agregados podemos calcular cuántos sobres se necesitan para llenar n álbums

In [0]:
#voy a realizar muchas corridas, tantas como dice la constante CANTIDAD_DE_CORRIDAS
for i in xrange(CANTIDAD_DE_CORRIDAS):

  #modelo el album vacio como un vector lleno de ceros
  album = np.zeros(FIGURITAS_POR_ALBUM, dtype=int)

  #en esta variable contabilizare cuantos sobres se necesitan para llenar 1..n albumes
  cantidad_de_sobres = 0

  #aqui voy a contabilizar cuando albumes estan llenos
  albumes_llenos = 0

  #a diferencia de la simulacion anterior, la condicion de corte sera cuando se 
  #llenen los n albumes. Eso lo podemos expresar asi:
	#albumes_llenos < CANTIDAD_DE_ALBUMES
  while albumes_llenos < CANTIDAD_DE_ALBUMES:

    #un nuevo sobre formado por figuritas tomadas de manera aleatoria
    sobre = random.sample(xrange(FIGURITAS_POR_ALBUM), FIGURITAS_POR_PAQUETE)

    #voy llenando los albumes
    album[sobre] += 1

    #incremento la cantidad de sobres en 1
    cantidad_de_sobres += 1    

    #si el min(album) se incremento, significa que se ha llenado un nuevo album. 
    if albumes_llenos < min(album):      
      #hemos llenado un album nuevo
      albumes_llenos = min(album)

      #registramos la cantidad de sobres
      simulacion_grupo[albumes_llenos, i] = cantidad_de_sobres

Presentación visual de la simulación de grupos de amigos

Ya recopilamos los resultados de muchas corridas, veamos qué tal nos fue para llenar n álbums.

In [13]:
#cuantos sobres necesitamos en promedio para llenar n-albumes
#usamos una matriz de histogramas

amigos = [2, 5, 10, 20]

fig, axes = plt.subplots(nrows=2, ncols=2, sharey=True, sharex=True)

for ax, q in zip(axes.flat, amigos):
  simulacion = simulacion_grupo[q]/q
  sobres_promedio = simulacion.mean()
  ax.set_title('$albumes=%d $' % (q))
  ax.hist(simulacion, bins=50)
  ax.axvline(sobres_promedio, color='r')
  ax.legend(["%.2f sobres" % sobres_promedio])

fig.suptitle("Cantidad de sobres en promedio para llenar $n$ albumes")
plt.show()

Algo que suponíamos: cuántos más amigos tenemos, la cantidad de sobres por integrante del grupo para llenar su álbum disminuye. Y se acerca a la cantidad óptima de (FIGURITAS_POR_ALBUM / FIGURITAS_POR_PAQUETE). No hace falta tener mucha suerte, sino muchos amigos. (Aunque tener muchos amigos es ser muy afortunado).

In [14]:
#Otra forma de visualizar la cantidad promedio de sobres para llenar n-albumes

plt.boxplot([simulacion_grupo[i]/i for i in xrange(1,CANTIDAD_DE_ALBUMES+1)])
plt.title("Cantidad de sobres para llenar $n$ albumes")
plt.show()

Conclusiones

Como pudimos ver, para llenar un álbum necesitaremos aproximadamente 941 sobres; pero para llenar 20 álbumes, se necesitan un poco más de 4940 sobres, lo que nos da 247 sobres por integrante. Muchísimo menos.

In [16]:
print "Llenar %d albumes costara... %2.f pesos por integrante. Que bueno es tener amigos!" % (CANTIDAD_DE_ALBUMES, (simulacion_grupo[CANTIDAD_DE_ALBUMES]/CANTIDAD_DE_ALBUMES).mean() * 15)
Llenar 20 albumes costara... 3704 pesos por integrante. Que bueno es tener amigos!

Gracias por la atención y ¡vamos Argentina!

Mujeres en ciencias de datos (WiDS) 2018: un evento de la Universidad de Stanford con capítulo local en la FIUBA

El próximo lunes 5 de marzo tendrá lugar en la universidad de Stanford, y en más de cien capítulos locales vía livestream, la conferencia global Women in Data Science (WiDS). La jornada está destinada a compartir experiencias y conocimientos de mujeres en este campo, con el objeto de inspirar a otras, pero orientado a un público amplio interesado en estas temáticas, es decir, sin distinción de género.

Los “embajadores” de WIDS en todo el mundo coordinan lo capítulos locales en diferentes países para que lo que suceda ese día en Stanford, no quede solamente allí. El capítulo en Buenos Aires está organizado por miembros de la Facultad de Ingeniería de la Universidad de Buenos Aires (FiUba) y el equipo de periodismo de Datos en LA NACION (LNData) y consta de oradoras locales durante la mañana , y streaming en vivo desde Stanford con el agregado de traducción simultánea, durante la tarde.

Todo tendrá lugar en la Facultad de Ingeniería , Av. Paseo Colón 850, el lunes 5 de marzo desde las 9hs. La participación es gratuita pero con cupo limitado y requiere inscripción previa en www.widsbuenosaires.org.

El origen de WIDS

Stanford WIDS surgió de una iniciativa de Margot Gerritsen, directora del Instituto de Ingeniería Computacional y Matemática (ICME) en la Universidad de Stanford quien tiene un PHD en Matemática Computacional y es experta en matemática aplicada a la producción de energía y análisis de fluidos.

“He estado en este campo de ingeniería en computación por más de 35 años y en general fui la única mujer. Esto no me incomoda, me divierto bastante, pero reconozco que a veces puede ser difícil”, confiesa Margot y agrega “por esto decidimos hacer una conferencia donde seamos todas mujeres y que ellas sean excelentes data scientists e ingenieras que inspiren a las generaciones más jóvenes para introducirse y mantenerse en el campo del data science, tanto en ingeniería en computación, en las ciencias de la computación o en estadística y matemática”

El apoyo local

Los ingenieros Ricardo Veiga , secretario de Posgrado de Fiuba, y Jonás Pfefferman, docente del departamento de electrónica , realizaron el primer WIDS Buenos Aires en febrero del año pasado y explican los motivos por los cuales consideran valioso al evento: 

“En la Facultad de Ingeniería de la Universidad de Buenos Aires venimos enseñando los temas de Data Science desde hace muchos años. Por ejemplo, tenemos un curso de Redes Neuronales desde 1990. Actualmente ofrecemos una maestría conjunta con la Facultad de Ciencias Exactas en Minería de Datos y Descubrimiento de Conocimiento. Y en junio estamos trayendo un especialista de Harvard para que de un curso intensivo específico de Data Science.” explica Viega, y agrega “por otra parte, en estos últimos tiempos le hemos dado un fuerte impulso para que más mujeres se incorporen a este apasionante mundo”.

“Con los volúmenes de información que actualmente se disponen en todos los ámbitos y la necesidad de utilizarlos para aprender, decidir y actuar, Data Science dejó los laboratorios para pasar a formar parte importante en nuestro día a día. En FIUBA, como  formadores de ingenieros, investigadores y científicos, vemos en WIDS la posibilidad de dar conocer el enorme aporte de las mujeres en éste área y, en WIDS Bs. As. la oportunidad invaluable de articular el talento de las mujeres locales con la industria para potenciar la innovación Argentina.” explica Pfefferman.

A estos voluntarios se suma el apoyo de LA NACION y su equipo de periodismo de datos con varias voluntarias, entre ellas Gabriela Bouret quien agrega “estamos convencidas de que las ciencias de datos son una gran herramienta también para el periodismo, es decir para descubrir y contar historias en un mundo donde los datos abiertos, los no estructurados o las grandes bases de datos ofrecen nuevos desafíos y oportunidades para resolver problemas de alto impacto. El aporte de la mujer en este ámbito es fundamental ya que las voces tienen que ser mas diversas al nivel de análisis y toma de decisiones, y especialmente en lo que hace a ciencias de datos donde estas soluciones pueden aplicarse a cualquier disciplina que genere cambios en la sociedad”.

La agenda

Participan del capítulo local mujeres que promueven, protagonizan e impulsan hace tiempo la aplicación de la Ciencia de Datos en diferentes ámbitos, industrias, soluciones de tecnología y servicios en Argentina.

Además de todo lo relacionado a inteligencia artificial, machine learning e inteligencia computacional; se abordarán temáticas de ciencias de datos aplicables a: marketing, negocios, periodismo y casos de políticas públicas.

Durante la tarde y hasta las 18hs se compartirá el streaming de las charlas de Stanford con protagonistas a nivel global, las cuales contarán con traducción simultánea. Algunas oradoras pertenecen al equipo de profesores de universidades como Stanford, Harvard, Texas y Washington. Otras provienen del data science aplicado a tecnología para desarrollo de inteligencia artificial o diferentes industrias, como: Facebook, Google, Microsoft, SAP, Airbnb y Uber. Debido a la diferencia horaria, el evento local cubrirá la mitad de las sesiones pero la jornada completa se podrá continuar viendo por streaming.

WIDS Buenos Aires cuenta con el apoyo del Ministerio de Modernización de la Nación, Banco Ciudad, BID INTAL, IBM, Banco Mundial, Accenture, Gobierno de la Ciudad de Buenos Aires, Microsoft, Google, SAP y Certant.

Links:

Para registrarse y conocer la agenda Local (incluye traducción simultánea de la mitad de la jornada en Stanford): https://www.widsbuenosaires.org/

Agenda completa de WIDS Stanford: http://www.widsconference.org/2018-schedule.html

Sin comentarios

#HHBA Entrevista a Greg Barber, Newsroom Product Director del Washington Post

Es la sexta edición del Media Party organizado por Hack Hackers Buenos Aires en el Centro Cultural Konex. Acaban de terminar las conferencias y en minutos empiezan los workshops. Es el momento para nuestra entrevista, en una esquina alejada del bullicio de las conversaciones que los encuentros, las mesas de ping pong y los foodtracks generan entre periodistas y programadores.

Greg Barber es nuestro entrevistado. Dirige el equipo de Producto Digital en el Washignton Post, creando templates y herramientas digitales para contar historias. También es co-fundador de The Coral Project, un software que permite la participación colaborativa entre los diarios y sus lectores. Y la mejor parte es que es open source, es decir gratis y accesible a cualquiera.

¿Cuál es tu rol dentro del Washington Post?

Soy el director del área de producto, es decir, coordino los productos que el diario utiliza para contar historias. Trabajo en el Washington Post hace 14 años, y con productos digitales hace 7.

 ¿Cuál es tu profesión?

Llevo 20 años siendo periodista. Trabajo con escritories, fotógrafos, diseñadores e ingenieros. Trabajamos todos juntos para crear productos en el Post. ¡Y con lectores también! Para asegurarnos que construimos el tipo de noticias que ellos necesitan.

 ¿Tienen alguna plataforma colaborativa?

Acabamos de lanzar nuestra plataforma de comentarios. Es un producto llamado The Coral Project. Es una colaboración entre Washington Post, The New York Times y Mozilla. Nuestro objetivo es construir software abierto, gratuito para todos, para que los medios de comunicación mejoren su contacto con los lectores. El trabajo ya está terminado, aunque para los ingenieros nunca nada está terminado; pero creo que la mayor parte ya está completada.

Ya estamos probándolo en el Washington Post y hemos estado conversando con nuestros lectores por un par de años, mientras construíamos esto. Para asegurarnos que sus necesidades estuvieran cubiertas.

 ¿Trabajan con noticias automatizadas?

Acabamos de lanzar este producto esta misma semana. Utiliza diferentes tecnologías permitiendo crear templates básicos de “cartillas” de futbol americano. El proceso comienza con un compilador tecnológico que escribirá historias basadas en datos y luego las presentará en plantillas creadas previamente por nosotros. Nos permite crear notas a escala que no seríamos capaces de escribir debido a los pocos recursos. Para nuestros lectores significa la oportunidad de profundizar en un jugador de fútbol particular y ver cómo han sido sus temporadas hasta ahora, pueden hacerlo y pueden leerlo de una manera narrativa y no tienen que leer los datos por sí mismos.

¿Qué piensan los periodistas tradicionales sobre esta nueva herramienta?

Desde mi perspectiva lo veo como el camino para que podamos escribir ese tipo de historias que no seríamos capaces de escribir de cualquier manera. El tipo de trabajo que los periodistas deben hacer es contar historias que impliquen más investigación, descripción, entrevistas. Los periodistas deben hacer lo que todos esperamos de ellos, interpretar historias y contarlas. De esta manera, con periodistas y bots, potenciamos nuestras producciones.

¿Cuál es tu opinión sobre el futuro del periodismo?

El futuro del periodismo se parece mucho al presente del periodismo, donde diferentes lectores quieren diferentes cosas y diferentes tipos de presentaciones para el contenido que están leyendo. Y como organizaciones de noticias lo mejor que podemos hacer es averiguar qué es lo que hacemos bien y enfocar nuestros recursos en hacerlo bien. Así que si quieres que tu publicación cubra la política nacional realmente bien, debes concentrar los recursos en eso, contar esas historias de la manera que son convincentes, asegurarte de que estás analizando lo que quiere la audiencia y de seguir innovando para que la competencia no se levante y te gane. Eso es lo que el periodismo era cuando empecé hace 20 años. Y supongo que va a ser muy similar en 20 años.

¿Qué tiene el Washington Post que no tienen los demás diarios?

Lo que tenemos en el Washington Post y que ha sido muy bueno para nosotros es el deseo de probar cosas nuevas. Tenemos el deseo de innovar. Y tenemos el liderazgo que nos empuja a esa dirección, dándonos el espacio para poder probar, a veces con excelentes resultados, otras con errores. Pero siempre nos preocupamos por lo que hemos hecho para mejorar la próxima vez.

Sin comentarios