Guillermo Baum ( wjbaum ), estudiante de posgrado en estadística, Universidad de New Hampshire
Mi proyecto es uno que utiliza JMP Scripting Language para extraer datos de varios sitios web para predecir victorias en el fútbol profesional. El script automatiza un proceso 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 la salida de fórmulas de columna en filas separadas. Finalmente, se comparan los resultados de múltiples modelos predictivos. El propósito de este proyecto es principalmente ilustrar los usos de JSL para automatizar los procesos de recopilación, organización y predicción de datos, de manera repetible.
Introducción
Hace aproximadamente dos años, supe que JMP podía extraer datos de la web con JMP Scripting Language [JSL]. Como estudiante de posgrado en estadística, a menudo busco datos de práctica para perfeccionar mis habilidades analíticas y mejorar mi codificación.Da la casualidad de que soy un ávido fanático del fútbol americano y las estadísticas deportivas están disponibles en línea de muchas fuentes diferentes.Como ejercicio, intenté predecir el total de victorias en una temporada para cada equipo de fútbol profesional, con datos extraídos de la web.
Las técnicas de raspado y limpieza de datos se pueden aplicar a cualquier dato que esté disponible en forma de tablas html en la web.Me parece sorprendente que JSL se pueda usar para automatizar la limpieza de datos y realizar el modelado dentro de un solo script o grupo compuesto de scripts.Además, JMP ayuda a aquellos con experiencia limitada en programación, al permitirles a los usuarios realizar un análisis a través de su interfaz gráfica de usuario [GUI] y, luego, guardar el proceso como un script que se puede reutilizar. Esto ahorra a los usuarios mucho tiempo al repetir análisis con datos nuevos o actualizados.
Configuración
El primer paso fue crear carpetas en las que almacenar los archivos que se crearían durante el proceso de agregación de datos.Descubrí que crear una carpeta para cada fuente de datos funcionó bien para organizar los muchos archivos producidos.

A continuación, le pedí al usuario del script que asignara una ruta local para el almacenamiento de archivos, para crear un código más limpio: dir = Seleccionar directorio ("Seleccionar directorio para almacenamiento de archivos", mostrar archivos (0));
Esta ruta local también se puede codificar de forma rígida.
Una vez que se seleccionó una ruta, los datos se extrajeron de varios sitios web y se guardaron en archivos individuales (uno para cada tabla HTML).Estos archivos fueron referenciados posteriormente, durante la etapa de agregación de datos.
Raspado de datos
Con JMP, uno simplemente debe copiar y pegar los nombres de URL en el código JSL desde la barra de direcciones de un navegador.También se puede poner un enlace al sitio web directamente en un script, lo que ayuda a abrir el sitio web mientras se edita el código JSL: Web(" http://nombre_url.com ");
Importación de datos
JMP tiene una variedad de herramientas útiles para ayudar a la importación de datos.Primero, uno puede intentar guardar una tabla html como un archivo JMP, directamente.Este método funciona mejor cuando los datos requieren poca reorganización.El segundo método consiste en guardar primero la tabla html como un archivo de valores separados por comas [CSV], que luego se puede importar a JMP con configuraciones definidas por el usuario que están disponibles a través de JSL.Después de mirar la tabla importada, noté varias columnas vacías.Usando el comando "eliminar columnas", pude eliminar las columnas vacías de mi tabla con un breve script.

JMP extrae automáticamente la información de la web y guarda los archivos.No necesariamente es necesario guardar estos archivos, pero los datos extraídos de la web pueden ser un poco complicados a veces.Guardar datos en un archivo facilita la depuración, porque uno puede mirar las tablas importadas y ajustar el código, según sea necesario.
Método 1
Los datos se importan y 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 a JMP y se guardan:
NombreObjeto = Abrir(“ http://url_name2.com” , Tabla HTML(#)<< Establecer nombre(“NombreTabla2”) << Guardar(dir||“NombreArchivo2.jmp”);

Procesamiento celular
Al clasificar los datos de los caracteres en un script, incluso las ligeras variaciones en las cadenas importadas pueden estropear el código.En este caso, los playoffs estaban cerca y para indicar que New England había ganado un título de división, se insertó una "z" en su nombre. Afortunadamente, JMP ofrece una variedad de comandos para manipular cadenas dentro de las celdas.

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

Combinando Tablas
Combinar tablas en JMP es fácil a través del menú "Tablas".El menú Tablas ofrece múltiples opciones.En general, uso "Unir" para combinar tablas que tienen diferentes columnas, pero las mismas etiquetas de fila. Uso "Concatenar" cuando combino tablas con diferentes etiquetas de fila, pero las mismas columnas.En este caso, concatené información de varias tablas.Se había creado una tabla para cada división de equipos.A continuación, clasifiqué las filas del archivo resultante por nombre de equipo, en orden alfabético, para asegurarme de que las filas coinciden durante el proceso de unión, más adelante.

Crear una nueva tabla
Encuentro útil crear una nueva tabla, antes de unir tablas.JMP permite a los usuarios crear una nueva tabla de varias maneras.Primero, se puede hacer a través de la GUI.También se puede lograr a través de un script.En este caso, utilicé el comando "Nueva tabla" para crear una nueva tabla con el número adecuado de filas: una para cada equipo de fútbol.Luego agregué la columna de nombres de equipo con el comando "Nueva columna", configurando los valores con una lista.

Unión de mesas
Encuentro que unir tablas es una tarea molesta sin JMP.Afortunadamente, JMP tiene una buena GUI para unir tablas en el menú "Tablas". Aunque las convenciones de nombres siempre son importantes, JMP automáticamente cambia el nombre de las columnas que se originan en diferentes tablas que comparten el mismo nombre.En este caso, uní las tablas a través de la GUI y luego simplemente copié y pegué la secuencia de comandos de la tabla resultante en mi secuencia de comandos personalizada más grande.De lo contrario, habría tenido que escribir mucho (cambiar el nombre de las columnas) antes de unir las tablas. Repetí el proceso de unión muchas veces.

Cambiar el nombre y reformatear columnas
Una vez que se lograron las uniones, tuve muchos nombres de columna que sonaban extraños.Para eliminar la confusión, cambié el nombre de esas columnas. Para hacerlo, primero creé una lista de nombres preferidos.Luego, cambié el nombre de las columnas usando la combinación de 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 GUI de JMP, pero también se puede lograr en un script JSL.En este caso, le informé a JMP que la columna contenía información de tiempo continuo, en lugar de carácter.
Reorganizar columnas
Una vez que se agregan los datos y se crean nuevas columnas, es posible que desee cambiar el orden de las columnas en la tabla de datos.Se logra fácilmente en JSL con el comando "Mover columnas seleccionadas".

Vista de tabla de datos
Aquí hay una vista parcial de la tabla de datos completa.

Desarrollar matriz asociativa
Una vez que terminé de agregar los datos, llegó el momento de hacer un análisis.Lo primero que quería comparar era la fortaleza relativa de los diferentes equipos, en función de la solidez de su calendario, hasta ese momento de la temporada. Mi objetivo era predecir qué tan fuerte sería el desempeño futuro de un equipo, no solo en función de su propio desempeño anterior, sino también en relación con el desempeño pasado de sus futuros oponentes.Para hacerlo, tuve que comparar la información contenida en celdas ubicadas en diferentes filas y columnas de mi tabla.La creación de 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 de las ciudades abreviadas de cada equipo.La columna de valor, llamada "Fuerza", era una columna de fórmula que calculaba un índice, combinando ganancias y puntos netos.Utilicé cada semana (una columna) del calendario de juegos de 17 semanas como claves para hacer referencia a los valores de la matriz asociativa para esa semana.
Horario de 17 semanas: Claves

En el script, definí la matriz asociativa, luego creé una columna de fórmula para hacer referencia a ella.Nuevamente, la fórmula hace referencia al valor correcto a través de un subíndice de la matriz asociativa, utilizando el oponente semanal como clave.Si el valor en la columna clave no está en la matriz asociativa, la función devuelve un valor nulo (funciona bien con semanas de descanso en el programa).

Luego creé una nueva columna para cada semana para comparar la fuerza del equipo.Estas dos fórmulas podrían haberse unido, 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 la columna 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 ganadora y se contaba.

Crear modelos de predicción
JMP tiene una variedad de técnicas de modelado para la predicción.Se accede a muchas técnicas a través del menú "Analyze", incluidas las plataformas "Fit Model" y "Neural".Al crear un script personalizado, recomiendo desarrollar primero modelos óptimos en las plataformas de JMP. Luego, se puede guardar el script del modelo en la tabla de datos (a través de la GUI) y copiar y pegar el código en el script personalizado.También se puede usar JSL para guardar scripts modelo en una tabla de datos.Esto brinda a los usuarios la flexibilidad de configurar el modelo para que se ejecute automáticamente o hacer que el modelo esté disponible en la lista de secuencias de comandos de la tabla de datos de la tabla creada por la secuencia de comandos personalizada.
Aquí hay un ejemplo.

Técnicas avanzadas de modelado en JMP Pro
Varias técnicas de modelado avanzadas están disponibles en JMP Pro, que no están disponibles en la versión estándar de JMP.Dos ejemplos son la versión mejorada de la red neuronal y la técnica de regresión generalizada de red elástica.Otra buena cualidad de JMP es su capacidad para realizar una 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 varios modelos puede superar el rendimiento del modelo individual.
Aquí creé una columna de fórmula en JSL que promedia dos fórmulas de predicción.

JMP Pro tiene una plataforma de comparación de modelos, en la que los usuarios pueden comparar la efectividad relativa de múltiples modelos, uno al lado del otro.La plataforma de comparación de modelos también brinda a los usuarios el poder de promediar múltiples modelos juntos, con solo unos pocos clics.
Comparaciones de modelos

En este caso, el promedio de los modelos Neural Net y Elastic Net (con validación de retención [HB]) se desempeñó ligeramente mejor que cualquiera de los dos modelos individuales solos.Otra buena característica de la plataforma de comparación de modelos son los gráficos "real por predicho" y "residual por fila".
Gráficos de comparación de modelos

Conclusión
Con JMP Scripting Language [JSL], JMP puede extraer datos de múltiples fuentes web, procesar los datos, realizar múltiples predicciones, compararlas y mostrarlas, todo dentro de una sola secuencia de comandos.El uso efectivo de JSL puede ahorrar mucho tiempo, especialmente cuando se debe repetir un análisis con regularidad.