Como Probar Una Hipótesis Con La Estadística Ji-Cuadrada

Creemos Que El Coronavirus Afecta A Etnias Equitativamente?

Photo by Thach Tran

Colombia es genealógicamente y culturalmente muy diversa. En los datos del coronavirus hay cuatro distinciones: indígena, negro, rom, y otro. Veamos como la estadística ji-cuadrada del matemático Pearson se puede calcular, en python, para probar una hipótesis sobre las muertes que han ocurrido en cada etnia.

La Hipótesis Nula

Supongamos que creemos que el coronavirus afecta a diferentes etnias o comunidades desproporcionadamente. Para probar nuestra hipótesis necesitamos una hipótesis nula.

Hipótesis nula : Ho : el porcentaje de cada etnia en la población es igual que el porcentaje de las muertes por coronavirus que cada etnia ha sufrido.

La prueba ji-cuadrada nos da la probabilidad que la hipótesis nula es cierta.

Conseguir y Depurar Datos

Conseguimos los datos en el portal de datos abiertos de Colombia utilizando la biblioteca requests. Para bajar los datos completos cambia el límite a un número mayor que los casos acumulados; abajo verán que utilizo “limit 3000000”.

Después, trabajamos los datos con pandas. Y como en casi todos los proyectos donde manejamos datos hay que depurar. O sea eliminar o corregir registros que causan problemas, por ejemplo, al agregar o crear una serie de tiempo. En el siguiente código verán que utilizamos pandas.DataFrame.replace para reemplazar datos que no se hallan, contienen errores, etc con objetos nulos: None or np.nan.

def casos_completo():
    respuesta = requests.get(
        'https://www.datos.gov.co/api/id/gt2j-8ykr.json?$order=fecha_de_notificaci_n DESC limit 3000000')
    df = pd.DataFrame(respuesta.json())

    # depuración
    for depurar in ['N/A', 'ERROR: #REF!', 'Sin dato']:
        df = df.replace(depurar, None)

    df.edad = df.edad.astype(int)
    df.estado = df.estado.str.lower()

    df['pertenencia_etnica'] = df['pertenencia_etnica'].replace('', np.nan)

    return df

Muertes Esperadas En Cada Etnia

Agrupamos los casos de coronavirus por etnia así:

df_0=casos_completo()
df_muerte_etnia = (df_0[~df_0.fecha_de_muerte.isna()
                        ].groupby(['pertenencia_etnica']
                                  )[['id_de_caso']].nunique()
                   ).rename(columns = {'id_de_caso':'muertes_observadas'})

if 'Rom' not in df_muerte_etnia.index:
    print('No hay muertes Rom')
    df_muerte_etnia.loc['Rom'] = 0

La proporción de cada etnia en la población estan en esta pagina de la DANE Colombiana:

df_demog = pd.DataFrame(data={'población_censo': [1905617, 4671160, 2649, 37584991]},
                        index=['Indígena', 'Afrocolombiana', 'Rom', 'Otro'])

df_demog['porcentaje_censo'] = df_demog['población_censo']/df_demog['población_censo'].sum()

Calculamos las muertes esperadas con el porcentaje de cada etnia y el número total de muertes. Por ejemplo, para las muertes esperadas sin alguna etnia especifica (otro)

    \[muertes\ esperadas_{otro} = porcentaje\ censo_{otro} * muertes\ totales\]

    \[muertes\ esperadas_{otro} = 0.8510 * 11466 = 10500\]

Podemos hacer esto para cada etnia asi:

demog['muertes_esperadas'] = (demog['muertes_observadas'].sum()*demog['porcentaje_censo']).round(0)
 muertes_observadasporcentaje_censomuertes_esperadas
Indígena2510.0431532
Afrocolombiana6210.10581305
Rom00.00011
Otro114660.851010500

Que Probabilidad Tiene Nuestra Hipótesis

Como vemos las muertes que esperamos son un poco diferente a las observadas. Para obtener la probabilidad que estas diferencias son significantes calculamos la estadística ji-cuadrada, determinamos los grados de libertad y consultamos la distribución ji-cuadrada (mismo nombre que la prueba).

La estadística ji-cuadrada

    \[X^2 = \sum\frac{(observado - esperado)^2} {(esperado)}\]

en este ejemplo

    \[X^2= (251-532)^2/532 + (621-1305)^2/1305 + (0-1)^2/1 + (11466-10500)^2/10500 = 442.1\]

En nuestro casos tenemos 3 grados de libertad; 4 etnias – 1 = 3. ¿Y por qué se sustrae uno? Porque al saber las muertes en tres de las etnias y el número total de muertes podemos calcular las muertes en la cuarta etnia. Al consultar la tabla de distribución de ji-cuadrada vemos que la probabilidad, p, es prácticamente 0.
La hipótesis nula se rechaza, putativamente, cuando p es menor o igual a 0.05. Eso indica que las muertes no son de similar proporción a la proporción de cada etnia en la población Colombiana.

Ahora que entendemos como la prueba de bondad de ajuste se desarrolla. Podemos obtener el mismo resultado, dando menos pasos con la biblioteca scipy.

from scipy import stats
c2 = stats.chisquare(f_obs=demog['muertes_observadas'],
                     f_exp=demog['muertes_esperadas'], ddof=0, axis=0)

{"statistic":442.05, "pvalue":1.71e-95 }

Conclusión

En este ejemplo rechazamos la hipótesis nula, confirmando que el porcentaje que abarca cada etnia en el número de muertos por coronavirus es diferente al porcentaje de cada etnia en la población. A qué se debe esta diferencia requiere más investigación y depende de muchas variables. Por ejemplo, la densidad de la población a donde han ocurrido estas muertes. Tendríamos que modelar para ver cuales de tantas variables son las importantes.

Nota importante

La prueba ji-cuadrada tiene una limitación, se exige que el 80% de las celdas tengan un valor de por lo menos 5. En nuestro ejemplo, se espera una muerte en la población de etnia rom. Entonce esta regla nos dicta que no podemos tener certeza en la prueba ji-cuadrada. Pero vemos que la contribución de la etnia rom en la estadística ji-cuadrada es muy pequeña, (0-1)^2/1 = 1. Entonces aunque esperamos menos de 5 muertes, la estadística ji-cuadrada no cambiaría mucho y podemos decir que la hipótesis nula se rechaza en este caso.

Extra

Más sobre ji-cuadrada

Aparte: me dio mucha curiosidad y aprendí un poco sobre la comunidad rom/gitana en Colombia; no conocía su historia aunque es un comunidad que ha estado presente desde tiempos coloniales en Colombia.