En R, tenemos vectores, matrices, data.frames y listas.
Entender la lógica de estos objetos es importante antes de iniciar el trabajo con data secundaria.

1. CREAR SETS DE DATOS

CREAR VECTORES

Un vector es una coleccion de uno o mas datos del mismo tipo. Un vector puede incluir datos numericos, datos en texto o datos logicos (verdadero/falso).

Vector de cadena de texto

pais=c("Bolivia", "Colombia", "Ecuador", "Peru", "Argentina", "Brasil", "Chile", "Paraguay", "Uruguay")
pais
## [1] "Bolivia"   "Colombia"  "Ecuador"   "Peru"      "Argentina" "Brasil"   
## [7] "Chile"     "Paraguay"  "Uruguay"

Vector numerico

hab2022_millones=c(12.22, 51.87, 18, 34.05, 46.23, 215.3, 19.6, 6.8, 3.4)
hab2022_millones
## [1]  12.22  51.87  18.00  34.05  46.23 215.30  19.60   6.80   3.40

Vector logico

miembro_CAN=c(TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE)

Para visualizar los vectores que hemos creado podemos colocar el nombre de los vectores creados (pais, hab2022_millones, miembro_CAN) o utilizar la funcion print.

UNIR VECTORES EN UNA MATRIZ

Los vectores pueden unirse en una matriz. Una matri es una estructura de datos bidimensional (files y columnas) que coniene elementos del mismo tipo (solo datos numéricos o solo caracteres).

datosA <-cbind(pais, hab2022_millones, miembro_CAN) # cbind() une vectores, interpretando cada uno como una columna 
datosA
##       pais        hab2022_millones miembro_CAN
##  [1,] "Bolivia"   "12.22"          "TRUE"     
##  [2,] "Colombia"  "51.87"          "TRUE"     
##  [3,] "Ecuador"   "18"             "TRUE"     
##  [4,] "Peru"      "34.05"          "TRUE"     
##  [5,] "Argentina" "46.23"          "FALSE"    
##  [6,] "Brasil"    "215.3"          "FALSE"    
##  [7,] "Chile"     "19.6"           "FALSE"    
##  [8,] "Paraguay"  "6.8"            "FALSE"    
##  [9,] "Uruguay"   "3.4"            "FALSE"
datosB <-rbind(pais, hab2022_millones, miembro_CAN) # rbind() une vectores, interpretando cada uno como una fila
datosB 
##                  [,1]      [,2]       [,3]      [,4]    [,5]        [,6]    
## pais             "Bolivia" "Colombia" "Ecuador" "Peru"  "Argentina" "Brasil"
## hab2022_millones "12.22"   "51.87"    "18"      "34.05" "46.23"     "215.3" 
## miembro_CAN      "TRUE"    "TRUE"     "TRUE"    "TRUE"  "FALSE"     "FALSE" 
##                  [,7]    [,8]       [,9]     
## pais             "Chile" "Paraguay" "Uruguay"
## hab2022_millones "19.6"  "6.8"      "3.4"    
## miembro_CAN      "FALSE" "FALSE"    "FALSE"

Como es posible observar, a pesar de que los vectores iniciales eran numéricos, de texto y lógicos, al unirse en una matriz, todos son interpretados como cadenas de texto (chr).

str(datosA)
##  chr [1:9, 1:3] "Bolivia" "Colombia" "Ecuador" "Peru" "Argentina" "Brasil" ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : NULL
##   ..$ : chr [1:3] "pais" "hab2022_millones" "miembro_CAN"

UNIR VECTORES EN UN SET DE DATOS (DATAFRAME)

Finalmente, podemos crear datasets uniendo vectores.
Los dataframes, a diferencia de las matrices, permiten crear bases con datos de diferentes tipos (numericos, caracteres, factores, etc.)

datosC<- data.frame(pais, hab2022_millones, miembro_CAN)
datosC
##        pais hab2022_millones miembro_CAN
## 1   Bolivia            12.22        TRUE
## 2  Colombia            51.87        TRUE
## 3   Ecuador            18.00        TRUE
## 4      Peru            34.05        TRUE
## 5 Argentina            46.23       FALSE
## 6    Brasil           215.30       FALSE
## 7     Chile            19.60       FALSE
## 8  Paraguay             6.80       FALSE
## 9   Uruguay             3.40       FALSE

Tambien podemos crear un dataset desde cero

datosD <-data.frame(pais=c("Bolivia", "Colombia", "Ecuador", "Peru", "Argentina", "Brasil", "Chile", "Paraguay", "Uruguay"), hab2022_millones=c(12.22, 51.87, 18, 34.05, 46.23, 215.3, 19.6, 6.8, 3.4), miembro_CAN=c(TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE))
datosD
##        pais hab2022_millones miembro_CAN
## 1   Bolivia            12.22        TRUE
## 2  Colombia            51.87        TRUE
## 3   Ecuador            18.00        TRUE
## 4      Peru            34.05        TRUE
## 5 Argentina            46.23       FALSE
## 6    Brasil           215.30       FALSE
## 7     Chile            19.60       FALSE
## 8  Paraguay             6.80       FALSE
## 9   Uruguay             3.40       FALSE

Para entender las diferencias entre data.frame y cbind, podemos usar el comando class (que nos permite ver el “tipo” de datos)

class(datosA) # matriz
## [1] "matrix" "array"
class(datosC) # data.frame
## [1] "data.frame"
class(datosC$miembro_CAN) #data.frame
## [1] "logical"
str(datosC) #cada vector mantiene su estructura original.
## 'data.frame':    9 obs. of  3 variables:
##  $ pais            : chr  "Bolivia" "Colombia" "Ecuador" "Peru" ...
##  $ hab2022_millones: num  12.2 51.9 18 34 46.2 ...
##  $ miembro_CAN     : logi  TRUE TRUE TRUE TRUE FALSE FALSE ...

EJERCICIO

Ejercicio 1: Crea una base de datos de 3 filas y 5 columnas, que contenga un variable numerica, otra logica y otra de texto.

2. IMPORTAR Y EXPORTAR BASES DE DATOS

ESTABLECER DIRECTORIO DE TRABAJO

Cuando trabajamos en R es importante definir cual es nuestro espacio de trabajo (la carpeta en la que trabajaremos y se almacenaran nuestras BD, imagenes, etc.) getwd() muestra el directorio de trabajo actual, mientras que setwd()establece el directorio de trabajo.

getwd() # muestra el directorio de trabajo actual
## [1] "D:/Documentos/Trabajo/Docencia/PUCP/2025-2 Estadistica1/Practicas/LABs PUCP/P2"
setwd("D:/Documentos/Trabajo/Docencia/PUCP/2025-2 Estadistica1/Practicas/LABs PUCP/P2") #indica el directorio de trabajo donde quiero trabajar.

INSTALAR PAQUETES

Para importar/exportar algunos formatos es necesario instalar y abrir algunos paquetes.
En caso no se encuentren disponibles podras instalarlos con install.packages(""). Podemos guardarlo en formatos diferentes al original
Los paquetes que te permitiran abrir archivos en diferentes formatos son: openxlsx (para archivos en xlsx), readxl (para archivos en xlsx), haven (para archivos de stata y spss), rio (para archivos en diferentes formatos) entre otros.

Instalamos las librerias que usaremos en este laboratorio rio, dplyr, luridate, psych

IMPORTAR BASES DE DATOS

Trabajaremos con la base de datos del Siseve.
R puede trabajar con diversos tipos de archivos (csv, excel, spss, stata, google, dropbox, entre otros)

Importar archivos excel. En este caso, importaremos nuestra base de datos que esta en excel.

siseve <- import("Siseve2024.xlsx") # debo colocar el nombre de la base de datos tal como se encuentra guardado. 

EXPORTAR O GUARDAR BASES DE DATOS

Los comandos para guardar archivos en diferentes formatos son: write.csv(nombredebaseenR, "nombredebase.csv"), write_save(nombredebaseenR, "nombredebase.sav"), write_dta(nombredebaseenR, "nombredebase.dta")
En este caso exportaremos el documento a un formato en excel (.xlsx).

write.xlsx(siseve, file="siseve.xlsx") 

EJERCICIO

Ejercicio 2: Descarga una base de datos de la Plataforma Nacional de Datos Abiertos - Peru. Importa la base de datos a R y exportala en un formato diferente al original.

3. EXPLORACIONES PRELIMINARES

Realizamos algunas exploraciones

names(siseve) # brinda el nombre de las variables 
## [1] "FECHA_REPORTE"       "DRE"                 "UGEL"               
## [4] "NIVEL_EDUCATIVO"     "TIPO_REPORTE"        "TIPO_VIOLENCIA"     
## [7] "SUBTIPO_VIOLENCIA"   "TIPO_ESTADO_REPORTE"
head(siseve) # brinda una idea de la estructura de la base (10 primeros casos)
##   FECHA_REPORTE                    DRE                            UGEL
## 1    2024-07-31              DRE Cusco                   UGEL Urubamba
## 2    2024-07-31              DRE Cusco                   UGEL Urubamba
## 3    2024-07-31              DRE Tacna                      UGEL Tacna
## 4    2024-07-31 DRE Lima Metropolitana                 UGEL 03 Cercado
## 5    2024-07-31             DRE Loreto UGEL Alto Amazonas - Yurimaguas
## 6    2024-07-31 DRE Lima Metropolitana               UGEL 07 San Borja
##   NIVEL_EDUCATIVO            TIPO_REPORTE TIPO_VIOLENCIA SUBTIPO_VIOLENCIA
## 1        Primaria Personal IE a Escolares    Psicológica            Verbal
## 2        Primaria Personal IE a Escolares    Psicológica            Verbal
## 3        Primaria Personal IE a Escolares    Psicológica  Trato humillante
## 4        Primaria Personal IE a Escolares    Psicológica            Verbal
## 5      Secundaria Personal IE a Escolares    Psicológica            Verbal
## 6      Secundaria         Entre Escolares         Física      Sin lesiones
##               TIPO_ESTADO_REPORTE
## 1 Pendiente de atención por la IE
## 2 Pendiente de atención por la IE
## 3 Pendiente de atención por la IE
## 4             Atención en proceso
## 5             Atención en proceso
## 6             Atención en proceso
str(siseve) # brinda una idea de la estructura de la base (tipos de variables, etc.)
## 'data.frame':    81714 obs. of  8 variables:
##  $ FECHA_REPORTE      : POSIXct, format: "2024-07-31" "2024-07-31" ...
##  $ DRE                : chr  "DRE Cusco" "DRE Cusco" "DRE Tacna" "DRE Lima Metropolitana" ...
##  $ UGEL               : chr  "UGEL Urubamba" "UGEL Urubamba" "UGEL Tacna" "UGEL 03 Cercado" ...
##  $ NIVEL_EDUCATIVO    : chr  "Primaria" "Primaria" "Primaria" "Primaria" ...
##  $ TIPO_REPORTE       : chr  "Personal IE a Escolares" "Personal IE a Escolares" "Personal IE a Escolares" "Personal IE a Escolares" ...
##  $ TIPO_VIOLENCIA     : chr  "Psicológica" "Psicológica" "Psicológica" "Psicológica" ...
##  $ SUBTIPO_VIOLENCIA  : chr  "Verbal" "Verbal" "Trato humillante" "Verbal" ...
##  $ TIPO_ESTADO_REPORTE: chr  "Pendiente de atención por la IE" "Pendiente de atención por la IE" "Pendiente de atención por la IE" "Atención en proceso" ...
summary(siseve) #brinda un resumen de las variables de la base 
##  FECHA_REPORTE                     DRE                UGEL          
##  Min.   :2013-09-16 00:00:00   Length:81714       Length:81714      
##  1st Qu.:2018-08-24 00:00:00   Class :character   Class :character  
##  Median :2022-03-31 00:00:00   Mode  :character   Mode  :character  
##  Mean   :2020-11-05 21:35:29                                        
##  3rd Qu.:2023-08-01 00:00:00                                        
##  Max.   :2024-07-31 00:00:00                                        
##  NIVEL_EDUCATIVO    TIPO_REPORTE       TIPO_VIOLENCIA     SUBTIPO_VIOLENCIA 
##  Length:81714       Length:81714       Length:81714       Length:81714      
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  TIPO_ESTADO_REPORTE
##  Length:81714       
##  Class :character   
##  Mode  :character   
##                     
##                     
## 
describe(siseve) #brinda informacion general
## Warning in FUN(newX[, i], ...): ningún argumento finito para min; retornando
## Inf
## Warning in FUN(newX[, i], ...): ningun argumento finito para max; retornando
## -Inf
##                      vars     n  mean    sd median trimmed   mad min  max range
## FECHA_REPORTE           1 81714   NaN    NA     NA     NaN    NA Inf -Inf  -Inf
## DRE*                    2 81714 13.43  5.94     15   13.50  4.45   1   26    25
## UGEL*                   3 81714 72.74 72.50     40   64.68 51.89   1  223   222
## NIVEL_EDUCATIVO*        4 81714 10.40  0.97     11   10.59  0.00   1   11    10
## TIPO_REPORTE*           5 81714  1.43  0.49      1    1.41  0.00   1    2     1
## TIPO_VIOLENCIA*         6 81714  1.72  0.74      2    1.65  1.48   1    3     2
## SUBTIPO_VIOLENCIA*      7 81714 10.09  3.68     11   10.42  4.45   1   16    15
## TIPO_ESTADO_REPORTE*    8 81714  1.99  0.49      2    2.00  0.00   1    5     4
##                       skew kurtosis   se
## FECHA_REPORTE           NA       NA   NA
## DRE*                 -0.18    -0.35 0.02
## UGEL*                 0.67    -1.03 0.25
## NIVEL_EDUCATIVO*     -3.11    17.50 0.00
## TIPO_REPORTE*         0.30    -1.91 0.00
## TIPO_VIOLENCIA*       0.50    -1.05 0.00
## SUBTIPO_VIOLENCIA*   -0.74    -0.38 0.01
## TIPO_ESTADO_REPORTE*  2.84    18.18 0.00

Algunas bases de datos pueden incluir miles de variables o casos que no necesariamente son de nuestro interes. Por tanto, realizaremos algunas ediciones.  Ojo: Es importante registrar siempre las ediciones y decisiones que realizamos para garantizar la replicabilidad

CAMBIAR NOMBRES DE LA BASE DE DATOS

Para duplicar la base de datos con otro nombre

siseve24 <- siseve
rm(siseve) #eliminamos siseve para no confundirnos

CAMBIAR NOMBRES A VARIABLES

Esta base de datos cuenta con variables que son autoexplicativas, pero no siempre es asi. Al nombrar variables, se sugiere trabajar siempre con minusculas y sin muchos “-”.

names(siseve24) <- c("fecha", "dre", "ugel", "nivel_educativo", "tipo_reporte", "tipo_violencia", "subtipo_violencia", "estado_reporte")
names(siseve24) 
## [1] "fecha"             "dre"               "ugel"             
## [4] "nivel_educativo"   "tipo_reporte"      "tipo_violencia"   
## [7] "subtipo_violencia" "estado_reporte"

Tambien puedo cambiar solo el nombre de una variable. Por ejemplo, quiero cambiar el nombre de “dre” a “region”.

siseve24 <- rename(siseve24, region = dre)
names(siseve24) 
## [1] "fecha"             "region"            "ugel"             
## [4] "nivel_educativo"   "tipo_reporte"      "tipo_violencia"   
## [7] "subtipo_violencia" "estado_reporte"

SELECCIONAR CASOS

Esta base de datos incluye casos desde el 2013 hasta el 2024, pero solo me interesan aquellos casos del 2023. Para esto, filtramos los casos que corresponden al 2023.  Ojo: No siempre el numero de casos coincide con el numero de filas

siseve23 <- siseve24 %>% 
  filter(year(fecha) == 2023) #estoy creando una nueva base
nrow(siseve24) #en este caso cada fila corresponde a un caso 
## [1] 81714
nrow(siseve23) #en este caso cada fila corresponde a un caso 
## [1] 19788

SELECCIONAR VARIABLES

Ahora que todos los casos pertenecen son del 2023, la variable fecha deja de ser relevante para mi analisis. Para eliminar la variable:

siseve23.1 <- siseve23 %>%
  select(-fecha)
names(siseve23.1) 
## [1] "region"            "ugel"              "nivel_educativo"  
## [4] "tipo_reporte"      "tipo_violencia"    "subtipo_violencia"
## [7] "estado_reporte"

Solo me interesa trabajar con las variables region, nivel_educativo, tipo_violencia

siseve23.2 <- siseve23.1 %>%
  select(region, nivel_educativo, tipo_violencia)
names(siseve23.2)  
## [1] "region"          "nivel_educativo" "tipo_violencia"

Este procedimiento hace mas sentido en bases de mas variables

EJERCICIO

Ejercicio 3: Crea una base de datos que solo incluya informacion del nivel secundaria del año 2023.