Plataforma de Business Intelligence: tutorial sobre el uso de la canalización de agregación de MongoDB
Publicado: 2022-03-11Usar datos para responder preguntas interesantes es lo que los investigadores están haciendo en el mundo actual impulsado por datos. Dados los enormes volúmenes de datos, el desafío de procesarlos y analizarlos es grande; particularmente para estadísticos o analistas de datos que no tienen tiempo para invertir en el aprendizaje de plataformas de inteligencia comercial o tecnologías proporcionadas por el ecosistema Hadoop, Spark o bases de datos NoSQL que les ayudarían a analizar terabytes de datos en minutos.
La norma hoy en día es que los investigadores o estadísticos construyan sus modelos sobre subconjuntos de datos en paquetes de análisis como R, MATLAB u Octave, y luego entreguen las fórmulas y los pasos de procesamiento de datos a los equipos de TI que luego crean soluciones de análisis de producción.
Un problema con este enfoque es que si el investigador se da cuenta de algo nuevo después de ejecutar su modelo en todos los datos en producción, el proceso debe repetirse nuevamente.
¿Qué pasaría si el investigador pudiera trabajar con un desarrollador de MongoDB y ejecutar su análisis en todos los datos de producción y usarlos como su conjunto de datos exploratorio, sin tener que aprender ninguna tecnología nueva o lenguajes de programación complejos, o incluso SQL?
Si usamos Aggregation Pipeline y MEAN de MongoDB de manera efectiva, podemos lograr esto en un tiempo razonablemente corto. A través de este artículo y el código que está disponible aquí en este repositorio de GitHub, nos gustaría mostrar lo fácil que es lograr esto.
La mayoría de las herramientas de Business Intelligence que están en el mercado brindan formas para que los investigadores importen conjuntos de datos de NoSQL y otras tecnologías de Big Data a la herramienta, luego las transformaciones y el análisis se realizan dentro de la herramienta. Pero en este tutorial de inteligencia de negocios estamos usando el poder de MongoDB Aggregation Pipeline sin sacar los datos de MongoDB, y el investigador está usando una interfaz simple para hacer todo tipo de transformaciones en un sistema de big data de producción.
Pipeline de agregación de MongoDB para Business Intelligence
En pocas palabras, la canalización de agregación de MongoDB es un marco para realizar una serie de transformaciones de datos en un conjunto de datos. La primera etapa toma la colección completa de documentos como entrada y, a partir de entonces, cada etapa subsiguiente toma el conjunto de resultados de la transformación anterior como entrada y produce una salida transformada.
Hay 10 tipos de transformaciones que se pueden usar en una canalización de agregación:
$geoNear: genera documentos en orden del más cercano al más lejano desde un punto específico
$match: filtra el registro de entrada establecido por cualquier expresión dada
$proyecto: crea un conjunto de resultados con un subconjunto de campos de entrada o campos calculados
$redact: restringe el contenido de los documentos en función de la información del documento
$unwind: toma un campo de matriz con n elementos de un documento y devuelve n documentos con cada elemento agregado a cada documento como un campo que reemplaza esa matriz
$group: agrupa por una o más columnas y realiza agregaciones en otras columnas
$límite: selecciona los primeros n documentos de los conjuntos de entrada (útil para cálculos de percentiles, etc.)
$skip: ignora los primeros n documentos del conjunto de entrada
$sort: ordena todos los documentos de entrada según el objeto dado
$out: toma todos los documentos devueltos de la etapa anterior y los escribe en una colección
Excepto por el primero y el último de la lista anterior, no hay reglas sobre el orden en que se pueden aplicar estas transformaciones. $out debe usarse solo una vez, y al final, si queremos escribir el resultado de la canalización de agregación en una colección nueva o existente. $geoNear solo se puede usar como la primera etapa de una canalización.
Para que las cosas sean más fáciles de entender, analicemos dos conjuntos de datos y dos preguntas relevantes para estos conjuntos de datos.
Diferencia en Salarios por Designación
Para explicar el poder de la canalización de agregación de MongoDB, hemos descargado un conjunto de datos que contiene información sobre los salarios del personal docente universitario de todo Estados Unidos. Estos datos están disponibles en nces.ed.gov. Disponemos de datos de 7598 instituciones con los siguientes campos:
var FacultySchema = mongoose.Schema({ InstitutionName : String, AvgSalaryAll : Number, AVGSalaryProfessors : Number, AVGSalaryAssociateProfessors : Number, AVGSalaryAssistantProfessors : Number, AVGSalaryLecturers : Number, AVGSalaryInstructors : Number, StreetAddress : String, City : String, State : String, ZIPCode : String, MenStaffCount : Number, WomenStaffCount : Number }
Con estos datos queremos saber (en promedio) cuál es la diferencia entre los salarios de los profesores asociados y los profesores por estado. Entonces, un profesor asociado puede darse cuenta en qué estado es más valorado que un profesor en términos de salario.
Para responder a esta pregunta, un investigador primero debe eliminar los datos incorrectos de la recopilación, porque hay algunas filas/documentos en nuestro conjunto de datos donde el salario promedio es una cadena nula o vacía. Para lograr esta limpieza del conjunto de datos agregaremos la siguiente etapa:
{$match: {AVGSalaryProfessors: {$not: {$type: 2}}, AVGSalaryAssociateProfessors: {$not: {$type: 2}}}}
Esto filtrará todas las entidades que tienen valores de cadena en esos dos campos. En MongoDB, cada tipo se representa con un número único; para cadenas, el número de tipo es 2.
Este conjunto de datos es un buen ejemplo porque en el análisis de datos del mundo real, los ingenieros a menudo también tienen que lidiar con la limpieza de datos.
Ahora que tenemos algunos datos estables, podemos continuar con la siguiente etapa donde promediaremos los salarios por estado:
{$group: {_id: "$State", StateAVGSalaryProfessors: {$avg: "$AVGSalaryProfessors"}, StateAVGSalaryAssociateProfessors: {$avg: "$AVGSalaryAssociateProfessors"}}}
Solo necesitamos ejecutar una proyección del conjunto de resultados anterior y obtener la diferencia en los salarios promedio estatales, como se muestra a continuación en la Etapa 3 de nuestra canalización:
{$project: {_ID: 1, SalaryDifference: {$subtract: ["$StateAVGSalaryProfessors", "$StateAVGSalaryAssociateProfessors"]}}}
Esto debería darnos la diferencia salarial promedio a nivel estatal entre profesores y profesores asociados de un conjunto de datos de 7519 instituciones educativas en todo EE. UU. Para que sea aún más conveniente interpretar esta información, hagamos una ordenación simple para que sepamos qué estado tiene la menor diferencia agregando una etapa $sort:

{$sort: { SalaryDifference: 1}}
A partir de este conjunto de datos, es evidente que Idaho, Kansas y West Virginia son tres estados donde la diferencia en los salarios de los profesores asociados y los profesores es menor en comparación con todos los demás estados.
La canalización de agregación completa generada para esto se muestra a continuación:
[ {$match: {AVGSalaryProfessors: {$not: {$type: 2}}, AVGSalaryAssociateProfessors: {$not: {$type: 2}}}}, {$group: {_id: "$State", StateAVGSalaryProfessors: {$avg: "$AVGSalaryProfessors"}, StateAVGSalaryAssociateProfessors: {$avg: "$AVGSalaryAssociateProfessors"}}}, {$project: {_ID: 1, SalaryDifference: {$subtract: ["$StateAVGSalaryProfessors", "$StateAVGSalaryAssociateProfessors"]}}}, {$sort: { SalaryDifference: 1}} ]
El conjunto de datos resultante que aparece se ve así. Los investigadores también pueden exportar estos resultados a CSV para generar informes utilizando paquetes de visualización como Tableau o mediante gráficos simples de Microsoft Excel.
Salario promedio por tipo de empleo
Otro ejemplo que exploraremos en este artículo involucra un conjunto de datos obtenido de www.data.gov. Dada la información de nómina de todas las organizaciones gubernamentales estatales y locales en los Estados Unidos de América, nos gustaría calcular el salario promedio de los empleados de "Administración financiera" de tiempo completo y tiempo parcial en cada estado.
El conjunto de datos se ha importado, lo que da como resultado documentos de 1975 donde cada documento sigue este esquema:
mongoose.Schema({ State : String, GovernmentFunction : String, FullTimeEmployees : Number, VariationPCT : Number, FullTimePay : Number, PartTimeEmployees : Number, PartTimePay : Number, PartTimeHours : Number, FullTimeEquivalentEmployment : Number, TotalEmployees : Number, TotalMarchPay : Number }, {collection: 'payroll'});
La respuesta a esta pregunta puede ayudar a un empleado de Administración Financiera a elegir el mejor estado para mudarse. Con nuestra herramienta basada en la canalización del agregador MongoDB, esto se puede hacer con bastante facilidad:
En la primera etapa, filtre en la columna GovernmentFunction para descartar todas las entidades que no sean "Administración financiera":
{$match:{GovernmentFunction:'Financial Administration'}}
En la siguiente etapa del tutorial, agruparemos las entidades por estado y calcularemos los salarios promedio de tiempo completo y tiempo parcial en cada estado:
{$group: {_id: '$State', FTP_AVG: {$avg: '$FullTimePay'}, PTM_AVG: {$avg: '$PartTimePay'}}}
Finalmente, ordenaremos los resultados de los estados que pagan más a los estados que pagan menos:
{$sort: {FTP_AVG: -1, PTM_AVG: -1}}
Esto debería permitir que la herramienta genere la siguiente canalización de agregación:
[ {$match:{GovernmentFunction:'Financial Administration'}}, {$group: {_id: '$State', FTP_AVG: {$avg: '$FullTimePay'}, PTM_AVG: {$avg: '$PartTimePay'}}}, {$sort: {FTP_AVG: -1, PTM_AVG: -1}} ]
Ejecutar la tubería de agregación debería producir algunos resultados como este:
Bloques de construcción
Para crear esta aplicación de inteligencia comercial, usamos MEAN, que es una combinación de MongoDB, ExpressJS, AngularJS y NodeJS.
Como ya sabrá, MongoDB es una base de datos de documentos sin esquema. Aunque cada documento que almacena tiene un tamaño limitado a 16 MB, su flexibilidad y rendimiento, junto con el marco de canalización de agregación que proporciona, hacen que MongoDB se ajuste perfectamente a esta herramienta. Comenzar con MongoDB es muy fácil, gracias a su completa documentación.
Node.js, otro componente integral de MEAN, proporciona el entorno Javascript del lado del servidor basado en eventos. Node.js ejecuta Javascript usando el motor V8 de Google Chrome. Las promesas de escalabilidad de Node.js es lo que está impulsando a muchas organizaciones hacia él.
Express.js es el marco de aplicación web más popular para Node.js. Facilita la creación de API o cualquier otro tipo de capa empresarial del lado del servidor para aplicaciones web. Es muy rápido debido a su naturaleza minimalista, pero también es bastante flexible.
AngularJS, creado y mantenido por varios ingenieros de Google, se está convirtiendo rápidamente en uno de los marcos de Javascript de front-end más populares disponibles a nuestra disposición.
Hay dos razones por las que MEAN es tan popular y nuestra elección para el desarrollo de aplicaciones en techXplorers:
El conjunto de habilidades es simple. Un ingeniero que entiende JavaScript es bueno para trabajar en todas las capas.
La comunicación entre el front-end, el negocio y las capas de la base de datos ocurre a través de objetos JSON, lo que nos ahorra un tiempo significativo en el diseño y desarrollo en diferentes capas.
Conclusión
En este tutorial de canalización de agregación de MongoDB, hemos demostrado una forma rentable de brindar a los investigadores una herramienta en la que pueden usar datos de producción como conjuntos de datos exploratorios y ejecutar diferentes conjuntos de transformaciones para analizar y construir modelos a partir de ellos.
Pudimos desarrollar e implementar esta aplicación de principio a fin en solo 3 días. Esta aplicación fue desarrollada por un equipo de 4 ingenieros experimentados (2 en los EE. UU. y 2 en la India) y un diseñador y experto en UX independiente que nos ayudó con algunas ideas sobre el diseño de la interfaz. En algún momento en el futuro, me tomaré el tiempo para explicar cómo funciona este nivel de colaboración para crear productos increíbles en un tiempo increíblemente corto.
Esperamos que aproveche la canalización de agregación de MongoDB y ponga el poder en manos de sus investigadores, quienes pueden cambiar el mundo con sus análisis e ideas inteligentes.
Esta aplicación está disponible para jugar aquí.