BookmarkSubscribeRSS Feed
Tip Semanal 027: Tablas de frecuencias
Berenice25
SAS Employee

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!

1 Comment
Fibaa
Calcite | Level 5

En que Tip están las 2 respuestas?

hackathon24-white-horiz.png

2025 SAS Hackathon: There is still time!

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!

Register Now

Article Labels
Article Tags
Contributors