William Baum ( W. J. Baum ), estudiante de posgrado en estadística, Universidad de New Hampshire
Mi proyecto utiliza el lenguaje de script JMP para extraer datos de varios sitios web y predecir victorias en el fútbol profesional. El script automatiza un proceso, que de otro modo sería laborioso, de recopilación, agregación y reorganización de datos para su análisis. Varias secciones del script incluyen diferentes funciones, como el procesamiento de celdas para eliminar subíndices, y la concatenación y unión de múltiples conjuntos de datos. Se emplea una matriz asociativa para comparar el resultado de las fórmulas de columna en filas separadas. Finalmente, se comparan los resultados de múltiples modelos predictivos. El objetivo principal de este proyecto es ilustrar los usos de JSL para automatizar los procesos de recopilación, organización y predicción de datos de forma repetible.
Introducción
Hace unos dos años, descubrí que JMP podía extraer datos de la web con el lenguaje de script JMP [JSL]. Como estudiante de posgrado en estadística, suelo buscar datos de práctica para perfeccionar mis habilidades analíticas y mejorar mi programación. Resulta que soy un ávido aficionado al fútbol americano y las estadísticas deportivas están fácilmente disponibles en línea en diversas fuentes. A modo de ejercicio, intenté predecir el total de victorias de cada equipo profesional de fútbol en una temporada, con datos extraídos de la web.
Las técnicas de extracción y limpieza de datos se pueden aplicar a cualquier dato disponible en forma de tablas HTML en la web. Me parece sorprendente que JSL pueda usarse para automatizar la limpieza de datos y realizar modelado dentro de un solo script o un grupo compuesto de scripts. Además, JMP ayuda a quienes tienen poca experiencia en programación, ya que permite realizar análisis a través de su interfaz gráfica de usuario (GUI) y, posteriormente, guardar el proceso como un script reutilizable. Esto ahorra mucho tiempo a los usuarios al repetir análisis con datos actualizados o nuevos.
Configuración
El primer paso fue crear carpetas para almacenar los archivos que se generarían durante el proceso de agregación de datos. Descubrí que crear una carpeta para cada fuente de datos funcionaba bien para organizar la gran cantidad de archivos generados.

A continuación, le pedí al usuario del script que asignara una ruta local para el almacenamiento de archivos, para hacer un código más limpio: dir = Pick Directory(“Seleccionar directorio para almacenamiento de archivos”, show files(0));
Esta ruta local también puede estar codificada.
Una vez seleccionada la ruta, se extrajeron los datos de varios sitios web y se guardaron en archivos individuales (uno para cada tabla HTML). Estos archivos se referenciaron posteriormente, durante la etapa de agregación de datos.
Extracción de datos
Con JMP, simplemente hay que copiar y pegar las URL en el código JSL desde la barra de direcciones del navegador. También se puede incluir un enlace al sitio web directamente en un script, lo que facilita la apertura del sitio web mientras se edita el código JSL: Web("http://nombre_de_la_url.com");
Importación de datos
JMP cuenta con diversas herramientas útiles para facilitar la importación de datos. Primero, se puede intentar guardar una tabla HTML directamente como un archivo JMP. Este método funciona mejor cuando los datos requieren poca reorganización. El segundo método consiste en guardar la tabla HTML como un archivo de valores separados por comas [CSV], que luego se puede importar a JMP con la configuración definida por el usuario, disponible a través de JSL. Tras examinar la tabla importada, observé varias columnas vacías. Con el comando "eliminar columnas", pude eliminarlas de la tabla mediante un breve script.

JMP extrae automáticamente la información de la web y guarda los archivos. No es necesario guardar estos archivos, pero los datos extraídos de la web pueden ser un poco confusos a veces. Guardar los datos en un archivo facilita la depuración, ya que se pueden consultar las tablas importadas y ajustar el código según sea necesario.
Método 1
Los datos se importan y se guardan como un archivo CSV, inicialmente:
ObjectName = Open(“http//:url_name1.com”, HTML Table(#))<< Set Name(“TableName1”) << Save(dir||“FileName1.csv”);
Método 2
Los datos se importan directamente en JMP y se guardan:
NombreObjeto = Abrir(“http://url_name2.com”, Tabla HTML(#)<< Establecer nombre(“TableName2”) << Guardar(dir||“FileName2.jmp”);

Procesamiento celular
Al ordenar los datos de caracteres en un script, incluso pequeñas variaciones en las cadenas importadas pueden dañar el código. En este caso, los playoffs estaban cerca y, para indicar que Nueva Inglaterra había conseguido el título de división, se insertó una "z" en su nombre. Afortunadamente, JMP ofrece diversos comandos para manipular cadenas dentro de las celdas.

En el siguiente script, JMP recorre cada fila de la columna "Equipo" y elimina las letras especificadas si aparecen al principio de la cadena. El comando "Para cada fila" facilita el bucle, aplicando un proceso a cada fila. La frase condicional "si, entonces" indica a JMP qué hacer cuando se cumplen las condiciones específicas. El comando "Contiene" devuelve la posición de un elemento especificado dentro de la cadena. El comando "Substr" (subcadena) devuelve parte de la cadena: comenzando en una posición específica, devuelve el número especificado de caracteres.

Tablas de combinación
Combinar tablas en JMP es fácil a través del menú "Tablas". Este menú ofrece múltiples opciones. Generalmente, uso "Unir" para combinar tablas con diferentes columnas, pero con las mismas etiquetas de fila. Uso "Concatenar" cuando combino tablas con diferentes etiquetas de fila, pero con las mismas columnas. En este caso, concatené información de varias tablas. Se creó una tabla para cada división de equipos. A continuación, ordené las filas del archivo resultante por nombre de equipo, alfabéticamente, para asegurar que las filas similares coincidan durante el proceso de unión posterior.

Crear una nueva tabla
Me resulta útil crear una tabla nueva antes de unir tablas. JMP permite crear una tabla nueva de dos maneras. Primero, se puede hacer mediante la interfaz gráfica de usuario. También se puede lograr mediante un script. En este caso, usé el comando "Nueva tabla" para crear una tabla nueva con el número adecuado de filas: una para cada equipo de fútbol. Luego, agregué la columna de nombres de los equipos con el comando "Nueva columna", estableciendo los valores con una lista.

Unir tablas
Unir tablas me resulta una tarea tediosa sin JMP. Por suerte, JMP cuenta con una interfaz gráfica de usuario (GUI) para unir tablas en el menú "Tablas". Aunque las convenciones de nomenclatura siempre son importantes, JMP renombra automáticamente las columnas que provienen de tablas diferentes que comparten el mismo nombre. En este caso, uní las tablas mediante la GUI y luego simplemente copié y pegué el script de la tabla resultante en mi script personalizado más grande. De lo contrario, habría tenido que escribir mucho (renombrar columnas) antes de unir las tablas. Repetí el proceso de unión muchas veces.

Cambiar el nombre y reformatear columnas
Una vez realizadas las uniones, tenía muchos nombres de columnas que sonaban raros. Para evitar confusiones, renombré esas columnas. Para ello, creé una lista de nombres preferidos. Luego, renombré las columnas combinando un bucle y la función "Establecer nombre".

A veces, JMP importa datos como una cadena, pero el usuario necesita un formato de columna diferente, como la hora. Esto es fácil de cambiar en la interfaz gráfica de JMP, pero también se puede lograr con un script JSL. En este caso, le informé a JMP que la columna contenía información de tiempo continua, en lugar de caracteres.
Reorganizar columnas
Una vez agregados los datos y creadas las nuevas columnas, es posible cambiar el orden de las columnas en la tabla de datos. Esto se hace fácilmente en JSL con el comando "Mover columnas seleccionadas".

Vista de tabla de datos
Aquí se muestra una vista parcial de la tabla de datos completada.

Desarrollar una matriz asociativa
Una vez que terminé de agregar los datos, llegó el momento de realizar un análisis. Lo primero que quería comparar era la fuerza relativa de los diferentes equipos, según su calendario competitivo, hasta ese momento de la temporada. Mi objetivo era predecir el rendimiento futuro de un equipo, no solo con base en su propio rendimiento pasado, sino también en relación con el de sus futuros oponentes. Para ello, tuve que comparar la información contenida en celdas ubicadas en diferentes filas y columnas de mi tabla. Crear una matriz asociativa (también conocida como diccionario o mapa hash) fue muy útil para esta tarea.
En JMP, se pueden usar listas, matrices o columnas en una matriz asociativa. En este caso, usé dos columnas con un valor predeterminado (nulo). La columna clave "EQUIPO" contenía los nombres abreviados de las ciudades de cada equipo. La columna de valor, llamada "Fuerza", era una columna de fórmula que calculaba un índice combinando victorias y puntos netos. Usé cada semana (una columna) del calendario de 17 semanas como claves para referenciar los valores de la matriz asociativa de esa semana.
Programa de 17 semanas: Claves

En el script, definí la matriz asociativa y creé una columna de fórmula para referenciarla. Nuevamente, la fórmula referencia el valor correcto mediante un subíndice de la matriz asociativa, utilizando el oponente semanal como clave. Si el valor de la columna clave no está en la matriz asociativa, la función devuelve un valor nulo (funciona bien con las semanas de descanso en el calendario).

Luego creé una nueva columna para cada semana para comparar la fuerza del equipo. Podría haber combinado estas dos fórmulas, pero preferí mantenerlas separadas para poder visualizar las diferentes métricas en la tabla de datos.

A continuación, conté el número de victorias previstas para la temporada. Una forma sencilla de contar los resultados de las columnas era crear una nueva columna de fórmula que contenía la suma de una serie de condiciones "Si-Entonces" para cada una de las 17 columnas. En este caso, si la diferencia en Fuerza era positiva, la predicción se consideraba una victoria y se contabilizaba.

Crear modelos de predicción
JMP ofrece diversas técnicas de modelado para la predicción. Muchas de ellas se acceden a través del menú "Analizar", incluyendo las plataformas "Ajustar modelo" y "Neural". Al crear un script personalizado, recomiendo desarrollar primero modelos óptimos en las plataformas de JMP. Después, se puede guardar el script del modelo en la tabla de datos (a través de la interfaz gráfica de usuario) y copiar y pegar el código en el script personalizado. También se puede usar JSL para guardar scripts de modelo en una tabla de datos. Esto ofrece a los usuarios la flexibilidad de configurar el modelo para que se ejecute automáticamente o de que esté disponible en la lista de scripts de la tabla de datos creada por el script personalizado.
He aquí un ejemplo:

Técnicas avanzadas de modelado en JMP Pro
JMP Pro ofrece varias técnicas avanzadas de modelado que no están disponibles en la versión estándar. Dos ejemplos son la versión optimizada de la red neuronal y la técnica de regresión generalizada de red elástica. Otra ventaja de JMP es su capacidad para realizar la validación de retención con una proporción especificada por el usuario, seleccionando automáticamente una muestra aleatoria de un conjunto de datos. Esto facilita tanto la validación como la comparación de modelos.
Red neuronal potenciada

Red elástica

A veces, el promedio de las predicciones de múltiples modelos puede superar el rendimiento de cada modelo.
Aquí creé una columna de fórmula en JSL que promedia dos fórmulas de predicción.

JMP Pro cuenta con una plataforma de comparación de modelos que permite comparar la efectividad relativa de varios modelos en paralelo. Esta plataforma también permite promediar varios modelos con solo unos clics.
Comparaciones de modelos

En este caso, el promedio de los modelos de Red Neuronal y Red Elástica (con validación de retención [HB]) tuvo un rendimiento ligeramente mejor que el de cualquiera de los dos modelos por separado. Otra característica útil de la plataforma de comparación de modelos son los gráficos de "valor real por predicción" y "residuo por fila".
Gráficos de comparación de modelos

Conclusión
Con el lenguaje de scripting JMP [JSL], JMP puede extraer datos de múltiples fuentes web, procesarlos, realizar múltiples predicciones, compararlas y mostrarlas, todo desde un solo script. El uso eficaz de JSL puede ahorrar mucho tiempo, especialmente cuando se requiere repetir un análisis periódicamente.