Caratula

ZEGEL IPAE

DESARROLLO DE SISTEMAS DE INFORMACION





Estadística Aplicada a la Computación

Informe Final

Autor: Benjamin Joseph Huaman Eusebio

2024

Resumen

Los datos fueron obtenidos en una encuesta realizada a estudiantes de cursos de matemáticas y lengua portuguesa en la escuela secundaria. Contiene mucha información social, de género y de estudio interesante sobre los estudiantes.

El análisis propuesto comprende un caso específico relacionado con la educación en estas dos escuelas Gabriel Pereira y Mousinho de Silveira.

En este analisis se busca utilizar todo lo aprendido en este periodo academico y eso incluye:

La creación de tablas de frecuencia y la representación gráfica de datos. Se calcularán medidas estadísticas de tendencia y posición, y se abordará la presencia de datos faltantes y valores atípicos.

Se llevarán a cabo transformaciones y normalizaciones de variables para mejorar la calidad del análisis. Finalmente, se aplicarán modelos predictivos, incluyendo la regresión lineal y la regresión logística, con el objetivo de comprender relaciones entre las variables analizadas.

I. Aspectos generales

1.1 Nombre de la organización

Zegel - Instituto de Negocios y Tecnología
Curso de Estadística Aplicada a la Computación

1.2 Descripción del caso (o los casos) que se va a analizar

Evaluación de la Relación entre el Apoyo Educativo y Familiar con las Calificaciones Finales de Estudiantes

En este estudio, se busca comprender la relación entre el rendimiento académico de los estudiantes en los cursos de matemáticas y portugués y algunas variables específicas de la base de datos: el apoyo educativo adicional (schoolsup), el apoyo familiar (famsup), la participación en clases extra pagadas (paid), número de fracasos (failures) y el tiempo de estudio semanal (studytime).

Datos obtenidos de: https://www.kaggle.com/datasets/gevvahraf/alc-consumption-and-higher-education

II. Fundamentos básicos de la Estadística

2.1 Objetivo de estudio

Evaluar cómo el apoyo educativo adicional (schoolsup), el apoyo familiar (famsup), las clases extra pagadas (paid), número de fracasos (failures) y el tiempo de estudio semanal (studytime) se correlacionan con las calificaciones finales.

También se aplicará todo lo visto en el curso (según anexo).

2.2 Población de estudio

Los estudiantes de secundaria de las escuelas Gabriel Pereira y Mousinho da Silveira.

2.3 Muestra

Los estudiantes que participaron en la encuesta, de los cursos de matemáticas y portugués, y que se encuentran en la educación secundaria de las escuelas Gabriel Pereira y Mousinho da Silveira.

2.4 Unidad de análisis

Un estudiante que participa en el curso de matemáticas y/o portugués en la secundaria.

III. Variables y tipo de variables

  • school - escuela del estudiante (binario: ‘GP’ - Gabriel Pereira o ‘MS’ - Mousinho da Silveira)
  • sex - sexo del estudiante (binario: ‘F’ - femenino o ‘M’ - masculino)
  • age - edad del estudiante (numérico: desde 15 a 22)
  • address - tipo de dirección particular del estudiante (binario: ‘U’ - urbano o ‘R’ - rural)
  • famsize - tamaño de la familia (binario: ‘LE3’ - menor o igual a 3 o ‘GT3’ - mayor que 3)
  • Pstatus - estado de convivencia de los padres (binario: ‘T’ - viviendo juntos o ‘A’ - separados)
  • Medu - educación de la madre (numérica: 0 - ninguna, 1 - educación primaria (4º grado), 2 - 5º a 9º grado, 3 - secundaria educación o 4 – educación superior)
  • Fedu - educación del padre (numérico: 0 - ninguna, 1 - educación primaria (4to grado), 2 - 5to a 9no grado, 3 - educación secundaria o 4 - educación superior)
  • Mjob - trabajo de la madre (nominal : ‘maestro’, ‘servicios’ civiles relacionados con la atención ‘salud’ (p. ej., administrativos o policiales), ‘en_casa’ u ‘otro’)
  • Fjob - trabajo del padre (nominal: ‘maestro’, ‘servicios’ civiles relacionados con la atención ‘salud’ ’ (por ejemplo, administrativo o policial), ‘en_casa’ u ‘otro’)
  • reason: motivo para elegir esta escuela (nominal: cerca de ‘hogar’, ‘reputación’ de la escuela, preferencia de ‘curso’ u ‘otro’)
    guardian: tutor del estudiante (nominal: ‘madre’, ‘padre’ u ‘otro’)
  • traveltime - tiempo de viaje de casa a la escuela (numérico: 1 - <15 min., 2 - 15 a 30 min., 3 - 30 min. a 1 hora, o 4 - >1 hora)
  • studytime - tiempo de estudio semanal (numérico: 1 - <2 horas, 2 - 2 a 5 horas, 3 - 5 a 10 horas, o 4 - >10 horas)
  • failures - número de fracasos en clases pasadas (numérico: n si 1<=n<3, de lo contrario 4)
  • schoolsup - apoyo educativo extra (binario: sí o no)
  • famsup - apoyo educativo familiar (binario: sí o no)
  • paid - clases extra pagadas dentro del curso materia (Matemáticas o portugués) (binario: sí o no)
  • activities - actividades extracurriculares (binario: sí o no)
  • nursery - asistió a la guardería (binario: sí o no)
  • higher - quiere cursar estudios superiores (binario: sí o no)
  • internet - acceso a Internet en casa (binario: sí o no)
  • romantic - con una relación romántica (binario: sí o no)
  • famrel - calidad de las relaciones familiares (numérico: de 1 - muy malo a 5 - excelente)
  • freetime - gratis tiempo después de la escuela (numérico: de 1 - muy bajo a 5 - muy alto)
  • goout - salir con amigos (numérico: de 1 - muy bajo a 5 - muy alto)
  • Dalc - consumo de alcohol en días laborales (numérico: de 1 - muy bajo a 5 - muy alto)
  • Walc - consumo de alcohol durante el fin de semana (numérico:de 1 - muy bajo a 5 - muy alto)
  • health - estado de salud actual (numérico: de 1 - muy malo a 5 - muy bueno)
  • absences - número de ausencias escolares (numérico: de 0 a 93)

Estas calificaciones están relacionadas con la materia del curso, Matemáticas o Portugués:

  • G1 - calificación del primer período (numérica: de 0 a 20)
  • G2 - calificación del segundo período (numérica: de 0 a 20)
  • G3 - calificación final (numérica: de 0 a 20, objetivo de salida)

IV. Manejo de base de datos

# Unimos los datos que usaremos de Los estudiantes.
# Estudiantes del curso de Lenguaje portugues
d1=read.csv("student-por.csv")
# Estudiantes del curso de Matematicas
d2=read.csv("student-mat.csv")
#Cantidad de filas en el primer conjunto de datos
nrow(d1)
## [1] 649
#Cantidad de filas en el segundo conjunto de datos
nrow(d2)
## [1] 395
#Nombres de todos los datos
names(d1)
##  [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"
d3<-rbind(d1,d2)
#Mostramos los primeros datos
head(d3)
##   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        0       yes     no   no         no
## 4   mother          1         3        0        no    yes   no        yes
## 5   father          1         2        0        no    yes   no         no
## 6   mother          1         2        0        no    yes   no        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        4  0 11 11
## 2        2  9 11 11
## 3        6 12 13 12
## 4        0 14 14 14
## 5        0 11 13 13
## 6        6 12 12 13
#Verificamos la dimensión de lo datos
dim(d3)
## [1] 1044   33
#Verificamos la estructura de los datos
str(d3)
## 'data.frame':    1044 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 0 0 0 0 0 0 0 0 ...
##  $ schoolsup : chr  "yes" "no" "yes" "no" ...
##  $ famsup    : chr  "no" "yes" "no" "yes" ...
##  $ paid      : chr  "no" "no" "no" "no" ...
##  $ 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  4 2 6 0 0 6 0 2 0 0 ...
##  $ G1        : int  0 9 12 14 11 12 13 10 15 12 ...
##  $ G2        : int  11 11 13 14 13 12 12 13 16 12 ...
##  $ G3        : int  11 11 12 14 13 13 13 13 17 13 ...

V. Tablas de frecuencia (Para cada variable)

Tabla de frecuencia de manera manual

Variable school - variable cualitativa

#Obtener las frecuencias absolutas (simples) (fi) de manera basica
fi <- table(d3$school)
fi
## 
##  GP  MS 
## 772 272
#Obtener las frecuencias Relativas (simples) (hi) de manera basica

#opcion 1
fi/(dim(d3)[1])
## 
##        GP        MS 
## 0.7394636 0.2605364
#opcion 2
hi = prop.table(fi)
hi
## 
##        GP        MS 
## 0.7394636 0.2605364
#Obtener las frecuencias Porcentuales
pi = hi*100
pi
## 
##       GP       MS 
## 73.94636 26.05364
#uniendo filas (rbind) o columnas (cbind) - si se agrega detro de un t() se invirte 
rbind(fi, hi, pi)
##             GP          MS
## fi 772.0000000 272.0000000
## hi   0.7394636   0.2605364
## pi  73.9463602  26.0536398
cbind(fi, hi, pi)
##     fi        hi       pi
## GP 772 0.7394636 73.94636
## MS 272 0.2605364 26.05364

Tabla de frecuencia para variables cualitativas

# Librerias que utilizaremos para las variables cualitativas y cuatitativas discretas

library(summarytools)
library(epiDisplay)

Variable sex - Uso de la libreria summarytools

freq(d3$sex, report.nas = FALSE)
## Frequencies  
## d3$sex  
## Type: Character  
## 
##               Freq        %   % Cum.
## ----------- ------ -------- --------
##           F    591    56.61    56.61
##           M    453    43.39   100.00
##       Total   1044   100.00   100.00

Variable address - Uso de la libreria epiDisplay

tab1(d3$address, graph =FALSE)
## d3$address : 
##         Frequency Percent Cum. percent
## R             285    27.3         27.3
## U             759    72.7        100.0
##   Total      1044   100.0        100.0

Continuamos con las otras variables Cualitativas.

Variable famsize

freq(d3$famsize, report.nas = FALSE)
## Frequencies  
## d3$famsize  
## Type: Character  
## 
##               Freq        %   % Cum.
## ----------- ------ -------- --------
##         GT3    738    70.69    70.69
##         LE3    306    29.31   100.00
##       Total   1044   100.00   100.00

Variable Pstatus

freq(d3$Pstatus, report.nas = FALSE)
## Frequencies  
## d3$Pstatus  
## Type: Character  
## 
##               Freq        %   % Cum.
## ----------- ------ -------- --------
##           A    121    11.59    11.59
##           T    923    88.41   100.00
##       Total   1044   100.00   100.00

Variable Mjob

freq(d3$Mjob, report.nas = FALSE)
## Frequencies  
## d3$Mjob  
## Type: Character  
## 
##                  Freq        %   % Cum.
## -------------- ------ -------- --------
##        at_home    194    18.58    18.58
##         health     82     7.85    26.44
##          other    399    38.22    64.66
##       services    239    22.89    87.55
##        teacher    130    12.45   100.00
##          Total   1044   100.00   100.00

Variable Fjob

freq(d3$Fjob, report.nas = FALSE)
## Frequencies  
## d3$Fjob  
## Type: Character  
## 
##                  Freq        %   % Cum.
## -------------- ------ -------- --------
##        at_home     62     5.94     5.94
##         health     41     3.93     9.87
##          other    584    55.94    65.80
##       services    292    27.97    93.77
##        teacher     65     6.23   100.00
##          Total   1044   100.00   100.00

Variable reason

freq(d3$reason, report.nas = FALSE)
## Frequencies  
## d3$reason  
## Type: Character  
## 
##                    Freq        %   % Cum.
## ---------------- ------ -------- --------
##           course    430    41.19    41.19
##             home    258    24.71    65.90
##            other    108    10.34    76.25
##       reputation    248    23.75   100.00
##            Total   1044   100.00   100.00

Variable guardian

freq(d3$guardian, report.nas = FALSE)
## Frequencies  
## d3$guardian  
## Type: Character  
## 
##                Freq        %   % Cum.
## ------------ ------ -------- --------
##       father    243    23.28    23.28
##       mother    728    69.73    93.01
##        other     73     6.99   100.00
##        Total   1044   100.00   100.00

Variable schoolsup

freq(d3$schoolsup, report.nas = FALSE)
## Frequencies  
## d3$schoolsup  
## Type: Character  
## 
##               Freq        %   % Cum.
## ----------- ------ -------- --------
##          no    925    88.60    88.60
##         yes    119    11.40   100.00
##       Total   1044   100.00   100.00

Variable famsup

tab1(d3$famsup, graph =FALSE)
## d3$famsup : 
##         Frequency Percent Cum. percent
## no            404    38.7         38.7
## yes           640    61.3        100.0
##   Total      1044   100.0        100.0

Variable paid

tab1(d3$paid, graph =FALSE)
## d3$paid : 
##         Frequency Percent Cum. percent
## no            824    78.9         78.9
## yes           220    21.1        100.0
##   Total      1044   100.0        100.0

Variable activities

tab1(d3$activities, graph =FALSE)
## d3$activities : 
##         Frequency Percent Cum. percent
## no            528    50.6         50.6
## yes           516    49.4        100.0
##   Total      1044   100.0        100.0

Variable nursery

tab1(d3$nursery, graph =FALSE)
## d3$nursery : 
##         Frequency Percent Cum. percent
## no            209      20           20
## yes           835      80          100
##   Total      1044     100          100

Variable higher

tab1(d3$higher, graph =FALSE)
## d3$higher : 
##         Frequency Percent Cum. percent
## no             89     8.5          8.5
## yes           955    91.5        100.0
##   Total      1044   100.0        100.0

Variable internet

tab1(d3$internet, graph =FALSE)
## d3$internet : 
##         Frequency Percent Cum. percent
## no            217    20.8         20.8
## yes           827    79.2        100.0
##   Total      1044   100.0        100.0

Variable romantic

tab1(d3$romantic, graph =FALSE)
## d3$romantic : 
##         Frequency Percent Cum. percent
## no            673    64.5         64.5
## yes           371    35.5        100.0
##   Total      1044   100.0        100.0

Tabla de frecuencia para variables cuatitativas discretas

Variable age - Uso de la libreria summarytools

# función freq permite generar la tabla de frecuencia
freq(d3$age, report.nas = FALSE)
## Frequencies  
## d3$age  
## Type: Integer  
## 
##               Freq        %   % Cum.
## ----------- ------ -------- --------
##          15    194    18.58    18.58
##          16    281    26.92    45.50
##          17    277    26.53    72.03
##          18    222    21.26    93.30
##          19     56     5.36    98.66
##          20      9     0.86    99.52
##          21      3     0.29    99.81
##          22      2     0.19   100.00
##       Total   1044   100.00   100.00

Variable Medu - Uso de la libreria epiDisplay

# función tab1 permite generar la tabla de frecuencia
tab1(d3$Medu, graph =FALSE)
## d3$Medu : 
##         Frequency Percent Cum. percent
## 0               9     0.9          0.9
## 1             202    19.3         20.2
## 2             289    27.7         47.9
## 3             238    22.8         70.7
## 4             306    29.3        100.0
##   Total      1044   100.0        100.0

Continuamos con las otras variables Cuantitivas discretas.

Variable Fedu

freq(d3$Fedu, report.nas = FALSE)
## Frequencies  
## d3$Fedu  
## Type: Integer  
## 
##               Freq        %   % Cum.
## ----------- ------ -------- --------
##           0      9     0.86     0.86
##           1    256    24.52    25.38
##           2    324    31.03    56.42
##           3    231    22.13    78.54
##           4    224    21.46   100.00
##       Total   1044   100.00   100.00

Variable traveltime

freq(d3$traveltime, report.nas = FALSE)
## Frequencies  
## d3$traveltime  
## Type: Integer  
## 
##               Freq        %   % Cum.
## ----------- ------ -------- --------
##           1    623    59.67    59.67
##           2    320    30.65    90.33
##           3     77     7.38    97.70
##           4     24     2.30   100.00
##       Total   1044   100.00   100.00

Variable studytime

freq(d3$studytime, report.nas = FALSE)
## Frequencies  
## d3$studytime  
## Type: Integer  
## 
##               Freq        %   % Cum.
## ----------- ------ -------- --------
##           1    317    30.36    30.36
##           2    503    48.18    78.54
##           3    162    15.52    94.06
##           4     62     5.94   100.00
##       Total   1044   100.00   100.00

Variable failures

freq(d3$failures, report.nas = FALSE)
## Frequencies  
## d3$failures  
## Type: Integer  
## 
##               Freq        %   % Cum.
## ----------- ------ -------- --------
##           0    861    82.47    82.47
##           1    120    11.49    93.97
##           2     33     3.16    97.13
##           3     30     2.87   100.00
##       Total   1044   100.00   100.00

Variable famrel

freq(d3$famrel, report.nas = FALSE)
## Frequencies  
## d3$famrel  
## Type: Integer  
## 
##               Freq        %   % Cum.
## ----------- ------ -------- --------
##           1     30     2.87     2.87
##           2     47     4.50     7.38
##           3    169    16.19    23.56
##           4    512    49.04    72.61
##           5    286    27.39   100.00
##       Total   1044   100.00   100.00

Variable freetime

freq(d3$freetime, report.nas = FALSE)
## Frequencies  
## d3$freetime  
## Type: Integer  
## 
##               Freq        %   % Cum.
## ----------- ------ -------- --------
##           1     64     6.13     6.13
##           2    171    16.38    22.51
##           3    408    39.08    61.59
##           4    293    28.07    89.66
##           5    108    10.34   100.00
##       Total   1044   100.00   100.00

Variable goout

freq(d3$goout, report.nas = FALSE)
## Frequencies  
## d3$goout  
## Type: Integer  
## 
##               Freq        %   % Cum.
## ----------- ------ -------- --------
##           1     71     6.80     6.80
##           2    248    23.75    30.56
##           3    335    32.09    62.64
##           4    227    21.74    84.39
##           5    163    15.61   100.00
##       Total   1044   100.00   100.00

Variable Dalc

tab1(d3$Dalc, graph =FALSE)
## d3$Dalc : 
##         Frequency Percent Cum. percent
## 1             727    69.6         69.6
## 2             196    18.8         88.4
## 3              69     6.6         95.0
## 4              26     2.5         97.5
## 5              26     2.5        100.0
##   Total      1044   100.0        100.0

Variable Walc

tab1(d3$Walc, graph =FALSE)
## d3$Walc : 
##         Frequency Percent Cum. percent
## 1             398    38.1         38.1
## 2             235    22.5         60.6
## 3             200    19.2         79.8
## 4             138    13.2         93.0
## 5              73     7.0        100.0
##   Total      1044   100.0        100.0

Variable health

tab1(d3$health, graph =FALSE)
## d3$health : 
##         Frequency Percent Cum. percent
## 1             137    13.1         13.1
## 2             123    11.8         24.9
## 3             215    20.6         45.5
## 4             174    16.7         62.2
## 5             395    37.8        100.0
##   Total      1044   100.0        100.0

Variable absences

tab1(d3$absences, graph =FALSE)
## d3$absences : 
##         Frequency Percent Cum. percent
## 0             359    34.4         34.4
## 1              15     1.4         35.8
## 2             175    16.8         52.6
## 3              15     1.4         54.0
## 4             146    14.0         68.0
## 5              17     1.6         69.6
## 6              80     7.7         77.3
## 7              10     1.0         78.3
## 8              64     6.1         84.4
## 9              10     1.0         85.3
## 10             38     3.6         89.0
## 11              8     0.8         89.8
## 12             24     2.3         92.0
## 13              4     0.4         92.4
## 14             20     1.9         94.3
## 15              5     0.5         94.8
## 16             17     1.6         96.5
## 17              1     0.1         96.6
## 18              8     0.8         97.3
## 19              1     0.1         97.4
## 20              4     0.4         97.8
## 21              3     0.3         98.1
## 22              5     0.5         98.6
## 23              1     0.1         98.7
## 24              2     0.2         98.9
## 25              1     0.1         98.9
## 26              2     0.2         99.1
## 28              1     0.1         99.2
## 30              2     0.2         99.4
## 32              1     0.1         99.5
## 38              1     0.1         99.6
## 40              1     0.1         99.7
## 54              1     0.1         99.8
## 56              1     0.1         99.9
## 75              1     0.1        100.0
##   Total      1044   100.0        100.0

Tabla de frecuencia para variables cuantitativas continuas

Cuando la representacion de la tabla tiene mas de 12 filas no se debe presentar una tabla clasica, lo mas conveniente es agrupar por intervalos.

La opción mas conocida es la regla de Sturges (k=1+3.322*log(n))

#Para ello usamos la libreria agricolae
library(agricolae)

Variable G1

(table.freq(hist(d3$G1, plot = FALSE, breaks = "Sturges")))
##    Lower Upper Main Frequency Percentage   CF   CPF
## 1      0     2    1         1        0.1    1   0.1
## 2      2     4    3         4        0.4    5   0.5
## 3      4     6    5        45        4.3   50   4.8
## 4      6     8    7       153       14.7  203  19.4
## 5      8    10    9       242       23.2  445  42.6
## 6     10    12   11       247       23.7  692  66.3
## 7     12    14   13       206       19.7  898  86.0
## 8     14    16   15       103        9.9 1001  95.9
## 9     16    18   17        39        3.7 1040  99.6
## 10    18    20   19         4        0.4 1044 100.0

Variable G2

(table.freq(hist(d3$G2, plot = FALSE, breaks = "Sturges")))
##    Lower Upper Main Frequency Percentage   CF   CPF
## 1      0     2    1        20        1.9   20   1.9
## 2      2     4    3         1        0.1   21   2.0
## 3      4     6    5        39        3.7   60   5.7
## 4      6     8    7       109       10.4  169  16.2
## 5      8    10    9       251       24.0  420  40.2
## 6     10    12   11       265       25.4  685  65.6
## 7     12    14   13       194       18.6  879  84.2
## 8     14    16   15       110       10.5  989  94.7
## 9     16    18   17        51        4.9 1040  99.6
## 10    18    20   19         4        0.4 1044 100.0

Variable G3

(table.freq(hist(d3$G3, plot = FALSE, breaks = "Sturges")))
##    Lower Upper Main Frequency Percentage   CF   CPF
## 1      0     2    1        54        5.2   54   5.2
## 2      2     4    3         1        0.1   55   5.3
## 3      4     6    5        26        2.5   81   7.8
## 4      6     8    7        86        8.2  167  16.0
## 5      8    10    9       216       20.7  383  36.7
## 6     10    12   11       254       24.3  637  61.0
## 7     12    14   13       203       19.4  840  80.5
## 8     14    16   15       134       12.8  974  93.3
## 9     16    18   17        62        5.9 1036  99.2
## 10    18    20   19         8        0.8 1044 100.0

VI. Representación gráfica de datos.

Segun la descripción del caso por analizar se usaran las variables cualitativas nominales, donde se usaran los graficos de barras y circular(pastel):

  • schoolsup (Apoyo educativo extra)
  • famsup (Apoyo educativo familiar)
  • paid (Clases extra pagadas)

Tambien se usaran las variables cuantitativas continuas, donde se usaran los graficos de cajas, histogramas y densidad:

  • G1 (Calificación del primer período)
  • G2 (Calificación del segundo período)
  • G3 (Calificación final)

Graficos para variables cualitativas nominales

Aclaracion: Los graficos para variables cualitativas ordinales tambien son los graficos de barras y circulares

Variable schoolsup (Apoyo educativo extra)

#Cargar la libreria
library(ggplot2)

# Gráfico de barras para variables cualitativas nominales
ggplot(data = d3, aes(x=schoolsup))+
  geom_bar(fill = "blue4", color = "black")+
  labs(title = "Grafico de Barras de schoolsup (Apoyo educativo extra)")+
  theme_classic()+
  xlab("Apoyo educativo extra")+
  ylab("cantidad")

Variable famsup (Apoyo educativo familiar)

#Grafico Circular
ggplot(d3, aes(x = "", y = "", fill = famsup)) +
  geom_bar(stat = "identity") +
  coord_polar(theta = "y") +
  labs(title = "Grafico Circular de famsup (Apoyo educativo familiar)") +
  theme_void()

Variable paid (Clases extra pagadas)

ggplot(d3, aes(x = paid)) +
  geom_bar(fill = "lightcoral", color = "black") +
  labs(title = "Gráfico de Barras para paid (Clases extra pagadas)") +
  theme_classic()+
  xlab("Clases extra pagadas")+
  ylab("cantidad")

Graficos para variables cuantitativas continuas

Variable G1 (Calificación del primer período)

#Histograma
ggplot(d3, aes(x = G1))+
  geom_histogram(binwidth = 1, fill = "skyblue", color = "black")+
  labs(title = "Histograma de G1 (Calificación del primer período")+
  theme_classic()+
  xlab("Calificación del primer período")+
  ylab("Cantidad")

Variable G2 (Calificación del segundo período)

#Diagrama de Caja
ggplot(d3, aes(x = G2))+
  geom_boxplot(fill = "lightgreen")+
  labs(title = "Diagrama de caja de G2 (Calificación del segundo período)")+
  xlab("Calificación del segundo período")+
  theme_classic()

Variable G3 (Calificación final)

#Grafico de Densidad
ggplot(d3, aes(x = G3))+
  geom_density(fill = "orange2")+
  labs(title = "Grafico de Densidad de G3 (Calificación final)")+
  xlab("Calificación final")+
  ylab("Densidad")+
  theme_light()

VII. Medidas estadísticas de tendencia

Medidas estadísticas de tendencia central

Media aritmetica

La media aritmética (media o promedio) de un conjunto de valores de una variable es la suma de dichos valores dividida entre el número de valores. Se denota por \(\bar{x}\).

#opcion 1
promedio = sum(d3$G1)/length(d3$G1)
promedio
## [1] 11.2136
#opcion 2
mean(d3$G1)
## [1] 11.2136
mean(d3$G2)
## [1] 11.24617
mean(d3$G3)
## [1] 11.34195

Interpretacion 1: El promedio de calificación del primer período de los estudiantes es de 11.2136.

Interpretacion 2: El promedio de Calificación del segundo período de los estudiantes es de 11.24617

Interpretacion 3: El promedio de Calificación final de los estudiantes es de 11.34195

Mediana Aritmetica

Representa el valor que, al ordenar todos los valores de menor a mayor, se encuentra al medio. En caso que el número de valores sea par, la mediana es el promedio de los dos valores de en medio. Cuando la variable es de tipo ordinal, la mediana es la mejor medida para representar la tendencia central.

median(d3$G1)
## [1] 11
median(d3$G2)
## [1] 11
median(d3$G3)
## [1] 11

El valor de la mediana es los 3 casos es de: 11

Interpretacion: El 50% de los estudiantes su calificación maxima es 11. El otro 50% (la mitad) su calificación minima es 11 .

Moda Aritmetica

La moda es el valor que tiene mayor frecuencia absoluta. Se representa por Mo. Se puede hallar la moda para variables cualitativas y cuantitativas.

#Opcion 1
table(d3$G3)
## 
##   0   1   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
##  53   1   1   8  18  19  67  63 153 151 103 113  90  82  52  35  27   7   1
#Opcion 2
library(modeest)
mfv(d3$G3)
## [1] 10

Ojo: se puede tener los siguientes resultados

Unimodal: Una sola moda Bimodal: Dos modas Multimodal: Más de Dos modas Amodal: No hay valor mas frecuente.

Interpretacion: La nota mas frecuente de la Calificación final es 10, por lo tanto tenemos una moda unimodal.

Medidas de Variabilidad O Dispercion

Rango

La medida de variabilidad más sencilla es el Rango, para calcular esta medida hay que restar el valor máximo de los datos menos el valor menor.

#Opcion 1 
rango = max(d3$G3) - min(d3$G3)
rango
## [1] 20
#Opcion 2
range(d3$G3) 
## [1]  0 20
#Se tiene que restar los valores, en esta situacion no es necesario ya que el valor menor es 0

Varianza

Representa en cuanto difiere el valor de cada observación (\(x_i\)) de la media de los datos. A diferencia de las medidas anteriores, la varianza emplea todos los datos disponibles de la variable. Se recomienda su uso cuando se compara las variabilidades de dos o más variables.

\(s^2=\frac{\sum_{i=1}^n\left(x_i-\bar{x}\right)^2}{n-1}\)

var(d3$G3)
## [1] 14.93665

Deviacion estandar

Llamada también desviación típica, es la medida de dispersión más importante y de mayor uso en trabajos estadísticos. Un valor relativamente grande, significa, que la generosidad de los datos está alejados de la media y así recíprocamente.

#Opcion 1
sqrt(var(d3$G3))
## [1] 3.864796
#Opcion 2
sd(d3$G3)
## [1] 3.864796

Interpretacion: La variabilidad promedio de los datos respecto a la media es de 14.93665. Interpretacion 2: Las notas de los estudiantes de la Calificacion final se alejan de la media 3.864796 en promedio.

Coeficiente de variación

El coeficiente de variación (CV) es una medida estadística que indica porcentualmente qué tan separados están los datos en relación con su promedio. Se obtiene al dividir la desviación estándar (S) entre el promedio (\(\bar{x}\))

\[ C V=\frac{S}{\bar{x}} \times 100 \]

• Si CV ≤ 30%, entonces la distribución es homogénea y la media es representativa. • Si CV > 30%, entonces la distribución no es homogénea y la media no es representativa. En este caso debemos tomar la mediana como medida representativa.

coeficiente_var = sd(d3$G3)/mean(d3$G3)*100
coeficiente_var
## [1] 34.07522

Interpretación: Como el coeficiente de variacion es 34.07522 > 30%, entonces la distribución de las notas no es homogenea, por lo tanto tomaremos la mediana como medida representaviva, La mediana es 11.

##Otras formas de obtenerlo es:

#Con la funcion summary
summary(d3$G3)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00   10.00   11.00   11.34   14.00   20.00
#Con la funcion psych
library(psych)
describe(d3$G3)
##    vars    n  mean   sd median trimmed  mad min max range  skew kurtosis   se
## X1    1 1044 11.34 3.86     11   11.66 2.97   0  20    20 -0.98     1.72 0.12
#Con la funcion pastecs
library(pastecs)
stat.desc(d3$G3)
##      nbr.val     nbr.null       nbr.na          min          max        range 
## 1.044000e+03 5.300000e+01 0.000000e+00 0.000000e+00 2.000000e+01 2.000000e+01 
##          sum       median         mean      SE.mean CI.mean.0.95          var 
## 1.184100e+04 1.100000e+01 1.134195e+01 1.196124e-01 2.347084e-01 1.493665e+01 
##      std.dev     coef.var 
## 3.864796e+00 3.407522e-01

VIII. Medidas estadísticas de posición

Quantiles

quantile(d3$G3)
##   0%  25%  50%  75% 100% 
##    0   10   11   14   20

Segun los resultados:

El valor minimo de la calificacion final es 0

Cuartil 1 \((Q_1)\)

interpretacion es 10; El 25% de los estudiantes tuvieron de calificacion final como nota maxima un 10.

Cuartil 2 \((Q_2)\)

interpretacion es 11; El 50% de los estudiantes tuvieron de calificacion final como nota maxima un 11.

Cuartil 3 \((Q_3)\)

interpretacion es 14; El 75% de los estudiantes tuvieron de calificacion final como nota maxima un 14.

Dividir en 10 grupos(deciles)

quantile(d3$G3, probs = seq(0 , 1 , 0.1))
##   0%  10%  20%  30%  40%  50%  60%  70%  80%  90% 100% 
##    0    8    9   10   11   11   12   13   14   16   20

Dividir en 100 grupos(percentiles)

quantile(d3$G3, probs = seq(0 , 1 , 0.01))
##    0%    1%    2%    3%    4%    5%    6%    7%    8%    9%   10%   11%   12% 
##  0.00  0.00  0.00  0.00  0.00  0.15  5.58  6.00  7.00  7.00  8.00  8.00  8.00 
##   13%   14%   15%   16%   17%   18%   19%   20%   21%   22%   23%   24%   25% 
##  8.00  8.00  8.00  8.88  9.00  9.00  9.00  9.00  9.00  9.46 10.00 10.00 10.00 
##   26%   27%   28%   29%   30%   31%   32%   33%   34%   35%   36%   37%   38% 
## 10.00 10.00 10.00 10.00 10.00 10.00 10.00 10.00 10.00 10.00 10.00 11.00 11.00 
##   39%   40%   41%   42%   43%   44%   45%   46%   47%   48%   49%   50%   51% 
## 11.00 11.00 11.00 11.00 11.00 11.00 11.00 11.00 11.00 11.00 11.00 11.00 11.00 
##   52%   53%   54%   55%   56%   57%   58%   59%   60%   61%   62%   63%   64% 
## 12.00 12.00 12.00 12.00 12.00 12.00 12.00 12.00 12.00 12.23 13.00 13.00 13.00 
##   65%   66%   67%   68%   69%   70%   71%   72%   73%   74%   75%   76%   77% 
## 13.00 13.00 13.00 13.00 13.00 13.00 13.00 14.00 14.00 14.00 14.00 14.00 14.00 
##   78%   79%   80%   81%   82%   83%   84%   85%   86%   87%   88%   89%   90% 
## 14.00 14.00 14.00 15.00 15.00 15.00 15.00 15.00 15.00 15.00 15.00 16.00 16.00 
##   91%   92%   93%   94%   95%   96%   97%   98%   99%  100% 
## 16.00 16.00 16.00 17.00 17.00 17.00 18.00 18.00 18.00 20.00

Coeficiente de asimetría y curtosis

Asimetría

library(fBasics)
skewness(d3$G3)
## [1] -0.9831332
## attr(,"method")
## [1] "moment"

Resultado: -0.9831332, como el valor es negativo, entonces la distribucion de los datos es asimétrica negativa, esto quiere decir que los valores estan concentrados en los puntos mas grandes (la mayoria de los estudiantes tienen una nota buena)

ggplot(d3, aes(x = G3))+
  geom_histogram(binwidth = 1, fill = "skyblue", color = "black")+
  labs(title = "Histograma de G3 (Calificación Final)")+
  theme_classic()+
  xlab("Calificación Final")+
  ylab("Cantidad")

Curtosis

kurtosis(d3$G3)
## [1] 1.721178
## attr(,"method")
## [1] "excess"

Resultado: 1.721178, el valor es menor que 3, por lo tanto la distribucion de los datos es platicúrtica, quiere decir que los valores de los datos están menos concentrados alrededor de la media y hay más valores atípicos.

IX. Manejo de datos Missing

#Cargamos una version con datos perdidos De la informacion obtenida en el curso de matematicas.
d4 <- read.csv("missing.csv", sep = ";" , stringsAsFactors = TRUE)
#Motramos los primeros datos
head(d4)
##   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

Verificación de valores perdidos

#Verificar columnas con missing
which(colSums(is.na(d4))!=0)
##   Walc health     G1     G2     G3 
##     28     29     31     32     33
#Verificamos las filas que tienen valores perdidos
a<-which(rowSums(is.na(d4))!=0)
length(a)*100/dim(d4)[1]
## [1] 2.025316

Realizar el analisis utilizando librerias

library(VIM)
library(mice)
resumen_missing = aggr(d4,numbers=T)

summary(resumen_missing)
## 
##  Missings per variable: 
##    Variable Count
##      school     0
##         sex     0
##         age     0
##     address     0
##     famsize     0
##     Pstatus     0
##        Medu     0
##        Fedu     0
##        Mjob     0
##        Fjob     0
##      reason     0
##    guardian     0
##  traveltime     0
##   studytime     0
##    failures     0
##   schoolsup     0
##      famsup     0
##        paid     0
##  activities     0
##     nursery     0
##      higher     0
##    internet     0
##    romantic     0
##      famrel     0
##    freetime     0
##       goout     0
##        Dalc     0
##        Walc     3
##      health     1
##    absences     0
##          G1     3
##          G2     1
##          G3     1
## 
##  Missings in combinations of variables: 
##                                                       Combinations Count
##  0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0   387
##  0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1     1
##  0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0     1
##  0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0     2
##  0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0     1
##  0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0     2
##  0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:1:0:0     1
##     Percent
##  97.9746835
##   0.2531646
##   0.2531646
##   0.5063291
##   0.2531646
##   0.5063291
##   0.2531646

Para determinar mejor los patrones de comportamiento de missing se puede utilizar la siguiente función

matrixplot(d4)

Otra representación

#Con la libreria Mice
md.pattern(d4,rotate.names = T)

##     school sex age address famsize Pstatus Medu Fedu Mjob Fjob reason guardian
## 387      1   1   1       1       1       1    1    1    1    1      1        1
## 2        1   1   1       1       1       1    1    1    1    1      1        1
## 2        1   1   1       1       1       1    1    1    1    1      1        1
## 1        1   1   1       1       1       1    1    1    1    1      1        1
## 1        1   1   1       1       1       1    1    1    1    1      1        1
## 1        1   1   1       1       1       1    1    1    1    1      1        1
## 1        1   1   1       1       1       1    1    1    1    1      1        1
##          0   0   0       0       0       0    0    0    0    0      0        0
##     traveltime studytime failures schoolsup famsup paid activities nursery
## 387          1         1        1         1      1    1          1       1
## 2            1         1        1         1      1    1          1       1
## 2            1         1        1         1      1    1          1       1
## 1            1         1        1         1      1    1          1       1
## 1            1         1        1         1      1    1          1       1
## 1            1         1        1         1      1    1          1       1
## 1            1         1        1         1      1    1          1       1
##              0         0        0         0      0    0          0       0
##     higher internet romantic famrel freetime goout Dalc absences health G2 G3
## 387      1        1        1      1        1     1    1        1      1  1  1
## 2        1        1        1      1        1     1    1        1      1  1  1
## 2        1        1        1      1        1     1    1        1      1  1  1
## 1        1        1        1      1        1     1    1        1      1  1  1
## 1        1        1        1      1        1     1    1        1      1  1  0
## 1        1        1        1      1        1     1    1        1      1  0  1
## 1        1        1        1      1        1     1    1        1      0  1  1
##          0        0        0      0        0     0    0        0      1  1  1
##     Walc G1  
## 387    1  1 0
## 2      1  0 1
## 2      0  1 1
## 1      0  0 2
## 1      1  1 1
## 1      1  1 1
## 1      1  1 1
##        3  3 9

La libreria visdat permite visualizar missing pero los ordena por tipo de dato

library(visdat)
vis_dat(d4)

Para obtener columnas con porcentajes de missing

vis_miss(d4)

Corrección de missing

Eliminar filas o culumnas con missing (es recomendable optar por eliminar columnas si el porcentaje de missing esta por arriba de 15% <para algunos expertos 30%>)

solo para este ejemplo se va a eliminar filas:

d4_corregido1<- na.omit(d4)
str(d4_corregido1)
## 'data.frame':    387 obs. of  33 variables:
##  $ school    : Factor w/ 2 levels "GP","MS": 1 1 1 1 1 1 1 1 1 1 ...
##  $ sex       : Factor w/ 2 levels "F","M": 1 1 1 1 1 2 2 1 2 2 ...
##  $ age       : int  18 17 15 15 16 16 16 17 15 15 ...
##  $ address   : Factor w/ 2 levels "R","U": 2 2 2 2 2 2 2 2 2 2 ...
##  $ famsize   : Factor w/ 2 levels "GT3","LE3": 1 1 2 1 1 2 2 1 2 1 ...
##  $ Pstatus   : Factor w/ 2 levels "A","T": 1 2 2 2 2 2 2 1 1 2 ...
##  $ 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      : Factor w/ 5 levels "at_home","health",..: 1 1 1 2 3 4 3 3 4 3 ...
##  $ Fjob      : Factor w/ 5 levels "at_home","health",..: 5 3 3 4 3 3 3 5 3 3 ...
##  $ reason    : Factor w/ 4 levels "course","home",..: 1 1 3 2 2 4 2 2 2 2 ...
##  $ guardian  : Factor w/ 3 levels "father","mother",..: 2 1 2 2 1 2 2 2 2 2 ...
##  $ 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 : Factor w/ 3 levels "","no","yes": 3 2 3 2 2 2 1 3 2 2 ...
##  $ famsup    : Factor w/ 3 levels "","no","yes": 2 3 2 3 3 3 2 3 3 3 ...
##  $ paid      : Factor w/ 3 levels "","no","yes": 2 2 3 3 3 3 2 2 3 3 ...
##  $ activities: Factor w/ 3 levels "","no","yes": 2 2 2 3 2 3 2 2 2 3 ...
##  $ nursery   : Factor w/ 3 levels "","no","yes": 3 2 3 3 3 3 3 3 3 3 ...
##  $ higher    : Factor w/ 2 levels "no","yes": 2 2 2 2 2 2 2 2 2 2 ...
##  $ internet  : Factor w/ 3 levels "","no","yes": 2 3 3 3 2 3 3 2 3 3 ...
##  $ romantic  : Factor w/ 3 levels "","no","yes": 2 2 2 3 2 2 2 2 2 2 ...
##  $ 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 ...
##  - attr(*, "na.action")= 'omit' Named int [1:8] 67 68 78 90 98 103 109 111
##   ..- attr(*, "names")= chr [1:8] "67" "68" "78" "90" ...
which(colSums(is.na(d4_corregido1))!=0)
## named integer(0)

Aplicando tecnicas de inputación

Imputación por medidas de tendencia central

library(DMwR2)
d4_corregido2<-centralImputation(d4) #DMwR, mediana (númerico), moda(no númerico)
str(d4_corregido2)
## 'data.frame':    395 obs. of  33 variables:
##  $ school    : Factor w/ 2 levels "GP","MS": 1 1 1 1 1 1 1 1 1 1 ...
##  $ sex       : Factor w/ 2 levels "F","M": 1 1 1 1 1 2 2 1 2 2 ...
##  $ age       : int  18 17 15 15 16 16 16 17 15 15 ...
##  $ address   : Factor w/ 2 levels "R","U": 2 2 2 2 2 2 2 2 2 2 ...
##  $ famsize   : Factor w/ 2 levels "GT3","LE3": 1 1 2 1 1 2 2 1 2 1 ...
##  $ Pstatus   : Factor w/ 2 levels "A","T": 1 2 2 2 2 2 2 1 1 2 ...
##  $ 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      : Factor w/ 5 levels "at_home","health",..: 1 1 1 2 3 4 3 3 4 3 ...
##  $ Fjob      : Factor w/ 5 levels "at_home","health",..: 5 3 3 4 3 3 3 5 3 3 ...
##  $ reason    : Factor w/ 4 levels "course","home",..: 1 1 3 2 2 4 2 2 2 2 ...
##  $ guardian  : Factor w/ 3 levels "father","mother",..: 2 1 2 2 1 2 2 2 2 2 ...
##  $ 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 : Factor w/ 3 levels "","no","yes": 3 2 3 2 2 2 1 3 2 2 ...
##  $ famsup    : Factor w/ 3 levels "","no","yes": 2 3 2 3 3 3 2 3 3 3 ...
##  $ paid      : Factor w/ 3 levels "","no","yes": 2 2 3 3 3 3 2 2 3 3 ...
##  $ activities: Factor w/ 3 levels "","no","yes": 2 2 2 3 2 3 2 2 2 3 ...
##  $ nursery   : Factor w/ 3 levels "","no","yes": 3 2 3 3 3 3 3 3 3 3 ...
##  $ higher    : Factor w/ 2 levels "no","yes": 2 2 2 2 2 2 2 2 2 2 ...
##  $ internet  : Factor w/ 3 levels "","no","yes": 2 3 3 3 2 3 3 2 3 3 ...
##  $ romantic  : Factor w/ 3 levels "","no","yes": 2 2 2 3 2 2 2 2 2 2 ...
##  $ 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      : num  1 1 3 1 2 2 1 1 1 1 ...
##  $ health    : num  3 3 3 5 5 5 3 1 1 5 ...
##  $ absences  : int  6 4 10 2 4 10 0 6 0 0 ...
##  $ G1        : num  5 5 7 15 6 15 12 6 16 14 ...
##  $ G2        : num  6 5 8 14 10 15 12 5 18 15 ...
##  $ G3        : num  6 6 10 15 10 15 11 6 19 15 ...
# verificar columnas con missing
which(colSums(is.na(d4_corregido2))!=0)
## named integer(0)

Utilizamos otra libreria para imputar datos

library(VIM)
d4_corregido3<-initialise(d4,method="median") #media (continuos) mediana (discretos), moda(no númerico)
#Verificamos las dimensiones
dim(d4_corregido3)
## [1] 395  33
# verificar columnas con missing
which(colSums(is.na(d4_corregido3))!=0)
## named integer(0)

Imputación utilizando vecinos mas cercanos

d4_corregido4<-knnImputation(d4, k=10)
str(d4_corregido4)
## 'data.frame':    395 obs. of  33 variables:
##  $ school    : Factor w/ 2 levels "GP","MS": 1 1 1 1 1 1 1 1 1 1 ...
##  $ sex       : Factor w/ 2 levels "F","M": 1 1 1 1 1 2 2 1 2 2 ...
##  $ age       : int  18 17 15 15 16 16 16 17 15 15 ...
##  $ address   : Factor w/ 2 levels "R","U": 2 2 2 2 2 2 2 2 2 2 ...
##  $ famsize   : Factor w/ 2 levels "GT3","LE3": 1 1 2 1 1 2 2 1 2 1 ...
##  $ Pstatus   : Factor w/ 2 levels "A","T": 1 2 2 2 2 2 2 1 1 2 ...
##  $ 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      : Factor w/ 5 levels "at_home","health",..: 1 1 1 2 3 4 3 3 4 3 ...
##  $ Fjob      : Factor w/ 5 levels "at_home","health",..: 5 3 3 4 3 3 3 5 3 3 ...
##  $ reason    : Factor w/ 4 levels "course","home",..: 1 1 3 2 2 4 2 2 2 2 ...
##  $ guardian  : Factor w/ 3 levels "father","mother",..: 2 1 2 2 1 2 2 2 2 2 ...
##  $ 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 : Factor w/ 3 levels "","no","yes": 3 2 3 2 2 2 1 3 2 2 ...
##  $ famsup    : Factor w/ 3 levels "","no","yes": 2 3 2 3 3 3 2 3 3 3 ...
##  $ paid      : Factor w/ 3 levels "","no","yes": 2 2 3 3 3 3 2 2 3 3 ...
##  $ activities: Factor w/ 3 levels "","no","yes": 2 2 2 3 2 3 2 2 2 3 ...
##  $ nursery   : Factor w/ 3 levels "","no","yes": 3 2 3 3 3 3 3 3 3 3 ...
##  $ higher    : Factor w/ 2 levels "no","yes": 2 2 2 2 2 2 2 2 2 2 ...
##  $ internet  : Factor w/ 3 levels "","no","yes": 2 3 3 3 2 3 3 2 3 3 ...
##  $ romantic  : Factor w/ 3 levels "","no","yes": 2 2 2 3 2 2 2 2 2 2 ...
##  $ 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      : num  1 1 3 1 2 2 1 1 1 1 ...
##  $ health    : num  3 3 3 5 5 5 3 1 1 5 ...
##  $ absences  : int  6 4 10 2 4 10 0 6 0 0 ...
##  $ G1        : num  5 5 7 15 6 15 12 6 16 14 ...
##  $ G2        : num  6 5 8 14 10 15 12 5 18 15 ...
##  $ G3        : num  6 6 10 15 10 15 11 6 19 15 ...
# verificar columnas con missing
which(colSums(is.na(d4_corregido4))!=0)
## named integer(0)

X. Manejo de valores outliers

Detección de outtliers univariado - gráfica

El análisis solo se realiza para variable cuantitativas

Gráfico de cajas para la variable Age (edad)

Gráfico de cajas y bigotes

#Gráfico de cajas y bigotes
boxplot(d3$age)

Según los resultados, age (Edad) no tiene valores atípicos

Obteniendo valores atípicos para la variable studytime (tiempo de estudio)

boxplot(d3$studytime)

Para todo

boxplot.default(d4)

Para Failures (Número de fracasos)

boxplot(d3$failures)

Según los resultados, se identifica valores atípicos. Vamos a identificarlo y plantear estrategia de corrección

# Calcular el RIC (RIC = Q3 - Q1)
q1 <- quantile(d3$age, 0.25)
q3 <- quantile(d3$age, 0.75)
RIC <- q3-q1
RIC
## 75% 
##   2
# Limites o bigotes (Superior e inferior)
bigote_inferior <- q1-1.5*RIC
bigote_inferior
## 25% 
##  13
bigote_superior <- q3+1.5*RIC
bigote_superior
## 75% 
##  21
# Identificar lo valores atípicos
outliers_det <- d3$age[d3$age < bigote_inferior | d3$age > bigote_superior]
outliers_det
## [1] 22 22

Correción

Eliminar los atípicos

d3_sin_atipicos <- d3[!d3$age %in% outliers_det,]
head(d3_sin_atipicos, 10)
##    school sex age address famsize Pstatus Medu Fedu     Mjob     Fjob
## 1      GP   F  18       U     GT3       A    4    4  at_home  teacher
## 2      GP   F  17       U     GT3       T    1    1  at_home    other
## 3      GP   F  15       U     LE3       T    1    1  at_home    other
## 4      GP   F  15       U     GT3       T    4    2   health services
## 5      GP   F  16       U     GT3       T    3    3    other    other
## 6      GP   M  16       U     LE3       T    4    3 services    other
## 7      GP   M  16       U     LE3       T    2    2    other    other
## 8      GP   F  17       U     GT3       A    4    4    other  teacher
## 9      GP   M  15       U     LE3       A    3    2 services    other
## 10     GP   M  15       U     GT3       T    3    4    other    other
##        reason guardian traveltime studytime failures schoolsup famsup paid
## 1      course   mother          2         2        0       yes     no   no
## 2      course   father          1         2        0        no    yes   no
## 3       other   mother          1         2        0       yes     no   no
## 4        home   mother          1         3        0        no    yes   no
## 5        home   father          1         2        0        no    yes   no
## 6  reputation   mother          1         2        0        no    yes   no
## 7        home   mother          1         2        0        no     no   no
## 8        home   mother          2         2        0       yes    yes   no
## 9        home   mother          1         2        0        no    yes   no
## 10       home   mother          1         2        0        no    yes   no
##    activities nursery higher internet romantic famrel freetime goout Dalc Walc
## 1          no     yes    yes       no       no      4        3     4    1    1
## 2          no      no    yes      yes       no      5        3     3    1    1
## 3          no     yes    yes      yes       no      4        3     2    2    3
## 4         yes     yes    yes      yes      yes      3        2     2    1    1
## 5          no     yes    yes       no       no      4        3     2    1    2
## 6         yes     yes    yes      yes       no      5        4     2    1    2
## 7          no     yes    yes      yes       no      4        4     4    1    1
## 8          no     yes    yes       no       no      4        1     4    1    1
## 9          no     yes    yes      yes       no      4        2     2    1    1
## 10        yes     yes    yes      yes       no      5        5     1    1    1
##    health absences G1 G2 G3
## 1       3        4  0 11 11
## 2       3        2  9 11 11
## 3       3        6 12 13 12
## 4       5        0 14 14 14
## 5       5        0 11 13 13
## 6       5        6 12 12 13
## 7       3        0 13 12 13
## 8       1        2 10 13 13
## 9       1        0 15 16 17
## 10      5        0 12 12 13

Para confirmar vamos a realizar un gráfico de cajas con la nueva data

boxplot(d3_sin_atipicos$age)

XI. Transformación de variables

La transformación de variables es una técnica utilizada en estadística y análisis de datos para modificar una variable con el objetivo de cumplir con ciertos supuestos o mejorar la interpretación de los datos. Esta transformación implica aplicar una función matemática a los valores de la variable original para obtener una nueva variable.

La transformación de variables implica aplicar una función matemática a los valores de una variable con el objetivo de modificar su distribución o relación con otras variables. Algunas transformaciones comunes incluyen la transformación logarítmica, la transformación exponencial y la transformación de raíz cuadrada. Estas transformaciones se utilizan principalmente cuando los datos presentan asimetría o heterocedasticidad. Por ejemplo, si se tiene una variable con una distribución sesgada hacia la derecha, se puede aplicar una transformación logarítmica para reducir la asimetría y hacer que los datos se aproximen más a una distribución normal (gráfica o distribución se asemeja a la campana de Gauss).

Existen diferentes tipos de transformaciones de variables que se utilizan según las características de los datos y los objetivos del análisis. Algunas de las transformaciones más comunes son:

  • Transformación de Box-Cox: Es una transformación paramétrica que puede utilizarse para corregir diferentes tipos de asimetría. La transformación de Box-Cox permite encontrar el valor óptimo del parámetro lambda (λ) que maximiza la simetría de los datos.

Transformación de raíz cuadrada:

Esta transformación se utiliza para reducir la dispersión de los datos cuando estos tienen una distribución con una varianza que aumenta con el nivel medio de la variable. También puede ayudar a reducir la asimetría.

# Original
hist(d3$age, 12)

Para sacar la raiz cuadrada, simplemente se puede utilizar la función sqrt

head(sqrt(d3$age), 10)
##  [1] 4.242641 4.123106 3.872983 3.872983 4.000000 4.000000 4.000000 4.123106
##  [9] 3.872983 3.872983

Graficamente

hist(sqrt(d3$age))

Transformación exponencial:

Se aplica cuando los datos tienen una distribución sesgada hacia la izquierda (asimetría negativa). La transformación exponencial puede ayudar a corregir la asimetría y hacer que los datos se aproximen más a una distribución simétrica.

en r para poder obtener esta transformación, se debe utilizar la función exp()

# Se muestras los primeros valors para una mejor lectura.
head(exp(d3$studytime))
## [1]  7.389056  7.389056  7.389056 20.085537  7.389056  7.389056

para poder observarlo graficamente se tiene:

hist(exp(d3$studytime))

Forma 2

studytime_exp<- exp(d3$studytime)
hist(studytime_exp)

Transformación logarítmica:

Esta transformación se utiliza cuando los datos presentan una distribución sesgada hacia la derecha (asimetría positiva). La transformación logarítmica reduce la asimetría y puede facilitar la interpretación de los datos.

Para la transformación logaritmica, utilizar log (dentro de los argumentos se puede cambiar la base)

Uso de la variable Absences (Número de ausencias escolares)

# Solo se muestran los primeros datos
head(log(d3$absences))
## [1] 1.3862944 0.6931472 1.7917595      -Inf      -Inf 1.7917595

graficamente

hist(log(d3$absences))

Cambiar la base 2

# Solo se muestran los primeros datos
head(log(d3$absences, base=2))
## [1] 2.000000 1.000000 2.584963     -Inf     -Inf 2.584963

graficamente

hist(log(d3$absences, base=2))

Comparación de transformaciones

#Obtener solo transformaciones
abs_sqrt <- sqrt(d3$absences)
abs_exp <- exp(d3$absences)
abs_ln <- log(d3$absences)
abs_log2 <- log(d3$absences, base=2)
abs_log5 <- log(d3$absences, base=5)

Ver graficamente cada una:

par(mfrow=c(3,2))
hist(d3$absences)
hist(abs_sqrt)
hist(abs_exp)
hist(abs_ln)
hist(abs_log2)
hist(abs_log5)

par(mfrow=c(1,1))

Este tipo de transformaciones, busca que los datos sean simétricos (distribución forma de campana) o que se cumpla un supuesto estadístico

La visualización de la distribución puede mejorarse con la gráfica de densidad

par(mfrow=c(3,2))
plot(density(d3$absences), main = "Distribución de ausencias escolares originales")
plot(density(abs_sqrt), main = "Distribución de ausencias escolares transformadas - sqrt")
plot(density(abs_exp), main = "Distribución de ausencias escolares transformadas - exp")
plot(density(abs_ln), main = "Distribución de ausencias escolares transformadas - ln")
plot(density(abs_log2), main = "Distribución de ausencias escolares transformadas - log2")
plot(density(abs_log5), main = "Distribución de ausencias escolares transformadas - log5")

par(mfrow=c(1,1))    

Se puede realizar un análisis general de las variables originales y verificar su comportmiento, a partir de allí se puede aplicar la transformación más adecuado según objetivo.

gráfica general

library(PerformanceAnalytics)
chart.Correlation(cor(d3[,30:33]), histogram = TRUE)

XII. Estandarización y normalización de variables

Estandarización de variables:

La estandarización de variables, también conocida como normalización, implica transformar los valores de una variable para que tengan una media de cero y una desviación estándar de uno. Esto se logra restando la media de la variable a cada valor y dividiendo por la desviación estándar.

La estandarización es útil cuando se desea comparar variables que están en diferentes escalas o unidades. Al estandarizar las variables, se eliminan las diferencias en las escalas y se asegura que todas las variables tengan la misma escala relativa.

Por ejemplo, si tienes un conjunto de variables con diferentes unidades de medida, como peso en kilogramos y altura en metros, puedes estandarizar ambas variables para que sean comparables y no se vean afectadas por las diferencias en las unidades.

Estandarización:

Desde el punto de vista estadistico la estandarización se aplica a la transformación Z: se debe restar cada dato con su media y dividir este resultado con la desviación estándar.

\[ Z = \frac{x_i-\mu}{\sigma} \]

Donde: - \(X_i\) representa cada dato dentro del caso - \(\mu\) Es la media poblacional (promedio) - \(\sigma\) Es la desviación estándar poblacional.

head(d3)
##   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        0       yes     no   no         no
## 4   mother          1         3        0        no    yes   no        yes
## 5   father          1         2        0        no    yes   no         no
## 6   mother          1         2        0        no    yes   no        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        4  0 11 11
## 2        2  9 11 11
## 3        6 12 13 12
## 4        0 14 14 14
## 5        0 11 13 13
## 6        6 12 12 13

Vamos a aplicar estandarización Z a la variable Monto de manera manual

Metodo 1: Por partes

media_G1 <- mean(d3$G1)
media_G1
## [1] 11.2136
desv_est <- sd(d3$G1)
desv_est
## [1] 2.983394
G1_estandar <- (d3$G1 - media_G1) / desv_est
head(G1_estandar, 10)
##  [1] -3.75867277 -0.74197427  0.26359190  0.93396934 -0.07159682  0.26359190
##  [7]  0.59878062 -0.40678555  1.26915806  0.26359190

Metodo 2: Directo

G1_estandar2 <- (d3$G1-mean(d3$G1))/sd(d3$G1)
head(G1_estandar2, 10)
##  [1] -3.75867277 -0.74197427  0.26359190  0.93396934 -0.07159682  0.26359190
##  [7]  0.59878062 -0.40678555  1.26915806  0.26359190

Metodo 3: Apoyarse en las funciones de R

R tiene multiples funciones para estandarizar, la clasica es la función scale

#Función Scale
G1_estandar3 <- scale(d3$G1)
head(G1_estandar3, 10)
##              [,1]
##  [1,] -3.75867277
##  [2,] -0.74197427
##  [3,]  0.26359190
##  [4,]  0.93396934
##  [5,] -0.07159682
##  [6,]  0.26359190
##  [7,]  0.59878062
##  [8,] -0.40678555
##  [9,]  1.26915806
## [10,]  0.26359190

La ventaja de la función de R es que se puede enviar todo el caso

d3_cuantita_scale <- scale(d3[ ,30:33])
head(d3_cuantita_scale, 10)
##          absences          G1          G2         G3
##  [1,] -0.07002653 -3.75867277 -0.07493554 -0.0884792
##  [2,] -0.39208686 -0.74197427 -0.07493554 -0.0884792
##  [3,]  0.25203380  0.26359190  0.53387929  0.1702667
##  [4,] -0.71414719  0.93396934  0.83828671  0.6877585
##  [5,] -0.71414719 -0.07159682  0.53387929  0.4290126
##  [6,]  0.25203380  0.26359190  0.22947188  0.4290126
##  [7,] -0.71414719  0.59878062  0.22947188  0.4290126
##  [8,] -0.39208686 -0.40678555  0.53387929  0.4290126
##  [9,] -0.71414719  1.26915806  1.44710154  1.4639961
## [10,] -0.71414719  0.26359190  0.22947188  0.4290126

Recordar En una sesión anterior se realizo gráficos de cajas para verificar la presencia de outliers No se recomienda trabajar con valores originales para la siguiente gráfica

boxplot(d3[,30:33])

Lo mas recomendable es realizar el gráfico con los valores de las variables transformadas

boxplot(d3_cuantita_scale)

Normalización:

Estandarización min-max: Consiste en dividir o en restar cada dato con el valor minimo y a esta operación se le divide con la resta del valor máximo con el minimo. Esto permite que los resultados varien solo entre 0 y 1

\[ X_{norm}=\frac{\left(X_i-X_{\min }\right)}{X_{\max }-X_{\min }} \]

Método 1:

G2_normal <- (d3$G2 - min(d3$G2))/(max(d3$G2) - min(d3$G2))
head(G2_normal, 10)
##  [1] 0.5789474 0.5789474 0.6842105 0.7368421 0.6842105 0.6315789 0.6315789
##  [8] 0.6842105 0.8421053 0.6315789

Método 2:

library(scales)
## 
## Attaching package: 'scales'
## The following objects are masked from 'package:psych':
## 
##     alpha, rescale
## The following object is masked from 'package:epiDisplay':
## 
##     alpha
res_G2 <- rescale(d3$G2)
head(res_G2, 10)
##  [1] 0.5789474 0.5789474 0.6842105 0.7368421 0.6842105 0.6315789 0.6315789
##  [8] 0.6842105 0.8421053 0.6315789

Aplicando a todo el caso (var cuantitativas) La función rescale solo permite aplicarse a vectores, no es posible directamente aplicar al data frame.

library(ggplot2)
library(caret)
pre_procesamiento <- preProcess(d3[,30:33]) # Asi por defecto muestra la estandarización Z
head(predict(pre_procesamiento, d3[,30:33]), 10)
##       absences          G1          G2         G3
## 1  -0.07002653 -3.75867277 -0.07493554 -0.0884792
## 2  -0.39208686 -0.74197427 -0.07493554 -0.0884792
## 3   0.25203380  0.26359190  0.53387929  0.1702667
## 4  -0.71414719  0.93396934  0.83828671  0.6877585
## 5  -0.71414719 -0.07159682  0.53387929  0.4290126
## 6   0.25203380  0.26359190  0.22947188  0.4290126
## 7  -0.71414719  0.59878062  0.22947188  0.4290126
## 8  -0.39208686 -0.40678555  0.53387929  0.4290126
## 9  -0.71414719  1.26915806  1.44710154  1.4639961
## 10 -0.71414719  0.26359190  0.22947188  0.4290126
pre_procesamiento <- preProcess(d3[,30:33], method = "range")
head(predict(pre_procesamiento, d3[,30:33]), 10)
##      absences        G1        G2   G3
## 1  0.05333333 0.0000000 0.5789474 0.55
## 2  0.02666667 0.4736842 0.5789474 0.55
## 3  0.08000000 0.6315789 0.6842105 0.60
## 4  0.00000000 0.7368421 0.7368421 0.70
## 5  0.00000000 0.5789474 0.6842105 0.65
## 6  0.08000000 0.6315789 0.6315789 0.65
## 7  0.00000000 0.6842105 0.6315789 0.65
## 8  0.02666667 0.5263158 0.6842105 0.65
## 9  0.00000000 0.7894737 0.8421053 0.85
## 10 0.00000000 0.6315789 0.6315789 0.65

XIII. Modelamiento predictivo

Objetivo:

Probar que existe relación lineal entre el tiempo de estudio semanal, Número de fracasos en clases pasadas y las calificaciones finales, y Analizar/predecir como el tiempo de estudio, y el numero de fracasos, afectan en las calificaciones finales. Se identificaron las siguientes variables:

  • studytime : Tiempo de estudio semanal
  • failures : Número de fracasos en clases pasadas
  • G3 : Calificaciones finales

Se desea realizar un modelo de regresión, de tal manera que permita predecir eventos futuros

Pasos para construir un modelo de regresión:

Paso 1: Determinar las variables X,Y

  • Variable independiente (X): studytime, failures
  • Variable dependiente (y): G3

Paso 2: Evaluar la relación entre variables (Correlación) graficamente, para ello se realiza:

Diagrama de dispersión de studytime(Tiempo de estudio) con G3(Calificacion Final)

# Gráfico con plot
plot(x=d3$studytime,y=d3$G3)

Interpretación 1: Según los resultados entre studytime y G3, Se observa que no hay correlación.

Diagrama de dispersión de failures(número de fracasos en clases pasadas) con G3(Calificacion Final)

# Gráfico con plot
plot(x=d3$failures,y=d3$G3)

# Gráfico con pairs
pairs(d3[, c("failures", "G3")])

Interpretación 2: Según los resultados, hay una correlación lineal negativa entre failures (número de fracasos) y G3 (Calificacion Final).

Coeficiente de correlación

# Mediante la función cor

## studytime y G3
cor(d3[, c("studytime", "G3")]) # Matriz de correlaciones
##           studytime        G3
## studytime 1.0000000 0.1616289
## G3        0.1616289 1.0000000
## failures y G3
cor(d3[, c("failures", "G3")]) # Matriz de correlaciones
##            failures         G3
## failures  1.0000000 -0.3831453
## G3       -0.3831453  1.0000000

Coeficiente de correlación:

r1 = 0.1616289
r2 = -0.3831453

Interpretación 1: Existe correlación positiva muy baja entre studytime y G3.

Interpretación 2: Existe correlación negativa baja entre failures y G3.

(Recordar: Si el r es menor que 0.35 para algunos autores, no es viable la regresión, para otros autores se debe probar hipótesis)

Como en el segundo caso el coeficiente de correlación es superior a 0.35, se realizara la regresión, ya que es mas viable.

Paso 3: Regresión

a. Regresión Lineal (simple)

Modelo general
\(\hat{Y} = b_0 + b_1X\)

Modelo para el caso: \(\hat{G3} = b_0 + b_1 failures\)

Para obtener el modelo, se va a utilizar una función de R > lm

# lm, notación: Y ~ X, data=
modelo1 <- lm(G3 ~ failures, data=d3)

# Resumen de resultados
summary(modelo1)
## 
## Call:
## lm(formula = G3 ~ failures, data = d3)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -11.9386  -1.9386   0.0614   2.0614   8.3182 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  11.9386     0.1192  100.17   <2e-16 ***
## failures     -2.2568     0.1685  -13.39   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.572 on 1042 degrees of freedom
## Multiple R-squared:  0.1468, Adjusted R-squared:  0.146 
## F-statistic: 179.3 on 1 and 1042 DF,  p-value: < 2.2e-16
## Coefficients:
##            Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  11.9386     0.1192  100.17   <2e-16 ***
## failures     -2.2568     0.1685  -13.39   <2e-16 ***
## ---
## Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
##
## Residual standard error: 3.572 on 1042 degrees of freedom
## Multiple R-squared:  0.1468, Adjusted R-squared:  0.146 
## F-statistic: 179.3 on 1 and 1042 DF,  p-value: < 2.2e-16

Modelo final con los resultados:

Modelo general

\(\hat{Y} = 11.9386 -2.2568X\)

Modelo para el caso:

\(\hat{G3} = 11.9386 -2.2568 failures\)

Visualizamos la recta de ajuste

plot(d3$failures, d3$G3)
abline(modelo1,lwd=3,col="red")

Predicciones: Para predecir se utiliza el modelo ajustado y se reemplaza x por el valor solicitado Por ejemplo, si las failures(numero de fracasos) fuese de 2 ¿Cuánto seria la Calificación final en promedio?
\(\hat{G3} = 11.9386 -2.2568 (2)\)
\(\hat{G3} = 7,425\)

El valor predicho para la Calificación final seria de 7,425.

Mostramos los gráficos de los resultados

par(mfrow=c(2,2))
plot(modelo1)

b. Regresion multiple

La regresión lineal múltiple generaliza el modelo de regresión lineal simple al permitir muchos regresores en una función media. Comenzamos agregando solo un regresor a la función media de regresión simple porque las ideas se generalizan al agregar muchos regresores.

El modelo de regresión lineal múltiple El modelo general de regresión lineal múltiple con respuesta \(Y\) y regresores \(X_1\); . . . ;\(X_p\) tendrá la forma:

\(\hat{Y} = β_o + β_1x_1 + β_2x_2 + ... + β_px_p + ∈\)

Ajustamos el modelo de regresión

modelo2 <- lm(G3 ~ failures + studytime, data=d3)
modelo2
## 
## Call:
## lm(formula = G3 ~ failures + studytime, data = d3)
## 
## Coefficients:
## (Intercept)     failures    studytime  
##     10.9477      -2.1620       0.4902
##Coefficients:
##(Intercept)     failures    studytime  
##    10.9477      -2.1620       0.4902 

Se muestran los coeficientes, por lo tanto, si el modelo fuera válido sería:

\(\hat{Y} = 10.9477 - 2.1620x_1 + 0.4902x_2\)

Significación global del modelo

La significancia se determinará utilizando el estadístico F

El valor podemos obtenerlo Mostranso un resumen del modelo (summary)

summary(modelo2)
## 
## Call:
## lm(formula = G3 ~ failures + studytime, data = d3)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -12.9085  -1.5150   0.0915   2.2340   8.7242 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  10.9477     0.2944  37.191  < 2e-16 ***
## failures     -2.1620     0.1695 -12.754  < 2e-16 ***
## studytime     0.4902     0.1333   3.677 0.000248 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.55 on 1041 degrees of freedom
## Multiple R-squared:  0.1577, Adjusted R-squared:  0.1561 
## F-statistic: 97.48 on 2 and 1041 DF,  p-value: < 2.2e-16

El valor del estadístico F es F-statistic: 97.48

Su p-value: < 2.2e-16 < 0.05 esto quiere decir que se rechaza ho

Modelo ajustado

El modelo ajustado aplicando el MMCO (Método de Mínimos Cuadrados Ordinarios) seria:

\(\hat{Y} = β_0 + β_1x_1 + β_2x_2 + ... + β_px_p + ε\)

Donde:

  • \(Y\) es la variable dependiente.

  • \(X_0,X_1,...,X_p\) son las variables independientes.

  • \(β_0,β_1,...,β_p\) son los Coeficientes a estimar.

c. Regresión logística (Binaria)

La regresión logística es un tipo de modelo de regresión utilizado para predecir la probabilidad de que una variable dependiente binaria tome uno de dos valores posibles (generalmente 0 o 1). La función logística se utiliza para transformar una combinación lineal de variables predictoras en una probabilidad entre 0 y 1.

Preparación de los datos:

Asegúrate de tener un conjunto de datos que incluya la variable dependiente binaria (por ejemplo, 0 o 1) y las variables predictoras (en nuestro caso seran failures y studytime).

#Agregamos la linea aprobacion en la database
#Si su Calificacion final es mayor a 10 estonces esta aprobado, y toma el valor de 1, de lo contrario toma el valor de 0 (desaprobado).
d3$aprobacion <- ifelse(d3$G3 >=10, 1, 0)

head(d3$aprobacion, 10)
##  [1] 1 1 1 1 1 1 1 1 1 1

Ajuste de modelo:

Utilizamos la función glm para ajustar un modelo de regresión logística.

# Análisis de regresión logística
modelo_logistico <- glm(aprobacion ~ failures + studytime, data = d3, family = "binomial")
#Mostramos un resumen del modelo
summary(modelo_logistico)
## 
## Call:
## glm(formula = aprobacion ~ failures + studytime, family = "binomial", 
##     data = d3)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   1.2749     0.2158   5.909 3.45e-09 ***
## failures     -1.1135     0.1184  -9.408  < 2e-16 ***
## studytime     0.1941     0.1018   1.908   0.0565 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1100.99  on 1043  degrees of freedom
## Residual deviance:  979.84  on 1041  degrees of freedom
## AIC: 985.84
## 
## Number of Fisher Scoring iterations: 4

Coeficientes del Modelo:

  • Intercept: 1.2749 (p < 0.001)

  • failures: -1.1135 (p < 0.001)

  • studytime: 0.1941 (p = 0.0565)

Interpretación de Coeficientes:

El intercepto indica que cuando todas las variables predictoras son cero, las odds de aprobación son aproximadamente 3.57 veces mayores.

Por cada aumento en el número de fracasos (failures), las odds(posibilidades) de aprobación disminuyen en aproximadamente un 32.8%.

Aunque la relación no es estadísticamente significativa, un aumento en el tiempo de estudio semanal (studytime) tiende a asociarse con un aumento en las odds(posibilidades) de aprobación.

Estadísticas de Ajuste:

  • Devianza Nula: 1100.99 (grados de libertad: 1043)

  • Devianza Residual: 979.84 (grados de libertad: 1041)

  • AIC: 985.84

Resultados:

  • Número de Fracasos: Tener mucho fracasos hace que sea más difícil aprobar.

  • Tiempo de Estudio Semanal: alparecer en este estudio no tiene mucha importancia cuánto tiempo estudies; hay otros factores que son más importantes.

Conclusiones

Basado en el análisis realizado, se extraen las siguientes conclusiones clave:

  • El análisis resalta la presencia significativa de apoyo educativo adicional (schoolsup), clases extra pagadas (paid) y apoyo educativo familiar(famsup), sugiriendo que los estudiantes de estas instituciones tienen recursos adicionales y oportunidades de aprendizaje más allá del plan de estudios estándar.

  • A pesar de la disponibilidad de recursos adicionales, es notable que las calificaciones finales de los estudiantes son consistentemente bajas, con una moda de 10 y una predicción promedio de 7.425. Este hallazgo plantea la necesidad de una exploración más profunda para comprender las posibles razones detrás de este fenómeno y tomar medidas correctivas.

  • La relación negativa entre el número de fracasos académicos (failures) y las calificaciones finales resalta mucho, ya que tener muchos fracasos hace que a los estudiantes les sea más difícil aprobar.

  • El tiempo de estudio semanal (studytime) no muestra una correlación estadísticamente significativa con las calificaciones finales. Esto sugiere que, aunque el estudio es fundamental, existen otros factores que también influyen en el rendimiento académico y merecen una atención más detallada.

Recomendaciones

Con base en las conclusiones anteriores, se formulan las siguientes recomendaciones:

Optimizar Utilización de Recursos:

  • Evaluar cómo los recursos adicionales, como el apoyo educativo adicional (schoolsup), las clases extra pagadas (paid) y el apoyo educativo familiar (famsup), están siendo utilizados. Implementar estrategias para optimizar su impacto en el rendimiento académico y asegurarse de que lleguen efectivamente a todos los estudiantes.

Investigación Detallada sobre Bajas Calificaciones:

  • Llevar a cabo una investigación detallada para comprender las posibles razones detrás de las consistentemente bajas calificaciones finales. Esto podría incluir encuestas a estudiantes, evaluación de métodos de enseñanza y análisis de factores extracurriculares que puedan estar afectando el rendimiento académico.

Establecer Estrategias de Acompañamiento:

  • Implementar estrategias de acompañamiento y mentoría que brinden apoyo continuo a los estudiantes, especialmente a aquellos que enfrentan dificultades académicas. El establecimiento de conexiones significativas con los educadores puede tener un impacto positivo en la motivación y el compromiso estudiantil.