Preprocesamiento de Datos con Tableau Prep: Limpieza Drag & Drop de Datasets Tableau Prep

En mi empleo como consultor BI con Tableau he escuchado mucho la frase “Tableau no es un ETL” donde me ha tocado estar de acuerdo la mayor parte del tiempo. Independientemente de los recientes cambios que Tableau ha aplicado a su producto Tableau Desktop para mejorar el rendimiento con grandes volúmenes de datos, en la mayoría de los casos es necesario agregar un proceso de ETL como Talend o Pentaho previo al análisis y creación de reportes con Tableau Desktop. Conscientes de esto último, el año pasado (2018) Tableau libera al público el producto Tableau Prep Builder con la intención de brindar una herramienta Drag & Drop previa a la exploración de datos con Tableau Desktop. Como consultor de esta herramienta me vi entonces en el deber de explorar su potencial, conocer sus ventajas y su capacidad real para evaluar si es viable ofrecer a los clientes usarlo dentro de sus proyectos BI. Para ello, me propuse replicar el proceso de limpieza que alguna vez realicé en Python al popular dataset del Titanic estando atento al punto en el que la herramienta pueda llegar a quedarse corta y si de verdad es lo suficientemente cumplidora como para aplicarla a un proyecto más grande. Contexto previo y especificaciones Como parte de mi aprendizaje en ciencia de datos participé en la popular competición de Kaggle “ Titanic: Machine Learning from Disaster” hace más de un año, para este proyecto realicé la limpieza del dataset y la predicción con Python integrándose con exploración y análisis del dataset en Tableau. El proyecto puede leerse en este link y replicar el trabajo en Python de la preparación de los datos en la versión 2019.3 de Tableau Prep Builder. A lo largo de este artículo intentaré explicar las funcionalidades generales de Tableau Prep pero enfocándose en la comparación del trabajo realizado en Python vs el flujo creado en la herramienta.

Sección 1: Cargar el dataset

 

Como en la mayor parte de los datasets de Kaggle, el proceso de limpieza inicia con la lectura del archivo CSV de entrenamiento. Se utiliza pandas para asegurarse que la estructura de los datos sea la correcta y conocer, usando la función describe(), estadísticas descriptivas del dataset tales como la cantidad de registros, los valores máximos y mínimos de cada columna, entre otras.

Lectura del dataset en Python

Todo esto, debido a la incorporación de un sofisticado motor estadístico en Tableau, que cuando se lanza analiza automáticamente todos los datos en nombre del usuario, trae posibles explicaciones de los factores más relevantes que están impulsando un punto de datos en particular.

Descripción del dataset

En Tableau Prep la conexión con fuentes de datos en archivos de texto plano es tan simple como en Pandas, además, posee los ya conocidos asistentes de conexión nativos en Tableau Desktop para una gran cantidad de servidores como Hadoop, Teradata, MySQL, BigQuery, entre otros.

Algunas de las conexiones disponibles en Tableau Prep

En este punto Tableau Prep empieza a mostrar algunas de sus características que nos permitirán ahorrar tiempo. En caso de poseer múltiples archivos con la misma estructura, es posible realizar un ‘Wildcard Union’ que con un solo click solucionaría las múltiples concatenaciones que requerirían en Pandas. También, una vez conectados a con los datos podemos definir una muestra para trabajar en el flujo. Esto con el fin de que cada proceso dentro del flujo tenga un mejor rendimiento, ya que de todas formas al terminar el flujo en Prep la limpieza se aplicará a la totalidad de los datos.

Opciones disponibles al momento de conectarse a una fuente en Tableau Prep

También encontramos que la información que se obtiene desde el describe() de Pandas puede encontrarse en el ‘Profile Pane’ de Tableau Prep, donde encontraremos una descripción resumida de cada campo y podremos contrastar con la estructura tabular original (e inclusive aprovechar los efectos visuales).

Sección 2: Limpieza de valores nulos

Decidir qué hacer con los registros donde hay campos con valores nulos es una de las tareas más comunes de la limpieza de datos. Para este paso, construí una función para poder visualizar la cantidad de registros nulos de cada campo y el porcentaje del total que estos representan (dato que puede consultarse en Prep desde el ‘Profile Pane’).

Pandas en Python vs Profile Pane en Tableau Prep

A partir de la información de los campos en nulo decidí eliminar la columna ‘Cabin’ por la alta cantidad de nulos (recomendado incluso por Tableau Prep también), eliminar los dos registros nulos de la columna ‘Embarked’ y rellenar los valores nulos de ‘Age’ con un valor arbitrario para transformarlos luego.

Replicar estas acciones en Tableau Prep fue sencillo, intuitivo y solo requirió de un par de clicks. (El cambio a la variable Age lo trabajé en un punto más adelante en el flujo)

A este punto en el proceso de limpieza con Python empiezo a analizar el dataset en Tableau y decidido, a partir de los resultados, aplicar distintas transformaciones a las variables. Cabe resaltar que desde Tableau Prep podemos cargar los cambios en Tableau Desktop en cualquier momento del flujo.

Sección 3: Transformación de columnas

La primera transformación a partir del análisis en Tableau Desktop fue la creación de un campo ‘Family Size’ que se compone de la suma de los campos ‘Parch’ y ‘SibSp’. Para replicar el comportamiento en Tableau Prep solo fue necesario crear un campo calculado cuya fórmula es: [SibSp] + [Parch] Y luego simplemente eliminar las columnas sobrantes en el menú.

El siguiente paso fue la extracción del título en cada nombre. Dado que el nombre del pasajero como tal no agrega ninguna información al modelo, decidí extraer su titulo (Mr, Miss, Mrs, etc.) con el que se puede generalizar más a los pasajeros. Esto requirió de tan solo un par de clicks en Tableau Prep.

Luego se hizo un agrupamiento en el que solo los títulos ‘Master’, ‘Miss’, ‘Mr’ y ‘Mrs’ se mantuvieran, el resto sería agrupado como ‘Other’.

Para este comportamiento Tableau Prep brinda varias opciones de agrupamiento (entre las que se incluye agrupar por similitud de las palabras e inclusive pronunciación parecida).

El siguiente paso de la limpieza es quizá el más complejo, apoyado de Tableau Desktop obtuve la edad promedio de cada título y completé los registros nulos del campo edad con dicho valor.

Para emular este comportamiento de forma automática en Tableau Prep requerí crear un campo con este valor promedio (usando un proceso de agregación de Tableau Prep) y luego integrarlo al dataset mediante un proceso join, finalmente creé un campo calculado copia del campo ‘Age’ que tomaba el valor del campo del promedio si el registro es nulo.

Procesos de agregación y join de Tableau Prep

La fórmula usada en el campo calculado fue:
IF ISNULL([Age]) THEN
[Average Age]
ELSE
[Age]
END
Finalmente, el proceso de transformación de columnas termina con la eliminación del campo con el ID del pasajero y el número de tiquete (Similar al paso de eliminación de Cabin).

Sección 4: Adaptación del dataset para modelado

Hasta este punto el dataset está limpio en su totalidad y puede ser utilizado para análisis de patrones y creación de reportes. Como se ha podido evidenciar, todos los pasos se pudieron realizar en un mínimo esfuerzo con un conjunto de clicks y Tableau Prep ha cumplido su funcionalidad (limpiar los datos antes de la creación de reportes con Tableau Desktop). En este punto se puede agregar un proceso de salida que aplicaría todos los cambios al dataset y exportará el resultado en formato CSV o como extracto de Tableau Desktop para crear reportes. Sin embargo, hacen falta dos transformaciones adicionales que dejarían el dataset listo para entrenar modelos (Transformar las variables categóricas en un formato numérico de 1 y 0 para finalmente normalizarlas). En mi experiencia no pude encontrar una forma con la que pudiera aplicar estas dos trasformaciones de forma nativa en Tableau Prep (o que no requiera muchisimos procesos adicionales) pero fui capaz de integrar un script personalizado de Python para responder a mi necesidad. En este punto de integración con Python (aunque también se puede integrar con R) fue donde encontré las mayores falencias de Tableau Prep y es donde realmente puede llegar a quedarse corto. Primero, para la integración es necesario utilizar la librería TabPy de configuración bastante sencilla, un bloc que ayuda mucho a entender cómo hacer la integración de Python/R a Tableau Prep se encuentra aquí. Introducing support for custom R and Python scripts in Tableau Prep flows In the example in this post, Anton explains how to configure Prep Builder to run Python scripts and show some of the… www.tableau.com Básicamente es necesario que el script tenga una función principal que recibirá por parámetro un dataframe de Pandas y en ella debemos realizar toda nuestra transformación. Esta función la vincularemos en el UI de Tableau Prep solo digitando su nombre. Sin embargo, la verdadera desventaja es que debemos obligatoriamente incluir la función get_output_schema() que le indicará a Tableau Prep la estructura con la que quedará nuestro dataset al finalizar el script. El problema con esto es que debemos crear casi que manualmente la estructura, tarea bastante tediosa si nuestro dataset tiene muchas columnas (con más de 20 ya sería inviable).

Tras incluir estos scripts al flujo fui capaz de cumplir mi requerimiento. Inclusive pude dividir el flujo para en cualquier momento generar la matriz de los campos independientes X y el vector columna con la variable dependiente Y.

Conclusiones

Llegando al final de este experimento la conclusión final que puedo sacar es que, a pesar de su poco tiempo disponible al público, Tableau Prep sería capaz de simplificar muchos procesos comunes y algunos más complejos que se suelen hacer en ETL o en un proyecto de ciencia de datos. Específicamente para este proyecto, con poco esfuerzo permitió replicar el trabajo de más de 100 líneas de código antes de requerir la utilización de scripts externos. En general, son muy buenas las sensaciones que deja Tableau Prep y definitivamente es una herramienta que merece la oportunidad en algún proyecto de la industria. Evidentemente quedó expuesto en qué momento su capacidad quedó corta y qué problemas podrían presentarse en su utilización.

Como una última ventaja cabe resaltar lo simple que es replicar un flujo a una fuente de datos con la misma estructura. En Python por ejemplo se necesitaría replicar el código y ajustar los nombres de las variables si queremos aplicar la misma transformación al dataset de pruebas, en Tableau Prep con solo copiar y pegar obtendríamos el mismo resultado.

Adicionalmente, es interesante el hecho de que los flujos puedan guardarse en un formato empaquetado que incluye los scripts y archivos necesarios para replicar el flujo en cualquier otro equipo con Tableau Prep.

En fin, definitivamente es una herramienta que recomiendo usar y darle una oportunidad y de la que personalmente me emociona ver que nuevas funcionalidades pueda incluir en sus siguientes versiones.

Tableau mejora su velocidad de la información usando AI

Tableau es una plataforma de análisis integral que se dedica a desarrollar productos de visualización de datos de manera interactiva, para hacer estos más útiles. Desde antes de ser adquirida por Salesforce por $15.7 millones, Tableau ya estaba pensando en nuevas actualizaciones. Han pasado pocos meses y ya la compañía dio a conocer sus nuevas herramientas, incluida una característica llamada “Explain Data” que usa IA para llegar a percepción rápida.

El director de productos de Tableau, Francois Ajenstat explicó que Explain Data lleva a los usuarios de comprender lo que pasó, a la razón por la que sucedió. Es decir descubre y explica automáticamente lo que está pasando con los datos.

Todo esto, debido a la incorporación de un sofisticado motor estadístico en Tableau, que cuando se lanza analiza automáticamente todos los datos en nombre del usuario, trae posibles explicaciones de los factores más relevantes que están impulsando un punto de datos en particular.

Pero, ¿Qué significa esto para los usuarios?

Esto significa: Ahorro de tiempo. Los usuarios pasan a realizar el análisis automáticamente por ellos, cooperando a hacer un mejor análisis ya que se eliminan los sesgos y los ayuda a profundizar en los datos de manera automatizada.

Ajenstat afirma que esta es una mejora muy significativa, ya que anteriormente los usuarios debían realizar este trabajo manualmente.“Por lo tanto, un humano tendría que pasar por todas las combinaciones posibles, y la gente encontraría ideas increíbles, pero se manejó manualmente. Ahora con este motor, son capaces de impulsar la automatización para encontrar esos conocimientos automáticamente para los usuarios “, informó.

Además hizo énfasis en las dos principales ventajas que son la información significativa más rápida y una perspectiva más rápida de los datos. Todo esto gracias al uso de la inteligencia artificial.

Por otro lado, Tableau anunció una nueva función del Catálogo, que proporciona un rastreo de datos con la fuente de los datos, así los usuarios podrán saber de dónde proceden los datos y si son relevantes o fiables.

Por último, la compañía anunció una nueva herramienta de administración de servidores que ayuda a las empresas a organizar sus implementaciones de una manera más centralizada.

Tableau tiene alrededor de 86,000 clientes comerciales, incluidos Charles Schwab, Verizon (propietario de TC), Schneider Electric, Southwest y Netflix.

¿Sábes qué hacer en la Gestión de Datos Colaborativa?

El portal de Talend compartió algunos consejos al momento de realizar Gestión de Datos Colaborativa, aquí en Bera te los mencionamos. Cada vez es más común encontrar proyectos en la calidad de datos que sea realicen en colaboración y motivados por un equipo. La unión trae mejoras y eficacia al momento de trabajar en una transformación digital. Debido a que los profesionales de los distintos departamentos interactúan entre ellos para lograr un mayor éxito en sus operaciones.

 

¿Qué pasos seguir para lograrlo?

 

Establecer los objetivos desde el principio

¿Por qué se necesitan datos de calidad? ¿Cuál es el objetivo de la empresa? ¿Hasta qué punto impactará en el rendimiento empresarial de la organización? Estas son algunas preguntas que deben ser contestadas por los principales responsables de la empresa, para así poder establecer una meta final.

Construir un equipo interdisciplinar

Se necesita un equipo que esté constituido por un personal técnico adecuado y que además haya buena comunicación entre todos los integrantes, ya que se mezclan diferentes disciplinas se exige que la mayoría vayan al mismo ritmo para poder cumplir con los objetivos trazados, se debe indagar en los diferentes departamentos de la organización por los lideres o principales deparatamentos. Un ejemplo claro de la necesidad de la interdisciplinariedad es que en algunas ocasiones quienes se encargan del manejo del marketing no tienen claridad sobre los datos, entonces se produce un bajo rendimiento por causa de este error. Además, nuevas regulaciones como GDPR hicieron que los profesionales del marketing tomaran conciencia de la importancia de los datos personales.

Entregar logros rápidamente

El tiempo puede ser el mayor aliado o el peor enemigo en muchos de estos casos. Por tal razón los objetivos que se trazan deben ser viables de cumplir y que se puedan demostrar los datos de calidad. Dedicarle mucho tiempo a una planeación excesiva podría ser un error ya que se pide probar el impacto del negocio con resultados inmediatos, esto ayudará también a pedir recursos adicionales al Comité de Dirección. Finalmente, el tener las instrucciones claras desde el principio proporcionará una mayor probabilidad de éxito.

Ingeniería de Requerimientos en Proyectos de Ciencia de Datos

En ingeniería de software, antes de construir o diseñar cualquier proyecto, se lleva a cabo un proceso de reuniones y especificaciones de lo que el software a desarrollar debe y no debe hacer. Este es un proceso que en algunos casos es muy breve y en otros llega a tomar un tiempo considerable. Recientemente, estuve involucrado en realizar esta fase de ingeniería de requerimientos como parte de mi proyecto de grado, y siguiendo el mismo sendero del artículo de Favio Vázquez “Aprende a escuchar” y el episodio “Asking Good Questions as a Data Scientist” del webinar Data Science Live de Kristen Kehrer y Favio, en este artículo presento mi experiencia interactuando y haciendo preguntas con un stakeholder para mi proyecto de ciencia de datos desde una perspectiva un poco más de ingeniería de software.

 

Introducción y Contexto

El nombre de mi proyecto de grado es “Using Data Mining Techniques to Analyze and Predict Road Traffic Accidents in Barranquilla” y básicamente trata de utilizar datos públicos sobre accidentes de tráfico en la ciudad para diseñar un software de ciencia de datos tipo plataforma (DSaaP) con la intención de que no solo se pueda entender mejor el fenómeno de los accidentes en la ciudad, sino que también pueda hacerse una predicción de la frecuencia de los mismos teniendo en cuenta factores específicos de la ciudad. Como parte del proceso académico se debe contactar con un posible cliente (preferiblemente experto en el tipo de negocio donde se ubica el proyecto) y llevar a cabo un proceso de ingeniería de requerimientos de software, éste incluye fases de estudio de viabilidad, obtención, especificación y validación de requerimientos. En este artículo explicaré cómo se pueden aplicar algunas técnicas propias de esta metodología para un proyecto de ciencia de datos utilizando como ejemplo mi proyecto final.

Metodología para Proyectos de Ciencia de Datos

La metodología de trabajo utilizada para el proyecto es CRISP-DM (Cross Industry Standard Process for Data Mining) y la fase en la que nos ubicamos en este artículo es la primera, entendimiento del negocio (Business Understanding)

CRISP-DM es una metodología iterativa, quiere decir que los pasos no expresan un flujo lineal riguroso de las fases, y que cada proyecto puede requerir una cantidad de iteraciones diferente para cada tarea.

Según los expertos Foster Provost y Tom Fawcett, en esta fase es vital comprender los marcos de trabajo del cliente con la intención de diseñar la solución al problema como un conjunto de subproblemas que involucren la utilización de técnicas como clasificación, regresión o clustering.

A grandes rasgos las preguntas que se deberían tratar de resolver son, por ejemplo, ¿Qué se debe hacer exactamente en la compañía?, ¿Qué partes del contexto empresarial contribuirían con el diseño de la solución?

Si relacionamos lo anterior con la ingeniería de software, se podría hacer una analogía con el estudio de viabilidad. En él se comprende una evaluación y reportaje a un conjunto de preguntas que intentan determinar si el sistema a desarrollar (en nuestro caso el proyecto de ciencia de datos) realmente contribuye a los objetivos del negocio.

Así, podríamos agregar a las preguntas propuestas inicialmente por Provost y Fawcett las siguientes interrogantes del estudio de viabilidad del software:

  • Teniendo en cuenta los objetivos generales de la compañía, ¿contribuye el proyecto a facilitar la realización de ese objetivo?
  • ¿Cómo puede integrarse el proyecto a otros que existen en la organización?
  • ¿Cuáles son los problemas actuales en los procesos?¿Cómo este proyecto los resuelve?
  • ¿A qué NO necesita ayudar el proyecto?

 

Inicio del proyecto

Una vez se ha determinado que el proyecto es viable y realmente aporta a los objetivos de la compañía (incluyendo ya unas ideas generales de los subproblemas a solucionar) es necesario identificar las preguntas correctas para el análisis, más que todo porque hasta este punto se tiene una idea muy amplia del problema y de la pregunta inicial a la que como científicos de datos el gerente del proyecto nos ha pedido solucionar, pero como dice Kirill Eremenko en su libro, esa pregunta debe ser primero entendida, deconstruida y analizada. Algunas preguntas importantes cuya solución podrían ayudar a un mejor entendimiento de la verdadera pregunta a solucionar con el proyecto son:

  • ¿Cómo ha solucionado la competencia problemas similares al que se pretende abordar?
  • ¿Cómo obtiene la compañía sus datos?¿Qué métodos usa para recolectarlos?
  • ¿Cuáles son los indicadores clave de rendimiento (KPI) de los proyectos en la misma área?
  • ¿Qué características o patrones del contexto sería importante tener en cuenta para solucionar el problema? (pueden ser simples hipótesis o corazonadas)

Las anteriores preguntas llevadas al contexto de la ingeniería del software serían un equivalente a la segunda fase del proceso de ingeniería de requerimientos “obtención y análisis de requerimientos” que se compone de cuatro actividades principales:

  • Descubrimiento de requerimientos: Es el proceso de interactuar con los stakeholders y recolectar sus requerimientos.
  • Clasificación y organización de requerimientos: Implica tomar los requerimientos del ítem anterior y clasificarlos en grupos coherentes de acuerdo a la relación entre los requerimientos.
  • Ordenación por prioridades y negociación de requerimientos: Aquí se debe negociar con los stakeholders un orden de prioridades de los grupos de requerimientos.
  • Documentación de requerimientos: Se crea un reporte del proceso de los requerimientos y su prioridad final.

Aplicar estas técnicas de ingeniería de software en las primeras fases servirán para mantener informados a los stakeholders del alcance y la delimitación del proyecto además de ayudar a que no se pierda tiempo en fases posteriores redefiniendo los requerimientos. Llegados a este punto lo único que resta para poner en marcha las siguientes fases del proyecto es realizar una última validación de los requerimientos, en este paso se obtendría una noción del costo y el tiempo que requerirá llevar a cabo el proyecto de acuerdo a los lineamientos de los stakeholders.

La validación de requerimientos incluye las siguientes fases:

  • Verificaciones de validez: Los resultados del proyecto están acordes a los objetivos de la compañía.
  • Verificaciones de consistencia: Los requerimientos definidos no deben contradecirse de ninguna forma.
  • Verificaciones de completitud: Las restricciones y limitaciones están bien definidas.
  • Verificaciones de realismo: Todos los requerimientos se pueden implementar con las herramientas disponibles.
  • Verificabilidad: Todos los requerimientos son medibles.

Una vez se finaliza la validación de requisitos se puede continuar con el proceso normal de desarrollo del proyecto.

 

Ejemplo

Para digerir de forma mucho más ligera toda la información anterior, contaré como apliqué ingeniería de requerimientos en mi proyecto de grado de la universidad. Utilizando datos públicos sobre accidentes de tránsito en la ciudad (divididos en tres conjuntos de datos: detalle de la zona, detalle de las víctimas, detalle de los vehículos) inicialmente se planteó el proyecto con la intención de construir un modelo para predecir la frecuencia de dichos accidentes usando técnicas de series de tiempo como ARIMA.

Mi stakeholder es un funcionario de la entidad pública encargada del estudio y las intervenciones en la ciudad en pro de la reducción de estos accidentes, contacto que conseguí por un tercero (amigo de un amigo que conoce a alguien…).

Para este caso, el problema como tal se tenia brevemente definido como “reducir la cantidad de accidentes de la ciudad”, con este planteamiento preliminar me reuní con mi contacto para comentarle del proyecto y hacerle preguntas.

 

Estudio de viabilidad

Dado mi reducido conocimiento en temas de administración pública, procedí a hacerle preguntas equivalentes a un estudio de viabilidad.

  • ¿Qué tipo de acciones se llevan a cabo para alcanzar los objetivos de la compañía (reducción de accidentes)?
  • ¿Existe alguna necesidad que deba ser resulta en la que un proyecto como el presente pueda ayudar?

Con estas preguntas, el stakeholder pudo explicarme la forma como trabaja la entidad pública encargada de los accidentes y además me comentó que él percibe una necesidad en la capacidad de hacer simulaciones para estudios más complejos que los actuales.

Así mismo, con la descripción de los marcos de trabajo que utilizan pude determinar claramente a qué NO debería apuntar el proyecto, ésto fue realmente útil para modelar la pregunta final con la que se continuará en las siguientes fases del proyecto.

 

Obtención y Análisis de Requerimientos

Para este punto ya había determinado que un proyecto cómo el que tenía en mente si es significativo para el objetivo de reducir los accidentes de tránsito y pude considerar algunas modificaciones pequeñas para adaptarlo a las necesidades del stakeholder.

Seguí con la obtención y análisis de requerimientos preguntando cómo se recolectan los datos, los tipos de patrones que se consideran más significativos en los accidentes de tránsito, cómo se evalúan proyectos en la misma área y qué tipo de usuarios utilizarían la solución y para qué tareas en específico.

 

Especificación de Requerimientos

Estas preguntas permitieron que entendiera el contexto en el que se desenvuelve el proyecto y encaminarlo hacia una solución de utilidad. Con estas preguntas entendí que la principal problemática en la forma de trabajar es que las decisiones sobre las intervenciones en las calles se toman basadas en reportajes que arroja de un sistema que marca las zonas críticas de la ciudad conforme más accidentes ocurren (reportados por la policía de tránsito).

El proyecto entonces debe ayudar a poder predecir dichos accidentes, cosa que las intervenciones se hagan anticipándose a lo que va a pasar y no sobre lo que ya está pasando. Adicionalmente, el modelo de predicción se cambió de ARIMA a Prophet by Facebook, el cambio basado en las caracteristicas de Prophet que permitirían realizar experimentos (simulaciones) de tal forma que el modelo las tenga en cuenta a la hora de hacer las predicciones tales como puntos de cambio que representan la fecha de las distintas intervenciones que se implementarían, patrones de estacionalidad a partir de las estadísticas reportadas en otros proyectos de la industria y por ultimo el efecto de días festivos.

Habiendo dejado todo esto claro se puede seguir a las fases de desarrollo con la certeza de que se han explorado los posibles caminos para resolver el problema y se ha escogido uno en el que se han puesto de acuerdo las necesidades del problema, las anteriores soluciones y los requerimientos de los stakeholders.

 

Bibliografía

  • Provost, F., & Fawcett, T. (2013). Data Science for Business: What you need to know about data mining and data-analytic thinking. “ O’Reilly Media, Inc.”.
  • Sommerville, I. (2005). Ingeniería del software. Pearson educación.
  • Eremenko, K. (2018). Confident Data Skills: Master the Fundamentals of Working with Data and Supercharge Your Career. Kogan Page Publishers.
en_USEN