jueves, 28 de mayo de 2015

Arboles de decisión en SAS

Una de las técnicas más utilizadas dentro del análisis predictivo son los árboles de decisión. Esta técnica tiene múltiples aplicaciones en el campo de la estadística, pero nos vamos a centrar en su uso para realizar predicciones, concretamente obtener probabilidades de eventos.

Un arbol de decisión es una técnica de predicción utilizada en el ámbito del aprendizaje automático. Un árbol de decisión lleva a cabo un test a medida que este se recorre hacia las hojas para alcanzar así una decisión. El árbol de decisión suele contener nodos internos, nodos de probabilidad, nodos hojas y ramas. Un nodo interno contiene un test sobre algún valor de una de las propiedades. Un nodo de probabilidad indica que debe ocurrir un evento aleatorio de acuerdo a la naturaleza del problema. Un nodo hoja o nodo terminal te representa el valor que devolverá el árbol de decisión y finalmente las ramas brindan los posibles caminos que se tienen de acuerdo a la decisión tomada.



Existen diferentes formas de implementar árboles de decisión en SAS. En base a los módulos SAS existentes actualmente en el mercado, tenemos las siguientes opciones:

  • Proceso predictivo guiado en SAS/Visual Analytics
  • Construir modelo de forma guiada en SAS/Enterprise Miner
  • Realizarlo con el módulo SAS/IML (macro treedisc)
  • Realizarlo con el módulo SAS/OR (proc dtree)
  • Realizarlo en código BASE con procedimientos SAS/STAT (Entorno Enterprise Guide)

En caso de hacerlo en Miner el modelo generado en Miner podría ser posteriormente ejecutado en Enterprise Guide utilizando la tarea de Data Mining -> Model Scoring.





En este post vamos a realizar el árbol de decisión en SAS/BASE que es un módulo más extendido y que requiere menor inversión económica. Hacerlo en SAS/EM (proc arboretum) o SAS/VA supondría un proceso guiado, en principio más sencillo.

Para realizar el árbol de decisión vamos a emplear el procedimiento proc hpsplit (disponible en SAS/STAT 12.3 en SAS 9.4), es un procedimiento de la familia hp (high performance) orientados a alto rendimiento y que pueden ser ejecutados en una única máquina o en múltiples nodos. En este caso hpsplit nos va a permitir crear y ejecutar un arbol de decisión.

El ejemplo sobre el que vamos a trabajar es un caso de analítica predictiva aplicada a las campañas de marketing. Nuestra situación de partida es un dataset que contiene el target de clientes sobre el que pensamos ejecutar una campaña de marketing por el  canal que corresponda (e-mail, correos postal, llamada, SMS, etc..). Este target es un filtro determinado del total de nuestra cartera de clientes en base al producto o servicio objeto de la campaña. Con objeto de ajustar los costes de la campaña nos interesa obtener la probabilidad de respuesta a la campaña y aquí es donde entra la analítica predictiva. Los clientes cuya probabilidad de respuesta fuera muy baja serían eliminados del target, para no caer en costos que van a producir muy bajo retorno. Contamos con un fichero histórico de datos de campañas ejecutadas. En este histórico tenemos un campo que nos indica si hubo o no respuesta a la campaña (1 o 0) y una seríe de variables que caracterizan el cliente sobre el que se realizó la campaña.

res: respuesta a la campaña (1: redención, 0: sin redención)
id_cliente: código de cliente
edad: edad del cliente
compras_3m: número de compras realizadas en los últimos 3 meses
compras_12m: número de compras realizadas en los últimos 12 meses
tipo_cliente: Tipo cliente por canal principal de compra (W: web, T: tienda)

Para obtener el modelo dividimos la tabla que contiene el histórico de campañas (100k) en dos tablas una para entrenar el modelo (test) y otra para validarlo (validar).

data test validar;
set campañas_hist;
if _N_ < 70000 then output test; else output validar;
run;

Aplicamos el procedimiento hpsplit, la variable a predecir es res (respuesta a la campaña) y las variables predictoras son: tipo_cliente edad compras_3m compras_12m

proc hpsplit data=test maxdepth=4 maxbranch=2 nodestats=arbol; /* nodestats guarda el arbol */
  target res_campaña; /* variable a predecir */
  input tipo_cliente edad compras_3m compras_12m; /* variables en base a las q predecimos */
  code file="%sysfunc(pathname(work))/model_dtree.sas"; /* guarda el modelo construido */
  rules file="/home/juanvg1972/ficheros/rules_dtree.txt"; /* reglas aplicadas */
  output importance=imporvar;  /* importancia de cada variable */
run;

En la tabla arbol guardamos el arbol de decisión obtenida:



Podemos ver la importancia de cada variable que hemos guardado en la tabla imporvar

proc print data=imporvar (keep = itype tipo_cliente edad compras_3m compras_12m);
run;



Para visualizar gráficamente el arbol creado, empleamos el procedimiento netdraw que nos permite obtener una representación rápida, pero visualmente no es el más óptimo. Hay otras opciones para visualizar el arbol:

- Calcular el layout del arbol y pintarlo con proc sgplot
- Pintar la salida del fichero plaño rules_dtree.txt con una herramieta tipo GraphViz
- Generar arbol interactivo en SAS/GRAPH (ds2tree macro)

data arbol_or;
length parent_or id_or $2.  desc_node $20.;
set arbol;
if parent = . then parent_or = 'OR'; else parent_or = parent;
id_or = id;
desc_node = strip(splitvar||'-'||decision); /* construimos el campo descriptivo que queremos visualizar */
run;

proc netdraw graphics data=arbol_or;
       actnet / act=parent_or
                succ=id_or
                id=(desc_node)
                nodefid
                nolabel
                pcompress
                centerid
                tree
                arrowhead=0
                xbetween=3
                ybetween=2
                rectilinear
                carcs=black
                ctext=white
                htext=1;
run;

Una vez visualizado el arbol, lo aplicamos a la tabla validar para evaluar su capacidad predictiva.

data validar_res;
  set validar;
  %include "%sysfunc(pathname(work))/model_dtree.sas";
run;

En los campos P_res_campaña1 (prob res = 1) y P_res_campaña0 (prob res = 0)  obtenemos la probabilidad de respuesta a la campaña.


Para validar el nivel de  acierto del modelo podemos hacer una validación cruzada:

data validar_res1;
set validar_res;
if P_res_campaña1 >= 0.5 then res_campaña_p = 1;else  res_campaña_p = 0;
run;

proc sql;
create table tabla_valid as
(select res_campaña, res_campaña_p, count(*) as conteo
from validar_res1
group by res_campaña, res_campaña_p);
quit;



El modelo definitivo una vez realizados los pasos e iteraciones necesarias para la depuración del modelo se aplica sobre el target de clientes de la campaña actual.

Este ajuste que hacemos sobre el target, permite rediseñar el target optimizando la probablidad de respuesta. Posteriormente a la ejecución de la campaña se realiza una comparación de probabilidad con la realidad


Por último, indicar que la forma de medir la mejora que sobre un target produce su redefinición mediante analítica predectiva es la obtención de la curva Lift (elevación) ,que mide la cantidad de veces en que la aplicación del Modelo Predictivo mejora el resultado que hubiéramos obtenido aplicando el target inicial.



domingo, 3 de mayo de 2015

Data science tools: SAS vs R

Unas de las disciplinas que más desarrollo han experimentado en los últimos años han sido todas las relacionadas con el data science. Las técnicas y herramientas utilizadas en esta disciplina adquieren cada vez más peso en el entorno empresarial. Si damos un ojo a las herramientas más utilizadas, vemos que también ha habido cambios en los últimos años.
El siguiente gráfico (www.datasciencecentral.com) muestra las herramientas más solicitadas en la actualidad puestos de trabajo de perfiles data scientist.


Están son las más solicitadas en la actualidad y representa la tendencia actual liderada de largo por R, si nos centramos en puestos ya existentes es posible que posición de cabeza la tenga SAS. Podríamos añadir a las listadas en el gráfico Phyton, que si bien es un lenguaje de propósito general, su uso en análisis de datos es cada vez más extendido. Igualmente podemos añadir a las anteriores herramientas como SCALA, Rapidminer, Weka o Knime.

En este post vamos a tratar de comparar dos de las herramientas más usadas: SAS y R. A parte de ser las herramientas más usadas, también representan arquitecturas diferentes, orientaciones diferentes y desde el punto de vista de costes: pago vs free. Probablemente sea mucho más interesante comparar un Ferrari con un Lamborghini, que comparar R con SAS, pero aunque también nos interese la velocidad, la usuabilidad y el coste, en el contexto analítico-empresarial en el que estamos nos centraremos en SAS y R.


No perdamos de vista que teniendo en cuenta el frenético ritmo que lleva la industria TI, si hacemos esta misma comparación dentro de 2 años las herramientas habrán evolucionado y seguramente los criterios a evaluar sean otros, fruto de nuevas necesidades de análisis y de tipos de datos a integrar.

Empezaremos con una breve introducción de ambas herramientas:

SAS: Herramienta de análisis de datos con solera. Lleva muchos años liderando el mercado y presente en grandes cuentas. Dispone de varias herramientas para análisis de datos: SAS/BASE, SAS/Enterprise Guide y SAS/Enterprise Miner. Licencias de duración anual con un costo sólo asumible por grandes cuentas.

R: Herramienta de análisis de datos, menos veterana que SAS, pero con una más que notable presencia en el mercado. Muy extendida en Universidades y centros de investigación, está entrando con fuerza en el panorama empresarial. Licencia open source. Comunidad de usuarios muy extensa y activa, la cantidad de librerías disponible crece por días.

Los criterios de comparación a considerar son los siguientes:
  • Facilidad de uso / curva de aprendizaje.
  • Manejo y gestión de datos
  • Capacidades gráficas y de visualización
  • Actualizaciones del software
  • Servicios de soporte y comunidades
  • Capacidades de workflow
  • Ecosistemas
  • Integración con otros lenguajes y herramientas
  • Licencias y costes


Facilidad de uso / curva de aprendizaje:

En este aspecto es posible que SAS sea un lenguaje más sencillo para los no programadores y hay muchos analistas de negocio que deben usar herramientas de este tipo sin un backgroud técnico previo en programación. Los pasos data de SAS son sencillos de aprender para alguien mínimamente familiarizado con estructuras de tablas, ya que tiene un diseño tipo DML (Data Manipulation Language). Por otra parte SAS permite la opción proc sql para escribir el código directamente en SQL Es posible que R demande una base algo más solida de conocimientos en programación y estructuras de datos. Si SAS se parece al SQL, R tendría su equivalente en C++. En su estructuración R es un lenguaje orientado a objetos, mientras que SAS responde más a un tipo de lenguaje estructurado, secuencial. R permite hacer los mismo de muchas diferentes maneras, por ejemplo si en SAS vamos a realizar agregaciones nos vamos a un proc sql de agregación o a un proc means, pero en R existen múltiples formas de hacerlo (aggregate, summarize, functiones apply, doBy, etc..). Esto puede ser desconcertante para el novato que está aprendiendo R. En cuanto a recursos de formación es fácil encontrar recursos útiles en la web. SAS tiene certificaciones, pero su formación oficial es también costosa.

Manejo y gestión de datos:

La diferencia fundamental en la gestión de datos es que R trabaja en memoria y SAS en disco. Trabajar todo en RAM tiene sus ventajas y sus inconvenientes, de cara a procesos con datasets de alto volumen de registros con R conviene tenerlo en cuenta. Hay librerías de R que permiten trabajar también en disco. En los procesos SAS tradicionalmente ha sido un problema el espacio que ocupa y librerías como la work deben ser bien gestionadas. Ambos trabajan bien paralelizando procesos.

Capacidades gráficas y de visualización:

Las capacidades gráficas de SAS centrándonos en SAS/BASE y SAS/Enterprise Guide y sin considerara SAS/Visual Analytics que es licencia a parte, son bastante justas. SAS en este aspecto cubre lo esencial, al menos en los módulos propios de data mining. A parte de no ser limitado es intrincado en su uso. R, en cambio, tiene unas capacidades de visualización muy potentes, hay numerosos paquetes con funcionalidades muy avanzadas.



Actualizaciones del software:

Debido a su naturaleza open source R, tiene nuevos algorítmos o técnicas rápidamente disponibles según se van actualizando los distintos paquetes. Hasta la fecha R tiene unos 15000 paquerts en CRAN (Comprehensive R Archive Network). SAS sigue la política de releases habitual de un software comercial, de forma que R puede tener más agilidad para incorporar nuevas funcionalidades, aunque es posible que SAS lo haga en un entorno más testeado y controlado.

Servicios de soporte y comunidades:

R tiene una comunidad muy extendida y activa, pero no tiene un soporte técnico, SAS en cambio si dispone de soporte técnico. En la práctica del día a día, la amplia comunidad de usuarios de R (foros, consultas, recursos), suple con creces la  inexistencia de soporte técnico. Dicho esto, hay quien está más tranquilo teniendo un soporte técnico al otro lado de la línea que o bien te resuelve el problema o bien puedes "presionar" para que te una solución alternativa.




Capacidades de workflow:

SAS dispone en el modulo Enterprise Guide de una interfaz intuitiva para el desarrollo de flujos de procesos de tipo analítico. Existen diferentes herramientas basadas en R que permiten también el desarrollo de workflows (un ejemplo es Rattle), pero no han terminado de imponerse, ni de estar optimizadas. La experiencia demuestra que muchos procesos de tipo analítico no son soportados por los componentes de estas herramientas y por ejemplo en el caso de SAS la mayoría del código es SAS/BASE puro y se hace poco uso de los componentes predefinidos de Enterprise Guide.

Ecosistemas:

SAS dispone de toda una gama de herramientas en disciplinas cercanas al Data Science, como Business Intelligence, Dashboarding, Visualización de datos, Data Warehouse, ETL o Data Quality, que pueden integrarse con los procesos de data science (end to end), mientras que R es un lenguaje centrado exclusivamente en data science.

Integración con otros lenguajes y herramientas:

En lo relativo a integración con otras herramientas o lenguajes es posible que R le lleve la delantera a SAS. De entrada muchas herramientas de la comunidad open-source están integradas con R y es raro el software comercial de entornos analíticos que no ofrezca ya la integración con R. Lógicamente SAS también tiene integraciones y alianzas, pero quizás quede un escalón por debajo.

Licencias y costes:

Poco hay que decir en este aspecto: como es sabido R es open source y SAS un software comercial de costes elevados. Sería interesante ver qué pasa en cuanto a tendencias de uso si SAS bajara los precios. De momento ya ha liberado una versión free para temas de formación (SAS OnDemand for academics).

Existen planteamientos  en la línea de usar ambos, algo perfectamente asumible ya que R es gratuito. Hay instalaciones que emplean SAS para toda la gestión de datos (extracción de fuentes, fusión, limpieza, aplicación de reglas de negocio, consolidación, etc..) y le deja el dataset final preparado a R para que aplique el modelo estadístico y realice la presentación final. No es mal planteamiento, sobre todo teniendo en cuenta que nos puede hacer ahorrarnos las licencias de SAS/Enterprise Miner (modelos) que es la más costosa. Igualmente útil es conocer algunas equivalencias entre herramientas a nivel de código: Equivalencias SAS y R


Por último un curioso estudio  en el que se analiza la preferencia de SAS o R en base a los años de experiencia.


En este breve compendio hemos tratado los aspectos que consideramos más críticos, sirva este post como inicio a posibles comentarios que aporten aspectos o consideraciones no señaladas en este compendio y que puedan tener también relevancia en la selección de la herramienta de análisis de datos. Bienvenidas también las aportaciones acerca de otras herramientas (Phyton, Matlab, SPSS, SCALA, etc..).