01 · Punto de partida
De la flecha al número
El grafo (Tema 22) dice a dónde se puede ir; falta con qué chance. ¿Del 0 se va al 1 el 30 % o el 90 % de las veces? Esa es la probabilidad de transición pᵢⱼ.
Con todas las pᵢⱼ armamos la matriz P (Tema 24). Y cuando P se desconoce, se estima contando transiciones en una historia.
- ¿Qué vale pᵢⱼ = P(Xₙ₊₁ = j | Xₙ = i)?
- ¿Cuánto suma cada fila y por qué?
- ¿Cómo se estima pᵢⱼ desde datos: nᵢⱼ/nᵢ?
- ¿Cuántos pasos hacen falta para estimar bien?
02 · Definición
¿Qué es pᵢⱼ?
Tres caras del mismo número:
Condicional
pᵢⱼ = P(Xₙ₊₁ = j | Xₙ = i). Solo el presente condiciona.
Fila = 1
Σⱼ pᵢⱼ = 1: desde i se va a algún lado (incluso i).
Estimador
p̂ᵢⱼ = nᵢⱼ/nᵢ. Contar transiciones y dividir por visitas.
En la 2×2 bastan a = p₀₁ y b = p₁₀: p₀₀ = 1−a y p₁₁ = 1−b salen por complemento.
| Desde i | nᵢ₀ / nᵢ₁ | p̂ᵢ₀ / p̂ᵢ₁ |
|---|---|---|
| 0 (n₀ = 100) | 70 / 30 | 0,70 / 0,30 |
| 1 (n₁ = 80) | 40 / 40 | 0,50 / 0,50 |
03 · Anatomía
Fila, cero y muestra
Cuatro reglas para no equivocarse:
- Fila suma 1
- Cada fila es una distribución del próximo paso. Si no suma 1, hay bug o redondeo.
- Cero estructural
- Sin flecha (Tema 22) ⇒ pᵢⱼ = 0 fijo. No se estima: se impone.
- Visitas mandan
- La fila i se estima con nᵢ visitas. Estado poco visitado = fila ruidosa.
- Horizonte
- Más pasos N, mejor p̂. El error cae ≈ 1/√nᵢ por fila.
P verdadera
Parámetro
La que genera los datos. Filas exactas que suman 1.
P estimada
Medición
Conteos sobre visitas. Fluctúa; con N grande se pega a P.
04 · Ejemplos
Chances que un programador calibra
Toda P nace de contar o de experto; ambas se escriben pᵢⱼ:
- 1Clima: 30 soles → 9 lluvias.
p̂₀₁ = 9/30 = 0,3. Fila 0 estimada con n₀ = 30.
- 2Servidor: 200 min ocupado.
120 siguen ocupados: p̂₁₁ = 0,6.
- 3Cola: nunca +2.
pᵢ,ᵢ₊₂ = 0 estructural por grafo, sin estimar.
- 4Dado cargado.
Cada fila idéntica: pᵢⱼ = 1/6 con sesgo. Filas iguales = independencia.
- 5Experto sin datos.
«Caído→libre 0,9»: se declara y se refina con datos.
05 · Representación en Python
Contar nᵢⱼ y dividir por nᵢ
En Python, la estimación es matriz de conteos dividida por filas. La validación es que cada fila estimada sume 1.
Python en tu navegador. Estos bloques se ejecutan localmente con Pyodide, sin instalar nada. Alargá N y mirá el error.
import random
random.seed(7)
a, b, x, N = 0.3, 0.5, 0, 20
hist = [x]
for _ in range(N):
x = 1 if random.random() < (a if x == 0 else 1 - b) else 0
hist.append(x)
conteo = [[0, 0], [0, 0]]
for i in range(len(hist) - 1):
conteo[hist[i]][hist[i+1]] += 1
print("conteos:", conteo)
Con N = 20 los conteos son flacos (algunos de 3–4). La estimación será ruidosa: normal con poca muestra.
De conteos a P estimada
Dividir cada fila por sus visitas:
conteo = [[14, 6], [5, 5]]
P_est = [[c / sum(f) for c in f] for f in conteo]
print(P_est)
print("filas:", [round(sum(f), 9) for f in P_est])
06 · Exploración
Laboratorio: estimar P contando
Cadena verdadera a = 0,3 y b = 0,5 (contorno blanco). Las barras estiman cada pᵢⱼ con N pasos. Con N = 100 el error es visible; con N = 20000 las barras se pegan al contorno. Generá nuevas historias con igual P.
p̂ → p con N grande
p̂ᵢⱼ = nᵢⱼ / nᵢ · error ≈ 1/√nᵢ
Con N 1000, el error máximo ronda 0,03.
Cuatro pares verdadero/estimado: p₀₀, p₀₁, p₁₀, p₁₁. El slider recorre N = 100, 500, 1000, 5000, 20000 en escala log.
Preguntas para explorar
- Con N = 100, ¿el error máximo ronda cuánto? ¿Y con 20000?
- ¿Qué fila se estima mejor: la del 0 o la del 1? ¿Por qué (visitas)?
- Generá nuevas historias con igual N. ¿El error es fijo o fluctúa?
Ver respuestas sugeridas
- ≈ 0,08–0,12 con 100; ≈ 0,01 con 20000. El error cae con √N.
- La del 0: se visita ≈ 62 % (π₀) y tiene más n₀.
- Fluctúa: es ruido muestral. Más N lo achica, no lo congela.
07 · Comprensión
Confusiones frecuentes
«Las columnas suman 1»
No: las filas (desde i). Las columnas suman lo que sea: llegadas, no salidas.
«pᵢⱼ = nᵢⱼ/N total»
No: es nᵢⱼ/nᵢ (visitas a i). Dividir por N total mezcla filas con distinto peso.
«Cero muestral = imposible»
Con pocas visitas, no ver i→j no prueba pᵢⱼ = 0. Solo el grafo declara estructurales.
«Más N siempre arregla»
Arregla la varianza, no el sesgo: si el proceso cambió (no homogéneo), más historia vieja estorba.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: completar por filas
Con a = 0,25 y b = 0,6, escribí la P 2×2 completa y verificá filas.
a, b = 0.25, 0.6
P = [[1 - a, a], [b, 1 - b]]
print(P)
print([sum(f) for f in P])
Ver solución razonada
P = [[0,75 – 0,25], [0,6 – 0,4]], filas 1,0. El complemento evita estimar de más.
Ejercicio 2: estimar una fila
Sin ejecutar primero: con n₀ = 200 (140 se quedan, 60 salen), ¿qué p̂₀? Comprobalo.
print([140 / 200, 60 / 200])
Ver solución
[0,7 – 0,3]: 200 visitas dan ±0,06 de ruido. Con 20 visitas sería ±0,2.
Ejercicio 3: fila poco visitada
Compará el error de la fila 1 con n₁ = 20 vs n₁ = 2000 (p₁₁ = 0,5). ¿En qué factor cae?
Ver una posible respuesta
import math
print(round(math.sqrt(2000 / 20), 1))
Cae 10 veces (√100): de ±0,22 a ±0,02. Las visitas mandan la precisión.
09 · Síntesis
Ideas para recordar
- pᵢⱼ = P(j | i); cada fila suma 1.
- En 2×2 bastan a y b; el resto es complemento.
- p̂ᵢⱼ = nᵢⱼ/nᵢ con error ≈ 1/√nᵢ.
- En Python: matriz de conteos + división por filas.
- Cero estructural se impone; cero muestral se duda.
En el próximo tema ordenaremos todo en la matriz de transición.