Teorema de Bayes en Python


Autor: Eugenia Bahit

Conocimientos previos


Teorema de Bayes y probabilidad de causas

Dada una serie de sucesos A_{k} cuya suma total es un espacio muestral E y un suceso B cualquiera, el Teorema de Bayes permite conocer la probabilidad de que cada suceso A_{k} de E , sea la causa de B . Por este motivo, también se lo conoce como probabilidad de causas.


Datos: caso práctico

Dada una ciudad de 50 000 habitantes, con la siguiente distribución:

Niñas Niños Mujeres Hombres
11000 9000 16000 14000

Y, un reporte de 9 000 casos de gripe, distribuidos de la siguiente forma:

Niñas Niños Mujeres Hombres
2000 1500 3000 2500

Se pretende obtener la probabilidad de que la causa de contraer gripe sea el hecho de pertences a un determinado sector demográfico (por ejemplo, al sector demográfico conformado por niños o niñas).


Análisis

De lo expuesto ut supra se obtiene que:

  • La ciudad (total absoluto de habitantes) es el espacio muestral E.
  • La cantidad de niñas, niños, mujeres y hombres es cada uno de los sucesos A_{k} del espacio muestral E
  • Como valor de n se toma la suma del espacio muestral \sum A_{k}, tal que n=50000
  • El valor de h para los sucesos A_{k} es cada uno de los valores dados en la tabla de distribución de habitantes.
  • Tener gripe es el suceso B.
  • La tabla de distribución de casos de gripe, se corresponde a las intersecciones del suceso B con cada suceso A_{k}, es decir a cada A_{k}\cap\,B

 
Según el cálculo de probabilidad que se aplique, se podrá obtener:

  • La probabilidad de ser niña, niño, mujer u hombre en la ciudad, por medio de P(A_{k}). Se considera una probabilidad a priori.
  • La probabilidad de ser niña, niño, mujer u hombre y tener gripe, que se obtiene con P(A_{k}|\, B) y se considera una probabilidad condicional.
  • La probabilidad de que cualquier habitante, independientemente del sector al que pertenezca tenga gripe, se obtiene con P(B)=\overset{n}{\underset{k=1}{\sum}}P(A_{k})\, P(B|A_{k}) y se la considera una probabilidad total.
  • La probabilidad de que alguien con gripe sea niña, niño, mujer u hombre se obtiene con el Teorema de Bayes. A esta probabilidad se la considera una probabilidad a posteriori, permitiendo dar respuesta a preguntas cómo ¿cuál es la probabilidad de que un nuevo caso de gripe sea de en un niño o niña?

 
Una forma eficaz y ordenada de obtener una probabilidad a posteriori con el Teorema de Bayes, es obtener primero las tres probabilidades previas: a priori, condicional y total.

AVISO:
en lo sucesivo, se utilizará map(float, <lista>) en el código fuente, para convertir los elementos de una lista en números reales, toda vez que hacerlo no sobrecargue el código.

Procedimiento

1. Cálculo de probabilidad a priori

Retorna: probabilidad de que un habitante pertenezca a un sector demográfico específico.

Fórmula: P(A_{k})=\frac{h}{n}

Datos necesarios:

h_{k} = datos de la tabla de distribución de habitantes
n = siempre es la cantidad total del espacio muestral (50 000)

 

Resultados:

P(A_{1})=\frac{11000}{50000}=0.22 probabilidad de ser niña

P(A_{2})=\frac{9000}{50000}=0.18 probabilidad de ser niño

P(A_{3})=\frac{16000}{50000}=0.32 probabilidad de ser mujer

P(A_{4})=\frac{14000}{50000}=0.28 probabilidad de ser hombre

 

Código Python:

habitantes = map(float, [11000, 9000, 16000, 14000])
n = sum(habitantes)
pa = [h / n for h in habitantes]

 

2. Probabilidad condicional

Retorna: probabilidad de tener gripe perteneciendo a un sector demográfico específico.

Certeza: A_{k} (el sector demográfico)

Objetivo: B (la probabilidad de tener gripe)

Fórmula: P(B|\, A_{k})=\frac{P(A_{k}\cap\, B)}{P(A_{k})}

Datos necesarios:

P(A_{k}\cap\, B) = \frac{h=B_{k}}{n=50000}
h = intersecciones (datos de la tabla de distribución de casos de gripe)

 

Resultados:

P(B|\, A_{1})=\frac{\frac{2000}{50000}}{0.22}=0.\overline{18} probabilidad de tener gripe siendo niña

P(B|\, A_{2})=\frac{\frac{1500}{50000}}{0.18}=0.1\bar{6} probabilidad de tener gripe siendo niño

P(B|\, A_{3})=\frac{\frac{3000}{50000}}{0.32}=0.19 probabilidad de tener gripe siendo mujer

P(B|\, A_{4})=\frac{\frac{2500}{50000}}{0.28}=0.18 probabilidad de tener gripe siendo hombre

 

Código Python:

afectados = map(float, [2000, 1500, 3000, 2500])
pi = [k / n for k in afectados]
pba = [pi[i] / pa[i] for i in range(len(pi))]

 

3. Probabilidad total

Retorna: probabilidad de que cualquiera de los habitantes, independientemente del sector demográfico al que pertenezcan, pueda tener gripe.

Fórmula: P(B)=\overset{n}{\underset{k=1}{\sum}}P(A_{k})\, P(B|A_{k})

Datos necesarios:

probabilidad a priori
probabilidad condicional

 

Resultados:

P(B)=P(A_{1})P(B|A_{1})+P(A_{2})P(B|A_{2})+P(A_{3})P(B|A_{3})+P(A_{4})P(B|A_{4})

P(B)=0.22\cdot0.\overline{18}+0.18\cdot0.1\bar{6}+0.32\cdot0.19+0.28\cdot0.18

P(B)=0.04+0.03+0.06+0.05

P(B)=0.18

 

Código Python:

productos = [pa[i] * pba[i] for i in range(len(pa))]
pb = sum(productos)

 
Observaciones:

(a) notar que en la salida anterior existirá una diferencia de .01 con respecto a la solución manual. Esto es debido al redondeo efectuado en la solución manual. Dicha diferencia puede ser erradicada empleando 3 decimales en los valores de la probabilidad condicional (en lugar de dos) en la solución manual.

(b) la probabilidad de NO tener gripe estará dada por 1-P(B) tal que 1-0.18=0.82 pero no será necesario utilizarla para este ejemplo con el Teorema de Bayes.

 

4. Probabilidad a posteriori

Retorna: probabilidad de pertenecer a un sector demográfico específico y tener gripe.

Certeza: B (tener gripe)

Objetivo: A_{k} (la probabilidad de pertenecer a un sector demográfico concreto)

Fórmula: P(A_{k}|\, B)=\frac{P(A_{k})\, P(B|A_{k})}{\overset{n}{\underset{k=1}{\sum}}P(A_{k})\, P(B|A_{k})}

Datos necesarios:

P(A_{k})\, P(B|A_{k}) = el producto obtenido en cada uno de los términos de la probabilidad total
\overset{n}{\underset{k=1}{\sum}}P(A_{k})\, P(B|A_{k}) = la probabilidad total

 

Resultados:

P(A_{1}|\, B)=\frac{0.04}{0.18}=0.\overline{22} probabilidad de ser niña teniendo gripe

P(A_{2}|\, B)=\frac{0.03}{0.18}=0.1\bar{6} probabilidad de ser niño teniendo gripe

P(A_{3}|\, B)=\frac{0.06}{0.18}=0.\overline{33} probabilidad de ser mujer teniendo gripe

P(A_{4}|\, B)=\frac{0.05}{0.18}=0.2\bar{7} probabilidad de ser hombre teniendo gripe

 

Código Python:

pab = [p / pb for p in productos]


Funciones

# Teorema de Bayes
def bayes(e, b):
    n = float(sum(e))
    pa = [h / n for h in e]
    pi = [k / n for k in b]
    pba = [pi[i] / pa[i] for i in range(len(pi))]
    prods = [pa[i] * pba[i] for i in range(len(pa))]
    ptb = sum(prods)
    pab = [p / pb for p in prods]
    return pab


Bibliografía complementaria

[0] Probabilidad y Estadística, Murray Spiegel. McGraw-Hill, México 1988. ISBN: 968-451-102-7

© EUGENIA BAHIT 2015, 2016, 2017 - CC-BY 4.0
La copia y distribución de este documento se encuentra permitida bajo los términos de la licencia Bajo licencia Creative Commons Atribución 4.0