Una variable aleatoria es una formalización matemática de una cantidad u objeto que depende de un evento aleatorio. Por ejemplo, el lanzamiento de una moneda suele considerarse un evento aleatorio, porque no podemos predecir el lado de la moneda que este nos arrojará.
Sea entonces \(X\) una variable aleatoria. Su valor esperado se describe con
$$ E(X) = \sum_{j=1}^kx_jf(x_j) = x_1 f(x_1) + x_2 f(x_2) + \cdots + x_kf(x_k) $$
La \(f(x_j)\) indica una función que depende del valor de \(x_j\) y que toma su forma a partir de la distribución que tienen los datos. Por ejemplo, si se tratara del lanzamiento de una moneda, la distribución de Bernoulli ayuda a describir el comportamiento de los lanzamientos. En este caso, nuestra variable aleatoria \(X \sim b(1,p)\) tiene como valor esperado
$$ E(X) = 0 \cdot(1-p) + 1 \cdot p = p $$
Veamos cómo sería ese comportamiento en Python. Hagamos 10 lanzamientos de moneda con \(p=0.5\), es decir que cada cara tiene un 50% de probabilidad de salir.
import numpy as np
np.random.seed(42)
n = 10
lista = [np.random.randint(2) for i in range(n)]
print(lista)
np.mean(lista)
# [0, 1, 0, 0, 0, 1, 0, 0, 0, 1]
# 0.3Oh. Parece que ese 0.3 está muy alejado del valor esperado que nos prometieron. Esto sucede porque hay muy pocas observaciones. Es más probable obtener nuestro valor esperado entre más observaciones tenemos. Esta es la razón por la que en los casinos “la casa siempre gana”. Aunque algunas personas puedan salir del casino con dinero en las manos, mientras el valor esperado sea suficiente para garantizar una ganancia, lo único que tiene que hacer el casino es jugar suficientes veces. Veamos nuevamente nuestro ejemplo, pero ahora con 100, 1000, y 10000 observaciones.
import numpy as np
np.random.seed(42)
# Hagamos una función que dependa únicamente del número de lanzamientos
# La función nos regresa el valor esperado
def valor_esperado_monedas(n):
lista = [np.random.randint(2) for i in range(n)]
return np.mean(lista)
# Ahora ejecutemos esta función y mostremos el resultado
print(valor_esperado_monedas(100))
print(valor_esperado_monedas(1000))
print(valor_esperado_monedas(10000))
# 0.56
# 0.494
# 0.4997¿Notas cómo entre más grande sea el número de \(n\) el resultado del valor esperado se acerca más a \(0.5\)? Esto no es casualidad.