Entradas

Mostrando entradas de 2013

Procesos de calidad de datos.

Imagen
Dentro de las actividades de Gestión de los Datos que realiza una organización resultan cada vez más críticos los procesos que supervisan y garantizan la calidad de los datos. El volumen de información crece constantemente en las organizaciones y disponer de almacenes de datos fiables resulta imprescindible para realizar un correcto análisis y explotación de los mismos evitando inconsistencias, conclusiones erróneas y facilitando el desarrollo de futuros sistemas basados en maestros de datos consistentes, depurados, enriquecidos y fiables. Se trata de un pilar básico dentro de las actividades de Gobierno de Dato y tal y como revela el siguiente post: Un estudio de Information Builders revela la poca calidad de los datos en las empresas, un aspecto poco cuidado por las empresas. Por otro lado, actualmente hay situaciones coyunturales que obligan a una inversión fuerte en procesos de calidad de datos, como puede ser la fusión o compra de empresas. En estas situaciones aparece una importa…

SAS Forum España 2013

Imagen
Como todos los años por estas fechas, tiene lugar el SAS Forum España. Edición 2013.
Un foro de encuentro imprescindible para la comunidad de usuarios y partners de SAS.
Más información en el siguiente link:

SAS Forum España 2013


Conversiones de variables SAS alfanuméricas a numéricas y viceversa (input y put)

A continuación mostramos ejemplos prácticos de los tipos de conversión que hay entre variables SAS alfanuméricas y numéricas, tanto por medio de una conversión automática, como utilizando las funciones INPUT y PUT:

1) Conversión formato alfanumérico a numérico:
Conversión automática: §Operación aritmética: a = ‘03’; b = a +1; b = 3 §Operación condicional con valores numéricos: a = ’03’; if a > 1 then … §Función que acepta argumentos numéricos:
a = ‘03’; b = 3; c = sum (a,b); c = 3  Función INPUT:      varnum =  input(varchar, formato-input); varchar = ‘32000’;  varnum = input(varchar, 5.) ; varnum = 32000 varchar = ’32,000’: varnum = input(varchar, comma6.); varnum = 32000 varchar = ‘20131014’; varnum  = input(varchar, yymmd8.);varnum = 1964
2) Conversión formato numérico a alfanumérico:
Conversión automática: §Operación de concatenación: a = 3;

Tablas de muestra y bucles en SAS

Con el siguiente ejemplo, se pretende dar un caso de generación de tablas SAS de muestra para pruebas, en este caso con 1000 registros y los tres tipos de estructuras iterativas disponibles en los pasos data de SAS. Bucles de tipo do valor_ini to valor_fin, do - until y do - while.


data muestra;
do i = 1 to 1000;
   campo = round(ranuni(1), .01); /* La función ranuni genera un valor aleatorio entre 0 y 1 */
   output;
end;
run;

data muestra;
i = 0;
do while (i < 1000);
   campo = round(ranuni(1), .01);
    i = i + 1;
output;
end;
run;

data muestra;
i = 0;
do until (i = 1000);
    campo = round(ranuni(1), .01);
    i = i + 1;
output;
end;
run;

Soluciones SAS Big Data

Cada día toman más relevancia los sistemas “Big Data” y la gestión de los mismos. A continuación recopilo algunos links interesantes sobre las soluciones que SAS ofrece en este tipo de entornos.
Gestión de la información para el big data High-performance analytics para big data High-performance visual analytics Despliegue flexible para el big data

Tratamiento de fechas en SAS (III). Diferencias entre fechas.

Es habitual la necesidad de obtener diferencias entre fechas para realizar validaciones o ejecuciones condicionadas en los procesos. A continuación un sencillo ejemplo que obtiene diferencias entre fechas en diferentes unidades (días, meses, años) y realiza desplazamientos partiendo de una fecha determinada.
Así mismo, un paso data de ejemplo que obtiene todos los días de un mes determinado.

data funciones_f;
length fecha1_num fecha2_num 8.;
fecha1_num = 20121001;
fecha2_num = 20131001;
fecha_h_date = today();
run;




data funciones_f_01(drop = fecha_h_date_suma_1dia fecha_h_date_suma_1mes fecha_h_date_suma_1anyo );
set funciones_f;
/* Transformamos las variables numérica con contenido fecha yyyymmdd a variable tipo fecha */
fecha1_date = mdy((mod((int(fecha1_num/100)),100)),(mod(fecha1_num,100)),(int(fecha1_num/10000)));
fecha2_date = mdy((mod((int(fecha2_num/100)),100)),(mod(fecha2_num,100)),(int(fecha2_num/10000)));
/* Partiendo de una variable tipo fecha que contiene la fecha del día, la conver…

Funciones numéricas básicas

A continuación un sencillo ejemplo, que contiene un  resumen de las funciones numéricas SAS de más uso para realizar las operaciones básicas con números (agregados, medias, valor absoluto, redondeos, etc..).

data funciones_n;
importe1 = 5; importe2 = 4; importe3 = 4; s_importe = -1;output;
importe1 = 6; importe2 = 5; importe3 = 5; s_importe = 3; output;
importe1 = 10; importe2 = 7; importe3 = 6; s_importe = -2; output;
importe1 = 8; importe2 = 4; importe3 = .; s_importe = -1; output;
importe1 = .; importe2 = 0; importe3 = 5; s_importe = 1; output;
run;


data funciones_n_1;
set funciones_n;
c_importe_min = min(importe1, importe2, importe3); /* Valor mínimo */
c_importe_max = max(importe1, importe2, importe3); /* Valor máximo */
c_importe_total = sum(importe1, importe2, importe3); /* Sumatorio importes */
c_importe_total = sum(of importe1-importe3); /* Otra forma de indicar que sume de importe1 a 3 */
c_importe_total = sum(of imp:); /* Suma todos los campos que empiecen por imp: */
c_importe_med_s = (i…

Funciones cadenas de caracteres SAS (II). Búsqueda de caracteres en cadenas

Es habitual en el tratamiento de cadenas la búsqueda de caraceteres o patrones determinados en las cadenas. A continuación un sencillo ejemplo en el que sobre una cadena de texto se realizan determinadas búsquedas. Se muestran también funciones que reemplazan un caracter o patrón por otro.

data funciones_t;
length campo1 $50.;
campo1 = 'Cadena de texto de ejemplo';
run;

data funciones_t_1;
set funciones_t;
campo2 = index(campo1, 'e'); /* Busca el carácter indicado y devuelve la posición que ocupa */
campo3 = indexw(campo1, 'ejemplo'); /* Busca una cadena de caracteres y devuelve la posición */
campo4 = count(campo1, 'e'); /* Devuelve el número de veces que el caracter indicado
                                aparece en la cadena */
campo5 = anyalpha(campo1); /* Busca el primer alfanumérico y devuelve su posición */
campo6 = anydigit(campo1); /* Busca el primer dígito y devuelve su posición */
campo7 = substr(campo1, index(campo1, 't'), 5); /* Busca el caract…

Creación de índices en tablas SAS

En el siguiente ejemplo, mostramos las sentencias necesarias para crear y usar un índice en SAS. Los índices mejoran notablemente el rendimiento en las consultas que utilizan los campos claves del índice. Recordar que, así mismo,  las actualizaciones de datos en la tabla, se ven ralentizadas por la existencia del índice.




/* Creamos la data de ejemplo */



data prueba(drop = i);
do i = 1 to 1000000;
campo1='abc';
campo2=i;
campo3 = round(ranuni(100), 0.01);
output;
end;
run;


/* Con la siguiente sentencia obtenemos información sobre la creación y uso del índice */

options msglevel=i;


/* Creamos un índice por el campo campo3 */

procsql;
create index campo3 on prueba (campo3);
quit;



/* Se puede forzar en un paso data el uso del índice */



dataprueba1;
set prueba (idxwhere=yes); /* forzamos el uso del índice */
where campo3 = 0.5;
run;


/* Borrado del índice */


procsql;
drop index campo3 from prueba;
quit;



Selección de una herramienta ETL

Al abordar un proyecto de Business Intelligence es importante la correcta valoración de la herramienta ETL que vamos a utilizar. SAS proporciona interesantes herramientas ETL como puede ser SAS/Data Integration Studio, pero vamos a realizar un breve análisis sobre los aspectos a valorar en la selección de este tipo de herramientas.
La herramienta ETL será la base para diseñar e implementar los procesos de abastecimiento del Datamart , Datawarehouse o estructura de almacenamiento en base a la cual posteriormente explotaremos los datos. Se trata de una pieza fundamental para el diseño, construcción y posterior evolución de nuestro sistema B.I. Analizaremos únicamente cuestiones técnicas, sin entrar a los aspectos económicos o de otra índole (licencias, acuerdos, soporte técnico, evoluciones de la herramienta, etc..). Señalar que los procesos de ETL, van muy ligados a los procesos de data profiling y de calidad de datos, que aquí no vamos a considerar.
Brevemente y como inicio recordamos q…

Diccionario de SAS: tablas dictionary.tables y dictionary.columns

En ocasiones resulta útil acudir al diccionario de SAS para obtener información
de la estructura de las tablas con las que trabajamos.
A continuación un sencillo ejemplo que accede a las tablas dictionary.tables
y dictionary.columns para obtener todas las tablas y sus columnas contenidas
en una determinada librería

/* Creamos tablas de trabajo: prueba1 y prueba2 */

data prueba1;
var1='a';var2 = 5;
run;

data prueba2;
varc = 'c';varn = 8;
run;



%macro obtener_campos(libreria);

%put Obtenemos tablas y campos de la librería &libreria;

/* Obtenemos todas las tablas contenidas en la librería, las recorremos
con una estructura de control iterativa obteniendo para cada tablas
todas sus columnas */

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(…

Funciones cadenas de caracteres SAS (I). Tratamiento de blancos.

Funciones cadenas de caracteres(I). Tratamiento de blancos.
Iniciamos una serie de entradas con ejemplos sobre funciones de tratamiento de caracteres. Empezamos por el tratamiento de blancos. A continuación un sencillo ejemplo para eliminar blancos, en el que se emplea una u otra función según se quieran eliminar todos los blancos, sólo los de los extremos y funciones para alinear a la derecha o izquierda la cadena resultante.

data prueba1;
length direccion $30.;
direccion = '  C  /  Río Segura, 14    ';
output;
run;

data prueba2;
set prueba1;
direccion1 = left(direccion); /* alinea el texto a la izquierda */
direccion2 = right(direccion); /* alinea el texto a la derecha */
direccion3 = trim(direccion); /* Elimina los blancos iniciales y finales de la cadena de texto */
direccion4 = compress(direccion); /* Elimina todos los blancos que contenga la cadena de caracteres */
direccion5 = strip(direccion);  /* Elimina blancos iniciales y finales y alinea a la izquierda */
direccion6 = left(trim(…

Tratamiento de fechas en SAS (II)

Incluímos otro sencillo ejemplo de tratamiento de fechas. En este ejemplo se obtiene la fecha del sistema, y la fecha inmediatamente anterior y posterior, igualmente se obtiene el día de la semana.

data _null_;
   length dia_sem_hoy $10.;
   format fecha_hoy fecha_ant fecha_pos yymmddn8. ; /* date formats */
   f_hoy="&sysdate"d;
   f_ant=sum(f_hoy,-1);
   f_pos=sum(f_hoy,+1);
   fecha_hoy = input(put(f_hoy,yymmddn8.),8.);
   fecha_ant = input(put(f_ant,yymmddn8.),8.);
   fecha_pos = input(put(f_pos,yymmddn8.),8.);
   dia_s_hoy = weekday(f_hoy);
   select(dia_s_hoy);
when (1) dia_sem_hoy = 'Domingo';
when (2) dia_sem_hoy = 'Lunes';
when (3) dia_sem_hoy = 'Martes';
when (4) dia_sem_hoy = 'Miercoles';
when (5) dia_sem_hoy = 'Jueves';
when (6) dia_sem_hoy = 'Viernes';
when (7) dia_sem_hoy = 'Sábado';
   end;
   call symput('fecha_hoy',fecha_hoy);
   call symput('dia_sem_hoy',dia_sem_hoy);
   call symput('fecha_ant'…

Recorrer y validar de forma automática todos los campos de una tabla

En ocasiones, puede ser de utilidad en procesos de validación de datos, el introducir una comprobación y acción a tomar para todos los campos de una tabla SAS determinada.

A continuación, un sencillo ejemplo que valida todos los campos numéricos y de tipo carácter buscando valores nulos y sustituyéndolos por un valor que fijemos.

data test;
var1 = 'A';var2 = 1;output;
var1 = '';var2 = .;output;
var2 = 5;output;
var1 = 'B';var2 = .;output;
run;


data test1;
set test;
array vars1(*) _numeric_ ;
array vars2(*) _character_ ;
do i=1 to dim(vars1);
if vars1(i)=. then vars1(i)=0;
if vars2(i) = '' then vars2(i) = '-';
end;
drop i;
run;

Macro para recorrer una tabla SAS

A veces resulta útil recorrer una tabla SAS y en base al valor de determinado campo ejecutar un proceso dado. A continuación un sencillo ejemplo para recorrer una tabla cuyo nombre se pasa por parámetro y evaluar el valor de un campo de la tabla que  también se pasa como parámetro. En base al valor de este campo se ejecutaría determinado código.



%macro recorrer_tabla(tabla,campo);

%let dsid = %sysfunc (open(&tabla));   
%let nobs = %sysfunc (attrn(&dsid, NOBS));
%if &nobs > 0 %then %do;
    %do i = 1 %to &nobs;    
        %let rc = %sysfunc(fetch(&dsid));

        %let valor = %sysfunc (getvarc(&dsid,%sysfunc(varnum(&dsid,&campo))));       
        %put valor &i = &valor;
        /* Logica a ejecutar en base al valor */
    %end;
%end;
%let rc = %sysfunc (close(&dsid));

%mend recorrer_tabla;


%let tabla = prueba;
%let campo = mes;
%recorrer_tabla(&tabla,&campo);

data prueba;
mes = '201301';output;mes='201302';output;mes='2013…

Uso del procedimiento 'proc format'

El procedimiento 'proc format' resulta muy útil para crear formatos personalizados. Es común utilizarlo para crear tablas de realación. Son bastante fáciles de usar y su rendimiento es muy aceptable.A continuación un sencillo ejemplo.

proc format library=work;
value  $ciudad 'M'='Madrid'
             'B'='Barcelona'
             'V'='Valencia'
              other = 'No disponible';
run;

data prueba1;
campo1 = 'M';
output;
campo1 = 'B';
output;
campo1 = 'V';
output;
campo1 = 'J';
output;
run;


data prueba2;
set prueba1;
campo2=put(campo1,$ciudad.);
run;

Soluciones analíticas in-database. Caso SAS - Teradata

Dentro de las soluciones de SAS enfocadas a la mejora de rendimientos y tiempos de respuesta en entornos analíticos destaca el esfuerzo realizado con la propuestaSAS In-Database. Esta propuesta va acompañada de otro tipo de soluciones high-performance como son SAS Grid Computing y SAS In-memory, que igualmente mejoran rendimiento, ayudan a gestionar la carga de trabajo y facilitan la escalabilidad de los entornos analíticos. La solución SAS In-Database reduce la necesidad de mover grandes volúmenes de datos entre las soluciones SAS y los SGBD. Realizar el tratamiento de datos, los procesos analíticos o de reporting dentro de la base de datos donde reside esta información reduce movimientos de datos innecesarios y facilita las funciones de data governance. Por otra parte, permite aprovechar la arquitectura MPP de las bases de datos y entornos data Warehouse para mejorar la escalabilidad y el rendimiento de los procesos. En particular, destaca la integración de SAS con Teradata. Este acue…

Tratamiento de fechas en SAS (I)

Voy a ir publicando una serie de entradas, que contendrán ejemplos sencillos sobre tratamiento de fechas en SAS. Es una práctica habitual y tener ejemplos sencillos a mano, puede ayudar.

En esta ocasión muestro un ejemplo para transformar en un paso data un campo númerico con contenido de fecha a campo tipo fecha y viceversa.

                     numérico YYYYMMDD  <--> date


/* Creamos una tabla ejemplo con variables numérica con contenido de fecha y con formato yyyymmdd */

data prueba;
length fecha_num 8.;
fecha_num = 20130601; output;
fecha_num = 20130630; output;
run;

/* Transformamos la variable numérica con contenido fecha yyyymmdd a variable tipo fecha */

data prueba1;
set prueba;
fecha_date = mdy((mod((int(fecha_num/100)),100)),(mod(fecha_num,100)),(int(fecha_num/10000)));
run;

/* Partiendo de una variable tipo fecha que contiene la fecha del día, la convertimos en un
numérico con formato yyyymmdd */

data prueba2;
fecha_date = today();
fecha_num = input(put(fecha_date,yymmddn8.),8.);
run;

Creación de bucles basados en rango fechas (macros SAS)

Es habitual encontrarse la necesidad de ejecutar determinado proceso para un determinado rango de fechas. Para ello es muy útil el uso de macros de SAS que incluyan estructuras iterativas que nos permitan ejecutar un determinado código para un rango determinado de fechas. En el ejemplo que se muestra a continuación se muestra el esqueleto de una macro que permite ejecutar un código para un determinado rango de meses, en formato yyyymm.




%macro recorrer_meses(mes_ini, mes_fin);

      data _null_;

f_ini=input(PUT(&mes_ini.01,8.),yymmdd8.); f_fin=input(PUT(&mes_fin.01,8.),yymmdd8.); format f_ini f_finyymmddn8.;       dif=intck('month',f_ini,f_fin); call symput('num_meses',dif); run;

%do n=0%to