En este algoritmo va a encrear una base de datos de una escuela para hacer predicciones futuras con base a los datos registrados en los que se tienen encuenta la participación de los estudiantes , como en debates , tambien que tan atentos estan a los anuncios , que tan participativos son sus padres , ademas cuantos dias faltan a la escuela , su estrato y su nacionalidad, saber que sexo hay mas.
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
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
##
##
##
1.En el primer histograma se puede ver que el número de manos alzadas mas alto fue de 10 que llegó a mas de 50 estudiantes contados, y el mas bajo fue en de 45 que no alcanzó si quiera los 5 estudiantes contados.
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")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
2.Para este segundo histograma podemos apreciar cuantos estudienates visitan x cantidad de recursos. Los datos que se logran apreciar nos indican que la menor cantidad de recursos que visitan los estudiantes es de 45 a 50; en cambio, la mayor cantidad de recursos visitados son aproximadamente unos 90.
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")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
3.En el tercer histograma podemos ver cuantos estudiantes vieron x cantidad de anuncios; siendo de 12 a 15 auncios lo que mayormente ven los estudiantes. En cambio son muy poco estudiantes (de hecho menos de 5) quienes ven de 90 a 93 anuncios.
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")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
4.En el cuarto histograma se nos grafica la cantidad de participaciones en debates y cuantos estudiantes tienen x cantidad de participacion. Lo que se puede apreciar en el histograma es que las cantidades de 0 participaciones y de 55 a 60 participaciones son las menos recurrentes entre los estudiantes, ambas no sobrepazan la cantidad 4 estudiantes contados. En cambio la cantidad de participaciones que presenta una mayor cantidad de estudiantes contados es de 13 a 15 participaciones.
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")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# BARPLOTS
1.Esta primera grafica de barras nos deja apreciar que cantidad de estudiantes son mujeres y cuantos son hombres. Tal como se aprecia, hay una clara mayoria de estudiantes varones, siendo ellos mas de 300 en comparación a las menos de 180 estudiantes femeninas.
ggplot(data = data, aes(x = gender)) + geom_bar() +
labs(x = "Gender", y = "Student Count") +
scale_y_continuous(breaks = seq(0,300,30)) + coord_flip()
2.Esta segunda barplot nos muestra cuantos estudiantes pertenecen a tales nacionalidades, siendo la mayoria de los estudiantes provienen de Kuwait y Jordan; en cambio la minoria en este caso seria los estudiantes provenientes de Venezuela.
ggplot(data = data, aes(x = NationalITy)) + geom_bar() +
labs(x = "Nationality", y = "Student Count") +
scale_y_continuous(breaks = seq(0,200,20)) + coord_flip()
3.Con relacion a su nacionalidad esta barplot nos grafica el lugar de nacimiento de los estudiantes. Como se logra apreciar, la mayoria de estudiantes cuya nacionalidad son de Kuwait su lugar de nacimiento es este mismo lugar, el mismo caso se aplica para los de Jordan. Por otra parte podemos ver que la mayoria de los estudiantes que nacieron el USA no tienen la nacionalidad de dicho país.
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
4.En el siguiente barplot podemos apreciar como en el Grade-02 es en donde hay mayor cantidad de estudiantes, en este grado tambien hay de manera casi prporcional estudiantes de clases altas, medias y bajas. En cambio en el Grade-05 solo hay estudiantes de clases bajas, tambien es el grado con menor cantidad de estudiantes.
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
6.En el siguiente barplot podemos ver que la seccion A es la que tiene una mayor cantidad de estudiantes, en ella esta tambien mas de la mitad de los estudiantes. En la seccion a podemos ver que se tratan todos los tema, aunque en mayor proporción IT, ingles y arabe; en cambio en la sección 3 solo se tratan 2 temas los cuales son IT y Español.
ggplot(data = data, aes(x = SectionID, fill = Topic)) + geom_bar() +
labs(x = "Section ID", y = "Student Count") +
coord_flip()
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()
8.En el siguiente barplot podemos ver que la mayoria de los estudiantes que participan en el tema de IT son de Kuwait. Tambien podemos ver que la gran mayoria de los que toman la clase de Quimica son de Jordan, por otra parte temas como Quran y Frances tienen una mayor variedad de estudiantes de diferentes nacionalidades.
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))
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))
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))
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))
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))
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))
14.En esta grafica podemos apreciar mejor la proporcion de los datos mostrados de la grafica anterior.
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))
15.En esta grafica podemos ver la cantidad de estudiantes en primer y segundo semestre. Como se puede ver, hay una cantidad parecida de estudiantes en cada semestre.
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")
17.En la grafica de abajo podemos ver que la mayoria de los padres que no respondieron la encuesta tienen una mala satisfaccion con la escuela, mientras que la mayoria de los padres que respondieron la encuesta están satisfechos con la escuela.
ggplot(data = data, aes(x = ParentAnsweringSurvey, fill = ParentschoolSatisfaction)) +
geom_bar() +
labs(x = "Does parent answer survey ?", y = "Student Count")
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")
20.En la barplot de abajo se aprecia como en la clase baja hay menos mujeres que en el resto de clases.De igual forma podemos ver como la clase media tiene una mayor cantidad de estudiantes que las otras.
ggplot(data = data, aes(x = Class, fill = gender)) + geom_bar() +
labs(x = "Class", y = "Student Count")
ggplot(data = data, aes(x = Class, fill = Relation)) + geom_bar() +
labs(x = "Class", y = "Student Count")
ggplot(data = data, aes(x = Class, fill = ParentAnsweringSurvey)) + geom_bar() +
labs(x = "Class", y = "Student Count")
23.Como podemos ver en la gráfica de abajo, la mayoria de los estudiantes de clase baja faltan mas de 7 días, mientras que entre los estudiantes de clase alta es muy raro que los estudiantes falten tanto.
ggplot(data = data, aes(x = Class, fill = StudentAbsenceDays)) + geom_bar() +
labs(x = "Class", y = "Student Count")
1.En la Boxplot de abajo podemos observar como las estudiantes suelen alzar mas la mano que sus compañeros.
ggplot(data = data, aes(x = gender, y = raisedhands)) + geom_boxplot()
ggplot(data = data, aes(x = gender, y = VisITedResources)) + geom_boxplot()
ggplot(data = data, aes(x = NationalITy, y = raisedhands)) + geom_boxplot()
ggplot(data = data, aes(x = StageID, y = raisedhands)) + geom_boxplot()
5.En el sigiente grafico podemos ver como en escuela media tienen mas debates.
ggplot(data = data, aes(x = StageID, y = Discussion)) + geom_boxplot()
6.Lo que odemos observar del siguiente grafico es que los estudiantes de G-06 suelen alzar mas la mano, mientras que los de G-05 no tanto.
ggplot(data = data, aes(x = GradeID, y = raisedhands)) + geom_boxplot()
ggplot(data = data, aes(x = SectionID, y = Discussion)) + geom_boxplot()
8.Como se aprecia en la siguiente grafica en el Biologia es donde se suele alzar mas la mano. Tambien, pese a que IT tiene mas estudiantes, es donde menos se suele alzar la mano.
ggplot(data = data, aes(x = Topic, y = raisedhands)) + geom_boxplot()
ggplot(data = data, aes(x = Semester, y = raisedhands)) + geom_boxplot()
ggplot(data = data, aes(x = Relation, y = raisedhands)) + geom_boxplot()
ggplot(data = data, aes(x = ParentAnsweringSurvey, y = raisedhands)) + geom_boxplot()
ggplot(data = data, aes(x = ParentAnsweringSurvey, y = VisITedResources)) + geom_boxplot()
15.Como se aprecia en el siguiente grafico, los estudiantes cuyos padres no responden la encuesta veian menos los anuncios.
ggplot(data = data, aes(x = ParentAnsweringSurvey, y = AnnouncementsView)) + geom_boxplot()
16.Como se aprecia en el siguiente grafico, los estudiantes cuyos padres no responden la encuesta tenian menos debates.
ggplot(data = data, aes(x = ParentAnsweringSurvey, y = Discussion)) + geom_boxplot()
17.Como se aprecia en el siguiente grafico, los estudiantes cuyos padres se sienten satisfechos con la escuela alzan la mano.
ggplot(data = data, aes(x = ParentschoolSatisfaction, y = raisedhands)) + geom_boxplot()
18.Como se aprecia en el siguiente grafico, los estudiantes cuyos padres no estan satisfechos con la escuela la visin menos recursos.
ggplot(data = data, aes(x = ParentschoolSatisfaction, y = VisITedResources)) + geom_boxplot()
19.Como se aprecia en el siguiente grafico, los estudiantes cuyos padres no se sienten satisfechos con la escuela veian menos los anuncios.
ggplot(data = data, aes(x = ParentschoolSatisfaction, y = AnnouncementsView)) + geom_boxplot()
20.Como se aprecia en el siguiente grafico, aunque las graficas son
bastante parejas entre si, aun se ve una pequeña mayor participación en
debates por parte de los estudiantes cuyos padres estan satisfechos con
la escuela.
ggplot(data = data, aes(x = ParentschoolSatisfaction, y = Discussion)) + geom_boxplot()
21.Tal como se aprecia en la grafica, los estudiantes que faltan menos de 7dias son quienes alzan mas la mano.
ggplot(data = data, aes(x = StudentAbsenceDays, y = raisedhands)) + geom_boxplot()
22.Tal como se aprecia en la grafica, los estudiantes que faltan menos de 7 días son quienes visitan mas recursos.
ggplot(data = data, aes(x = StudentAbsenceDays, y = VisITedResources)) + geom_boxplot()
23.Tal como se aprecia en la grafica, los estudiantes que faltan mas de 7dias son quienes veian menos los anuncios.
ggplot(data = data, aes(x = StudentAbsenceDays, y = AnnouncementsView)) + geom_boxplot()
24.Tal como se aprecia en la grafica, los estudiantes que faltan menos de 7dias son quienes mas debates realizan.
ggplot(data = data, aes(x = StudentAbsenceDays, y = Discussion)) + geom_boxplot()
1.Por lo que se aprecia en la siguiente grafica los estudiantes de clases altas tienden a alzar mas la mano. Tambien se puede ver tanto para clases altas como bajas, una gran cantidad de datos aberrantes.
ggplot(data = data, aes(x = Class, y = raisedhands)) + geom_boxplot()
2.Por lo que se aprecia en la siguiente grafica los estudiantes de clases altas tienden a visitar mas los recursos.
ggplot(data = data, aes(x = Class, y = VisITedResources)) + geom_boxplot()
3.Por lo que se aprecia en la siguiente grafica los estudiantes de clases bajas tienden a ver menos los anuncios.
ggplot(data = data, aes(x = Class, y = AnnouncementsView)) + geom_boxplot()
ggplot(data = data, aes(x = Class, y = Discussion)) + geom_boxplot()
1.En la grafica de abajo podemos ver una relacion linear positiva fuerte entre la cantidad de veces que alzaban la mano y la cantidad de recursos que visitaban. Esto nos quiere decir que entre mas los estudiantes alzaban la mano mas recursos se visitaban o viceversa.
ggplot(data = data, aes( x = raisedhands, y = VisITedResources)) + geom_point() +
geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'
2.En la grafica de abajo podemos ver una relacion linear positiva entre la cantidad de veces que alzaban la mano y la cantidad de anuncios que ven. Esto nos quiere decir que entre mas los estudiantes alzaban la mano mas aununcios veian o viceversa.
ggplot(data = data, aes( x = raisedhands, y = AnnouncementsView)) + geom_point() +
geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'
3.En la grafica de abajo podemos ver una relacion linear positiva debil entre la cantidad de veces que alzaban la mano y la cantidad de Debates. Esto nos quiere decir que entre mas los estudiantes alzaban la mano, de igual manera, mas debates realizaban o viceversa; aunque en este caso esta relacion es mas debil debido a la dispercion de los datos.
ggplot(data = data, aes( x = raisedhands, y = Discussion)) + geom_point() +
geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'
4.En la grafica de abajo podemos ver una relacion linear positiva entre la cantidad de veces que visitaban recursos y la cantidad de anuncios que ven. Esto nos quiere decir que entre mas los estudiantes visitaban recursos, a su vez, mas aununcios veian o viceversa.
ggplot(data = data, aes( x = VisITedResources, y = AnnouncementsView)) + geom_point() +
geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'
5.En la grafica de abajo podemos ver una relacion linear positiva debil entre la cantidad de Debates y la de recursos visitados. Esto nos quiere decir que entre mas recursos visitaban la mano mas debates realizaban o viceversa; aunque en este caso esta relacion es mas debil debido a la disperción de los datos.
ggplot(data = data, aes( x = VisITedResources, y = Discussion)) + geom_point() +
geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'
6.En la grafica de abajo podemos ver una relacion linear positiva entre la cantidad de anuncios vistos y la cantidad de debates. Esto nos sugiere que entre mas los estudiantes veian anuncios, muy posiblemente tenian o hacian mas debates.
ggplot(data = data, aes( x = AnnouncementsView, y = Discussion)) + geom_point() +
geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'
# Density Plots
1.De la grafica de densidad dea acontinuación podemos analizar el pico máximo de densidad fue en la cantidad de 13 manos alzadas para hombres y 75 en mujeres. De igual forma el punto mas bajo de alzar la mano es de 100 en hombres y en mujeres es de 0 y 100.
ggplot(data = data, aes(x = raisedhands, color = gender)) + geom_density()
ggplot(data = data, aes(x = raisedhands, color = Topic)) + geom_density()
3.Como se aprecia en la proxima grafica las tres secciones tienen picos maximo de densidad de casi igual amplitud en diferentes puntos, pero la sección B presenta el el punto mas bajo de dencidad de entre las 3 secciones, este es mas o menos en la cantidad de 100 manos alzadas.
ggplot(data = data, aes(x = raisedhands, color = SectionID)) + geom_density()
4.En la siguiente grafica de densidad de manos alzadas podemos ver que el punto maximo de los estudiantes en su primer semestre es en levantar la mano unas 13veces, mientras en el segundo semestre elpunto mas denso es en que los estudiantes levanten la mano unas 75veces.
ggplot(data = data, aes(x = raisedhands, color = Semester)) + geom_density()
ggplot(data = data, aes(x = raisedhands, color = Class)) + geom_density()
1.Como de muestra en el grafico de abajo, la mayoria de los estudiantes son de Jordan y Kuwait, siendo tambien que en su mayoria son hombres. Otra cosa interesante es el ver que de los estudiantes de venezuela, todos eran hombres.
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)
tree.model <- rpart(Class ~ ., data = train, method = "class", minbucket = 1)
prp(tree.model)
2.En la sigienta matriz lo que podemos visualizar es que arbol de prediccion arrojado anteriormente se puede ver que para la las clases altas tuvo 12 aciertos de clasificacion, en L otros 12 y para M unos 16. En total solo presentó 8 fallos de predicción, clasifico a 2 de Hight School en Middleschool, a uno de lowclasses en MiddleSchool, a 3 de M los clasificó en H mientras que a otros 2 en L.
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
–Fin—