Capacitacion CELEC 2020 - Metodos estadisticos en R.
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
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
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
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
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.
Aqui vemos que los puntos verdes se localizan para x mayor a 2, mientras que los azules para x menor a 2.
alt text
Esto transformado a un arbol de decision quedaria asi:
alt text
Ahora un ejemplo con 3 clases azul, verde y rojo.
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 validacion7.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
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 validacion8.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 validaciondatos.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 ...