Paradoja del análisis médico generalizado

Problema del Análisis médico

Una determinada prueba clínica para detectar una enfermedad tiene una sensibilidad del 98%, es decir : en el caso de personas afectadas acierta en el 98% de los casos. El el 2% restante da resultado negativo, cuando debería de ser positivo (Falso Negativo).
Y tiene una especificidad del 99.0%, es decir : en el caso de personas sanas acierta en el 99.0% de los casos, y yerra en el 1.0% restante, dando un resultado positivo cuando en realidad el paciente está sano (Falso Positivo). La tasa de enfermos en la población del 0.5%.
La pregunta es : si hacemos un análisis a una persona elegida al azar de entre toda la población, y el resultado da positivo : ¿qué posibilidades hay de que realmente esté enferma?

Solución

La teoria de Bayes dice :
p(B_{i}| A)=\frac{p(A | B_{i}) * p(B_{i})}{\sum_{k=1}^{n}p(A | B_{k})*p(B_{k})}

Vamos a aplicarlo con la siguientes nomenclatura:
A_{+} : posibilidad de que el análisis de positivo
A_{-} : posibilidad de que el análisis de negativo
E_{+} : la persona está enferma
E_{-} : la persona está sana

Aplicando los datos que nos han pasado en el enunciado :

p(A_{+}| E_{+})=0.98\\ p(A_{-}| E_{+})=0.02\\ p(A_{+}| E_{-})=0.01\\ p(A_{-}| E_{-})=0.99

p(E_{+})=0.005

El dato que nos piden es : p(E_{+} | A_{+}) probabilidad de que esté enfermo (E_{+}) habiendo dado positivo en el análisis (A_{+})

p(E_{+}| A_{+})=\frac{p(A_{+} | E_{+}) * p(E_{+})}{\sum_{k=1}^{2}p(A_{+} |t E_{k})*p(E_{k})}

desarrollando el $\sum$ :
p(E_{+}| A_{+})=\frac{p(A_{+} | E_{+}) * p(E_{+})} {p(A_{+} | E_{+})*p(E_{+})+p(A_{+} | E_{-})*p(E_{-})}

Usemos Python para el cálculo:

Empecemos importando una serie de librerías estandares en estas entradas :

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import re
import math

Criterio : mayúscula es positiva, minúscula es negativa

pAE=0.98
paE=1-pAE
pAe=0.01
pae=1-pAe
pE=0.005
pe=1-pE
pEA=pAE*pE/(pAE*pE+pAe*pe)
'La probabilidad de que esté enfermo dando positivo en el test es del {:1.2f}%'.format(100*pEA)
'La probabilidad de que esté enfermo dando positivo en el test es del 33.00%'

Esa es la razón por la que no tienen sentido análisis a la población en general cuando la tasa de afectados es muy baja.

Para entender el resultado hagamos una extrapolación para España (nº aprox)
Población : 46,5 millones, que podemos dividir en :

poblacion=46500000
poblacion_e=poblacion*pe
poblacion_E=poblacion-poblacion_e
'Poblacion afectada {:,.0f}'.format(poblacion_E)
'Poblacion afectada 232,500'
'Poblacion NO afectada {:,.0f}'.format(poblacion_e)
'Poblacion NO afectada 46,267,500'

aplicando p(A|e) a la poblacion no enferma nos encontrariamos con :

poblacionAe=poblacion_e*pAe
poblacionAe
462675.0
'es decir : tendriamos {:,.0f} False Positivos'.format(poblacionAe)
'es decir : tendriamos 462,675 False Positivos'

Y si hacemos el test solo a la poblacion afectada : cuantos positivos (verdaderos en este caso) tendriamos?

poblacionAE=poblacion_E*pAE
'{:,.0f} True Positivos'.format(poblacionAE)
'227,850 True Positivos'

Es decir : tenemos un total de positivos (los True y los False) de :

'{:,.0f} Positivos'.format(poblacionAE+poblacionAe)
'690,525 Positivos'

entre los que son True :

'True positivos {:,.0f} de un total de {:,.0f}, representando un {:2.1f}%'.format(
    poblacionAE,poblacionAE+poblacionAe,
100*poblacionAE/(poblacionAE+poblacionAe))
'True positivos 227,850 de un total de 690,525, representando un 33.0%'

que coincide con el resultado calculado anteriormente

La paradoja del cumpleaños

Problema del Cumpleaños

En una habitación encontramos n personas. ¿Cuál es el número n más bajo que asegura que tengas más de un 50% de posibilidades de que dos cualesquiera de ellas cumplan años en el mismo día?

Solución

Calculemos la probabilidad de que no coincidan en su día de cumpleaños dos personas. Para ello damos por hecho que una de ellas ya se encuentra en la habitación y a continuación entra la segunda. ¿Qué probabilidad tiene de NO coincidir en su día de cumpleaños con la que ya está?, pués 364 entre 365, tiene 364 posibles días..todo el año excepto el día en el que nació la primera persona:

p\_no\_coincidencia_{2}= 364/365= 0.0027397

luego la probabilidad de coincidencia es la complementaria :

p_{2}=1- p\_no\_coincidencia_{2}= 1-364/365

A continuación entra una tercera persona. ¿Qué probabilidad hay de que NO coincidan ninguna de las tres? : pues la multiplicación de dos probabilidades, la probabilidad de que la tercera no concida con ninguna de las dos exsitente (363/365) multiplicada por la probabilidad de que los dos primeras no hayan nacido el mismo día : p\_no\_coincidencia_{2}

p\_no\_coincidencia_{3}=\frac{363}{365}p\_no\_coincidencia_{2} = \frac{363*364}{365*365}

y de igual manera la probabilidad de coincidencia para tres personas será tal que :

p_3=1-p\_no\_coincidencia_{3}=1-\frac{363*364}{365*365}=0.008204

A continuación entra una cuarta. Siguiendo el mismo razonamiento encontramos que la probabilidad de NO coincidencia de ninguna de las cuatro es tal que multiplicar la probabilidad de que la cuarta no coincida con ninguna de las tres existentes multiplicado por la probabilidad de que las tres ya existente no coincidan tampoco :

p\_no\_coincidencia_{4}=\frac{362}{365}p\_no\_coincidencia_{3} = \frac{362*363*364}{365*365*365}

y de igual manera la probabilidad de coincidencia será :

p_4=1-p\_no\_coincidencia_{4}=1-\frac{362*363*364}{365*365*365}=0.0163559

Ya podemos generalizar fórmula con la expresión :

p_{i}=\left (1-\frac{364 !}{(365-i)! \enspace 365^{i-1}}\right) \enspace \forall i \in \mathbb{N}_{>1}

Bastará con ir incrementando i, hasta que la probabilidad calculada sea mayor que 0,5 .

Vamos a realizar esos cálculos con unas líneas de Python :

Empecemos importando una serie de librerías que nos ayudarán a realizar esos cálculos :

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import re
import math

Usemos una variable para el número de días en el año (asumimos que no hay bisiestos) :

n_dias_año=365

Creamos una función p, que calcula la probabilidad de concidencia de n personas, codificando tal cual la fórmula que calculamos antes :

def p(n):
#nos aseguramos de que el parámetro pasado es un integer,
#para evitar errores en el cálculo del factorial
n=int(n)
prob_aux=math.factorial(n_dias_año-1)/
(math.factorial(n_dias_año-n)*n_dias_año**(n-1))
return 1-prob_aux

Saquemos por pantalla una tabla con los valores, hasta, digamos, 100 personas :

n_max=60
for i in range(2,n_max):
print ('Para {:>2} personas : probabilidad {:1.2f}% '.format(i,100*p(i)))

Para 2 personas : probabilidad 0.27%
Para 3 personas : probabilidad 0.82%
Para 4 personas : probabilidad 1.64%
Para 5 personas : probabilidad 2.71%
Para 6 personas : probabilidad 4.05%
Para 7 personas : probabilidad 5.62%
Para 8 personas : probabilidad 7.43%
Para 9 personas : probabilidad 9.46%
Para 10 personas : probabilidad 11.69%
Para 11 personas : probabilidad 14.11%
Para 12 personas : probabilidad 16.70%
Para 13 personas : probabilidad 19.44%
Para 14 personas : probabilidad 22.31%
Para 15 personas : probabilidad 25.29%
Para 16 personas : probabilidad 28.36%
Para 17 personas : probabilidad 31.50%
Para 18 personas : probabilidad 34.69%
Para 19 personas : probabilidad 37.91%
Para 20 personas : probabilidad 41.14%
Para 21 personas : probabilidad 44.37%
Para 22 personas : probabilidad 47.57%
Para 23 personas : probabilidad 50.73%
Para 24 personas : probabilidad 53.83%
Para 25 personas : probabilidad 56.87%
Para 26 personas : probabilidad 59.82%
Para 27 personas : probabilidad 62.69%
Para 28 personas : probabilidad 65.45%
Para 29 personas : probabilidad 68.10%
Para 30 personas : probabilidad 70.63%
Para 31 personas : probabilidad 73.05%
Para 32 personas : probabilidad 75.33%
Para 33 personas : probabilidad 77.50%
Para 34 personas : probabilidad 79.53%
Para 35 personas : probabilidad 81.44%
Para 36 personas : probabilidad 83.22%
Para 37 personas : probabilidad 84.87%
Para 38 personas : probabilidad 86.41%
Para 39 personas : probabilidad 87.82%
Para 40 personas : probabilidad 89.12%
Para 41 personas : probabilidad 90.32%
Para 42 personas : probabilidad 91.40%
Para 43 personas : probabilidad 92.39%
Para 44 personas : probabilidad 93.29%
Para 45 personas : probabilidad 94.10%
Para 46 personas : probabilidad 94.83%
Para 47 personas : probabilidad 95.48%
Para 48 personas : probabilidad 96.06%
Para 49 personas : probabilidad 96.58%
Para 50 personas : probabilidad 97.04%
Para 51 personas : probabilidad 97.44%
Para 52 personas : probabilidad 97.80%
Para 53 personas : probabilidad 98.11%
Para 54 personas : probabilidad 98.39%
Para 55 personas : probabilidad 98.63%
Para 56 personas : probabilidad 98.83%
Para 57 personas : probabilidad 99.01%
Para 58 personas : probabilidad 99.17%
Para 59 personas : probabilidad 99.30%

Podemos comprobar que n=23 es nuestra solución…con una probabilidad de 50.73%.
Además para 57 personas vemos que tenemos más de un 99% de posibilidades de que coincida el cumpleaños de dos de ellas.

Podemos dibujar esa tabla en un gráfico. Disminuimos n_max a 50 por claridad :

n_max=50
fig1, ax1 = plt.subplots(figsize=(15, 5))
y=[p(i) for i in np.arange(2,n_max+1)]
x=np.arange(2,n_max+1).tolist()
linea = ax1.plot(x,y,color='b')
ax1.xaxis.set_ticks(x)
ax1.yaxis.set_ticks(np.arange(0,1.01,0.1))
ax1.set_xlabel('Nº de personas',size=16)
ax1.set_ylabel('Probabilidad',size=16)
ax1.tick_params(axis='x',direction='out', length=5, width=2, colors='black')
ax1.tick_params(axis='y',direction='out', length=5, width=2, colors='black')
ax1.grid(b=True)
plt.plot([21,25],[.5,.5],color='g',lw=3)
plt.plot([23,23],[0.3,0.7],color='g',lw=3)
ax1.set_title('Probabilidad de que coincida el dia de cumpleaños de dos de ellas')
plt.show()

output_13_0