+–///////- title: “AESTTRABAJO2023” author: “JESUS CASTRO” date: “2023-02-17” output: html_document —
## load libraries ============================================================================
library(ggplot2)
library(dplyr)
library(randomForest)
library(class)
library(rpart)
library(rpart.plot)
library(e1071)
library(caret)
library(caTools)
library(party)
## input =====================================================================================
###Se importan los datos del Excel, estos son acerca del nivel de estudio académico, donde incluyen información sobre su país, género, grado, ¿Si respondido a la encuesta el padre u otra persona?, la satisfacción escolar por parte del padre o encargado del estudiante. Generando una tabla con todas las respuestas obtenidas de los usuarios encuestados.
data <- read.csv("xAPI-Edu-Data.csv")
head(data)
## gender NationalITy PlaceofBirth StageID GradeID SectionID Topic Semester
## 1 M KW KuwaIT lowerlevel G-04 A IT F
## 2 M KW KuwaIT lowerlevel G-04 A IT F
## 3 M KW KuwaIT lowerlevel G-04 A IT F
## 4 M KW KuwaIT lowerlevel G-04 A IT F
## 5 M KW KuwaIT lowerlevel G-04 A IT F
## 6 F KW KuwaIT lowerlevel G-04 A IT F
## Relation raisedhands VisITedResources AnnouncementsView Discussion
## 1 Father 15 16 2 20
## 2 Father 20 20 3 25
## 3 Father 10 7 0 30
## 4 Father 30 25 5 35
## 5 Father 40 50 12 50
## 6 Father 42 30 13 70
## ParentAnsweringSurvey ParentschoolSatisfaction StudentAbsenceDays Class
## 1 Yes Good Under-7 M
## 2 Yes Good Under-7 M
## 3 No Bad Above-7 L
## 4 No Bad Above-7 L
## 5 No Bad Above-7 M
## 6 Yes Bad Above-7 M
ggplot(data = data, aes(x = raisedhands)) + geom_histogram(color = "black") +
scale_x_continuous(breaks = seq(0,100,5)) +
labs(x = "Raised Hands", y = "Student Count")
ggplot(data = data, aes(x = VisITedResources)) + geom_histogram(color = "black") +
scale_x_continuous(breaks = seq(0,100,5)) +
labs(x = "Visited Resources", y = "Student Count")
ggplot(data = data, aes(x = AnnouncementsView)) + geom_histogram(color = "black") +
scale_x_continuous(breaks = seq(0,100,5)) +
labs(x = "Announcements View", y = "Student Count")
ggplot(data = data, aes(x = Discussion)) + geom_histogram(color = "black") +
scale_x_continuous(breaks = seq(0,100,5)) +
labs(x = "Discussion Participation", y = "Student Count")
###Muestra dos diagramas de barras. El primero, el género al que pertenecen los estudiantes. El eje y “y” es el género y el eje “x” cantidad de estudiantes.La segunda grafica es de la cantidad de estudiantes (Eje “x”) y su respectivo país de origen (Eje “y”). La mayor cantidad de estudiantes fueron de Kuwait y Jordania, con aproximadamente 180 y 167 respectivamente. Y los países con menor número de encuestados son Venezuela y Marruecos con aproximadamente menos de 5 encuestados. También hay que resaltar que de 14 nacionalidades tenemos que 12 de estas nacionalidades corresponden a países islámicos del norte de África, cercano y medio Oriente. Con la excepción de Venezuela y USA que son del continente americano. En cuanto a la muestra hay una mayor muestra del género masculino con 300 estudiantes, en contra posición del género femenino que tiene 180 estudiantes.
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 and KW has highest no. of students
###Contiene 4 graficas. La primera, es un diagrama de barras agrupadas donde se muestra la proporción del país de origen de los estudiantes (Eje “y”) en los países a los cuales pertenecen los encuestados. Mientras que observamos países que solo tienen estudiantes propios del país como Venezuela, Túnez, Siria, Marruecos, Libia, Iraq e Irán. Otros tienen una mayor diversidad con respecto a su origen como USA, Arabia saudita y Kuwait. En este último aproximadamente más del 90% es originario del país.
###En el segundo gráfico, está la relación entre el grado (Eje “y”) y la cantidad de estudiantes (Eje “x”), igualmente usando un diagrama de barras agrupado, en donde hay tres tipos de clase y 12 de grados. Además, la mayor cantidad de estudiante se encuentran en los grados G-02, G-08 Y G-07.
###En la tercera, se presentan tres categorías las cuales son género, grado y la cantidad por estudiante. También se emplea un diagrama de barras agrupado. Observando se pueden concluir que hay más representantes del género masculino por grado que del género femenino. Y que la mayoría del género masculino se encuentra en G-02, al igual que la femenina.
###Y en el último y cuarto gráfico, volvemos a tener un gráfico de barras agrupado donde la clase c es exclusiva de estudiantes de Español y IT.
ggplot(data = data, aes(x = PlaceofBirth)) + geom_bar(aes(fill = NationalITy)) +
labs(x = "Birth Place", y = "Student Count") + coord_flip() # usa is a mix of nationalities
ggplot(data = data, aes(x = GradeID, fill = Class)) + geom_bar() +
labs(x = "Grade ID", y = "Student Count") + coord_flip() # g-06 has students with only low grades
ggplot(data = data, aes(x = GradeID, fill = gender)) + geom_bar() +
labs(x = "Grade ID", y = "Student Count") + coord_flip() # g-10 has no females
ggplot(data = data, aes(x = SectionID, fill = Topic)) + geom_bar() +
labs(x = "Section ID", y = "Student Count") +
coord_flip()
#### Class c has only IT and science students
###Se sigue empleando gráficos de barras agrupado, para tres variables tema, cantidad de estudiantes y género. La cantidad de estudiantes por temática y cuantos pertenecen a uno u otro género. La menor cantidad correspondiente al género masculino en la clase de historia y la mayor en IT. En el género femenino tenemos que la mayor cantidad se encuentra en el topic IT, y la menor en español.
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()
#### Spanish has worst male:female ratio whereas science, chemistry,
english and french have good ratio.
###Tenemos un gráfico en el cual se aprecia el país de los encuestados y la cantidad en la temática escogida. Continuamos con un gráfico de barras agrupadas, muy útiles para representar proporciones en categorías. L a mayor cantidad de estudiantes que escogieron IT son de Kuwait. Química tiene una baja diversidad en cuanto a los países de origen, mientras que francés tiene la mayor diversidad en cuanto a este criterio. También cabe señalar que de Jordania se encuentra por lo menos uno, en cada categoría exceptuando la categoría de matemáticas.
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))
#### IT has most people from KW. Chemistry has least diversity. French
has most diversity.
###Tenemos un diagrama de barras agrupado, en donde el eje “x” es la cantidad de estudiantes, el eje “y” son las clases y la etapa escolar. La mayor cantidad de estudiantes en la etapa baja se encuentran en francés e IT. También observamos inexistencia en los datos en etapa baja en las clases de Química, Biología, Geología y Corán. La etapa media se allá en todas las clases exceptuando Francés. Y la etapa superior o alta se evidencia en Inglés, Francés, It, Matemáticas, Corán, ciencias y español.
###Geología, Biología Química Sólo Escuela Secundaria. Frances tiene todos los estudiantes de bajo nivel, excepto un estudiante de alto nivel. Encontramos las tres etapas en las siguientes clases, Inglés, IT y Matemáticas.
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))
#### geology, biology chemistry only middle school. fench has all low
level except one high level student.
###La sección C solo está presente en Español y IT. Mientras que las escogencias en Corán, Historia, Geología y Química tienen solamente de la sección A.
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))
#### section C only has spanish and IT students.
###La grafica muestra el semestre en el que se encuentran los estudiantes y la escogencia respectiva. TI tiene principalmente estudiantes que están en el primer semestre. Ahora bien, las escogencias de Árabe, Frances y ciencias la cantidad se invierte siendo una mayoría los pertenecientes al segundo semestre e incluso en la escogencia de Español solo se tienen estudiantes de segundo semestre.
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))
#### IT mostly has students who are in first semester
###En este grafico se observa una relacionen entre la escogencia y el tipo de tutor, sea madre o padre. En el caso Frances vemos que la mayoría de los tutores eran la madre. Mientras que en IT eran los padres los tutores. Esta relación no se observa muy bien en otras escogencias como ciencias, Química y Biología.
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))
#### most french students have mom as gaurdian whereas most IT students
have fathers as gaurdian.
###Este paquete de código genera dos graficas. En la primera, el nivel de educación, la cantidad de estudiantes y la temática. Donde la menor cantidad de estudiantes en educción media se encuentra en química y la mayor en IT. La menor cantidad de nivel superior está en historia y mayor en francés. En la educación baja, su mayor cantidad de estudiantes se hayan en historia y la mayor en IT.
###En el segundo gráfico, encontramos una notoria diferencia en geología en el cual no hay nivel bajo, sin embargo, en este grafico se puede ver la proporción, pero no la cantidad.
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))
#### geology has no low class students
###Encontramos tres graficas. La primera grafica de barras muestra la cantidad de estudiantes en el primer y segundo semestre respectivamente. La segunda de estas, evidencia quien es el tutor del estudiante y en que semestre se encuentra. Ahora bien, los estudiantes en primer semestre que tienen a un padre como tutor o guardián son casi el doble que los que tienen a su madre como tutor o guardián. Esta diferencia es poca en el segundo semestre. La tercera gráfica, es la satisfacción de los padres o tutor legal, con una variable categórica que tiene la opción de bien o mal, pero se tienen en cuenta si respondió o no. La mayoría de los padres que no están satisfechos con la escuela no responden la encuesta.
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")
#### most of the parents who aren’t satisfied with the school do not
answer the survey.
###De las tres graficas que se presentan en este chunk. La primera muestra que tan satisfechos están los padres con la escuela a lo cual hay 300 padres aproximadamente que dicen estar bien con ella. El segundo gráfico muestra las abstinencias a clase en donde son mayor las que están por debajo de siete abstinencias. La última grafica tiene muy pocas chicas de nivel bajo.
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")
#### very few girls in low class
###Los estudiantes que tienen madres como guardianes tienen mayores posibilidades de estar en la clase H.
ggplot(data = data, aes(x = Class, fill = Relation)) + geom_bar() +
labs(x = "Class", y = "Student Count")
#### the students who have moms as gaurdians have higher chances to get
high class marks.
###El grafico de diagrama de barras agrupado en donde se encuentran las clases H, L y M, la cantidad de estudiantes y si los padres respondieron o no. Se observa que las clases H y M la cantidad que contestó afirmativamente, en contraste de la clase L. Los estudiantes cuyos padres responden a la encuesta son los que obtienen buenas calificaciones.
ggplot(data = data, aes(x = Class, fill = ParentAnsweringSurvey)) + geom_bar() +
labs(x = "Class", y = "Student Count")
#### sudents whose parents answer the survey are the ones getting good
marks.
###Los estudiantes que se ausentan son los que obtienen calificaciones bajas.
ggplot(data = data, aes(x = Class, fill = StudentAbsenceDays)) + geom_bar() +
labs(x = "Class", y = "Student Count")
#### student getting absent are the ones getting low marks. ##
Boxplots
###Dia grama de caja y extensión. Las niñas tienen más levantamientos de manos.
ggplot(data = data, aes(x = gender, y = raisedhands)) + geom_boxplot()
###En el diagrama de caja y extensión o bigotes vemos que la línea que corresponde al segundo cuartil(Q2) está en la parte de encima, para en género femenino. Como sabemos el segundo cuartil es la mediana. Por lo tanto, los datos están sesgados conforme a la revicion de recursos. En el diagrama de caja y bigotes para el género masculino la línea del segundo cuartil, la cual es la misma de la mediana se encuentra central. Por lo tanto, los datos son simétricos y no cuentan con sesgos, con forme a la revicion de recursos.
ggplot(data = data, aes(x = gender, y = VisITedResources)) + geom_boxplot()
###En el diagrama de caja y extensión o bigotes vemos que la línea que corresponde al segundo cuartil(Q2) está en la parte de encima, para en género femenino. Como sabemos el segundo cuartil es la mediana. Por lo tanto, los datos están sesgados conforme a la revicion de recursos. En el diagrama de caja y bigotes para el género masculino la línea del segundo cuartil, la cual es la misma de la mediana se encuentra central. Por lo tanto, los datos son simétricos y no cuentan con sesgos, con forme a la revicion de recursos.
ggplot(data = data, aes(x = gender, y = VisITedResources)) + geom_boxplot()
###En este diagrama de caja y extensión tenemos la cantidad de veces que se levanta la mano (Eje “y”) y la nacionalidad (Eje “x”). Se observan datos atípicos en los diagramas de Irán e Iraq. Y en Venezuela no se puede realizar el diagrama por la falta de datos. En las nacionalidades egipcias, jordana, estadounidense y tunecina, la línea que representa tanto a la mediana como al cuartil dos esta casi en el centro de la caja. Por lo tanto, estos diagramas no presentan sesgos. Sin embargo, las demás nacionalidades no tienen la misma característica, entonces presentan sesgos por que la línea que representa la mediana o se encuentra en la parte inferior o superior. Jordania levanta más las manos que Kuwait. Libia es la más baja. Irak y Palestina levantan más la mano.
ggplot(data = data, aes(x = NationalITy, y = raisedhands)) + geom_boxplot()
#### Jordan more hand raises than KW. lybia lowest. iraq and palestine
highest hand raises.
###Hay mayor cantidad de levantamiento de mano en la etapa de educación media.
ggplot(data = data, aes(x = StageID, y = raisedhands)) + geom_boxplot()
#### more hand raises in middle schools.
###Es mayor la cantidad de discusiones en la etapa de educación alta o superior. Por otro lado, en la etapa media se mantienen una paridad en la cantidad de las discusiones.
ggplot(data = data, aes(x = StageID, y = Discussion)) + geom_boxplot()
#### more discussions in high schools.
###En este grafico solo se observan datos atípicos en G-11, mientras que los demás se encuentran dentro de los cuartiles Q1 Y Q3 o en la varianza que vendrían siendo las líneas que se extienden después de la caja asia arriba y abajo. E l grado 6 tiene la mayor cantidad de aumentos de mano en promedio.
ggplot(data = data, aes(x = GradeID, y = raisedhands)) + geom_boxplot()
#### grade 6 has most number of hand raises on an average.
###La sección C contiene la menor cantidad de discusiones.
ggplot(data = data, aes(x = SectionID, y = Discussion)) + geom_boxplot()
#### section C with lowest discussion
###Se presentan en todas las escogencias sesgos, debido a que la línea de la mediana esta o bien sea en la parte superior o inferior de las cajas. Además, en las escogencias de Biología y Geología hay datos atípicos por fuera de la varianza. Curiosamente, IT tiene muy pocas manos levantadas, aunque la mayoría de los estudiantes escogieron este.
ggplot(data = data, aes(x = Topic, y = raisedhands)) + geom_boxplot()
###En el segundo semestre se tienen más levantadas de manos por parte de los estudiantes.
ggplot(data = data, aes(x = Semester, y = raisedhands)) + geom_boxplot()
#### second sem –> more hand raises
###Cuando los tutores o guardianes son las madres se obtienen mayor cantidad de manos levantadas.
ggplot(data = data, aes(x = Relation, y = raisedhands)) + geom_boxplot()
ggplot(data = data, aes(x = ParentAnsweringSurvey, y = raisedhands)) + geom_boxplot()
#### survey answer-yes –> more hand raises
###Ante una respuesta afirmativa ante la satisfacción de los padres sobre la escuela, tambien se obtiene una mayor cantidad de 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()
#### satisfaction-good –> more hand raises
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()
#### more leaves less hand raises
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()
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()
## Class-wise boxplots
ggplot(data = data, aes(x = Class, y = raisedhands)) + geom_boxplot()
ggplot(data = data, aes(x = Class, y = VisITedResources)) + geom_boxplot()
#### high marks –> visited resources
ggplot(data = data, aes(x = Class, y = AnnouncementsView)) + geom_boxplot()
ggplot(data = data, aes(x = Class, y = Discussion)) + geom_boxplot()
#### high marks more discussion
### Las siguientes graficas de linea de regrecion, se refieren a la menor varianza posible entre los datos.
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'
###Se tienen cuatro graficas diferentes, en las cuales se emplean en el eje “y” la densidad y en el eje “x” la cantidad de veces que se levanta la mano, cambiando entre la escogencia, genero, etc.. La función de densidad en este caso las curvas de colores para sus respectivas nomenclaturas, nos dice la probabilidad relativa que puede o no tener un valor al azar en cualquier parte de la curva.
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()
## Tile Map
###En este caso el diagrama muestra una relación entre el género y la nacionalidad. Podemos encontrar la relación existente en que cantidad de personas que son de un género y corresponden a una nacionalidad especifica. Por lo tanto, podemos decir que los que pertenecen al género masculino de Kuwait son los que tienen una mayor muestra de estudiantes, al igual que son la nacionalidad con mayor cantidad del género masculino. Otro análisis, es el del género femenino que son venezolanas las cuales no hay ninguna, entonces toda la población de estudiantes venezolanos es del género masculino.
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()
# Predictive modelling
set.seed(55)
split <- sample.split(data$Class, SplitRatio = 0.90)
train <- subset(data, split == T)
cv <- subset(data, split == F)
###El árbol de predicción consiste en analizar todos los datos suministrados, y los resultados de las gráficas de barras, línea de regresión (donde se ubica la varianza) y caja y extensión. Para la predicción de posibles resultados mediante un descarte con dos variables categóricas, las que son sí y no. Las ramificaciones hacia la izquierda son respuestas negativas (No) y las de la derecha son respuestas positivas (Si), cuando arroja una respuesta negativa este sigue hasta encontrar una respuesta positiva.
###La matriz consiste en que las columnas representan los valores iniciales, las filas son una reclasificacion de los valores y la linea diagonal muestra el resultado final y verdadero.
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