El PROC LOGISTIC es un procedimiento de SAS que nos ha dado muchas satisfacciones a los dinosaurios como el ahora escribiente. La regresión logística es uno de los modelos de regresión más utilizados y es bien conocido por todos mis lectores. El problema es muy sencillo: hemos de clasificar una población dividida en dos partes a partir de unas variables independientes. Su aplicación es muy extensa: patrones de fuga, propensiones de compra, salud, fraude…

Con este monográfico pretendo acercaros a las sentencias básicas en SAS para crear un modelo de regresión logística y proponer gráficos y validaciones. Partimos de una simulación y analizamos la sintaxis:

data datos;
    do id_cliente = 1 to 20000;
        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;

Conjunto de datos SAS con 20.000 clientes de Banca Personal de una entidad bancaria. El equipo comercial se pone en marcha y es necesario determinar aquellos clientes que tienen una mayor probabilidad de contratar un depósito a plazo. Para ello, hemos de “inventarnos” qué clientes tienen un alto potencial de contratación:

* CREAMOS EL POTENCIAL DE COMPRA;
data datos_propension;
    set datos;
    potencial = 0.3;
    
    * EDAD;
    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);
    
    * RECIBOS;
    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);
    
    * VINCULACION;
    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);
    
    * COMPRAS;
    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);
    
    * PASIVO;
    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.01 * ranuni(13);
    else if pasivo < 300000 then potencial = potencial + 0.03 * ranuni(13);
    else if pasivo < 500000 then potencial = potencial + 0.1 * ranuni(13);
    else potencial = potencial + 0.1;
    
    * PROVINCIA;
    if mod(provincia, 5) = 0 then potencial = potencial - 0.02 * ranuni(13);
    
    if potencial > 0.35 then contrata = 1;
    else contrata = 0;
run;

Ahí los tenemos. contrata = 1 determina el cliente que adquiere ese producto (nuestro target). Hemos de realizar un modelo que nos clasifique a los clientes en función de su propensión a la compra. El primer paso es crear un conjunto de datos de entrenamiento y otro de validación:

* MUESTRA ALEATORIA;
data entreno validacion;
    set datos_propension;
    if ranuni(46) >= 0.6 then output validacion;
    else output entreno;
run;

Ahora nuestro trabajo se ha de centrar en el PROC LOGISTIC:

proc logistic data=entreno outmodel=model1;
    class provincia;
    model contrata(event='1') = edad provincia pasivo vinculacion recibos compras /
          selection=forward ctable;
run;

Ésta puede ser la sintaxis más sencilla. Especificamos qué variable(s) son categóricas con CLASS. Para hacer el modelo, empleamos la sentencia MODEL (Variable Dependiente = Variables Independientes). Usamos selection=forward para una selección por pasos y CTABLE para ver la tabla de sensibilidad y especificidad en función del score. Con OUTMODEL creamos un conjunto de datos SAS que nos permite aplicar el modelo (scorear) a otros datasets:

proc logistic inmodel=model1;
    score data=validacion out=validacion_scored;
run;

En este caso hemos aplicado el modelo a la tabla de validación. Otra forma es emplear la sentencia SCORE a la vez que realizamos el modelo. Para la validación, me gusta realizar una tabla de frecuencias acumuladas para ver la ganancia del modelo:

proc sql noprint;
    create table resumen as 
    select round(P_1, 0.1) as prob_contrata,
           sum(contrata) as contrata,
           count(*) as clientes
    from validacion_scored
    group by 1
    order by 1 desc;
quit;

data resumen_acumulado;
    set resumen;
    retain clientes_agr contrata_agr 0;
    clientes_agr + clientes;
    contrata_agr + contrata;
    
    pct_clientes = clientes_agr / (select sum(clientes) from resumen); /* Simplificado para el ejemplo */
    prob_acumulada = contrata_agr / clientes_agr;
run;

Las posibilidades gráficas son muy extensas si activamos ODS GRAPHICS:

ods graphics on;
proc logistic data=entreno plots(only)=all;
    class provincia;
    model contrata(event='1') = edad provincia pasivo vinculacion recibos compras /
          selection=backward;
    roc "Pasivo" pasivo;
    roc "Compras" compras;
    roc "Vinculación" vinculacion;
run;
quit;
ods graphics off;

Se han añadido a nuestra salida todos los gráficos posibles: diagnósticos de influencia, leverage, ajuste y las curvas ROC. La sentencia ROC nos permite ver, variable a variable, cómo es su comportamiento predictor.

Bueno, pues hasta aquí este pequeño esbozo sobre el PROC LOGISTIC. Es evidente que paso por alto temas profundos como el muestreo o la validación cruzada, pero ésta es la base para empezar a trabajar con propensiones en SAS. Saludos.