viernes, 27 de junio de 2014

Ejemplos de componentes para tratamiento de datos en SAS, SPSS y R. Equivalencias entre herramientas (II)

Continuamos con la serie de posts, en la que mostramos componentes de tratamientos de datos codificados en las herramientas: SAS, SPSS y R.




Ejemplo 7. Obtener agregados:

SAS:

proc summary data=tabla1 noprint nway;
   class cod_cliente ;
   output out=tabla_ag(drop=_type_ _freq_)
   sum(arpu) = suma_arpu mean(arpu) = media_arpu ;
run;


SPSS:

aggregate outfile 'c:\temp\tabla_ag.sav'
 /break cod_cliente
 /suma­_arpu = sum(arpu).
 /media_arpu = mean(arpu)
get file 'c:\temp\tabla1.sav'.
list.


R:
tabla_ag <- aggregate(tabla1["arpu"], by=list(cod_cliente=tabla1$cod_cliente), FUN=sum)


Ejemplo 8. Eliminar duplicados:

SAS:

proc sort data=tabla1 nodupkeys;
by cod_cliente;
run;


SPSS:

GET FILE='C:\temp\tabla1.sav'.
SORT CASES BY cod_cliente .
MATCH FILES /FILE = *
/BY cod_cliente /LAST = ultimo .
FILTER BY ultimo .
EXECUTE.

R:

tabla1_uniq <- unique(tabla1)


Ejemplo 9. Recodificación variables:

SAS:

data tabla2;
set tabla1;
if arpu >= 0 and arpu <= 10 then do;
       grupo_arpu = 1;
end;
else do;
       if arpu > 10 and arpu <= 20 then do;
             grupo_arpu = 2;
       end;
       else do;
             grupo_arpu = 3;
       end;
end;
run;

SPSS:

GET FILE='C:\temp\tabla1.sav'.
RECODE arpu (lo thru 10=1) (11 thru 20=2) (21 thru hi=3) into grupo_arpu.
EXECUTE.
SAVE OUTFILE = 'C:\temp\tabla2.sav'.

R:

tabla1$grupo_arpu[tabla1$arpu>=0 & tabla1$arpu <= 10 ] <- 1
tabla1$grupo_arpu[tabla1$arpu>10 & tabla1$arpu <= 20 ] <- 2
tabla1$grupo_arpu[tabla1$arpu>20 ] <- 3


Ejemplo 10. Renombrar variables:

SAS:

data tabla1(rename=(cod_cliente=id_cliente));
set tabla1;
run;


SPSS:

GET FILE='C:\temp\tabla1.sav'.
RENAME VARIABLES (cod_cliente = id_cliente).
EXECUTE.
SAVE OUTFILE = 'C:\temp\tabla2.sav'.

R:

colnames(tabla1)[colnames(tabla1)=="cod_cliente"] <- "id_cliente"


Ejemplo 11. Funciones aritméticas:

SAS:
data tabla_num;
input var1-var4;
resto= mod(var4,3);
media = mean(of var1-var4);
media_ent = int(media);
cards;
1 . 3 4
5 6 7 8
9 . . 12
;
run;


SPSS:

DATA LIST LIST (",") /var1 var2 var3 var4.
BEGIN DATA
1, , 3, 4
5, 6, 7, 8
9, , , 12
END DATA.
COMPUTE resto = MOD(var4, 3).
COMPUTE media = MEAN.3(var1, var2, var3, var4).
COMPUTE media_ent = TRUNC(MEAN(var1 TO var4)).
EXECUTE.
SAVE OUTFILE = 'C:\temp\tabla_num.sav'.

R:


tabla1$media <- (tabla1$var1 + tabla1$var2 + tabla1$var3 + tabla1$var4)/4
tabla1$resto <- tabla1$var4 %% 3
tabla1$media_ent <- trunc(tabla1$media)


Ejemplo 12. Funciones tratamiento texto:

SAS:

data tabla_car;
length cadena $50.
set tabla_num;
cadena = cat(var1,"-",var2,"-",var3);
run;

SPSS:

GET FILE='C:\temp\tabla_num.sav'.
STRING cadena (A50).
COMPUTE cadena =
CONCAT((STRING(var1)), "-",(STRING(var2)), "-",(STRING(var3))).
EXECUTE.
SAVE OUTFILE = 'C:\temp\tabla_car.sav'.

R:

tabla1$cadena = paste(tabla1$var1, tabla1$var2, tabla1$var3, sep='-')

Formación SAS

jueves, 26 de junio de 2014

SAS, SPSS and R: Ejemplos de componentes para tratamiento de datos en SAS, SPSS y R. Equivalencias entre herramientas (I)

Existen en el mercado numerosas herramientas para tratamiento de datos. En este post, nos vamos a centrar en algunas de las más utilizadas: SAS, SPSS y R. Sin entrar a valorar la mejor o peor adecuación de cada una de ellas al tipo de proyecto en el que trabajemos, sus ventajas o sus inconvenientes,  lo que es evidente es que son tres herramientas muy extendidas.  

En este post, empezamos una serie, en la que mostraremos ejemplos de manipulación de datos en las tres herramientas, con objeto de tener el mismo código traducido a las tres herramientas. Estos ejemplos pretenden ser de ayuda para que usuarios de una de las tres herramientas puedan empezar a conocer las otras dos o también como ayuda en un proyecto de migración de procesos de una herramienta a otra.



Ejemplo 1. Obtener datos de una BBDD vía ODBC:

SAS:

proc sql;
connect to odbc(dsn=dm_demo uid=user pwd=****);
create table tabla1 as
select *
from connection to odbc(
select *
from tabla_bbdd
);
quit;

SPSS:

*tabla1.sps.
GET DATA /TYPE=ODBC /CONNECT=
'DSN=MS Access Database;DBQ=/examples/data/dm_demo.mdb;'+
'DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;'
/SQL = 'SELECT * FROM tabla_bbdd'.
EXECUTE.

R:

library(RODBC)
conndb <- odbcConnect("dsn1", uid = "user", pwd = "****")
tabla1 <- sqlQuery(conndb,"SELECT * FROM tabla_bbdd").


Ejemplo 2. Lectura fichero Excel (.xls):

SAS:

proc import datafile='C:\temp\datos_excel.xls'
dbms=excel2000 replace out=tabla_excel;
sheet="Hoja1";
range="A2:I15";
getnames=yes;
run;

SPSS:

*tabla_excel.sps.
GET DATA
/TYPE=XLS
/FILE='C:\temp\datos_excel.xls'
/SHEET=NAME 'Hoja1'
/CELLRANGE=RANGE 'A2:I15'
/READNAMES=on .

R:

tabla_excel <- read.table("C:/temp/datos_excel.csv", header=TRUE, sep=";", na.strings="NA", dec=".", strip.white=TRUE)



Ejemplo 3. Lectura fichero plano (txt):

SAS:

data tabla_entrada;                                                                                                                            
 infile 'C:\temp\entrada.txt' dlm = ';' ;                                                                                            input  cod_cliente:8. des_cliente:$20.;                                                                                                     
run; 

SPSS:

*table_entrada.sps.
GET DATA /TYPE = TXT
/FILE = 'C:\temp\entrada.txt'
/DELIMITERS = ";"
/QUALIFIER = '"'
/ARRANGEMENT = DELIMITED
/FIRSTCASE = 2
/VARIABLES = cod_cliente F1 des_cliente A20


R:

tabla_entrada <- read.table("C:/temp/entrada.txt", header=FALSE, sep=";", na.strings="NA",
  dec=".", strip.white=TRUE)
nombres<-c("cod_cliente","des_cliente")  /* nombres de los campos */
names(tabla_entrada)<-nombres


Ejemplo 4. Crear tabla:

SAS:

data tabla1;
input cod_cliente des_cliente $  arpu  ;
datalines;
1 JVG 25
2 PAF 40
3 AAG 35
;
run;



SPSS:

DATA LIST LIST / cod_cliente des_cliente (A10) arpu.
BEGIN DATA.
1 JVG 25
2 PAF 40
3 AAG 35
END DATA.

SAVE OUTFILE = "tabla1.sav".
LIST.


R:

cod_cliente <- c(1,2,3)
des_cliente <- c("JVG","PAF","AAG")
arpu <- c(25,40,35)
tabla1 <- data.frame(cod_cliente, des_cliente, arpu)


Ejemplo 5. Cruce de tablas (merge):

SAS:

proc sort data=tabla1;
by cod_cliente;
run;

proc sort data=tabla2;
by cod_cliente;
run;

data tabla_merge;
merge tabla1 tabla2;
by cod_cliente;
run;


SPSS:

GET FILE='C:\temp\tabla1.sav'.
SORT CASES BY cod_cliente.
DATASET NAME tabla1
GET FILE='C:\temp\tabla2.sav'.
SORT CASES BY cod_cliente.
DATASET NAME tabla2.
MATCH FILES /FILE=*
/FILE='tabla1'
/FILE='tabla2'
/BY cod_cliente.
EXECUTE.


R:

tabla_merge <- merge(tabla1, tabla2, all=FALSE, by="cod_cliente")



Ejemplo 6. Unir dos tablas:

SAS:

data tabla_union;
set tabla1 tabla2;
run;


SPSS:

*tabla_union.sps.
ADD FILES
/FILE = 'C:\temp\tabla1.sav'
/FILE = 'C:\temp\tabla2.sav'
EXECUTE.


R:


tabla_union  <- rbind(tabla1,tabla2)

Más info...


viernes, 6 de junio de 2014

Versión gratuita de SAS

Ha puesto SAS una versión gratuita a disposición de la comunidad de usuarios.

http://www.sas.com/en_us/software/university-edition.html


Es necesario tener una máquina virtual instalada ( Oracle VirtualBox o VMware ) y los siguientes recursos:


  • Arquitectura 64 bits y 1Gb RAM
  • Microsoft Windows 7 o posterior
  • Navegador: Internet Explorer 9,10 u 11,  Mozilla Firefox 21 o posterior o Google Chrome 27 o posterior


Segmentación de clientes: proceso de clusterización (proc fastclus)

En este post vamos a realizar un ejemplo de segmentación de datos de clientes, empleando un proceso de clusterización, concretamente el procedimiento proc fastclus de SAS.



Este procedimiento realiza agrupamiento de datos basándonse en el algoritmo k-medias. Este algoritmo, es un método de agrupamiento, que tiene como objetivo la partición de un conjunto de n observaciones en k grupos en el que cada observación pertenece al grupo más cercano a la media.

En nuestro caso, tenemos una tabla de clientes con el consumo medio realizado por los clientes en los últimos tres meses. El consumo medio está entre 0 y 50 euros, y vamos a generar 5 grupos  de clientes, entorno a 5 valores medios de consumo medio.





El algoritmo k-means es iterativo de forma que tenemos que indicar en el procedimiento el número máximo de iteraciones.

Utilizamos el procedimiento proc fastclus, indicamos el número de grupos a realizar en el parámetro maxc y el número máximo de iteraciones en maxiter. La tabla de entrada es clientes y la tabla de salida cluster_clientes, la variable que contiene el consumo medio en los últimos tres meses es arpu_m.

proc fastclus data=clientes maxc=5 maxiter=100 out=cluster_clientes replace=random;
var arpu_m;
run;  

En la tabla de salida se crea un campo adicional (cluster) que indica el grupo en el que queda clasificado el cliente y la distancia al valor medio de ese grupo (distance).



Como validación, hacemos un agregado que nos permite ver el valor medio y la desviación media en ese grupo.

proc sql;
create table res as
(select cluster, count(*) as num_clientes, avg(arpu_m) as arpu_medio, avg(distance) as desv_media
from cluster_clientes
group by cluster);
quit;

Vemos en la tabla resumen, los grupos generados, el número de clientes que cae en cada grupo, el valor medio y la desviación media.




Mostrarmos una gráfica la distribución de los grupos:

proc gplot data=cluster_clientes;
       plot arpu_m*id_cliente = cluster;
run;



Hay otros procedimientos de clusterización en SAS también basados en el algoritmo k-medias como: proc cluster.

Lógicamente se trata de un ejemplo sencillo, el proceso de clusterización se puede complicar mucho más, de entrada podemos hacer más grupos modificando el parámetro maxc ,podemos incluir más variables parámetro var en la agrupación y existen muchos otros parámetros (ejemplo inclusión de semillas) para modificar el proceso de clusterización.


Formación SAS

lunes, 2 de junio de 2014

Ejemplo análisis discriminante en SAS (proc discrim)

En el presente post mostramos un sencillo ejemplo de análisis discriminante en SAS que puede servir para analizar relaciones entre variables en un conjunto de datos



El análisis discriminante es una técnica estadística multivariante cuya finalidad es describir (si existen) las diferencias entre grupos de objetos sobre los que se observan determinadas variables (variables discriminantes).

Los dos principales usos del análisis discriminante son la clasificación de objetos en grupos preestablecidos y la identificación de variables descriptivas que mejor definan la pertenencia a grupos.
En nuestro ejemplo tenemos una tabla con un listado de clientes en el que una variable de tipo flag (0,1) indica si el cliente ha sido baja (1) o permanece en cartera (0) en el último mes. Se incluyen otras variables que caracterizan al cliente, aunque nos vamos a centrar en las siguientes:

Compromiso (0/1): indica si el cliente tiene(1) o no (0) compromiso de permanencia en base a una acción comercial que haya realizado en el pasado (ejemplo: descuento, subvención a productos comprados).
Antiguedad: meses de antigüedad del cliente.
Consumo_medio: consumo medio en los últimos tres meses.
Edad: edad del cliente

El objetivo es ver qué variable es más discriminante para agrupar los clientes en bajas(1) o cartera(0) , con objeto de conocer qué variables tienen más peso en la tasa de bajas.
 Para realizar el análisis dicriminante empleamos el procedimiento ‘proc discrim’.

proc discrim
       data=bajas /* tabla de entrada */
       method=normal
       pool=yes
       slpool=0.001
       posterr
       out=results; /* tabla de salida */
class baja; /* variable que define los grupos 0 o 1 */
var compromiso consumo_medio antiguedad edad; /* variables de estudio para discriminación en grupos */
run;

La salida del procedimiento es la siguiente:

The SAS System
The DISCRIM Procedure
Observations
1000
DF Total
999
Variables
4
DF Within Classes
998
Classes
2
DF Between Classes
1
 
Class Level Information
baja
Variable Name
Frequency
Weight
Proportion
Prior Probability
0
0
751
751.0000
0.751000
0.500000
1
1
249
249.0000
0.249000
0.500000
 
Pooled Covariance Matrix Information
Covariance Matrix Rank
Natural Log of the Determinant of the Covariance Matrix
4
15.67471
 


The SAS System
The DISCRIM Procedure

Generalized Squared Distance to baja
From baja
0
1
0
0
1.03050
1
1.03050
0
 
Linear Discriminant Function for baja
Variable
0
1
Constant
-6.77361
-7.71848
compromiso
1.91613
4.11155
consumo_medio
0.06185
0.05995
antiguedad
0.18956
0.18389
edad
0.14238
0.13745


Centrándonos en la última tabla del output (del cual ponemos aquí sólo un extracto) podemos observar como la variable compromiso es la que más variación tiene entre los valores 0 o 1 en la variable baja, mientras que el resto de variables no presentan el mismo nivel de variación. Como era de esperar la variable compromiso es la más discriminante de cara a evaluar tasas de baja.

Lógicamente, se puede profundizar en este análisis discriminante, el objetivo de este post es la realización de una comprobación previa que nos pueda servir para evaluar de forma rápida qué variable tiene más peso en la tasa de bajas.