R funciona como un entorno temporal de trabajo, esto quiere decir que el usuario va agregando datos y objetos, pero si los análisis no son guardados se deberán repetir las instrucciones para obtener otra vez el resultado. Por esta razón, es preciso configurar una carpeta predeterminada en nuestro ordenador, donde el programa buscará los archivos a ejecutar y guardará los archivos a conservar con cambios.
Para ver nuestro lugar de trabajo actual escribimos el siguiente comando (escriba el código en la consola, ya que si lo ejecuta desde este Rmd, obtendrá el lugar donde se encuentra este archivo):
getwd() #obtener ubicación del directorio
## [1] "/Users/kimenarincon/Desktop/ESTADISTICA 01/BASES/Sesion 01"
Si queremos cambiar de directorio de trabajo, nos dirigirnos al menú “Session” > “Set Working Directory” > “Choose Directory”. Esto abrirá una ventana emergente, donde buscaremos la carpeta en la cual vamos a trabajar, la ubicamos y seleccionamos “Open”. Para verificar el cambio volvemos a digitar la función “getwd()” en la consola.
El uso de R es bastante intuitivo y sigue un patrón lógico. Está compuesto de códigos y la combinación de estos códigos genera una sintaxis. Asimismo, R guarda la información de nuestras observaciones y variables a través de objetos.
En un sentido global, la estructura general de una sintaxis puede resumirse como sigue: a un objeto dado se le asigna el resultado de una función, que a su vez se ejecuta sobre un conjunto de datos especificado, con una serie de configuraciones particulares. Veamos el siguiente ejemplo ficticio.
Si se lee de izquierda a derecha, la línea de comando puede explicarse como sigue:
Primero se indica un objeto a crear, con el nombre que ustedes definan.
Luego se indica el asignador, que expresa que todo lo que esté a la derecha de la flecha se guardará en el objeto creado a la izquierda. El asignador puede ser “<-” o también “=”
Luego viene la función que en este caso permite leer archivos tipo Microsoft Excel. R trabaja con funciones que están dentro de “paquetes” que la comunidad va desarrollando. Podemos hacer nuestras operaciones con diversas funciones, y no hay una sola forma de hacerlo. Si se trata de funciones que no están predeterminadas en R, debemos instalar el paquete que las contiene con el comando “install.packages()”, y antes de ejecutarla debemos abrir la libreria con el comando “library()”
Luego de la función, se abre un paréntesis que contiene los argumentos: instrucciones que especifican ciertos detalles de lo que queramos que la función realice. Los argumentos pueden escribirse de distintas maneras y va a depender de lo que queramos hacer. En nuestro ejemplo: El primer argumento indica la información a leer, en este caso indica un archivo de tipo Excel (extensión xlsx). El segundo argumento indica la hoja del archivo a leer. El tercer argumento indica qué columnas se leerán de forma específica (en este caso, las primeras diez).
Hagamos un ejemplo:
Vamos a abrir un archivo en R, utilizando la función “import” del paquete “rio”, el cual es un paquete versátil que nos permite importar datos de diversas extensiones (dta, sav, csv, xls, etc.)
Antes que todo, debemos instalar el paquete escribiendo en la consola: install.packages(“rio”)
#install.packages("rio")
library(rio) #Convocamos el paquete
data=import("Mosteller.csv") #Utilizamos la función import que creará un objeto en R que contenga la base de datos del archivo "Mosteller.csv" que hemos descargado. Podemos verificar la creación en el environment
class(data) #si quieren saber que clase de objeto es el que has creado, utilizamos la función "class" y entre paréntesis colocamos el nombre del objeto. Verán que se trata de un "data frame", es el tipo de objeto en R para las bases de datos.
## [1] "data.frame"
¿Qué otro tipo de objetos existen?
Una parte clave para iniciar el manejo del programa es identificar los diversos objetos que podemos crear, manipular y utilizar. Para la definición de objetos en R será necesario previamente tener claridad teórica sobre lo que es una variable categórica nominal, categórica ordinal, numérica discreta y numérica continua.
Para los fines de este curso se contemplarán las siguientes objetos:
Tipo | Descripción |
---|---|
Vector numérico | Vector conformado por la concatenación de números, puede representar variables numéricas continuas o discretas. Ej: 1.5 , 2.7 , 3.1 |
Vector de factores | Vector que sirve para representar variables categóricas. Pudiendo ser factores nominales u ordinales. Ej: “costa”, “sierra”, “selva” |
Data frames | Son hojas de datos, estructuras similares a una matriz; sin embargo, a diferencia de estas pueden almacenar objetos de distintos tipo. Generalmente nuestras bases de datos son de este tipo (como una hoja de Excel que tiene variables numéricas, categóricas, etc). |
Los vectores numéricos se crean a través de la función concatenar “c()”. Vamos a crear un vector que contenga los montos en millones de soles del presupuesto del Estado asignado a las 5 prioridades para el 2021
Presupuesto_millones=c(9879, 33132, 20991, 690, 5392) #creamos el vector (verifiquemos en el environment)
Presupuesto_millones #invocamos el vector para visualizar su contenido
## [1] 9879 33132 20991 690 5392
Un factor nos permite representar una variable categórica. Se crean a través de la función “factor()”, pero antes se crea como vector pues almacena las categorías en la forma de un vector con números discretos integrales (1,2,3,4,etc.), que son códigos de los valores de la variable y otro vector de caracteres interno que contiene las etiquetas de esos códigos. Creemos un factor con los nombres de las prioridades del presupuesto para el 2021:
Prioridad = c(1,2,3,4,5) #primero creamos un vector
Prioridad = factor(Prioridad, levels = c(1:5), labels = c("reactivación", "educación","salud","mujer","pobreza")) #Lo convertimos en factor. Ojo con los argumentos.
Prioridad #visualizamos su contenido
## [1] reactivación educación salud mujer pobreza
## Levels: reactivación educación salud mujer pobreza
También podemos crear un factor ordenado para almacenar información de una variable categórica ordinal. Es casi la misma ruta, solo que añadiremos una función más para convertir el factor en ordinal. Creemos un factor ordinal ficticio que contenga el nivel de ejecución que el Estado ha mostrado en las categorías presupuestales correspondientes a las prioridades, donde 1=Mala, 2=Intermedia y 3= Buena.
Ejecucion=c(3,2,2,1,2) #creamos un vector numérico que registra los datos
Ejecucion=factor(Ejecucion) #Lo convertimos en factor
levels(Ejecucion)=c("Mala","Intermedia","Buena") #asignamos los niveles al factor
Ejecucion=ordered(Ejecucion) #indicamos que se trata de un factor ordinal
Ejecucion #Visualizamos
## [1] Buena Intermedia Intermedia Mala Intermedia
## Levels: Mala < Intermedia < Buena
Finalmente, los data frames nos permite almacenar un conjunto de datos, es decir una base de datos (bbdd) que tiene filas y columnas. Creemos la base de datos “PP2021” que contenga todos los objetos que hemos creado:
PP2021 = data.frame(Prioridad,Presupuesto_millones,Ejecucion)
PP2021 # Visualice la base de datos
## Prioridad Presupuesto_millones Ejecucion
## 1 reactivación 9879 Buena
## 2 educación 33132 Intermedia
## 3 salud 20991 Intermedia
## 4 mujer 690 Mala
## 5 pobreza 5392 Intermedia
str(PP2021) # Visualice la estructura de la bbdd
## 'data.frame': 5 obs. of 3 variables:
## $ Prioridad : Factor w/ 5 levels "reactivación",..: 1 2 3 4 5
## $ Presupuesto_millones: num 9879 33132 20991 690 5392
## $ Ejecucion : Ord.factor w/ 3 levels "Mala"<"Intermedia"<..: 3 2 2 1 2
names(PP2021) #Visualice los nombres de las variables de la bbdd
## [1] "Prioridad" "Presupuesto_millones" "Ejecucion"
Cuando queramos invocar una variable específica de una base de datos utilizaremos “$”, entre la base de datos y la variable que queremos invocar.
PP2021$Prioridad #invocamos la variable prioridad de la base de datos
## [1] reactivación educación salud mujer pobreza
## Levels: reactivación educación salud mujer pobreza
class(PP2021$Ejecucion) #vemos de que clase es la variable ejecución de la bbdd
## [1] "ordered" "factor"
Con esta introducción, vamos a comenzar a hacer análisis descriptivo de una base de datos. Antes, limpiemos el environment. Luego, abramos la base de datos que vamos a utilizar (que es la que abrimos antes)
library(rio)
data=import("Mosteller.csv")
Esta base de datos pertenece al siguiente paper https://pubmed.ncbi.nlm.nih.gov/8528684/ Mosteller (1995) realizó un estudio longitudinal sobre el impacto del tamaño de la clase en los primeros grados escolares, sobre el desempeño estudiantil y el desarrollo personal. Un estudio longitudinal es aquel en el que se hace un seguimiento a participantes a lo largo del tiempo. Este estudio en concreto duró de 1985 a 1989 y en él participaron 11.601 estudiantes. Durante los cuatro años del estudio, los estudiantes fueron asignados aleatoriamente a clases pequeñas, a clases de tamaño normal o a clases de tamaño normal con ayuda. Aunque el programa se detuvo en 1989 después de que la primera clase de jardín de infancia del programa terminara el tercer grado, la recopilación de información (por ejemplo, el rendimiento en los exámenes de octavo grado, el promedio general de la escuela secundaria) continuó hasta el final de la asistencia de los participantes a la escuela secundaria.
¿Por qué son importantes este tipo de estudios? Porque constituyen evidencia para los tomadores de decisión de política pública. Pensemos que esto puede contribuir a definir si la política educativa debe apostar por salones de clases con grupos pequeños o no, pensando en fortalecer las competencias de los estudiantes.
No obstante, para esta sesión no vamos a examinar las hipótesis o resultados del trabajo de Mosteller (1995), pero sí vamos a utilizar parte de su base de datos para el análisis descriptivo.
Exploramos las variables que tiene nuestra base de datos:
chr, factor, ordered factor, num, int
names(data)
## [1] "race" "classtype" "yearssmall" "hsgrad" "g4math"
## [6] "g4reading"
str(data)
## 'data.frame': 1600 obs. of 6 variables:
## $ race : int 1 1 1 1 1 1 1 1 1 1 ...
## $ classtype : int 3 1 2 1 1 1 2 3 2 3 ...
## $ yearssmall: int 0 4 0 4 4 4 0 0 0 0 ...
## $ hsgrad : int 1 1 1 1 1 1 1 1 0 1 ...
## $ g4math : int 711 709 698 740 771 709 698 673 744 731 ...
## $ g4reading : int 750 725 692 836 725 761 778 665 735 698 ...
El contenido de cada variable lo podemos ver en la siguiente tabla:
Siempre antes de comenzar a realizar nuestro análisis, debemos identificar la estructura de las variables y verificar que estén bien “configuradas”. Es decir que la escala de la variable coincida con el objeto en R.
De “race”
table(data$race) #Exploramos frecuencias
##
## 1 2 3 6
## 1383 211 5 1
class(data$race) #Exploramos el formato de la variable
## [1] "integer"
data$race = factor(data$race, levels = c(1:6), labels = c("white","black","asian","hispanic","native american","others")) #Otorgamos formato
table(data$race)
##
## white black asian hispanic native american
## 1383 211 5 0 0
## others
## 1
class(data$race)
## [1] "factor"
De “classtype”:
class(data$classtype)
## [1] "integer"
table(data$classtype)
##
## 1 2 3
## 481 578 541
data$classtype = factor(data$classtype, levels = c(1:3), labels = c("small","regular","regular with aid"))
str(data$classtype)
## Factor w/ 3 levels "small","regular",..: 3 1 2 1 1 1 2 3 2 3 ...
table(data$classtype)
##
## small regular regular with aid
## 481 578 541
De “hsgrad”
class(data$hsgrad)
## [1] "integer"
table(data$hsgrad)
##
## 0 1
## 158 1442
data$hsgrad = factor(data$hsgrad, levels = c(0:1), labels = c("did not graduate","did graduate")) #ojo con el orden
table(data$hsgrad)
##
## did not graduate did graduate
## 158 1442
str(data$hsgrad)
## Factor w/ 2 levels "did not graduate",..: 2 2 2 2 2 2 2 2 1 2 ...
“g4math”, “g4reading”, “yearssmall” son variables numéricas y están configuradas como vectores numéricos de números enteros (integer) por lo cual lo dejamos así.
Entonces, una vez configurados adecuadamente nuestros objetos, pidamos los estadísticos de tendencia central para nuestras variables.
Antes instalamos algunos paquetes que utilizaremos
install.packages(“DescTools”) para pedir los estadísticos de tendencia central
install.packages(“e1071”) para asimetría y curtosis
Las variables solicitadas son race, classtype y hsgrad
Para “race” podemos:
library(DescTools)
Mode(data$race) #este comando nos permitirá calcular la moda
## [1] white
## attr(,"freq")
## [1] 1383
## Levels: white black asian hispanic native american others
Para “classtype”
table(data$classtype) #hacemos una tabla de frecuencia
##
## small regular regular with aid
## 481 578 541
prop.table(table(data$classtype))*100 #Sin embargo, esa tabla solo nos muestra la frecuencia absoluta. Con este comando podemos visualizar la frecuencia relativa porcentual
##
## small regular regular with aid
## 30.0625 36.1250 33.8125
Mode(data$classtype) #examinamos la moda
## [1] regular
## attr(,"freq")
## [1] 578
## Levels: small regular regular with aid
Para “hsgrad”
table(data$hsgrad)
##
## did not graduate did graduate
## 158 1442
prop.table(table(data$hsgrad))*100
##
## did not graduate did graduate
## 9.875 90.125
Mode(data$hsgrad)
## [1] did graduate
## attr(,"freq")
## [1] 1442
## Levels: did not graduate did graduate
Ahora vamos a graficar!!
Para “hsgrad” podemos
grafico1 <- table(data$hsgrad) #creamos un objeto que contenga la tabla de frecuencias dela variable
pie(grafico1) #con el comando pie creamos un gráfico de ese objeto
pie(grafico1, main = "Graduación en la escuela secundaria") #con el argumento main, colocamos el título
Para “classtype” podemos:
grafico2 <-table(data$classtype)
barplot(grafico2) #este comando nos permite hacer un gráfico de barras
barplot(grafico2, col="green") #agregando el argumento "col" especificamos el color del gráfico
barplot(grafico2,col="green",
xlab=NULL,
ylab="Estudiantes",
main="Tipo de clase") #agregando estos argumentos estamos estableciendo un nombre al eje "y", así como un título al gráfico
Para “g4math” podemos
summary (data$g4math) #el comando summary nos da los cuartiles y estadísticos de tendencia central de una variable numérica
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 487.0 692.0 712.0 712.7 738.0 821.0
# Desviación estándar
sd(data$g4math) #este comando nos permite calcular la desviación estándar
## [1] 41.6014
# Varianza
var(data$g4math) #este comando nos permite calcular la varianza
## [1] 1730.677
# Rango
rango=max(data$g4math)-min(data$g4math)
rango
## [1] 334
# Pedimos estadísticos de asimetría y curtosis
library(e1071)
skewness(data$g4math) #Asimetría
## [1] -0.7044214
kurtosis(data$g4math) #Curtosis
## [1] 4.498354
Ahora vamos a graficar!!
# Solicitamos un histograma
hist(data$g4math)
# Gráfico de boxplot (o de cajas y bigotes)
boxplot(data$g4math)
boxplot(data$g4math, main= "Boxplot de puntajes de matemática", col="blue")
boxplot(data$g4math~data$classtype)
¿Cómo exportamos la base de datos que hemos trabajado?
En muchos casos nos va ser útil exportar a CSV,lo podemos hacer con la función export del paquete rio (instalelo):
library(rio)
export(data, "midata.csv")
También podemos exportar en formato R:
#export(data,file="midata.Rda")
#export(data,file="midata.xlsx")
¿Cómo presentamos el trabajo realizado en este archivo Rmd?
Vamos a trabajar en archivos R markdown (Rmd), pero para presentarlos de una manera amigable, podemos exportarlos en formato PDF o Html, usando Knit
Para Html, seleccionamos en el menú Knit > Knit to html
Para pdf, seleccionamos Knit > Knit to PDF, pero antes de exportar en pdf deberá instalar lo siguiente desde su consola:
install.packages(‘tinytex’)
tinytex::install_tinytex()
Finalmente, podemos trabajar con RPubs -> https://rpubs.com/ReynaMOP/884362