Cargue todos los paquetes que necesita para trabajar con data.table, modelos de predicción de regresión, árboles de decisión, cluster y Cross-Validation. Además, cargue las bases de datos. (1 punto)
Importante: Verifique la clase (class) de las variables que vaya a utilizar en todos sus modelos y si es necesario transformarla a numérica o factor, hágalo!
rm(list=ls())
library(data.table)
library(ggplot2)
library(caret)
library(jtools)
library(scales)
library(rpart.plot)
library(rpart)
library(caret)
library(factoextra)
library(dbscan)
library(janitor)
library(texreg)
library(corrgram)
library(corrplot)
library(moderndive)
library(tidyverse)
Paris <- fread("ParisHousing.csv")
General <- fread("CC GENERAL.csv")
diabetes <- fread("diabetes.csv")
#Modelo 1
f1 <- formula(price ~ squareMeters + basement + attic + garage)
reg1 <- lm(formula=f1, data=Paris)
sum01 <- summ(reg1)
sum01
## MODEL INFO:
## Observations: 10000
## Dependent Variable: price
## Type: OLS linear regression
##
## MODEL FIT:
## F(4,9995) = 1943939011.69, p = 0.00
## R² = 1.00
## Adj. R² = 1.00
##
## Standard errors: OLS
## -------------------------------------------------------
## Est. S.E. t val. p
## ------------------ --------- -------- ---------- ------
## (Intercept) 6451.21 125.18 51.53 0.00
## squareMeters 100.00 0.00 88166.45 0.00
## basement -0.01 0.01 -0.64 0.52
## attic -0.01 0.01 -1.01 0.31
## garage 0.18 0.12 1.48 0.14
## -------------------------------------------------------
#Modelo 2
f2 <- formula(price ~ squareMeters + basement + attic + garage + numPrevOwners + isNewBuilt + floors)
reg2 <- lm(formula = f2, data = Paris)
sum02 <- summ(reg2)
sum02
## MODEL INFO:
## Observations: 10000
## Dependent Variable: price
## Type: OLS linear regression
##
## MODEL FIT:
## F(7,9992) = 1444733184.68, p = 0.00
## R² = 1.00
## Adj. R² = 1.00
##
## Standard errors: OLS
## ---------------------------------------------------------
## Est. S.E. t val. p
## ------------------- --------- -------- ----------- ------
## (Intercept) 3719.14 134.62 27.63 0.00
## squareMeters 100.00 0.00 100528.29 0.00
## basement -0.01 0.01 -1.03 0.30
## attic -0.01 0.01 -1.19 0.23
## garage 0.12 0.11 1.07 0.29
## numPrevOwners -0.99 10.02 -0.10 0.92
## isNewBuilt 132.52 57.25 2.31 0.02
## floors 54.27 0.99 54.79 0.00
## ---------------------------------------------------------
#Comparando modelos
Paris[, Price_mod1 := predict(reg1)]
Paris[, Price_mod2 := predict(reg2)]
#Analizando el MAE
MAE1 <- sum(abs(Paris$price - Paris$Price_mod1))/nrow(Paris)
MAE2 <- sum(abs(Paris$price - Paris$Price_mod2))/nrow(Paris)
data.table(MAE1, MAE2)
## MAE1 MAE2
## 1: 2643.54 2324.194
#Analizando RMSE
RMSE1 <- (sum((Paris$price - Paris$Price_mod1)^2)/nrow(Paris))^(1/2)
RMSE2 <- (sum((Paris$price - Paris$Price_mod2)^2)/nrow(Paris))^(1/2)
data.table(RMSE1, RMSE2)
## RMSE1 RMSE2
## 1: 3262.135 2859.995
#Juntando todos los criterios de comparacion, a excepcion de los R^2 debido a que son iguales (observados en el summary)
data.table(regresion=c('Modelo 01','Modelo 02'),
`Mean Absolute Error` = c(MAE1,MAE2),
`Root Mean Squared Error`=c(RMSE1, RMSE2))
## regresion Mean Absolute Error Root Mean Squared Error
## 1: Modelo 01 2643.540 3262.135
## 2: Modelo 02 2324.194 2859.995
A la hora de analizar ambos modelos, se puede manifestar que uno es mejor estimador de precios que otro y esto se debe gracias al RMSE y MAE, dejando excluido a los R^2 ya que son completamente iguales (R^2 = 1.00). Comenzando por el MAE, podemos decir que el modelo Nº2 es mejor ya que posee menos error absoluto medio. Por otra parte, el RMSE se comporta de la misma forma, me refiero con esto, a que el modelo 2 posee menos RMSE. Por lo tanto, el mejor modelo para estimar el precio es el modelo 2.
#Modelo 1
set.seed(12345)
setupKCV <- trainControl(method = "cv" , number = 10)
predkfolds1<-train(f1,data=Paris,method="lm",trControl= setupKCV)
print(predkfolds1)
## Linear Regression
##
## 10000 samples
## 4 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 9000, 9000, 9000, 9000, 9000, 9000, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 3262.997 0.9999987 2645.209
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
#Modelo 2
predkfolds2<-train(f2,data=Paris,method="lm",trControl= setupKCV)
print(predkfolds2)
## Linear Regression
##
## 10000 samples
## 7 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 9000, 9000, 9000, 9000, 9000, 9000, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 2861.753 0.999999 2326.358
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
Gracias a la validacion cruzada (CV) se puede obtener las mismas conclusiones, es decir, el Modelo 2 sigue siendo mejor estimador que el Modelo 1.
#árbol Nº1
arbol_1 <- rpart(Outcome ~. , data=diabetes, method = "class")
rpart.plot(arbol_1)
#árbol Nº2
arbol_2 <- rpart(Outcome ~ Insulin + Glucose + Age,data = diabetes, method = "class")
rpart.plot(arbol_2)
#CV arbol 1
div1 <- createDataPartition(diabetes$Outcome, times = 1, p = 0.75, list = F)
train1 <- diabetes[div1,]
test1 <- diabetes[-div1,]
arbol_1_t <- rpart(Outcome ~. , data=train1, method = "class")
rpart.plot(arbol_1_t)
#CV arbol 1, contnuación
prediccion_1 <- predict(arbol_1_t, newdata = test1, type = "class")
matriz1 <- table(test1$Outcome, prediccion_1)
matriz1
## prediccion_1
## 0 1
## 0 95 17
## 1 38 42
precision1 <- sum(diag(matriz1))/sum(matriz1)
precision1
## [1] 0.7135417
#CV arbol 2
div2 <- createDataPartition(diabetes$Outcome, times = 1, p = 0.75, list = F)
train2 <- diabetes[div2,]
test2 <- diabetes[-div2,]
arbol_2_t <- rpart(Outcome ~ Insulin + Glucose + Age, data=train2, method = "class")
rpart.plot(arbol_2_t)
prediccion_2 <- predict(arbol_2_t, newdata = test2, type = "class")
matriz2 <- table(test2$Outcome, prediccion_2)
matriz2
## prediccion_2
## 0 1
## 0 109 14
## 1 35 34
precision2 <- sum(diag(matriz2))/sum(matriz2)
precision2
## [1] 0.7447917
Por lo tanto, el arbol número 2 es mejor prediciendo que el árbol número 1, ya que, posee un porcentaje mayor de prediccion que el otro: arbol 2 = 74.48% y arbol 1 = 71.35%
General1 <- General[, .(BALANCE, BALANCE_FREQUENCY, PURCHASES, ONEOFF_PURCHASES,INSTALLMENTS_PURCHASES, CASH_ADVANCE, PURCHASES_FREQUENCY, ONEOFF_PURCHASES_FREQUENCY, PURCHASES_INSTALLMENTS_FREQUENCY,CASH_ADVANCE_FREQUENCY, CREDIT_LIMIT, PAYMENTS, MINIMUM_PAYMENTS, PRC_FULL_PAYMENT)]
datacor <- cor(General1)
corrplot(datacor, method = 'color')
El modelo 1 utilizaré las variables PURCHARSES y BALANCE, esto se debe a que el número compras de una persona y el dinero que posee la tarjeta a la hora de pagar puede ser un buen sistema de clasificacion de clientes.
#Modelo 1
data1 <- General[, .(BALANCE, PURCHASES)]
#fviz_nbclust(x = data1, FUNcluster = kmeans, method = "wss", k.max = 15, diss = get_dist(data1, method = "euclidean"), nstart = 15)
#PARA LA CORRECCIÓN: SE DEMORÓ MUCHO EN CORRER. LA PROFESORA ME DIJO QUE HICIERA CON 4 CLUSTER.
k1<-kmeans(x=data1,centers=4,nstart=15)
fviz_cluster(k1,data=data1,geom = "point")
Otro modelo que se puede utilizar para clasificar (Modelo 2), es usando las variables CASHADVANCE y CASHADVANCEFREQUENCY, es otra posibilidad debido a que el banco puede segmentar a base del efectivo adeltantado y a frecuencia de pago de ello.
data2 <- General[, .(CASH_ADVANCE, CASH_ADVANCE_FREQUENCY)]
#fviz_nbclust(x = data2, FUNcluster = kmeans, method = "wss", k.max = 15, diss = get_dist(data2, method = "euclidean"), nstart = 15)
#PARA LA CORRECCIÓN: SE DEMORÓ MUCHO EN CORRER. LA PROFESORA ME DIJO QUE HICIERA CON 4 CLUSTER.
k2 <- kmeans(x=data2,centers=4,nstart=15)
fviz_cluster(k2,data=data2,geom = "point")
La importancia del CV es primordialmente evaluar modelos como, por ejemplo, de regresiones. Así, posteriormente, compararlo con otro, aportando a la desicion sobre cuál es mejor estimador de lo que se esta buscando o investigando. Por lo tanto, la importancia del CV se basa en la funcion de comparación de modelos.
Una relacion espuria es cuando dos variables no poseen alguna correlacion logica entre ellas, en otras palabras, no existe un lazo que los una como, por ejemplo, gravedad y contabilidad, variables que no tienen conexión logica.
Overfitting es el entrenamiento automatizado del sistema o aplicación para poder originar un algoritmo sobre las variables que probablemente no tengan alguna conexion concisa.