Este es un caso práctico extraído de Youtube. La idea fue implementar un caso práctico de un proyecto de Data Science desde cero hasta su final. El código final se encuentra en GitHub.
Python, Pandas, Scipy, Requests, BeautifulSoup.
Web Scraping: Es una técnica automatizada que permite extraer datos de sitios web. Se trata de un proceso mediante el cual un programa, conocido como "web scraper", extrae información específica del código HTML de una página web, para luego almacenarla y analizarla.
Distribución Poisson: Es una distribución discreta que describe el numero de eventos que ocurren en un intervalo de tiempo fijo o región de oportunidad.
Condiciones para su aplicación:
El número de eventos se puede contar.
La ocurrencia de eventos son independientes.
La tasa a la que ocurren los eventos es constante.
Dos eventos NO pueden ocurrir exactamente al mismo instante de tiempo.
Fórmula: Un evento puede ocurrir k veces en un intervalo de tiempo dado:
La probabilidad de observar eventos en un intervalo viene dado por la siguiente ecuación:
Donde:
k: Numero de ocurrencias (≥ 0).
X: Variable discreta aleatoria (≥ 0).
λ (Lambda): Número medio esperado de ocurrencias (≥ 0).
Uso de Python con sus librerías como Pandas, para la carga y gestión de datos a través de DataFrames; Scipy para simular la distribucion Poisson; Requests, para consultar una página y poder hacer web scraping de la misma; BeautifulSoup, para parsear un html con un determinado parser.
Recordar conceptos ya aprendidos sobre la Distribución Poisson y su aplicabilidad.
Poder programar un proyecto entero de Data Science desde cero, empezando por el web scraping de una pagina para recolectar los datos, pasando por su limpieza y preparación, para terminar construyendo el modelo y generando una predicción final con dicho modelo.
Problema: Se requiere hacer la predicción sobre el campeón del Mundial de Fútbol 2022.
Para sacar los datos necesarios se decidió tomarlos de las páginas de Wikipedia en inglés, correspondientes a dicho Mundial.
La elección de usar Wikipedia para los datos no es aleatoria, se opto por esta forma de recolectar los datos debido a que para armar el modelo de predicción se necesitan recolectar datos históricos de partidos jugados de las selecciones que participan del mundial y Wikipedia tiene un mismo formato de página para cada uno de los mundiales, lo cual facilita el trabajo a la hora del web scraping.
Como parte del modelo se usara un parámetro conocido como Team Strength (fuerza del equipo), cuya idea es medir que tan fuerte es un equipo de fútbol basado en los goles que marca y que tan débil es el equipo en base a los goles que recibe. En este caso selecciones de países. Su cálculo para un equipo a nivel práctico, se hace con el promedio de goles marcados, por un lado, y el promedio de goles recibidos por otro. Estos valores son usados dentro de una simulación Poisson que nos ayuda a determinar un valor probabilístico para cada equipo. Luego ese valor se constrasta contra el valor obtenido para el equipo retador y el que sea mayor, determina al equipo ganador.
La aplicabilidad de la Distribución Poisson para este caso esta sustentada en el Goal: Que es un evento que puede ocurrir en los 90 minutos de un partido de fútbol.
Lambda (λ): número esperado de eventos por intervalo de tiempo, que en este caso seria el promedio de goles en 90 minutos.
k: seria el número de goles en un partido que podría marcar un equipo.
Veamos sus condiciones también:
El número de eventos se puede contar: Claramente el numero de goles de un partido se puede contar y son valores enteros (discretos), no continuos como sería 1.5 goles. Por lo tanto, esta condición se cumple.
La ocurrencia de eventos es independiente: La ocurrencia de un gol no afecta la probabilidad de otro gol. Esto es "debatible" porque un gol puede hacer que el otro equipo, el que recibió el gol, se anime a mas y trate de anotar un gol para empatar. Para los casos prácticos un gol no afectará la probabilidad de que se marque otro gol. Por lo tanto, esta condición se cumple.
La tasa a la que ocurren los eventos es constante: Se podría decir que la probabilidad de que ocurra un gol en un partido de 90 minutos es la misma de que ocurra en otro partido de 90 minutos, entonces esta condición se cumple.
Dos eventos no pueden ocurrir exactamente al mismo instante de tiempo: En un mismo partido, un gol no puede convertirse en el mismo instante de tiempo que otro gol. Por los tanto, esta condición se cumple.
Directamente se trabajó sobre la aplicación en 4 etapas y sobre 4 archivos Python.
En la primera etapa se comienza por acceder a la página del Mundial 2022 y obtener el fixture de los partidos a jugar. (NOTA: En este caso, como el Mundial 2022 ya se jugó, no es el fixture lo que se obtuvo sino los partidos con sus resultados. Hubo que modificar mas adelante estos datos en la fase final para seguir con el caso como si se estuviera haciendo la predicción antes de que se juegue dicho Mundial). Esto se encuentra todo en el archivo main.py del código de la aplicación.
En la segunda etapa se realiza el web scraping para extraer todos los datos, es decir, se arma un registro histórico de los partidos de todos los mundiales. Esto esta hecho en el archivo data_extraction.py.
La tercera etapa se procede a "limpiar" los datos, ya sea por eliminar espacios vacíos, caracteres NaN o datos duplicados. También se modificaron datos erróneos. Esto se aprecia en el archivo data_cleaning.py.
Debería existir una quinta etapa que vendría a ser el deployment de la aplicación, pero a fines prácticos solo se mantendrá la aplicación en un repositorio de GitHub.
A continuación se presenta una imagen detallando los pasos anteriores.
El algoritmo se basa en 4 componentes (archivos Python) como se explicó en la sección anterior y en cada uno de ellos salvo el último se generan nuevos archivos como salidas, los cuales se explican a continuación:
main.py: Se obtiene el archivo dict_table que es un diccionario Python con el fixture del mundial.
data_extraction.py: Se obtienen dos archivos con todos los partidos de todos los mundiales. Uno de ellos es fifa_worldcup_histarical_data.csv y el otro es fifa_worldcup_fixture.csv con los partidos del fixture ya formateados.
data_cleaning.py: Se levantan los archivos mencionados en el paso anterior y se generan dos nuevos archivos con los datos ya "limpios" y listos para procesar por el modelo. Ellos son: clean_fifa_worldcup_histarical_data.csv y clean_fifa_worldcup_fixture.csv.
model_creation.py: Este archivo Python no genera otro archivo como salida. Usa los anteriores archivos mencionadas para armar y correr el modelo predictivo. Como resultado muestra por pantalla quien sera el campeón del torneo en el partido final del Mundial 2022.
Todo el código y la aplicación entera se encuentra disponible en este repositorio de GitHub.