Un informe que incluya cantidad y porcentaje de los distintos valores de una columna es algo común en nuestros días.
Pero existen distintas formas de presentarlo, lo que puede ayudarnos a ahorrar tiempo y esfuerzo.
Es por eso que les vamos a presentar diferentes alternativas para crearlos.
Valores missing, porcentajes, acumulados... todo incluido en este Tip
/********************************************************************/
/* Tablas de frecuencias con diferente información */
/* Antes de comenzar no ponemos de acuerdo con las definiciones: */
/* --> columnas = variables = campos <-- */
/* --> frecuencias = cantidades <-- */
/********************************************************************/
/********************************************************************/
/* */
/* Para no perdernos entre los ejemplo, vamos a usar un... */
/* Índice de contenidos: */
/* Parte 1: opciones del uso de 'ORDER' */
/* 1.1 ORDER=INTERNAL */
/* Ejemplos con valores acumulados y porcentajes */
/* 1.2 ORDER=FORMATTED */
/* 1.3 ORDER=DATA */
/* 1.4 ORDER=FREQ
/* Parte 2: opciones para los valores faltantes (missing) */
/* Parte 3: crear solamente una tabla de salida (no hay reporte) */
/* */
/********************************************************************/
/*-------------------*/
/* inicio del código */
/*-------------------*/
/************************************************************/
/* */
/* Parte 1: Vemos las opciones del uso de 'ORDER' */
/* */
/************************************************************/
ODS noproctitle; /* eliminamos el nombre del procedimiento en los títulos */
/*--------------------------------------------------------------*/
/* Ejemplo 1.1 */
/* ORDER=INTERNAL */
/* Es la opción predeterminada de ORDER. */
/* Los resultados aparecen ordenados en forma */
/* ascendente de acuerdo a los valores "originales" */
/* (aclaro esto por si las columnas tienen formatos) de */
/* la/s columna/s. O sea que utiliza los valores sin formato. */
/*--------------------------------------------------------------*/
/*----------------------------------------------*/
/* Tablas predeterminadas (por default) */
/* (ORDER=INTERNAL) */
/*----------------------------------------------*/
/* Ejemplo 1.1.a */
/* Para comprobar que es el valor por default, lo que hacemos es no especificar el valor de ORDER y después */
/* especificar ORDER=INTERNAL. Los 2 resultados tienen que ser idénticos. */
/* Aquí están los 2 códigos: */
/* Sin especificar el valor de 'ORDER' */
Title1 'Tablas de frecuencias de las columas: Type, Origin y Cylinders';
Title2 'Origen de los datos: sashelp.cars';
Footnote '(ORDER Sin Especificar - valor por Default)';
Proc freq data=sashelp.cars; /* sin aclarar el valor de 'order' */
Tables type origin cylinders; /* tablas separadas para cada columna */
Run;
Title;
Footnote;
/* Especificando el valor de 'ORDER=INTERNAL' */
Title1 'Tablas de frecuencias de las columas: Type, Origin y Cylinders';
Title2 'Origen de los datos: sashelp.cars';
Title3 'Resultados completos';
Title4 'Los valores faltantes (missing) -si existen- figuran al final de cada tabla';
Footnote '(ORDER=INTERNAL)';
Proc freq data=sashelp.cars order=INTERNAL;
Tables type origin cylinders;
Run;
Title;
Footnote;
/*------------------------------------------------------------------*/
/* Tablas sin acumulados (ni para cantidades ni para porcentajes) */
/* (ORDER=INTERNAL) */
/*------------------------------------------------------------------*/
/* Ejemplo 1.1.b */
Title1 'Tablas de frecuencias de las columas: Type, Origin y Cylinders';
Title2 'Origen de los datos: sashelp.cars';
Title3 'Frecuencias + porcentajes (sin frecuencias acumuladas y porcentajes acumulados)';
Title4 'Los valores faltantes (missing) -si existen- figuran al final de cada tabla';
Footnote '(ORDER=INTERNAL)';
Proc freq data=sashelp.cars order=INTERNAL;
Tables type origin cylinders / nocum; /* nocum=sin acumulados */
Run;
Title;
Footnote;
/*--------------------------*/
/* Tablas sin porcentajes */
/* (ORDER=INTERNAL) */
/*--------------------------*/
/* Ejemplo 01.c */
Title1 'Tablas de frecuencias de las columas: Type, Origin y Cylinders';
Title2 'Origen de los datos: sashelp.cars';
Title3 'Frecuencias + frecuencias acumuladas (sin porcentajes)';
Title4 'Los valores faltantes (missing) figuran al final de cada tabla';
Footnote '(ORDER=INTERNAL)';
Proc freq data=sashelp.cars order=INTERNAL;
Tables type origin cylinders / nopercent; /* nopercent=sin porcentajes */
Run;
Title;
Footnote;
/*------------------------------------------------------*/
/* Cambiamos el valor de ORDER para utilizar formatos */
/*------------------------------------------------------*/
/*----------------------------------------------------------*/
/* Ejemplo 1.2 */
/* ORDER=FORMATTED */
/* Ordena los valores de una columna según el formato */
/* que se le aplique. */
/*----------------------------------------------------------*/
/* Comenzamos generando un formato */
proc format;
value cil_uno 1-4=’4 cilindros o menos’ /* creamos el formato 'cil_uno' */
5-6 =’5 o 6 cilindros’
7-20 =’más de 6 cilindros’;
value cil_dos 1-4=’4 cilindros o menos’ /* creamos el formato 'cil_dos' */
5-20 =’más de 4 cilindros’;
run;
/* Continuamos y finalizamos comparando resultados sin utilizar y utilizando formatos */
/* en la tabla de frecuencias */
/* Sin utilizar el formato */
Title1 'Tablas de frecuencias de la columa: Cylinders';
Title2 'Origen de los datos: sashelp.cars';
Title4 'Sin utilizar formatos';
Footnote '(Sin utilizar ORDER=FORMATTED - O sea que está usando el valor predeterminado de ORDER)';
Proc freq data=sashelp.cars;
Tables cylinders;
Run;
Title;
Footnote;
/* Utilizando el formato 'cil_uno'*/
Title1 'Tablas de frecuencias de la columa: Cylinders';
Title2 'Origen de los datos: sashelp.cars';
Title4 'Formato: cil_uno';
Footnote '(ORDER=FORMATTED)';
Proc freq data=sashelp.cars order=FORMATTED; /* utiliza los formatos de la/s columna/s, si es que existen... */
Tables cylinders;
format Cylinders cil_uno.;
*format Cylinders cil_dos.;
Run;
Title;
Footnote;
/* Utilizando el formato 'cil_dos'*/
Title1 'Tablas de frecuencias de la columa: Cylinders';
Title2 'Origen de los datos: sashelp.cars';
Title4 'Formato: cil_dos';
Footnote '(ORDER=FORMATTED)';
Proc freq data=sashelp.cars order=FORMATTED; /* utiliza los formatos de la/s columna/s, si es que existen... */
Tables cylinders;
*format Cylinders cil_uno.;
format Cylinders cil_dos.;
Run;
Title;
Footnote;
/*----------------------------------------------------------*/
/* Cambiamos nuevamente el valor de ORDER para obtener el */
/* resultado según como aparecen en la tabla de datos. */
/*----------------------------------------------------------*/
/*----------------------------------------------------------*/
/* Ejemplo 1.3 */
/* ORDER=DATA */
/* Muestra frecuencias según el orden de aparición de los */
/* distintos valores en la tabla de datos */
/*----------------------------------------------------------*/
/* Ver las columnas 'type' y 'origin' de la tabla 'sashelp.cars'. */
/* Verificar que 'order=data' considera la aparición de los distintos */
/* valores de estas 2 columnas */
/* Por ejemplo, mirando la columna 'type', el valor de:
'SUV' aparece en la primera fila
'Sedan' aparece en la segunda fila
'Sports' aparece en la séptima fila
'Wagon' aparece en la fila número 25
y así continúa */
Title1 'Tablas de frecuencias de las columas: Type y Origin';
Title2 'Origen de los datos: sashelp.cars';
Title3 'Frecuencias + frecuencias acumuladas + porcentajes + porcentajes acumulados';
Footnote '(ORDER=DATA)';
Proc freq data=sashelp.cars order=DATA;
Tables type origin;
Run;
Title;
Footnote;
/* Aunque esta forma de ordenar no parece útil, veamos cómo podría servirnos */
/* Por ejemplo, vamos a crear una tabla de frecuencias por orden descendente de número de cilindros */
/* Para esto: */
/* Primero reordenamos la tabla */
proc sort data=sashelp.cars out=autos; /* 'out=' tabla de salida */
by descending cylinders; /* recuerden escribir 'descending' antes de la columna; si es orden
descendente, claro */
run;
/* Y después usamos ORDER=DATA para obtener lo que necesitamos */
Title1 'Tabla de frecuencias de Cylinders';
Title2 'Origen de los datos: sashelp.cars';
Title3 'Orden descendente de Cylinders';
Footnote '(ORDER=DATA)';
proc freq data=autos order=data;
table cylinders;
run;
Title;
Footnote;
/*----------------------------------------------------------*/
/* Vamos ahora a la última opción de ORDER para obtener */
/* valores en orden descendente */
/*----------------------------------------------------------*/
/*----------------------------------------------------------*/
/* Ejemplo 1.4 */
/* ORDER=FREQ */
/* Muestra frecuencias en orden descendente */
/*----------------------------------------------------------*/
/* Esta opción es particularmente útil cuando existen muchos valores distintos en una columna, y */
/* se necesita ver cuáles de ellos tienen cantidades mayores ordenándolos convenientemente */
/* ORDER=FREQ Genera una tabla de frecuencias en orden descendente */
Title1 'Tablas de frecuencias de las columas: Type y Cylinders';
Title2 'Origen de los datos: sashelp.cars';
Footnote '(ORDER=FREQ)';
Proc freq data=sashelp.cars order=freq;
Tables type cylinders;
Run;
Title;
Footnote;
/********************************************************************************/
/* */
/* Parte 2: Vemos las distintas opciones para los valores faltantes (missing) */
/* */
/********************************************************************************/
/* Ejemplo 2.1 */
/* Usando 'nlevels' */
/* Presenta una tabla separada indicando la cantidad de missings (si existen) y la cantidad de valores */
/* distintos de cada columna. */
Title1 'Tablas de frecuencias de las columas: Type, Origin y Cylinders';
Title2 'Origen de los datos: sashelp.cars';
Footnote '(usamos la opción "nlevels")';
Proc freq data=sashelp.cars nlevels order=INTERNAL; /* ¡acá está nlevels! */
Tables type origin cylinders;
Run;
Title;
Footnote;
/* Ejemplo 2.2 */
/* Comparamos 'missing' con 'missprint' */
/* Ejemplo 2.2.a */
/* Incluye los valores faltantes (missings) como un valor más de la columna. Noten que lo incluye en los */
/* cálculos al acumular */
Title1 'Tabla de frecuencias de la columa Cylinders';
Title2 'Origen de los datos: sashelp.cars';
Footnote '(usamos la opción "missing")';
Proc freq data=sashelp.cars order=INTERNAL;
Tables cylinders /Missing; /* 'missing' se usa dentro de la sentencia 'Tables' */
Run;
Title;
Footnote;
/* Ejemplo 2.2.b */
/* Incluye los valores faltantes (missings) como un valor más de la columna. No los incluye en */
/* los cálculos de los porcentajes y al acumular */
Title1 'Tabla de frecuencias de la columa Cylinders';
Title2 'Origen de los datos: sashelp.cars';
Footnote '(usamos la opción "missprint")';
Proc freq data=sashelp.cars order=INTERNAL;
Tables cylinders / missprint; /* 'missprint' se usa dentro de la sentencia 'Tables' */
Run;
Title;
Footnote;
/************************************************************/
/* */
/* Parte 3: Crear solamente una tabla con el resultado */
/* */
/************************************************************/
/* Vamos a comparar: */
/* En primer lugar vamos a obtener una tabla de frecuencias "clásica" */
/* Y después una tabla de frecuencias que no genera un reporte; genera un conjunto de datos */
/* Ejemplo 3.1 */
/* Genera un reporte (como siempre) y una tabla de datos con frecuencias y porcentajes. El ejemplo "clásico" */
Title1 'Tabla de frecuencias de la columa Type';
Title2 'Origen de los datos: sashelp.cars';
Title3 'Reporte + Tabla de datos';
Footnote '(usamos la opción "out=")';
Proc freq data=sashelp.cars order=freq;
Tables type / out=autos_frecuencias; /* 'out=' crea la tabla 'autos_frecuencias' en la librería 'work' */
Run;
Title;
Footnote;
/* Ejemplo 3.2 */
/* Genera una tabla de datos para cada columna. Incluyen frecuencias, porcentajes y acumulados. */
/* ¡No genera un reporte! */
Title1 'Tablas de frecuencias de las columas: Type y Cylinders';
Title2 'Origen de los datos: sashelp.cars';
Title3 'Solamente los conjuntos de datos';
Footnote '(usamos las opciones "noprint", "out=" y "outcum")';
Proc freq data=sashelp.cars NOPRINT order=freq; /* 'NOPRINT' suprime la salida de los reportes */
Tables type / out=autos_frecs_tipo outcum; /* 'outcum' para incluir los acumulados en la
tabla de salida */
Tables cylinders / out=autos_frecs_cilindros outcum;
Run;
Title;
Footnote;
ODS proctitle; /* volvemos a activar el nombre del procedimiento en los títulos; lo habíamos desactivado al inicio */
/*-------------------*/
/* fin del código */
/*-------------------*/
Si han llegado tan pero tan lejos, les podemos proponer un par de preguntas...
La primera pregunta: ¿por qué será que el Proc Freq usa la sentencia 'Tables' y no 'Vars'? */
La segunda pregunta: ¿el Proc Freq puede crear una tabla en orden ascendente? ¿'Order= ascending Freq' tal vez?
Si las respuestas no te parecen simples, no te preocupes... ¡las responderemos en uno de los próximos Tips!
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!