Servicio para la Mejora de Resultados en campañas de Email

Anuncio
UNIVERSIDAD DE CASTILLA-LA MANCHA
ESCUELA SUPERIOR DE INFORMÁTICA
GRADO EN INGENIERÍA INFORMÁTICA
TECNOLOGÍA ESPECÍFICA DE
TECNOLOGÍAS DE LA INFORMACIÓN
TRABAJO FIN DE GRADO
Servicio para la Mejora de Resultados en
campañas de Email Marketing
Jesús Botella Blanco
Septiembre, 2014
S ERVICIO PARA LA M EJORA DE R ESULTADOS EN CAMPAÑAS DE E MAIL
M ARKETING
UNIVERSIDAD DE CASTILLA-LA MANCHA
ESCUELA SUPERIOR DE INFORMÁTICA
Tecnologías y Sistemas de Información
TECNOLOGÍA ESPECÍFICA DE
TECNOLOGÍAS DE LA INFORMACIÓN
TRABAJO FIN DE GRADO
Servicio para la Mejora de Resultados en
campañas de Email Marketing
Autor: Jesús Botella Blanco
Director: Luis Jiménez Linares
Director: Ignacio Arriaga Sánchez
Septiembre, 2014
Jesús Botella Blanco
Ciudad Real – Spain
E-mail: [email protected]
Teléfono: 666 690 512
c 2014 Jesús Botella Blanco
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU
Free Documentation License, Version 1.3 or any later version published by the Free Software
Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy
of the license is included in the section entitled "GNU Free Documentation License".
Se permite la copia, distribución y/o modificación de este documento bajo los términos de la
Licencia de Documentación Libre GNU, versión 1.3 o cualquier versión posterior publicada por
la Free Software Foundation; sin secciones invariantes. Una copia de esta licencia esta incluida en
el apéndice titulado «GNU Free Documentation License».
Muchos de los nombres usados por las compañías para diferenciar sus productos y servicios son
reclamados como marcas registradas. Allí donde estos nombres aparezcan en este documento, y
cuando el autor haya sido informado de esas marcas registradas, los nombres estarán escritos en
mayúsculas o como nombres propios.
i
TRIBUNAL:
Presidente:
Vocal:
Secretario:
FECHA DE DEFENSA:
CALIFICACIÓN:
PRESIDENTE
Fdo.:
VOCAL
SECRETARIO
Fdo.:
Fdo.:
iii
Resumen
En la actualidad, muchas empresas han descubierto el email marketing como una nueva
forma de comunicación y difusión de sus contenidos a sus clientes. Estas empresas utilizan
sus propios sistemas de envío de correo o recurren a servicios web de envío de email
marketing como Acumbamail para realizar estas campañas.
Mediante las plataformas web es posible realizar el seguimiento de resultados pertenecientes a los envíos de las campañas, porcentaje de apertura, número de enlaces visitados,
etcétera. Estas estadísticas pueden ser mejoradas mediante sencillas técnicas utilizadas para
captar la atención de los usuarios a partir del asunto de las campañas incluyendo o evitando
ciertas palabras.
Este trabajo fin de grado desarrolla una herramienta para la predicción del porcentaje
de apertura en el envío de campañas de email marketing, a partir de las estadísticas de
campañas pertenecientes a los usuarios de la plataforma de Acumbamail sin recopilar en
ningún momento datos de carácter personal.
Estas predicciones pueden ser obtenidas gracias al servicio web desarrollado específicamente para este proyecto, utilizando el árbol de decisión que ha sido entrenado con los datos
recopilados de las distintas campañas, permitiendo así mejorar el porcentaje de éxito de las
mismas.
V
Abstract
Nowadays, many companies have discovered the email marketing as a new way of
communication and spreading their content to their customers. These companies use their
own mailing systems or rely on web service for sending email marketing campaigns as
Acumbamail.
The obtained results in these campaigns can be tracked through web platforms, opening
percentage, number of visited links, and so on. These statistics can be improved by simple
techniques used to capture the users attention from email subjects, including or avoiding
certain words.
This project develops a tool for predicting opening rate in email marketing campaigns,
from campaign statistics belonging to Acumbamail platform users without collecting any
personal data.
These predictions can be obtained through the web service developed specifically for
this project, using the decision tree that has been trained with the collected data from
Acumbamail campaigns, which would improve the success rate.
VII
Agradecimientos
Gracias a todo el mundo que me ha ayudado a llegar a este momento tan importante de mi
vida, por pequeña que haya sido la ayuda todo ha de ser agradecido.
En primer lugar a mis padres y mi hermano, por quererme, darme todo lo que tengo y la
oportunidad de estar donde estoy ahora mismo. Os quiero.
A toda mi familia y amigos, por apoyarme y preocuparse en todo momento por mi.
A Nuria, gracias por todo y por estar siempre ahí, eres muy buena y genial. No cambies
nunca. Te quiero cielo ª.
A mis compañeros de carrera, Javi, Cristian, César, Eulalio, David y Rubén, que han sido
mi segunda familia estos cuatro años, gracias por ayudarme en todo lo que he necesitado y
brindarme vuestra compañía.
A Ignacio Arriaga, Rafael Cabanillas y Miguel Gómez por darme la oportunidad de poner
mi granito de arena en Acumbamail, aprender multitud de cosas y haber pasado unos meses
fantásticos con ellos, gracias y mucha suerte en todo.
Y por último, a mi director de proyecto, Luis Jiménez por dirigir este proyecto y enseñarme
lo que he tenido que aprender para la realización del mismo.
Jesús
IX
A mis padres, mi hermano y Nuria
xi
Índice general
Resumen
V
Abstract
VII
Agradecimientos
IX
Índice general
XIII
Índice de cuadros
XVII
Índice de figuras
XIX
Índice de listados
XXI
Listado de acrónimos
XXIII
1. Introducción
1
1.1. Estructura del documento . . . . . . . . . . . . . . . . . . . . . . . . . . .
2. Objetivos
2
5
2.1. Objetivo general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
2.2. Objetivos específicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.2.1. Obtención de los datos procedentes de las campañas enviadas por
Acumbamail . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.2.2. Construcción del Árbol de Decisión . . . . . . . . . . . . . . . . .
6
2.2.3. Construcción de la Información . . . . . . . . . . . . . . . . . . .
7
2.2.4. Inferencia de los Supuestos . . . . . . . . . . . . . . . . . . . . . .
7
2.2.5. Selección de la Tecnología Necesaria para el Sistema de Información
8
2.2.6. Implementación del Sistema de Información e Integración de
componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
3. Antecedentes
9
3.1. Data Mining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
XIII
9
3.2. Árboles de Decisión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
3.3. Email Marketing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
3.4. Servicios web mediante API . . . . . . . . . . . . . . . . . . . . . . . . .
14
3.5. Entorno de Trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
3.5.1. Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
3.5.2. Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
3.5.3. Empresarial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
4. Método
23
4.1. Descripción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
4.2. Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
4.3. Documentación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
4.4. Eventos & Reuniones . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
4.5. Integración con el Proyecto . . . . . . . . . . . . . . . . . . . . . . . . . .
26
4.5.1. Iteración 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26
4.5.2. Iteración 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
4.5.3. Iteración 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
4.5.4. Iteración 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
4.5.5. Iteración 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
4.5.6. Iteración 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
4.5.7. Iteración 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
4.5.8. Iteración 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
4.5.9. Iteración 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
4.5.10. Iteración 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
4.6. Planificación de Tiempos . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
5. Resultados
35
5.1. Visión General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
5.2. Construcción del Sistema de Información . . . . . . . . . . . . . . . . . .
37
5.3. Obtención de la información procedente de Acumbamail . . . . . . . . . .
38
5.4. Construcción del Árbol de Decisión . . . . . . . . . . . . . . . . . . . . .
41
5.4.1. Entrenamiento del Árbol e Inferencia de Supuestos . . . . . . . . .
42
5.5. Servicio Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
45
5.6. Interfaz Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
5.7. Integración con la plataforma de Acumbamail . . . . . . . . . . . . . . . .
52
5.8. Integración Continua de Cambios . . . . . . . . . . . . . . . . . . . . . .
53
xiv
5.8.1. ¿Cómo se utiliza fabric? . . . . . . . . . . . . . . . . . . . . . . .
6. Conclusiones
55
57
6.1. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
6.2. Problemas Encontrados . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
6.3. Propuestas de Mejora . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
A. Creación de una aplicación web con Django
63
B. Aspectos Legales
67
Referencias
69
xv
Índice de cuadros
5.1. Detalles sobre la agrupación de los porcentajes de la tasa de apertura en las
campañas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
XVII
45
Índice de figuras
4.1. Línea de Tiempo perteneciente a los hitos del proyecto. . . . . . . . . . . .
33
5.1. Esquema de utilización del servicio . . . . . . . . . . . . . . . . . . . . .
36
5.2. Diagrama de clases del proyecto . . . . . . . . . . . . . . . . . . . . . . .
37
5.3. Árbol de decisión para determinar si es posible jugar al tenis. Pueden
ser clasificadas las muestras comparando sus atributos con los del árbol y
éste devolverá la clasificación asociada con la muestra elegida. Extraido y
traducido desde (M ACHINE L EARNING , T OM M ITCHELL [Mit97]) . . . .
43
5.4. Árbol de decisión creado mediante palabras de ejemplo para ilustrar
el funcionamiento del árbol que ha sido creado con las campañas de
Acumbamail. Ejemplo en miniatura del árbol real creado con el framework
para Python utilizado, scikit-learn . . . . . . . . . . . . . . . . . . . . . .
46
5.5. Diagrama de casos de uso pertenecientes al servicio web . . . . . . . . . .
47
5.6. Captura de pantalla perteneciente al servidor ejecutado manualmente para
la muestra del procesamiento de asuntos. Prueba de predicción con la frase
"Ten unas vacaciones de película". . . . . . . . . . . . . . . . . . . . . . .
49
5.7. Captura de pantalla perteneciente a la interfaz web creada para el acceso al
servicio perteneciente a los usuarios que no tengan cuenta en la plataforma
de Acumbamail. Pantalla inicial sin resultados de predicción . . . . . . . .
50
5.8. Captura de pantalla de la interfaz web creada para el acceso al servicio
perteneciente a los usuarios que no disponen de cuenta en la plataforma de
Acumbamail. Notificaciones de resultados correspondientes a las tasas de
apertura alta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
5.9. Captura de pantalla de la interfaz web creada para el acceso al servicio
perteneciente a los usuarios que no disponen de cuenta en la plataforma de
Acumbamail. Notificaciones de resultados correspondientes a las tasas de
apertura media-alta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
5.10. Captura de pantalla de la interfaz web creada para el acceso al servicio
perteneciente a los usuarios que no disponen de cuenta en la plataforma de
Acumbamail. Notificaciones de resultados correspondientes a las tasas de
apertura media . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
5.11. Captura de pantalla de la interfaz web creada para el acceso al servicio
perteneciente a los usuarios que no disponen de cuenta en la plataforma de
Acumbamail. Notificaciones de resultados correspondientes a las tasas de
apertura baja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
51
XIX
5.12. Captura de pantalla de la interfaz web creada para el acceso al servicio
perteneciente a los usuarios que no disponen de cuenta en la plataforma de
Acumbamail. Consejos proporcionados a los usuarios . . . . . . . . . . . .
51
5.13. Captura de pantalla perteneciente a la interfaz web creada para el acceso al
servicio perteneciente a los usuarios que no tengan cuenta en la plataforma
de Acumbamail. Pantalla de resultados de predicción. . . . . . . . . . . . .
52
5.14. Captura de pantalla perteneciente a la interfaz web de Acumbamail. Pantalla
de utilización del servicio . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
5.15. Captura de pantalla perteneciente a la interfaz web de Acumbamail. Muestra
de errores en la interfaz. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
5.16. Captura de pantalla perteneciente a la interfaz web de Acumbamail.
Notificaciones de resultados correspondientes a las tasas de apertura mediaalta. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
xx
Índice de listados
3.1. Ejemplo de Array en formato JSON . . . . . . . . . . . . . . . . . . . . .
16
5.1. Modelo de Información perteneciente a las campañas almacenadas . . . . .
38
5.2. Modelo de Información perteneciente a las campañas almacenadas . . . . .
38
5.3. Método para la obtención de la información de las campañas en wrapper de
la API en Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
5.4. Método encargado de realizar la petición HTTP a la API para la obtención de
la información. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
5.5. Código que convierte los asuntos en el formato aceptado por el árbol . . . .
44
5.6. Propiedad de la cabecera que controla el acceso de los servidores web al
servicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
5.7. Respuesta del servicio web en formato JSON, Petición Correcta . . . . . .
48
5.8. Respuesta del servicio web en formato JSON, Petición Errónea . . . . . . .
48
5.9. Modelo de Información perteneciente a las campañas almacenadas . . . . .
55
A.1. Modelo de Información perteneciente a las campañas almacenadas . . . . .
63
A.2. Modelo de Información perteneciente a las campañas almacenadas . . . . .
63
A.3. Modelo de Información perteneciente a las campañas almacenadas . . . . .
63
A.4. Modelo de Información perteneciente a las campañas almacenadas . . . . .
64
A.5. Modelo de Información perteneciente a las campañas almacenadas . . . . .
64
XXI
Listado de acrónimos
HTML
HyperText Markup Language
HTTP
Hypertext Transfer Protocol
JSON
JavaScript Object Notation
MIME
Multipurpose Internet Mail Extensions
MVC
Modelo Vista Controlador
ORM
Object-Relational Mapping
SOAP
Simple Object Access Protocol
REST
Representational State Transfer
RPC
Remote Procedure Call
URI
Uniform Resource Identifier
XML
Extensible Markup Language
CSS
Cascading Style Sheets
XXIII
Capítulo 1
Introducción
L
nuevos canales de comunicación, como el correo electrónico, permiten transmitir
de inmediato a nuestro público objetivo aquellos mensajes que se quieren hacerles
llegar.
OS
La mayoría de los correos electrónicos recibidos en la bandeja de entrada están enviados
por servidores automáticos de correo, como por ejemplo, boletines de noticias, emails de
comercio electrónico, promociones, y multitud de cosas más.
Algunos son abiertos con interés, pero muchos de ellos quedan sin ser leídos porque
la información que aportan ha dejado de ser interesante, o el tipo de contenido ha ido
cambiando con el tiempo.
Un correo electrónico sin leer es una pérdida de recursos utilizados, primero por la persona
que ha invertido el tiempo en seleccionar lo que quiere comunicar a los demás y segundo,
por los recursos invertidos realizar el envío de ese correo que se va a quedar perdido en la
bandeja de entrada. Por ello se tiene que poner todo el esfuerzo necesario en lograr que ese
correo electrónico satisfaga al receptor, cumpliendo su cometido, ya sea porque le es útil o
porque tiene curiosidad sobre su contenido [WDK11].
En esto se basa el tema de este trabajo fin de grado, en obtener el mayor éxito en la difusión
de nuestros contenidos online mediante correo electrónico, como newsletters u ofertas de
tiendas online, por ejemplo. También teniendo en cuenta que cada persona realiza una gestión
diferente del correo electrónico y las diferencias entre culturas de las personas que puedan
recibir nuestro mensaje alrededor del mundo [TMC+ 09].
Uno de los conceptos introducidos recientemente en el mundo de la informática es SaaS
(Software as a Service). Basado en el concepto de cloud computing (computación en la
nube), SaaS proporciona software que puede ser utilizado como una aplicación web mediante
un navegador, o una API dedicada. Todos los datos asociados y el software se encuentran
alojados en Internet. Se ha convertido en poco tiempo en un modelo bastante utilizado para
aplicaciones de negocio como por ejemplo, Google Drive y Dropbox, entre otras.
El trabajo está dirigido a la creación de un servicio para la mejora de los resultados que
obtienen los usuarios de la aplicación de envío de email transaccional y boletines de noticias
1
de Acumbamail, analizando variables como el momento más adecuado en el que deben
enviarse los correos electrónicos para que la tasa de apertura se maximice, o relacionando la
tasa de aperturas de los destinatarios en función del tipo de contenido enviado.
Todos estos resultados se obtendrán mediante el análisis de los datos recogidos en tiempo
real por la aplicación ya existente, en la que los usuarios pueden realizar el envío de boletines
de noticias o email transaccional y pueden ver en todo momento las estadísticas detalladas
de los envíos realizados.
1.1 Estructura del documento
A continuación se detalla la estructura restante del documento, los capítulos junto a una
breve descripción sobre su contenido para facilitar la lectura dependiendo de la motivación
del lector. Los capítulos incluidos a continuación contienen todos los detalles del proyecto,
tanto los objetivos a cumplir, como la manera en que han sido llevados a cabo, además de los
resultados y las conclusiones obtenidas con la realización del mismo.
Capítulo 2: Objetivos
En este capítulo se detallan los objetivos que se quieren conseguir con la realización del
proyecto. Estos objetivos derivan de los requisitos impuestos al comienzo del proyecto,
y de las funcionalidades que se desean obtener.
Capítulo 3: Antecedentes
En este capítulo se detallan las búsquedas llevadas a cabo previo comienzo del
proyecto, para tener conocimiento de posibles proyectos similares que hayan sido ya
realizados, o de problemas equivalentes que hayan sido solucionados.
Capítulo 4: Método
En este capítulo serán detalladas todas las decisiones tomadas para la realización del
proyecto, como la elección de las tecnologías que van a ser utilizadas, o las pautas a
aplicar para el desarrollo del mismo. También es detallada la planificación seguida a
lo largo del proyecto, junto con las distintas etapas en que se ha dividido.
Capítulo 5: Resultados
En este capítulo se detalla el funcionamiento del sistema completo, además de cómo
han sido realizadas todas las propuestas de las funcionalidades expuestas en el capítulo
4.
Capítulo 6: Conclusiones
En este capítulo se detallan las conclusiones que se han obtenido en el proyecto,
sugerencias acerca de posibles mejoras o ideas para futuros proyectos a realizar a partir
de este.
Anexos
Documentos que aportan información adicional sobre temas relacionados con el
2
proyecto.
3
Capítulo 2
Objetivos
E
este capítulo se describen los objetivos correspondientes al proyecto, el objetivo
general y los objetivos específicos pertenecientes a cada parte del proyecto.
N
2.1 Objetivo general
El objetivo general del proyecto es la construcción de un sistema de ayuda a la toma de
decisiones para campañas de comunicación via email.
Para la consecución de los objetivos de este proyecto, se ha dividido en dos partes
principales, la construccion del sistema de información y la dotación de capacidad de ayuda
a la toma de decisiones.
Las dos partes son igual de importantes. Sin un sistema de información no podría ser
realizada toda la labor de la obtención de datos y su posterior tratamiento antes de la
utilización. Igualmente, es fundamental dotar al sistema del componente necesario para
realizar esas ayudas a la toma de decisiones.
Este proyecto se desarrolla sobre los datos proporcionados por Acumbamail, una empresa
cuya actividad principal es el envío de boletines y correos electrónicos transaccionales.
Estos datos engloban las estadísticas de las campañas más relevantes enviadas por su
sistema, incluyendo:
Asunto del correo electrónico enviado en la campaña
Número de correos electrónicos enviados en total
Número de correos electrónicos de la campaña que han sido abiertos
Número de correos electrónicos de la campaña que no han sido abiertos
Soft Bounces: Correos Electrónicos no entregados por un problema temporal del
servidor del destinatario.
Hard Bounces: Correos Electrónicos no entregados porque el dominio no existe o la
dirección de email es incorrecta.
Número de Quejas en la Campaña: Suscriptores que han marcado la campaña como
SPAM.
5
Clicks Únicos: Número de clicks realizados sobre los enlaces de la campaña. Sólo uno
por suscriptor en cada enlace.
Clicks Totales: Número de clicks realizados sobre los enlaces de la campaña. Tantos
como clicks hayan hecho los suscriptores en los enlaces de la campaña.
Gracias a estos datos junto a la infraestructura que será desarrollada, se podrá llevar a cabo
la construcción de un sistema capaz de realizar predicciones sobre el porcentaje de apertura
de las campañas a partir de las palabras claves contenidas en el asunto.
Estas predicciones podrán ser consultadas mediante un servicio web, a través de una API,
que también será integrado en la plataforma ya existente de Acumbamail. Los posibles
usuarios del servicio que no tengan cuenta en Acumbamail también podrán hacer uso del
mismo mediante una sencilla plataforma web que cumplirá los estándares de accesibilidad y
usabilidad actualmente empleados en el desarrollo web.
2.2 Objetivos específicos
2.2.1
Obtención de los datos procedentes de las campañas enviadas por
Acumbamail
El primer objetivo del proyecto es la obtención de los datos proporcionados por las
estadísticas de las campañas enviadas en Acumbamail. Estos datos, que se encuentran
almacenados en la base de datos de la plataforma, tienen que ser extraídos para su posterior
análisis y tratamiento.
Actualmente, Acumbamail tiene una API con numerosas funciones destinadas a la
obtención de los datos de suscriptores a listas entre otras funciones. Esta API permite a sus
usuarios, por ejemplo, la obtención de estadísticas de los usuarios suscritos a campañas de
email marketing para ser almacenadas, o crear informes destinados a la mejora del contenido
de las newsletters.
Aprovechando esta circustancia para la consecución del objetivo, se necesita la ampliación
de la API existente de Acumbamail para poder obtener los datos relativos a las campañas de
los usuarios y realizar el almacenamiento de esos datos.
Estas nuevas operaciones de la API creadas como consecuencia de este objetivo
devolverán la información deseada en formato JSON para que pueda ser fácilmente
almacenada y/o utilizada de la forma preferida por cada usuario de la aplicación. Éstas son
privadas y no utilizan datos personales de los usuarios.
2.2.2
Construcción del Árbol de Decisión
Una de las partes principales del proyecto es la construcción del árbol clasificador.
Éste árbol de decisión va a permitir clasificar los asuntos de las campañas según sus
atributos (palabras clave contenidas en él) y la tasa de apertura obtenida, para después poder
6
sacar nuestras propias conclusiones sobre los asuntos que los usuarios quieran evaluar.
Los usuarios únicamente tendrán que introducir el contenido de su asunto en la plataforma
y/o interfaz web, para que mediante la infraestructura que se construirá posteriormente el
árbol evalúe su contenido y pueda predecir, gracias al modelo construido y los datos de
entrenamiento, la tasa de apertura que presumiblemente tendrá su campaña enviada vía
correo electrónico.
Dentro de los árboles de decisión se pueden encontrar algunas variantes, los más conocidos
son: ID3, C4.5 y CART.
Para la construcción del árbol se puede contar con la utilización de frameworks que
faciliten esta tarea, por ejemplo, scikit-learn.
2.2.3
Construcción de la Información
Cuando se haya completado el objetivo destinado a la construcción del árbol de decisión,
para que éste sea capaz de realizar la inferencia de los supuestos necesita ser entrenado con
datos de ejemplo.
En nuestro caso estos datos serán los obtenidos de las campañas enviadas desde la
plataforma de Acumbamail.
Realizar el análisis de los datos obtenidos y encontrar un modelo de datos permitirá
conseguir nuestro objetivo lo más eficientemente posible, en términos de espacio y
tiempo.
La eficiencia es un aspecto bastante importante en este proyecto debido a la gran cantidad
de datos disponibles para analizar. Por ello debe realizarse un análisis meticuloso a la hora
de efectuar un profiling de nuestro desarrollo, teniendo en cuenta en qué partes se podría
obtener una mejora de rendimiento.
2.2.4
Inferencia de los Supuestos
Ésta es la parte esencial del proyecto, poder estimar a partir de unos datos de ejemplo
previamente analizados qué porcentaje de apertura tendrá una campaña según el contenido
encontrado en su asunto.
Este objetivo será realizado mediante el framework elegido anteriormente para la
construcción de nuestro árbol de decisión, y mediante el modelo que se haya considerado
conveniente según la estructura de nuestros datos.
La entrada será el asunto proporcionado por el usuario, que el sistema procesará y sobre
el que realizará la inferencia. Esta inferencia es el porcentaje estimado de apertura de la
campaña que será enviada por el usuario.
El usuario solo tendrá que preocuparse de la introducción de datos. Todo el proceso
será transparente al usuario. Cuando todo el proceso finalice el usuario será informado del
7
resultado de su consulta.
2.2.5
Selección de la Tecnología Necesaria para el Sistema de Información
Todo lo mencionado anteriormente tiene que funcionar por debajo de un sistema de
información que facilite todas las tareas que son más complicadas de realizar a mano.
El desarrollo estará cubierto mediante una interfaz web que facilitará al usuario la
interacción con el servicio, además de una API que permitirá que el servicio sea integrado
en la plataforma de Acumbamail. Al tener una API se facilitará la integración del servicio en
cualquier dispositivo móvil y/o página web.
Es necesario evaluar todas las plataformas y frameworks destinados a la creación de
servicios web para tomar la decisión final sobre qué tecnología y lenguaje de programación
utilizar para la creación del sistema de información.
2.2.6
Implementación del Sistema de Información e Integración de componentes
Cuando se haya elegido la tecnología que va a ser usada para la creación del servicio web
éste necesita ser implementado para alcanzar su correcto y completo funcionamiento.
Todos los componentes mencionados anteriormente necesitan un punto de salida al
usuario, que será nuestro sistema de información encabezado por una interfaz web.
Este sistema tiene varios puntos de entrada y salida, la plataforma de Acumbamail, y la
interfaz web construida para este propósito.
8
Capítulo 3
Antecedentes
3.1 Data Mining
En los últimos tiempos, el aprendizaje automático ha cobrado gran importancia en el
campo de la informática.
Relacionado con conceptos como el Data Mining, el aprendizaje automático o Machine
Learning en inglés, ayuda a descubrir patrones en grandes conjuntos de datos utilizando la
inteligencia artificial y la estadística.
Este campo permite ayudar a la toma de decisiones en las empresas, ya que el análisis
de datos puede descubrir tendencias útiles para la empresa o identificar oportunidades de
mejora.
Mediante el Data Mining se pueden descubrir patrones que se repiten en nuestros
conjuntos de datos para obtener relaciones entre ellos. La información obtenida a partir de
las relaciones encontradas es el fundamento de este proyecto, la construcción de un sistema
de ayuda a la toma de decisiones para las campañas de Email Marketing.
Gracias a la utilización de la informática en conjunto con el Data Mining, la identificación
de pautas en los datos analizados permite a los usuarios de las plataformas de envío de
campañas que éstas sean mucho más eficaces, mejorando la satisfacción tanto de los clientes
de las plataformas porque consiguen mayores tasas de aperturas en sus envíos, como de los
usuarios que reciben esos correos porque estarán más enfocados a sus preferencias.
El método tradicional para convertir datos en conocimiento consiste en el análisis manual
y la interpretación. Por ejemplo, en el área sanitaria es común que los especialistas
analicen periódicamente las tendencias y los cambios en los datos provenientes de informes
relacionados con la salud de la población. Estos análisis proporcionan un informe detallado
que servirá para la toma de decisiones y la planificación para la gestión en el área
sanitaria.
Para esta y otras muchas aplicaciones, la prueba manual es lenta, cara y altamente
subjetiva. De hecho, como el volumen de datos crece muy rápidamente este tipo de análisis
se está convirtiendo impracticable en muchos dominios [FPSS96].
El Data Mining es utilizado en campos muy diversos como los videojuegos, los negocios,
9
aplicaciones en la ciencia, ingeniería, medicina y datos geográficos, entre otros.
En los videojuegos de los años 60 ya aparecieron aplicaciones del Data Mining, como la
extracción de las estrategias utilizadas por humanos para su aplicación a juegos de ajedrez,
tres en raya, etcétera.
También tiene multitud de aplicaciones en las áreas de marketing de los negocios,
tales como proporcionar a los clientes los productos que desean comprar basados en sus
preferencias, guardar datos sobre el comportamiento de las personas cada vez que se utiliza
una tarjeta de crédito, o una tarjeta de fidelización de un negocio.
No sólo está ligado a estos campos, también es utilizado para la clasificación de música
en géneros o para la búsqueda de patrones con asociación de reglas en hábitos de consumo,
por ejemplo.
La exploración de los datos es un proceso de negocio con multiples fases en las cuales las
personas utilizan una metodología estructurada para descubrir y evaluar problemas, definir
soluciones y estrategias de implementación, y producir resultados medibles.
Las etapas del proceso de exploración de los datos son:
Explorar el espacio del problema
Explorar el espacio de soluciones
Especificar el método de implementación
Minería de datos
Preparación de los datos
Inspección de los datos
Modelado de los datos
El 80 por ciento del éxito está en la búsqueda de un problema asequible, definiendo
como es la solucion que se desea encontrar, y lo más crítico de todo, la implementación
de la misma. Por otro lado, la minería de datos requiere usualmente la mayoría del tiempo
empleado en el proyecto [Pyl99].
Es muy importante la correcta identificación del problema al que se quiere dar solución,
ya que en caso contrario se estará abordando el problema equivocado. Identificando
correctamente el problema es posible encontrar soluciones apropiadas para los problemas
que se están analizando.
3.2 Árboles de Decisión
Los árboles de decisión clasificadores utilizan las observaciones de los elementos
recogidas anteriormente y su valor para determinar cuál puede ser el valor del elemento
10
elegido. En este caso, los elementos son las campañas y el valor corresponde al porcentaje
de apertura de los correos electrónicos enviados en esa campaña. Es muy utilizado en
estadística, Data Mining y aprendizaje automático.
Según Rusell [RN04], la organización de objetos en categorías es una parte vital de la
representación del conocimiento. Aunque la interacción con el mundo tiene lugar a nivel
de objetos individuales, la mayoría del proceso de razonamiento tiene lugar en el nivel de
categorías. Se puede inferir la presencia de ciertos objetos a través de la percepción, inferir
la categoría a la que pertenece utilizando las propiedades del objeto percibidas y entonces
usar las información sobre categorías para realizar predicciones sobre los objetos.
Un árbol de decisión es una forma fácil de categorizar elementos. Se dispone de unos
elementos que poseen unas características discretas. Una de ellas se conoce como la clase a
la que pertenece el elemento. En los árboles cada nodo interno es una característica. Cada
nodo interno tiene arcos salientes nombrados con cada uno de los posibles valores de esa
característica. Cada nodo hoja del árbol es nombrado con una de las clases o la probabilidad
de distribución de las clases del dominio en el elemento con dichas características.
Cada camino desde la raíz de un árbol de decisión a una de sus hojas puede ser
transformado en una regla simplemente agrupando las pruebas del árbol para formar la parte
de los antecedentes y tomando el valor de la predicción de la clase como el valor que toma
el resultado de la regla [RM07].
Para este proyecto se va a utilizar un árbol CART (Classification and Regression Tree) que
es un arbol de decisión no paramétrico (la distribución de los datos no se ajusta a los criterios
paramétricos y no puede ser definida a priori, ya que la determinan los datos observados)
que crea árboles de clasificación o regresión en función de si la variable dependiente es
categórica o numérica. Los árboles de decisión están formados a partir de una colección de
reglas basadas en el conjunto de datos proporcionado. Estas reglas son:
Reglas basadas en los valores de las variables para determinar la mejor separación
entre observaciones basadas en la variable dependiente.
Una vez que una regla es seleccionada y se realiza la división de un nodo en dos, el
mismo proceso se aplica a cada nodo hijo. Es un procedimiento recursivo.
La separación acaba cuando CART detecta que no se pueden realizar mejoras
adicionales, o bien que se ha cumplido alguna de las reglas de parada configuradas
previamente. Alternativamente, los datos son separados tanto como sea posible y
después el árbol es podado.
Scikit-learn es una biblioteca open source para aprendizaje automático. Contiene
algoritmos para la realización de clasificación, regresión y clustering incluyendo máquinas
de soporte vectorial, regresión logística, clasificador bayesiano ingenuo, etcétera. Está
11
construido sobre NumPy, SciPy y matplotlib. Tiene licencia BSD, open source y es utilizable
comercialmente.
Scikit está en desarrollo continuo, entre sus usuarios se encuentran Evernote, el cual usa
la biblioteca para distinguir recetas de otras notas mediante un clasificador bayesiano, y
Mendeley, que desarrolla sistemas recomendadores mediante el algoritmo de regresión.
3.3 Email Marketing
El email marketing se basa en el envío de emails comerciales a un individuo o grupo
de usuarios que nos han proporcionado su dirección de correo electrónico. Estos emails
pueden ser de contenidos diversos, como la publicidad, información diversa a los usuarios,
etcétera.
Es posible diferenciar dos tipos de email marketing:
Email Transaccional
Estos son enviados cuando el cliente realiza una acción con una compañía, como una
confirmación de un pedido en una compra, correos de cambio de estado en un pedido,
cambio de contraseña, etcétera.
El propósito de éstos es informar al usuario de cualquier acción o información
relevante. Estos email tienen una tasa de apertura superior a los emails enviados en
campañas, por lo que puede ser una buena oportunidad para mejorar la relación con
los clientes para proporcionales más información, o recomendarle productos de su
interés.
Campañas de Envío
Las campañas de envío de email están destinadas al envío de un mensaje a un grupo de
usuarios por ejemplo anunciando nuestro catálogo de productos, o cualquier anuncio
o novedad que pueda interesar a nuestros clientes.
Actualmente los objetivos en el aspecto de mejora en el contenido de newsletters de la
empresas de email marketing se centran en dar consejos a sus usuarios sobre cómo orientar
el contenido de sus campañas o email transaccionales, cómo hacer sus asuntos más atractivos
para captar la atención de los suscriptores, que palabras poner o evitar en sus asuntos,
etcétera.
La gran ventaja del correo electrónico es la capacidad de crear relaciones entre las
personas, o relaciones comerciales. El branding es el proceso de hacer y construir una marca
con el objetivo de que se asocien los activos de la empresa al nombre y/o logotipo que
identifica a la marca proporcionandole valor.
Mediante el branding es posible potenciar las relaciones entre empresas y consumidores,
ya que no es necesario cada vez que se realiza una comunicación explicar quién está detras
de ella, y centrarse en las actividades y conversaciones que fortalecen la relación.
12
Cuatro razones por las que el email es el medio perfecto para el marketing (de [BS07]):
El correo electrónico es fácil
Hoy en día hay multitud de gestores de correo y plataformas de envío de correos
electrónicos y es muy sencillo para las organizaciones realizar el envío de campañas
de email marketing efectivas para entablar una relación con sus consumidores.
Todas estas herramientas son fáciles de usar, no es necesario poseer grandes
conocimientos informáticos para sacar provecho de ellas. No existen barreras de
entrada ni obstáculos para realizar una campaña efectiva de email marketing.
El correo electrónico es barato
Actualmente el medio más economico en actividades de marketing es el correo
electrónico. La prensa, la televisión y el teléfono son canales por los cuales también
es posible realizar estas acciones, pero el presupuesto requerido para ello sería mucho
mayor. El coste del envío de un email es de sólo unos céntimos. Esto permite que
empresas de pequeño tamaño sean capaces de lanzar efectivas campañas de marketing
que consigan atraer a nuevos usuarios y mantener a los ya existentes.
El correo electrónico es interactivo
El correo electrónico permite conocer con exactitud el número de usuarios que
ha recibido nuestro correo, cuántos lo han abierto, cuándo lo han hecho, cuantos
receptores lo han considerado como SPAM, y cuántos han utilizado un vínculo
incluido en el correo.
Es posible medir y cuantificar el éxito de las campañas, e integrarlo con otros sistemas
para evaluar las consecuencias derivadas de la misma (incremento de ventas, etcetera.).
Con este medio es posible cuantificar el grado de éxito derivado de las campañas
enviadas, cuando con otros medios el grado de éxito obtenido es dificilmente medible.
Esta es la parte más novedosa con respecto a la utilización de otros canales de
comunicación.
El correo electrónico es personalizable
Otra de las ventajas del correo electrónico es que los datos proporcionados por el
usuario pueden ser utilizados para crear un mensaje único, personalizado. Estos datos
son esenciales para crear una buena relación entre la compañía y el cliente mediante el
envío de mensajes relevantes para sus intereses.
Los responsables de marketing deben centrar sus esfuerzos en la recopilación de datos
de consumidores en cada interacción con el consumidor, como el uso de una página
web, llamadas, ventas, emails directos, etcétera.
Todas estas características hacen del correo electrónico un medio de comunicación único.
Todas las empresas pueden hacer un uso exitoso del mismo proporcionando más valor a su
compañía. Sólo requiere las herramientas adecuadas y los medios para realizarlo.
13
3.4 Servicios web mediante API
La mayoría de los servicios web existentes proporcionan información a sus usuarios
mediante una API REST que éstos utilizan con un dispositivo conectado a Internet, bien
con un ordenador o bien con un dispositivo móvil gracias a alguna aplicación.
En la actualidad, el término REST sirve pare definir cualquier interfaz web que utilice
XML/HyperText Markup Language (HTML) y HTTP evitando la utilización de los protocolos
basados en el intercambio de mensajes de servicios web basados en Simple Object Access
Protocol (SOAP).
REST permite la abstración de los elementos arquitecturales que forman un sistema
hipermedia distribuido. Ignora los detalles de la implementación de los componentes de la
API y la sintaxis de los protocolos para centrarse en el rol que cada componente ocupa en el
proceso. Servidor de origen, puerta de enlace, proxy y el navegador del usuario. [FT02]
Las características de los servicios REST son (de [ASJH11]):
Peticiones sin estado
Cada petición contiene todos los datos que son necesarios para su procesamiento.
El estado de la sesión es guardado en el cliente. Esta sesión puede ser transferida al
servidor y ser guardada en una base de datos por un periodo de tiempo para por ejemplo
permitir la autenticación automática de usuarios.
El cliente comienza a mandar peticiones cuando está preparado para una transición a
un nuevo estado, mientras que si una o más peticiones están pendientes el cliente está
en transición.
Conjunto de Operaciones definidas
Los servicios REST siempre utilizan el mismo conjunto de operaciones, las definidas
por HTTP, GET, POST, PUT y DELETE.
A diferencia de REST, Remote Procedure Call (RPC) no tiene siempre el mismo
conjunto de funciones definidas, ya que las funciones utilizadas son definidas por el
programador del servicio. Estas funciones necesitan ser conocidas por las partes que
van a utilizar el servicio.
es un protocolo que permite ejecutar métodos en otra máquina remota sin
ocuparse de las comunicaciones entre ambas. Hay distintos tipos de RPC y no son
compatibles entre sí. Actualmente se utiliza XML para la definición de las interfaces y
HTTP como protocolo de red, surgiendo lo que se conoce como SOAP
RPC
Interfaz Uniforme
Los recursos en los sistemas REST son identificados en las peticiones utilizando
Uniform Resource Identifier (URI). Los recursos enviados son diferentes de los
recursos almacenados en el servidor. Por ejemplo, el servidor devuelve recursos en
14
HTML o JSON, pero esta no es la forma en la que se encuentran almacenados en el
servidor.
Una característica importante de los servicios REST son sus operaciones idempotentes. La
idempotencia consiste en que no importa cuantas veces realicemos la misma operación en el
servidor web que va a tener siempre el mismo resultado. Si se realiza una petición DELETE
una vez, el recurso va a ser eliminado. Si esta petición es realizada de nuevo, lanzará un error
404 pero el estado del recurso no ha cambiado desde la primera petición, está eliminado. Esta
característica es útil ya que internet no es una red confiable, nuestra conexión puede tener
algún problema y no podríamos saber si la petición ha sido completada. En cambio, podemos
lanzar la petición cuantas veces queramos hasta que recibamos una respuesta. [RR13]
Si la API que se quiere construir utiliza documentos HTML y/o respuestas en JSON,
la semántica del protocolo está limitada a los métodos GET y POST. Si se va a conectar
con un servicio de almacenamiento, se necesitará HTTP junto a las extensiones de
WebDAV. [RR13]
La mecánica de funcionamiento de estos servicios es un «sistema de petición-respuesta».
Se recibe una petición HTTP (GET o POST) desde cualquier aplicación invocando a una
operación contenida en la API, el servidor ejecuta el código perteneciente a la operación y
devuelve al usuario la respuesta por el mismo medio que fue enviada. Esta respuesta suele
ser enviada como texto plano en alguno de los formatos más comunes concebidos para el
intercambio de datos, como JSON o Extensible Markup Language (XML).
Aunque los servicios suelen proporcionar mensajes de estado mediante JSON, éstos
también pueden ser vistos mediante los códigos de estado HTTP devueltos en las cabeceras
de la respuesta enviada.
Algunos de estos códigos comienzan con los dígitos 2, 4 o 5 ( [FGM+ 99]):
Los códigos 2XX, que engloban desde el 200 hasta el 207, indican que la petición fue
recibida y aceptada correctamente.
Los códigos 4XX indican que el cliente ha realizado una petición incorrecta o que la
que ha realizado no puede procesarse. El servidor debe incluir una explicación a la
situación de error, indicando explicitamente si es temporal o permanente.
Algunos de estos códigos indican que la autenticación proporcionada no es correcta
(Código 401), que no se tiene permiso para acceder al recurso (Código 403 Prohibido), que el recurso no fue encontrado (Código 404 - No encontrado), etcétera.
Cuando un error ha ocurrido en el servidor se lanza un error 5XX. Estos errores
se producen cuando el servidor falla al completar una petición que es válida
aparentemente.
Por ejemplo, el código 500 es enviado cuando ha ocurrido un error interno, emitido por
15
aplicaciones en servidores web cuando se produce algún error al generar el contenido
que va a ser enviado. Otros errores son 501, cuando el método por el que se ha realizado
la petición (GET, POST, PUT, etc.) no se encuentra implementado.
Todos estos códigos son códigos de estado HTTP implementados por múltiples navegadores
y servidores web.
JSON es un formato ligero para el intercambio de datos. Está hecho para facilitar la lectura
y escritura a las personas y a la vez que sea fácil de procesar y generar para los servidores
y ordenadores. Está formado por dos estructuras, una colección de elementos clave/valor,
tratada como objeto en muchos lenguajes, y una lista de valores, denominada como array,
vector o lista por muchos de los lenguajes de programación más comunes.
{ " Asignaturas " :
[ { " Nombre " :
{ " Nombre " :
{ " Nombre " :
{ " Nombre " :
}
" Sistemas Inteligentes " , " Alumnos " : 25} ,
" Ingles Tecnico I " , " Alumnos " :15 } ,
" Tecnologias y Sistemas Web " , " Alumnos " : 18} ,
" Redes y Servicios Moviles " , " Alumnos " : 20} ]
Listado 3.1: Ejemplo de Array en formato JSON
Actualmente hay numerosos frameworks con la funcionalidad requerida. Uno de los más
utilizados es Node.JS, un entorno de programación que facilita la creación de la capa del
servidor basado en Javascript.
Otro también muy utilizado escrito en el lenguaje de programación Python es Django.
Django es un framework de código abierto que sigue el patrón MVC (Modelo, Vista,
Controlador). Django se centra en la reutilización de código, la conectividad, plugins, y el
desarrollo ágil de software.
3.5 Entorno de Trabajo
3.5.1
Software
El proyecto va a ser completamente desarrollado gracias a los medios proporcionados por
Acumbamail.
Todo el código e información se encontrará almacenado en un repositorio en uno de los
principales servicios de control de versiones online (GitHub, Bitbucket, etc...).
Debido al componente web del proyecto, se necesita un servidor web capaz de ejecutar en
paralelo todo lo mencionado en los objetivos para poder proporcionar al usuario un servicio
confiable y rápido.
A continuación se describen las herramientas utilizadas para la realización del proyecto:
16
Lenguajes
Python
Python [pyt] es un lenguaje de programación interpretado con orientación a objetos,
multiplataforma y de código abierto. Posee una licencia Python Software Foundation
License, compatible con GNUPG. Está administrado por la Python Software Foundation.
Creado por Guido Van Rossum en el Centro para las Matemáticas y la Informática de los
Países Bajos.
Python sigue una filosofía basada en un desarrollo favorecido por una sintaxis limpia y un
código fácilmente legible.
Python es un lenguaje de programación versátil que ha permitido realizar varias etapas del
proyecto. Desde la extracción de los datos de la API mediante su librería urllib parseando
JSON con la clase incluida por defecto. Igualmente la creación y el entrenamiento del árbol
de decisión, el servidor web que proporciona el servicio a las plataformas y la sencilla
interfaz web que se presenta a los usuarios para la utilización del servicio.
Gracias a la utilización de un único lenguaje de programación, la integración entre los
componentes ha sido sencilla permitiendo ahorrar tiempo de procesamiento.
MySQL
MySQL [mys] es el motor de base de datos relacional utilizado en el proyecto. Ha sido
empleado por su fácil integración con Django además de ser uno de los más habituales en
el mundo de la informática por su rendimiento, perteneciente a la categoría de Software
Libre.
HTML
[HTM] es un lenguaje de marcas para la creación de páginas web. Es un estándar
mediante el que se define la estructura de diseño de la página web y sus contenidos
multimedia (texto, vídeo, imágenes).
HTML
Éste estándar es creado por la W3C, un consorcio dedicado a la creación de estándares de
las tecnologías que conforman la web.
La última revisión de este lenguaje es HTML5, todavía experimental.
Entre sus nuevas características, incluye la creación de nuevas etiquetas que reflejan
nuevos significados semánticos (como <header>y <footer>), o proporcionan nuevas
funcionalidades como las etiquetas para los elementos de audio y vídeo. También se
han desechado etiquetas que incluían modificaciones en la presentación, al dejar esta
funcionalidad a las hojas de estilos Cascading Style Sheets (CSS).
CSS3
CSS
[CSS] (u Hoja de Estilos en Cascada) es el lenguaje mediante el cual se proporciona
17
estilo a la estructura de la página web definida en un lenguaje de marcas como HTML. Igual
que HTML, CSS fue creado y es mantenido por el W3C.
Un documento CSS está compuesto de un conjunto de reglas que aplican los estilos
correspondientes a los elementos seleccionados del documento.
Javascript
Javascript es un lenguaje utilizado mayoritariamente del lado del cliente, interpretado
por el navegador, permitiendo realizar cambios en la interfaz de usuario y páginas web
dinámicas.
Javascript fue creado por Brendan Eich, trabajador de Netscape en 1995. Actualmente, la
marca Javascript es propiedad de Oracle Corporation.
Actualmente este lenguaje es muy utilizado gracias a frameworks tales como jQuery,
biblioteca creada por John Resig que facilita la manera de interactuar con código HTML para
modificar su contenido o crear animaciones en las páginas web entre otras utilidades.
Gestión y Almacenamiento del Proyecto
Repositorio y Control de Versiones
Para facilitar la gestión del trabajo se utilizará un sistema de control de versiones. Estos
sistemas permiten la gestión de los diversos cambios que se realizan sobre software, o
archivos, llevando un control exhaustivo de ellos.
Este sistema, además del control de cambios, proporciona un método de almacenamiento
de todos los elementos incluidos en el proyecto y un historial con todos los cambios
realizados a lo largo de la historia, pudiendo volver a un estado anterior distinto del actual si
es necesario.
Todos los datos pertenecientes al proyecto se encuentran en el repositorio, el lugar donde
se almacenan los mismos y los históricos de cambios. Este repositorio está alojado en un
servidor externo. Gracias a ello, no hay que preocuparse de la realización de copias de
seguridad.
Cada vez que se realizan cambios en el proyecto se genera una revisión nueva, identificada
mediante un número o un código de detección de modificaciones (p. ej., SHA1 en GIT).
Trello
Trello [tre] es una aplicación web orientada a la gestión de proyectos. Utiliza un paradigma
para la gestión de proyectos conocido como kanban, un método que fue popularizado por
Toyota en los años 80 para las cadenas de suministros.
En esta aplicación los proyectos están representados por un "tablón". Éste tablón contiene
listas de tareas formadas por tarjetas. Estas listas pueden estar formadas por tarjetas
18
correspondientes a características de nuestro producto en distintas fases de desarrollo.
Estas tarjetas van progresando de lista en lista hasta que la idea está completamente
desarrollada.
Es posible asignar las tareas contenidas en las tarjetas a los distintos integrantes del
proyecto.
Todos los tablones construidos pueden ser integrados formando una organización.
Todo esto puede ser utilizado fácilmente mediante sus aplicaciones móviles para iPhone
y Android, con lo que este servicio puede ser utilizado en cualquier sitio y por cualquier
persona que esté interesada.
Frameworks
Django
Django [dja] es un framework para aplicaciones web, open source y escrito en python.
Está basado en el patron MVC (Modelo, Vista, Controlador).
El núcleo del framework consiste en un mapeo objeto relacional (ORM) que permite
obtener directamente los datos almacenados en la base de datos como objetos de las clases
python definidas en nuestro proyecto. Junto con un sistema de templates para la visualización
web, y un despachador de URL mediante expresiones regulares.
Django ha evitado la programación de un completo sistema web, proporcionando la
conexión con la base de datos y un completo sistema de plantillas que ha sido de gran ayuda
para la creación de la interfaz. Django permite omitir la programación de las partes de bajo
nivel del sistema, como la conexión a las vistas que muestran los templates cuando un usuario
accede a una URL definida en el sistema.
jQuery
jQuery [jqu] es una biblioteca multiplataforma diseñada para simplificar la creación de
scripts para HTML en el lado del servidor. Es usado por más del 60 % de las 10000 páginas
web más visitadas del mundo.
jQuery está destinado a facilitar la navegación dentro del código HTML, seleccionar
elementos del DOM, crear animaciones, eventos y hacer aplicaciones que utilicen AJAX.
La arquitectura de jQuery permite a los desarrolladores crear plugins para extender la
funcionalidad de jQuery. Actualmente hay miles de plugins para jQuery que permiten utilizar
servicios web, tablas de datos, listas dinámicas, herramientas para XML y XSLT, drag and
drop en la interfaz web, eventos, manejo de cookies y ventanas modales.
jQuery ha facilitado la programación del comportamiento de la interfaz creada para la
utilización y la comunicación con el servicio.
19
Bootstrap
Bootstrap [boo] es un conjunto de herramientas gratuitas para la creación de páginas y
aplicaciones web. Contiene código HTML y plantillas de CSS para tipografías, formularios,
botones, navegación y otros componentes de la interfaz. También incluye código JavaScript
para dotar de comportamiento a esos elementos.
Bootstrap fue desarrollado por dos empleados de Twitter en un intento de crear
consistencia en el aspecto de diseño entre las herramientas internas. Fue lanzado como una
herramienta open source en Agosto de 2011, y menos de un año después fue el proyecto que
más veces ha sido marcado como favorito en GitHub, portal de proyectos muy extendido en
el mundo del software libre.
El uso es bastante sencillo, sólo se necesita descargar la hoja de estilos CSS de Bootstrap
e incluir un enlace al archivo en el HTML. También está disponible en LESS o SASS para
la compilación. Es posible utilizar también los scripts de javascript, realizando la misma
operación que con el CSS, pero los scripts deben ser utilizados junto a jQuery.
La interfaz ha sido realizada mediante Bootstrap, que facilita los elementos de diseño
básicos utilizados en la misma y proporciona automáticamente un diseño responsive,
destinado para su correcta visualización en cualquier dispositivo tanto de sobremesa como
portátil sin requerir la adaptación del diseño a cada dispositivo.
Miscelánea
Celery
Celery [cel] es una cola de tareas asíncrona basada en el paso de mensajes distribuido. Las
tareas solicitadas se ejecutan concurrentemente en uno o más servidores (workers). Gracias a
la concurrencia, es posible habilitar varios procesos en una misma máquina para que realicen
varias tareas a la vez reduciendo los tiempos de espera. Celery está implementado en Python,
aunque también puede operar con otros lenguajes mediante WebHooks.
Actualmente Celery es usado en los sistemas de producción de empresas conocidas como
Instagram, Mozilla y AdRoll.
Celery ha proporcionado al proyecto una reducción de tiempos en la obtención de
información de la API al permitir obtener la información de varias campañas al mismo
tiempo.
JSON
JSON [jso] es la forma más sencilla para la representación de la información utilizada
por la mayoría de los servicios web y APIs actuales. Permite la incorporación de multitud
de información en poco espacio para ser transmitida por la red. Ha sido utilizado en este
proyecto para realizar todas las comunicaciones entrantes y salientes desde y hacia la
20
API.
3.5.2
Hardware
Entorno Local
Para el desarrollo del proyecto en un entorno offline se ha llevado a cabo con un ordenador
Lenovo con 4GB de RAM y un procesador AMD E2-1800 a 1.7 GHz con 4GB de RAM y
500GB de HDD. Sistema Operativo Linux.
Además se ha utilizado un Macbook Pro con un procesador Intel Core i5 a 2,4GHz. 128GB
de SSD, y 500GB de HDD. Mac OS X 10.9.4.
Entorno Remoto
Todo el proyecto necesita ser soportado por un servidor en la nube en el que realizar el
despliegue automático de la aplicación.
Este servidor es una instancia comprada en Digital Ocean, que cuenta con 1GB de RAM,
un procesador de un núcleo, 30GB de disco SSD, y 2GB de transferencia de datos, cortesía
de Acumbamail.
3.5.3
Empresarial
Este trabajo está desarrollado en el entorno empresarial, gracias a una beca de colaboración
proporcionada por Acumbamail.
Todos los medios y necesidades a lo largo del proyecto han sido cubiertas por
Acumbamail.
Acumbamail es una startup de reciente creación dedicada al envío de newsletters y email
transaccional, que permite la creación de nuestros propias campañas además de conocer su
tasa de apertura y la calidad de los suscriptores.
Como modelo de desarrollo, Acumbamail utiliza SCRUM.
SCRUM proporciona una metodología ágil. Todo el proceso de desarrollo es documentado
mediante el product backlog, en el que se encuentran detallados todos los requisitos y futuras
funcionalidades.
Esta metodología incluye sprints, periodos definidos por el equipo, en los que se crea un
nuevo producto software o se mejora el ya existente. En cada uno de estos periodos, mediante
el sprint backlog, se describe cómo el equipo va a implementar las funcionalidades durante
el sprint planificado.
21
Capítulo 4
Método
E
este capítulo se describe la metodología seguida para la realización del proyecto.
N
Las metodologías mas adecuadas para enfocar este proyecto son las metodologías ágiles,
basadas en el desarrollo iterativo e incremental. En 2001, nacieron los métodos ágiles para
nombrar al conjunto de las alternativas a las metodologías formales (CMMI y SPICE, por
ejemplo).
Se definió el manifiesto ágil, soportado por cuatro postulados:
Valorar más a los individuos y su interacción que a los procesos y las herramientas.
Valorar el software que funciona frente a la documentación exhaustiva.
Valorar la colaboración con el cliente más allá de la negociación contractual.
Valorar la respuesta al cambio por encima del seguimiento de un plan.
La utilización de una metodología perteneciente a este conjunto se justifica por los diversos
objetivos a alcanzar, siendo repartidos entre las diversas iteraciones del proyecto, además del
seguimiento del proyecto por parte de los directores del mismo.
4.1 Descripción
SCRUM [scr] es la metodología elegida para la gestión del proyecto. Fue definida como
una estrategia flexible donde el equipo de desarrollo trabaja unido para alcanzar una meta.
Un principio clave de Scrum es que los requisitos del proyecto pueden cambiar en cualquier
momento durante la realización del mismo, lo que no podría ocurrir con un modelo de
desarrollo tradicional.
Fue descrito por Hirotaka Takeguchi e Ikujiro Nonaka en el artículo "New New Product
Development Game"(Poner Referencia). Sus autores lo describieron como el desarrollo de
un producto comercial que hiciera crecer la velocidad y la flexibilidad, basado en casos de
estudio de marcas de automoción e impresión.
Lo llamaron el método del rugby, ya que todo el proceso es completado por un equipo
23
multifuncional mediante multitud de fases solapadas, donde el equipo «trata de avanzar y se
pasa la pelota desde atrás hacia adelante».
4.2 Roles
En SCRUM hay tres roles fundamentales junto a otros roles auxiliares. Estos tres roles
que forman el equipo SCRUM son los que están construyendo el producto.
Propietario del Producto (Product Owner)
Responsable del producto en el área de negocio y voz de los usuarios del producto final.
Encargado de la escritura de historias de usuario y de su adición al product backlog.
Estas historias de usuario son descripciones en lenguaje natural de lo que el usuario
necesita hacer como parte de su trabajo.
En este caso, el rol de Product Owner es ejercido por los empleados de la empresa de
Acumbamail.
Scrum Master
Responsable de la motivación al equipo destinado a la consecución de los objetivos
y resultados del proyecto. No es la persona concebida como el tradicional lider del
proyecto o gestor de proyecto. Es el encargado de supervisar la realización de la
metodología SCRUM.
El rol descrito en este caso es realizado por ambos directores de proyecto.
Equipo de Desarrollo
Es el encargado de la realización de los incrementos en la funcionalidad del producto
al final de cada sprint. Comúnmente, el equipo está formado por un grupo de 3 a 9
personas con conocimientos en campos muy variados relacionados con el proyecto.
Realiza el trabajo de análisis, diseño, desarrollo, pruebas, comunicación técnica,
documentación, etcétera.
El rol es desempeñado por Jesús Botella Blanco.
4.3 Documentación
Product Backlog
Es un documento con todos los requisitos pertenecientes al proyecto: Características,
fallos, requisitos no funcionales, etcétera. En suma, todo aquello necesario para el
desarrollo del mismo. Los requisitos son ordenados por el «Product Owner» según el
riesgo, valor para el negocio, dependencias, deadline, etcétera.
Este documento es utilizado para recopilar las peticiones de modificación de un
producto. Incluye nuevas características a implementar, el reemplazo de viejas
funcionalidades y los problemas resueltos. Además debe asegurar que el equipo con
su trabajo maximiza los beneficios del negocio para el propietario del producto.
24
Normalmente, el Product Owner y el Scrum Team se reunen y organizan todo aquello
que necesita ser priorizado y debe ser incluido en los sprints.
Sprint Backlog
El sprint backlog es una lista del trabajo que el equipo de desarrollo debe realizar
durante el siguiente sprint. Esta lista es construida mediante la selección de elementos
del product backlog considerados como prioritarios hasta que el equipo de desarrollo
confirma que se ha cubierto el cupo de trabajo para el siguiente sprint.
Las tareas en el sprint backlog nunca son asignadas a un miembro concreto del
equipo de desarrollo, en su lugar se realizan por los distintos componentes según crean
oportuno. A menudo se suele encontrar una pizarra dividida por fases de desarrollo,
’por hacer’, ’en progreso’, y ’acabado’.
Una vez que el sprint backlog se ha completado no pueden ser añadidas funcionalidades adicionales, excepto si es incorporada por el equipo. Cuando el sprint ha acabado,
el product backlog es reanalizado y vuelto a priorizar si es necesario, y se vuelve a
empezar el proceso de construcción del product backlog.
Burndown Chart
El diagrama del trabajo restante del sprint es mostrado públicamente. Se actualiza
diariamente y da una visión general del progreso conseguido en cada sprint.
Hay varios tipos de estas gráficas dentro de este diagrama. Por ejemplo, el «release
burndown chart» muestra la cantidad de trabajo restante para completar el objetivo de
una release del producto (distribuido en varias iteraciones).
4.4 Eventos & Reuniones
Sprint
Es descrito como una iteración en el desarrollo de software. Es un esfuerzo contenido
dentro de un rango de tiempo. La duración se fija antes de empezar el sprint.
Normalmente se trata de un periodo de tiempo comprendido entre una semana y un
mes, aunque lo más normal son dos semanas.
Cada sprint comienza con una reunión de planificación donde se eligen las tareas
que confirmarán el sprint, y acaba con una reunión de evaluación del progreso para
comenzar el nuevo sprint con las lecciones aprendidas.
Scrum aboga por que a la finalización del sprint haya un producto que esté completamente a prueba de fallos, documentado y preparado para la salida al mercado.
25
Reuniones
Reunión de Scrum diaria
Cada día dentro del periodo del sprint tiene lugar una reunión del equipo Scrum. En
ella cada miembro del equipo contesta a tres cuestiones: ¿Qué han hecho desde ayer?,
¿Qué van a hacer hoy?, ¿Qué impedimentos han encontrado?.
La reunión debe empezar puntual aún incluso si falta algún miembro del equipo, debe realizarse siempre en el mismo lugar, y la duración es de 15 minutos como máximo.
Reunión de planificación del sprint
Reunión que se realiza antes de cada ciclo de sprint. En ella se define el trabajo a
realizar, se realiza el sprint backlog con los detalles del tiempo de duración del trabajo,
y se identifica y comunica cuanto trabajo será hecho durante el sprint.
La duración no puede sobrepasar las ocho horas, las primeras cuatro horas se dedican
a priorizar el product backlog, y las segundas cuatro a elaborar el plan para el sprint,
que luego determinará el sprint backlog.
Reunión de finalización del sprint
Cuando acaba un sprint, se realizan dos reuniones: La reunión de evaluación del
progreso y la retrospectiva del sprint.
En la reunión de evaluación se analiza el trabajo que fue acabado y el trabajo planeado
que no se completó. Se presenta el trabajo completado a las partes interesadas del
proyecto. Esta reunión tiene un límite de cuatro horas.
En la retrospectiva del sprint se plantean dos cuestiones, ¿Qué fue bien durante el
sprint? y ¿qué puede ser mejorado en el próximo?. Se realizan continuas mejoras en el
proceso. Como límite puede durar tres horas, y es dirigida por el Scrum Master.
4.5 Integración con el Proyecto
El proyecto ha sido realizado siguiendo la metodología SCRUM. Las reuniones han sido
realizadas periódicamente, según lo requerían las circunstancias, al comienzo y finalización
de cada sprint realizado.
Los objetivos del proyecto han sido distribuidos a lo largo de las iteraciones realizadas.
4.5.1
Iteración 1
Sprint Backlog
Estudio de los datos de las campañas
26
Estudio y creación de Métodos de la API para la obtención de datos procedentes
de las campañas
Descripción
Esta es la iteración inicial del proyecto, en la que se ha realizado el estudio completo
de los posibles problemas y soluciones que podían surgir durante el mismo, para
confirmar su viabilidad y con el fin de que fuese realizado de la forma más eficaz
posible.
Se ha llevado a cabo el análisis de los datos que se podían obtener para la realización
de la predicción, como el asunto de las campañas, los suscriptores que han abierto la
campaña y el contenido del correo electrónico enviado.
Una vez completado el estudio y definidos los datos que es necesario es obtener para
la realización del proyecto se ha procedido a la obtención de los mismos.
Debido a la existencia de la API de Acumbamail se ha considerado la extracción de los
datos necesarios mediante este modo, ya que se pueden obtener fácilmente y de forma
automatizada mediante peticiones HTTP.
Estas funciones han sido creadas en Python, que es el lenguaje en el que se encuentra
programada la plataforma de Acumbamail.
4.5.2
Iteración 2
Sprint Backlog
Programación Wrapper API en Python
Estudio de frameworks para la creación del Sistema de Información
Descripción
Para la obtención automática de los datos de la plataforma de Acumbamail se necesita
un «wrapper» que facilite la tarea, además de proporcionar la información en un
formato fácil de tratar para cualquier aplicación o futuro desarrollo que requiera
utilizar esta información procedente de Acumbamail.
En esta iteración, además de lo mencionado anteriormente, se realizó un estudio de
los frameworks para la creación de sistemas de información. Es necesario para el fácil
almacenamiento de los datos obtenidos, mediante la utilización de un software ObjectRelational Mapping (ORM).
También incluye la búsqueda de un sistema de información para el almacenamiento de
los datos obtenidos, además de permitir la creación de una plataforma web.
Este sistema de información será el que soporte el servicio web destinado a la
predicción de los asuntos proporcionados por los usuarios, mediante un software ORM
que facilitará el almacenamiento y la posterior recuperación de los datos.
27
Algunos de los posibles candidatos son Django, un framework web escrito en Python,
y Node.JS combinado con Express, un framework web escrito en Javascript.
4.5.3
Iteración 3
Sprint Backlog
Construcción del sistema para la obtención de la información de las campañas
concurrentemente.
Creación del sistema de información encargado del almacenamiento y recuperación de la información de las campañas además de ser el servidor para la interfaz web
Descripción
La obtención de la información de todas las campañas es un proceso largo, ya que
hay que extraer una gran cantidad de información y es un proceso secuencial. Para la
reducción de los tiempos empleados en el proceso se ha utilizado un sistema de tareas
distribuido, Celery, en el que cada una de las tareas lanzadas consiste en obtener la
información de una única campaña para ser almacenada.
Este sistema de tareas permite personalizar el apartado de la ejecución, realizando varias tareas en hilos separados, o conectando el número de nodos de ejecución de Celery
deseados a la misma cola de mensajes para que realicen tareas concurrentemente.
En la pasada iteración se dedicó una parte de la misma a la elección del framework
destinado a la creación del sistema de información y una vez elegido se ha construido
todo el sistema.
La construcción del sistema pasa por la instalación del framework, la definición de
los modelos de base de datos, y por la configuración de la capa de presentación y el
controlador del sistema.
El controlador del sistema es el encargado de la conexión entre las URL(acrónimo)
que el usuario introduce en su navegador y el sistema de vistas incluido en Django. La
capa de presentación se encarga de procesar las peticiones que llegan al controlador y
ejecutar la vista correspondiente con un sistema de templates web.
4.5.4
Iteración 4
Sprint Backlog
Estudio de los diferentes frameworks para la creación de árboles de decisión
Identificación de la información innecesaria para su limpieza
Descripción
La creación del árbol de decisión es la parte fundamental del proyecto, por ello se va
a dedicar parte de una iteración completa para el estudio de los diversos frameworks
que se pueden encontrar con este propósito.
28
Es preciso encontrar un framework adaptado a las necesidades del proyecto para
la creación del árbol, y que permita el entrenamiento con los datos almacenados
actualmente para mejorar la calidad de las predicciones proporcionadas mediante el
asunto introducido.
En la información que va a ser obtenida a partir de las campañas existen numerosas
palabras que no aportan nada a la determinación del porcentaje de apertura obtenido.
Esas palabras que no son utilizadas necesitan ser eliminadas anteriormente a la
creación del árbol de decisión para evitar el procesamiento de las mismas, ahorrando
tiempo y utilización de memoria al servidor.
4.5.5
Iteración 5
Sprint Backlog
Limpieza y almacenamiento de la información obtenida
Creación del árbol de decisión
Entrenamiento del árbol
Descripción
Toda la información obtenida será almacenada posteriormente en la base de datos.
Ésta requiere ser limpiada y procesada de forma previa a su guardado, eliminando las
palabras de los asuntos que han sido identificadas anteriormente y no son necesarias
para el entrenamiento.
En esta iteración, una vez que se ha escogido el framework que va a ser utilizado,
se creará el árbol de decisión que es la base para la inferencia de supuestos que
será realizada posteriormente. Utilizando scikit-learn se realizará la construcción del
árbol, que será posteriormente entrenado con los datos limpiados de los asuntos de las
campañas junto con el porcentaje de apertura calculado.
El entrenamiento del árbol se realiza mediante los datos obtenidos y limpiados
previamente. Estos datos son convertidos al formato aceptado por el árbol, arrays con
las características de cada muestra.
Mediante estos datos, el árbol será capaz de estimar las muestras que los usuarios
introduzcan por los diversos medios puestos a su disposición.
Estos asuntos introducidos serán pasados por el árbol de decisión con el fin de estimar
qué rango de porcentaje de apertura se podrá obtener aproximadamente mediante las
estadísticas previamente obtenidas.
4.5.6
Iteración 6
Sprint Backlog
Inferencia de Supuestos
29
Creación del servicio web
Descripción
Una vez acabada la iteración anterior y con el árbol de decisión construido, y listo para
ser utilizado, es preciso realizar pruebas con la inferencia de supuestos.
Estos supuestos pueden ser pasados por el árbol cuando han realizado todo el proceso
que ha seguido la información de entrenamiento, es decir, ser eliminadas todas las
palabras que no determinan el significado del asunto y sean convertidos al formato de
datos que acepta el árbol.
Cuando toda la etapa perteneciente a la creación del árbol esté completada se
proporciona a los usuarios un punto de entrada para realizar sus estimaciones y utilizar
el servicio.
Este punto de entrada podrá ser utilizado por la interfaz web creada para este propósito
además de la plataforma de Acumbamail.
El servicio será construido a partir de un servidor HTTP personalizado. Este servidor
aceptará las peticiones de los usuarios que utilicen el servicio, mediante una petición
POST que contenga el asunto que quieren analizar.
Este servidor sólo podrá ser utilizado por la interfaz web del servicio y por la
plataforma de Acumbamail.
Cuando recibe una petición la redirige a la instancia del árbol creada cuando se inició
el servicio, que éste procesa y devuelve.
El servicio será utilizado mediante una interfaz web creada en el proyecto o la interfaz
web de la plataforma de Acumbamail.
4.5.7
Iteración 7
Sprint Backlog
Despliegue Automático de Aplicaciones
Descripción
Actualmente una de las partes más importantes en la realización de proyectos es el
despliegue de las aplicaciones. Este despliegue consiste en realizar todas las tareas
necesarias para que el software esté listo para su utilización.
En este caso, existen tres productos software, el árbol de decisión, el servicio web
que utiliza al árbol para realizar las predicciones y la plataforma web construida sobre
Django.
Gracias a la utilización de un sistema de control de versiones con un repositorio situado
en la nube, proporcionado por Bitbucket, esta tarea es mucho más sencilla.
30
La tarea consistiría en realizar los cambios sobre la copia local en el ordenador
sobre el que se esté trabajando, guardar esos cambios y mandarlos al repositorio para
actualizar la copia remota. Luego descargar estos cambios en el servidor y realizar las
operaciones necesarias para que sean puestos en marcha.
Gracias a algunas herramientas disponibles actualmente se puede detallar todo
este proceso y las acciones que es necesario realizar para que sean ejecutadas
automáticamente en el ordenador local y en el servidor remoto mediante algúna
herramienta de acceso remoto como SSH.
Todo este proceso es automático y el desarrollador sólo tiene que estar centrado en
la tarea principal, que es el desarrollo de los distintos sistemas que conforman el
proyecto.
4.5.8
Iteración 8
Sprint Backlog
Creación de plataforma web
Integración en Acumbamail
Descripción
Para facilitar el acceso al servicio de la predicción se ha creado una plataforma
independiente de la de Acumbamail para aquellos usuarios que no tengan cuenta en la
misma. Esta plataforma está soportada por el sistema construido previamente para el
almacenamiento de la información de las campañas en Django.
Cuando los usuarios accedan al servidor se les mostrará una página realizada en
HTML, en la cual podrán introducir su asunto y realizar la estimación.
Esta interfaz web está construida con Bootstrap para que pueda ser utilizada en una
gran variedad de dispositivos, como móviles, tablets, etcétera. Además se utiliza
jQuery para dotar de comportamiento y animaciones a la misma.
Esta interfaz hace una llamada POST al servicio, y este le devuelve la clase encuadrada
del asunto introducido.
El usuario recibe feedback de su asunto además de algunos consejos básicos sobre
Email Marketing para que pueda mejorar sus campañas.
El resultado es notificado mediante la misma página donde ha introducido el asunto
en la interfaz web, a través de un aviso que será acorde con la respuesta obtenida del
servicio. El color será distinto según el rango de porcentajes que devuelva el servicio.
El usuario podrá introducir el número de asuntos deseado sin que le sea impuesto
ningún limite.
31
4.5.9
Iteración 9
Sprint Backlog
Integración en Acumbamail
Descripción
Este trabajo está diseñado para la integración en la plataforma de Acumbamail, proporcionando consejos sobre los asuntos de las campañas de los usuarios introducidos.
Estos consejos serán útiles para la mejora de la tasa de apertura en las campañas de los
usuarios de la plataforma.
Esta integración se realizará mediante una llamada POST al servicio creado
anteriormente. Cuando se realice la llamada y se reciba la respuesta, al usuario se
le mostrará mediante una notificación en la misma página donde fue introducido el
asunto.
Esta notificación incluirá el resultado de la predicción junto a un enlace a consejos
relacionados con email marketing para la posible mejora de los resultados.
El uso del servicio será transparente al usuario, careciendo de referencias al servicio
externo que proporciona la clasificación según la tasa de apertura de los asuntos
introducidos.
Este servicio estará siempre disponible para los usuarios de la plataforma, corriendo
en un servidor dedicado para ello.
4.5.10
Iteración 10
Sprint Backlog
Documentación
Descripción
Esta etapa se irá completando a medida que se vaya realizando el trabajo, pero se
reserva una iteración para realizar todo lo restante concerniente a la documentación,
posibles funcionalidades no implementadas, etcétera.
Toda la documentación será realizada en LATEX, mediante editores con versión para
Linux y Mac OS X.
Esta documentación incluye todos los aspectos y requisitos del proyecto, objetivos,
antecedentes y estado del arte, así como el modo en que ha sido realizado, y los
resultados obtenidos con la realización del mismo.
Contiene la planificación de los tiempos del proyecto y qué problemas han sido
encontrados a lo largo de todo su desarrollo.
Además se incluyen las conclusiones obtenidas en la realización del proyecto, los hitos
más destacables del trabajo realizado, y las posibles ampliaciones a partir del mismo
32
junto con otros proyectos relacionados que pueden ser explorados.
4.6 Planificación de Tiempos
Figura 4.1: Línea de Tiempo perteneciente a los hitos del proyecto.
33
Capítulo 5
Resultados
E
este capitulo se describen las decisiones adoptadas para la consecución de los
objetivos presentados en el capítulo 2.
N
5.1 Visión General
Este trabajo consta de varias partes bien diferenciadas:
Obtención de la información procedente de Acumbamail.
Construcción y Entrenamiento del árbol de decisión
Creación del servicio web
Implementación de la interfaz web
Integración del servicio en la plataforma de Acumbamail
Para todas ellas ha sido necesaria la investigación sobre la tarea a realizar debido a las
numerosas alternativas encontradas a la hora de tratar la solución del problema, y la intención
de encontrar la solución más adecuada en términos de eficiencia, eficacia y facilidad en la
implementación.
Se trata de una tarea compleja que ha requerido de mucho esfuerzo para solucionar los
problemas encontrados y realizar un trabajo de calidad, acorde con el conocimiento adquirido
durante los años cursados.
En la figura 5.1 se ha incluido un diagrama del funcionamiento del sistema para una mejor
comprensión.
El papel del usuario en el proyecto es el de la utilización del servicio, accediendo bien
mediante la página web construida para el proyecto, o bien mediante la plataforma de
Acumbamail en la cual también se encuentra integrado.
El resultado de su consulta será el mismo independientemente del servicio desde el que la
realice.
35
Página Web del Proyecto
Página Web de Acumbamail
Interfaz Web · Desarrollada para el proyecto
Interfaz Web · Plataforma de Acumbamail
Servicio Web
Árbol de Decisión
Figura 5.1: Esquema de utilización del servicio
36
5.2 Construcción del Sistema de Información
El proyecto contiene las siguientes clases, pertenecientes al wrapper de la API, el servicio
web y el modelo de Django que será exportado a tabla de base de datos.
Figura 5.2: Diagrama de clases del proyecto
La clase AcumbamailAPI es el wrapper encargado de la obtención de los datos necesarios
de la API de Acumbamail mediante los métodos creados para ese fin, obteniendo con cada
uno una información distinta.
Este wrapper es invocado mediante la clase AcumbamailData, que es la encargada de
la extracción de la información y de su posterior procesamiento para que la información
almacenada en la base de datos se encuentre ya limpia de información innecesaria.
Esta información es guardada por el ORM en la base de datos con el modelo plasmado en
la clase DecisionTreeData, que posteriormente es recuperada por el servicio web mediante
la clase DecisionTree que realiza la creación del árbol, entrenamiento y la inferencia de
supuestos.
La clase TreeClasses es una enumeración de las posibles clases en las que campañas
introducidas en el árbol pueden ser encuadradas.
El árbol de decisión construido y la información proporcionada por Acumbamail requiere
un sistema base que permita el almacenamiento y la fácil consulta de la misma.
Para ello se ha construido una plataforma web gracias al framework Django. Este
framework permite el fácil almacenamiento de la información debido a su ORM que hace
posible guardar información mediante objetos en la base de datos.
Este framework sigue el patrón Modelo Vista Controlador (MVC), consistente en la
separación de los componentes de la representación la información y la interacción con el
usuario.
Los componentes más importantes de este framework para el sistema son los modelos,
que contienen la representación de la información de negocio en el sistema.
37
En este caso la información de negocio es la perteneciente a los datos de las campañas,
representada mediante el modelo creado para el almacenamiento. Este modelo necesita
tres campos: Número de la campaña a la que pertenece la información por si es necesario
realizar alguna comprobación, las palabras incluidas en el asunto una vez que ya hayan sido
eliminadas las palabras sobrantes y el porcentaje de apertura que ha obtenido la campaña.
Este modelo en Django se construye de la siguiente forma:
from django . db import models
class DecisionTreeData ( models . Model ) :
subject_words = models . TextField ()
ope ned_pe rcenta ge = models . IntegerField ()
campaign_number = models . IntegerField ()
Listado 5.1: Modelo de Información perteneciente a las campañas almacenadas
Este modelo es plasmado en la base de datos con estas características:
+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - -+
| Field
| Type
| Null | Key | Default | Extra
|
+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - -+
| id
| int (11) | NO
| PRI | NULL
| auto_i ncrement |
| subject_words
| longtext | NO
|
| NULL
|
|
| o p e n e d _ p e r c e n t a g e | int (11) | NO
|
| NULL
|
|
| c am pa i gn _n um b er
| int (11) | NO
|
| NULL
|
|
+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - -+
Listado 5.2: Modelo de Información perteneciente a las campañas almacenadas
Este modelo será usado posteriormente para guardar la información mediante Celery y
para la recuperación de la información utilizada por el servicio web para la creación del
árbol de decisión.
Directamente se encarga del almacenamiento y de la recuperación de la información de la
base de datos sin realizar ninguna consulta en lenguaje SQL. Únicamente hay que configurar
el puerto y el servidor donde se encuentre la base de datos, MySQL en este caso, en el archivo
de configuración de Django (Settings.py).
Este sistema además de lo mencionado anteriormente, será el servidor de la interfaz web
que será construida a continuación.
5.3 Obtención de la información procedente de Acumbamail
La primera etapa del proyecto es la obtención de los datos de las campañas procedentes
de Acumbamail.
Estos datos se encuentran almacenados en la base de datos MySQL perteneciente a la
plataforma de Acumbamail. Los usuarios pueden consultarlos cuando deseen para obtener
38
toda la información y las estadísticas referentes a las campañas enviadas.
Una de las formas más sencillas para la obtención de estos datos es mediante consultas
directas al servidor de base de datos, que luego serán almacenadas en el sistema de
información para su posterior procesamiento.
Acumbamail dispone de una API para sus usuarios, mediante la cual se puede extraer y
añadir información concerniente a los suscriptores en las listas de newsletters (crear listas,
añadir, obtener y eliminar suscriptores, obtener estadísticas de las listas, etcétera...).
Con la finalidad de dar un valor añadido a la API de la plataforma, se ha optado por la
última opción, añadiendo los métodos requeridos para obtener toda la información necesaria
procedente de las campañas.
La mínima información necesaria comprende: Número de emails enviados en total,
número de aperturas por parte de los suscriptores de la campaña, y el asunto del correo
electrónico enviado en la campaña. Aunque ésta no será la única información que se
proporcionará a los usuarios de la plataforma, ya que adicionalmente se incluirán todas las
estadísticas pertenecientes a sus envíos (quejas de usuarios, bajas de la newsletter, correos
que han dejado de existir, entre otros).
Gracias a esta información será posible conocer el porcentaje de aperturas de la campaña
enviada, que es el objetivo principal, la predicción del porcentaje de aperturas de un
newsletter mediante su asunto.
Una vez que es posible adquirir la información, es necesario implementar un método que
permita obtenerla para su posterior procesamiento.
El wrapper, escrito en Python, hace uso de la librería urllib2 y JSON para la obtención de
los datos de la API mediante una llamada POST con los datos de la autenticación, el número
identificador de cliente y un token que proporciona la autenticación en la plataforma, y otros
parámetros necesarios como el identificador de la campaña de la que se quiere obtener la
información.
def g e t C a m p a i g n B a s i c I n f o r m a t i o n ( self , campaign_id ) :
parameters ={ " campaign_id " : campaign_id }
return self . callAPI ( " g e t C a m p a i g n B a s i c I n f o r m a t i o n " , parameters )
Listado 5.3: Método para la obtención de la información de las campañas en wrapper de la
API en Python
Para la reutilización del código, y seguir con el principio DRY (Don’t repeat yourself, "no
te repitas") de las buenas prácticas en programación, se ha construido un único método que
es al que todas las funciones llaman para obtener la información. Este método es llamado
mediante la función de la API a la que se quiere invocar junto con los parámetros adicionales
39
que sean necesarios. Dichos parámetros son incluidos automáticamente por la función, que
los obtiene de los atributos de la clase y fueron introducidos cuando la instancia de la clase
fue creada.
def callAPI ( self , method , parameters = {}) :
url = " https :// acumbamail . com / api /1/ " + method + " / "
parameters [ ’ customer_id ’] = self . customer_id
parameters [ ’ auth_token ’] = self . auth_token
data = urllib . urlencode ( parameters )
req = urllib2 . Request ( url , data )
response = urllib2 . urlopen ( req )
json_response = response . read ()
return json . loads ( json_response )
Listado 5.4: Método encargado de realizar la petición HTTP a la API para la obtención de la
información.
Debido a la gran cantidad de datos que proporciona, la mejor opción es la obtención de
estos datos de forma asíncrona mediante tareas ejecutadas concurrentemente. Así es posible
obtener la información de varias campañas a la vez disminuyendo considerablemente el
tiempo de espera hasta que todas las tarea sean completadas.
Para ello se utilizará Celery.
El script para la obtención de los datos de la API está escrito en Python, y por lo tanto
puede ser utilizado por la tarea Celery que es necesario implementar. Este script es capaz
de obtener la información directamente de la API con los parámetros necesarios mediante
urllib2, una biblioteca que facilita la obtención de datos por medio del protocolo HTTP.
¿Qué cometido va a realizar nuestra tarea?
La tarea asíncrona se va a encargar de llamar a los métodos creados para este propósito y
obtener la información necesaria de las campañas.
Esta información necesita ser procesada y limpiada antes de ser guardada, para evitar tener
que desprendernos de la información innecesaria contenida en el asunto cada vez que éste
sea utilizado.
Éste código es el código escrito para la tarea de Celery, mediante la cual se obtiene
la información de cada una de las campañas que después será tratada para eliminar los
elementos innecesarios.
¿Qué se puede catalogar como información innecesaria?
Información innecesaria es aquella que no es determinante para comprender perfectamente
sobre qué trata el correo leyendo únicamente el asunto.
40
@shared_task
def getDataAPI ( campaign_id ) :
datos_acmb = AcumbamailData ()
campaign = datos_acmb . getInfo ( campaign_id )
dtd = DecisionTreeData ()
dtd . subject_words = json . dumps ( campaign [ ’ subject ’ ])
dtd . o pened _perce ntage = campaign [ ’ opened ’]
dtd . campaign_number = campaign_id
dtd . save ()
Para la personalización de las campañas de email se utiliza un concepto llamado
mergetags. Los mergetags permiten añadir contenido dinámico al correo electrónico enviado
en la campaña. Por ejemplo, realizar una personalización de la newsletter incluyendo el
nombre del destinatario en el asunto. Este contenido es introducido por el usuario en cadenas
envueltas por los caracteres *| y |*. Estos elementos que es posible encontrar en los asuntos
no tienen ningún valor semántico para la comprensión del asunto, y por tanto pueden ser
eliminados sin ningún problema.
En los asuntos de los correos, igual que en el lenguaje escrito, se encuentran abundantes
palabras que no son determinantes para el entendimento del contenido. Estas palabras
son llamadas palabras vacías (Stopwords en inglés), formadas por artículos, pronombres,
preposiciones, etcétera.
Todo lo descrito en los párrafos anteriores necesita ser eliminado para comenzar el
procesamiento de la información, destinado a la creación de los datos de entrenamiento
necesarios para el árbol de decisión utilizado para la resolución del problema. Facilita
el procesado de la información, ya que elimina información que no aporta valor para el
resultado y alargaría el proceso innecesariamente.
Una vez que ya se dispone únicamente del contenido que es útil, éste será guardado en
una base de datos para su posterior utilización.
Esta información será actualizada cada cierto tiempo con el objetivo de recopilar cada vez
más información y mejorar poco a poco los resultados de las predicciones obtenidas. [?]
5.4 Construcción del Árbol de Decisión
Una de las partes más importantes del proyecto es la construcción del árbol de decisión,
que será el encargado de proporcionar las predicciones de las newsletters gracias a la
clasificación de las campañas por palabras similares.
Hay diversos frameworks destinados a la creación de este tipo de árboles, el más conocido
escrito en Python es scikit-learn, que es el que ha sido utilizado en el proyecto.
41
5.4.1
Entrenamiento del Árbol e Inferencia de Supuestos
Una de las acciones fundamentales para el funcionamiento del sistema es el entrenamiento
del árbol de decisión.
Para esta tarea se utilizan los llamados «training sets» o conjuntos de entrenamiento,
conjuntos de datos relevantes extraidos de las observaciones obtenidas.
Los árboles de decisión clasifican instancias pasándolas por el árbol desde la raiz hasta
algún nodo hoja, el cual proporciona la clasificación de la instancia. Esta clasificación es
realizada empezando por la raíz, probando el atributo por todos sus posibles valores y
moviéndose a la rama que corresponde por el valor del atributo.
Para su mejor comprensión se va a realizar un ejemplo con un árbol de decisión que ayuda
a determinar si es posible o no jugar al tenis. (ver Figura 5.3)
La primera variable que determina la clasificación es la previsión del tiempo. Ésta
previsión puede ser soleada, nublada, o lluviosa.
Si en el día de hoy el tiempo está soleado, la siguiente variable es la humedad. Si la
humedad es alta, no se puede jugar al tenis. Si por el contrario, la humedad es normal, sí que
se puede jugar.
Si en el día de hoy el tiempo está nublado, sí se puede jugar al tenis.
Si el día de hoy es lluvioso, y el viento es fuerte no se puede jugar al tenis, pero por el
contrario si es débil sí que se puede
Por lo tanto, si se quiere saber si es posible jugar al tenis en un día soleado con
temperaturas altas, humedad alta y fuerte viento, es necesario pasar dicha información por el
árbol para que sea categorizada.
En este caso, como la previsión es soleada, el avance se realiza por la rama de la izquierda.
La siguiente variable que aparece es la humedad. Como la humedad del día de hoy es alta,
no se puede jugar al tenis.
Este es un ejemplo sencillo de cómo funciona un árbol de decisión ya entrenado.
En este punto se describe cómo se realiza el entrenamiento del árbol del proyecto.
Para el entrenamiento, el árbol toma como entrada dos arrays:
X: array que contiene las características extraidas de las campañas de newsletter. Tiene
tantas filas como muestras disponibles, y tantos elementos en cada fila como número
de palabras totales de las campañas obtenidas.
Y: array que contiene las clases pertenecientes a las muestras del array X. Contiene
tantos elementos como muestras haya. Contiene la clase a la que pertenece cada
muestra del array X.
42
Sol
eado
Al
t
a
Nubl
ado
Nor
mal
Ll
uv
i
oso
Fuer
t
e
Débi
l
Figura 5.3: Árbol de decisión para determinar si es posible jugar al tenis. Pueden ser
clasificadas las muestras comparando sus atributos con los del árbol y éste devolverá
la clasificación asociada con la muestra elegida. Extraido y traducido desde (M ACHINE
L EARNING , T OM M ITCHELL [Mit97])
Cada uno de los elementos del array X (listas de 1s y 0s) es una de las características
pertenecientes a una campaña. Es decir, el numero de elementos de la lista coincide con
el número de palabras contenidas en todas las campañas obtenidas de Acumbamail. Estas
características se construyen paso a paso, comprobando si cada palabra de las recopiladas se
encuentra en el asunto en cuestión.
El segundo array, Y, consiste en las clases obtenidas por medio de la agrupación de los
porcentajes. Cada una de las clases corresponde a una de las muestras del array X. Éstos
porcentajes se han agrupado para conseguir una menor dispersión en los datos introducidos
en el árbol. Es posible conocer más detalles sobre estas clases en el cuadro 5.1.
Un ejemplo de estos arrays sería:
X = [[0, 1, 1, 0, 0, 0, 1], [1, 0, 1, 1, 0, 1, 0], [1, 1, 1, 0, 1, 1, 0], [0, 0, 0, 1, 0, 0, 1],
[1, 0, 1, 0, 1, 0, 1], [0, 1, 0, 1, 0, 1, 0], [1, 0, 0, 1, 1, 1, 0]]
Y = [0, 1, 2, 3, 4, 5, 6]
Estos arrays son construidos mediante
43
def c o n v e r t D a t a T o D a t a T r e e ( self ) :
subject = json . loads ( campaign . subject_words )
opened = campaign . op ened_ percen tage
if 0 <= opened < 100:
appearances =[]
for subject_word in self . subject_words :
if subject_word in subject :
appearances . append (1)
else:
appearances . append (0)
self . data . append ( appearances )
if 0 <= opened <= 7:
self . classes . append ( TreeClasses . muy_malo )
elif 8 <= opened <= 13:
self . classes . append ( TreeClasses . malo )
elif 14 <= opened <= 19:
self . classes . append ( TreeClasses . normal )
elif 20 <= opened <= 30:
self . classes . append ( TreeClasses . bueno )
elif 31 <= opened <= 40:
self . classes . append ( TreeClasses . mejor_bueno )
elif 41 <= opened <= 60:
self . classes . append ( TreeClasses . muy_bueno )
elif 61 <= opened <= 99:
self . classes . append ( TreeClasses . excelente )
Listado 5.5: Código que convierte los asuntos en el formato aceptado por el árbol
En el listado 5.5 siendo el atributo subject_words de la clase, un conjunto ordenado de
las palabras contenidas en todas las campañas obtenidas se añade al array un 0 o un 1
dependiendo de si la palabra está contenida o no, y posteriormente, en función de la tasa
de apertura de la campaña, se la encuadra en la clase correspondiente.
Si las palabras recopiladas son libro, camisetas, fútbol, ordenador, vacaciones, verano,
y oferta, la primera campaña contendría camisetas, fútbol, oferta. Esas serían sus
características para nuestro árbol de decisión.
Para ilustrar lo descrito anteriormente, se va a exponer un ejemplo como el del juego del
tenis en la Figura 5.3.
Se parte de la hipótesis de que las palabras recopiladas de las campañas son: «vacaciones»,
«regalos», «amor», «boda», «película».
El árbol puede tener como raíz cualquiera de las palabras mencionadas anteriormente.
Colgarían de él todos los posibles atributos, en este caso si la palabra se encuentra en el
asunto o por el contrario no está contenida. Después se encontrarían las palabras sucesivas
de los asuntos contenidos en todas las campañas como hijos de las ramas dependiendo de si
se encuentran enlazados con alguna de las palabras ya existentes en el árbol.
44
Clase
Porcentajes que comprende
Etiqueta
Porcentaje de Campañas Cubierto
0
0≤x≥7
Muy malo
1
8 ≤ x ≥ 13
Malo
2
14 ≤ x ≥ 19
Normal
3
20 ≤ x ≥ 30
Bueno
4
31 ≤ x ≥ 40
Mejor que Bueno
5
41 ≤ x ≥ 60
Muy bueno
6
61 ≤ x ≥ 99
Excelente
9.25 %
Acumulado: 9.25 %
17 %
Acumulado: 26.25 %
18.69 %
Acumulado: 44.94 %
18.16 %
Acumulado: 63.1 %
9.98
Acumulado: 73.08 %
14.17 %
Acumulado: 87.25 %
12.75 %
Acumulado: 100 %
Cuadro 5.1: Detalles sobre la agrupación de los porcentajes de la tasa de apertura en las
campañas. Detalles sobre que porcentaje engloba cada clase, la etiqueta que se asigna a cada
clase y el porcentaje de campañas qué cubre cada una
Se va a tomar como ejemplo la frase "Ten unas vacaciones de película".
A esta frase sería necesario eliminarle las stopwords y las palabras sin significado, como
«unas» o «de» para evitar palabras innecesarias.
El asunto que sería pasado por el árbol contendría las palabras ”ten”, ”vacaciones” y
”película”.
Siguiendo el árbol de ejemplo en la figura 5.4, la primera palabra que se encuentra es
vacaciones. Como en nuestro asunto está contenida se avanza por la rama de la izquierda
(sí). Ahora la siguiente palabra que es encontrada es película. Como también está contenida
se avanza por la rama izquierda (sí). El árbol, gracias a los datos de entrenamiento, estima
que los asuntos que contienen las palabras vacaciones y película pertenecen a la clase 3. Esta
clase engloba los porcentajes desde el 20 % hasta el 30 %, ambos inclusive.
Como se puede observar, es una tarea costosa cuando es posible encontrar varias decenas
de miles de palabras contenidas en todas las campañas extraídas, si bien permite realizar
estimaciones precisas sobre los datos que se han proporcionado al árbol para realizar la
inferencia del supuesto.
5.5 Servicio Web
Para la utilización del árbol de decisión se ha construido un servicio web mediante el cual
es posible obtener fácilmente la inferencia de los supuestos introducidos por los usuarios.
Este servidor está creado con la clase BaseHTTPServer en Python.
Mediante un handler se implementan las operaciones necesarias para la funcionalidad
45
Vacaciones
sí
no
Película
sí
Clase: 3
Amor
no
no
Clase: 2
Boda
sí
Clase: 1
sí
Clase: 6
Figura 5.4: Árbol de decisión creado mediante palabras de ejemplo para ilustrar el
funcionamiento del árbol que ha sido creado con las campañas de Acumbamail. Ejemplo
en miniatura del árbol real creado con el framework para Python utilizado, scikit-learn
planteada anteriormente.
Estas funcionalidades comprenden la recepción de las peticiones POST desde los distintos
puntos de entrada al servicio, y la respuesta a las peticiones HEAD que se requieran.
Mediante las cabeceras están deshabilitados los demás dominios que puedan realizar una
petición, dejando solo hábiles los dominios que sean de nuestra propiedad.
Access−Control−Allow−Origin : http :// sandbox . acumbamail . com
Listado 5.6: Propiedad de la cabecera que controla el acceso de los servidores web al servicio
A continuación se detalla el funcionamiento del servicio:
Los casos de uso de todos los actores con respecto a la utilización del servicio web están
detallados en la figura 5.5.
46
Figura 5.5: Diagrama de casos de uso pertenecientes al servicio web
El servicio se encuentra permanentemente ejecutado en un servidor web respondiendo
y parseando las peticiones POST que le llegan por el puerto en el que se encuentra
escuchando.
Cuando llega una petición al servicio este llama a la función implementada en el handler
encargada de parsear la petición. Ésta función está encargada de parsear los argumentos
contenidos en la petición y de mandar el resultado a través de HTTP.
Estos argumentos pueden llegar al servidor de varias formas, según indique el campo
«content-type» en las cabeceras de la petición POST. Se pueden encontrar dos valores,
«application/x-www-form-urlencoded» o «multipart/form-data».
Mediante «application/x-www-form-urlencoded», lo que el servidor recibe es una cadena
con todos los atributos enviados mediante POST, separando los pares de nombre y valor con
un ampersand (&) y los nombres son separados de los valores por el símbolo de igual (=).
variable1 = valor1&variable2 = valor2&variable3 = valor3
Cuando los payloads son muy grandes y contienen muchos caracteres alfanuméricos, este
método se vuelve muy ineficiente ya que por cada byte no alfanumérico en cada valor utiliza
tres bytes para representarlo, multiplicando el tamaño por tres.
La otra opción es «multipart/form-data». Con este método cada par está representado por
una parte en un mensaje Multipurpose Internet Mail Extensions (MIME), separando estas
partes por un caracter especial que no aparece en ninguno de los valores del payload.
Una vez que ya han sido extraidas todas estas variables contenidas en la petición, el asunto
que el usuario ha introducido es procesado para dejar únicamente solo las palabras válidas,
es decir, aquellas que pueden determinar el resultado.
Este proceso se realiza mediante una función creada para este propósito, que es utilizada
47
también cuando se obtienen los datos procedentes de las campañas.
Posteriormente el árbol realiza la estimación del asunto mediante los datos que ya han sido
proporcionados con anterioridad.
La respuesta que proporciona el árbol de decisión es devuelta al servicio web desde el que
ha sido llamado mediante JSON, junto a un mensaje para poder determinar si la petición ha
sido correcta (Ver Listado 5.7) o se ha producido algún fallo (Ver Listado 5.8).
{ " status " : " ok " , " subject_class " : " 3 " }
Listado 5.7: Respuesta del servicio web en formato JSON, Petición Correcta
{ " status " : " error " , " error_msg " : " The service is temporarily
unavailable . " }
Listado 5.8: Respuesta del servicio web en formato JSON, Petición Errónea
Una vez que la respuesta es construida es enviada de vuelta al usuario.
Ésta es procesada por su navegador y muestra el resultado a través de la interfaz web.
Aunque en la figura 5.6 esté ejecutado manualmente, en el entorno de producción este
servidor es ejecutado mediante un servicio en Linux, dejando el mando de la ejecución al
sistema y recopilando todos los errores un log situado en una carpeta creada al efecto en la
unidad de almacenamiento.
5.6 Interfaz Web
Para la fácil interacción de los usuarios con el servicio se ha creado una interfaz web
minimalista, que está dedicada a la introducción del asunto por parte de los usuarios y a
mostrar, de una forma simple y que favorezca la usabilidad, la respuesta obtenida desde el
servicio web, ejecutado en el mismo servidor.
En la Figura 5.7 se puede ver el diseño de la interfaz.
Esta interfaz está construida con la finalidad de centrar al usuario en la tarea principal,
realizar la predicción de los asuntos.
Se encuentra únicamente una barra de navegación con enlaces a las distintas partes de
la interfaz. Como contenido principal se dispone de un campo destinado a la introducción
del texto del asunto. Con el fin de recordar la utilidad del mismo se encuentra marcado a la
izquierda con el icono del sobre de una carta.
Cuando el usuario introduce el asunto únicamente es preciso pulsar el botón enviar para
que se realice la predicción.
48
Figura 5.6: Captura de pantalla perteneciente al servidor ejecutado manualmente para
la muestra del procesamiento de asuntos. Prueba de predicción con la frase "Ten unas
vacaciones de película".
Esta interfaz está construida mediante Bootstrap y jQuery como frameworks principales.
Estos frameworks permiten crear una interfaz de una forma fácil, sin necesidad de consumir
recursos en aspectos estéticos o de diseño.
Bootstrap dispone de todos los elementos necesarios para la construcción de nuestra
interfaz.
Para la representación del resultado se utiliza una asociación de colores a cada rango de
tasa de apertura. El color rojo se asocia a una tasa de apertura baja, el color amarillo a una
tasa de apertura media, el color azul a una tasa de apertura media alta y el color verde a una
tasa de apertura alta.
Como se puede observar en las figuras 5.8, 5.9, 5.10, 5.12, correspondientes a las
notificaciones que aparecen en la interfaz, se puede diferenciar perfectamente a qué clase
(clases en las que se dividen el rango total de porcentajes de apertura) pertenece el asunto
analizado. Además en la notificación se encuentra de forma escrita el rango de porcentajes
al que la tasa de apertura del asunto investigado.
Junto a estas notificaciones de la tasa de apertura se proporcionan consejos para la mejora
49
Figura 5.7: Captura de pantalla perteneciente a la interfaz web creada para el acceso al
servicio perteneciente a los usuarios que no tengan cuenta en la plataforma de Acumbamail.
Pantalla inicial sin resultados de predicción
Figura 5.8: Captura de pantalla de la interfaz web creada para el acceso al servicio
perteneciente a los usuarios que no disponen de cuenta en la plataforma de Acumbamail.
Notificaciones de resultados correspondientes a las tasas de apertura alta
Figura 5.9: Captura de pantalla de la interfaz web creada para el acceso al servicio
perteneciente a los usuarios que no disponen de cuenta en la plataforma de Acumbamail.
Notificaciones de resultados correspondientes a las tasas de apertura media-alta
Figura 5.10: Captura de pantalla de la interfaz web creada para el acceso al servicio
perteneciente a los usuarios que no disponen de cuenta en la plataforma de Acumbamail.
Notificaciones de resultados correspondientes a las tasas de apertura media
50
Figura 5.11: Captura de pantalla de la interfaz web creada para el acceso al servicio
perteneciente a los usuarios que no disponen de cuenta en la plataforma de Acumbamail.
Notificaciones de resultados correspondientes a las tasas de apertura baja
de las campañas enviadas por email marketing.
Figura 5.12: Captura de pantalla de la interfaz web creada para el acceso al servicio
perteneciente a los usuarios que no disponen de cuenta en la plataforma de Acumbamail.
Consejos proporcionados a los usuarios
Estos consejos son ideas esenciales para que las campañas sean más exitosas. Es necesario
llamar la atención del receptor para que sienta curiosidad acerca del contenido de la campaña.
Para ello es preciso evitar las palabras habitualmente utilizadas en campañas de publicidad,
emplear un asunto que no tenga demasiada longitud, y renovarlo si se envía varias veces la
misma campaña.
La estructura descrita anteriormente es la que forma la interfaz web que los usuarios
utilizarán cuando accedan al servicio que se proporciona.
Como se aprecia en la figura 5.13, se dispone de una interfaz minimalista centrada en la
acción principal, consistente en mostrar el resultado de la predicción realizada mediante el
asunto proporcionado.
En el desarrollo de la interfaz se han seguido principios de usabilidad dictados por Jakob
51
Nielsen.
Se ha intentado minimizar la longitud vertical de la página para que no sea necesario hacer
scroll. Otra de las características importantes es el tamaño de la caja de búsqueda, con un
tamaño adecuado para la introducción del asunto. Igualmente se ha diseñado la página con
los elementos imprescindibles para su funcionamiento, evitando la sobrecarga y reduciendo
las incertidumples que se pudieran producir en el uso de la misma.
Figura 5.13: Captura de pantalla perteneciente a la interfaz web creada para el acceso al
servicio perteneciente a los usuarios que no tengan cuenta en la plataforma de Acumbamail.
Pantalla de resultados de predicción.
5.7 Integración con la plataforma de Acumbamail
Este proyecto está concebido con el objetivo de proporcionar el servicio creado a los
usuarios de la plataforma de Acumbamail. Este servicio es útil para ampliar información
acerca de los temas que han sido anteriormente enviados en las campañas y han tenido éxito,
o por el contrario no han sido exitosos y es necesario revisar el tema del asunto.
Esta integración se ha realizado de forma sencilla, mediante un botón en la interfaz web
actual.
La función de este botón es la activación del servicio. Cuando es pulsado se envía el
contenido de la caja de texto al servidor que alberga el servicio web mediante una petición
POST. Éste obtiene las variables incluidas en la petición, las procesa y las convierte al
formato necesario para realizar la predicción. Esto es pasado al árbol que proporciona la
predicción y es devuelta mediante JSON al cliente.
52
El navegador del cliente procesa la respuesta y dependiendo de la información obtenida
muestra unos elementos u otros.
Los elementos mostrados en la plataforma son los mismos que son mostrados en la interfaz
web propia del servicio.
La integración se ha realizado con el fin de facilitar al máximo la utilización por parte de
los usuarios.
La utilización del servicio en la plataforma se reduce a la inclusión de un botón junto al
campo de entrada de los asuntos en las creaciones de las campañas.
Por tanto, los usuarios sólo tienen que introducir el contenido del asunto cuando se
encuentren creando la campaña y para comprobar la estimación que proporciona el servicio
web únicamente es preciso pulsar el botón situado en la parte derecha.
El botón está asociado a un icono que de forma intuitiva proporciona información sobre
la función que realiza. El icono asociado es el de un tacómetro, un dispositivo para realizar
una medida.
Para clarificar la utilización del botón se ha incluido una burbuja que aparece al mover el
ratón sobre el icono y da una explicación de la acción que dicho botón ejecuta.
Como se puede observar en la figura 5.15, se ha realizado un control de errores para que el
usuario esté informado en todo momento del estado del proceso, y en su caso de la ocurrencia
del motivo del fallo, tanto si es un fallo del usuario como un fallo del servicio web.
Aunque la plataforma de Acumbamail incorpora su propia gestión de fallos como se puede
ver en la figura mencionada anteriormente, se ha incluido una gestión propia para que el
usuario reciba feedback en caso de que no se produzca ninguna acción cuando pulsa el
botón.
Para minimizar el impacto de la inclusión del servicio en la plataforma, además de evitar
el agrandamiento del contenido verticalmente en la página, se ha optado por la incorporación
de un enlace al contenido de los consejos proporcionados para la mejora de las campañas,
siendo los mismos que son ofrecidos en la interfaz web del servicio.
5.8 Integración Continua de Cambios
Uno de los aspectos claves del proyecto es la integración de los cambios realizados en el
ordenador local. Estos son enviados al repositorio y tienen que ser descargados del mismo
en el servidor remoto en el que el servicio está alojado.
Existen multitud de herramientas que permiten la automatización del despliegue de estos
cambios, denominados como “Integración Contínua”.
La herramienta elegida en el proyecto para la realización de esta tarea ha sido fabric.
Fabric es una biblioteca de Python y un ejecutable por línea de comandos para el despliegue
53
Figura 5.14: Captura de pantalla perteneciente a la interfaz web de Acumbamail. Pantalla de
utilización del servicio
Figura 5.15: Captura de pantalla perteneciente a la interfaz web de Acumbamail. Muestra de
errores en la interfaz.
Figura 5.16: Captura de pantalla perteneciente a la interfaz web de Acumbamail. Notificaciones de resultados correspondientes a las tasas de apertura media-alta.
de aplicaciones o de tareas para la administración de servidores. Proporciona un conjunto
de operaciones para ejecutar en una máquina local o para la ejecución de comandos en
terminales remotas.
54
5.8.1
¿Cómo se utiliza fabric?
La utilización de fabric es bastante sencilla. Únicamente es preciso escribir un script en
Python con las acciones que se desean realizar en la máquina local y en la remota.
En este caso, las acciones serían enviar los cambios locales al repositorio alojado en
Bitbucket en el que se encuentra la copia principal y descargar esos cambios en la máquina
remota mediante GIT.
Las acciones deseadas son definidas mediante tareas. Estas tareas son funciones comunes
a las que se le agrega un decorador que de forma transparente al usuario envuelve a la función
como una subclase de la clase Task de Fabric.
Fabric permite realizar todos los comandos deseados en las máquinas locales o remotas
mediante SSH.
import sys
from fabric . api
from fabric . api
from fabric . api
from fabric . api
import
import
import
import
sudo
cd
local , run
settings
HOST _MAPP ING_DI CT = { ’ master ’: ’ testplugins . acumbamail . com ’ }
B RA N C H _M A P PI N G _D I C T = { ’ master ’: ’ master ’ }
def pull ( env = ’ master ’) :
with settings ( user = ’ django ’ , password = ’ XXXXXXXXXX ’) , with cd ( ’/
home / django / tfg ’) :
run ( ’ git pull origin master ’)
def push ( env = ’ master ’) :
host = HO ST_MAP PING_D ICT [ env ]
local ( ’ git push origin %s ’ % B R A NC H _ M AP P I NG _ D IC T [ env ])
local ( ’ fab −H %s pull : env = %s ’ % ( host , env ) )
Listado 5.9: Modelo de Información perteneciente a las campañas almacenadas
Mediante el código del listado 5.9 se realizan las acciones deseadas para el despliegue de
los cambios que se hayan realizado en la máquina local.
Estas acciones consisten en realizar mediante el comando «git push» perteneciente a GIT
el envío de los cambios en los que previamente se ha realizado la acción commit (confirmar
que los cambios realizados pueden ser enviados) al repositorio en Bitbucket. Posteriormente,
mediante SSH, se ejecuta el comando «git pull» para descargar los cambios del repositorio
que se hayan subido desde la última vez que fueron descargados.
55
Capítulo 6
Conclusiones
Ahora se van a detallar las conclusiones obtenidas a la finalización del proyecto.
El campo de la inteligencia de negocio, como es conocido actualmente, es una materia
a explotar todavía por las empresas tecnológicas o no tecnológicas. Ésta permite obtener
información útil para el negocio gracias a los datos recopilados.
Ésto extrapolado a las campañas de email marketing que mandan estas empresas es lo que
se ha tratado de mejorar gracias a la realización de este proyecto.
Todas las estadísticas recogidas por Acumbamail procedentes de las campañas enviadas
mediante su servicio es lo que ha sido analizado, incluido en un árbol de decisión para
realizar las predicciones, y mostrado gracias a la creación de un servicio web que utiliza
el mismo a través de la plataforma de Acumbamail o la interfaz web creada para este
propósito.
6.1 Objetivos
Todos los objetivos han sido alcanzados satisfactoriamente.
Obtención de los datos procedentes de las campañas enviadas por Acumbamail
Estos datos son obtenidos gracias a los nuevos métodos de la API construidos para
este propósito, y mediante el wrapper en Python elaborado para facilitar su extracción
y almacenaje en la base de datos existente.
Construcción de la Información
Los datos extraídos se encuentran moldeados y en el formato que el árbol de decisión
acepta en su entrenamiento. Los datos originales han sido filtrados para eliminar lo
innecesario y conocer su porcentaje de apertura.
Construcción del Árbol de Decisión
El árbol de decisión está construido mediante el framework scikit-learn, y es entrenado
correctamente para mejorar los resultados de la inferencia de supuestos. Éste árbol es
el que da soporte al servicio web destinado a sus usuarios.
Inferencia de los Supuestos
El árbol de decisión realiza correctamente la inferencia de supuestos. Estos supuestos
57
son obtenidos mediante el servicio web que ha sido construido en Python. Igual que
los datos originales, son filtrados y convertidos al formato necesario para realizar la
inferencia.
Implementación del Sistema de Información e Integración de componentes
Se ha realizado una sencilla interfaz web en la que los usuarios pueden introducir sus
asuntos y conocer el resultado de la predicción, además de la integración del mismo
servicio en la plataforma de Acumbamail. Ambas soluciones utilizan el servicio web
creado para tal fin, que proporciona mediante una respuesta JSON la predicción del
asunto deseado.
Correcto Funcionamiento de todos los elementos del sistema
El sistema ha sido probado con éxito, y todos los elementos funcionan correctamente.
Hay una integración eficiente entre ellos.
6.2 Problemas Encontrados
Uno de las principales dificultades es la gran cantidad de información a manejar.
Las campañas que actualmente dispone Acumbamail en su base de datos tienen que ser
extraídas mediante la API, procesadas y almacenadas por el sistema construido. Después el
árbol de decisión ha de ser entrenado con esos datos.
La gran cantidad de datos almacenada hace que todo este proceso se alargue en el tiempo,
llevando múltiples horas hasta que es completado.
Otro de los factores determinantes es la construcción de la informacion. Debido a la gran
cantidad de palabras que se encuentran en todas las campañas, el árbol emplea mucho tiempo
en su construcción.
6.3 Propuestas de Mejora
Este proyecto es un comienzo básico de todo un sistema de mejora de campañas de email
marketing.
El primer parámetro analizado es el asunto, que puede permitir aumentar el porcentaje de
apertura en una campaña.
También hay multitud de parámetros que pueden permitir que nuestro correo no llegue a
la carpeta de SPAM del cliente de correo, o que los usuarios abran más enlaces del contenido
de la campaña.
Para que nuestra campaña no llegue a SPAM es preciso evitar palabras incluidas en correos
de publicidad como oferta, promoción, descuento, o no incluir demasiadas imágenes en
relación con el texto incluido en el correo electrónico.
Igualmente podría ser analizado el código de la plantilla de la campaña para determinar si
58
el contenido del correo podrá ser visualizado correctamente en los principales proveedores
de correo, como GMail, Hotmail, etcétera, además de en los clientes de correo desarrollados
para plataformas de escritorio y/o móviles.
Cada una de las campañas es enviada a distintas listas de suscriptores, y dependiendo de
las preferencias de cada usuario puede aumentar o disminuir el porcentaje de apertura. Para
mejorar las predicciones se podría segmentar los datos por los diferentes proveedores de
correo.
La interfaz web para la utilización del servicio es sencilla. Se podrían incluir más
funcionalidades con el fin de hacerla más completa, como el registro de usuarios para
llevar control de todas las acciones realizadas y guardar un histórico de las peticiones
realizadas.
Actualmente los datos analizados son proporcionados únicamente por Acumbamail, si
bien podrían ser incluidas fácilmente otras fuentes de datos utilizando la tarea creada en
Celery y creando otro wrapper para API para el servicio del que se van a incluir los datos.
59
ANEXOS
61
Anexo A
Creación de una aplicación web con Django
La creación de una aplicación web en Django es un proceso rápido y fácil, y en poco
tiempo se puede empezar a escribir la aplicación. Todo el conocimiento necesario sobre
Django, se encuentra en The Django Book [HKM07].
El primer paso es la instalación de Django. Esto puede ser realizado de varias formas,
descargándolo desde la página web oficial (http://www.djangoproject.com/download/)
o, lo más recomendado, mediante pip, un instalador de paquetes Python.
Para instalar pip se necesita descargar su archivo get-pip.py, que se puede descargar
mediante el comando wget en GNU/Linux.
wget https :// bootstrap . pypa . io / get−pip . py
Listado A.1: Modelo de Información perteneciente a las campañas almacenadas
Después es instalado con Python, mediante el comando (desde la misma carpeta donde se
encuentra el archivo):
sudo python get−pip . py
Listado A.2: Modelo de Información perteneciente a las campañas almacenadas
Una vez acabada la instalación de pip, ya se puede proceder a la instalación de Django.
Gracias a pip, es posible instalar paquetes python en la versión deseada, que no tiene que
ser necesariamente la última. El comando de instalación de Django en pip es:
sudo pip install Django
Listado A.3: Modelo de Información perteneciente a las campañas almacenadas
También se permite instalar una versión concreta, distinta a la última versión disponible.
63
sudo pip install Django ==1.4 a
Listado A.4: Modelo de Información perteneciente a las campañas almacenadas
Una vez finalizada la instalación de Django, si se va a utilizar una base de datos MySQL
es necesario instalar el controlador para Python, que es instalado así:
sudo pip install mysql−python
Listado A.5: Modelo de Información perteneciente a las campañas almacenadas
Ahora ya es posible empezar la creación de la aplicación en Django.
El primer paso es crear una carpeta que albergue el proyecto en la carpeta del usuario
correspondiente. Si se requiere tener varias instalaciones de Django independientes e instalar
diferentes paquetes es posible usar entornos virtuales (virtualenvs).
Una vez creada la carpeta y estando dentro de ella, se ejecuta el comando:
django−admin . py startproject ∗ mysite ∗
Donde mysite es el nombre dado al proyecto de la aplicación web.
Esto creará la estructura de directorios básica para el comienzo del proyecto, el archivo
manage.py, que es una utilidad para interactuar con el sistema mediante línea de comandos.
Dentro de la carpeta principal existe otra carpeta con el mismo nombre que contiene los
archivos, init.py, settings.py, urls.py y wsgi.py. Estos archivos contienen los ajustes, las URL
definidas para el servidor y el punto de entrada WSGI para el servidor web en el proyecto.
Una vez creado el directorio principal es posible arrancar el servidor aunque no haya nada
que mostrar, simplemente para comprobar su funcionamiento. El comando es:
python manage . py runserver
El comando tendrá una salida parecida a esta:
Validating models ...
0 errors found .
Django version 1.4.2 , using settings ’ mysite . settings ’
Development server is running at http :/ /1 27 .0 .0 .1: 80 00 /
Quit the server with CONTROL−C .
64
Si se accede a esa URL aparecerá un mensaje con el contenido «Welcome to Django» en
color azul.
Para la construcción de la aplicación se dispone de tres puntos clave, los modelos, las
vistas y las URL.
La configuración de las URL es la parte clave, puesto que indicará al sistema que métodos
tiene que ejecutar cuando se acceda a cualquiera de las URLs definidas.
Para ello se accede al archivo urls.py. Si se desea añadir más URLs es preciso incluirlas
en la variable urlpatterns.
Un ejemplo podría ser este:
from django . conf . urls . defaults import patterns , include , url
from tfg . views import inicio , info
urlpatterns = patterns ( ’ ’ ,
url ( r ’^ $ ’ , inicio ) ,
url ( r ’^ suma / $ ’ , info ) ,
)
En este ejemplo se encuentran configuradas dos URLs, la principal, y un subdirectorio
llamado suma.
Estas URL cuando son invocadas llaman a las vistas correspondientes, en este caso, inicio
para la URL principal y suma para la segunda URL.
Para la creación de estas vistas se necesita crear un nuevo archivo llamado views.py.
En este archivo, se incluirán dos funciones denominadas inicio y suma.
from django . http import HttpResponse
def inicio ( request ) :
return HttpResponse ( " Hello world " )
def suma ( request , one , two ) :
try:
one = int( one )
two = int( two )
except ValueError :
raise Http404 ()
sum = one + two
html = " < html > < body > La suma de %d mas %d es %d </ body > </ html > " % (
one , two , sum)
return HttpResponse ( html )
Estas funciones serán invocadas cuando se acceda a las URLs mediante el navegador.
65
Esta es la configuración básica de Django. Posteriormente, mediante los modelos es
posible incorporar la lógica de negocio a la aplicación web.
Conforme a lo descrito anteriormente, Django está dispuesto para comenzar la escritura
de la aplicación web.
66
Anexo B
Aspectos Legales
La titularidad de los derechos de propiedad intelectual del trabajo será compartida entre
Jesús Botella y Acumbamail S.L. Jesús Botella renuncia a cualquier tipo de reclamación que
pueda realizar a Acumbamail S.L. por la utilización de cualquier material derivado de la
realización de este trabajo.
No ha sido recopilado ni se ha trabajado con ningún tipo de dato personal, por tanto la
LOPD no es de aplicación en este proyecto.
67
Referencias
[ASJH11] Paul Adamczyk, Patrick H. Smith, Ralph E. Johnson, and Munawar Hafiz.
Rest and web services: In theory and in practice. In Erik Wilde and Cesare
Pautasso, editors, REST: From Research to Practice, pages 35–57. Springer,
2011. ISBN 978-1-4419-8302-2. URL http://dblp.uni-trier.de/db/
books/collections/Wilde2011.html#AdamczykSJH11.
[boo]
Bootstrap framework. URL http://getbootstrap.com/.
[BS07]
Chris Baggott and Ali Sales. Email Marketing By the Numbers. Wiley, 1st
edition, Jul 2007. ISBN 9780470148280.
[cel]
Celery. URL http://www.celeryproject.org/.
[CSS]
Css. URL http://www.w3.org/standards/techs/css.
[dja]
Django. URL https://www.djangoproject.com/.
[FGM+ 99] R. Fielding, J. Gettys, J. Mogul, H. Frystyk, L. Masinter, P. Leach, and
T. Berners-Lee. Rfc 2616, hypertext transfer protocol – http/1.1, 1999. URL
http://www.rfc.net/rfc2616.html.
[FPSS96]
Usama M. Fayyad, Gregory Piatetsky-Shapiro, and Padhraic Smyth. Advances
in knowledge discovery and data mining. chapter From Data Mining to
Knowledge Discovery: An Overview, pages 1–34. American Association for
Artificial Intelligence, Menlo Park, CA, USA, 1996. ISBN 0-262-56097-6. URL
http://dl.acm.org/citation.cfm?id=257938.257942.
[FT02]
Roy T. Fielding and Richard N. Taylor. Principled design of the modern web
architecture. ACM Trans. Internet Technol., 2(2):115–150, May 2002. ISSN
1533-5399. URL http://doi.acm.org/10.1145/514183.514185.
[HKM07] Adrian Holovaty and Jacob Kaplan-Moss. The Definitive Guide to Django: Web
Development Done Right. Apress, 2007.
[HTM]
Html. URL http://www.w3.org/standards/techs/html.
[jqu]
jquery. URL http://jquery.com/.
69
[jso]
Json. URL http://json.org/.
[Mit97]
Tom Mitchell. Machine Learning. McGraw Hill, 1997. ISBN 0070428077.
[mys]
Mysql. URL http://www.mysql.com/.
[Pyl99]
Dorian Pyle. Data Preparation for Data Mining. Morgan Kaufmann Publishers
Inc., San Francisco, CA, USA, 1999. ISBN 1-55860-529-0.
[pyt]
Python. URL https://www.python.org/.
[RM07]
L. Rokach and O. Maimon. Data Mining with Decision Trees - Theory and
Applications. World Scientific Publishing Co. Pte. Ltd., 2007. ISBN 978-981277-171-1.
[RN04]
S. J. Rusell and P. Norvig. Inteligencia Artificial. Un enfoque moderno. Segunda
Edición. PEARSON EDUCACIÓN S.A., 2004. ISBN 978-842-054-003-0.
[RR13]
Leonard Richardson and Sam Ruby. Restful Web APIs. O’Reilly, first edition,
2013. ISBN 978-1-4493-5806-8.
[scr]
Scrum. URL https://www.scrum.org/.
[TMC+ 09] John C. Tang, Tara Matthews, Julian Cerruti, Stephen Dill, Eric Wilcox, Jerald
Schoudt, and Hernan Badenes. Global differences in attributes of email usage. In
Proceedings of the 2009 International Workshop on Intercultural Collaboration,
IWIC ’09, pages 185–194. ACM, New York, NY, USA, 2009. ISBN 978-160558-502-4. URL http://doi.acm.org/10.1145/1499224.1499252.
[tre]
Trello. URL https://trello.com/.
[WDK11] Jaclyn Wainer, Laura Dabbish, and Robert Kraut. Should i open this email?:
Inbox-level cues, curiosity and attention to email. In Proceedings of the SIGCHI
Conference on Human Factors in Computing Systems, CHI ’11, pages 3439–
3448. ACM, New York, NY, USA, 2011. ISBN 978-1-4503-0228-9. URL
http://doi.acm.org/10.1145/1978942.1979456.
70
Este documento fue editado y tipografiado con LATEX
empleando la clase esi-tfg que se puede encontrar en:
https://bitbucket.org/arco group/esi-tfg
71
Descargar