Estudio de factores que influyen en la propagación del Covid-19 | Scatter matrix y correlaciones en Python

Escrito por Mario Trapiello Mendoza & Javier Millán — Mayo 15, 2020

Continuamos con esta serie de artículos a través de los cuales pretendemos explicar ciertos aspectos clave en el análisis de datos, machine learning, Python, etc., aterrizados a la realidad que estamos viviendo y con ejemplos concretos en el covid-19.

Si en el anterior artículo el objetivo era predecir el número de casos por CCAA dando a conocer la utilidad de la regresión logística, en éste el objetivo será entender cuáles son los principales factores que intervienen en la propagación del virus a través de las correlaciones y la matriz de dispersión.

Para ello contaremos con los siguientes datos por CCAA:

  • Velocidad de propagación: dato extraído mediante el ajuste de las curvas de contagiados a funciones logísticas equivalentes.
Fig. 1. En verde se puede ver un ejemplo de pendiente para una regresión logística, cuanto más empinada sea la pendiente, más rápida ha sido la propagación del virus
  • Distribución de la población de las CCAA por edades: los rangos utilizados son de 0 a 14 años, de 15 a 64 años y mayores de 64 años
  • Riesgo de pobreza
  • Tasa de paro (dato de diciembre de 2019)
  • Temperatura máxima (febrero-marzo-abril)
  • Tasa acumulada de sobrepeso y obesidad (datos de 2018)
  • Datos de PCR positivas, hospitalizados, ingresados en UCI y fallecidos por covid-19

Todos estos datos se han recopilado en un documento .xlsx que podéis descargar aquí.

Se han cargado estos datos en un dataframe mediante pandas, ya que es la forma más sencilla para luego poder manipularlos y obtener tanto la matriz de dispersión como los coeficientes de correlación de los mismos.

import pandas as pddf_datoscovid = pd.read_excel("/content/drive/My Drive/Recursos posts/Post Covid 2/datos covid19-1.xlsx")

Matriz de dispersión

Para poder determinar a golpe de vista la relación que existe entre las distintas variables que la componen nos vamos a apoyar en la matriz de dispersión (scatter matrix). Representar una matriz de dispersión con Python es muy sencillo haciendo uso de pandas y añadiendo la función scatter_matrix dentro de su módulo plotting.

from pandas.plotting import scatter_matrixscatter_matrix(df_datoscovid,figsize =(40,40),alpha=0.9,diagonal="kde",marker="o");
Fig. 2. Matriz de dispersión para nuestro dataframe del covid-19

La matriz de dispersión nos da información visual sobre la correlación lineal que existe entre las distintas variables. Para ello, simplemente representa una variable frente a otra.

A continuación se pueden ver los tres tipos principales de gráficos que nos vamos a encontrar en una matriz de dispersión.

Fig. 3. Tipos de relaciones lineales
  • Imagen A: No existe relación. Se ve como las variables X e Y no tienen ninguna dependencia entre sí a la hora de incrementar o decrementar sus valores.
  • Imagen B: Correlación negativa. Al aumentar X, disminuye Y.
  • Imagen C: Correlación positiva. Al aumentar X, aumenta Y.

Como curiosidad, cabe comentar que en el caso de esta matriz de dispersión, la diagonal representa una estimación de la distribución de frecuencia de cada variable, dato muy interesante para entender mejor el comportamiento de los datos. Pandas permite representar en la diagonal o bien esta distribución o bien el histograma de las variables, puesto que cree que aporta más información que representar cada variable frente a ella misma.

En el caso particular de nuestros datos, vamos a fijarnos en las principales variables relacionadas con el covid-19, como son: Velocidad de propagación, PCR+, Hospitalizados, UCI y Fallecidos. Esta matriz nos permitirá determinar si alguna de las demás variables recopiladas influyen en la propagación e impacto del covid-19 y pueden ayudarnos a entender mejor esta pandemia.

Gráficamente hemos podido identificar varias relaciones, de las cuales listamos las más evidentes a continuación:

  • Velocidad de propagación: hay correlación negativa con el riesgo de pobreza y paro.
  • PCR+, UCI y Fallecidos: posteriormente se analizará cada variable por separado, pero a grandes rasgos hay correlación positiva con el porcentaje de población mayor a 64 años y negativa con el paro, la temperatura máxima, el riesgo de pobreza y el porcentaje de población entre 15 y 64 años.

Como en la gráfica hay más datos que los que comentamos, os animamos a que intentéis interpretar las relaciones vosotros mismos en base a los tipos de relación (Fig.3) y saquéis vuestras propias conclusiones.

Correlación lineal

Pero, a todo esto, ¿por qué es tan importante la correlación lineal? La correlación lineal muestra la relación que existe entre dos variables, lo cual es muy importante para cualquier modelo de inteligencia artificial porque nos permite seleccionar qué variables influyen más que otras sobre la variable dependiente a la hora de realizar regresiones o clasificaciones. Además, nos ayuda a filtrar variables independientes innecesarias, y así evitar el temido problema de la multicolinearidad, por el cual las variables independientes de un modelo, en realidad no son independientes sino que dependen unas de otras, lo cual puede afectar negativamente al desempeño del modelo generado.

El artículo de hoy no tiene como intención introducir ningún modelo de inteligencia artificial (por el momento, avisamos), pero sí que tiene como objetivo mostrar la relación de las distintas variables definidas sobre un caso real, que es como de verdad pueden sacarse conclusiones.

Hay muchas formas de medir esta correlación. Concretamente vamos a nombrar tres coeficientes que se pueden utilizar para este propósito: Pearson, Spearman y Kendall. Para este artículo, se ha decidido utilizar como coeficiente el de Spearman, pero os invitamos a que exploréis las distintas opciones disponibles y veáis cómo cambia la métrica en función de uno u otro.

Importando el módulo seaborn, somos capaces de generar una matriz de correlación para nuestros datos:

import seaborn as snssns.heatmap(df_datoscovid1.corr(method="spearman"),vmin=-1,cmap='coolwarm',annot=True);

La matriz generada muestra valores entre -1 y 1. En valor absoluto, cuanto más cercano esté el número a la unidad, mayor es la relación lineal entre las variables. El signo indica el tipo de correlación (negativa o positiva).

Fig. 4. Matriz de correlaciones

Gracias a esta matriz podemos ver de manera rápida la relación entre las distintas variables e intentar sacar conclusiones respecto a cuáles influyen más o menos en la propagación y el impacto del covid-19. Echadle un ojo a la matriz de dispersión (Fig. 2) y vais a poder ver fácilmente la relación con esta matriz.

Queremos dejar claro, y esto es muy importante, que correlación no implica causalidad. Esto quiere decir que por muy correladas que estén dos variables no quiere decir que una esté causada por la otra de manera directa. Siempre tenemos que analizar los datos con ojo crítico y no precipitarnos en las conclusiones.

A continuación, con estos datos, podemos definir una serie de rangos para interpretar el coeficiente de correlación. Estos rangos nos ayudan a clasificar la relación de las distintas variables, y los hemos elegido en base a otros análisis de correlaciones explorados, junto a nuestra propia experiencia. No obstante, estos rangos no pretenden ser una verdad absoluta, simplemente es una clasificación que nosotros realizamos.

Con estos rangos, ya podemos interpretar la relación entre las diferentes variables. En los gráficos siguientes, se pueden ver representados los coeficientes de correlación de la Velocidad de propagación, PCR+, UCI y Fallecidos con respecto al resto de variables pudiendo observar cuales son las que tienen mayor o menor relación.

#Nos quedamos con la fila que contiene las correlaciones de la Velocidad de propagación (habría que repetir esto para el resto variables que queramos representar, en este caso PCR+, UCI y Fallecidos)
df_columnvel = df_datoscovid.corr(method="spearman")["Velocidad propagación"]
#Convertimos el resultado a dataframe puesto que corr nos devuelve un numpy array
df_columnvel = df_columnvel.to_frame()
#Creamos una columna llamada "variables" con el índice
df_columnvel['variables'] = df_columnvel.index
values = df_columnvel["Velocidad propagación"]
idx = df_columnvel["variables"]
#Eliminamos del dataframe las variables que no queremos mostrar
df_columnvel = df_columnvel.drop(["Velocidad propagación","PCR+", "Hospitalizados", "UCI ","Fallecidos"])
#Mostramos el resultado con seaborn
chart = sns.barplot(x=idx, y=values, data=df_columnvel)
Fig. 5. Gráficos de coeficientes de correlación

Con estos gráficos hemos podido corroborar una fuerte correlación negativa entre la expansión del covid-19 y el aumento de la temperatura máxima en cada región. Esto parece confirmar algo que se lleva comentando bastante tiempo, y es que el aumento de la temperatura es perjudicial para el virus y hace más difícil su transmisión. También se ha constatado que esta expansión es mayor en aquellas zonas cuyas poblaciones están mas envejecidas (mayor porcentaje de población por encima de los 64 años), lo que no hace más que confirmar que esta enfermedad afecta más a nuestra población más longeva.

También se ha podido observar cierta correlación negativa con indicadores como el de pobreza o paro de cada región. Nuestra interpretación de estos resultados es que aquellas regiones con un mayor nivel de paro o pobreza tienen una menor movilidad (que normalmente suele estar relacionado con el desplazamiento masivo al trabajo) y que esto evita por tanto que el virus se expanda con mayor facilidad.

Para finalizar, también vemos que hay una correlación positiva con la tasa de sobrepeso/obesidad, lo que parece indicar que las personas que padecen sobrepeso son más vulnerables frente a esta enfermedad que las que no lo padecen.

Conclusiones

No dudamos de que hay muchas más variables que pueden estar relacionadas con la expansión del coronavirus. Como a lo largo de todo este artículo, os animamos a que cada uno explore otros indicadores que considere pueden estar relacionados y lo corrobore utilizando las herramientas que hoy os hemos descrito. Estaremos encantados de leer vuestras conclusiones si las escribís en los comentarios. Esperamos que os haya gustado el artículo, y recordad, #Quedateencasa !

--

--

Javier Millán
Covid-19 | Inteligencia Artificial, Machine Learning, Python y esas cosas

Data Scientist @ MANGO | Ingeniero de Telecomunicaciones y apasionado de la inteligencia artificial y el Blockchain | Let’s rock!