Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added clasification tree #10

Merged
merged 4 commits into from
Oct 14, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions Fase 2/Decision_Tree/report/report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
## Árbol de Clasificación

Construimos un árbol para analizar si un estudiante determinado debe optar por tener profesores particulares (además de los de la escuela) o no. Para esto utilizamos las siguiente variables cualitativas:

- `famsup.x` (apoyo educacional por parte de la familia)
- `higher.x` (quiere tener una educación universitaria)
- `nursery` (atiende además a la escuela de medicina)
- `activities.x` (hace actividades extracurriculares)
- `internet` (tiene internet)
- `sex` (sexo M o F)

Obtenemos el siguiente árbol, en el cual se pueden ver las probabilidades de si un estudiante debe optar por profesores particulares o no:

![Tree](tree.png "Árbol de Clasificación")

El error de entrenamiento es de 0.3879.
Binary file added Fase 2/Decision_Tree/report/report.pdf
Binary file not shown.
Binary file added Fase 2/Decision_Tree/report/tree.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
44 changes: 44 additions & 0 deletions Fase 2/Decision_Tree/tree.r
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
dir = '/home/daniel/Projects/Student-Performance-Analysis/students-data.csv'

load_data <- function(path) {
return(read.csv(path))
}

df <- load_data(dir)
df <- df[2:34] # using only first dataset

fcols <- c()

for(i in 1:length(df)) {
if(is.factor(df[,i]) && length(levels(df[,i])) == 2)
fcols <- c(fcols, i)
}

df <- subset(df, select=fcols)

print(names(df))

require(caTools)
set.seed(127)
split <- sample.split(df, SplitRatio = 0.75)
training_set <- subset(df, split == TRUE)
test_set <- subset(df, split == FALSE)

require(rpart)
tree <- rpart(paid.x ~ ., data=training_set)

print(summary(tree))

png('report/tree.png')
require(rpart.plot)
rpart.plot(tree, type=1, fallen.leaves=F, cex=1, extra=102, under=T)
dev.off()

pred <- predict(tree, newdata=test_set, type="vector")
print(pred)

conf <- table(pred, test_set$paid.x)
print(conf)

error <- 1 - (sum(diag(conf)) / sum(conf))
print(error)
64 changes: 64 additions & 0 deletions Fase 2/Regression/regression.r
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
dir = '/home/daniel/Projects/Student-Performance-Analysis/students-data.csv'

load_data <- function(path) {
return(read.csv(path))
}

df <- load_data(dir)
df <- df[2:34] # using only first dataset

fcols <- c()
cols <- c()

for(i in 1:length(df)) {
if(is.factor(df[,i]))
fcols <- c(fcols, i)
else cols <- c(cols, i)
}

qual <- subset(df, select=fcols)
quant <- subset(df, select=cols)
scaled_quant <- apply(quant, 2, scale)

df <- data.frame(qual, scaled_quant)

sink("report/output.txt")

print(cor(quant))

mod <- lm(G3.x ~ ., data=df)
mod <- MASS::stepAIC(mod, direction="backward", trace = 0, k = log(nrow(df)))
print(summary(mod))

print('Media de error residual (scaled)')
print(mean(mod$residuals))

print('Suma de error residual (scaled)')
print(sum(mod$residuals))

png('report/plots.png', width=800, height=400)
par(mfrow=c(1,2))

hist(mod$residuals, xlab='Residuals')
qqnorm(mod$residuals)
qqline(mod$residuals)

dev.off()

require(lmtest)
dwtest(mod)

pred = predict(mod, data=df)

print('Predicciones en modelo escalado')
print(pred)

print('Errores residuales')
print(residuals(mod))

png('report/homo.png')
plot(pred, residuals(mod), xlab='Predictions', ylab='Residuals of scaled model')
abline(h=0, lty=2)
dev.off()

sink()
Binary file added Fase 2/Regression/report/homo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
391 changes: 391 additions & 0 deletions Fase 2/Regression/report/output.txt

Large diffs are not rendered by default.

Binary file added Fase 2/Regression/report/plots.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
65 changes: 65 additions & 0 deletions Fase 2/Regression/report/report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
## Análisis de Regresión
---

En primer lugar hallamos la correlación entre todos los pares de variables en el data frame. Podemos apreciar que `G1.x` y `G2.x` están ambos correlacionados con `G3.x`, lo cual tiene sentido, dado que los primeros son notas de ambos semestres y el último es la nota del curso.

Luego separamos variables cualitativas de cuantitativas, para aplicarle a estas últimas una estandarización usando la función `scale`.

A continuación se creó el modelo teniendo como variable dependiente a `G3.x` y usando al resto como variables dependientes, para luego aplicar un algoritmo de `model selection` para nuestros datos, en este caso usamos la función `MASS::stepAIC`, que se encarga de eliminar a las variables independientes no necesarias.

El modelo obtenido es el siguiente:

```
lm(formula = G3.x ~ age + famrel.x + absences.x + G1.x + G2.x,
data = df)

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -6.468e-17 2.111e-02 0.000 1.000000
age -5.286e-02 2.169e-02 -2.437 0.015267 *
famrel.x 7.994e-02 2.124e-02 3.764 0.000194 ***
absences.x 7.986e-02 2.137e-02 3.738 0.000215 ***
G1.x 1.093e-01 4.172e-02 2.620 0.009152 **
G2.x 8.039e-01 4.204e-02 19.125 < 2e-16 ***
```

Y obtenemos estos datos del modelo:

Multiple R-squared: 0.8321
Adjusted R-squared: 0.8298
F-statistic: 372.6 on 5 and 376 DF
p-value: < 2.2e-16

El parámetro *Adjusted R-squared* es 0.82 lo cual es bueno, es cercano a 1. El *p-valor* del estadígrafo de F es menor q 0.05 por lo que existe una variable significativamente distinta de 0 en el modelo.

De aquí en adelante hacemos análisis de residuos a este modelo.

### Análisis de residuos
---

1. Media de errores:

Media de error residual -3.157526e-18
Suma de error residual -1.20997e-15

Por lo que se cumple que ambas son muy cercanas a 0.

2. Podemos ver el histograma de residuos y el gráfico QQ-Plot para asegurar que los errores están distribuidos normal:

![Error Residual](plots.png "Error Residual")

3. Independencia de los residuos:

Al realizar el test de Durbin-Watson obtenemos:

DW = 2.0634, p-value = 0.7137

Como $0.7137 >> 0.05$ no podemos rechazar la hipótesis nula por lo que los errores son independientes.

4. Homocedasticidad

Se realiza el gráfico de predicciones contra errores residuales:

![Homocedasticidad](homo.png "Homocedasticidad")

Como podemos en la mayor parte de la imagen los valores son aleatorios por lo que se cumple la Homocedasticidad.