# En este espacio cargamos las librerías y los datos al codigo para facilitar el proceso de creación de las gráficas. 

library(ggplot2)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(randomForest)
## randomForest 4.7-1.1
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attaching package: 'randomForest'
## The following object is masked from 'package:dplyr':
## 
##     combine
## The following object is masked from 'package:ggplot2':
## 
##     margin
library(class)
library(rpart)
library(rpart.plot)
library(e1071)
library(caret)
## Loading required package: lattice
library(caTools)
library(party)
## Loading required package: grid
## Loading required package: mvtnorm
## Loading required package: modeltools
## Loading required package: stats4
## Loading required package: strucchange
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: sandwich
## 
## Attaching package: 'party'
## The following object is masked from 'package:dplyr':
## 
##     where
## input =====================================================================================

data <- read.csv("xAPI-Edu-Data.csv")
str(data)
## 'data.frame':    480 obs. of  17 variables:
##  $ gender                  : chr  "M" "M" "M" "M" ...
##  $ NationalITy             : chr  "KW" "KW" "KW" "KW" ...
##  $ PlaceofBirth            : chr  "KuwaIT" "KuwaIT" "KuwaIT" "KuwaIT" ...
##  $ StageID                 : chr  "lowerlevel" "lowerlevel" "lowerlevel" "lowerlevel" ...
##  $ GradeID                 : chr  "G-04" "G-04" "G-04" "G-04" ...
##  $ SectionID               : chr  "A" "A" "A" "A" ...
##  $ Topic                   : chr  "IT" "IT" "IT" "IT" ...
##  $ Semester                : chr  "F" "F" "F" "F" ...
##  $ Relation                : chr  "Father" "Father" "Father" "Father" ...
##  $ raisedhands             : int  15 20 10 30 40 42 35 50 12 70 ...
##  $ VisITedResources        : int  16 20 7 25 50 30 12 10 21 80 ...
##  $ AnnouncementsView       : int  2 3 0 5 12 13 0 15 16 25 ...
##  $ Discussion              : int  20 25 30 35 50 70 17 22 50 70 ...
##  $ ParentAnsweringSurvey   : chr  "Yes" "Yes" "No" "No" ...
##  $ ParentschoolSatisfaction: chr  "Good" "Good" "Bad" "Bad" ...
##  $ StudentAbsenceDays      : chr  "Under-7" "Under-7" "Above-7" "Above-7" ...
##  $ Class                   : chr  "M" "M" "L" "L" ...
summary(data)
##     gender          NationalITy        PlaceofBirth         StageID         
##  Length:480         Length:480         Length:480         Length:480        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##    GradeID           SectionID            Topic             Semester        
##  Length:480         Length:480         Length:480         Length:480        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##    Relation          raisedhands     VisITedResources AnnouncementsView
##  Length:480         Min.   :  0.00   Min.   : 0.0     Min.   : 0.00    
##  Class :character   1st Qu.: 15.75   1st Qu.:20.0     1st Qu.:14.00    
##  Mode  :character   Median : 50.00   Median :65.0     Median :33.00    
##                     Mean   : 46.77   Mean   :54.8     Mean   :37.92    
##                     3rd Qu.: 75.00   3rd Qu.:84.0     3rd Qu.:58.00    
##                     Max.   :100.00   Max.   :99.0     Max.   :98.00    
##    Discussion    ParentAnsweringSurvey ParentschoolSatisfaction
##  Min.   : 1.00   Length:480            Length:480              
##  1st Qu.:20.00   Class :character      Class :character        
##  Median :39.00   Mode  :character      Mode  :character        
##  Mean   :43.28                                                 
##  3rd Qu.:70.00                                                 
##  Max.   :99.00                                                 
##  StudentAbsenceDays    Class          
##  Length:480         Length:480        
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
## 

Exploración y analísis de los datos:

1. Histogramas

Los histogramas representar la distribución de frecuencias de algunos puntos de datos de una variable. En este caso, observamos las siguientes variables: Manos levantadas, Recursos visitados, Anuncios vistos y Participación en debates.

ggplot(data = data, aes(x = raisedhands)) + geom_histogram(color = "blue") +
    scale_x_continuous(breaks = seq(0,100,5)) + 
    labs(x = "Raised Hands", y = "Student Count")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(data = data, aes(x = VisITedResources)) + geom_histogram(color = "yellow") +
    scale_x_continuous(breaks = seq(0,100,5)) + 
    labs(x = "Visited Resources", y = "Student Count")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(data = data, aes(x = AnnouncementsView)) + geom_histogram(color = "red") +
    scale_x_continuous(breaks = seq(0,100,5)) + 
    labs(x = "Announcements View", y = "Student Count")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(data = data, aes(x = Discussion)) + geom_histogram(color = "green") +
    scale_x_continuous(breaks = seq(0,100,5)) + 
    labs(x = "Discussion Participation", y = "Student Count")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

2. Diagramas de Barras

Los diagramas de barras también sirven para mostrar la frecuencia de una variable, sin embargo, en este tipo de graficas podemos ver los valores de distintas variables categóricas o nominales.

ggplot(data = data, aes(x = gender)) + geom_bar() + 
    labs(x = "Gender", y = "Student Count") +
    scale_y_continuous(breaks = seq(0,300,30)) + coord_flip()

ggplot(data = data, aes(x = NationalITy)) + geom_bar() + 
    labs(x = "Nationality", y = "Student Count") +
    scale_y_continuous(breaks = seq(0,200,20)) + coord_flip()

Jordan y Kuwait tienen el mayor número de estudiantes.

ggplot(data = data, aes(x = PlaceofBirth)) + geom_bar(aes(fill = NationalITy)) + 
    labs(x = "Birth Place", y = "Student Count") + coord_flip() # Usa es una combinación de nacionalidades.

ggplot(data = data, aes(x = GradeID, fill = Class)) + geom_bar() + 
    labs(x = "Grade ID", y = "Student Count") + coord_flip() # G-06 sólo tiene alumnos con notas bajas.

ggplot(data = data, aes(x = GradeID, fill = gender)) + geom_bar() + 
    labs(x = "Grade ID", y = "Student Count") + coord_flip() # G-10 no tiene chicas. 

ggplot(data = data, aes(x = SectionID, fill = Topic)) + geom_bar() +
    labs(x = "Section ID", y = "Student Count") +
    coord_flip()

En la clase C sólo hay estudiantes de informática y ciencias.

ggplot(data = data, aes(x = Topic, fill = gender)) + geom_bar() +
    labs(x = "Topic", y = "Student Count") +
    scale_y_continuous(breaks = seq(0,100,4)) + coord_flip()

El español tiene la peor proporción entre hombres y mujeres, mientras que las ciencias, la química, el inglés y el francés tienen una buena proporción.

ggplot(data = data, aes(x = Topic, fill = NationalITy)) + geom_bar() +
    labs(x = "Topic", y = "Student Count") + coord_flip() +
    scale_y_continuous(breaks = seq(0,100,4))

Informática tiene más población estudiantil de Kuwait. Química tiene menos diversidad. Francés tiene la mayor diversidad.

ggplot(data = data, aes(x = Topic, fill = StageID)) + geom_bar() +
    labs(x = "Topic", y = "Student Count") + coord_flip() +
    scale_y_continuous(breaks = seq(0,100,4))

Geología, biología y química solo tienen estudiantes de secundaria. Francés tiene todos de nivel bajo excepto un alumno de nivel alto.

ggplot(data = data, aes(x = Topic, fill = SectionID)) + geom_bar() +
    labs(x = "Topic", y = "Student Count") + coord_flip() +
    scale_y_continuous(breaks = seq(0,100,4))

En la sección C sólo hay estudiantes de español e informática.

ggplot(data = data, aes(x = Topic, fill = Semester)) + geom_bar() +
    labs(x = "Topic", y = "Student Count") + coord_flip() +
    scale_y_continuous(breaks = seq(0,100,4))

Informática cuenta sobre todo con estudiantes del primer semestre. Español solo tiene estudiantes de segundo semestre.

ggplot(data = data, aes(x = Topic, fill = Relation)) + geom_bar() +
    labs(x = "Topic", y = "Student Count") + coord_flip() +
    scale_y_continuous(breaks = seq(0,100,4))

La mayoría de los estudiantes de francés tienen a su madre como garante, mientras que la mayoría de los estudiantes de informática tienen a su padre como garante.

ggplot(data = data, aes(x = Topic, fill = Class)) + geom_bar() +
    labs(x = "Topic", y = "Student Count") + coord_flip() +
    scale_y_continuous(breaks = seq(0,100,4))

ggplot(data = data, aes(x = Topic, fill = Class)) + geom_bar(position = "fill") +
    labs(x = "Topic", y = "Student Count") + coord_flip() +
    scale_y_continuous(breaks = seq(0,100,4))

Geología no tiene estudiantes de clase baja.

ggplot(data = data, aes(x = Semester)) + geom_bar() + 
    labs(x = "Semester", y = "Student Count")

ggplot(data = data, aes(x = Relation, fill = Semester)) + geom_bar() +
    labs(x = "Gaurdian", y = "Student Count")

ggplot(data = data, aes(x = ParentAnsweringSurvey, fill = ParentschoolSatisfaction)) +
    geom_bar() + 
    labs(x = "Does parent answer survey ?", y = "Student Count")

La mayoría de los padres que no están satisfechos con la escuela no responden a la encuesta.

ggplot(data = data, aes(x = ParentschoolSatisfaction)) +
    geom_bar() + 
    labs(x = "Is the parent satified with the school ?", y = "Student Count")

ggplot(data = data, aes(x = StudentAbsenceDays)) + geom_bar() + 
            labs(x = "Is the student absent for more than seven days", y = "Student Count")

ggplot(data = data, aes(x = Class, fill = gender)) + geom_bar() +
    labs(x = "Class", y = "Student Count")

Hay muy pocas chicas de clase baja.

ggplot(data = data, aes(x = Class, fill = Relation)) + geom_bar() +
    labs(x = "Class", y = "Student Count")

Los alumnos que tienen a las mamás como guardianas tienen más posibilidades de sacar buenas notas en clase.

ggplot(data = data, aes(x = Class, fill = ParentAnsweringSurvey)) + geom_bar() +
    labs(x = "Class", y = "Student Count")

Los alumnos cuyos padres responden a la encuesta son los que obtienen buenas notas.

ggplot(data = data, aes(x = Class, fill = StudentAbsenceDays)) + geom_bar() +
    labs(x = "Class", y = "Student Count")

Los alumnos que faltan son los que obtienen notas bajas.

3. Diagrama de caja y extensión

Los diagramas de caja y extensión muestran muy graficamente grupos de datos numéricos a través de sus cuartiles.Indica datos como punto de mediana, distribución de observaciones y la presencia de valores atípicos.

ggplot(data = data, aes(x = gender, y = raisedhands)) + geom_boxplot()

Las chicas levantan más la mano

ggplot(data = data, aes(x = gender, y = VisITedResources)) + geom_boxplot()

Las chicas vistan mas fuentes.

ggplot(data = data, aes(x = NationalITy, y = raisedhands)) + geom_boxplot()

Jordan levanta más la mano que Kuwait, lybia la que menos, iraq y palestina es el país que más levantan la mano.

ggplot(data = data, aes(x = StageID, y = raisedhands)) + geom_boxplot()

Hay más levantamientos de manos en las escuelas secundarias.

ggplot(data = data, aes(x = StageID, y = Discussion)) + geom_boxplot()

Hay más debates en los institutos.

ggplot(data = data, aes(x = GradeID, y = raisedhands)) + geom_boxplot()

El grado 6 es el que más manos levanta de media.

ggplot(data = data, aes(x = SectionID, y = Discussion)) + geom_boxplot()

La sección C es la sección con la discusión más baja.

ggplot(data = data, aes(x = Topic, y = raisedhands)) + geom_boxplot()

Informática tiene muy pocas manos levantadas, interesante, porque la mayoría de los estudiantes estudian allí.

ggplot(data = data, aes(x = Semester, y = raisedhands)) + geom_boxplot()

Segundo semestre. –> Más manos arriba.

ggplot(data = data, aes(x = Relation, y = raisedhands)) + geom_boxplot()

Tutores madres -> Más levanta la mano.

ggplot(data = data, aes(x = ParentAnsweringSurvey, y = raisedhands)) + geom_boxplot()

Si los padres respondieron la encuesta. –> Más manos levantadas.

ggplot(data = data, aes(x = ParentAnsweringSurvey, y = VisITedResources)) + geom_boxplot()

ggplot(data = data, aes(x = ParentAnsweringSurvey, y = AnnouncementsView)) + geom_boxplot()

ggplot(data = data, aes(x = ParentAnsweringSurvey, y = Discussion)) + geom_boxplot()

ggplot(data = data, aes(x = ParentschoolSatisfaction, y = raisedhands)) + geom_boxplot()

Buena satisfacción. –> Más manos levantadas.

ggplot(data = data, aes(x = ParentschoolSatisfaction, y = VisITedResources)) + geom_boxplot()

ggplot(data = data, aes(x = ParentschoolSatisfaction, y = AnnouncementsView)) + geom_boxplot()

ggplot(data = data, aes(x = ParentschoolSatisfaction, y = Discussion)) + geom_boxplot()

ggplot(data = data, aes(x = StudentAbsenceDays, y = raisedhands)) + geom_boxplot()

Más faltas. –> Menos manos levantadas.

ggplot(data = data, aes(x = StudentAbsenceDays, y = VisITedResources)) + geom_boxplot()

ggplot(data = data, aes(x = StudentAbsenceDays, y = AnnouncementsView)) + geom_boxplot()

ggplot(data = data, aes(x = StudentAbsenceDays, y = Discussion)) + geom_boxplot()

ggplot(data = data, aes(x = ParentAnsweringSurvey, y = raisedhands)) + geom_boxplot()

Si los padres respondieron la encuesta. –> Más manos levantadas.

ggplot(data = data, aes(x = ParentAnsweringSurvey, y = VisITedResources)) + geom_boxplot()

ggplot(data = data, aes(x = ParentAnsweringSurvey, y = AnnouncementsView)) + geom_boxplot()

ggplot(data = data, aes(x = ParentAnsweringSurvey, y = Discussion)) + geom_boxplot()

### Si los padres respondieron la encuesta. –> Más debates.

4. Gráficos de caja por clases

Estos siguen siendo graficos de caja y extensión, solo que ahora con la variable clase.

ggplot(data = data, aes(x = Class, y = raisedhands)) + geom_boxplot()

Notas altas. –> Manos levantadas.

ggplot(data = data, aes(x = Class, y = VisITedResources)) + geom_boxplot()

Notas altas. –> Recursos visitados.

ggplot(data = data, aes(x = Class, y = AnnouncementsView)) + geom_boxplot()

Más notas. –> Más anuncios vistos.

ggplot(data = data, aes(x = Class, y = Discussion)) + geom_boxplot()

Notas altas. –> Más debates.

5. Diagramas de dispersión

Los diagramas de dispersión muestran un análisis de datos bivariados, es decir, determianan la relación que pueden tener dos variables para así definir su correlación.

ggplot(data = data, aes( x = raisedhands, y = VisITedResources)) + geom_point() +
    geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

ggplot(data = data, aes( x = raisedhands, y = AnnouncementsView)) + geom_point() +
    geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

ggplot(data = data, aes( x = raisedhands, y = Discussion)) + geom_point() +
    geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

ggplot(data = data, aes( x = VisITedResources, y = AnnouncementsView)) + geom_point() +
    geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

ggplot(data = data, aes( x = VisITedResources, y = Discussion)) + geom_point() +
    geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

ggplot(data = data, aes( x = AnnouncementsView, y = Discussion)) + geom_point() +
    geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

6. Gráficas de densidad

Con estas gráficas podemos vizualizar la distribución de datos cuantitativos en un intervalo continuo de otra variable.

ggplot(data = data, aes(x = raisedhands, color = gender)) + geom_density()

ggplot(data = data, aes(x = raisedhands, color = Topic)) + geom_density()

ggplot(data = data, aes(x = raisedhands, color = SectionID)) + geom_density()

ggplot(data = data, aes(x = raisedhands, color = Semester)) + geom_density()

ggplot(data = data, aes(x = raisedhands, color = Class)) + geom_density()

7. Mapa de mosaicos

Los gráficos en mosaico se usan para mostrar relaciones y ofrecer una comparativa visual entre distintos grupos.

tile.map <- data %>% group_by(gender, NationalITy) %>%
                        summarise(Count = n()) %>% arrange(desc(Count))
## `summarise()` has grouped output by 'gender'. You can override using the
## `.groups` argument.
ggplot(data = tile.map, aes(x = gender, NationalITy, fill = Count)) + geom_tile()

Modelización predictiva

1. Dividir los datos en conjuntos de entrenamiento y validación cruzada.

set.seed(55)
split <- sample.split(data$Class, SplitRatio = 0.90)
train <- subset(data, split == T)
cv <- subset(data, split == F)

2. Árboles de decisión.

tree.model <- rpart(Class ~ ., data = train, method = "class", minbucket = 1)
prp(tree.model) 

tree.predict <- predict(tree.model, cv, type = "class")
table(cv$Class, tree.predict)
##    tree.predict
##      H  L  M
##   H 12  0  2
##   L  0 12  1
##   M  3  2 16

accuracy = 0.7355(minbucket = 20)

accuracy = 0.7603(minbucket = 10)

accuracy = 0.8181(minbucket = 1)