Rstudio Manual
Rstudio Manual
Rstudio Manual
Rstudio Introducción 3
El software R funciona como un entorno temporal de trabajo, esto quiere decir que el
usuario va agregando datos y objetos (conjuntos de datos con diferentes atributos) a una
“hoja en blanco”. Hay que tener en cuenta que R trabaja con la memoria activa (RAM) del
computador, por lo tanto, cualquier análisis sólo mostrará la información resultante pero
no permanecerá como archivo posible de utilizar de modo posterior. Es decir, si los
análisis no son guardados como objetos (vectores, matrices, listas u otros tipos de
objetos) se deberán repetir las instrucciones para obtener otra vez el resultado.
Dado que R opera como un espacio temporal y autónomo de trabajo, también es preciso
indicarle en qué parte del disco duro del computador están los archivos a utilizar Para
evitar el engorroso procedimiento de indicar todo el tiempo las rutas de acceso a los
archivos (elementos del tipo: C:\escritorio\Curso R\base_datos.xlsx) es posible establecer
una carpeta de trabajo: esto es, una carpeta predeterminada donde el programa buscará
los archivos a ejecutar y guardará los archivos a conservar con cambios.
Existen dos alternativas para definir la carpeta de trabajo. La primera es emplear el
siguiente comando:
setwd ("ruta de acceso a la carpeta especificada")
Otra forma de hacerlo es mediante la botonera superior; presionando el botón Session,
luego Set Working Directory, Choose Directory y en la pestaña examinar se
selecciona la carpeta a utilizar.
Todas las operaciones de R - sean indicadas vía sintaxis o botones - son ejecutadas
según comando computacional que es visualizado en la consola. La ejecución de
comandos entrega diferentes señales respecto a su funcionamiento. Por ejemplo,
mientras se está ejecutando un comando, ¡el programa muestra un signo “Stop!” en la
esquina superior derecha de la consola (como se ve en la imagen). Eso indica que el
programa está ocupado ejecutando una acción. Si se presiona tal símbolo, se cancelará
la operación en curso.
Ejercicio 4.1
comando (datos a utilizar)
Ejercicio 4.2
table (base de datos, variable)
Ahora bien, escribir tales instrucciones en el editor de sintaxis permite contar con una
sintaxis editable que no se ejecutará de manera automática como operaciones
computacionales (cuestión que sí sucede al escribir sintaxis directamente sobre la
consola). Para ejecutar una sintaxis se debe seleccionar con el cursor - como cuando se
busca copiar un texto - el trozo de código (code chunk en inglés) que interesa utilizar para
luego:
1. Usando la botonera superior, apretar con el cursor del mouse el botón “Run”.
2. Apretar la combinación de teclas ctrl + enter.
Otra opción es ejecutar una sola línea de código. Para esto se posiciona el cursor sobre la
línea que interesa ejecutar (en cualquier parte de ella) y se aplica algunas de las dos
operaciones ya indicadas.
Dado que el programa funciona en la memoria temporal del computador - memoria RAM -
una vez que se ejecuta un proceso y se cierra el programa la operación y su resultado
desaparecerán si no han sido almacenadas de alguna forma en el disco duro.
Para entender esto de manera práctica se pondrá un ejemplo con el comando más básico
que se puede utilizar. Este comando consiste en crear un objeto y asignarle un dato
numérico. El objetivo del ejercicio 4.1 es darle el valor 10 a X, luego pedirle a R que
entregue el valor de X, para después cambiar el valor de X a 5. Para cualquiera de tales
operaciones, se escribe una letra (en este caso es una X, pero podría ser cualquier otra
letra) y con el asignador <- se le asigna el valor numérico deseado.
Ejercicio 4.3
#Asignación del valor "10" al objeto "X"
X <- 10
X
## [1] 10
#Cambiar el valor de X: cambiar el "10" por un "5"
X <- 5
X
## [1] 5
Ejercicio 4.4
#Asignación del valor "5" al objeto "Y"
5 -> Y
Y
## [1] 5
Si los objetos creados contienen un conjunto de datos del mismo tipo, para el lenguaje del
software (lenguaje de la informática) esto es un vector.10 Aplicado al ámbito de las
ciencias sociales se trata de una variable. Así, en R las variables (o vectores) pueden ser
de 4 tipos; el tipo de variable depende del tipo de valores que se le asigna a cada objeto:
1. numeric: valores numéricos, incluye decimales.
2. integer: números enteros, no incluye decimales.
3. character valores alfanuméricos, es decir, letras, números y signos mezclados.
4. logical: valores lógicos, TRUE o FALSE.
De esta forma si una variable es numérica, tendrá asignado números; en caso de ser una
variable de tipo cadena (character) los valores se deben ingresar entre comillas
(“ejemplo”), y en caso de ser lógica sus valores serán alguna de las opciones TRUE o
FALSE.
Hasta ahora sólo se ha explicado cómo asignar un valor singular a un objeto de R. Para
ingresar más de un valor en un vector se deben indicar los elementos a almacenar entre
paréntesis y separados por comas, antecedidos de la función concatenar, que se ejecuta
anteponiendo una c al conjunto de objetos a agrupar. Utilizando la función
concatenar c() se puede crear un objeto que agrupe un conjunto de datos (un vector). En
este caso se construirá una variable Edad con el siguiente conjunto de datos (deben
separarse por comas): 15, 12, 27, 55, 63, 63, 24,21, 70. En este caso será una variable
numérica:
Ejercicio 4.5
#Concatenar valores para crear un vector de más de un sólo valor
edad <- c(15, 12, 27, 55, 63, 63, 24,21, 70)
Ejercicio 4.6
#Vector numérico (función concatenar)
a <- c(4, 3, 5)
Ejercicio 4.7
#Creación de las variables: todas tienen la misma cantidad de casos
A partir de las variables ya creadas se puede construir una base de datos. Para esto se
utiliza el comando data.frame asignando su resultado al objeto aborto que contendrá la
base de datos construida.
Si la ejecución del comando es exitosa se verá un nuevo objeto de tipo data en el entorno
de trabajo, donde además se indicará la dimensión de la base de datos (cantidad de
casos y variables).
Ejercicio 4.8
View(aborto) #Comando para visualizar base vía sintaxis (o hacer click en entorno)
Luego de construida esta base de datos interesa guardarla como un archivo reutilizable
para posteriores análisis. Para ello es útil el comando save: indicando el nombre del
objeto a guardar como archivo y definiendo también el nombre del archivo. Como se ve
en la siguiente línea de comando, el nombre del archivo resultante se indica con el
argumento file = "nombre_archivo.extensión" (el nombre del archivo va entre comillas).
Ejercicio 4.9
save(aborto, file = "aborto.RData") #Se indica primero el objeto a guardar
#y luego el nombre del archivo, entre comillas.
Ejecutando tal comando, se creará un nuevo archivo en la carpeta que hayamos indicado
como carpeta de trabajo. Como se ve en la imagen a continuación, este archivo debería
ser reconocido como un archivo de formato RStudio; se observa que es un archivo recién
creado gracias a la información proporcionada por la columna Fecha de modificación.
Este archivo es la base de datos recién construida pero almacenada como archivo de
formato R en el disco duro, específicamente en la carpeta de trabajo fijada en la sesión de
R. Este archivo puede usarse para posteriores análisis, puede ser enviado a otras
personas, etc.
Finalmente, se muestran dos maneras para “limpiar” el entorno de trabajo. Esto resulta
útil pues luego de hacer múltiples cálculos exploratorios, mientras se depura un esquema
de análisis, el entorno de trabajo se irá llenando paulatinamente con objetos que no sirven
para continuar trabajando y sólo pueden confundir en los pasos posteriores del análisis.
Nuevamente, para limpiar el entorno de trabajo existen dos maneras:
1. La primera es vía sintaxis, con dos comandos específicos que se detallan a
continuación:
a. El primero permite eliminar elementos específicos y,
b. El segundo permite vaciar totalmente el entorno de trabajo.
2. La segunda forma es utilizando un botón existente en la botonera superior del
entorno de trabajo (con forma de escoba) que permite borrar todos los elementos
del entorno de trabajo, que se detalla en la siguiente imagen.
Ejercicio 4.10
#Comando para eliminar elementos especificos, aquí se elimina
#la base creada.
remove(aborto)
Descargar paquetes
Ejercicio 5.1
install.packages("readxl") #Se descarga e instala el paquete readxl.
Cargar paquetes
R está en permanente actualización por lo que luego de algunos meses la versión que
haya sido instalada quedará desactualizada. Cada versión busca introducir mejoras,
robustecer funciones ya existentes, etc.
Si se precisa actualizar la versión instalada del software una primera opción es repetir las
operaciones indicadas en el capítulo 3. No obstante, es posible efectuar una actualización
del software mediante la función updateR(). Esta función es parte del paquete installr y
funciona solamente para el sistema operativo Windows. Como se observa en las
siguientes líneas de comando, se trata de un procedimiento simple.
Ejercicio 5.3
install.packages("installr")
library(installr)
updateR()
Los diversos paquetes existentes para R son desarrollados a lo largo del mundo por una
extensa red de colaboradores. Cuando estos paquetes superan su período de prueba son
enviados al R Core Team (equipo a cargo de mantener y mejorar el software en sus
diferentes versiones) donde son testeados y luego subidos de manera oficial al CRAN.
Así como el software R, estos paquetes están sujetos a permanentes actualizaciones y
mejoras. Por ello, también es preciso conocer alguna forma de actualizar de manera
rápida y simultánea todos los paquetes que estén instalados en el disco duro. Para ello,
se sugiere utilizar el siguiente comando.
Ejercicio 5.4
update.packages()
Gestión de bases de datos
Un aspecto importante en el uso de RStudio enfocado en el análisis de datos sociales es
el manejo de base de datos. Esto puede referir tanto a bases que quien efectúa el análisis
haya construido como a bases de datos de estudio sociales realizados por otros.
En este manual de apoyo docente se utilizará una base de datos secundaria. Tanto para
enseñar los procedimientos de importación, validación y modificación de datos, como para
los posteriores aspectos de análisis estadístico descriptivo.
Dentro de esa página se debe buscar el apartado Encuestas anteriores para encontrar
en el repositorio la Encuesta CEP Septiembre-Octubre 2017.
Allí, oprimiendo el botón Base de datos se podrán descargar los archivos de interés.15
¿Por qué puede ser importante manejar herramientas que permitan que desde RStudio
interactuemos con diferentes formatos de bases de datos? Imagine lo siguiente: durante
la formación universitaria usted ha aprendido a usar RStudio como herramienta de
análisis estadístico. Pero sucede que al incorporarse a un centro de estudios sociales y
observa que el resto de los analistas trabaja fundamentalmente con otro software de
análisis estadístico: SPSS. Si usted quiere lograr dialogar con tales especialistas - que
muy probablemente no estarán dispuestos a aprender a usar RStudio - deberá lograr al
menos abrir bases de datos en formato SPSS, para así poder hacer los análisis que se le
encomiende.
Para ello se utiliza un paquete específico llamado haven que cuenta con funciones para
abrir bases de datos desde diferentes formatos. Para eso primero se descarga e instala el
paquete en el computador:
Ejercicio 6.1
install.packages("haven")
Con la base de datos cargada en el entorno de trabajo podemos explorar sus principales
características. Como se observa en la imagen 6.5 existe un botón (flecha azul indicando
hacia abajo) que permite desplegar la estructura interna de la base de datos existente en
el entorno de trabajo.
Como ya fue indicado en el apartado 4.5 Construcción de una base de datos aquí también
es posible usar el botón con forma de planilla ubicado a la derecha del objeto en el
entorno de trabajo para visualizar la base de datos como una planilla y así poder
inspeccionarla visualmente. Esto permitirá explorar rápidamente su estructura y
contenidos: observar los nombres de las variables, el tipo de valores que almacenan, etc.
La primera opción es trabajar directamente con un archivo con formato para Microsoft
Excel 2007 o superior. Se trata de archivos con una extensión .xlsx que tienen un
formato de libro, es decir, pueden soportar en su interior a más de una hoja de trabajo.
Para efectos caso de este manual se ha convertido la base de datos de la Encuesta
CEP trabajada en el apartado anterior a tal formato. Este procedimiento es sencillo si se
tiene instalado SPSS.21 Para efectos de este tutorial el archivo se puede descargar
desde el siguiente enlace (indicado en la presentación de este documento), y que lleva
por nombre CEP_sep-oct_2017.xlsx.
Al abrir el archivo desde el explorador de archivos se observa que tiene dos hojas. Una
primera almacena el registro de las respuestas con un número de identificación por caso
y la fecha de respuesta de la encuesta. La segunda hoja es la base de datos
propiamente tal y es la que interesa cargar en el entorno de trabajo de R.
Entonces, ¿cómo cargar una base de datos desde este formato al entorno de
trabajo en R? En esta instancia se usará el paquete readxl que previamente se
debe descargar e instalar en el computador. Específicamente se usará la función
read_excel de este paquete en su versión más simple - sin argumentos
adicionales - indicando solamente el nombre del archivo a leer. Su resultado se
guardará en un nuevo objeto llamado CEP_excel.
Ejercicio 6.3
install.packages("readxl") #Descarga e instalación del paquete
library(readxl) #Cargar paquete en sesión de trabajo de R
Para solucionar este problema se repetirá la operación pero utilizando un argumento extra
en la función. Mediante el argumento sheet = se le indica al programa la posición o
nombre de la hoja que interesa leer en el interior del libro de trabajo. En este caso se
indicará que interesa leer la hoja ubicada la posición “2” del libro, o la hoja de nombre
“DATOS” (que es lo mismo para efectos de este manual). A continuación se sobrescribe
el objeto creado en el entorno de trabajo, actualizando la función con esta información.
Ahora bien, la función read_excel considera a la primera línea de datos como los nombres
de las variables de forma automática. Hay veces en que en la primera fila no se encuentra
el nombre de las variables habiendo primero otro tipo de información. Por eso resulta
importante indicarle a la función desde qué fila comenzar a leer los datos. En el caso de
que la información relevante comience en la fila 2, siendo tal fila la que contiene el
nombre de las variables se agrega a estos argumentos la opción skip = 1 para que el
software salte u omita la primera fila y comience la lectura de los datos en la fila 2.
Para esto, como se observa en las imágenes 6.11 y 6.12, basta con que desde el archivo
excel en cuestión, se utilice a la opción Guardar como y seleccionando el formato
señalado. El programa debería advertir al usuario que el formato seleccionado no soporta
múltiples hojas de trabajo (imagen 6.12), por lo que guardará sólo la hoja activa.
Asegurando que la planilla que interesa guardar es la hoja que está seleccionada se hace
clic sobre la opción Aceptar.
El archivo resultante puede ser leído como planilla de Microsoft Excel. Sin embargo, para
entender su estructura interna primero se abrirá con la aplicación Bloc de Notas mediante
la opción Abrir con.
Se observa en la imagen 6.14 que el archivo presenta una tabulación del tipo matriz de
datos - en este caso, la base de datos que contiene las respuestas a una encuesta social
- cuyos valores ( cada variable) están separados por el signo punto y coma (;). Este signo
delimita cada columna de casos.
Este “detalle” importa pues las funciones básicas para leer archivos CSV viene
configuradas por defecto para entender a las comas como separador de los casos. Esto
se muestra en el siguiente ejemplo.
Ejercicio 6.4
CEP_csv <- read.csv("CEP_sep-oct_2017.csv")
El resultado muestra que se han leído tres bases de datos coincidentes en términos de
estructura, por lo que se ha logrado llegar al mismo resultado usando funciones
diferentes.
Para el desarrollo de todos los ejemplos posteriores de este manual se considerará una
de las bases de datos leídas. Para ello se “limpiará” por primera vez el entorno de trabajo
dejando solamente la base de datos nombrada como CEP_csv.
Ejercicio 6.5
remove(CEP_csv2, CEP_excel)
Construir una base de datos sólo con variables de interés: exploración de bases
de datos y recodificación de variables
Lograr cargar una base de datos a la sesión de R es un paso inicial que permite disponer
de un conjunto de datos “en bruto” que, muy probablemente se deberán configurar para
lograr efectuar los análisis de interés. Se sugiere trabajar solamente con aquellas
variables a analizar y crear una nueva base de datos sólo con la información de interés,
sin editar la fuente original de datos. Para los siguientes ejercicios se seleccionarán siete
variables desde la base de datos de la Encuesta CEP ya mencionada. En la siguiente
tabla se indica una descripción de la variable, su nombre en la base original y el nuevo
nombre a asignar en la nueva base de datos.
Descripción
Nombre en base Nivel de
de la Nuevo nombre Valores
original medición
variable
Números
Ponderador POND pond simples para No aplica.
ponderación.
Género 1 = hombre,
SEXO sexo Nominal.
informado 2 = mujer.
Descripción
Nombre en base Nivel de
de la Nuevo nombre Valores
original medición
variable
residencia al 15.
Edad
Fecha de
cumplida en
nacimiento DS_P2_EXACTA edad Razón.
número
(edad)
entero.
Satisfacción
Escala del 1
con la SV_1 satisfaccion Intervalar.
al 10.
propia vida
Percepción
de
Escala de 1
satisfacción SV_2 satisfaccion_chilenos Intervalar.
al 10
de chilenos
con su vida
Evaluación
de la
situación MB_P2 eval_econ Escala del 1
económica
nacional
Para construir una nueva base de datos solo con las variables especificadas será preciso
efectuar varias operaciones, que se detallan en este apartado. Para este tipo de
manipulación de bases de datos y variables existen diferentes herramientas: algunas
forman parte de las funcionalidades básicas de R, pero otras provienen del paquete dplyr.
En la siguiente tabla se resumen las principales características de las funciones a utilizar.
Funciones de utilidad para la manipulación de bases de datos
Ejercicio 6.6
library(dplyr) #Cargar paquete, si no está cargado desde antes.
CEP <- select(CEP_csv, pond = POND, sexo = SEXO, region = REGION, edad =
DS_P2_EXACTA,
satisfaccion_vida = SV_1, satisfaccion_chilenos = SV_2, eval_econ = MB_P2)
#Se indica base de datos, el nombre de variable a crear y los datos que la compondrán.
View(CEP) #Visualización de la base
Luego de ejecutar ese comando se habrá creado un nuevo objeto llamado CEP (del tipo
base de datos) en el entorno de trabajo. Esta base de datos tiene la misma cantidad de
casos (1.424) que la base de datos original (CEP_csv) pero presenta solamente las siete
variables seleccionadas y renombradas mediante el comando select. Para corroborar el
resultado de la construcción de esta nueva base de datos se la visualizará en formato
planilla. Como se observa a continuación, esta base de datos contiene solamente las
siete variables de interés.
Una vez hecha esta operación de selección de variables se habrá creado una nueva base
de datos que contiene solo aquellas variables que resultan de interés para los análisis.
Antes de proseguir conviene guardar tal objeto como una base de datos de formato R.
Para esto se usa el comando save para guardar un objeto de formato (o extensión)
.RData.
Ejercicio 6.7
save(CEP, file = "seleccion_CEP.RData")
Este comando creará un nuevo archivo de formato RData en la carpeta de trabajo. Este
archivo puede usarse para enviar esta base de datos específica a un equipo de trabajo en
el contexto de una investigación colectiva, o sencillamente contar con un archivo que ya
contenga la base de datos solamente con las variables de interés.
Ejercicio 6.8
rm(list = ls())
Para continuar con este manual se sugiere cargar a la sesión de R (desde la carpeta de
trabajo) la base construida solo con las variables de interés y guardada en formato RData
(seleccion_CEP.RData).
Ejercicio 6.9
load("seleccion_CEP.RData")
Una primera opción para conocer las características de la base de datos es explorar los
nombres de sus variables. Mediante el comando names aplicado sobre el objeto CEP se
obtiene una lista con los nombres de cada columna de la base de datos. Esto resulta de
utilidad para los procedimientos de manejo de datos pues no siempre se puede
determinar con certeza el nombre de un objeto leyendo el encabezado de la columna. Al
visualizarlos como se observa en el siguiente resultado se puede estar seguro del nombre
exacto determinando si hay espacios en blanco antes o después de las letras que
impliquen un nombre diferente al leído de manera directa.
Ejercicio 6.10
names(CEP)
## [1] "pond" "sexo" "region"
## [4] "edad" "satisfaccion_vida" "satisfaccion_chilenos"
## [7] "eval_econ"
Ejercicio 6.11
dim(CEP)
## [1] 1424 7
Finalmente, para conocer las características generales de las variables en la base de
datos, y comenzar a evaluar que tipo de recodificaciones se deben realizar, se utiliza la
función summary para obtener estadísticos descriptivos de cada una de las variables.
Ejercicio 6.12
summary(CEP)
¿Por qué resultan de interés estos resultados? Considerando los estadísticos descriptivos
construidos se observa que algunas variables contienen códigos que refieren a casos
perdidos. Es el caso de las variables satisfaccion_vida, satisfaccion_chilenos y eval_econ.
Como se observa en la imagen 6.20, estas variables presentan valores 9 o 99 como
máximos, siendo que se trata de variables que presentan un rango menor de valores
posibles: la variable satisfaccion_vida presenta valores 99 como máximos cuando es una
escala de 1 a 10; lo mismo ocurre con la variable satisfaccion_chilenos; finalmente, algo
similar ocurre con la variable eval_econ, que presenta valores 9 como máximos, cuando
es una escala del 1 al 5.
Tal información constituye una primera alerta sobre los ajustes a hacer sobre los datos y
por tanto son un valioso insumo para el proceso de recodificación de variables.
Para avanzar en los análisis se efectuarán algunas recodificaciones. Primero que todo se
observan las características de cada variable a recodificar. Para eso se utiliza las
funciones table para crear una tabla de frecuencias absoluta y observar los valores de la
variable, y class para conocer de qué tipo de objeto se trata (en este caso, la variable
sexo).
Ejercicio 6.13
table(CEP$sexo)
##
## 1 2
## 553 871
class(CEP$sexo)
## [1] "integer"
El primer resultado muestra una variable que presenta sólo valores 1 y 2, a la vez que el
segundo resultado informa que se trata de un vector de tipo integer.
Ejercicio 6.14
CEP <- mutate(CEP, sexo_chr = recode(CEP$sexo, "1" = "hombre", "2" = "mujer"))
table(CEP$sexo_chr)
##
## hombre mujer
## 553 871
class(CEP$sexo_chr)
## [1] "character"
Al ejecutar tal recodificación y solicitar una tabla de frecuencias simple así como la
información sobre el tipo de variable creada, ahora la tabla contiene las categorías
“hombre” y “mujer”, haciendo más fácil su lectura, mientras que la variable recodificada es
del tipo “character”, al contener ahora una codificación basada en letras. Si bien es un
ejemplo muy simple, permite entender una primera utilidad de la recodificación de
variables, que tiene que ver con facilitar nuestro acercamiento a los datos.
Como se observa en el ejercicio 6.14, el comando factor permite incorporar las etiquetas a
cada código de respuesta. En este caso, al ingresar los valores Hombre y Mujer, en el
argumento labels, lo que estamos haciendo es asociar las etiquetas indicadas a los
valores 1 y 2 en que está codificada la variable.
Ahora se recodificará la variable región indicando que sólo habrá dos categorías: “otras
regiones” y “región Metropolitana”. Como en el caso anterior, primero conviene observar
las características generales de la variable: interesa saber cuántos casos están en la
categoría Región Metropolitana para así asegurar que luego de la transformación de la
variable, la estructura de casos siga el mismo patrón. Primero exploraremos las
características generales de la variable de interés.
Ejercicio 6.15
table(CEP$region) #Observar características de la variables
##
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
## 24 57 24 52 150 82 94 192 98 69 5 17 501 39 20
class(CEP$region)
## [1] "integer"
En base a estos primeros resultados se observa que se trata de una variable cuyo nivel
de medición es nominal. La categoría “13”, que equivale a la región Metropolitana,
presenta 501 casos. También sabemos que la variable está configurada como un vector
de tipo integer. Así, usando el comando mutate se recodificará la variable en una nueva
denominada region_factor; sin embargo, al interior del comando que se utilizaría por
defecto, introduciremos una variante.
Si introducimos una función como argumento dentro una función determinada, R siempre
aplica las funciones que corresponden al paquete de la función principal inicialmente
indicada (en este caso, es el paquete dplyr). Para el caso del comando recode, el provisto
por este paquete no resulta de utilidad para recodificar variables con gran cantidad de
categorías, pues no permite realizar una recodificación por tramos de información. Por
ello, antes de la función recode - que implicaría utilizar aquella incorporada en dplyr -
incorporamos el argumento car::, lo que fuerza a que se ejecute el comando recode
incluido en un paquete distinto llamado car, para así poder recodificar indicando tramos
de datos.
Para el caso de la siguiente recodificación se indica el mismo valor para los códigos del 1
al 12, y del 13 al 14, mientras que se asigna un valor diferente para el valor 13
(correspondiente a la región Metropolitana). Primero se recodifica en una nueva variable
indicando los tramos de recodificación ya explicados. Posteriormente se sobrescribe la
variable asignándole el resultado de la operación de convertirla en una variable de tipo
factor, aplicando etiquetas para las dos categorías de respuesta ahora existentes.
El resultado muestra que, por un lado, se mantuvo la estructura de casos, con 501
casos en la región Metropolitana y 923 casos en otras regiones. Eso indica que la
recodificación se hizo de manera adecuada. Además, la tabla muestra etiquetas y al
solicitar el formato de la variable indica que es un vector de tipo factor. En síntesis, la
recodificación se efectuó de manera óptima.
Ejercicio 6.16
#Explorar variable "satisfacción con la propia vida"
class(CEP$satisfaccion_vida)
## [1] "integer"
table(CEP$satisfaccion_vida)
##
## 1 2 3 4 5 6 7 8 9 10 88 99
## 20 10 30 63 176 169 256 244 142 304 4 6
summary(CEP$satisfaccion_vida)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 6.000 7.000 7.924 9.000 99.000
El análisis exploratorio de esta primera variable28 permite identificar que la variable está
compuesta por valores discretos entre 1 y 10, aunque se observa también valores 88 y 99
en la distribución que - debido a la lectura del cuestionario y la ficha técnica de la
encuesta - se sabe que denotan las categorías “no sabe”y “no responde.”29 Es posible
afirmar entonces que el nivel de medición de esta variables de tipo intervalar, pues incluye
más de 7 categorías de respuesta.
#Explorar variable "percepción de la satisfacción que los chilenos tienen con su vida"
class(CEP$satisfaccion_chilenos)
## [1] "integer"
table(CEP$satisfaccion_chilenos)
##
## 1 2 3 4 5 6 7 8 9 10 88 99
## 33 21 97 216 469 241 160 56 24 47 52 8
summary(CEP$satisfaccion_chilenos)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 4.000 5.000 8.879 6.000 99.000
Algo similar ocurre con esta segunda variable. Al igual que la anterior, presenta valores 88
y 99 como casos válidos, lo que altera la distribución de casos ceñida a la escala de 1 a
10. Tal como en la variable anterior, también es posible afirmar - dado que presenta más
de 7 categorías - que el nivel de medición de esta variable es de intervalo.
CEP$satisfaccion_chilenos[CEP$satisfaccion_chilenos==88]<- NA
CEP$satisfaccion_chilenos[CEP$satisfaccion_chilenos==99]<- NA
Ejercicio 6.17
#Explorar variable "evaluación de la economía"
class(CEP$eval_econ)
## [1] "integer"
table(CEP$eval_econ)
##
## 1 2 3 4 5 8 9
## 74 397 730 204 5 8 6
summary(CEP$eval_econ)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 2.000 3.000 2.821 3.000 9.000
Como se observa en los resultados, la variable es una escala de acuerdo compuesta por
valores del 1 al 5, aunque también se observan valores 88 y 99 en la distribución que
gracias a la información disponible en el cuestionario y ficha técnica de este estudio,
sabemos que representan a a las categorías “no sabe” y “no contesta” (casos perdidos).
Así, es posible afirmar que se trata de una variable de nivel de medición ordinal.
Para efectos de simplificar las respuestas para su análisis, esta variable se recodificará en
tres categorías de evaluación (negativa, neutra y positiva). Asimismo, en el ejercicio 6.17
también se indicará una segunda forma de asignar casos perdidos (valores NA) esta vez
desde una recodificación vía comando mutate.
la variable está compuesta por valores discretos entre 1 y 10, aunque se observa también
valores 88 y 99 en la distribución que - debido a la lectura del cuestionario y la ficha
técnica de la encuesta - se sabe que denotan las categorías “no sabe”y “no responde”. Es
posible afirmar entonces que el nivel de medición de esta variables de tipo intervalar,
pues incluye más de 7 categorías de respuesta.
table(CEP$eval_econ_factor)
##
## Positiva Neutra Negativa
## 471 730 209
summary(CEP$eval_econ_factor)
## Positiva Neutra Negativa NA's
## 471 730 209 14
Habiendo construido y configurado una base de datos ad hoc para nuestros análisis, en
el presente capítulo se presenta un modo de calcular frecuencias, medidas de tendencia
central, de posición y de dispersión a nivel de la estimación puntual y del parámetro
poblacional.32
Para efectos de este manual distinguiremos aquellos estadísticos que se calculan desde
una muestra (probabilística o no probabilística) de aquellos que se obtienen vía registros
administrativos o de censos. Específicamente, en el caso de estadísticos que se
estiman a partir de una muestra probabilística avanzaremos desde la estimación puntual
al cálculo del parámetro poblacional (con su respectivo intervalo de confianza, nivel de
confianza y error de estimación). Esto último nos permitirá estimar los valores que la
estimación puntual alcanza en la población (que representa la muestra) y si existen
diferencias estadísticamente significativas a nivel del parámetro entre dos grupos
(prueba de hipótesis).
Ejercicio 7.1
mean(CEP$satisfaccion_vida, na.rm = TRUE)
## [1] 7.311174
mean(CEP$satisfaccion_vida, na.rm = TRUE, trim = 0.025)
## [1] 7.390625
Como se observa en el ejercicio 7.1 la media aritmética arroja un valor de 7,31 en una
una escala de 1 a 10, mientras la media recortada al 5% presenta un valor de 7,39
(ambos valores se redondean al segundo decimal). Como fue anticipado, la
interpretación de estos resultados (y sus diferencias) se explorarán en el siguiente
apartado.
Ejercicio 7.2
median(CEP$satisfaccion_vida, na.rm = TRUE)
## [1] 7
Ejercicio 7.3
#Ejecutar previamente "install.packages("modeest")"
library(modeest)
mfv(CEP$edad) #Indica el o los valores con más frecuencia
## [1] 50
En este caso, la moda de la variable edad es 50 años, lo que indica que el valor que
más se repite en la distribución de casos de tal variable corresponde a tal respuesta.
Ejercicio 7.4
tabla <- table(CEP$eval_econ_factor)
tabla
##
## Positiva Neutra Negativa
## 471 730 209
De forma muy sucinta, los resultados del ejercicio 7.4 muestran un importante
predominio de opiniones “neutras” con 730 casos, seguida por una concentración de
471 casos en respuestas “positivas” y 209 casos en respuestas “negativas”.
Para facilitar la comparación con otros datos, estos resultados pueden expresarse como
frecuencias relativas. Para el cálculo de frecuencias relativas, se usa el objeto tabla de
frecuencias simples ya construido (tabla): como se ve en el ejercicio 7.5, sobre tal
objeto, se ejecuta la función prop.table que construye una nueva tabla en la que cada
celda es la división simple entre la cantidad de casos de la categoría y el total de casos.
Ejercicio 7.5
#Frecuencias relativas (proporciones)
prop.table(tabla)
##
## Positiva Neutra Negativa
## 0.3340426 0.5177305 0.1482270
De tal forma, los resultados del ejercicio 7.5 confirman lo ya observado con frecuencias
absolutas. En este caso, los valores se presentan como proporciones de una unidad (1).
Así, se observa que la categoría “neutra” concentra la mayor cantidad de casos con
aproximadamente la mitad de los mismos (0,52), mientras que la categoría “positiva”
concentra un tercio de las respuestas (0,33).
Ahora bien, para facilitar aún más la lectura y divulgación de estos resultados resultará
de utilidad convertir estas frecuencias relativas en porcentajes. Como se observa en el
ejercicio 7.6, para construir una tabla de porcentajes se multiplica el resultado de
calcular la tabla de proporciones por 100; si a ello además se le agrega la función round,
es posible configurar un resultado redondeado a dos decimales.
Ejercicio 7.6
#Frecuencias relativas (porcentajes)
prop.table(tabla)*100
##
## Positiva Neutra Negativa
## 33.40426 51.77305 14.82270
round((prop.table(tabla)*100),2)
##
## Positiva Neutra Negativa
## 33.40 51.77 14.82
De tal modo, los resultados del ejercicio 7.6 permiten afirmar que la mayor cantidad de
respuestas se concentran en una evaluación “neutra” con el 51,8% del total, seguido por
evaluaciones positivas que representan un 33,4% del total de respuestas, y finalmente
las respuestas que reflejan evaluaciones negativas, que alcanzan un 14,8% de los
casos.
Ejercicio 7.7
#Frecuencias absolutas acumuladas
cumsum(tabla)
## Positiva Neutra Negativa
## 471 1201 1410
#Frecuencias relativas acumuladas
cumsum(prop.table(tabla))
## Positiva Neutra Negativa
## 0.3340426 0.8517730 1.0000000
#Porcentaje acumulado redondado en dos decimales
round(cumsum(prop.table(tabla)*100),2)
## Positiva Neutra Negativa
## 33.40 85.18 100.00
Así los resultados del ejercicio 7.7, permiten observar que una amplia mayoría de los
casos presenta una evaluación neutra o positiva de la economía nacional con el 85,2%
de los casos (en términos relativos), lo que equivale a 1.201 casos en términos
absolutos. Sólo un 14,8% de las respuestas se concentran en una evaluación negativa
de la economía.
Ejercicio 7.8
quantile(CEP$satisfaccion_chilenos, prob = c(0.25, 0.5, 0.75), na.rm = TRUE)
## 25% 50% 75%
## 4 5 6
De tal forma, en el ejercicio 7.8 se solicita al software el cálculo del cuartil 1 (percentil 25
o caso que corta el 25% de la distribución), el cuartil 2 (percentil 50, mediana o caso que
corta el 50% de la distribución) y el cuartil 3 (percentil 75, o caso que corta el 75% de la
distribución). Los resultados obtenidos en el ejercicio 7.6 permiten concluir que
solamente el 25% superior de los casos cree que los chilenos tienen una evaluación de
su vida mayor o igual a 6, mientras que la mitad de los casos cree que los chilenos
tienen una evaluación de su vida igual o menor a 5, en una escala del 1 al 10.
En relación a las medidas de dispersión se partirá por cálculo del rango. Los valores
mínimo y máximo de la distribución pueden calcularse de manera simultánea con la
función range, indicando como argumentos la variable de interés y adicionando también
el argumento na.rm = TRUE en el caso de que hubieran sido codificados como NA los
valores perdidos. Como se observa en el ejercicio 7.9, los valores mínimo y máximo
pueden calcularse de forma independiente, con las funciones min y max
respectivamente, que siguen la misma lógica que la función range. En este caso se
trabajará sobre la variable CEP$edad.
Ejercicio 7.9
range(CEP$edad, na.rm = TRUE)
## [1] 18 97
min(CEP$edad, na.rm = TRUE)
## [1] 18
max(CEP$edad, na.rm = TRUE)
## [1] 97
max(CEP$edad, na.rm = TRUE) - min(CEP$edad, na.rm = TRUE)
## [1] 79
Luego, para conocer el rango de los valores se debe restar el valor máximo al mínimo.
Los resultados del ejercicio 7.9 indican que, para el caso de la variable edad el rango es
de 79 años, siendo su valor mínimo 18 años y su valor máximo 97 años.
Otras dos medidas de uso generalizado para describir la dispersión de una variable son
la varianza y la desviación estándar. El cálculo de ambas medidas, sigue la misma
lógica en lo que refiere a la estructura de la función utilizada. Respectivamente, las
funciones utilizadas son var para varianza y sd, para desviación estándar. Como se
observa en el ejercicio 7.10 también debe incluirse el argumento na.rm = TRUE en el
caso de que hubieran sido codificados como NA los valores perdidos. En este ejercicio
se trabaja sobre la variable CEP$atisfaccion_chilenos, que refiere a la evaluación que la
persona cree los chilenos tiene de su vida, en una escala de 1 a 10.
Ejercicio 7.10
var(CEP$satisfaccion_chilenos, na.rm = TRUE)
## [1] 3.017771
sd(CEP$satisfaccion_chilenos, na.rm = TRUE)
## [1] 1.737173
Atendiendo a los resultados del ejercicio 7.10 puede observarse que la dispersión de la
variable que representa la evaluación que cada entrevistado/a cree que los chilenos
tienen sobre su propia vida es de 3,02 unidades atendiendo a la varianza y de 1,73
unidades atendiendo a la desviación estándar.
Otra medida que debemos aprender a calcular para nuestros análisis es el coeficiente
de variación. Como se observa en el siguiente ejercicio (7.11), el coeficiente de
variación puede calcularse de manera sencilla, ejecutando una división simple entre la
desviación estándar y la media de la variable de interés. Sin embargo, también existe la
función coefficient.variation (del paquete FinCal) que permite calcular este estadístico
indicando como argumento la media y desviación estándar de la variable de interés. En
este caso tales valores se incluyen indicando la función para calcularlos: de tal modo se
evitan errores humanos al momento de especificar los valores, ya sea por tipeo del valor
o por su aproximación decimal. En este ejercicio trabajamos con la variable edad
Ejercicio 7.11
sd(CEP$edad)/mean(CEP$edad)
## [1] 0.3566407
#Asegurarse de ejecutar previamente el comando "install.packages("FinCal")"
library(FinCal)
coefficient.variation(sd=sd(CEP$edad), avg = mean(CEP$edad))
## [1] 0.3566407
De este modo, los resultados del ejercicio 7.11 muestran que la variable edad presenta
una dispersión del 35,67% según el valor obtenido en el coeficiente de variación.
Forma de una distribución: simetría, curtosis y normalidad
Ejercicio 7.12
library(psych)
skew(CEP$satisfaccion_vida)
## [1] -0.5335721
kurtosi(CEP$satisfaccion_vida)
## [1] -0.1461258
Como se observa en los resultados del ejercicio 7.12, los coeficientes de simetría y
curtosis para la variable satisfaccion_vida son de -0,53 y -0.15 unidades de forma
respectiva. Dado que tales valores están expresados en la unidad de medida de la
variable en cuestión, no son útiles para comparar variables de diferentes unidades de
medición. Es por eso que en el ejercicio 7.13 se calculan los coeficientes de simetría y
curtosis estandarizados: para ello, se divide la simetría calculada, por la raíz cuadrada
del valor 6 (este número es una constante en la fórmula) dividido en la cantidad de
casos de la variable (en este caso, 1.401).
Ejercicio 7.13
skew(CEP$satisfaccion_vida)/sqrt(6/1401)
## [1] -8.153359
kurtosi(CEP$satisfaccion_vida)/sqrt(6/1401)
## [1] -2.232906
Un criterio general para determinar si los coeficientes de simetría y curtosis reflejan una
variable semejante a una distribución normal es que ambos valores se encuentren entre
-2 y 2. Como puede observarse en los resultados, ambos coeficientes escapan a tal
rango por lo que se observa una distribución poco similar a una normal.
Finalmente, la forma más certera para evaluar si la distribución de datos de una variable
se comporta según los parámetros que asume una distribución normal es aplicando un
test estadístico específicamente orientado a tal evaluación. Para ello, se diferencia el
test de Shapiro Wilk y el de Kolmogorov Smirnov. El primero se adecua a muestras
pequeñas (menores a 50 casos), mientras que el segundo sirve para muestras de entre
50 y 1.000 casos.
Ejercicio 7.14
#Prueba de Shapiro Wilk (muestras pequeñas)
shapiro.test(CEP$edad)
##
## Shapiro-Wilk normality test
##
## data: CEP$edad
## W = 0.97588, p-value = 1.037e-14
#Prueba Kolmogorov Smirnov (muestras grandes)
ks.test(CEP$edad, "pnorm", mean(CEP$edad, na.rm=T), sd(CEP$edad,na.rm=T))
## Warning in ks.test(CEP$edad, "pnorm", mean(CEP$edad, na.rm = T),
## sd(CEP$edad, : ties should not be present for the Kolmogorov-Smirnov test
##
## One-sample Kolmogorov-Smirnov test
##
## data: CEP$edad
## D = 0.056969, p-value = 0.0001935
## alternative hypothesis: two-sided
No obstante, vale la pena recordar que para determinar normalidad univariada se busca
un valor p mayor a 0,05 para no rechazar la hipótesis nula de igualdad entre la
distribución normal teórica y la distribución empírica de datos que estamos evaluado. Si
los resultados fueran válidos en términos estadísticos, en ambas situaciones
deberíamos rechazar la normalidad pues se aprueba la hipótesis alternativa dado que
ambas pruebas presentan valores p menores a 0,05.
Distribuciones de frecuencias
Ejercicio 7.15
f <- table(CEP$eval_econ_factor)
f_porc <- round((prop.table(tabla)*100),2)
f_porc_acum <- round(cumsum(prop.table(tabla)*100),2)
Luego, con la función write.csv2 tales tablas pueden imprimirse, de forma individual, a
archivos de tipo CSV. Como se observa en la continuación del ejercicio 7.15, al ejecutar
esta función se indica el objeto a imprimir como planilla y luego con el argumento file se
indica (entre comillas) el nombre del archivo a crear con su respectiva extensión (.csv
en este caso).
Ahora bien, es importante recalcar cómo se debe realizar la interpretación de una tabla
de resultados como la presentada (a continuación se incorpora en un formato adecuado
para este documento interactivo).
Distribución de frecuencias de la variable Evaluación de la Economía Chilena
Frecuencia Porcentaje
Categoría/Indicador Porcentaje
absoluta acumulado
Reiterando lo señalado para los resultados del ejercicio 7.7, se observa que una amplia
mayoría de los casos presenta una evaluación neutra o positiva de la economía
nacional con el 85,2% de los casos (en términos relativos), lo que equivale a 1.201
casos en términos absolutos. Dentro de ello destaca que un tercio (33,4% o 471 casos)
de las personas declaran una opinión neutra. Finalmente, es posible señalar que sólo un
14,8% de las respuestas (209 casos) se concentran en una evaluación negativa de la
economía.
Estadísticos descriptivos
Una primera forma es utilizando la función summary, que se ejecuta con la variable de
interés como principal argumento (en este caso, la variable CEP$satisfaccion_vida). A
diferencia del cálculo de estadísticos de forma individual, en este caso no es necesario
indicar mediante argumento el tratamiento de los casos codificados como NA pues esta
función reconoce de manera automática tales valores lógicos y los excluye del análisis.
Mediante este simple comando (ejercicio 7.16) se obtiene una tabla de estadísticos de
resumen: valores mínimo y máximo, primer cuartil, mediana, media, tercer cuartil y
cantidad de valores codificados como perdidos (valores NA).
Ejercicio 7.16
summary(CEP$satisfaccion_vida)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 1.000 6.000 7.000 7.311 9.000 10.000 10
Ahora bien, para exportar estos resultados a una planilla de cálculo se deberán ejecutar
diversas operaciones que se muestran en el siguiente ejemplo (7.17). Primero, los
resultados del comando summary se guardan como un objeto específico (al cual se le
asigna el nombre de descriptivos).
Ejercicio 7.17
#Guardar summary como objeto
descriptivos <- summary(CEP$satisfaccion_vida)
Luego, si se le aplican las funciones names y as.numeric a tal objeto (descriptivos) se
obtiene un vector que contiene los encabezados de los resultados y otro vector que
contiene su valores numéricos: en la continuación del ejercicio 7.17 se observa el
resultado de aplicar ambas funciones sobre el objeto mencionado, que muestran en
primer lugar los encabezados de la tabla y luego sus valores.
El resultado del ejercicio (como se observa en la imagen 7.3) muestra cómo ya hemos
configurado el resultado en formato matriz de datos.
Así, a partir de esta matriz se puede crear un nuevo archivo tipo planilla de cálculo con
estos resultados. Que quedará guardado en la carpeta de trabajo con el nombre de
“Tabla 4.csv”.
Como se observa en el ejercicio 7.18, cada valor construido se concatena como un sólo
vector (descriptivos_satvida) de valores numéricos, que será una fila de la planilla a
construir (la que contendrá los valores de cada estadístico). Adicionalmente, se
construye un vector llamado nombres con los encabezados de cada estadístico a
escribir en la tabla, que se utilizará como fila de títulos de la planilla de cálculo a
exportar.
Ejercicio 7.18
#Cálculo simple de estadíticos descriptivos
min <- min(CEP$satisfaccion_vida, na.rm = TRUE)
q1 <- quantile(CEP$satisfaccion_vida, probs = 0.25, na.rm = TRUE)
media <- mean.default(CEP$satisfaccion_vida, na.rm = TRUE)
media_rec <- mean.default(CEP$satisfaccion_vida, trim = 0.025, na.rm = TRUE)
mediana <- median.default(CEP$satisfaccion_vida, na.rm = TRUE)
moda <- mfv(CEP$satisfaccion_vida)
var <- var(CEP$satisfaccion_vida, na.rm = TRUE)
desvest <- sd(CEP$satisfaccion_vida, na.rm = TRUE)
q3 <- quantile(CEP$satisfaccion_vida, probs = 0.75, na.rm = TRUE)
max <- max(CEP$satisfaccion_vida, na.rm = TRUE)
s <- skew(CEP$satisfaccion_vida)
c <- kurtosi(CEP$satisfaccion_vida)
Todo esto resulta en una planilla como la que se observa en la imagen 7.5, editable
para la construcción de reportes formales.
En base a una edición muy simple en software tipo planilla de cálculo, se puede llegar a
darle un formato como el que se observa en la imagen 7.6, útil para su presentación en
reportes formales de resultados.
Ahora bien, es importante recalcar cómo se debe realizar la interpretación de una tabla
de resultados como la presentada (a continuación se incorpora en un formato adecuado
para este documento interactivo).
Estadístico Valor
Mínimo 1,0
Q1 6,0
Media 7,31
Mediana 7,0
Moda 10,0
Estadísticos Descriptivos de la variable Nivel de Satisfacción con la Propia Vida
Estadístico Valor
Varianza 4,46
Q3 9,0
Máximo 10,0
Simetría -0,53
Curtosis -0,15
La información que necesita esta función es la cantidad de casos que coinciden con la
condición de interés (la categoría de la variable cuya frecuencia relativa interesa) y la
cantidad que representa a la totalidad de casos de la muestra (n muestral). En este
caso, a partir de la encuesta CEP se evaluará la hipótesis de si la mayoría de las y los
chilenos declara tener una opinión negativa de la situación económica del país.
Ejercicio 7.19
library(PropCIs)
table(CEP$eval_econ_factor)
##
## Positiva Neutra Negativa
## 471 730 209
nrow(CEP)
## [1] 1424
exactci(x = 730, n = 1424, conf.level = 0.95)
##
##
##
## data:
##
## 95 percent confidence interval:
## 0.4863248 0.5389039
Así, el resultado de esta función es el límite superior e inferior del intervalo de confianza,
construido a partir de la probabilidad ya indicada (proporción de personas que declaran
tener una percepción positiva de la situación económica del país).
Con este resultado es posible concluir que, con un 95% de confianza, no es posible
afirmar que la proporción de personas que declaran tener una percepción positiva de la
situación económica del país sea más que la mitad de población nacional, debido a que
el parámetro poblacional se sitúa entre el 48,6% y 53,9% de los casos.
El resultado es bastante sencillo e indica el valor del estadístico muestral (el valor de la
media bajo la etiqueta mean) a la vez que indica el límite superior e inferior del intervalo
de confianza para la media poblacional, o parámetro, bajo la etiqueta CI-95%; esto
último indica el nivel de confianza utilizado para la construcción del intervalo.
Ejercicio 7.20
library(Publish)
Como se observa en los resultados del ejercicio 7.20, al ejecutar el comando con su
configuración por defecto, este utiliza un 95% de confianza. Con este valor se puede
afirmar con un 95% de confianza que la media poblacional, es decir el promedio de
satisfacción que los chilenos declaran tener respecto a su propia vida, se encuentra
entre los valores 7,2 y 7,42, en una escala de 1 a 10.
Ahora bien, si al comando básico se le agrega el argumento alpha es posible definir el
valor complementario al nivel de confianza, es decir la proporción de error aceptable
para la estimación. En la continuación del ejercicio 7.20 se define el valor 0,2 o 20%.
Un uso muy frecuente para este tipo de cálculos es evaluar si la diferencia entre una
misma media para dos grupos es diferente, de manera estadísticamente significativa.
Supondremos que se busca calcular el mismo indicador anterior pero efectuando el
cálculo de intervalo de confianza para medias, diferenciando según hombres y mujeres.
Ejercicio 7.21
ci.mean(satisfaccion_vida~sexo_factor, data=CEP)
## sexo_factor mean CI-95%
## Hombre 7.46 [7.29;7.62]
## Mujer 7.22 [7.07;7.37]
Como se observa en los resultados, las medias muestrales permitirán afirmar que
hombres y mujeres presentan una evaluación levemente diferente en relación a la
satisfacción que declaran tener con su propia vida. Específicamente, la media de esta
variables es de 7,46 para los hombres y de 7,22 para las mujeres. Sin embargo, al
observar el comportamiento de tales mediciones a nivel poblacional, es posible afirmar
que las variables no difieren de manera estadísticamente significativa. Para un nivel de
confianza del 95%, la media de esta variable para los hombres se sitúa entre los valores
7,29 y 7,62 para los hombres y entre los valores de 7,07 y 7,37 para las mujeres. Los
valores indican que los intervalos se intersectan, es decir, existe una elevada
probabilidad de que estos parámetros sean muy similares e incluso iguales. Por lo tanto,
no es posible afirmar que tales valores sean diferentes, de manera estadísticamente
significativa, pues existe una alta posibilidad de que sean iguales.
Para hacer esto más claro, y a la vez indicar cómo se trabaja con coeficientes de
expansión en R, lo explicamos con un ejemplo. Específicamente utilizaremos la
Encuesta Nacional de Empleo, trimestre móvil Enero-Febrero-Marzo de 2019 publicada
por el Instituto Nacional de Estadísticas de Chile. (2019a).
Nombre de Estado
Definición Valores
variable en base
Factor de Creada
fact Peso de cada caso en la población
expansión por INE
Edad de la
Creada
edad persona Cantidad de años
por INE
entrevistada
Variables a utilizar desde la ENE
Nombre de Estado
Definición Valores
variable en base
1 representa personas de 15 y
Población en edad
PET más años - 2 representa a A crear
de trabajar
personas menores a 15 años
Como se observa en el siguiente ejemplo (7.22), primero se carga la base de datos con
la función read.csv2, para luego recodificar la variable edad en la variable PET36. A
esta última variable le agregamos etiquetas mediante la función factor para poder
identificar los casos en las salidas de resultados.
Ejercicio 7.22
#Cargar ENE y guardar como objeto
ENE <- read.csv2("ENE 2019 02 EFM.csv", sep = ";", dec = ",")
Como se observa en los resultados del ejercicio 7.22, en la muestra se observa que
existen 86.197 personas en edad de trabajar (con una edad igual o mayor a 15 años),
mientras 20.254 personas no están en edad de trabajar (menores de 15 años).
Ahora bien, si se observan los resultados oficiales publicados por el INE (2019b), se
observa que la cantidad de personas de 15 años o más, no es 86.197, sino 15.286.507
personas. Para lograr llegar a tal cifra se deben aplicar el factor - o coeficiente - de
expansión de la base de datos, para luego de ello calcular la cifra de interés.
El resultado de aplicar la función class sobre el objeto que almacena la base de datos
ponderada (ENE_ponderada) y ejecutar directamente tal objeto, es la información de
que se trata de un objeto del tipo survey.design y que se trata de un diseño de muestreo
con reemplazo, es decir, cada caso tuvo siempre la misma probabilidad de ser elegido
(diseño equiprobable).
Ahora bien, sobre este objeto, podemos seguir utilizando funciones del mismo paquete
survey para calcular algunos resultados. Retomando el ejemplo sobre la Población en
Edad de Trabajar, con la función svytotal es posible calcular nuevamente las
frecuencias de la variable PET. Como se observa en el ejercicio 7.24, esto se efectúa
mediante la función svytotal, a la cual se le indica la variable de interés antecedida por
una virgulilla (~PET) y el nombre del objeto que corresponde a uno del tipo
survey.design.
Ejercicio 7.24
svytotal(~PET, ENE_ponderada)
## total SE
## PET>=15 15286507 68710
## PET<15 3649759 42750
Como se observa en los resultados del ejercicio 7.24, ahora sí logramos calcular las
frecuencias reales de ocurrencia de la variable Población en Edad de Trabajar, pues la
categoría igual o mayor a 15 años presenta 15.286.507 casos, equivalente a las cifras
publicadas de manera oficial por el INE (2019b).
No se profundiza de manera adicional, pero el cálculo de otro tipo de resultados con una
base ponderada es bastante similar a lo ya revisado en relación a frecuencias simples.
Para mayores detalles revisar la página web mantenida por el equipo desarrollador del
paquete survey (Lumley 2019).
Ejercicio 7.25
svyciprop(~I(PET==">=15"), ENE_ponderada, method = "li")
## 2.5% 97.5%
## I(PET == ">=15") 0.807 0.803 0.81
Como se observa en el resultado del ejercicio 7.25, el cálculo arroja tres números
expresados como proporciones. El primero es 0,807 (u 80,7%), que corresponde a la
estimación puntual - basada en las frecuencias ponderadas - de la Población en Edad
de Trabajar. Luego se observan los valores 0,803 (80,3%) y 0,81 (81,0%) que marcan,
según sus encabezados lo indican los límites del intervalo de confianza calculado con
un error tipo 1 (o alfa) del 5%.39.
Este resultado permite concluir que, en base a una estimación realizada con un nivel de
confianza del 95%, siendo la estimación puntual un 80,7%, el valor del parámetro que
expresa la proporción de las personas en edad de trabajar en la población chilena se
encuentra entre el 80,3% y 81,0%.
Esto mismo puede replicarse para frecuencias absolutas. En el ejercicio 7.26 se observa
una ejemplificación con los mismos datos que hasta ahora han sido usados: las
frecuencias de la variable Población en Edad de Trabajar. En primer término se muestra
el cálculo de frecuencias expandidas sobre la variable PET: el cálculo arroja el resultado
para las dos categorías de la variable. En segundo lugar se aplica la función confint
sobre el resultado de frecuencias absolutas expandidas, indicando de forma explítica el
nivel de confianza a utilizar con el argumento level.
Ejercicio 7.26
#Frecuencias expandidas para variable edad
svytotal(~PET, ENE_ponderada)
## total SE
## PET>=15 15286507 68710
## PET<15 3649759 42750
#IC para frecuencias absolutas
confint(svytotal(~PET, ENE_ponderada), level = 0.95)
## 2.5 % 97.5 %
## PET>=15 15151838 15421176
## PET<15 3565970 3733548
Como se observa en el resultado del ejercicio 7.26, la funció svytotal calcula las
frecuencias (expandidas) de la variable PET, indicando que la población en edad de
trabajar son 15.286.507 personas, mientras que las personas menores a la edad de
trabajar son 3.649.759. Luego, la función confint arroja los intervalos de confianza
construidos con un 5% de error alfa o tipo 1: en el caso de las cantidad de personas en
edad de trabajar, se observa que el parámetro de tal atributo se encuentra entre
15.151.838 personas y 15.421.176 personas; en el caso de la población en una edad
menor a la de trabajar (menos que 15 años) el parámetro de tal atributo se encuentra
entre los 3.565.970 personas y los 3.733.548 personas.
Ejercicio 7.27
# Cálculo de media expandida para la variable edad
svymean(~edad, ENE_ponderada)
## mean SE
## edad 38.313 0.1169
# Cálculo de intervalo de confianza para la media expandida de variable edad
confint(svymean(~edad, ENE_ponderada), level = 0.95)
## 2.5 % 97.5 %
## edad 38.08348 38.54182
Como se observa en los resultados del ejericio 7.27 podemos afirmar que la estimación
puntual de la variable edad es 38,31 años. Mientras que el parámetro de tal atributo se
encuentra entre los 38,08 y 38,54 años, con un nivel de confianza para tal estimación
del 95%.
Construcción de gráficos usando RStudio: funcionalidades
básicas y uso del paquete ggplot2
Funciones básicas para la construcción de gráficos
De modo general R, en su versión básica, incluye funciones para crear gráficos. Sin
embargo, estas herramientas son bastante limitadas en cuanto a las posibilidades de
edición que incluyen. Con todo, resultan válidas para un uso de análisis exploratorio.
Esto es, un uso enfocado en la visualización de información que permita - dentro del
contexto de un proceso de investigación - tomar decisiones para posteriores análisis
estadísticos. Luego de explorar estas alternativas se profundizará en el uso de ggplot2,
paquete especializado en en el diseño de gráficos que permite una mejor visualización
de resultados, sobre todo enfocados en el momento de divulgación de resultados de
investigación (Field, Miles, and Field 2012, 116–17).
Ejercicio 8.1
# Transformar variable sexo a factor (contar con valores y etiquetas)
CEP <- mutate(CEP, sexo_factor = factor(CEP$sexo,
labels = c("Hombre", "Mujer")))
Ejercicio 8.2
#Limitaciones de la función hist
hist(CEP$sexo)
hist(CEP$sexo_chr)
## Error in hist.default(CEP$sexo_chr): 'x' must be numeric
hist(CEP$sexo_factor)
## Error in hist.default(CEP$sexo_factor): 'x' must be numeric
Los resultados de las líneas de código anterior muestran cómo solamente el primer
gráfico es construido de manera adecuada, pero asume una continuidad de valores
entre las categorías “hombre” y “mujer” (valores 1 y 2, respectivamente), lo que arroja
un gráfico poco útil. Por otra parte, al indicar como variable de entrada un vector de tipo
character o factor, el comando arroja error.
Por ello se sugiere el uso del comando plot para construir gráficos de barras. De manera
general, este tipo de gráficos se usan para variables cualitativas (nominales u
ordinales). Las categorías de una variable se sitúan en el eje X, mientras que la
frecuencia absoluta o relativa (generalmente porcentajes) se sitúa en el eje Y (Ritchey
2008, 83–85)
A continuación se muestra el uso del comando plot para construir un gráfico de barras.
El primer argumento es la variable a graficar. Posteriormente se usan argumentos para
agregar títulos: main sirve para agregar un título general; xlab sirve para agregar un
título al eje X; ylab sirve para agregar un título al eje Y. Como se observa, este resulta
bastante más adecuado para la visualización exploratoria de datos.
Ejercicio 8.3
plot(CEP$sexo_factor, main = "Gráfico de barras 1",
xlab = "Género", ylab = "Frecuencia")
Otra forma de presentar variables nominales son los gráficos circulares (o de “torta”)“;
se trata de gráficos cuya división proporcional busca representar la distribución de
categorías dentro de una variable nominal u ordinal: el área del círculo representa el
100% de los casos de una variable, mientras que el área de cada división del círculo,
representa el porcentaje de casos en una categoría específica de esa
variable (Ritchey 2008, 80–83). Estos gráficos, a pesar de ser muy utilizados, no
resultan tan recomendados pues tienden a distorsionar la percepción de la información
presentada: cuando se trabajan variables con muchas opciones de respuesta la mirada
tiende a distorsionar el tamaño relativo de las divisiones del círculo. No obstante pueden
utilizarse cuando construimos gráficos con variables nominales de pocas categorías
(entre dos y cinco), sobre todo para mostrar diferencias entre pocas categorías.
A continuación se muestra una configuración de elementos que servirán para construir
el gráfico.
1. Primero se usa la tabla de frecuencias relativas construida en el apartado 7.1.2.
Sobre ella se aplica la función round, que permite seleccionar la cantidad de
decimales deseados para hacer la aproximación. Mediante la
función as.numeric se guardan en un nuevo vector (porcentajes) los números que
configuran los resultados de tal tabla.
2. Luego se construye un vector de caracteres (etiquetas) con las etiquetas de cada
resultado.
3. A continuación se realizan dos operaciones sobre tal vector: usando el
comando paste cada etiqueta se una con los valores porcentuales que serán
cada proporción del gráfico; además, al final de cada valor se incorpora un
signo % que quedará expresado en las etiquetas del gráfico. En el siguiente
ejemplo se muestra el vector resultante de cada parte de la operación.
Ejercicio 8.4
#Valores que dividirán el gráfico
porcentajes <- as.numeric(round(((prop.table(table(CEP$eval_econ_factor)))*100),2))
porcentajes
## [1] 33.40 51.77 14.82
#Etiquetas para el gráfico
etiquetas <- c("Positiva", "Neutra", "Negativa")
etiquetas
## [1] "Positiva" "Neutra" "Negativa"
etiquetas <- paste(etiquetas, porcentajes)
etiquetas
## [1] "Positiva 33.4" "Neutra 51.77" "Negativa 14.82"
etiquetas <- paste(etiquetas, "%", sep = "")
etiquetas
## [1] "Positiva 33.4%" "Neutra 51.77%" "Negativa 14.82%"
Ejercicio 8.5
hist(CEP$edad, main = "Histograma de frecuencias 1",
xlab = "Edad (años cumplidos)",
ylab = "Frecuencia",
col = "red",
border = "black",
xlim = c(18, 97),
ylim = c(0, 150))
Ejercicio 8.6
densidad_edad <- density(CEP$edad)
plot(densidad_edad,
main = "Histograma de densidad 1",
xlab = "Edad (años cumplidos)",
ylab = "Densidad")
Diagrama de cajas
Ejercicio 8.7
boxplot(CEP$edad, main = "Gráfico de cajas 1",
outline = TRUE)
Capa Descripción
En este apartado se replicarán los gráficos construidos con las funcionalidades básicas
de R, pero ahora aplicando la función ggplot. Se comienza por un diagrama de barras.
Ejercicio 8.8
library(ggplot2)
#Gráfico de barras 2: sexo en frecuencias absolutas
ggplot(CEP, aes(x = sexo_factor)) +
geom_bar(width = 0.4, fill=rgb(0.1,1,0.5,0.7)) +
scale_x_discrete("Sexo") + # configuración eje X (etiqueta del eje)
scale_y_continuous("Frecuencia") +
labs(title = "Gráfico de barras 2",
subtitle = "Frecuencia absoluta de la variable sexo")
Si bien se trata de un código algo más complejo que la función básica que incluye el
software, es posible afirmar que hay una mejora estética notable en comparación con los
gráficos más básicos.
Una variante del gráfico anterior es construirlo para frecuencias relativas expresadas en
porcentajes, uso muy común para la presentación de datos en contextos de divulgación
de resultados.
Ejercicio 8.9
ggplot(CEP, aes(x = sexo_factor)) +
geom_bar(width = 0.4, fill=rgb(0.1,0.3,0.5,0.7), aes(y = (..count..)/sum(..count..))) +
scale_x_discrete("Sexo") + # configuración eje X (etiqueta del eje)
scale_y_continuous("Porcentaje",labels=scales::percent) + #Configuración eje y
labs(title = "Gráfico de barras 3",
subtitle = "Frecuencia relativa de la variable sexo")
A continuación se indican las modificaciones realizadas al código anterior:
Se modificaron algunos valores del argumento fill de la función geom_bar para alterar el
color resultante de las barras.
En la función geom_bar se agregó un argumento aes para editar el tipo de conteo
ejecutado en el eje Y. Específicamente se le indica que el conteo hecho en Y es igual al
conteo simple, dividido en la suma total de casos.
Luego, se agrega un scale_y_continuous editar los parámetreos del eje vertical. Ello
permite agregar el título de porcentaje al eje Y, a la vez que definir que las etiquetas del
eje (labels) respondan a una escala de tipo porcentual (label=scales::percent).
El resto de los comandos se mantuvo igual.
El siguiente comando muestra como construir un histograma de frecuencias absolutas. En
este caso, luego de los datos a utilizar (CEP), se indica que en el eje X se posicione a la
variable edad pero considerándola como variable numérica continua (as.numeric) pues
originalmente es una variable de tipo integer, lo que impide posicionarla en el gráfico
como variable continua. El resto de los comandos es similar a un gráfico de barras, sólo
que ahora se le indica la función geom_histogram para construir el histograma; dentro de
esta función se indica un binwidth para ajustar el ancho de la barra. Nótese que la
configuración de ambos ejes indica que se trata de variables continuas
(scale_x_continuous, scale_y_continuous), de lo contrario no podría configurarse el
gráfico.
Ejercicio 8.10
ggplot(CEP, aes(x = as.numeric(edad))) +
geom_histogram(binwidth = 0.6) +
scale_x_continuous("Edad (años cumplidos)") +
scale_y_continuous("Frecuencia") +
labs(title = "Histograma de frecuencias 2",
subtitle = "Frecuencia absoluta de la variable edad")
Como fue señalado en el apartado anterior la manera que resulta más óptima para
observar la forma de la distribución de una variable es la construcción de un histograma
de densidad. A continuación se muestra la sintaxis que permite construir un histograma
de densidad de la variable Edad. La estructura de la sintaxis sigue la misma lógica que los
otros gráficos construidos con el paquete ggplot2; en este caso, la especificación de la
geometría es el argumento geom_density. El resultado permite observar de manera
precisa la forma de la distribución de la variable Edad.
Ejercicio 8.11
ggplot(CEP, aes(x = edad)) +
geom_density() +
scale_y_continuous("Densidad") +
scale_x_continuous("Edad") +
labs(title = "Histograma de densidad 2",
subtitle = "Forma de la distribución de la variable edad")
Bibliografía