El presente documento tiene como objetivo realizar una exploración inicial y transformación de la base de datos relacionada con el rendimiento estudiantil, correspondiente al estudio realizado por Cortez y Silva (2008).
La información será analizada mediante diferentes funciones de R, con el propósito de identificar la estructura de la base, revisar el tipo de variables y realizar algunas transformaciones.
También se realizarán procesos de codificación numérica, conversión de variables categóricas a factores y transformación de una variable categórica ordinal en un factor ordenado.
El desarrollo del documento se realizará siguiendo los siguientes pasos:
Se revisarán principalmente:
# Indicar a R dónde se encuentra la base de datos
setwd("~/Anto ( Doc )/Diplomado Anto sep/Modulo 2")
# Visualizar los archivos contenidos dentro de la ubicación
list.files()
## [1] "estilo_letra.css" "Markdown(2).R"
## [3] "rendimiento_estudiantil.html" "rendimiento_estudiantil.Rmd"
## [5] "Rscript_Actividad_2.R" "student-mat.csv"
## [7] "tiempo de estudio semanal.png"
# Cargar librería necesaria
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Importar la base de datos
datos <- read.csv("student-mat.csv", sep = ";")
Una vez importada la base, se realiza una exploración inicial para conocer sus principales características.
# Primeras observaciones
head(datos)
## school sex age address famsize Pstatus Medu Fedu Mjob Fjob reason
## 1 GP F 18 U GT3 A 4 4 at_home teacher course
## 2 GP F 17 U GT3 T 1 1 at_home other course
## 3 GP F 15 U LE3 T 1 1 at_home other other
## 4 GP F 15 U GT3 T 4 2 health services home
## 5 GP F 16 U GT3 T 3 3 other other home
## 6 GP M 16 U LE3 T 4 3 services other reputation
## guardian traveltime studytime failures schoolsup famsup paid activities
## 1 mother 2 2 0 yes no no no
## 2 father 1 2 0 no yes no no
## 3 mother 1 2 3 yes no yes no
## 4 mother 1 3 0 no yes yes yes
## 5 father 1 2 0 no yes yes no
## 6 mother 1 2 0 no yes yes yes
## nursery higher internet romantic famrel freetime goout Dalc Walc health
## 1 yes yes no no 4 3 4 1 1 3
## 2 no yes yes no 5 3 3 1 1 3
## 3 yes yes yes no 4 3 2 2 3 3
## 4 yes yes yes yes 3 2 2 1 1 5
## 5 yes yes no no 4 3 2 1 2 5
## 6 yes yes yes no 5 4 2 1 2 5
## absences G1 G2 G3
## 1 6 5 6 6
## 2 4 5 5 6
## 3 10 7 8 10
## 4 2 15 14 15
## 5 4 6 10 10
## 6 10 15 15 15
# Últimas observaciones
tail(datos)
## school sex age address famsize Pstatus Medu Fedu Mjob Fjob reason
## 390 MS F 18 U GT3 T 1 1 other other course
## 391 MS M 20 U LE3 A 2 2 services services course
## 392 MS M 17 U LE3 T 3 1 services services course
## 393 MS M 21 R GT3 T 1 1 other other course
## 394 MS M 18 R LE3 T 3 2 services other course
## 395 MS M 19 U LE3 T 1 1 other at_home course
## guardian traveltime studytime failures schoolsup famsup paid activities
## 390 mother 2 2 1 no no no yes
## 391 other 1 2 2 no yes yes no
## 392 mother 2 1 0 no no no no
## 393 other 1 1 3 no no no no
## 394 mother 3 1 0 no no no no
## 395 father 1 1 0 no no no no
## nursery higher internet romantic famrel freetime goout Dalc Walc health
## 390 yes yes no no 1 1 1 1 1 5
## 391 yes yes no no 5 5 4 4 5 4
## 392 no yes yes no 2 4 5 3 4 2
## 393 no yes no no 5 5 3 3 3 3
## 394 no yes yes no 4 4 1 3 4 5
## 395 yes yes yes no 3 2 3 3 3 5
## absences G1 G2 G3
## 390 0 6 5 0
## 391 11 9 9 9
## 392 3 14 16 16
## 393 3 10 8 7
## 394 0 11 12 10
## 395 5 8 9 9
# Nombres de las variables
names(datos)
## [1] "school" "sex" "age" "address" "famsize"
## [6] "Pstatus" "Medu" "Fedu" "Mjob" "Fjob"
## [11] "reason" "guardian" "traveltime" "studytime" "failures"
## [16] "schoolsup" "famsup" "paid" "activities" "nursery"
## [21] "higher" "internet" "romantic" "famrel" "freetime"
## [26] "goout" "Dalc" "Walc" "health" "absences"
## [31] "G1" "G2" "G3"
# Dimensiones de la base
dim(datos)
## [1] 395 33
# Resumen de las variables
summary(datos)
## school sex age address famsize
## Length :395 Length :395 Min. :15.0 Length :395 Length :395
## N.unique : 2 N.unique : 2 1st Qu.:16.0 N.unique : 2 N.unique : 2
## N.blank : 0 N.blank : 0 Median :17.0 N.blank : 0 N.blank : 0
## Min.nchar: 2 Min.nchar: 1 Mean :16.7 Min.nchar: 1 Min.nchar: 3
## Max.nchar: 2 Max.nchar: 1 3rd Qu.:18.0 Max.nchar: 1 Max.nchar: 3
## Max. :22.0
## Pstatus Medu Fedu Mjob
## Length :395 Min. :0.000 Min. :0.000 Length :395
## N.unique : 2 1st Qu.:2.000 1st Qu.:2.000 N.unique : 5
## N.blank : 0 Median :3.000 Median :2.000 N.blank : 0
## Min.nchar: 1 Mean :2.749 Mean :2.522 Min.nchar: 5
## Max.nchar: 1 3rd Qu.:4.000 3rd Qu.:3.000 Max.nchar: 8
## Max. :4.000 Max. :4.000
## Fjob reason guardian traveltime
## Length :395 Length :395 Length :395 Min. :1.000
## N.unique : 5 N.unique : 4 N.unique : 3 1st Qu.:1.000
## N.blank : 0 N.blank : 0 N.blank : 0 Median :1.000
## Min.nchar: 5 Min.nchar: 4 Min.nchar: 5 Mean :1.448
## Max.nchar: 8 Max.nchar: 10 Max.nchar: 6 3rd Qu.:2.000
## Max. :4.000
## studytime failures schoolsup famsup
## Min. :1.000 Min. :0.0000 Length :395 Length :395
## 1st Qu.:1.000 1st Qu.:0.0000 N.unique : 2 N.unique : 2
## Median :2.000 Median :0.0000 N.blank : 0 N.blank : 0
## Mean :2.035 Mean :0.3342 Min.nchar: 2 Min.nchar: 2
## 3rd Qu.:2.000 3rd Qu.:0.0000 Max.nchar: 3 Max.nchar: 3
## Max. :4.000 Max. :3.0000
## paid activities nursery higher
## Length :395 Length :395 Length :395 Length :395
## N.unique : 2 N.unique : 2 N.unique : 2 N.unique : 2
## N.blank : 0 N.blank : 0 N.blank : 0 N.blank : 0
## Min.nchar: 2 Min.nchar: 2 Min.nchar: 2 Min.nchar: 2
## Max.nchar: 3 Max.nchar: 3 Max.nchar: 3 Max.nchar: 3
##
## internet romantic famrel freetime
## Length :395 Length :395 Min. :1.000 Min. :1.000
## N.unique : 2 N.unique : 2 1st Qu.:4.000 1st Qu.:3.000
## N.blank : 0 N.blank : 0 Median :4.000 Median :3.000
## Min.nchar: 2 Min.nchar: 2 Mean :3.944 Mean :3.235
## Max.nchar: 3 Max.nchar: 3 3rd Qu.:5.000 3rd Qu.:4.000
## Max. :5.000 Max. :5.000
## goout Dalc Walc health
## Min. :1.000 Min. :1.000 Min. :1.000 Min. :1.000
## 1st Qu.:2.000 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:3.000
## Median :3.000 Median :1.000 Median :2.000 Median :4.000
## Mean :3.109 Mean :1.481 Mean :2.291 Mean :3.554
## 3rd Qu.:4.000 3rd Qu.:2.000 3rd Qu.:3.000 3rd Qu.:5.000
## Max. :5.000 Max. :5.000 Max. :5.000 Max. :5.000
## absences G1 G2 G3
## Min. : 0.000 Min. : 3.00 Min. : 0.00 Min. : 0.00
## 1st Qu.: 0.000 1st Qu.: 8.00 1st Qu.: 9.00 1st Qu.: 8.00
## Median : 4.000 Median :11.00 Median :11.00 Median :11.00
## Mean : 5.709 Mean :10.91 Mean :10.71 Mean :10.42
## 3rd Qu.: 8.000 3rd Qu.:13.00 3rd Qu.:13.00 3rd Qu.:14.00
## Max. :75.000 Max. :19.00 Max. :19.00 Max. :20.00
# Clase general de la base
class(datos)
## [1] "data.frame"
# Estructura de la base
str(datos)
## 'data.frame': 395 obs. of 33 variables:
## $ school : chr "GP" "GP" "GP" "GP" ...
## $ sex : chr "F" "F" "F" "F" ...
## $ age : int 18 17 15 15 16 16 16 17 15 15 ...
## $ address : chr "U" "U" "U" "U" ...
## $ famsize : chr "GT3" "GT3" "LE3" "GT3" ...
## $ Pstatus : chr "A" "T" "T" "T" ...
## $ Medu : int 4 1 1 4 3 4 2 4 3 3 ...
## $ Fedu : int 4 1 1 2 3 3 2 4 2 4 ...
## $ Mjob : chr "at_home" "at_home" "at_home" "health" ...
## $ Fjob : chr "teacher" "other" "other" "services" ...
## $ reason : chr "course" "course" "other" "home" ...
## $ guardian : chr "mother" "father" "mother" "mother" ...
## $ traveltime: int 2 1 1 1 1 1 1 2 1 1 ...
## $ studytime : int 2 2 2 3 2 2 2 2 2 2 ...
## $ failures : int 0 0 3 0 0 0 0 0 0 0 ...
## $ schoolsup : chr "yes" "no" "yes" "no" ...
## $ famsup : chr "no" "yes" "no" "yes" ...
## $ paid : chr "no" "no" "yes" "yes" ...
## $ activities: chr "no" "no" "no" "yes" ...
## $ nursery : chr "yes" "no" "yes" "yes" ...
## $ higher : chr "yes" "yes" "yes" "yes" ...
## $ internet : chr "no" "yes" "yes" "yes" ...
## $ romantic : chr "no" "no" "no" "yes" ...
## $ famrel : int 4 5 4 3 4 5 4 4 4 5 ...
## $ freetime : int 3 3 3 2 3 4 4 1 2 5 ...
## $ goout : int 4 3 2 2 2 2 4 4 2 1 ...
## $ Dalc : int 1 1 2 1 1 1 1 1 1 1 ...
## $ Walc : int 1 1 3 1 2 2 1 1 1 1 ...
## $ health : int 3 3 3 5 5 5 3 1 1 5 ...
## $ absences : int 6 4 10 2 4 10 0 6 0 0 ...
## $ G1 : int 5 5 7 15 6 15 12 6 16 14 ...
## $ G2 : int 6 5 8 14 10 15 12 5 18 15 ...
## $ G3 : int 6 6 10 15 10 15 11 6 19 15 ...
# Vista resumida de la estructura
glimpse(datos)
## Rows: 395
## Columns: 33
## $ school <chr> "GP", "GP", "GP", "GP", "GP", "GP", "GP", "GP", "GP", "GP",…
## $ sex <chr> "F", "F", "F", "F", "F", "M", "M", "F", "M", "M", "F", "F",…
## $ age <int> 18, 17, 15, 15, 16, 16, 16, 17, 15, 15, 15, 15, 15, 15, 15,…
## $ address <chr> "U", "U", "U", "U", "U", "U", "U", "U", "U", "U", "U", "U",…
## $ famsize <chr> "GT3", "GT3", "LE3", "GT3", "GT3", "LE3", "LE3", "GT3", "LE…
## $ Pstatus <chr> "A", "T", "T", "T", "T", "T", "T", "A", "A", "T", "T", "T",…
## $ Medu <int> 4, 1, 1, 4, 3, 4, 2, 4, 3, 3, 4, 2, 4, 4, 2, 4, 4, 3, 3, 4,…
## $ Fedu <int> 4, 1, 1, 2, 3, 3, 2, 4, 2, 4, 4, 1, 4, 3, 2, 4, 4, 3, 2, 3,…
## $ Mjob <chr> "at_home", "at_home", "at_home", "health", "other", "servic…
## $ Fjob <chr> "teacher", "other", "other", "services", "other", "other", …
## $ reason <chr> "course", "course", "other", "home", "home", "reputation", …
## $ guardian <chr> "mother", "father", "mother", "mother", "father", "mother",…
## $ traveltime <int> 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 1, 2, 1, 1, 1, 3, 1, 1,…
## $ studytime <int> 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 1, 2, 3, 1, 3, 2, 1, 1,…
## $ failures <int> 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0,…
## $ schoolsup <chr> "yes", "no", "yes", "no", "no", "no", "no", "yes", "no", "n…
## $ famsup <chr> "no", "yes", "no", "yes", "yes", "yes", "no", "yes", "yes",…
## $ paid <chr> "no", "no", "yes", "yes", "yes", "yes", "no", "no", "yes", …
## $ activities <chr> "no", "no", "no", "yes", "no", "yes", "no", "no", "no", "ye…
## $ nursery <chr> "yes", "no", "yes", "yes", "yes", "yes", "yes", "yes", "yes…
## $ higher <chr> "yes", "yes", "yes", "yes", "yes", "yes", "yes", "yes", "ye…
## $ internet <chr> "no", "yes", "yes", "yes", "no", "yes", "yes", "no", "yes",…
## $ romantic <chr> "no", "no", "no", "yes", "no", "no", "no", "no", "no", "no"…
## $ famrel <int> 4, 5, 4, 3, 4, 5, 4, 4, 4, 5, 3, 5, 4, 5, 4, 4, 3, 5, 5, 3,…
## $ freetime <int> 3, 3, 3, 2, 3, 4, 4, 1, 2, 5, 3, 2, 3, 4, 5, 4, 2, 3, 5, 1,…
## $ goout <int> 4, 3, 2, 2, 2, 2, 4, 4, 2, 1, 3, 2, 3, 3, 2, 4, 3, 2, 5, 3,…
## $ Dalc <int> 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,…
## $ Walc <int> 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 2, 1, 3, 2, 1, 2, 2, 1, 4, 3,…
## $ health <int> 3, 3, 3, 5, 5, 5, 3, 1, 1, 5, 2, 4, 5, 3, 3, 2, 2, 4, 5, 5,…
## $ absences <int> 6, 4, 10, 2, 4, 10, 0, 6, 0, 0, 0, 4, 2, 2, 0, 4, 6, 4, 16,…
## $ G1 <int> 5, 5, 7, 15, 6, 15, 12, 6, 16, 14, 10, 10, 14, 10, 14, 14, …
## $ G2 <int> 6, 5, 8, 14, 10, 15, 12, 5, 18, 15, 8, 12, 14, 10, 16, 14, …
## $ G3 <int> 6, 6, 10, 15, 10, 15, 11, 6, 19, 15, 9, 12, 14, 11, 16, 14,…
Se revisa como R reconoce algunas de las variables seleccionadas.
Para ello se utiliza class() y typeof(), lo
que permite identificar la clase y el tipo de almacenamiento de cada
variable.
# Clase de las variables
class(datos$school)
## [1] "character"
class(datos$sex)
## [1] "character"
class(datos$address)
## [1] "character"
class(datos$Pstatus)
## [1] "character"
class(datos$studytime)
## [1] "integer"
class(datos$schoolsup)
## [1] "character"
# Tipo de almacenamiento
typeof(datos$school)
## [1] "character"
typeof(datos$sex)
## [1] "character"
typeof(datos$address)
## [1] "character"
typeof(datos$Pstatus)
## [1] "character"
typeof(datos$studytime)
## [1] "integer"
typeof(datos$schoolsup)
## [1] "character"
Se Seleccionan dos variables categóricas que inicialmente se encuentran representadas mediante texto y se crean nuevas variables utilizando una codificación numérica.
La variable school identifica la institución educativa
del estudiante. Para realizar la codificación se establece:
datos$school_cod <- ifelse(
datos$school == "GP", 1, 2
)
# Verificar la clase de la nueva variable
class(datos$school_cod)
## [1] "numeric"
# Comprobar la correspondencia entre la categoría y el código asignado
table(datos$school, datos$school_cod)
##
## 1 2
## GP 349 0
## MS 0 46
La variable sex representa el sexo del estudiante. Para
realizar la codificación numérica se establece:
datos$sex_cod <- ifelse(
datos$sex == "F", 1, 2
)
# Verificar la clase de la nueva variable
class(datos$sex_cod)
## [1] "numeric"
# Comprobar la correspondencia entre la categoría y el código asignado
table(datos$sex, datos$sex_cod)
##
## 1 2
## F 208 0
## M 0 187
Las variables categóricas pueden convertirse en factores para que R
las reconozca como variables cualitativas con categorías definidas. Por
lo que se seleccionaron doS variables address y
Pstatus.
La variable address identifica la zona de residencia del
estudiante:
datos$address <- factor(datos$address)
# Verificar la clase
class(datos$address)
## [1] "factor"
# Mostrar las categorías
levels(datos$address)
## [1] "R" "U"
# Revisar la estructura
str(datos$address)
## Factor w/ 2 levels "R","U": 2 2 2 2 2 2 2 2 2 2 ...
La variable Pstatus identifica la situación de
convivencia de los padres:
datos$Pstatus <- factor(datos$Pstatus)
# Verificar la clase
class(datos$Pstatus)
## [1] "factor"
# Mostrar las categorías
levels(datos$Pstatus)
## [1] "A" "T"
# Revisar la estructura
str(datos$Pstatus)
## Factor w/ 2 levels "A","T": 1 2 2 2 2 2 2 1 1 2 ...
La variable studytime representa el tiempo dedicado al
estudio y presenta categorías que tienen un orden
natural.
Por esta razón, se transforma en un factor ordenado, manteniendo la jerarquía entre sus categorías.
Las categorías se organizan de menor a mayor tiempo dedicado al estudio:
datos$studytime <- factor(
datos$studytime,
levels = 1:4,
labels = c(
"Menos de 2 horas",
"2 a 5 horas",
"5 a 10 horas",
"Más de 10 horas"
),
ordered = TRUE
)
# Primeras observaciones
head(datos$studytime)
## [1] 2 a 5 horas 2 a 5 horas 2 a 5 horas 5 a 10 horas 2 a 5 horas
## [6] 2 a 5 horas
## 4 Levels: Menos de 2 horas < 2 a 5 horas < ... < Más de 10 horas
# Revisar la estructura
str(datos$studytime)
## Ord.factor w/ 4 levels "Menos de 2 horas"<..: 2 2 2 3 2 2 2 2 2 2 ...
# Mostrar las categorías
levels(datos$studytime)
## [1] "Menos de 2 horas" "2 a 5 horas" "5 a 10 horas" "Más de 10 horas"
# Verificar la clase
class(datos$studytime)
## [1] "ordered" "factor"
# Verificar que sea un factor ordenado
is.ordered(datos$studytime)
## [1] TRUE
# Tabla de frecuencias
table(datos$studytime)
##
## Menos de 2 horas 2 a 5 horas 5 a 10 horas Más de 10 horas
## 105 198 65 27
La variable health representa el estado de salud del
estudiante y se transformó a un factor ordinal que incluye 5 categorías,
desde “muy mala” hasta “Muy buena”, conservando un orden jerárquico.
datos$health <- factor(
datos$health,
levels = 1:5,
labels = c(
"Muy mala",
"Mala",
"Regular",
"Buena",
"Muy buena"
),
ordered = TRUE
)
head(datos$health)
## [1] Regular Regular Regular Muy buena Muy buena Muy buena
## Levels: Muy mala < Mala < Regular < Buena < Muy buena
str(datos$health)
## Ord.factor w/ 5 levels "Muy mala"<"Mala"<..: 3 3 3 5 5 5 3 1 1 5 ...
levels(datos$health)
## [1] "Muy mala" "Mala" "Regular" "Buena" "Muy buena"
class(datos$health)
## [1] "ordered" "factor"
is.ordered(datos$health)
## [1] TRUE
table(datos$health)
##
## Muy mala Mala Regular Buena Muy buena
## 47 45 91 66 146
La variable freetime representa el tiempo libre del
estudiante después de la escuela, esta se transformó a un factor ordinal
que incluye 5 categorías desde “Muy bajo” hasta “Muy alto”, conservando
un orden jerárquico.
datos$freetime <- factor(
datos$freetime,
levels = 1:5,
labels = c(
"Muy bajo",
"Bajo",
"Medio",
"Alto",
"Muy alto"
),
ordered = TRUE
)
head(datos$freetime)
## [1] Medio Medio Medio Bajo Medio Alto
## Levels: Muy bajo < Bajo < Medio < Alto < Muy alto
str(datos$freetime)
## Ord.factor w/ 5 levels "Muy bajo"<"Bajo"<..: 3 3 3 2 3 4 4 1 2 5 ...
levels(datos$freetime)
## [1] "Muy bajo" "Bajo" "Medio" "Alto" "Muy alto"
class(datos$freetime)
## [1] "ordered" "factor"
is.ordered(datos$freetime)
## [1] TRUE
table(datos$freetime)
##
## Muy bajo Bajo Medio Alto Muy alto
## 19 64 157 115 40
Ahora una de las varibales contrarias, es studytimeque
representa la cantidad de horas que se dedica al tiempo de estudio, por
lo que la imagen muestra que los estudiantes, dedican su tiempo de
estudio en rangos inferiores a 5 horas semanales.
Finalmente, se crean algunas variables derivadas a partir de condiciones presentes en la base original. Estas variables permiten identificar características específicas de los estudiantes.
Se crea una variable lógica que identifica a los estudiantes que viven en una zona rural y cuentan con acceso a internet.
datos$rural_con_internet <-
datos$address == "R" & datos$internet == "yes"
table(datos$rural_con_internet)
##
## FALSE TRUE
## 335 60
Se crea una variable que identifica si al menos uno de los padres presenta el nivel de educación superior correspondiente al código 4.
datos$algun_padre_educacion_superior <-
datos$Medu == 4 | datos$Fedu == 4
table(datos$algun_padre_educacion_superior)
##
## FALSE TRUE
## 238 157
Se crea una variable que identifica los casos en los que el estudiante presenta un nivel alto de consumo de alcohol durante la semana o durante el fin de semana.
datos$alto_consumo_alcohol <-
datos$Dalc >= 4 | datos$Walc >= 4
table(datos$alto_consumo_alcohol)
##
## FALSE TRUE
## 314 81
La base de datos utilizada corresponde al conjunto Student Performance, disponible en el Repositorio de Aprendizaje Automático de la UCI.
A partir de la exploración inicial fue posible identificar la estructura de la base de datos y la forma en que R almacena las diferentes variables.
La codificación de school y sex permitió
representar sus categorías mediante valores numéricos. Por otra parte,
address y Pstatus fueron convertidas en
factores para facilitar su tratamiento como variables categóricas.
La variable studytime fue transformada en un factor
ordenado debido a que sus categorías presentan una jerarquía natural. De
manera adicional, freetime y health también
fueron transformadas conservando el orden de sus categorías.
Finalmente, se crearon nuevas variables relacionadas con el acceso a internet, el nivel educativo de los padres y el consumo de alcohol, complementando así la exploración inicial de la base.