sábado, 19 de octubre de 2013

Procesos de calidad de datos.

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 importante necesidad de normalización, como puede ser la unificación e BBDD de clientes, empleados, productos, servicios, etc..
De igual forma hay procesos de la empresa para los que son clave la fiabilidad de los datos, como pueden ser los datos de clientes en las acciones comerciales o en el cumplimiento de legislaciones tipo LOPD o cuestiones técnicas como migraciones de plataforma tecnológica.
Estos procesos ya no sólo afectan a compañías con extensas BBDD de clientes como un operador de telecomunicaciones o una entidad financiera o seguros, sino que empieza a ser un proceso vital para cualquier compañía con un grado de madurez importante en sus sistemas de información.
 
A continuación realizamos un repaso de las principales fases y actividades que conforman los procesos de análisis, mejora y control de los de datos.
 

Análisis y perfilado de datos:



En esta fase se realiza un análisis de las diferentes fuentes de datos origen del Data Mart o Data Warehouse. El objetivo del análisis es conocer la estructura, contenido, fiabilidad y relaciones entre los datos. Esto conlleva analizar:
  • La estructura de las fuentes origen: tipo de fuente (fichero host, Excel, tabla BBDD, XML, etc..) tipo de estructura (bloque fijo, bloque variable, etc..), formatos de los campo (tipo de datos, longitud, etc..) y nivel de granularidad. Nos topamos aquí con la información no estructurada cuyo análisis merece capítulo aparte.
  • Contenido de los datos: tipo de información que contiene cada fuente y campo. Identificar qué información es realmente relevante para el análisis.
  • Identificación de claves únicas. Identificación de posibles claves foráneas.
  • Validaciones técnicas: integridad, duplicidades, valores obligatorios, nulos, etc…
  • Validaciones en base a reglas de negocio. Por ejemplo, rangos de valores límites, valores no posibles, umbrales (edad < 0, código postal de más de n dígitos, número de cuenta corriente de menos de n dígitos, etc..).
  • Identificación de duplicados, no sólo por validación técnica de clave idéntica, sino de posibles duplicados entre registros que contienen campos con diferentes valores, pero que por error de grabación pueden ser el mismo.
  • Estadísticas y distribuciones de datos. Ejemplo centrándonos en una columna efectuar conteos, agregaciones, valores máximos, mínimos, medio, desviaciones, frecuencias, distribución de los valores, rangos de valores, número de valores distintos, ratio de nulos, distribución de longitudes, etc…

  • Estadística predictiva: en base a la estadísticas realizadas, obtener el valor más probable, más frecuente, construir tablas de frecuencia en base a las existentes.
  • Análisis de los campos descriptivos (descripciones incompletas, errores ortográficos y confusiones fonéticas, caracteres extraños, descripciones en diferentes idiomas, etc..), cualquier tipo de error que deba ser corregido o normalizado antes de ser tratada esa información. Reconocimiento de patrones.
  • Estudiar la codificación de los campos. Existencia de diferentes codificaciones del mismo campo (ejemplo código cliente o producto, diferente en sistemas de marketing y en sistemas de facturación o en función del ERP que provee la información) y reglas de relación (tablas de normalización) entre ellas.
  • Relaciones entre las diferentes fuentes origen. Relaciones entre los campos de una misma fuente. Tipo de relaciones, tipo de dependencias. Identificar restricciones en las relaciones que pueden dar problemas. Detectar relaciones ocultas o no evidentes entre los datos.
  • Identificar campos comunes y estandarizados, que deben seguir un patrón establecido, para tratamiento y normalización estándar. Ejemplo: nacionalidad, nombres, direcciones postales, teléfono, e-mail, código divisa, código cuenta correinte, código entidad financiera, etc…
  • Determinar el posible impacto de datos de baja calidad. Profundizar en registros específicos con mala calidad de datos para determinar su impacto en el negocio y hallar una solución. Una mala calidad de datos, no impacta los mismo según qué tipo de información provea y puede haber casos de gran impacto en el análisis final de la información.
  • Definir las acciones a tomar en los errores detectados. Ejemplo: si debemos establecer código de valor indeterminado para los nulos, qué hacer en los errores de integridad referencial, etc..
 
Esta fase nos proporciona un conocimiento minucioso de la información de origen que debe servir para establecer pautas sobre su posterior normalización, depuración, mejora y tratamiento. Se trabaja a todos los niveles (columna, tabla, modelo). En esta fase debemos identificar qué fuentes pueden dar problemas por cuestiones estructurales para su descarte o modificación con objeto de evitar problemas posteriores. Las actuales herramientas de perfilado de datos proveen una interfaz que facilita la fácil visualización de las relaciones entre los datos y automatizan considerablemente la creación, ejecución y reutilización de reglas de validación y limpieza. Estas herramientas, como es lógico, deben disponer de conectores para acceder a todo tipo de fuentes de datos y todo tipo de plataformas, considerando diferentes infraestructuras tanto locales, remotas como cloud. Así mismo, deben minimizar el movimiento de datos.
 

Normalización, mejora y enriquecimiento de los datos:



El paso posterior al perfilado de datos es la normalización y mejora de los mismos.
Una primera técnica en la normalización de datos sería reconocer entidades de texto con cadenas de texto diferentes, pero que representan la misma entidad de datos.
Un ejemplo típico sería el de las direcciones postales:
 
 
En una normalización de direcciones deberíamos conseguir:
  • Separar los datos en diferentes campos: tipo vía, nombre, número de vía, código postal y ciudad.
  • Marcar registros duplicados mediante la comparación de los campos identificados.
  • Detectar errores tipográficos, abreviaturas, prefijos, etc...
  • Diferentes juegos de caracteres.
  • Eliminar caracteres no deseados.
  • Añadir otros campos como el código postal.
  • Corregir y codificar la vía utilizando BBDD estándar (ejemplo INE).
  • Detectar y corregir cambios de nombre en direcciones.
  • Marcar direcciones no válidas.
  • Asignar, finalmente  un indicador de fiabilidad.
Para ello y apoyándonos en el perfilado de datos realizado inicialmente hay que realizar un parsing de datos, el analizador sintáctico debe extraer componentes con significado, en nuestro ejemplo direcciones postales, que después puedan ser normalizados.
El resultado final es una representación única y estandarización de direcciones.
 
Caso similar puede ser el de los nombres:
 
 
En donde el objetivo debe ser:
  • Señalar  nombres no identificables.
  • Eliminar caracteres no deseados.
  • Dividir cadenas en  nombre, primer y segundo apellido. Obtener representación estándar considerando nombres y apellidos compuestos, preposiciones que preceden apellidos, etc..
  • Añadir género en función del nombre de pila.
  • Marcar registros duplicados mediante la comparación de los campos identificados.
  • Corregir errores de grabación, errores tipográficos, errores ortográficos.
  • Interpretar abreviaturas.
  • Asignar, un indicador de fiabilidad.
En estos casos particulares de nombres y direcciones postales hay que tener en cuenta que normalizar nombres y direcciones es imprescindible para realizar de forma eficaz campañas de marketing, facilita la segmentación por sexo de estas campañas. Igualmente la LOPD exige que los datos de carácter personal sean exactos.
 
En los casos de aplicación de calidad de datos a las acciones de marketing es necesario también normalizar teléfonos y direcciones de e-mail, de forma que:
  • Validar cuentas de correo electrónico: direcciones mal escritas, validar existencia de dominio, validación a nivel SMTP, etc..
  • Marcar números de teléfono incorrectos, asignar el prefijo telefónico según la población, validaciones a nivel de vía y número.
En estos procesos un paso fundamental es el ‘matching’ entre diferentes fuentes de datos. De tal forma que en el cruce de registros entre tablas, eliminemos duplicados, unifiquemos códigos empleando tablas de normalización (relaciones entre códigos), seleccionemos el registro más fiable y finalmente realicemos una consolidación de datos.
 
Son de especial relevancia los procesos de matching en los casos de compras o fusiones entre empresas, en el establecimiento de datos maestros en una organización, en la adquisición de bases de datos externas, etc…, en estos procesos la deduplicación de registros supone un ahorro de costes muy considerable.
En el apartado de enriquecimiento de datos, basaremos estos procesos en la utilización de bases de datos estándar como pueden ser: bases de datos de códigos postales, direcciones postales, localidades, bases de datos para geolocalización y georeferenciación, bases de datos empresas, hogares y otras de carácter más amplio como bases de datos con datos sociodemográficos, bases de datos de instituciones estadísticas (ejemplo INE), etc..
 

Monitorización y calidad de datos en tiempo real



Una vez realizados los anteriores pasos y una vez que consideramos el dato un recurso estratégico de la organización se hace necesario realizar una monitorización y seguimiento de la calidad de los mismos.
Hay que definir métricas, en base a las reglas de calidad de datos construidas. Se establecerán indicadores de calidad de datos, objetivos en la calidad de los mismos y se definirán scorecards de calidad de datos que permitan realizar un seguimiento continuo estableciendo alertas que nos informen sobre posibles entidades o sistemas con baja calidad de datos. Estos indicadores deben basarse en los objetivos que persiguen los procesos de calidad de datos:
  • Precisión
  • Integridad
  • Consistencia
  • Completitud
  • Validez
  • Oportunidad
  • Accesibilidad
Las reglas definidas en los anteriores pasos que auditan, normalizan y enriquecen los datos de la organización, deben ser implementadas en una última fase como servicios de calidad de datos en tiempo real. De forma que aseguremos la calidad en los nuevos datos que entran a nuestros sistemas y en las nuevas entidades de datos que incorporemos a nuestros sistemas corporativos. Esta automatización de las reglas de calidad de datos y su integración en los sistemas corporativos, suponen un servicio en tiempo real, que actúa a modo de firewall que asegura la calidad del dato.
 

Herramientas de calidad de datos



Se trata de un mercado actualmente en expansión, muchas empresas realizan algunos de los procesos de calidad de dato en base a procedimientos de bases de datos o programas SQL a medida o bien utilizando las prestaciones de calidad de datos incluidas en las herramientas ETL. Se estima que sólo un tercio de las empresas cuentan con herramientas específicas de calidad de datos.

lunes, 23 de septiembre de 2013

SAS Forum España 2013

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


viernes, 20 de septiembre de 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(varcharformato-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; b = ‘A’||a;   b = ‘A3’
§Función que acepta argumentos alfanuméricos:
a =  3 ; b = index(a, ‘3’);  
  •    Función PUT:       
varchar =     input(varnumformato-input);
   varnum =  100;  varchar =put(varnum, 5.) ; varchar = ‘100’
   varnum = 100 :  varchar = put(varnum, z5.); varchar = 00100
   varnum = 32000;  varchar = put(varnum, e8.); varchar = ‘3.2E+04’



martes, 3 de septiembre de 2013

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;

sábado, 31 de agosto de 2013

jueves, 29 de agosto de 2013

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 convertimos en un
numérico con formato yyyymmdd */
fecha_h_num = input(put(fecha_h_date,yymmddn8.),8.);
/* Obtenemos diferencias entre fechas en días, meses y años */
dif_dias=intck('day',fecha1_date,fecha2_date);
dif_dias_lab = intck('weekday',fecha1_date,fecha2_date); /* Diferencia de días, en días laborables */
dif_meses=intck('month',fecha1_date,fecha2_date);
dif_años=intck('year',fecha1_date,fecha2_date);
/* Desplazamos la fecha del día en una unidad: días, meses o años */
fecha_h_date_suma_1dia = intnx('day',fecha_h_date,1);
fecha_h_num_suma_1dia = input(put(fecha_h_date_suma_1dia ,yymmddn8.),8.);
fecha_h_date_suma_1mes = intnx('month',fecha_h_date,1);
fecha_h_num_suma_1mes = input(put(fecha_h_date_suma_1mes ,yymmddn8.),8.);
fecha_h_date_suma_1anyo = intnx('year',fecha_h_date,1);
fecha_h_num_suma_1anyo = input(put(fecha_h_date_suma_1anyo ,yymmddn8.),8.);
/* Obtener el día, mes y año de la fecha del día */
dia_h = day(fecha_h_date);
mes_h = month(fecha_h_date);
anyo_h = year(fecha_h_date);
/* Partiendo de la fecha del día en formato fecha-hora, dividir en fecha y hora */
datetime_h = datetime();
date_h = datepart(datetime_h);
time_h = timepart(datetime_h);
format date_h date9. datetime_h datetime. time_h time.;
run;


/* Obtener todos los días de un mes */

%let mes = 201309;

data funciones_f_m (keep = dia_mes) ;
dia_ini = &mes.01;
i = 0;
val_mes = 1;
dia_mes_ini = mdy((mod((int(dia_ini/100)),100)),(mod(dia_ini,100)),(int(dia_ini/10000)));
do while (val_mes = 1);
    dia_mes_aux = intnx('day',dia_mes_ini,i);
    i = i + 1;
    dia_mes = input(put(dia_mes_aux ,yymmddn8.),8.);
    if round(dia_mes/100) = &mes. then do;
        val_mes = 1;
        output;
    end;
    else do;
        val_mes = 0;
    end;   
end;
run;

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 = (importe1 + importe2 + importe3)/3; /* El resultado es diferente al de
                                        la funcion mean en caso de haber nulos */
c_importe_medio = mean(of imp:); /* Valor medio */
c_importe_medio_r = round(c_importe_medio, .01); /* Valor importe medio redondeado a 2 decimales */
c_importe_medio_f = floor(c_importe_medio); /* Redondea a la baja */
c_importe_medio_c = ceil(c_importe_medio); /* Redondea al valor superior */
c_signo_importe = sign(s_importe); /* Devuelve el signo del importe -1 o 1 */
c_abs_importe = abs(s_importe);  /* Devuelve el valor absoluto */
c_des_estandar = std(of imp:); /* Devuelve la desviación estandar */
c_varianza = var(of imp:); /* Devuelve la varianza - medida de dispersión */
run;

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 caracter indicado y partiendo
                                    de él obtiene una cadena de 5 caracteres */
campo8 = scan(campo1, 1, ' '); /* Obtiene todos los caracteres que hay desde la izquierda
                            hasta la primera ocurrencia del caracter indicado */
campo9 = scan(campo1, 2, ' ');
campo10 = translate(campo1, 'i', 'e'); /* Busca el segundo caracter y lo reemplaza por el primero */
campo11 = tranwrd(campo1, 'ejemplo', 'example'); /* Busca la cadena indicada en el
                        el primer argumento y la sustituye por la segunda */
run;


sábado, 10 de agosto de 2013

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 */

proc sql;
create index campo3 on prueba (campo3);
quit;

 

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

 

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

 
/* Borrado del índice */

 
proc sql;
drop index campo3 from prueba;
quit;

 

 
 
 

miércoles, 7 de agosto de 2013

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 que ETL son las siglas en inglés de Extraer, Transformar y Cargar (Extract, Transform and Load). En base a estos tres pasos básicos en el diseño de los procesos, vamos a proponer aspectos a considerar en la selección de una herramienta de este tipo. Posteriormente veremos las cuestiones relativas a su explotación.

 

Diseño de los procesos


Extracción



El primer paso es la extracción de los datos desde los sistemas de origen que pueden ser múltiples y con múltiples formatos. Es importante en esta fase una correcta validación de los datos de origen y una homogeneización de los mismos. Es importante considerar el volumen que vamos a tratar y realizar este paso sin causar impacto en los sistemas de origen (procesos batch). Vamos a considerar en este paso tanto la extracción, como la validación de los datos leídos.
En lo que respecta a esta etapa, una herramienta ETL es conveniente que cumpla los siguientes aspectos:
  • Conectividad: capacidad para mapear múltiples orígenes como diferentes SGDB, diferentes tipos de modelos (relacionales, no relacionales), tipos de ficheros y formatos (host, XML, Excel, etc..), tipos de sistemas origen (ERP’s, SCM, sistemas propios), formatos de mensajes estándar (ej. SWIFT), colas de mensajería, downloads, etc..
  • Facilidades para el análisis y mapeos de los formatos o modelos de datos origen.
  • Admitir múltiples frecuencias de actualización. Las múltiples fuentes de datos de origen tienen diferentes ciclos de recepción y de actualización. La frecuencia de recepción puede cambiar de una a otra, así como las necesidades de actualización. Importante, la capacidad de incluir puntos de control entre las fuentes en los que garanticemos su sincronización.
  • Capacidad de incorporar datos de formatos no estructurados (documentos ofimáticos, e-mails, websites, logs,  etc). El campo de los datos no estructurados es inmenso y en plena evolución, es complicado de evaluar.
  • Gestión de las valiaciones técnicas: nulos, valores únicos, integridad referencial, campos obligatorios, rangos de valores, etc…y de las validaciones de negocio: reglas para comprobar las consistencia de los datos basándonos en los requerimientos de negocio.
  • Gestión de errores. Detección de los mismos y aplicación de acciones.
  • En caso de tratarse de una herramienta que desde la metadata genera código, ver la posibilidad de realizar ingeniería inversa: del código a la metadata.


Transformación



La fase de transformación consiste en realizar pasos de transformación o creación de nuevos datos en base a los recibidos y aplicando las reglas de negocio particulares de cada sistema. Existen pasos comunes a casi todos los procesos de transformación, tales como: selección de columnas a tratar, transformación de codificaciones (columnas codificadas de forma diferente en sistema origen respecto al sistema destino), calcular nuevas columnas en base a las columnas recibidas, realizar agregaciones, cruces de datos entre diferentes fuentes, etc…
  • Componentes predefinidos que incorpora la herramienta para realizar diferentes tipos de transformaciones muy extendidas (filtrados, cruces, mapeos, etc..)
  • Soporte para test y debugging que facilite el seguimiento de las transformaciones del proceso.
  • Posibilidades de incorporar código externo (no generado por la herramienta).
  • Posibilidad de crear procedimientos propios y utilizarlos otros procesos (reutilización de código/procesos).
  • Posibilidades para optimizar los proceso de tratamientos de datos voluminosos o costosos ante problemas de rendimiento.
  • Trazabilidad del dato. Disponer de un rastro de todas las transformaciones de un valor a lo largo del proceso. En el caso ideal, metadata consultable por el usuario, para que pueda realizar seguimiento en caso de detectar datos correctamente cargados, pero incoherentes de cara a negocio.

Carga


Esta última etapa, consiste en el volcado de los datos ya leídos, validados y tratados en la estructura analítica para su posterior explotación.
  • Considerar diferentes tipos de tablas destino (en general objetos BBDD de almacenamiento).
  • Considerar diferentes tipos de carga: borrado y volcado completo, carga incremental, etc…
  • Creación de procesos de agregación. Considerar diferentes niveles de agregación y organización de los datos (cubos, BBDD multidimensional).
  • Volcados de datos que consideren  diferentes niveles de agregación y organización de los datos en las tablas destino (cubos, BBDD multidimensional).
  • En esta etapa es igualmente importante el rendimiento: Procesamiento de volcados en paralelo para optimizar tiempos de volcado.

Una vez analizados los aspectos relevantes en el diseño de los procesos, revisamos los aspectos a considerar en la explotación y mantenimiento y evolución de la herramienta.

Explotación y mantenimiento de la herramienta


  • Adaptación a las diferentes plataformas hardware y sistemas operativos existentes.
  • Facilidad de uso. Interfaz intuitiva. Sencilla representación grafica de los objetos del repositorio, modelos de datos y flujos de datos.
  • Posibilidad de realizar análisis de impacto. Ver las implicaciones que un cambio en el modelo de datos o en los procesos tiene en todo el proyecto.
  • Versionado de código. Control de cambios. Gestión del trabajo en grupo.
  • Posibilidades de documentación.
  • Rapidez de consulta y actualización de la metadata o posibilidades de optimizarla (índices).
  • Posibilidades para planificar jobs: planificaciones batch, ejecuciones basadas en eventos, disparadores, etc…
  • Gestión de la cadena de ejecución. Dependencias entre procesos. Rearranque de jobs.
  • Sistema de logs. Logs detallados de ejecución/errores y recolección de estadísticas de ejecución (logs de resumen de cargas: fecha carga, registros cargados, registros erróneos, etc..).
  • Herramientas para monitorizar procesos y evaluar el rendimiento de los jobs (resource analyzer).
  • Compatibilidad con CWM (Comun Warehouse Metamodel). Capacidad para exportar o importa metadatos a otras herramientas ETL.
  • Actualización continua: El aumento de los volúmenes de datos pueden hacer que los lotes que se procesaban a diario pasen a procesarse en micro-lotes (varios al día) o incluso a la integración con colas de mensajes o a la captura de datos modificados (CDC: Change Data Capture) en tiempo real para una transformación y actualización continua.
  • Integración con el resto de componentes de la plataforma analítica, con el resto de los componentes de la plataforma de integración de datos (data profiling, calidad de datos) y con los componentes más orientados a explotación, análisis y presentación (capa reporting, dashboards, data mining, etc..).
  • Capacidad de adaptación a estándares que permitan el fácil intercambio de datos (ejemplo SOA).
  • Capacidad de interoperabilidad con otras herramientas (ej. Vía API).
  • Cuestiones de seguridad propias de cualquier herramienta.
Como es lógico, este breve compendio, trata aspectos generales que posteriormente deberán ser complementados con la problemática particular de cada sistema, infraestructura tecnológica, requerimientos de negocio y necesidades de información. En particular, en los proyectos 'Big Data', sería necesario añadir consideraciones adicionales de almacenamiento, volumen y rendimiento.

jueves, 1 de agosto de 2013

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(&dsid));                                                                                                                                                                                                                                          
%let tabla = %sysfunc (getvarc(&dsid,1));  
%put Obtenemos campos tabla = &tabla;

/* Obtenemos todas las columnas y el tipo de cada una para una tabla determinada */

PROC SQL;
create table columnas as (SELECT name, type
  FROM dictionary.columns WHERE libname= "WORK" AND memtype = 'DATA' and                    memname="&tabla");
quit;

%let dsidc = %sysfunc (open(columnas));    
%let nobsc = %sysfunc (attrn(&dsidc, NOBS));
%if &nobsc > 0 %then %do;
%do j = 1 %to &nobsc;     
%let rc = %sysfunc (fetch(&dsidc));                                                                                                                                                                                                                               
%let columna = %sysfunc (getvarc(&dsidc,1));
%let tipo = %sysfunc (getvarc(&dsidc,2));
%put Nombre columna = &columna y tipo = &tipo;
%end;
%end;
%let rc = %sysfunc (close(&dsidc));

%end;
%end;
%let rc = %sysfunc (close(&dsid));

%mend;

%obtener_campos(WORK);

lunes, 29 de julio de 2013

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(direccion)); /* Equivalente a strip, con funciones left y trim */
run;

jueves, 25 de julio de 2013

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',fecha_ant);
   call symput('fecha_pos',fecha_pos);
run;

%put fecha actual: &dia_sem_hoy &fecha_hoy, fecha anterior: &fecha_ant, fecha posterior: &fecha_pos;

viernes, 19 de julio de 2013

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;

martes, 16 de julio de 2013

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='201303';output;
run;

lunes, 15 de julio de 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;

domingo, 14 de julio de 2013

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 propuesta SAS 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 acuerdo ha creado SAS and Teradata Analytic Advantage Program, combinando la potencia analítica de SAS con las prestaciones en entornos data warehouse de Teradata.  
La solución reduce los costes en la preparación de datos para los procesos analíticos y mejora los tiempos en la obtención de los resultados analíticos. Optimiza la creación de modelos analíticos, convirtiendo los modelos SAS en objetos de base de datos. Se reduce el movimiento de datos, la redundancia y los problemas de refresco de datos.
El programa ofrece tres niveles, en función de las necesidades analíticas de la organización:
Express: Un primer nivel para facilitar el uso de estadística para resolver cuestiones de negocio. Integra los módulos de SASSAS Analytics Pro, SAS/ACCESS Interface to Teradata y SAS Enterprise Guide.
Advanced: Ofrece más soluciones de in-database analytics, como rápida creación y entrenamiento de modelos estadísticos. Integra los módulos de SAS: SAS SAS Analytics Pro, SAS/ACCESS Interface to Teradata y SAS Enterprise Miner y SAS Scoring Accelerator for Teradara.
Entreprise: Una solución completa que ofrece un completo portfolio de modelos analíticos. Centraliza la creación, desarrollo, implantación y gestión de modelos. Automatiza los procesos analíticos de apoyo a la toma de decisiones en cualquier nivel de la organización. ntegra los módulos de SAS: SAS SAS Analytics Pro, SAS/ACCESS Interface to Teradata y SAS Enterprise Miner, SAS Model Manager y SAS Scoring Accelerator for Teradara.
Como ejemplo sencillo de integración de los procedimientos SAS en Teradata, la documentación de SAS, nos ofrece el siguiente caso:
Un procedimiento de uso bastante extendido en SAS es el procedimiento PROC FREQ. Este procedimiento realiza una estadística descriptiva sencilla en base a un set de datos de SAS.
Veamos un caso:
proc freq data=customer.credit_data;
table state * credit_score;
La especificación DATA= indica al procedimiento PRO FREQ que la tabla de entrada es custormer.credit_data, donde customer indica el esquema de base de datos. credit_data es el nombre de la tabla de la BBDD de Teradata. El procedimiento obtiene estadísticas de los valores de la columna credit_score agrupados por el campo state.
Para obtener los resultados, los valores únicos de la columna crédito_score de la tabla crédito_data deben ser contados por el campo state. El procedimiento PROC FREQ obtiene   también los valores mínimos y máximos.
Para obtener estos mismos resultados in-database, se genera dinámicamente el SAS SQL equivalente al procedimiento PROC FREQ. Esta SQL es enviada al módulo SAS/ACCESS que a su vez lo envía al motor de la base de datos Teradata
select count(*) as f1, state, min(state) as f2, credit_score,
min(credit_score) as f3, max(credit_score) as f4
from customer.credit_score group by state, credit_score

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;