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)
Podemos hacer esto para cada etnia asi:
demog['muertes_esperadas'] = (demog['muertes_observadas'].sum()*demog['porcentaje_censo']).round(0)
muertes_observadas | porcentaje_censo | muertes_esperadas | |
---|---|---|---|
Indígena | 251 | 0.0431 | 532 |
Afrocolombiana | 621 | 0.1058 | 1305 |
Rom | 0 | 0.0001 | 1 |
Otro | 11466 | 0.8510 | 10500 |
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
en este ejemplo
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
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.