FACULTAD DE CIENCIAS SOCIALES - PUCP
R es un lenguaje de programación y un entorno de software libre y de código abierto utilizado para análisis estadístico y visualización de datos. Fue desarrollado por Ross Ihaka y Robert Gentleman en la Universidad de Auckland, Nueva Zelanda, en 1993. Desde entonces, ha sido ampliamente adoptado por la comunidad científica y empresarial como una herramienta esencial para el análisis y la visualización de datos.
R cuenta con una amplia variedad de paquetes y bibliotecas que permiten el análisis estadístico, la minería de datos, el aprendizaje automático, la visualización de datos y la generación de informes. Además, su sintaxis es relativamente sencilla, lo que facilita su aprendizaje y uso para personas con distintos niveles de experiencia en programación, lo cual ha significado su uso en diversos rubros.
Instalar R
Instalar RStudio
R funciona como un entorno temporal de trabajo, lo que quiere decir que el usuario va agregando datos y objetos. Sin embargo, 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() #para saber en qué carpeta está el archivo
## [1] "/Volumes/Macintosh HD - Datos/12 PUCP-Docencia/2025/Estadística 1/Estadistica1CienciaPolitica"
library(vembedr)
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 “=”, para motivos del curso usaremos este último.
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")
library(rio) #Convocamos el paquete
data=import("Democracy2024.xlsx") #Utilizamos la función import (importar) que creará un objeto que contenga la base de datos del archivo "DemocracyIndex2022.xlsx" la cual hemos descargado.
#Podemos verificar la creación del objeto en el environment (ventana derecha superior)
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"
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 (ordered)
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 (bd) que tiene filas y columnas. Creemos la base de datos “PP2024” que contenga todos los objetos que hemos creado:
PP2024 = data.frame(Prioridad,Presupuesto_millones,Ejecucion)
PP2024 # 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(PP2024) # Visualice la estructura de la BD
## '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(PP2024) #Visualice los nombres de las variables de la BD
## [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.
PP2024$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(PP2024$Ejecucion) #vemos de que clase es la variable ejecución de la data frame
## [1] "ordered" "factor"
¿Cuál es el estado de la democracia en el mundo?
El índice de democracia (Democracy Index) es un índice que mide la calidad de la democracia en el mundo. Mide diversas categorías como libertades civiles, cultura política, pluralismo electoral, etc. A partir de estas variables, se obtiene un puntaje promedio, el cual determina el puesto del país a nivel mundial, así como el tipo de régimen que tiene cada uno.
En esta ocasión, usaremos la base de datos del informe de 2022, publicado por The Economist Inteligence Unit (EIU). El link es el que se muestra a continuación: “https://www.eiu.com/n/campaigns/democracy-index-2022/”
Ahora, toca responder la pregunta de investigación: ¿Cuál es el estado de la democracia en el mundo?
¡Manos a la obra!
Importemos nuestra base de datos.
library(rio)
data=import("Democracy2024.xlsx")
Es necesario saber el tipo de variable que vamos a trabajar. Por ello, exploramos las variables que tiene nuestra base de datos:
names(data)
## [1] "Pais" "Region" "Puntaje" "Regimen"
str(data)
## 'data.frame': 167 obs. of 4 variables:
## $ Pais : chr "Noruega" "Nueva Zelanda" "Suecia" "Islandia" ...
## $ Region : chr "Europa" "Oceania" "Europa" "Europa" ...
## $ Puntaje: num 9.81 9.61 9.39 9.38 9.32 9.3 9.28 9.19 9 8.88 ...
## $ Regimen: chr "Democracia plena" "Democracia plena" "Democracia plena" "Democracia plena" ...
El contenido de cada variable lo podemos observar en el siguiente diccionario de datos:
Pais: nombre del pais
Puntaje: puntaje promedio del país.
Regimen: tipo de régimen.
Region: región (continente) a la que pertenece el país analizado.
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.
Por ejemplo, debemos asegurarnos que una variable categórica no esté configurada como numérica en R, y viceversa.
Variable “Regimen”:
Queremos saber el tipo de régimen de cada país observado. Para ello,
realizamos el análisis de la variable en cuestión
Regimen
class(data$Regimen)
## [1] "character"
library(tidyverse)
data %>%
group_by(Regimen) %>%
summarize(Freq=n())
## # A tibble: 4 × 2
## Regimen Freq
## <chr> <int>
## 1 Democracia imperfecta 46
## 2 Democracia plena 25
## 3 Regimen autoritario 60
## 4 Regimen hibrido 36
Se observa que, de los países analizados en el índice de la democracia, 60 países son coniderados como Autoritarismo, 36 como Regímenes híbridos, 46 como Democracia imperfecta y solo 25 como Democracia Plena.
Creemos un gráfico de barras para visualizar mejor los países por tipo de régimen.
para_graficoReg=data %>%
group_by(Regimen) %>%
summarize(Freq=n())#tabla de frecuencias
library(ggplot2)
ggplot(para_graficoReg, aes(x=Regimen, y=Freq, fill=Regimen)) +
geom_bar(stat = "identity")
Ahora, adaptemos el diseño del gráfico
library(ggplot2)
ggplot(para_graficoReg, aes(reorder(x=Regimen,-Freq), y=Freq, fill=Regimen)) +
geom_bar(stat = "identity")+
ggtitle("Distribución de países por tipo de régimen") +
xlab("Tipo de régimen") + ylab("Frecuencia")+
geom_text(aes(label=round(Freq,1)), vjust=1.30, color="black", size=3)+
scale_fill_brewer(name="Tipo de Régimen",palette="Pastel1")+
theme(panel.background=element_rect(fill = "white", colour = "white"))
Las demás variables son 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 de interés.
Antes instalamos los paquetes que utilizaremos
install.packages("DescTools")
para
pedir los estadísticos de tendencia centralPara ello, usamos el comando mean
que significa “media o
promedio”.
library(DescTools)
library(tidyverse)
data %>% summarise(media = mean(Puntaje)) #este comando nos permitirá calcular la media. Consejo: leer este comando de derecha a izquierda
## media
## 1 5.174551
Este resultado quiere decir que el puntaje promedio de todos los países analizados es de 5.17 puntos.
En segundo lugar, calculamos la mediana de los puntajes. Esta medida es más robusta que la media, pues resiste valores extremos.
library(DescTools)
data %>% summarise(mediana = median(Puntaje)) #calcular la mediana. Al igual que con la media, se sugiere leer el comando de derecha a izquierda.
## mediana
## 1 5.32
Esto quiere decir que, hasta la mitad de países analizados tienen una puntuación de hasta 5.32 puntos.
Grafiquemos 🎨
Como la variable Puntaje
es numérica, esta vez pediremos
un histograma.
names(data)
## [1] "Pais" "Region" "Puntaje" "Regimen"
library(ggplot2) #no olvidar llamar al paquete
data %>%
ggplot(aes(x=Puntaje)) +
geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Si lo queremos personalizar :)
data %>%
ggplot(aes(x = Puntaje)) +
geom_histogram(color = "blue", fill = "#90EE90", bins = 30) +
geom_text(stat = 'bin', aes(y = stat(count), label = stat(count)), vjust = -0.5, size = 3, color = "black") +
ggtitle("Puntaje promedio por país") +
scale_y_continuous(breaks = seq(0, 12, by = 2), labels = seq(0, 12, by = 2)) +
expand_limits(y = 12) +
geom_vline(xintercept = mean(data$Puntaje, na.rm = TRUE), color = "red", linetype = "dashed", size = 1) + # Línea de la media
geom_vline(xintercept = median(data$Puntaje, na.rm = TRUE), color = "blue", linetype = "dashed", size = 1) + # Línea de la mediana
theme_minimal()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
El histograma muestra una distribución asimétrica sesgada con ligero sesgo negativo o a la izquierda. Esto quiere decir que existe una concentración de datos hacia la derecha.
También podemos dividir las medias por grupo. Para ello, usamos el comando “group_by”.
data%>%
group_by(Region)%>%
summarise(media=mean(Puntaje))
## # A tibble: 5 × 2
## Region media
## <chr> <dbl>
## 1 Africa 3.92
## 2 America 5.91
## 3 Asia 4.17
## 4 Europa 7.3
## 5 Oceania 7.46
Podemos realizar la misma operación con la mediana
data%>%
group_by(Region)%>%
summarise(mediana=median(Puntaje))
## # A tibble: 5 × 2
## Region mediana
## <chr> <dbl>
## 1 Africa 3.38
## 2 America 6.42
## 3 Asia 3.48
## 4 Europa 7.74
## 5 Oceania 7.41
Y también podemos resumir todo en una misma tabla. Este tipo de tabla se llama Tabla resumen
data%>%
group_by(Region)%>%
summarise(media=mean(Puntaje), mediana=median(Puntaje))
## # A tibble: 5 × 3
## Region media mediana
## <chr> <dbl> <dbl>
## 1 Africa 3.92 3.38
## 2 America 5.91 6.42
## 3 Asia 4.17 3.48
## 4 Europa 7.3 7.74
## 5 Oceania 7.46 7.41