Con SAS Base podemos hacer árboles de decisión porque tenemos R. Así de sencillo. Vamos a utilizar SAS para gestionar nuestros datos y R será la herramienta que utilicemos para la realización del modelo de árbol de decisión. Posteriormente, emplearemos las reglas generadas por el modelo para etiquetar a nuestros clientes en SAS.
Con esta entrada pretendo ilustrar una serie de ejemplos en los que comunico SAS con R. Una herramienta nos sirve para el tratamiento de datos y la otra la utilizaremos para realizar modelos que no están al alcance de SAS Base. Para realizar esta comunicación SAS-R, os planteo la creación en SAS de ficheros de texto con las instrucciones en R y la ejecución en modo batch de R con ese código creado en SAS. Aquí tenéis el ejemplo paso a paso:
El primer paso, como es habitual, es crear un conjunto de datos SAS con datos aleatorios que nos sirva de ejemplo:
* 200.000 DATOS ALEATORIOS;
data datos;
do id_cliente = 1 to 200000;
edad = min(65, ranpoi(4, 45));
pasivo = ranuni(4) * 10000 + ranuni(12) * (10000 * (edad - 5));
compras = round(pasivo / (ranexp(423) * 1000));
vinculacion = max(1, ranpoi(2, round(pasivo / 300000) + 1));
recibos = ranpoi(1, 2);
provincia = min(52, ranpoi(123, 28));
output;
end;
run;
* ASIGNAMOS UN POTENCIAL DE COMPRA FICTICIO;
data datos_propension;
set datos;
potencial = 0.3;
if edad < 30 then potencial = potencial + 0.05 * ranuni(13);
else if edad < 40 then potencial = potencial + 0.03 * ranuni(13);
else if edad < 45 then potencial = potencial + 0.04 * ranuni(13);
else if edad < 55 then potencial = potencial + 0.05 * ranuni(13);
else potencial = potencial + 0.02 * ranuni(13);
if recibos <= 2 then potencial = potencial + 0.01 * ranuni(13);
else if recibos <= 4 then potencial = potencial + 0.03 * ranuni(13);
else potencial = potencial + 0.05 * ranuni(13);
if vinculacion <= 5 then potencial = potencial - 0.01 * ranuni(13);
else if vinculacion <= 8 then potencial = potencial + 0.05 * ranuni(13);
else if vinculacion <= 12 then potencial = potencial + 0.2 * ranuni(13);
else potencial = potencial + 0.4 * ranuni(13);
if compras < 100 then potencial = potencial - 0.01 * ranuni(13);
else if compras < 250 then potencial = potencial + 0.03 * ranuni(13);
else if compras < 700 then potencial = potencial + 0.05 * ranuni(13);
else if compras < 2000 then potencial = potencial + 0.06 * ranuni(13);
else potencial = potencial + 0.07 * ranuni(13);
if pasivo < 50000 then potencial = potencial - 0.02 * ranuni(13);
else if pasivo < 100000 then potencial = potencial - 0.01 * ranuni(13);
else if pasivo < 200000 then potencial = potencial + 0.05 * ranuni(13);
else if pasivo < 300000 then potencial = potencial + 0.2 * ranuni(13);
else if pasivo < 500000 then potencial = potencial + 0.1 * ranuni(13);
else potencial = potencial + 0.1;
if mod(provincia, 5) = 0 then potencial = potencial - 0.02 * ranuni(13);
if potencial > 0.4 then contrata = 1;
else contrata = 0;
run;
Tenemos una tabla con 200.000 clientes. El siguiente paso es crear un conjunto de datos de entrenamiento y otro de validación:
* CREAMOS ENTRENAMIENTO Y VALIDACION;
data entreno validacion;
set datos_propension (drop=potencial);
if ranuni(46) >= 0.6 then output validacion;
else output entreno;
run;
* EXPORTACION A CSV;
proc export data=entreno
outfile="C:\temp\entreno.csv"
dbms=csv replace;
run;
Ahora preparamos el código R desde SAS empleando DATALINES4 (útil si hay puntos y coma en el texto):
data ejecucion_R;
infile datalines dlm='@';
input lineas :$200.;
datalines4;
setwd('C:/temp') @
dfsas <- read.csv('entreno.csv') @
library(rpart) @
arbol <- rpart(as.factor(contrata) ~ pasivo + edad +
recibos + vinculacion + compras,
data = dfsas, method = "class",
control = rpart.control(minsplit = 30, cp = 0.0008)) @
fsalida <- "C:/temp/reglas_arbol.txt" @
# Función para extraer reglas
extract_rules <- function(model) {
# ... código para formatear reglas como sentencias IF/THEN SAS ...
}
# extract_rules(arbol) @
;;;;
run;
Exportamos este código a un archivo .R y lo ejecutamos mediante un fichero batch:
* GUARDAMOS EL SCRIPT R;
data _null_;
set ejecucion_R;
file "C:\temp\pgm.R";
put lineas;
run;
* CREAMOS Y EJECUTAMOS EL BATCH;
data _null_;
file "C:\temp\ejecuta_r.bat";
put '"C:\Path\To\R\bin\R.exe" CMD BATCH --no-save "C:\temp\pgm.R"';
run;
options noxwait;
x "C:\temp\ejecuta_r.bat";
El script R genera un archivo reglas_arbol.txt que podemos incluir directamente en un paso DATA de SAS para calificar el conjunto de validación:
data validacion_scored;
set validacion;
%include "C:\temp\reglas_arbol.txt";
run;
* ANALIZAMOS RESULTADOS;
proc sql;
select nodo, count(*) as n, sum(contrata)/count(*) as tasa
from validacion_scored
group by 1;
quit;
El proceso permite orquestar flujos complejos combinando la potencia de SAS para el manejo de datos y R para la modelización avanzada. Saludos.