Capacitacion CELEC 2020 - Metodos estadisticos en R.

Daniela Ballari - dballari@uazuay.edu.ec - IERSE, Universidad del Azuay, Cuenca (Ecuador)
Francisco Salgado Castillo - fdsalgado@uazuay.edu.ec - IERSE, Universidad del Azuay, Cuenca (Ecuador)

1 Temario

Objetivo

Introducir a los participantes al ambiente de analisis de datos en R y RStudio, con especial enfasis en los modelos estadisticos.

Contexto

Este curso se dicta en el contexto del CONVENIO DE COOPERACION INTERINSTITUCIONAL PARA LA CREACION DE UNA BASE DE DATOS GEOGRAFICA PARA LA GESTION Y ANALISIS DE INFORMACION ESPACIO-TEMPORAL PARA EL MANEJO DE ZONAS INESTABLES Y CUENCAS HIDROGRAFICAS DEL COMPLEJO PAUTE INTEGRAL, mantenido entre la Universidad del Azuay y CELEC EP - Hidropaute.

Temas

  • Estadistica descriptiva.
  • Correlacion.
  • Regresion lineal simple.
  • Regresion lineal multiple
  • Arboles de decision
  • Random Forest para regresion y clasificacion.

Fecha del tutorial

Viernes 7 de febrero 2020. de 8hs a 18hs.

Los acentos fueron omitidos para una adecuada compilacion en html.

2 Datos a utilizar

El ejemplo a utilizar ha sido adaptado de https://rpubs.com/Joaquin_AR/226291

Un estudio quiere generar un modelo que permita predecir la esperanza de vida media de los habitantes de una ciudad en funcion de diferentes variables. Se dispone de informacion sobre: habitantes, analfabetismo, ingresos, esperanza de vida, asesinatos, universitarios, heladas, area y densidad poblacional.

# El data set empleado es el state.x77
# Para facilitar su interpretacion se renombra y se modifica
library(dplyr)
datos <- as.data.frame(state.x77)
datos <- rename(habitantes = Population, analfabetismo = Illiteracy,
                ingresos = Income, esp_vida = `Life Exp`, asesinatos = Murder,universitarios = `HS Grad`, heladas = Frost, area = Area, .data = datos)
datos <- mutate(.data = datos, densidad_pobl = habitantes * 1000 / area)

3 Estadistica descriptiva

3.1 Medidas de centralidad

La media (o promedio) es la medida de centralidad mas utilizada.

alt text

alt text

Sin embargo, cuando existen valores extremos (muy grandes o muy pequenos), la mediana es mas representativa. Es un punto medio de los valores una vez que han sido ordenados de menor a mayor o de mayor a menor.

El histograma permite visalizar la dispersion y la forma de distribucion de los datos.

mean(datos$esp_vida)
## [1] 70.8786
median(datos$esp_vida)
## [1] 70.675
hist(datos$esp_vida)

mean(datos$analfabetismo)
## [1] 1.17
median(datos$analfabetismo)
## [1] 0.95
hist(datos$analfabetismo)

3.2 Medidas de dispersion

Las medidas de dispersion nos permiten responder: Que tanto los datos se acumulan alrededor de la media aritmetica.

  • Dispersion pequena: se acumulan con proximidad a la media. La media es representativa de los datos.
  • Dispersion grande: los datos se alejan considerablemente de la media. La media no es representativa de los datos.

La varianza es una cantidad media respecto de la cual una poblacion o muestra varia. En particular, es la media aritmetica de los valores absolutos de las desviaciones respecto de la media aritmetica.

alt text

alt text

var(datos$esp_vida)
## [1] 1.80202
sd(datos$esp_vida)
## [1] 1.342394
var(datos$analfabetismo)
## [1] 0.3715306
sd(datos$analfabetismo)
## [1] 0.6095331

3.3 Medidas de posicion relativas

Cuartiles, deciles y percentiles. Dividen un conjunto de datos en partes iguales

  • Cuartiles: 4 partes iguales. Datos ordenados de menor a mayor.
    —Q2 o cuartil 2: Mediana divide al conjunto en 2 partes de 50%.
    —Q1 o cuartil 1: representa el 25% de los datos.
    —Q3 o cuartil 3: representa al 75% de los datos.

  • Deciles: 10 partes iguales
  • Percentiles: 100 partes iguales

summary(datos$esp_vida)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   67.96   70.12   70.67   70.88   71.89   73.60
quantile(datos$esp_vida)
##      0%     25%     50%     75%    100% 
## 67.9600 70.1175 70.6750 71.8925 73.6000
boxplot(datos$esp_vida)

summary(datos$analfabetismo)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.500   0.625   0.950   1.170   1.575   2.800
quantile(datos$analfabetismo)
##    0%   25%   50%   75%  100% 
## 0.500 0.625 0.950 1.575 2.800
boxplot(datos$analfabetismo)

boxplot(datos$ingreso)

4 Correlacion

La correlacion es un grupo de tecnicas para medir la asociacion entre dos variables, es decir la fuerza de la relacion entre dos conjuntos de variables cuantitativas.

  • Se mide de -1.00 a 1.00
  • -1.00 y 1.00 Relacion perfecta
  • 1.00 Relacion lineal directa o positiva
  • -1.00 Relacion lineal indirecta o negativa
  • 0 No hay relacion
  • Cercano a 0 (0.08 Relacion muy debil

Se calcula el coeficiente de correlacion indicando la direccion y la fuerza. Direccion = positivo o negativo. Fuerza = debil (weak), moderado (moderate) o fuerte (strong).

alt text

alt text

4.1 Analizar la relacion entre 2 variables

cor(x = datos$analfabetismo, y=datos$esp_vida, method = "pearson")
## [1] -0.5884779
plot(datos$analfabetismo, y=datos$esp_vida)

library(GGally)
ggpairs(datos, lower = list(continuous = "smooth"),
        diag = list(continuous = "bar"), axisLabels = "none")

4.2 Analizar la relacion entre mas de 2 variables

round(cor(x = datos, method = "pearson"), 2)
##                habitantes ingresos analfabetismo esp_vida asesinatos
## habitantes           1.00     0.21          0.11    -0.07       0.34
## ingresos             0.21     1.00         -0.44     0.34      -0.23
## analfabetismo        0.11    -0.44          1.00    -0.59       0.70
## esp_vida            -0.07     0.34         -0.59     1.00      -0.78
## asesinatos           0.34    -0.23          0.70    -0.78       1.00
## universitarios      -0.10     0.62         -0.66     0.58      -0.49
## heladas             -0.33     0.23         -0.67     0.26      -0.54
## area                 0.02     0.36          0.08    -0.11       0.23
##                universitarios heladas  area densidad_pobl
## habitantes              -0.10   -0.33  0.02          0.25
## ingresos                 0.62    0.23  0.36          0.33
## analfabetismo           -0.66   -0.67  0.08          0.01
## esp_vida                 0.58    0.26 -0.11          0.09
## asesinatos              -0.49   -0.54  0.23         -0.19
## universitarios           1.00    0.37  0.33         -0.09
## heladas                  0.37    1.00  0.06          0.00
## area                     0.33    0.06  1.00         -0.34
##  [ reached getOption("max.print") -- omitted 1 row ]
plot(datos[,1:4])

library(psych)
pairs.panels(datos[,1:4])

library(corrplot)
x <- cor(datos[,1:4])
corrplot(x, type="upper", order="hclust")

library(PerformanceAnalytics)
chart.Correlation(datos[,1:4])

library(GGally)
ggpairs(datos, lower = list(continuous = "smooth"),
        diag = list(continuous = "bar"), axisLabels = "none")

5 Regresion lineal simple

Utilice la funcion lm () para conocer los parametros de la regresion. El primer argumento es la variable dependiente y el segundo la variable independiente, ambos se encuentran separados por el signo ~. Con summary() se accede a los resultados de la regresion.

x=datos$analfabetismo
y=datos$esp_vida

regresion = lm(y ~ x)
summary(regresion)
## 
## Call:
## lm(formula = y ~ x)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.7169 -0.8063 -0.0349  0.7674  3.6675 
## 
## Coefficients:
##             Estimate Std. Error t value             Pr(>|t|)    
## (Intercept)  72.3949     0.3383 213.973 < 0.0000000000000002 ***
## x            -1.2960     0.2570  -5.043           0.00000697 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.097 on 48 degrees of freedom
## Multiple R-squared:  0.3463, Adjusted R-squared:  0.3327 
## F-statistic: 25.43 on 1 and 48 DF,  p-value: 0.000006969

El valor de R2 indica que el modelo calculado explica el 34.63% de la variabilidad presente en la variable respuesta (esperanza de vida) mediante la variable independiente (analfabetismo).

El p-value obtenido en el test F (0.0000069) determina que si es significativamente superior la varianza explicada por el modelo en comparacion a la varianza total. Es el parametro que determina si el modelo es significativo.

El modelo lineal generado sigue la ecuacion esperanza de vida = 72.39 - 1.29 analfabetismo Por cada unidad que se incrementa de analfabetismo, la esperanza de vida decrece en promedio 1.29 unidades.

5.1 Graficar el diagrama de dispersion y la recta de regresion

plot(x, y, xlab = "x", ylab = "y")
abline(regresion)

6 Regresion lineal multiple

Del analisis de correlacion se puede extraer las siguientes conclusiones:

  • Las variables que tienen una mayor relacion lineal con la esperanza de vida son: asesinatos (r= -0.78), analfabetismo (r= -0.59) y universitarios (r= 0.58).
  • Asesinatos y analfabetismo estan medianamente correlacionados (r = 0.7) por lo que posiblemente no sea util introducir ambos predictores en el modelo.
  • Las variables habitantes, area y densidad poblacional muestran una distribucion exponencial, una transformacion logaritmica posiblemente haria mas normal su distribucion.

6.1 Generar el modelo

options(scipen=999) 

modelo <- lm(esp_vida ~ habitantes + ingresos + analfabetismo + asesinatos + universitarios + heladas + area + densidad_pobl, data = datos )
summary(modelo)
## 
## Call:
## lm(formula = esp_vida ~ habitantes + ingresos + analfabetismo + 
##     asesinatos + universitarios + heladas + area + densidad_pobl, 
##     data = datos)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.47514 -0.45887 -0.06352  0.59362  1.21823 
## 
## Coefficients:
##                    Estimate   Std. Error t value             Pr(>|t|)    
## (Intercept)    69.950613501  1.842940955  37.956 < 0.0000000000000002 ***
## habitantes      0.000064802  0.000030011   2.159               0.0367 *  
## ingresos        0.000270072  0.000308690   0.875               0.3867    
## analfabetismo   0.302860675  0.402355572   0.753               0.4559    
## asesinatos     -0.328648015  0.049405728  -6.652         0.0000000512 ***
## universitarios  0.042907670  0.023318129   1.840               0.0730 .  
## heladas        -0.004580195  0.003189230  -1.436               0.1585    
## area           -0.000001558  0.000001914  -0.814               0.4205    
## densidad_pobl  -0.001104781  0.000731185  -1.511               0.1385    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.7337 on 41 degrees of freedom
## Multiple R-squared:  0.7501, Adjusted R-squared:  0.7013 
## F-statistic: 15.38 on 8 and 41 DF,  p-value: 0.0000000003787

El modelo con todas las variables introducidas como predictores tiene un R2 alta (0.7501), es capaz de explicar el 75,01% de la variabilidad observada en la esperanza de vida. El p-value del modelo es significativo (3.787e-10) por lo que se puede aceptar que el modelo no es por azar, al menos uno de los coeficientes parciales de regresion es distinto de 0. Muchos de ellos no son significativos, lo que es un indicativo de que podrian no contribuir al modelo.

6.2 Seleccion de los mejores predictores

En este caso se emplea el metodo mixto iniciando el modelo con todas las variables como predictores y realizando la seleccion de los mejores predictores con la medicion Akaike(AIC).

step(object = modelo, direction = "both", trace = 1)
## Start:  AIC=-22.89
## esp_vida ~ habitantes + ingresos + analfabetismo + asesinatos + 
##     universitarios + heladas + area + densidad_pobl
## 
##                  Df Sum of Sq    RSS     AIC
## - analfabetismo   1    0.3050 22.373 -24.208
## - area            1    0.3564 22.425 -24.093
## - ingresos        1    0.4120 22.480 -23.969
## <none>                        22.068 -22.894
## - heladas         1    1.1102 23.178 -22.440
## - densidad_pobl   1    1.2288 23.297 -22.185
## - universitarios  1    1.8225 23.891 -20.926
## - habitantes      1    2.5095 24.578 -19.509
## - asesinatos      1   23.8173 45.886  11.707
## 
## Step:  AIC=-24.21
## esp_vida ~ habitantes + ingresos + asesinatos + universitarios + 
##     heladas + area + densidad_pobl
## 
##                  Df Sum of Sq    RSS     AIC
## - area            1    0.1427 22.516 -25.890
## - ingresos        1    0.2316 22.605 -25.693
## <none>                        22.373 -24.208
## - densidad_pobl   1    0.9286 23.302 -24.174
## - universitarios  1    1.5218 23.895 -22.918
## + analfabetismo   1    0.3050 22.068 -22.894
## - habitantes      1    2.2047 24.578 -21.509
## - heladas         1    3.1324 25.506 -19.656
## - asesinatos      1   26.7071 49.080  13.072
## 
## Step:  AIC=-25.89
## esp_vida ~ habitantes + ingresos + asesinatos + universitarios + 
##     heladas + densidad_pobl
## 
##                  Df Sum of Sq    RSS     AIC
## - ingresos        1     0.132 22.648 -27.598
## - densidad_pobl   1     0.786 23.302 -26.174
## <none>                        22.516 -25.890
## - universitarios  1     1.424 23.940 -24.824
## + area            1     0.143 22.373 -24.208
## + analfabetismo   1     0.091 22.425 -24.093
## - habitantes      1     2.332 24.848 -22.962
## - heladas         1     3.304 25.820 -21.043
## - asesinatos      1    32.779 55.295  17.033
## 
## Step:  AIC=-27.6
## esp_vida ~ habitantes + asesinatos + universitarios + heladas + 
##     densidad_pobl
## 
##                  Df Sum of Sq    RSS     AIC
## - densidad_pobl   1     0.660 23.308 -28.161
## <none>                        22.648 -27.598
## + ingresos        1     0.132 22.516 -25.890
## + analfabetismo   1     0.061 22.587 -25.732
## + area            1     0.043 22.605 -25.693
## - habitantes      1     2.659 25.307 -24.046
## - heladas         1     3.179 25.827 -23.030
## - universitarios  1     3.966 26.614 -21.529
## - asesinatos      1    33.626 56.274  15.910
## 
## Step:  AIC=-28.16
## esp_vida ~ habitantes + asesinatos + universitarios + heladas
## 
##                  Df Sum of Sq    RSS     AIC
## <none>                        23.308 -28.161
## + densidad_pobl   1     0.660 22.648 -27.598
## + ingresos        1     0.006 23.302 -26.174
## + analfabetismo   1     0.004 23.304 -26.170
## + area            1     0.001 23.307 -26.163
## - habitantes      1     2.064 25.372 -25.920
## - heladas         1     3.122 26.430 -23.877
## - universitarios  1     5.112 28.420 -20.246
## - asesinatos      1    34.816 58.124  15.528
## 
## Call:
## lm(formula = esp_vida ~ habitantes + asesinatos + universitarios + 
##     heladas, data = datos)
## 
## Coefficients:
##    (Intercept)      habitantes      asesinatos  universitarios         heladas  
##    71.02712853      0.00005014     -0.30014880      0.04658225     -0.00594329

El mejor modelo (AIC mas bajo) resultante del proceso de seleccion ha sido:

modelo <- (lm(formula = esp_vida ~ habitantes + asesinatos + universitarios + heladas, data = datos))
summary(modelo)
## 
## Call:
## lm(formula = esp_vida ~ habitantes + asesinatos + universitarios + 
##     heladas, data = datos)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.47095 -0.53464 -0.03701  0.57621  1.50683 
## 
## Coefficients:
##                   Estimate  Std. Error t value             Pr(>|t|)    
## (Intercept)    71.02712853  0.95285296  74.542 < 0.0000000000000002 ***
## habitantes      0.00005014  0.00002512   1.996              0.05201 .  
## asesinatos     -0.30014880  0.03660946  -8.199       0.000000000177 ***
## universitarios  0.04658225  0.01482706   3.142              0.00297 ** 
## heladas        -0.00594329  0.00242087  -2.455              0.01802 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.7197 on 45 degrees of freedom
## Multiple R-squared:  0.736,  Adjusted R-squared:  0.7126 
## F-statistic: 31.37 on 4 and 45 DF,  p-value: 0.000000000001696

Cada una de las pendientes de un modelo de regresion lineal multiple (coeficientes parciales de regresion de los predictores) se define del siguiente modo: Si el resto de variables se mantienen constantes, por cada unidad que aumenta el predictor en cuestion, la variable (Y) varia en promedio tantas unidades como indica la pendiente. Para este ejemplo, por cada unidad que aumenta el predictor universitarios, la esperanza de vida aumenta en promedio 0.04658 unidades, manteniendose constantes el resto de predictores.

6.3 Validacion de condiciones para la regresion multiple lineal

6.3.1 Relacion lineal entre los predictores numericos y la variable respuesta

Si la relacion es lineal, los residuos deben de distribuirse aleatoriamente en torno a 0 con una variabilidad constante a lo largo del eje X. En este caso de confirma la normalidad.

library(ggplot2)
library(gridExtra)
plot1 <- ggplot(data = datos, aes(habitantes, modelo$residuals)) +
    geom_point() + geom_smooth(color = "firebrick") + geom_hline(yintercept = 0) +
    theme_bw()
plot2 <- ggplot(data = datos, aes(asesinatos, modelo$residuals)) +
    geom_point() + geom_smooth(color = "firebrick") + geom_hline(yintercept = 0) +
    theme_bw()
plot3 <- ggplot(data = datos, aes(universitarios, modelo$residuals)) +
    geom_point() + geom_smooth(color = "firebrick") + geom_hline(yintercept = 0) +
    theme_bw()
plot4 <- ggplot(data = datos, aes(heladas, modelo$residuals)) +
    geom_point() + geom_smooth(color = "firebrick") + geom_hline(yintercept = 0) +
    theme_bw()
grid.arrange(plot1, plot2, plot3, plot4)

6.3.2 Distribucion normal de los residuos

qqnorm(modelo$residuals)
qqline(modelo$residuals)

shapiro.test(modelo$residuals) # Si p-value es mayor a 0.05, los residuos siguen una distribucion normal
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo$residuals
## W = 0.97935, p-value = 0.525

6.3.3 Variabilidad constante de los residuos (homocedasticidad)

La varianza de los residuos debe ser aproximadamente constante a lo largo del eje X. Se puede comprobar mediante graficos (scatterplot) de los residuos de cada observacion (formas conicas son un claro indicio de falta de homocedasticidad) o mediante contraste de hipotesis.

Los residuos se tienen que distribuir de forma aleatoria en torno a cero, manteniendo aproximadamente la misma variabilidad a lo largo del eje X. En este caso de confirma la homocedasticidad.

alt text

alt text

ggplot(data = datos, aes(modelo$fitted.values, modelo$residuals)) +
geom_point() +
geom_smooth(color = "firebrick", se = FALSE) +
geom_hline(yintercept = 0) +
theme_bw()

6.3.4 No multicolinialidad

Los predictores deben ser independientes, no debe de haber colinialidad entre ellos. La colinialidad ocurre cuando un predictor esta linealmente relacionado con uno o varios de los otros predictores del modelo o cuando es la combinacion lineal de otros predictores.

corrplot(cor(dplyr::select(datos, habitantes,asesinatos,universitarios,heladas)),
         method = "number", tl.col = "black")

6.3.4.1 Analisis de Inflacion de Varianza (VIF)

  • VIF = 1: Ausencia total de colinialidad
  • 1 < VIF < 5: cierta colinialidad
  • 5 < VIF < 10: Causa de preocupacion

No hay predictores que muestren una correlacion lineal muy alta ni inflacion de varianza.

library(car)
vif(modelo)
##     habitantes     asesinatos universitarios        heladas 
##       1.189835       1.727844       1.356791       1.498077

6.4 Conclusion

El modelo lineal multiple

Esperanza de vida = 71 + 0.00005014 x habitantes - 0.30014880 x asesinatos + 0.04658225 x universitarios - 0.00594329 x heladas

El modelo es capaz de explicar el 71.26% de la variabilidad observada en la esperanza de vida (R2-Adjusted: 0.7126). El test F muestra que es significativo (p-value: 1.696e-12). Se satisfacen todas las condiciones para este tipo de regresion multiple.

7 Arboles de decision

Adaptado de https://victorzhou.com/blog/intro-to-random-forests/

Partamos de un grafico de dispersion entre dos variables. El objetivo es clasificar los datos en grupos de azul y verde.
alt text

Aqui vemos que los puntos verdes se localizan para x mayor a 2, mientras que los azules para x menor a 2.

alt text

alt text

Esto transformado a un arbol de decision quedaria asi:

alt text

alt text

Ahora un ejemplo con 3 clases azul, verde y rojo.

alt text

alt text

alt text

alt text

7.1 Entrenamiento de un arbol de decision

El entrenamiento consiste, a partir de un set de datos, “aprender” los valores limites y nodos que permiten separar cada clase. Es decir, es generar la estructura del arbol.

7.1.1 Datos de entrenamiento y de validacion

set.seed(101)#Semilla aleatoria

train.i <- sample(1:nrow(datos),30) # 30 datos para entrenamiento, seleccionados aleatoriamente
train<- datos[train.i,]              # Set de datos de entrenamiento
test<- datos[-train.i,]              # Set de datos de validacion

7.1.2 Estructura del arbol de decision

library(rpart)
library(rpart.plot)
library(rattle)
library(caret)

modelo_arbol <- rpart(esp_vida ~ ., data = train, method = "anova", minsplit = 2, minbucket = 1)#cp = mean value to predict all clases

rpart.plot(modelo_arbol,extra = 0,tweak =0.9,shadow.col="gray")

fancyRpartPlot(modelo_arbol, caption = NULL)

## Prediccion

La predicion consiste en aplicar el modelo de arboles de decisiones a un set de datos independiente, que no ha sido utilizado en el entrenamiento.

prediccion_arbol<- predict(modelo_arbol, newdata=test)
head(prediccion_arbol)
##        1        2        4        5        7        8 
## 68.19667 70.49182 68.19667 70.49182 72.70000 73.60000

7.2 Validacion

library(Metrics)

test$prediccion <- prediccion_arbol

rmse(test$esp_vida, test$prediccion)
## [1] 1.424863
cor(test$esp_vida, test$prediccion)
## [1] 0.5594101
percent_bias(test$esp_vida, test$prediccion)
## [1] -0.002962882

8 Random Forest

En Random Forest se aplican muchos (muchisimos) arboles de decision de manera que se logra mejorar la prediccion. No se usan todos los datos, sino que se toman n muestran con reemplazos. Con cada nuestra se entrenan los n arboles de decision. Para hacer la prediccion se utilizan todos los arboles, agregando los resultados de cada arbol individual. En el caso de clasificacion se utiliza la mayoria de votos de cada clase. Adicionalmente, en Random Forest se puede controlar cuantas variables son evaluadas en cada division del arbol.

alt text

alt text

alt text

alt text

8.1 RF. Ejemplo regresion

8.1.1 Datos de entrenamiento y de validacion

set.seed(101)#Semilla aleatoria

train.i <- sample(1:nrow(datos),30) # 30 datos para entrenamiento, seleccionados aleatoriamente
train<- datos[train.i,]              # Set de datos de entrenamiento
test<- datos[-train.i,]              # Set de datos de validacion

8.1.2 Aprendizaje del modelo

La variable esp_vida sera la variable objetivo. Se usaran 500 arboles.

library(randomForest)

datos.rf <- randomForest(esp_vida ~ . , data = train, ntree=500,localImp = TRUE)
datos.rf
## 
## Call:
##  randomForest(formula = esp_vida ~ ., data = train, ntree = 500,      localImp = TRUE) 
##                Type of random forest: regression
##                      Number of trees: 500
## No. of variables tried at each split: 2
## 
##           Mean of squared residuals: 0.9054741
##                     % Var explained: 54.33

El error medio cuadratico y la varianza explicada son calculados usando la estimacion OBB. El numero de variables seleccionadas aleatoriamente en cada ramificacion es 2 por defecto.

Se incrementaran el numero de arboles y de variables a evaluar en cada ramificacion

datos.rf <- randomForest(esp_vida ~ . , data = train, ntree=1000,localImp = TRUE, mtry=4)
datos.rf
## 
## Call:
##  randomForest(formula = esp_vida ~ ., data = train, ntree = 1000,      localImp = TRUE, mtry = 4) 
##                Type of random forest: regression
##                      Number of trees: 1000
## No. of variables tried at each split: 4
## 
##           Mean of squared residuals: 0.8544772
##                     % Var explained: 56.9

8.1.3 Error OBB vs numero de arboles

plot(datos.rf)

8.1.4 Importancia de variables

# importance(datos.rf)
varImpPlot(datos.rf)

8.1.5 Prediccion

La predicion consiste en aplicar el modelo RF a un set de datos independiente, que no ha sido utilizado en el entrenamiento

prediccion<- predict(datos.rf, newdata=test)
head(prediccion)
##        1        2        4        5        7        8 
## 68.77365 69.99715 69.39355 70.58914 72.33947 72.08340

8.1.6 Validacion

Si bien no es la unica opcion, en este caso se calcularan diferentes metricas con la libreria Metrics.

test$prediccion <- prediccion

rmse(test$esp_vida, test$prediccion)
## [1] 0.8494712
cor(test$esp_vida, test$prediccion)
## [1] 0.7605639
percent_bias(test$esp_vida, test$prediccion)
## [1] -0.001467544

8.2 RF. Ejemplo clasificacion

8.2.1 Clasificacion y datos de entrenamiento

mean(datos$esp_vida)
## [1] 70.8786
datos.c<-datos
datos.c$esp_vida[datos$esp_vida<=70]<- "<=70"
datos.c$esp_vida[datos$esp_vida>70]<- ">70"

datos.c$esp_vida<- as.factor(datos.c$esp_vida)

datos.c$esp_vida
##  [1] <=70 <=70 >70  >70  >70  >70  >70  >70  >70  <=70 >70  >70  >70  >70  >70 
## [16] >70  >70  <=70 >70  >70  >70  >70  >70  <=70 >70  >70  >70  <=70 >70  >70 
## [31] >70  >70  <=70 >70  >70  >70  >70  >70  >70  <=70 >70  >70  >70  >70  >70 
## [46] >70  >70  <=70 >70  >70 
## Levels: <=70 >70
table(datos.c$esp_vida)
## 
## <=70  >70 
##    9   41
train.c.i <- sample(1:nrow(datos.c),30) # 30 datos para entrenamiento, seleccionados aleatoriamente
train.c<- datos.c[train.c.i,]              # Set de datos de entrenamiento
test.c<- datos.c[-train.c.i,]  

table(train.c$esp_vida)
## 
## <=70  >70 
##    5   25

8.2.2 Grupos balanceados

library(splitstackshape)
train.c <- data.frame(stratified(datos.c, c("esp_vida"), .7,keep.rownames = TRUE))
table(train.c$esp_vida)
## 
## <=70  >70 
##    6   29
test.c<- datos.c[- as.numeric(train.c$rn),]              # Set de datos de validacion
datos.c.rf <- randomForest(esp_vida ~ . , data = train.c[,-1], ntree=500, localImp = TRUE, mtry=4) #-1 es para omitir la columna de nr que contiene el numero de fila
datos.c.rf
## 
## Call:
##  randomForest(formula = esp_vida ~ ., data = train.c[, -1], ntree = 500,      localImp = TRUE, mtry = 4) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 4
## 
##         OOB estimate of  error rate: 11.43%
## Confusion matrix:
##      <=70 >70 class.error
## <=70    3   3  0.50000000
## >70     1  28  0.03448276
  • OOB estimate of error rate es de 8.57%, lo cual puede ser considerado bajo.

8.2.3 Error OBB vs numero de arboles

plot(datos.c.rf)

8.2.4 Importancia de variables

# importance(datos.rf)
varImpPlot(datos.c.rf)

8.2.5 Prediccion

La predicion consiste en aplicar el modelo RF a un set de datos independiente, que no ha sido utilizado en el entrenamiento.

prediccion.c<- predict(datos.c.rf, newdata=test.c)
head(prediccion.c)
##    2    4    6   10   11   14 
## <=70 <=70  >70 <=70  >70  >70 
## Levels: <=70 >70

8.2.6 Validacion

Deben construirse matrices de confusion.

confusion<- confusionMatrix(table(test.c$esp_vida, prediccion.c))

confusion
## Confusion Matrix and Statistics
## 
##       prediccion.c
##        <=70 >70
##   <=70    3   0
##   >70     2  10
##                                           
##                Accuracy : 0.8667          
##                  95% CI : (0.5954, 0.9834)
##     No Information Rate : 0.6667          
##     P-Value [Acc > NIR] : 0.07936         
##                                           
##                   Kappa : 0.6667          
##                                           
##  Mcnemar's Test P-Value : 0.47950         
##                                           
##             Sensitivity : 0.6000          
##             Specificity : 1.0000          
##          Pos Pred Value : 1.0000          
##          Neg Pred Value : 0.8333          
##              Prevalence : 0.3333          
##          Detection Rate : 0.2000          
##    Detection Prevalence : 0.2000          
##       Balanced Accuracy : 0.8000          
##                                           
##        'Positive' Class : <=70            
## 

9 Actividad extra

9.1 Explorar datos

Boston: https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/Boston.html

506 registros x 14 variables - medv: median value of owner-occupied homes in $1000s.
- crim: per capita crime rate by town.
- zn: proportion of residential land zoned for lots over 25,000 sq.ft.
- indus: proportion of non-retail business acres per town.
- chas: Charles River dummy variable (= 1 if tract bounds river; 0 otherwise).
- nox: nitrogen oxides concentration (parts per 10 million).
- rm: average number of rooms per dwelling.
- age: proportion of owner-occupied units built prior to 1940.
- dis: weighted mean of distances to five Boston employment centres.
- rad: index of accessibility to radial highways.
- tax: full-value property-tax rate per $10,000.
- ptratio: pupil-teacher ratio by town.
- black: 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town.
- lstat: lower status of the population (percent).

La variable medv sera la variable objetivo, la cual es la mediana del costo de vivienda.

library(MASS)       # Boston housing dataset

dim(Boston)     # n col y n rows
## [1] 506  14
head(Boston)    # Primeros 6 registros
##      crim zn indus chas   nox    rm  age    dis rad tax ptratio  black lstat
## 1 0.00632 18  2.31    0 0.538 6.575 65.2 4.0900   1 296    15.3 396.90  4.98
## 2 0.02731  0  7.07    0 0.469 6.421 78.9 4.9671   2 242    17.8 396.90  9.14
## 3 0.02729  0  7.07    0 0.469 7.185 61.1 4.9671   2 242    17.8 392.83  4.03
## 4 0.03237  0  2.18    0 0.458 6.998 45.8 6.0622   3 222    18.7 394.63  2.94
## 5 0.06905  0  2.18    0 0.458 7.147 54.2 6.0622   3 222    18.7 396.90  5.33
##   medv
## 1 24.0
## 2 21.6
## 3 34.7
## 4 33.4
## 5 36.2
##  [ reached 'max' / getOption("max.print") -- omitted 1 rows ]
str(Boston)     # Estructura
## 'data.frame':    506 obs. of  14 variables:
##  $ crim   : num  0.00632 0.02731 0.02729 0.03237 0.06905 ...
##  $ zn     : num  18 0 0 0 0 0 12.5 12.5 12.5 12.5 ...
##  $ indus  : num  2.31 7.07 7.07 2.18 2.18 2.18 7.87 7.87 7.87 7.87 ...
##  $ chas   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ nox    : num  0.538 0.469 0.469 0.458 0.458 0.458 0.524 0.524 0.524 0.524 ...
##  $ rm     : num  6.58 6.42 7.18 7 7.15 ...
##  $ age    : num  65.2 78.9 61.1 45.8 54.2 58.7 66.6 96.1 100 85.9 ...
##  $ dis    : num  4.09 4.97 4.97 6.06 6.06 ...
##  $ rad    : int  1 2 2 3 3 3 5 5 5 5 ...
##  $ tax    : num  296 242 242 222 222 222 311 311 311 311 ...
##  $ ptratio: num  15.3 17.8 17.8 18.7 18.7 18.7 15.2 15.2 15.2 15.2 ...
##  $ black  : num  397 397 393 395 397 ...
##  $ lstat  : num  4.98 9.14 4.03 2.94 5.33 ...
##  $ medv   : num  24 21.6 34.7 33.4 36.2 28.7 22.9 27.1 16.5 18.9 ...

Daniela Ballari

2020-02-05