Ir al contenido principal

Probabilidad y estadística del póker con Python

Aborda probabilidad y estadística en Python: aprende sobre combinaciones y permutaciones, sucesos dependientes e independientes, y valor esperado.
Actualizado 17 sept 2026  · 15 min leer

Explorar con IA

ChatGPTClaudePerplexity

Los data scientists crean modelos de machine learning para hacer predicciones y optimizar decisiones. En el póker online, las opciones son apostar, igualar o retirarse. No se permite usar software para tomar esas decisiones. Ahí es donde la mayoría de salas online marcan el límite. Como no puedes entrenar un modelo de machine learning, tienes que entrenar tu cerebro. Esto implica hacer sin parar cálculos de equity fuera de la mesa, que utilizan muchos conceptos de probabilidad y estadística.

En este tutorial, aprenderás algunos de estos conceptos usando una baraja de cartas y situaciones genéricas de póker.

Poker Card Banner

Si te interesa meterte de lleno en estadística con Python, echa un vistazo al curso de DataCamp Statistical Thinking in Python.

Motivación personal

Durante varios años me gané la vida jugando al póker online de forma profesional. Data science fue una evolución natural para mí, ya que requiere habilidades muy parecidas a las de ganar dinero con el póker online. Escribí un blog sobre lo que tienen en común el data science y el póker, y comenté que cada vez que se juega una mano en una sala online se genera un historial de mano. Estos historiales describen todo lo que hace cada jugador durante la mano. Usé un software llamado Hold’em Manager (imagina Tableau para póker) para aprovechar estos datos. Hold'em Manager descarga en tiempo real cada uno de estos historiales a una base de datos PostgreSQL para que puedas seguir las tendencias de tus rivales.

Teoría de la probabilidad: una introducción

Antes de ponerte manos a la obra, conviene repasar qué es la teoría de la probabilidad y por qué es importante cuando empiezas en data science. Además, verás algunos conceptos clave útiles a lo largo del tutorial y aprenderás a calcular la probabilidad de sucesos simples.

En situaciones cotidianas a menudo te preguntas cuáles son las probabilidades de que ocurra algo: ganar la lotería, que tu equipo de fútbol gane o conseguir un descuento en tus zapatillas favoritas. "¿Qué probabilidades hay de…?" es una expresión que seguramente usas a menudo. Determinar esas probabilidades es la "probabilidad".

Este tipo de probabilidad difiere del enfoque matemático de la probabilidad, que estudia la teoría de la probabilidad, una rama de las matemáticas. En matemáticas existen dos grandes interpretaciones de la "probabilidad": la "física" y la "evidencial".

Las primeras también se llaman objetivas o frecuentistas y se asocian a sistemas físicos aleatorios como lanzar una moneda, una ruleta o un dado. En estos sistemas, un tipo de suceso tiende a ocurrir a una tasa persistente, o "frecuencia relativa", a largo plazo.

La segunda se conoce como probabilidad bayesiana, que puede asignarse a cualquier enunciado, incluso cuando no hay un proceso aleatorio involucrado, como forma de representar su plausibilidad subjetiva o el grado en que el enunciado está respaldado por la evidencia disponible. En la mayoría de planteamientos, las probabilidades evidenciales se consideran grados de creencia, definidos en términos de disposición a apostar a ciertas cuotas.

Nota: la teoría de la probabilidad se centra principalmente en predecir la probabilidad de sucesos futuros, mientras que la estadística analiza la frecuencia de sucesos pasados. Esto también explica por qué la probabilidad es un tema central si quieres ser data scientist: como bien sabes, en data science y machine learning usas datos de sucesos ya ocurridos para predecir sucesos futuros.

Aunque la probabilidad suele percibirse como poco intuitiva, sus conceptos son esenciales en data science y analítica predictiva.

Conceptos y símbolos clave

Algunos conceptos que conviene tener presentes en este tutorial están relacionados con la perspectiva frecuentista, ya que trabajaremos con una baraja de 52 cartas.

Desde este punto de vista, el ingrediente fundamental es un experimento que puede repetirse, al menos hipotéticamente, bajo condiciones esencialmente idénticas. Este experimento puede dar lugar a distintos resultados en diferentes ensayos o ejecuciones. El conjunto de todos los posibles resultados del experimento se llama "espacio muestral". Un suceso es un subconjunto bien definido del espacio muestral.

Todo esto suena muy teórico.

Veamos algunos ejemplos:

  • Un ejemplo tópico sería lanzar una moneda. Aquí, el experimento es precisamente lanzar la moneda. Puedes lanzarla varias veces y cada ensayo puede tener resultados diferentes. Como hay dos posibles resultados —cara o cruz—, el tamaño del espacio muestral es 2. No obstante, el suceso "lanzar una moneda" puede, por ejemplo, consistir en un resultado "cara". Del mismo modo, si lanzas la moneda dos veces, tu suceso "la primera tirada es cara" puede tener como resultados "cara-cara" o "cara-cruz".
  • Otro ejemplo menos inmediato: hacer girar un globo terráqueo y pararlo con el dedo. Puedes repetirlo varias veces y obtener resultados distintos: o bien tu dedo cae sobre tierra o sobre agua. El espacio muestral es 2. Un suceso "mi dedo cae en tierra" puede tener como resultado "tierra-agua" o "tierra-tierra".
  • Un último ejemplo: lanzar un dado. Puedes lanzarlo múltiples veces y cada tirada puede tener resultados diferentes: 6 exactamente, ya que el dado tiene 6 caras (1,2,3,4,5,6). Un suceso "la suma de dos tiradas es 10" puede componerse de 10, mientras que el suceso "el número es par" puede componerse de 2, 4 o 6.

Ahora que ya tienes una idea de los conceptos clave que usaremos, veamos algunos símbolos de probabilidad que también aparecerán:

Símbolo Significado
$$\cap$$ Y
$$\cup$$ O
| Dado

Cálculo de probabilidades para sucesos simples

Ahora que estás al día, puedes empezar a determinar la probabilidad de un suceso simple, como que una moneda caiga en cruz. Para calcularla, divides el número de resultados favorables entre el tamaño del espacio muestral.

Esto significa que primero consideras cuántas formas posibles hay de que salga cruz, y luego el número total de resultados posibles. Lo primero es 1, porque solo hay una forma de obtener cruz. Lo segundo es 2, porque al lanzar la moneda obtendrás cara o cruz.

En resumen, el cálculo de la probabilidad de un suceso A se vería así:

$$P(A) = \frac{Event \ outcomes \ favorable \ to \ A}{Sample \ space}$$

En el caso de la moneda, la probabilidad de que salga cruz es 1/2 o 0.5.

Nota: la probabilidad siempre está entre 0 y 1, donde 0 indica que es muy poco probable que ocurra el suceso y 1 indica que es muy probable.

Veamos un segundo ejemplo en el que calcularás la probabilidad de un suceso.

Statistics Sample Space for Deck of Cards

En una baraja estándar hay 52 cartas y de esas 52, 4 son ases. Si sigues el ejemplo de la moneda para conocer la probabilidad de robar un as, divides el número de resultados favorables (4) entre el espacio muestral (52):

$$P(A) = \frac{4}{52}$$

Nota: $A$ representa el suceso "robar un as".

Ahora, calcula la probabilidad de robar un as con ayuda de Python:

# Sample Space
cards = 52

# Outcomes
aces = 4

# Divide possible outcomes by the sample set
ace_probability = aces / cards

# Print probability rounded to two decimal places
print(round(ace_probability, 2))
0.08

La probabilidad de robar un as de una baraja estándar es 0.08. Para expresarla en porcentaje, simplemente multiplica por 100.

# Ace Probability Percent Code
ace_probability_percent = ace_probability * 100

# Print probability percent rounded to one decimal place
print(str(round(ace_probability_percent, 0)) + '%')
8.0%

La probabilidad de robar un as, en porcentaje, es 8%.

Ahora que has visto dos ejemplos, es fácil pensar en ampliar tus cálculos para determinar, por ejemplo, la probabilidad de robar un corazón, una figura (Jotas, Reinas o Reyes) o una combinación de ambas, como la reina de corazones.

En estos casos, puede interesarte crear una función definida por el usuario (UDF) event_probability() a la que pases event_outcomes y sample_space para obtener la probabilidad del suceso en porcentaje, ya que reutilizarás gran parte del código:

# Create function that returns probability percent rounded to one decimal place
def event_probability(event_outcomes, sample_space):
    probability = (event_outcomes / sample_space) * 100
    return round(probability, 1)

# Sample Space
cards = 52

# Determine the probability of drawing a heart
hearts = 13
heart_probability = event_probability(hearts, cards)

# Determine the probability of drawing a face card
face_cards = 12
face_card_probability = event_probability(face_cards, cards)

# Determine the probability of drawing the queen of hearts
queen_of_hearts = 1
queen_of_hearts_probability = event_probability(queen_of_hearts, cards)

# Print each probability
print(str(heart_probability) + '%')
print(str(face_card_probability) + '%')
print(str(queen_of_hearts_probability) + '%')
25.0%
23.1%
1.9%

Estos resultados no sorprenden: como esperabas, las probabilidades de robar la reina de corazones son mucho menores que las de robar una figura cualquiera o un corazón.

Probabilidad con combinaciones y permutaciones

Ya has visto que determinar el tamaño del espacio muestral es clave para calcular probabilidades. ¡Pero a veces no es trivial!

Por suerte, hay formas de facilitar el recuento. Dos de ellas son las permutaciones y las combinaciones. En esta sección verás qué significan exactamente y cómo usarlas para calcular el tamaño del espacio muestral.

Permutaciones

Las permutaciones son el número de formas en que puede ordenarse un subconjunto de un tamaño especificado a partir de un conjunto dado, normalmente sin reemplazo. Un ejemplo sería un PIN de 4 dígitos sin dígitos repetidos. La probabilidad de no repetir dígitos se calcula con:

$$10 \times 9 \times 8 \times 7$$.

Tienes 10 números a elegir, pero como trabajas sin reemplazo, cada vez que eliges un dígito se elimina una opción. Para el primer dígito hay 10 opciones (0 a 9), para el segundo quedan 9, etc.

A un nivel más general, el párrafo anterior considera dos cosas: (1) los números entre los que eliges y (2) los números que efectivamente eliges. En el ejemplo, 10 es el número de dígitos posibles (0 a 9). Sin embargo, el número de elementos que eliges es 4, ya que el PIN tiene 4 dígitos.

Al calcular permutaciones, consideras el conjunto completo de elección, que en realidad es $$10 \times 9 \times 8 \times 7 \times 6 \times 5 \times 4 \times 3 \times 2 \times 1$$ y divides el resultado por la diferencia entre los elementos disponibles (10) y los que efectivamente eliges (4). En términos factoriales, esta diferencia es $$6 \times 5 \times 4 \times 3 \times 2 \times 1$$.

Nota: también puedes escribirlo como

$$10P4 = \frac{10!}{(10 - 4)!}$$

Verás que en la ecuación aparecen "10!" y "6!" (10 factorial y 6 factorial), que indican que deben multiplicarse todos los enteros positivos consecutivos desde 1 hasta 10 o 6 inclusive.

El resultado son 5040 permutaciones. Nota: es exactamente el mismo resultado que al multiplicar 10, 9, 8 y 7.

Generalizando, la fórmula para calcular permutaciones es:

$$nPk = \frac{n!}{(n - k)!}$$

Practiquemos con un ejemplo.

Para hallar el número de permutaciones de ases en mano, de las que eliges solo 2, consideras el conjunto completo de ases (4) y el número que eliges (2):

$$4P2 = \frac{4!}{(4 - 2)!}$$

Combinaciones

Has visto que en permutaciones el orden importa. En combinaciones, no: el orden no importa. Las combinaciones son el número de formas de extraer un subconjunto de tamaño especificado de un conjunto dado.

Ejemplo: tienes una baraja de 52 cartas. Se sacan tres cartas. ¿De cuántas maneras diferentes puedes elegir esas tres cartas?

En principio sería $$52 \times 51 \times 50$$, que es lo mismo que la fórmula de permutaciones que acabas de usar. Sin embargo, en combinaciones no cuentas el orden. Así que creas todas las permutaciones y las divides por las redundancias, es decir, $$3 \times 2 \times 1$$.

Tu cálculo de combinaciones será:

$$52C3 = \frac{\frac {52!}{(52-3)!}}{3!}$$

Esta operación se generaliza como:

$$nCk = \frac{nPk}{k!}$$

Donde ves claramente que el numerador es la misma fórmula de permutaciones y el denominador es el factorial del número de cartas que eliges.

Otro ejemplo con ases. Hay cuatro ases en la baraja y estas son todas las combinaciones posibles de pareja de ases:

  1. As de corazones / As de diamantes
  2. As de corazones / As de tréboles
  3. As de corazones / As de picas
  4. As de diamantes / As de tréboles
  5. As de diamantes / As de picas
  6. As de tréboles / As de picas

Hay seis combinaciones de pareja de ases. Para hallarlas, primero debes calcular las permutaciones:

# Permutations Code
import math
n = 4
k = 2

# Determine permutations and print result
Permutations = math.factorial(n) / math.factorial(k)
print(Permutations)
12.0

Para determinar el número de combinaciones, divide el número de permutaciones entre el factorial del tamaño del subconjunto. Prueba a calcular el número de combinaciones de manos iniciales posibles en Texas Hold’em.

$$52C2 = \frac{52P2}{2!}$$

# Combinations Code
n = 52
k = 2

# Determine Permutations
Permutations = math.factorial(n) / math.factorial(n - k)

# Determine Combinations and print result
Combinations = Permutations / math.factorial(k)
print(Combinations)
1326.0

Sucesos independientes y dependientes

Has leído que un suceso es un subconjunto bien definido del espacio muestral. Los sucesos pueden clasificarse como dependientes o independientes.

Los sucesos independientes no afectan a la probabilidad de los demás. Dos sucesos A y B son independientes si saber que ocurrió A no aporta información sobre si ocurrió B.

Esto sucede, por ejemplo, si robas un as de la baraja, devuelves la carta, barajas y robas otra carta. La probabilidad de robar un as en la primera extracción es la misma que en la segunda.

Los sucesos dependientes sí afectan a la probabilidad de otros sucesos.

Por ejemplo, robas una carta y luego robas una segunda sin devolver la primera. En este caso, la probabilidad de robar un as en la primera extracción no es la misma que en la segunda. Tras la primera carta, el espacio muestral se reduce de 52 a 51. Dependiendo de cuál fue la primera carta, el número de resultados favorables también puede haber cambiado. Si fue un as, ahora quedan solo 3 ases para la segunda extracción.

Veamos estas definiciones en términos formales. Los sucesos A y B (con probabilidad no nula) son independientes si y solo si se cumple cualquiera de estas afirmaciones equivalentes: $$P (A ∩ B) = P(A)P(B)$$ $$P (A|B) = P(A)$$ $$P (B|A) = P(B)$$

En otras palabras, A y B son independientes si:

  • La probabilidad de que ocurran A y B es igual al producto de sus probabilidades individuales.
  • La probabilidad de A dado B es igual a la probabilidad de A.
  • La probabilidad de B dado A es igual a la probabilidad de B.

Considera el siguiente ejemplo: ya conoces la probabilidad de robar un as en la primera extracción. Ahora determina la probabilidad de robar un as en la segunda, si la primera carta fue un rey o un as:

# Sample Space
cards = 52
cards_drawn = 1 
cards = cards - cards_drawn 

# Determine the probability of drawing an Ace after drawing a King on the first draw
aces = 4
ace_probability1 = event_probability(aces, cards)

# Determine the probability of drawing an Ace after drawing an Ace on the first draw
aces_drawn = 1
aces = aces - aces_drawn
ace_probability2 = event_probability(aces, cards)

# Print each probability
print(ace_probability1)
print(ace_probability2)
7.8
5.9

Hay varias situaciones comunes en póker relacionadas con sucesos dependientes.

Antes, un poco de contexto. El juego es Texas Hold’em. Se juega con una baraja estándar de 52 cartas y es la variante más popular. A cada jugador se le reparten dos cartas al inicio y debe formar la mejor mano de cinco cartas combinando sus dos cartas con las cinco comunitarias que se reparten a lo largo de la mano. Las cartas se reparten en cuatro rondas:

  • Preflop: a cada jugador se le reparten dos cartas, las "cartas ocultas"
  • Flop: se reparten tres cartas comunitarias
  • Turn: se reparte una carta comunitaria
  • River: se reparte la última carta comunitaria

Sucesos dependientes: proyecto de color

Tu mano

cards

Cartas comunitarias

cards

Estás en el turn y tienes cuatro cartas para un color alto al as. Un color es una mano fuerte en la que las cinco cartas son del mismo palo. ¿Cuál es la probabilidad de que la última comunitaria, el river, sea un diamante?

# Sample Space
cards = 52
hole_cards = 2
turn_community_cards = 4
cards = cards - (hole_cards + turn_community_cards)

# Outcomes
diamonds = 13
diamonds_drawn = 4
# In poker, cards that complete a draw are known as "outs"
outs = diamonds - diamonds_drawn

#Determine river flush probability
river_flush_probability = event_probability(outs, cards)
print(river_flush_probability)
19.6

Hay aproximadamente un 20% de probabilidad de completar el color en el river. Vamos con otro ejemplo:

Sucesos dependientes: proyecto de escalera abierta

Tu mano

cards

Cartas comunitarias

cards

Estás en el turn y tienes un proyecto de escalera abierta. Una escalera es otra mano fuerte con cinco cartas en orden secuencial. Es abierta porque cualquier ocho (8, 9, 10, jota, reina) o cualquier rey (9, 10, jota, reina, rey) completa la escalera.

¿Cuál es la probabilidad de que el river complete la escalera?

# Sample Space
cards = 52
hole_cards = 2
turn_community_cards = 4
cards = cards - (hole_cards + turn_community_cards)

# Outcomes
eights = 4
kings = 4
outs = eights + kings

# Determine river straight probability
river_straight_probability = event_probability(outs, cards)
print(river_straight_probability)
17.4

Hay aproximadamente un 17% de probabilidad de completar la escalera en el river.

Sucesos múltiples

Hasta ahora has considerado un solo suceso al calcular probabilidades, pero ¿qué pasa cuando hay varios?

Un ejemplo: "¿Cuál es la probabilidad de comer tres galletas de avena y luego una de chocolate si comes cuatro galletas de un tarro con ambos tipos?" Comer cuatro galletas implica cuatro sucesos.

Para calcular la probabilidad de sucesos múltiples, determinas el número de sucesos (4 en este caso), luego la probabilidad de cada suceso por separado y multiplicas todas las probabilidades. En el ejemplo anterior sería 0.5 x 0.5 x 0.5 x 0.5 = 0.0625.

$$P(Event A \cap Event B)=P(Event A) \times P(Event A)$$

Nota: aquí calculas la probabilidad de comer una galleta de avena Y otra de avena Y una tercera de avena Y una de chocolate al final. Cuando consideras sucesos que deben ocurrir todos, multiplicas probabilidades.

Con la baraja, podrías preguntarte: "¿Cuál es la probabilidad de obtener tres corazones eligiendo sin reemplazo?" Al muestrear sin reemplazo, eliges una carta y no la devuelves, así que no puede volver a salir. En este caso, el cálculo sería 13/52 x 12/51 x 11/50.

Sucesos mutuamente excluyentes

Al trabajar con sucesos múltiples, puede que algunos sean mutuamente excluyentes o disjuntos: no pueden ocurrir a la vez. En estos casos, quizá quieras calcular la probabilidad (o la unión) de que ocurra cualquiera de varios sucesos mutuamente excluyentes. Entonces no multiplicas, sino que sumas las probabilidades de cada suceso:

$$P(Event A \cup Event B) = P(Event A) + P(Event B)$$

Es clave entender el "O": robar un corazón O robar un trébol son sucesos mutuamente excluyentes. Un corazón es un corazón y un trébol es un trébol. Para calcular la probabilidad de robar un corazón o un trébol, suma la probabilidad de robar un corazón y la de robar un trébol.

$$P(Heart \cup Club) = (\frac{13}{52}) + (\frac{13}{52})$$

Ahora calcula la probabilidad de estos sucesos mutuamente excluyentes:

  1. Robar un corazón o un trébol;
  2. Robar un as, un rey o una reina.
# Sample Space
cards = 52

# Calculate the probability of drawing a heart or a club
hearts = 13
clubs = 13
heart_or_club = event_probability(hearts, cards) + event_probability(clubs, cards)

# Calculate the probability of drawing an ace, king, or a queen
aces = 4
kings = 4
queens = 4
ace_king_or_queen = event_probability(aces, cards) + event_probability(kings, cards) + event_probability(queens, cards)

print(heart_or_club)
print(ace_king_or_queen)
50.0
23.1

Sucesos no mutuamente excluyentes

No todos los sucesos son mutuamente excluyentes: robar un corazón o robar un as no lo son. El as de corazones es a la vez as y corazón. Cuando los sucesos no son excluyentes, debes corregir el solapamiento.

$$P(Event A \cup Event B) = P(Event A) + P(Event B) - P(EventA \cup EventB)$$

Para calcular la probabilidad de robar un corazón o un as, suma la probabilidad de robar un corazón y la de robar un as y luego resta la probabilidad de robar el as de corazones.

$$P(Heart \cup Ace) = (\frac{13}{52}) + (\frac{4}{52}) - (\frac{1}{52})$$

Calcula la probabilidad de estos sucesos no mutuamente excluyentes:

  1. Robar un corazón o un as;
  2. Robar una carta roja o una figura.
# Sample Space
cards = 52

# Calculate the probability of drawing a heart or an ace
hearts = 13
aces = 4
ace_of_hearts = 1
heart_or_ace = event_probability(hearts, cards) + event_probability(aces, cards) - event_probability(ace_of_hearts, cards)

# Calculate the probability of drawing a red card or a face card
red_cards = 26
face_cards = 12
red_face_cards = 6
red_or_face_cards = event_probability(red_cards, cards) + event_probability(face_cards, cards) - event_probability(red_face_cards, cards)

print(round(heart_or_ace, 1))
print(round(red_or_face_cards, 1))
30.8
61.6

Intersección de sucesos independientes

La probabilidad de la intersección de dos sucesos independientes se obtiene multiplicando las probabilidades de cada suceso.

$$P(Event A \cap Event B) = P(Event A) \times P(Event B)$$

Si quieres saber la probabilidad de robar un as, devolverlo, barajar y robar otro as, multiplicas la probabilidad de robar un as por sí misma.

$$P(Ace \cap Ace) = (\frac{4}{52}) \times (\frac{4}{52})$$

# Sample Space
cards = 52

# Outcomes
aces = 4

# Probability of one ace
ace_probability = aces / cards

# Probability of two consecutive independant aces 
two_aces_probability = ace_probability * ace_probability

# Two Ace Probability Percent Code
two_ace_probability_percent = two_aces_probability * 100
print(round(two_ace_probability_percent, 1))
0.6

La probabilidad de robar dos ases seguidos, de forma independiente, es 0.592%. ¿Y si el segundo suceso es dependiente?

Intersección de sucesos dependientes

La probabilidad de la intersección de dos sucesos no independientes (suceso A y suceso B dado A) se calcula multiplicando la probabilidad de A por la probabilidad de B dado A.

$$P(Event A \cap Event B | A) = P(Event A) \times P(Event B | A)$$

La mejor mano inicial en Texas Hold’em es pareja de ases. ¿Cuál es la probabilidad de que te repartan dos ases?

$$P(Ace \cap Ace | Ace) = (\frac{4}{52}) \times (\frac{3}{51})$$

# Sample Space first draw
cards = 52

# Outcomes first draw
aces = 4

# Probability of ace on first draw
first_ace_probability = aces / cards

# Sample Space second draw
cards = cards - 1

# Outcomes second draw
aces = aces - 1

# Probability of ace on second draw after ace on first
second_ace_probability = aces / cards

# Probability of two consecutive aces (dependent)
both_aces_probability = first_ace_probability * second_ace_probability * 100
print(both_aces_probability)
0.4524886877828055

La probabilidad de robar dos ases seguidos como sucesos dependientes es 0.452%. Veamos un par de situaciones donde esto aparece en la mesa.

Intersección de sucesos dependientes: proyecto de color en el flop

Tu mano

cards

Cartas comunitarias

cards

Es una situación similar al proyecto de color anterior, salvo que ahora estás en el flop y quedan dos cartas comunitarias por venir en lugar de una. ¿Cómo puedes determinar la probabilidad de completar color en el river? Primero define los posibles escenarios:

  • A) Turn diamante, river no diamante (color hecho)
  • B) Turn no diamante, river diamante (color hecho)
  • C) Turn diamante, river diamante (color hecho)
  • D) Turn no diamante, river no diamante (sin color)

Son las únicas cuatro posibilidades y son mutuamente excluyentes. Si sumas las probabilidades de cada escenario, el total es 1. Es decir, uno de los cuatro ocurrirá seguro. Te interesa la probabilidad de que ocurra A, B o C. Lo más sencillo es calcular la probabilidad del escenario D y restarla de 1.

# Sample Space on turn
cards = 52
hole_cards = 2
flop_community_cards = 3
cards = cards - (hole_cards + flop_community_cards)

# Outcomes
diamonds = 13
diamonds_drawn = 4
non_diamonds_drawn = 1
outs = diamonds - diamonds_drawn
turn_non_diamonds = cards - outs - non_diamonds_drawn 

# Probability of not getting a diamond on the turn
no_diamond_turn_probability = turn_non_diamonds / cards

# Sample Space on river
turn_community_card = 1
cards = cards - turn_community_card

# Outcomes on river
river_non_diamonds = turn_non_diamonds - turn_community_card

# Probability of not getting a diamond on the river
no_diamond_river_probability = river_non_diamonds / cards

# Probability of not getting a flush
no_flush_probability = no_diamond_turn_probability * no_diamond_river_probability

# Probability of getting a flush
flush_probability = 1 - no_flush_probability
flush_probability_percent = flush_probability * 100

# Print probability percent rounded to one decimal place
print(round(flush_probability_percent, 1))
38.4

Ahora cambiemos ligeramente la mano:

Tu mano

cards

Cartas comunitarias

cards

La situación es parecida a la anterior, con una gran diferencia: sigues con proyecto de color, pero esta vez no tienes el as. Si cae diamante en turn y river, es probable que alguien tenga un color mejor. Determina la probabilidad de que caiga un diamante en el turn o en el river, pero no en ambos. Ya tienes la probabilidad de no completar color.

Ahora calcula la probabilidad de que caiga diamante en turn y river, súmala a la probabilidad de no completar color y réstalo de 1.

# Sample Space on turn
cards = 52
hole_cards = 2
flop_community_cards = 3
cards = cards - (hole_cards + flop_community_cards)

# Outcomes on turn
diamonds = 13
diamonds_drawn = 4
outs = diamonds - diamonds_drawn

# Probability of diamond on turn
diamond_turn_probability = outs / cards

# Sample Space on river
turn_diamonds = 1
cards = cards - turn_diamonds

# Outcomes on river
river_diamonds = outs - turn_diamonds

# Probability of diamond on river
diamond_river_probability = river_diamonds / cards

# Probability of getting a diamond on the turn and river
two_diamonds_probability = diamond_turn_probability * diamond_river_probability

# Determine the probability of getting only one diamond by the river
one_diamond_probability = 1 - (no_flush_probability + two_diamonds_probability)
one_diamond_probability_percent = one_diamond_probability * 100

# Print probability percent rounded to one decimal place
print(round(one_diamond_probability_percent, 1))
35.1

Valor esperado

En juegos como el póker, es clave responder preguntas como: "¿cuánto gano o pierdo de media si repito este juego muchas veces?". Puedes imaginar que esto no es distinto en el póker, sobre todo si eres profesional.

Si los posibles resultados del juego y sus probabilidades asociadas pueden describirse con una variable aleatoria, puedes responder calculando su valor esperado, igual al promedio ponderado de los resultados donde cada uno se pondera por su probabilidad.

O, dicho de otro modo, simplemente multiplicas el valor total por la probabilidad de ganar para obtener el valor esperado:

$$Expected Value = Total Value \times Probability$$

¿Cuál es el valor esperado si hay \$100 (Total Value) en el bote y tu probabilidad de ganarlo es 0.75?

$$Expected Value = \$100 \times 0.75$$

# Initialize `pot` and `probability` variables
pot = 100
probability = 0.75

# Determine expected value
expected_value = pot * probability
print(expected_value)
75.0

Tu valor esperado es \$75. El valor esperado es un concepto importante en póker. Volvamos al primer ejemplo del proyecto de color para ver cómo usarlo a tu favor.

Tu mano

cards

Mano del rival

cards

Cartas comunitarias

cards

  • Bote total = \$60

  • Apuesta del rival = \$20

Tu rival ha sido generoso y te ha enseñado sus cartas: trío de doses. Para ganar la mano en el river necesitas cualquier diamante salvo jota o dos. La jota o el dos de diamantes le darían a tu rival una mano mejor, full y póker respectivamente. Tienes que igualar \$20 para seguir en la mano, y si ganas te llevas \$60. Si tu valor esperado es mayor que \$20 deberías pagar; si no, foldear.

Decide si debes pagar la apuesta:

# Sample Space
cards = 52
hole_cards = 2
# Your opponent provided you information... use it!
opponents_hole_cards = 2 

turn_community_cards = 4
cards = cards - (hole_cards + opponents_hole_cards + turn_community_cards)

# Outcomes
diamonds = 13
diamonds_drawn = 4

# You can't count the two diamonds that won't help you win
diamond_non_outs = 2 

outs = diamonds - diamonds_drawn - diamond_non_outs

# Determine win probability
win_probability = outs / cards

# Determine expected value
pot = 60
ev = pot * win_probability

# Print ev and appropriate decision
call_amount = 20
if ev >= 20:
    print(round(ev, 2), 'Call')
else:
    print(round(ev, 2), 'Fold')
9.55 Fold

Tu valor esperado es solo \$9.55, menos de los \$20 que necesitas arriesgar para obtener ese premio, así que debes foldear. Determinar el valor esperado es fundamental en la mesa y en la Parte 2 profundizaremos mucho más en el concepto.

Conclusión

¡Enhorabuena! Has llegado al final de este tutorial sobre teoría de la probabilidad con Python. Aquí termina la Parte 1. Has visto varios conceptos clave, como sucesos independientes/dependientes, permutaciones/combinaciones, sucesos múltiples, valores esperados y cómo calcular cada uno.

En la Parte 2 aplicarás estos conceptos a manos reales de póker que jugué durante mi carrera.

*Antes del flop, turn y river se quema una carta boca abajo. Como nadie conoce esa carta, no cuenta como ensayo.

Consulta el tutorial de DataCamp Probability Distributions in Python.

Temas
Python
Ciencia de datos

Más sobre Python

Curso

Regresión intermedia con statsmodels en Python

4 h
16.1K
Aprende a realizar regresiones lineales y logísticas con varias variables explicativas.
Ver detallesRight Arrow
Iniciar Curso
Ver másRight Arrow
Relacionado

Tutorial

Tutorial de Python sobre conjuntos y teoría de conjuntos

Aprende sobre los conjuntos en Python: qué son, cómo crearlos, cuándo usarlos, funciones incorporadas y su relación con las operaciones de la teoría de conjuntos.
DataCamp Team's photo

DataCamp Team

13 min

Tutorial

21 herramientas esenciales de Python

Conozca las herramientas esenciales de Python para el desarrollo de software, raspado y desarrollo web, análisis y visualización de datos y aprendizaje automático.
Abid Ali Awan's photo

Abid Ali Awan

6 min

Tutorial

Secuencia de Fibonacci en Python: Aprende y explora técnicas de programación

Descubre cómo funciona la secuencia de Fibonacci. Explora sus propiedades matemáticas y sus aplicaciones en el mundo real.
Laiba Siddiqui's photo

Laiba Siddiqui

6 min

Tutorial

Histogramas en Matplotlib

Aprende sobre histogramas y cómo puedes utilizarlos para obtener información de los datos con la ayuda de matplotlib.
Aditya Sharma's photo

Aditya Sharma

8 min

Tutorial

Funciones en Python: cómo llamar y escribir funciones

Descubre cómo escribir funciones en Python reutilizables y eficientes. Domina los parámetros, las sentencias return y temas avanzados como las funciones lambda. Organiza mejor tu código con main() y otras buenas prácticas.
Karlijn Willems's photo

Karlijn Willems

14 min

Tutorial

Las mejores técnicas para gestionar valores perdidos que todo científico de datos debe conocer

Explore varias técnicas para manejar eficazmente los valores perdidos y sus implementaciones en Python.
Zoumana Keita 's photo

Zoumana Keita

15 min

Ver MásVer Más