miércoles, 22 de febrero de 2017

Corrección automática de nulos en tablas SAS

En la misma línea que este post anterior: detectar nulos en tablas SAS, añadimos un nuevo programa de ejemplo de SAS para automatizar la detección de nulos en una tabla SAS.


Se trata de una macro que revisa todos los campos de una tabla identificando nulos. Los nulos de variables de tipo numérico los sustituye por 0 y los de variables alfanuméricas por un carácter determinado, en este caso '-'. La macro valida por un lado las variables numéricas y por otra las alfanuméricas apoyándose en un array. Recibe como argumento el nombre de la tabla a validar (tabin) y genera una tabla nueva (tabout) que podría ser la misma. Se podría modificar para que los valores de sustitución para nulos de numéricos y alfanuméricos se recibieran como argumento. Esperemos os sea de utilidad.

-------------------------------------------------------------------------------------------------------------------------

This is a SAS macro that check all variables in a SAS dataset detecting null values. Null values of numeric variables are replaced by 0 and null values of character variables are replaced by  character '-'.  Macro validates numerics and character variables separated using two arrays to store both type of variables. The arguments of macro are the name of dataset to be checked (tabin) and a new dataset created (tabout) that it could be the same. You can modify the macro to add new arguments with the values to replace nulls of numeric and character variables. I hope it will be a usefull example.


-------------------------------------------------------------------------------------------------------------------------

Código SAS / SAS code:

%macro reemplazar_nulos(tabin, tabout);

data &tabout(drop = i);
set &tabin;
array num(*) _numeric_; /* array con todos los campos numericos */
array car(*) _character_; /* array con todos los campos alfanumericos */
do i=1 to dim(num);
if num(i)=. then num(i)=0;
end;
do i=1 to dim(car);
if car(i)=. then car(i)='-';
end;
run;

%mend;


Formación / training

sábado, 11 de febrero de 2017

Analisis RFM con SAS (video)

Adjuntamos video explicando como realizar análisis RFM (Recency, Frequency y Money) con SAS Enterprise Guide. Es un video muy práctico en el que en 14 min se explica de un modo sencillo como parametrizar y ejecutar esta tarea




miércoles, 8 de febrero de 2017

Macro para cambio automático permisos tablas SAS

Con frecuencia nos encontramos problemas de acceso a tablas SAS que se deben a los permisos con los que se crea la tabla de forma automática. Es posible que una tabla SAS generada por un usuario no pueda ser accedida por otros.

Habitualmente en un grupo de trabajo hay tablas maestras que deben ser accedidas por todo el equipo, para solucionar este problema de forma  rápida, añadimos una macro de SAS que cambia los permisos de todas las tablas de una librería.



Hay que saber la ruta física de la librería y los permisos actuales. Esto lo obtenemos con un proc contents:

proc contents data=tabsas._ALL_;
run;



Los permisos se dan utilizando el comando X y siguiendo el código rwx: Permisos rwx

%macro permisos_tablas(libreria);

PROC SQL;
create table tablas as (SELECT memname
FROM dictionary.tables WHERE libname= upcase("&libreria") );
quit;

%let dsid = %sysfunc (open(tablas));  
%let nobs = %sysfunc (attrn(&dsid, NOBS));
%if &nobs > 0 %then %do;
%do i = 1 %to &nobs;  
      %let rc = %sysfunc (fetch(&dsid));                                                                                                                                                                                                                                        
      %let tabla = %sysfunc (getvarc(&dsid,1));
      %put Cambiar permisos a tabla: &tabla;
         /* añadir los códigos con los permisos a dar y la ruta física de la librería */
X chmod 664 "/home/ruta_sas/&tabla..sas7bdat";
%end;
%end;
%let rc = %sysfunc (close(&dsid));

%mend;

%permisos_tablas(TABSAS);


Formación SAS



viernes, 3 de febrero de 2017

Examen ejemplo certificación SAS "Base Programmer"

Añadimos un ejemplo de examen de la certificación: 'SAS Certified Base Programmer for SAS 9'

Información general del examen


Examen de ejemplo:

Question 1
The following program is submitted.
data WORK.TEST;
  input Name $ Age;
datalines;
John +35
;
run;
Which values are stored in the output data set?
  1. Name              Age
    ---------------------
    John               35 
  2. Name              Age
    ---------------------
    John              (missing value)
  3. Name              Age
    ---------------------
    (missing value)   (missing value)
  4. The DATA step fails execution due to data errors.
correct_answer = "A"
Question 2
Given the SAS data set WORK.ONE:
 Id  Char1
---  -----
182  M
190  N
250  O
720  P
and the SAS data set WORK.TWO:
 Id  Char2
---  -----
182  Q
623  R
720  S
The following program is submitted:
data WORK.BOTH;
   merge WORK.ONE WORK.TWO;
   by Id;
run;
What is the first observation in the SAS data set WORK.BOTH?
  1. Id  Char1  Char2
    ---  -----  -----
    182  M
    
  2. Id  Char1  Char2
    ---  -----  -----
    182         Q
    
  3. Id  Char1  Char2
    ---  -----  -----
    182  M      Q
    
  4. Id  Char1  Char2
    ---  -----  -----
    720  P      S
    
correct_answer = "C"
Question 3
Given the text file COLORS.TXT:
----+----1----+----2----+----
RED    ORANGE  YELLOW  GREEN
BLUE   INDIGO  PURPLE  VIOLET
CYAN   WHITE   FUCSIA  BLACK
GRAY   BROWN   PINK    MAGENTA
The following SAS program is submitted:
data WORK.COLORS;
  infile 'COLORS.TXT';
  input @1 Var1 $ @8 Var2 $ @;
  input @1 Var3 $ @8 Var4 $ @;
run;
What will the data set WORK.COLORS contain?
  1. Var1     Var2     Var3    Var4
    ------   ------   ------  ------
    RED      ORANGE   RED     ORANGE
    BLUE     INDIGO   BLUE    INDIGO
    CYAN     WHITE    CYAN    WHITE
    GRAY     BROWN    GRAY    BROWN
    
  2. Var1     Var2     Var3    Var4
    ------   ------   ------  ------
    RED      ORANGE   BLUE    INDIGO
    CYAN     WHITE    GRAY    BROWN
    
  3. Var1     Var2     Var3    Var4
    ------   ------   ------  ------
    RED      ORANGE   YELLOW  GREEN
    BLUE     INDIGO   PURPLE  VIOLET
    
  4. Var1     Var2     Var3    Var4
    ------   ------   ------  ------
    RED      ORANGE   YELLOW  GREEN
    BLUE     INDIGO   PURPLE  VIOLET
    CYAN     WHITE    FUCSIA  BLACK
    GRAY     BROWN    PINK    MAGENTA
    
correct_answer = "A"
Question 4
Given the SAS data set WORK.INPUT:
Var1     Var2
------   -------
A        one
A        two
B        three
C        four
A        five
The following SAS program is submitted:
data WORK.ONE WORK.TWO;
  set WORK.INPUT;
  if Var1='A' then output WORK.ONE;
  output;
run;
How many observations will be in data set WORK.ONE?

Enter your numeric answer in the space below.


correct_answer = "8"
Question 5
The following SAS program is submitted:
data WORK.LOOP;
  X = 0;
  do Index = 1 to 5  by  2;
    X = Index;
  end;
run;
Upon completion of execution, what are the values of the variables X and Index in the SAS data set named WORK.LOOP?
  1. X = 3, Index = 5
  2. X = 5, Index = 5
  3. X = 5, Index = 6
  4. X = 5, Index = 7
correct_answer = "D"
Question 6
The following SAS program is submitted:
 
proc format;
  value score  1  - 50  = 'Fail'
              51 - 100  = 'Pass';
run;
Which one of the following PRINT procedure steps correctly applies the format?
  1. proc print data = SASUSER.CLASS;
       var test;
       format test score;
    run;
    
  2. proc print data = SASUSER.CLASS;
       var test;
       format test score.;
    run;
    
  3. proc print data = SASUSER.CLASS format = score;
       var test;
    run;
    
  4. proc print data = SASUSER.CLASS format = score.;
       var test;  
    run;
    
correct_answer = "B"
Question 7
This item will ask you to provide a line of missing code;

The SAS data set WORK.INPUT contains 10 observations, and includes the numeric variable Cost.

The following SAS program is submitted to accumulate the total value of Cost for the 10 observations:
data WORK.TOTAL;
  set WORK.INPUT;
  <insert code here>
  Total=Total+Cost;
run;
Which statement correctly completes the program?
  1. keep Total;
  2. retain Total 0;
  3. Total = 0;
  4. If _N_= 1 then Total = 0;
correct_answer = "B"
Question 8
This question will ask you to provide a line of missing code.

Given the following data set WORK.SALES:
SalesID  SalesJan  FebSales  MarchAmt
-------  --------  --------  --------
W6790          50       400       350
W7693          25       100       125
W1387           .       300       250
The following SAS program is submitted:
data WORK.QTR1;
   set WORK.SALES;
   array month{3} SalesJan FebSales MarchAmt;
   <insert code here>
run;
Which statement should be inserted to produce the following output?
SalesID  SalesJan  FebSales  MarchAmt  Qtr1
-------  --------  --------  --------  ----
W6790          50       400       350   800
W7693          25       100       125   250
W1387           .       300       250   550
  1. Qtr1 = sum(of month{_ALL_});
  2. Qtr1 = month{1} + month{2} + month{3};
  3. Qtr1 = sum(of month{*});
  4. Qtr1 = sum(of month{3});
correct_answer = "C"
Question 9
Given the following SAS error log
  44   data WORK.OUTPUT;
  45     set SASHELP.CLASS;
  46     BMI=(Weight*703)/Height**2;
  47     where bmi ge 20;
  ERROR: Variable bmi is not on file SASHELP.CLASS.
  48   run;
What change to the program will correct the error?
  1. Replace the WHERE statement with an IF statement
  2. Change the ** in the BMI formula to a single *
  3. Change bmi to BMI in the WHERE statement
  4. Add a (Keep=BMI) option to the SET statement
correct_answer = "A"
Question 10
The following SAS program is submitted:
data WORK.TEMP;
  Char1='0123456789';
  Char2=substr(Char1,3,4);
run;
What is the value of Char2?
  1. 23
  2. 34
  3. 345
  4. 2345
correct_answer = "D"



Formación SAS

martes, 3 de enero de 2017

Gestionando del ciclo de vida analítico para la toma de decisiones a gran escala

Recomendamos el siguiente whitepaper de SAS: Gestionando del ciclo de vida analítico para la toma de decisiones a gran escala.  En este whitepaper encontramos recomendaciones y mejores prácticas para el desarrollo del ciclo de vida analítico. Se plantea un marco de trabajo para la explotación y mantenimiento de modelos analíticos aplicados a diferentes ámbitos: marketing de clientes, fraude, riesgos crediticios, riesgos operativos, gestión financiera, etc..



Se repasan los errores comunes en la implementación de estos modelos y se identifican las principales fases de todo proceso de análisis: preparación, exploración, modelización, implementación, evaluación, nuevas preguntas, nueva información en un proceso cíclico que se retroalimenta. Para la automatización y gestión de este ciclo se plantea un entorno analítico basado en soluciones SAS.

Se muestran casos prácticos de empresas tales como: Visa, Orlando Magic, instituciones financieras

Más información sobre las soluciones de SAS que se mencionan en: Formación SAS

domingo, 1 de enero de 2017

Feliz 2017


La foto está tomada con la catedral de Burgos y su fachada principal. Un total de 48 fotos del Sol, sobrepuestas. Hechas durante un año, una vez por semana, en el mismo sitio y hora. El punto más alto es el solstício de verano y el más bajo el de invierno. Formando así la Lemniscata: símbolo del infinito. Feliz 2017

No dejes de aprender una cosa nueva cada día de 2017. Os invitamos a nuestros primeros cursos del año: Formación SAS