Les voy a mostrar algo mágico. Y después les voy a contar por qué le puse el título a este documento.
Déjenme importar primero algunas bibliotecas de manejo de datos y aprendizaje automático (sí, efectivamente: Inteligencia Artificial). Así verán que no hay truco, que lo que hago no es magia, sino simplemente computación y un poco de álgebra.
In [59]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
from sklearn.linear_model import Ridge
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
Por supuesto, voy a utilizar los datos de casos de COVID-19 en Uruguay. No los tengo completos completos, pero gracias a la gente de GUIAD-Covid-19, me puedo acercar. De esos datos, para más magia, voy a usar solamente dos atributos: el día desde el que empezamos a medir, y la cantidad de casos.
In [16]:
covid=pd.read_csv('https://raw.githubusercontent.com/natydasilva/COVID19-UDELAR/master/Datos/Datos_Nacionales/estadisticasUY.csv?token=ABCA7RFDBSMT4PMGJMNCXQS6RUVRA')
covid
Out[16]:
In [23]:
data=covid.loc[3:,['dia', 'acumTestPositivos']]
data
Out[23]:
Y voy a utilizar una función polinomial de orden 5, para ver si podemos ajustar a los datos y encontrar un patrón. Este procedimiento se llama regresión, y es una de las herramientas de la Inteligencia Artificial.
In [82]:
degree=5
x=data['dia']
x_plot=np.linspace(4,19,20)
y=data['acumTestPositivos']
X=x[:,np.newaxis]
X_plot=x_plot[:,np.newaxis]
plt.scatter(x,y, color='cornflowerblue', linewidth=2,
label="ground truth")
model = make_pipeline(PolynomialFeatures(degree), Ridge())
model.fit(X, y)
y_plot = model.predict(X_plot)
plt.plot(x_plot, y_plot, color='teal', linewidth=2,
label="degree %d" % degree)
plt.title("Casos positivos de COVID-19 en Uruguay")
plt.xlabel("día")
plt.ylabel("casos confirmados")
Out[82]:
Por increíble que parezca, hemos encontrado una función que ajusta casi perfectamente a los casos que se han confirmado como positivos en Uruguay. Y ahora, el toque final: utilicemos esta función para predecir cuántos casos habrá en 10 días, de continuar con este ritmo.
In [74]:
x_plot=x_plot=np.linspace(0,30,30)
plt.scatter(x,y, color='cornflowerblue', linewidth=2,
label="ground truth")
X_plot=x_plot[:,np.newaxis]
y_plot = model.predict(X_plot)
plt.plot(x_plot, y_plot, color='teal', linewidth=2,
label="degree %d" % degree)
plt.title("Predicción:Casos positivos de COVID-19 en Uruguay")
plt.xlabel("día")
plt.ylabel("casos confirmados")
Out[74]:
Según esta función, para el día 30 tendremos unos... -3500 casos (MENOS 3500 casos)
Bienvenidos al mundo del sobreajuste. Cuando se tienen pocos datos, es muy sencillo ajustar una función (sobre todo si es compleja) para que pase por todos los puntos que tenemos. O, como dijo alguna vez John Von Neumann (ese sí, uno de los padres de la computación, ergo de la inteligencia artificial): "Con cuatro parámetros puedo ajustar un elefante, y con cinco puedo hacer que mueva la trompa". El problema es que ese ajuste es inútil para predecir, ya que lo único que está haciendo es memorizar los puntos, sin ser capaz de generalizar.
Moraleja: con tan pocos días, y con tantos elementos que modifican los comportamientos (por ejemplo, las medidas tomadas por el gobierno), intentar sacar conclusiones sobre cómo viene el progreso de la epidemia es muy difícil. Predecir es aún más difícil. Y hacerlo sin el conocimiento del dominio que tiene gente que dedica su vida a estudiar epidemias, yo diría que es imposible.
Les dejo un link creo que muy interesante publicado por la Fundación Sadosky, titulado Inteligencia Artificial en épocas de pandemia, una nota precautoria sobre el uso de técnicas de análisis de datos a partir de datos escasos, incompletos o de un dominio que no conocemos bien.
PD: La regresión la inventó Legendre en 1805.
PD2: Quedate en casa.