Jugá mejor al truco usando ciencia de datos

La tradición argentina con más vigencia (después del mate y la inflación), es el truco, un juego que utiliza la baraja española y que combina apuestas, complicidad, mentiras y algo de suerte.

Para explicar un poco de que se trata esto: como en todo juego de cartas, la mano que te toca puede ser mejor o peor, pero a partir de eso tenes que tomar las decisiones correctas y, para eso, lo mejor es saber que tan buena es tu mano, pero como ya sabemos el truco claramente lo invento un gaucho después de un empacho de sopaipillas y una sobredosis de chamame, por lo que las reglas son bastante complejas y raras, y es difícil entender que tan buena es tu mano.




Hace un tiempo encontramos una publicación de Emiliano Gomez en Revista de Educación Matemática de la Universidad nacional de Córdoba, que con fórmulas analíticas, se analizan las probabilidades de cada mano, por lo tanto, te da una idea concreta, es por eso que nos preguntamos como podría ser hacer ese análisis por medio de ciencia de datos. En otras palabras, ignoramos las fórmulas analíticas que muestran el comportamiento preciso del fenómeno que tanto se esforzaron en hacer, para hacer algo más simple que no da precisión matemática. Después nos preguntamos por que los matemáticos odian a los ingenieros...



Si solo te importan los resultados finales, hicimos unos afiches que podes usar cuando vayas a jugar. Los puedes encontrar al final de la publicación, bueno, no al final, un poco antes, al final pusimos una sorpresa.


Método

Si no conoces las reglas del truco podes pasarte por este enlace haciendo click aquí, sino, no te preocupes explicaremos todo lo que se necesita saber para poder seguirnos.

Lo primero es que el truco consiste de varias rondas, en cada una se reparten 3 cartas a cada jugador, por lo que nuestro método será simular la repartición de cartas de cada jugador en cada una de las rondas y poder sacar conclusiones.

¿Qué tipo de conclusiones vamos a sacar? Bueno tendremos que hacer los siguientes análisis.

  • Probabilidad de que alguno de los 4 fuertes esté en juego (Macho, Hembra, 7 de espada y de oro).

  • Probabilidad de ganar un envido (teniendo puntos)

  • Con cuantos puntos conviene cantar envido si se busca "robar" puntos.

La simulación

A partir de acá empezaremos a mostrar el código para que puedas repetirlo en python, de todas formas podes ignorarlo y vas a entender igual, y si te interesa, dejamos al final el link al código completo.

Para poder repartir cartas, lo primero que haremos será crear un diccionario de cartas que por medio de un id y luego, te asigne numero y palo.

  # Primero vamos a crear un diccionario para tener id de cartas y que carta es
palos = ['Espada','Basto','Oro','Copa']
numeros = [1,2,3,4,5,6,7,10,11,12]

dic_Cartas={}
i = 1
for palo in palos:
  for numero in numeros:
    dic_Cartas[i] = [numero,palo]
    i += 1

print(dic_Cartas)
 
Luego generamos 2 bases de datos, una con las cartas y otra solamente con los id's. Esta parte del código es un poco extensa así que la dejamos en nuestro colab.
Una observación, el truco se puede jugar de a 2, 4 o 6 participantes, por lo que repartiremos para 6 y luego usaremos solo los datos de los jugadores que analizaremos.

Probabilidad de que estén presente alguno de los 4 fuertes

Para poder tomar una buena decisión de cantar o no cantar truco, es de ayuda saber que tan esperable es que de entrada haya alguna de las cartas fuertes en la ronda.

Matemáticamente se puede hacer de varias formas, la mas sencilla es buscar la probabilidad de que no toque ninguna de esas cartas y restarla al 100%.
Se puede hacer multiplicando la cantidad de cartas que quedan en el mazo menos 4, sobre la cantidad de cartas que quedan en el mazo cada vez que se reparte una carta, y al resultado, restarlo a 1, algo asi:


También se puede utilizar una fórmula de una serie llamada "Hipergeometrica", o utilizar conjuntos como se hace en el articulo de referencia, pero como no somos matemáticos, nosotros simplemente vemos cuántas veces salio alguna en nuestra simulación, así:

  import numpy as np

Cartas_Buscadas = [1, 2, 3, 4]
# Que chance hay de que toque en la ronda alguna carta en especial

## Hacemos las variables de las columnas en las que buscamos
Df_Id_1j = Df_Id[['NA1','NA2','NA3']]
Df_Id_2j = Df_Id[['NA1','NA2','NA3','EA1','EA2','EA3']]
Df_Id_4j = Df_Id[['NA1','NA2','NA3','NB1','NB2','NB3','EA1','EA2','EA3','EB1','EB2','EB3']]
Df_Id_6j = Df_Id[['NA1','NA2','NA3','NB1','NB2','NB3','NC1','NC2','NC3','EA1','EA2','EA3','EB1','EB2','EB3','EC1','EC2','EC3']]

def Probabilidad_Carta_especifica(cartas_a_buscar,grupo=Df_Id_4j):
  mascara = grupo.isin(cartas_a_buscar).any(axis=1)
  cantidad = mascara.sum()
  Chance = cantidad/Df_Id.shape[0]*100

  return(Chance)

Probabilidad de ganar un envido

Sí en una mano, te tocan 2 cartas del mismo palo, sumando los valores de esas cartas más otros 20, te da los puntos que tenes de envido, los cuales podes "apostarle" al otro equipo que son mayores que los suyos.

Como en el envido, el 10, 11 y 12 valen 0, hacemos la siguiente función:

# Definimos una función para calcular el valor de envido para cada carta
def valor_carta(carta):
    if carta[0] in [10, 11, 12]:
        return 0
    else:
        return int(carta[0])
  
Luego, calculamos el envido. Para eso iteraremos por cada palo y veremos cuantas veces sale una carta de ese palo.

def envido2(row,columna=0):
    sumas = []

    # Iremos uno por uno en cada palo (espada, basto,copa y oro)
    for palo in palos: 
        # Valores iniciales
        suma = 0        
        iguales = 0     
        for i in range(columna,columna+2):
            carta = row[i]
            if carta[1]==palo:
                iguales += 1
                suma = suma + valor_carta(carta)

        # En caso de tener 2 cartas iguales, sumara 20 puntos
        if iguales == 2 :
            suma = suma + 20

        # En caso de tener flor, no nos importa calculamos el envido por que somos mendocinos de pura cepa y no jugamos con flor:
        if iguales == 3 :
          suma = envido_con_3(row[1],row[2],row[3])
                  
        sumas.append(suma)

    return(max(sumas))


En este blog somos mendocinos, y como buenos Menducos jugamos al truco sin flor (y también odiamos que se le diga pica-pica al punta y hacha). Por lo tanto, para calcular el envido cuando tenemos las 3 cartas del mismo palo, lo que hacemos es buscar las 2 cartas que sumen más puntos.
def envido_con_3(carta_1,carta_2,carta_3):
  a = valor_carta(carta_1[1])
  b = valor_carta(carta_2[1])
  c = valor_carta(carta_3[1])
  puntos = []

  puntos.append(a+b+20)
  puntos.append(a+c+20)
  puntos.append(b+c+20)
  
  return(max(puntos))
 

En nuestra simulación, haremos una columna para el envido ganador de la mano, para cada grupo de jugadores (2, 4 y 6 jugadores).

Es bastante común, que teniendo pocos o ningún punto de envido, uno cante primera (apostar que tiene mas puntos de envido) solo por que sabe que el otro se podría asustar y no va a querer. Cuando a uno le hacen esta jugada, muchas veces tiene pocos puntos de envido y no sabe si le conviene o no jugársela, por lo que puede tomar una decisión equivocada. Para los lectores de noaidata, hoy eso se acaba, por que vamos a saber que tan buena son las manos.

Lo que vamos a resolver es, ver los envidos ganadores y ordenarlos:
Aquí nos llevamos una sorpresa, vemos que el puntaje de envido que gana la mayor cantidad de veces es el 7. Si ahora hacemos un gráfico con los resultados acumulados...




Analicemos el gráfico un poco. Lo primero que vemos es que, existe un escalón desde el 7 hasta el 19, lo cual es lógico, por que no se puede tener envido mayor a 7 y menor que 20. Segundo, Francia. Tercero, mientras más jugadores hay en la partida, mas "chato" es el gráfico, también es lógico, ya que eso hace que hayan mas chances de que alguno tenga un envido bueno.

Si lo analizamos matemáticamente, vemos que para 4 jugadores, más de un tercio de las veces será el mayor envido, por lo que si sospechamos que el otro equipo no tiene y, nosotros tenemos un 7, no es alocado cantar. Para 2 jugadores, esa chance es casi del 60%, por lo que es un buen envido. Para 6 ya no, por que apenas supera el 20%.

Conclusiones

Te dejamos 3 posters para que puedas ver las chances y puedas guardarlo y consultarlas cada vez que vayas a timbear.



Esperamos que la próxima vez que jueguen al truco, sus preocupaciones sean que los otros no se anoten puntos de más.

Link's de interés

Ya que hablamos de las posibilidades de los juegos con cartas de truco, no podíamos dejar pasar una historia de la selección.

Los jugadores de la selección argentina, en la copa américa de Brasil, antes de la final jugaron a un pequeño juego, mezclaron las cartas y una por una intentaban adivinar cúal era la siguiente carta. El juego consistía en que si la carta la adivinaban entre las primeras 10, significaba que, iban a ser campeones (Spoiler si fueron <3).

Por lo que cuentan los jugadores en un documental, todos acertaron pero… ¿que tan posible era eso?

Las posibilidades de adivinar una carta en alguno de los primeros 10 intentos es lo mismo que 100% menos la probabilidad de no acertar.

Para encontrar la probabilidad de no acertar una carta, es:

Teniendo en cuenta que la baraja de truco tiene 40 naipes, y vamos hacer el intento 10 veces, (y no nombramos las cartas que ya salieron) nos queda:


Observen que en cada intento se sacan cartas, por lo que numerador y denominador va bajando.

Como podemos ver, muchos números arriba y abajo se repiten, por lo que se puede simplificar a:



Lo que nos dice que:





Las probabilidades de que uno acierte es de 1/4 , pero para saber las probabilidades de que acierten varios hay que multiplicar las posibilidades de cada uno, por lo tanto para n jugadores, es:


Por lo que conocemos, los que jugaron fueron:

  • Leo Messi
  • Leandro Paredes
  • Papu Gomez
  • Rodri De Paul
  • Nico Otamendi
  • Angelito Di María
  • Gio Lo Celso
  • Sergio Agüero

Son 8 jugadores, como todos acertaron, nos indica una probabilidad de:


Esto es aproximadamente una (1) en 65000.

Las probabilidades son prácticamente cero y aun así se dieron todas las condiciones, lo que demuestra que nuestros jugadores no saben de estadística... pero si de magia.














¿Necesitas ayuda?
Podes hacer preguntas aca abajo en los comentarios o en nuestros perfiles de linkedin que puedes encontrar en este link. Si estas buscando ayuda en proyectos grandes, nos podes contratar por medio de nuestra consultora haciendo click en este link . Hacemos ingenieria electromecanica, civil, desarrollo de software y varias cosas mas.

Comentarios

Entradas populares de este blog

¿Se pueden escribir algoritmos que evolucionen por si mismos? (Algoritmos genéticos/evolutivos)

Quisimos hacer un test de Alfajores, y terminamos aplicando matematicas avanzadas