Trucos SAS. Número de días de un mes

Julio 29th, 2010 por rvaquerizo

Están entrando muchas visitas con las palabras "número de días de un mes en SAS". Y hoy vamos a dar respuesta a estas entradas con una macro y un truco de SAS. Si tenemos una fecha en formato AAAAMM numérica, típica de las particiones de Oracle, disponemos de la siguiente macro:


%macro dias(mes);
*VARIABLES AÑO Y MES;
%let y=%sysfunc(int(&mes./100));
%let m=%sysfunc(mod(&mes.,100));
*TRATAMIENTO ESPECIAL PARA LOS DICIEMBRES;
%if &m.=12 %then %do;
%let m1=1;
%let y1=%eval(&y.+1);
%end;
%else %do;
%let m1=%eval(&m.+1);
%let y1=&y.;
%end;
*01/MES MAS 1 - 01/MES;
%let ini=%sysfunc(mdy(&m.,1,&y.));
%let fin=%sysfunc(mdy(&m1.,1,&y1.));
%let dias=%eval(&fin.-&ini.);
*AL FINAL LA MACRO SOLO DEVUELVE UN NUMERO;
&dias.;
%mend;
*EJEMPLO DE USO;
data _null_;
pepin=%dias(200402);
put pepin;
run;

Ejemplo muy sencillo de código macro y que se entiende muy facilmente, como siempre recomiendo que copiéis y peguéis en vuestro SAS y lo entenderéis enseguida. El caso es que calculo el número de días de un mes como la diferencia entre el día 1 del mes en estudio frente al día 1 del mes mas 1 en estudio. Si disponemos de una fecha SAS recomiendo usar la función INTNX para determinar el número de días del mes, ejemplo:


data _null_;
fecha="02FEB2004"d;
fin_mes=intnx('month',fecha,0,'end');
dias=day(fin_mes);
put fin_mes dias;
run;

Buena referencia de uso de INTNX. Espero que os sirva de ayuda. Saludos.

Tags: ,

Entrenamiento, validación y test

Julio 28th, 2010 por rvaquerizo

Cuando realizamos modelos hay 3 conjuntos de datos fundamentales:

  • Conjunto de datos de entrenamiento: son los datos que entrenan los modelos
  • Conjunto de datos de validación: selecciona el mejor de los modelos entrenados
  • Conjunto de datos de test: Nos ofrece el error real cometido con el modelo seleccionado

Para entender mejor su importancia y como funcionan he preparado el siguiente esquema/ejemplo:

entrenamiento-validacion-test.PNG

Una empresa de telecomunicaciones de cara a mejorar la efectividad de sus campañas comerciales decide realizar un modelo de propensión a la desconexión. Se define un universo Lee el resto de esta entrada »

Trucos R. La función mod para R

Julio 27th, 2010 por rvaquerizo

Buscando algunas cosas sobre R he encontrado esta función que hice hace mucho tiempo. De hecho puedo decir que de las primeras que hice allá en 2001 (creo) cuando empecé a conocer esto de R. Por aquellos entonces aseguré que el futuro pasaba por R y 9 años después sigo diciendo lo mismo, el tiempo me dará la razón, lo que no me imaginaba que hacía falta tanto tiempo. En fin, historias del dinosaurio. Vamos con la función "histórica". Al no disponer de la función mod en R la programé:

mod=function(x,y){
(abs(x/y)%%1)*y*sign(x)}

Función sencilla pero que tiene un aspecto interesante el %%. Probad lo siguiente:

(65/3)%%1
[1] 0.6666667
 -(65/3)%%1
[1] 0.3333333

Al aparecer la función no entendí porque hacía abs y después sign. Pero veo que es debido a las peculiadirades de %%. Me parecía curioso. Saludos.

Gráficos dinámicos en R con la función text

Julio 22nd, 2010 por rvaquerizo

En graphics tenemos la función text y hoy nos vamos a divertir con esta función. Simplemente lo que hace es poner un texto en un gráfico. Lo más sencillo:
#Gráfico sin nada
plot(rep(10,10),rep(10,10),ann=FALSE,type="n",axes=FALSE)
#Ponemos un texto en el centro
text(10,10,"Ejemplo de uso de text")

En un gráfico sin nada escribimos, sólo indicamos la posición y el texto a escribir. Vamos añadiendo opciones:

#Gráfico sin nada
plot(rep(10,10),rep(10,10),ann=FALSE,type="n",axes=FALSE)
#Ponemos un texto en el centro
text(10,10,"Ejemplo de uso de text",srt=45,col=1,cex=3,
vfont=c("sans serif", "plain"))

Ahora modificamos la inclinación del texto con SRT, el color, el tamaño y con vfont la fuente. Podemos jugar con los colores del texto realizando un bucle for Lee el resto de esta entrada »

Tags:

Laboratorio de código SAS. Vistas + PROC MEANS vs. PROC SQL

Julio 19th, 2010 por rvaquerizo

Las vistas son muy importantes cuando trabajamos con SAS. El problema del espacio en disco se acentúa cuando trabajamos con SAS. Este problema podemos minimizarlo empleando vistas. También hay otras situaciones en las que se recomienda usar vistas, cuando realizamos agregaciones sobre campos de una tabla y a la vez realizamos una operación sobre estos campos es muy habitual emplear el PROC SQL. Ejemplo de lo que cuento:

data importes;
do idcliente=1 to 2000000;
importe=ranuni(34)*1000;
output;
end;
run;
*FORMA 1: SQL;
proc sql;
select var(sqrt(importe)), var(importe)
from importes;
quit;

Sobre una tabla con 2.000.000 de registros hacemos la varianza de un campo importe y de la raiz cuadrada de ese mismo campo importe. Es decir, hacemos la varianza sobre la operación aritmética de un campo. Para hacer este trabajo con PROC MEANS sin tener que crear un nuevo campo en la tabla haríamos una vista y un MEANS Lee el resto de esta entrada »

Tags:

Monográfico. Funciones INTNX e INTCK para fechas en SAS

Julio 6th, 2010 por rvaquerizo

Las funciones INTNX e INTCK de SAS atraen muchas visitas a esta web. Aunque ya hay algún mensaje en el que muestro como funcionan creo que algunos trabajadores me agradecerán este monográfico. INTNX e INTCK son funciones para trabajar con fechas en SAS. INTNX sirve para trabajar con periodos luego el resultado que ofrece será una fecha e INTCK sirve para trabajar con intervalos, luego el resultado que nos ofrece será un número entero. Esta es la premisa fundamental. Entonces:

  • Si queremos calcular el número de meses entre 01-01-2002 y el 02-04-2003 empleamos INTCK porque el resultado será 3 meses.
  • Si queremos añadir 5 meses al 01-01-2002 empleamos INTNX porque el resultado será una fecha.

Creo que así queda más claro. INTCK nos devuelve un valor entero e INTNX nos devuelve una fecha. Quedando claro esto a ver ejemplos:

Sumamos 2 años a una fecha:


data _null_;
f1="03MAY2005"d;
f2=intnx("year",f1,2);
format f2 ddmmyy10.;
put f2 ;
run;

IMPORTANTE: INTNX en este caso no ha funcionado como cabía esperar. El resultado es 01/01/2007, inicia a 1 de enero siempre. Siempre me gusta empezar con este ejemplo, motivo, para justificar que, en la medida de lo posible, no utilicemos esta función. ¡¡Pues vaya castaña de monográfico!! Lee el resto de esta entrada »

Tags: , ,

El modelo multivariante en el sector asegurador. Las variables independientes (IV)

Julio 6th, 2010 por rvaquerizo

Ya hemos hablado de la variable dependiente en nuestros modelos multivariantes. Ahora toca analizar las variables independientes que "explicarán" cada una de las variables dependientes que aparecen en nuestros modelos de frecuencias siniestrales y costes medios. A estas variables independientes las denominaremos factores influyentes en la tarifa o factores de riesgo. Estos factores serán características cualitativas y cuantitativas del vehículo asegurado y del conductor del vehículo fundamentalmente. Estos factores se podrían definir como una "microsegmentación" que ajusta los recargos y descuentos sobre una prima pura o prima base.

La prima base es la prima que existiría si no hubiera riesgos añadidos y de ella depende en gran medida el equilibrio del ramo. Si no existiera un componente aleatorio a la hora de la ocurrencia de un siniestro bastaría con la prima base para alcanzar el equilibrio. Sin embargo es necesario ponderar esta base mediante los factores de riesgo que consideremos influyentes en nuestra tarifa.

Para analizar los factores influyentes en la tarifa vamos a emplear la web de ARPEM y su multitarificador, Lee el resto de esta entrada »

Gráficos de densidades con SAS y el PROC KDE

Junio 29th, 2010 por rvaquerizo

El PROC KDE de SAS está incluido en el módulo SAS/STAT. Es un procedimiento que nos permite estudiar gráficamente las distribuciones de variables continuas. Lo que nos produce son gráficos de densidades. Para seguir el ejemplo nos vamos a ir a Yahoo Finance y descargarnos un evolutivo del IBEX de los últimos 3 meses (yo realizo este proceso con Excel), una vez tengamos el dataset creado, para el análisis de la densidad univariante podemos hacer:
ods graphics on;
title "Análisis de volumen";
proc kde data=ibex;
univar volumen / plots=(DENSITY DENSITYOVERLAY
HISTDENSITY HISTOGRAM);
run;
title;
ods graphics off;

Tenemos los siguientes gráficos:

densityoverlayplot1.pnghistogram1.pnghistogramdensity1.png

KDE es uno de los procedimientos que trabajan con gráficos de ODS. Ya hemos hecho mención al cambio de filosofía de algunos procedimientos gráficos en SAS. Yo me atrevería a decir que los procedimientos clásicos tienen una "curva de parendizaje" muy complicada pero  los procedimientos de ODS empiezan a crear gráficos más que interesantes con una sintaxis más sencilla. Para los análisis univariantes yo prefiero el SGPLOT. Pero si en algo destaca KDE es en los gráficos de densidades bivariables. Ejecutemos:


ods graphics on;
title "Análisis de volumen X cierre en IBEX35";
proc kde data=ibex;
bivar cierre_ajustado_ volumen / plots=(CONTOUR CONTOURSCATTER HISTOGRAM
HISTSURFACE SCATTER SURFACE);
run;
title;
ods graphics off;

Y obtenemos...

surfaceplot6.pngscatterplot.pnghistogramsurface.png

contourscatterplot.pngcontourplot6.png

Destacan muy por encima de todos surface y contour. Imprescindibles en vuestros informes. Por cierto, vemos que hay dos picos bien diferenciados, uno con valores altos del IBEX y otro con valores bajos. El pico en torno a los 9.000 puntos es más alto que el pico de los 11.000, cuando especulador hay suelto. Saludos

Trucos SAS. Envío de email con DATA

Junio 28th, 2010 por rvaquerizo

Si deseamos enviar un email con SAS hemos de realizar un proceso similar al que os presento a continuación. Es una duda que me ha llegado a través de correo electrónico, la resolución la comparto con todos por si vuelve a surgir. No quiero plantear macros complicadas ni parametrizaciones "extrañas". Esto se hace a través de FILENAME EMAIL:


filename outbox email "rvaquerizo@analisisydecision.es";
data _null_;
file outbox
to=("rvaquerizo@analisisydecision.es")
cc=("rvaquerizo@analisisydecision.es")
subject="Prueba "
attach="c:\temp\borra.sas";
*CUERPO DEL MENSAJE;
put " Este es un mensaje automático. ";
put " ";
put " ";
run;

En outbox ponemos el correo de salida, después hacemos un DATA _NULL_ que escribe en el buzón de salida, en TO ponemos los destinatarios entre comillados, en CC las copias, en SUBJECT ya sabéis y en ATTACH también. Después si queremos escribir en el cuerpo del mensaje empleamos PUT. Una sintaxis muy sencilla, comentaros que este proceso al final está limitado por la aplicación que nos gestiona el correo. Al final requiere que pulsemos un botón, de hecho si alguien solventa este problema que me comente como lo ha hecho.

Saludos.

Tags: ,

Monográfico. Un poco de PROC LOGISTIC

Junio 24th, 2010 por rvaquerizo

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 (bastante más inteligentes que yo). 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 a compra, salud, fraude,… Con este monográfico pretendo acercaros en 3 minutos a las sentencias básicas en SAS para crear un modelo de regresión logística y proponer gráficos y validaciones. En la línea habitual del blog partimos de una simulación y analizamos la sintaxis, evitamos poner las salidas para no “cargar” la entrada con tablas de poca utilidad. El ejemplo es el que sigue:

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 20000 clientes de Banca Personal de una entidad bancaria que están en proceso de desvinculación. Otra entidad se ha puesto en contacto con rvaquerizo@analisisydecision.es y le han realizado un modelo de potencial de pasivo, un modelo de Share of Wallet de clientes que está funcionando a las mil maravillas y detectan que esta entidad les está provocando una reducción de pasivo y desvinculación de algunos de sus clientes. Lo detectan gracias al mecanismo de alarmas que diseñó rvaquerizo@analisisydecision.es (un poco de publicidad que todo esto sale de mi tiempo y mi bolsillo). El equipo comercial se pone en marcha Lee el resto de esta entrada »

Tags: , ,