Introducción
El siguiente documento presenta el desarrollo del taller 1 de la clase de Análisis exploratorio de datos, el cual tiene como finalidad aplicar los conceptos básicos del manejo de datos en R: desde el cargue, hasta la depuración de los datos mediante la corrección de anomalías tales como: 1. Formato de variables, 2. Observaciones duplicadas, 3. Campos vacíos, 4. Datos atípicos, 5. Errores de digitación, 6. Valores inválidos y 7. Valores inconsistentes.
Desarrollo de los puntos del taller
El taller está compuesto por 7 puntos, desarrollados mediante el uso de la base de datos de las pruebas saber para instituciones técnicas y tecnológicas (saber TyT), prueba que presentan los estudiantes que culminan sus estudios de educación superior en carreras técnicas y tecnológicas.
Como punto inicial previo al desarrollo de cada punto, se debe realizar el cargue de diversos paquetes y funciones y los datos de las pruebas saber TyT del 2016, segundo periodo del año.
# Datos pruebas saber TyT
url_datos <- "D:/Posgrado/2. Ciencia de datos/1. Semestre 1/4. Analisis exploratorio de datos/2. Clase 17-02-2022/Datos/SABERTYT20162.csv"
saberTyT <- read.csv(file=url_datos, header=TRUE, sep = ";", na.strings = c("NA",""," "),dec = ",")Se debe tener en cuenta en el cargue de los datos la codificación del texto (dependiendo el paquete utilizado), para el caso de read.csv no es necesario incluir el encoding. De igual manera, se debe indicar el separador de la BD, el símbolo utilizado por los decimales y las categorías utilizadas para los datos faltantes (NA).
Punto 1. Filtrado de datos por el estado del resultado
La columna “ESTU_ESTADO” especifica si el resultado está listo para ser publicado (“PUBLICAR”) o si el resultado está en revisión (“VALIDEZ OFICINA JURÍDICA”). Para la finalidad del ejercicio, solo es de interés trabajar con aquellos resgistros que están listos para publicarse.
## Categoría Freq. Abs. Freq. Rel.
## 1 PUBLICAR 52712 0.993815988
## 2 VALIDEZ OFICINA JURÍDICA 328 0.006184012
## 3 Total 53040 1.000000000
Se observa que inicialmente la base de datos contiene 53040 registros, de los cuales 52712 se encuentra listos para ser publicados, equivalente al 99%, los cuales conforman el universo de datos que se quiere analizar. Para realizar el filtro de los datos solo al estado publicar, se emplea la función filter de la librería dplyr. De igual manera, se presenta un ejemplo mediante el filtrado por condiciones directamente desde el conjunto de datos.
Punto 2. Selección de columnas objeto de estudio
La base de datos contiene 104 columnas, sin embargo, no todas son relevantes en el análisis del taller. Por tal motivo, solo se utilizarán las columnas de la 1 a la 15 y de la 85 a 104, que contiene información sobre la nacionalidad del estudiante, el tipo de población a la que pertenece, si presenta alguna discapacidad y los puntajes y desempeños del estudiante en las pruebas saber TyT.
Punto 3. Filtrado de datos por nacionalidad del estudiante
El análisis se especifica que solo debe ser para los estudiantes de nacionalidad colombiana, por tal motivo, se debe realizar el filtro de los datos por su nacionalidad.
# Tabla de frecuencia de las nacionalidades de los estudiantes
tabla_freq(datos_p2$ESTU_NACIONALIDAD)## Categoría Freq. Abs. Freq. Rel.
## 1 1 COLOMBIA 52665 9.991084e-01
## 2 112 JAPÓN 1 1.897101e-05
## 3 118 COREA DEL NORTE 1 1.897101e-05
## 4 119 COREA DEL SUR 2 3.794202e-05
## 5 12 ARGENTINA 0 0.000000e+00
## 6 144 MÉXICO 1 1.897101e-05
## 7 167 OMÁN 1 1.897101e-05
## 8 171 PANAMÁ 1 1.897101e-05
## 9 174 PERÚ 2 3.794202e-05
## 10 209 ESPAÑA 2 3.794202e-05
## 11 236 ESTADOS UNIDOS 5 9.485506e-05
## 12 241 VENEZUELA 16 3.035362e-04
## 13 3 ALAND 1 1.897101e-05
## 14 46 CHILE 2 3.794202e-05
## 15 50 COMORAS 4 7.588405e-05
## 16 55 COSTA DE MARFIL 1 1.897101e-05
## 17 64 REPÚBLICA DOMINICANA 2 3.794202e-05
## 18 65 ECUADOR 2 3.794202e-05
## 19 67 EL SALVADOR 1 1.897101e-05
## 20 83 ALEMANIA 1 1.897101e-05
## 21 96 HAITI 1 1.897101e-05
## 22 Total 52712 1.000000e+00
Se observa que, en total, se tienen 21 nacionalidades entre los estudiantes que presentaron la pruebas saber TyT, siendo predominante la nacionalidad colombiana con el 99% de los casos y solamente 47 casos de estudiantes de nacionalidad extranjera, es decir, menos del 1% de los estudiantes totales, siendo la nacionalidad venezolana la de mayor cantidad de extranjeros con 16 casos.
Punto 4. Meta de desempeño en ingles en los estudiantes que presentaron pruebas saber TyT
Los niveles de inglés, según la clasificación de las pruebas saber dadas por el ICFES son A1-, A1, A2, B1 y B2, en dicho orden (de izquierda a derecha aumenta el nivel de desempeño). Se resalta que según directrices del Ministerio de Educación Nacional, una institución de educación superior tiene la meta de llevar a sus estudiantes a nivel B1 o B2. Por tal motivo, se requiere conocer la proporción de estudiantes que cumplieron o no con esta condición.
Para el desarrollo de este punto, como primer medida, se acomoda los niveles de la variable desempeño en inglés, como se menciona en el enunciado (A1-, A1, A2, B1 y B2).
# Organizar niveles del facto de desempeño en ingles
datos_p3$MOD_INGLES_DESEM <- factor(datos_p3$MOD_INGLES_DESEM, levels=c("A1-","A1","A2","B1","B2"))
# Tabla de frecuencia para el desempeño en ingles
tabla_freq(datos_p3$MOD_INGLES_DESEM)## Categoría Freq. Abs. Freq. Rel.
## 1 A1- 12965 0.24617868
## 2 A1 18799 0.35695433
## 3 A2 13540 0.25709674
## 4 B1 5995 0.11383272
## 5 B2 1366 0.02593753
## 6 Total 52665 1.00000000
Se observa en la tabla de frecuencia que el desempeño en la prueba de inglés, predominan los resultados bajos, siendo el nivel A1 el desempeño más común entre los estudiantes, y el nivel B2 el de menor frecuencia. Al codificar según la meta planteada por el ministerio (B1, B2), correspondiente a las dos categorías más altas, observamos que solo el 13.9% de los estudiantes publicados de nacionalidad colombiana, logran alcanzar este nivel de desempeño, mientras que el 86.6% de estos, no alcanzan el umbral propuesto por el MEN.
# Clasificacion en el cumplimeinto, segun meta MEN
datos_p3$META_INGLES <- ifelse(datos_p3$MOD_INGLES_DESEM == "B1" | datos_p3$MOD_INGLES_DESEM == "B2" , "CUMPLIO", "NO CUMPLIO")
#BackUp de los datos
datos_p4 <- datos_p3
#Tabla de frecuencia meta propuesta por el MEN
tabla_freq(datos_p4$META_INGLES)## Categoría Freq. Abs. Freq. Rel.
## 1 CUMPLIO 7361 0.1397702
## 2 NO CUMPLIO 45304 0.8602298
## 3 Total 52665 1.0000000
Punto 5. Conocer la edad de los estudiantes
Se requiere conocer la edad del estudiante, teniendo en cuenta que la fecha de presentación de la prueba, la cual se desarrolló el 9 de octubre de 2016. Como primera instancia, se identifica que la fecha de nacimiento está declarada como factor, en lugar de un tipo de dato acorde al formato fecha. Por tal motivo, mediante la función as.Date, se transforma el formato de la variable, teniendo en cuenta una codificación de fecha en día, mes y año.
datos_p4$ESTU_FECHANACIMIENTO <- as.Date(datos_p4$ESTU_FECHANACIMIENTO,format = "%d/%m/%Y")
str(datos_p4$ESTU_FECHANACIMIENTO)## Date[1:52665], format: "1990-08-15" "1990-09-26" "1994-10-28" "1979-09-24" "1988-07-06" ...
La diferencia entre dos fechas se puede realizar de manera normal, al restar a la fecha de referencia (día de presentación de la prueba), la fecha de nacimiento del estudiante. Dado que el resultado está dado en días, es necesario dividir con la cantidad de días calendario en un año. Se resalta que existirá un margen de error debido a los años bisiestos. Otro factor importante a tener en cuenta, es redondear la cantidad de decimales, donde, para los casos de las fechas, se considera pertinente redondear por defecto con la función floor, o realizar un truncamiento con trunc.
diferencia_fechas <- (as.Date("09/10/2016",format = "%d/%m/%Y") - datos_p4$ESTU_FECHANACIMIENTO)/365
datos_p4$edad <- as.numeric(floor(diferencia_fechas))Otra forma de realizar el cálculo de las fechas, es mediante la librería lubridate, al configurar el formato de la fecha en día, mes y año con la función dmy, y obteniendo la diferencia con time_length configurando la salida en años. De igual manera, es necesario redondear por defecto para conocer la edad del estudiante.
datos_p4$edad <- floor( time_length(dmy("09/10/2016") - dmy(datos_p3$ESTU_FECHANACIMIENTO), unit = "year")) En los resultados, se evidencia que las edades tienen algunas inconsistencias, una de ellas es la presencia de edades negativas como -8, -2, -1 y nulas 0, además de las edades muy bajas, entendiendo el contexto de que las pruebas saber, son posteriores al ciclo normal de educacion basica y media del estudiante, por tal motivo, se toma como criterio, eliminar las edades menores a 15 años. Sin embargo, se corre el riesgo de eliminar estudiantes de características excepcionales, con procesos de aprendizaje de mayor desarrollo, que logren terminar sus estudios básicos, medios y terciarios en edades muy tempranas.
## datos_p4$edad
## n missing distinct Info Mean Gmd .05 .10
## 52664 1 70 0.995 24.96 7.164 18 19
## .25 .50 .75 .90 .95
## 20 23 28 35 39
##
## lowest : -8 -2 -1 0 1, highest: 66 67 68 70 71
Se evidencia en el boxplot, el rango de valores que toma la variable edad desde los 15 años hasta los 71, de igual manera, se observa que el 75% de los estudiantes están por debajo de los 37 años, y algunas edades poco frecuentes superiores a los 40 años.
Punto 6. Anomalias en las etnias autoreconocidas por los estudiantes
Existe dos variables en la base de datos alusivas a las etnias en el registro de las pruebas saber TyT, la primera, es el autorreconocimiento que realizan los estudiantes, al identificarse en una etnia (ESTU_TIENE_ETNIA), y la otra es el nombre de la etnia al cual pertenece (ESTU_ETNIA).
Para identificar anomalías, aplicaremos los principales problemas que se observan en el manejo de datos: 1. Formato de variables, 2. Observaciones duplicadas, 3. Campos vacíos, 4. Datos atípicos, 5. Errores de digitación, 6. Valores inválidos y 7. Valores inconsistentes, sin embargo, no todos los casos aplican para variables cualitativas, por se describe las más pertinentes.
# Formato de variables no coincide con tipo de variable
str(datos_p4$ESTU_TIENE_ETNIA) # Esta como factor - Ok
str(datos_p4$ESTU_ETNIA) # Esta como factor - OkSe observa que ambas variables de interés, están declaradas como factor, lo que facilitará los cálculos con variables cualitativas, en este caso nominales. También se evidencia con la función “describe” que los datos presentan valores faltantes, por lo que es necesario analizar la coherencia entre estas.
## datos_p4$ESTU_TIENE_ETNIA
## n missing distinct
## 48374 4291 2
##
## Value NO SI
## Frequency 45098 3276
## Proportion 0.932 0.068
## datos_p4$ESTU_ETNIA
## n missing distinct
## 3086 49579 18
##
## lowest : 1 Comunidad afrodescendiente 10 Cancuamo 100 Ninguno 11 Inga 12 Tucano
## highest: 4 Paez 6 Embera 7 Pijao 8 Wayúu 9 Pasto
Debido a que la variable ESTU_ETNIA (indica el nombre de la etnia que el estudiante se auto reconoce), depende de la variable ESTU_TIENE_ETNIA (Indica si el estudiante pertenece a una etnia o no), y viceversa, es necesaria analizarlas en conjunto, por lo que se hace una tabla con el cruce de estas dos variables, en la cual se puede interpretar situaciones como: 1) existen registros de etnias a pesar que el estudiante marco que no se autoreconocía en ninguna, 2) a pesar que el estudiante marco que si se autoreconocía en una etnia, indicó en la clasificación que no pertenecía a ninguna, 3) estudiantes que se autoreconocen en una etnia y no indican a cual pertenece. Se da claridad que existe el grupo “Otro grupo étnico minoritario” en caso de que ninguna de las clasificaciones aplicara.
##
## NO SI <NA>
## 1 Comunidad afrodescendiente 8 673 0
## 10 Cancuamo 0 3 0
## 100 Ninguno 41 1590 0
## 11 Inga 0 16 0
## 12 Tucano 0 2 0
## 13 Huitoto 0 2 0
## 15 Palenquero 0 7 0
## 16 Arhuaco 0 3 0
## 17 Guambiano 0 10 0
## 18 Zenú 1 56 0
## 19 Otro grupo étnico minoritario 20 425 0
## 2 Raizal 2 38 0
## 3 Comunidad Rom (gitana) 0 3 0
## 4 Paez 0 72 0
## 6 Embera 0 32 0
## 7 Pijao 1 20 0
## 8 Wayúu 0 19 0
## 9 Pasto 3 39 0
## <NA> 45022 266 4291
Para corregir los errores anteriormente evidenciados, se realiza mediante condicionales a los valores que se consideren correctos, asumiendo NA en los casos que no se conozca con certeza cual sería el valor que tomaría las variables relacionadas con la etnia del estudiante.
# Para los ESTU_TIENE_ETNIA = NO todos los ESTU_ETNIA se pasan a NA
datos_p4$ESTU_ETNIA[datos_p4$ESTU_TIENE_ETNIA=="NO"]<-NA
# Para los ESTU_TIENE_ETNIA = SI y ESTU_ETNIA = "100 Ninguno" se pasa ESTU_TIENE_ETNIA a NO
datos_p4$ESTU_TIENE_ETNIA[datos_p4$ESTU_ETNIA=="100 Ninguno"]<-"NO"
# Para los ESTU_TIENE_ETNIA = SI y ESTU_ETNIA = "100 Ninguno" se pasa ESTU_ETNIA a vacio(NA)
datos_p4$ESTU_ETNIA[datos_p4$ESTU_ETNIA=="100 Ninguno"]<-NA
# Para los ESTU_ETNIA = NA y ESTU_TIENE_ETNIA = SI se pasan ESTU_TIENE_ETNIA a NA
datos_p4$ESTU_TIENE_ETNIA[datos_p4$ESTU_TIENE_ETNIA == "SI" & is.na(datos_p4$ESTU_ETNIA)]<-NADespués de corregir todos las inconsistencias en las variables ESTU_TIENE_ETNIA y ESTU_ETNIA, obtenemos el siguiente resultado:
# Tabla con los valores corregidos
table(datos_p4$ESTU_ETNIA, datos_p4$ESTU_TIENE_ETNIA,useNA='always')##
## NO SI <NA>
## 1 Comunidad afrodescendiente 0 673 0
## 10 Cancuamo 0 3 0
## 100 Ninguno 0 0 0
## 11 Inga 0 16 0
## 12 Tucano 0 2 0
## 13 Huitoto 0 2 0
## 15 Palenquero 0 7 0
## 16 Arhuaco 0 3 0
## 17 Guambiano 0 10 0
## 18 Zenú 0 56 0
## 19 Otro grupo étnico minoritario 0 425 0
## 2 Raizal 0 38 0
## 3 Comunidad Rom (gitana) 0 3 0
## 4 Paez 0 72 0
## 6 Embera 0 32 0
## 7 Pijao 0 20 0
## 8 Wayúu 0 19 0
## 9 Pasto 0 39 0
## <NA> 46688 0 4557
Punto 7. Crear variable limitaciones (discapacidad) del estudiante
La base de datos contiene 5 variables con las diversas limitaciones registradas por los estudiantes: motriz, invidente, condición especial, sordo y autismo, sin embargo, se desea solo tener una variable que resuma si el estudiante presenta alguna limitación o no. Para tal fin, mediante un ifelse, se compara las variables, indicando en los casos que todas contengan valores vacíos (NA) se asumirá que el estudiante no presenta ninguna limitación.
datos_p4$TIENE_LIMITACION <- ifelse(is.na(datos_p4$ESTU_LIMITA_MOTRIZ) &
is.na(datos_p4$ESTU_LIMITA_INVIDENTE) &
is.na(datos_p4$ESTU_LIMITA_CONDICIONESPECIA) &
is.na(datos_p4$ESTU_LIMITA_SORDO) &
is.na(datos_p4$ESTU_LIMITA_AUTISMO),"NO", "SI")Se observa que de los 52665 estudiantes publicados de nacionalidad colombiana, el 99.8% no presenta una limitación registrada, mientras un 0.14% equivalente a 78 estudiantes presentan algún tipo de limitación (motriz, invidente, condición especial, sordo y autismo).
## Categoría Freq. Abs. Freq. Rel.
## 1 NO 52587 0.99851894
## 2 SI 78 0.00148106
## 3 Total 52665 1.00000000
Punto 8. Puntaje global y analisis anomalias puntajes por pruebas
La base de datos de la prueba saber TyT, contiene los 5 puntajes de las competencias evaluadas, como es el caso de: Razonamiento cuantitativo, Lectura crítica, Comunicación escrita, Inglés y Competencias ciudadanas, sin embargo no contiene la información del puntaje global, para lo cual, es necesario crear la variable con esta medida.
Se realiza la verificación de anomalías en las variables de los puntajes según las pruebas, para las cuales solo aplicaremos los métodos acordes al tipo de variable, las cuales son cuantitativas continuas.
Para comodidad en los cálculos, se extrae solo la información de los puntajes en un dataframe nuevo, almacenando la información de cada una de las 5 pruebas. Se evidencia en el siguiente resultado, que cada una de las variables esta definido como numericas.
# Formato de variables
puntajes <- datos_p4[,c("MOD_RAZONA_CUANTITAT_PUNT","MOD_LECTURA_CRITICA_PUNT","MOD_COMPETEN_CIUDADA_PUNT","MOD_INGLES_PUNT","MOD_COMUNI_ESCRITA_PUNT")]
str(puntajes)## 'data.frame': 52665 obs. of 5 variables:
## $ MOD_RAZONA_CUANTITAT_PUNT: int 80 122 115 82 95 134 58 87 113 90 ...
## $ MOD_LECTURA_CRITICA_PUNT : int 114 112 117 101 106 121 70 61 109 121 ...
## $ MOD_COMPETEN_CIUDADA_PUNT: int 100 100 123 85 84 123 68 81 109 85 ...
## $ MOD_INGLES_PUNT : int 115 112 144 88 79 116 76 84 94 137 ...
## $ MOD_COMUNI_ESCRITA_PUNT : int 121 123 99 75 86 105 99 84 118 127 ...
Para el análisis de los campos vacíos (NA), se realiza un resumen de cada una de las variables que almacenan los puntajes por prueba, observando que solo la variable de la prueba de comunicación escrita posee 770 NA, los cuales no se les aplicará ningún tratamiento al ser valores que no se conocen y solo podrían completarse mediante métodos de imputación.
# Ajuste en nombres por temas esteticos
names (puntajes) = c("R.CUANTITATIVO", "L.CRITICA", "C.CIUDADANA", "INGLES", "C.ESCRITA")
# Estadísticas descriptivas segun competencia
summary(puntajes)## R.CUANTITATIVO L.CRITICA C.CIUDADANA INGLES C.ESCRITA
## Min. : 0.00 Min. : 0.0 Min. : 0.00 Min. : 0 Min. : 49
## 1st Qu.: 81.00 1st Qu.: 81.0 1st Qu.: 82.00 1st Qu.: 85 1st Qu.: 85
## Median : 96.00 Median : 97.0 Median : 99.00 Median : 98 Median :102
## Mean : 96.48 Mean : 95.8 Mean : 97.99 Mean :100 Mean :100
## 3rd Qu.:111.00 3rd Qu.:112.0 3rd Qu.:114.00 3rd Qu.:112 3rd Qu.:115
## Max. :200.00 Max. :200.0 Max. :200.00 Max. :200 Max. :200
## NA's :770
Para el cálculo del puntaje global, se realiza el promedio sobre los 5 puntajes de las competencias de Razonamiento cuantitativo, Lectura crítica, Comunicación escrita, Inglés y Competencias ciudadanas, sin embargo, se debe tener en cuenta los NA de la prueba de competencias ciudadanas.
# Promedio de las pruebas para puntaje global
puntajes$global_punt <- apply(puntajes[ ,c(1,5)], 1, mean, na.rm = TRUE)
# Ajuste de nombre
names (puntajes) = c("R.CUANTITATIVO", "L.CRITICA", "C.CIUDADANA", "INGLES", "C.ESCRITA", "P.GLOBAL")
# Estadísticas descriptivas
summary(puntajes$P.GLOBAL)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 87.00 98.50 98.15 109.50 175.50
Ahora, se procede a analizar la presencia de datos atípicos o valores inconsistentes mediante en análisis de las descriptivas básicas y diagramas de caja de cada una de las pruebas y el puntaje total, observando que los datos se encuentran en los valores esperados, es decir, entre 0 como valor mínimo y 200 como valor máximo.
Conociendo que la escala de valores está entre 0 a 200, se observa que al menos la mitad de los estudiantes, presentan resultados por debajo del valor central del rango de la prueba, oscilando la mayoría al nivel de los 100 puntos. Las distribuciones a simple vista aparentan ser simétricas, pero con resultados variantes que se distribuyen en todo el rango de calificaciones, donde, solo el caso de comprensión escrita inicia con valor mínimo en 47, sin embargo, se vuelve a enfatizar que esta variable contenía un total de 770 registros faltantes.