Control 3: McDonalds

P1

Cargue todos los paquetes que necesita para trabajar con data.table, modelos de predicción de regresión, CART, cluster y Cross-Validation. Además, cargue la base 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!

library(data.table)
library(ggplot2)
library(caret)
library(rpart)
library(rpart.plot)
library(dbscan)
library(factoextra)

base <- fread("Mcdonalds.csv")
base<-as.data.table(base)
base$Grasas_totales<-as.numeric(base$Grasas_totales)
base$Grasas_saturadas<-as.numeric(base$Grasas_saturadas)
base$Grasas_trans<-as.numeric(base$Grasas_trans)

P2

Realice dos modelos de regresión lineal para predecir las calorías de los alimentos ¿Cuál predice mejor dentro de muestra?. Observación: No obtendrá puntaje si compara un modelo de regresión de una variable.

reg1<-lm(formula=Calorias~Grasas_totales+Carbohidratos+Proteina+Colesterol,data=base)
summary(reg1)
## 
## Call:
## lm(formula = Calorias ~ Grasas_totales + Carbohidratos + Proteina + 
##     Colesterol, data = base)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -20.0833  -2.6913   0.7658   3.4120  10.8311 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    -2.102064   0.752238  -2.794  0.00564 ** 
## Grasas_totales  9.057554   0.053387 169.659  < 2e-16 ***
## Carbohidratos   3.976124   0.014374 276.621  < 2e-16 ***
## Proteina        4.049033   0.054978  73.649  < 2e-16 ***
## Colesterol     -0.006896   0.005413  -1.274  0.20394    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.551 on 231 degrees of freedom
##   (24 observations deleted due to missingness)
## Multiple R-squared:  0.9995, Adjusted R-squared:  0.9995 
## F-statistic: 1.15e+05 on 4 and 231 DF,  p-value: < 2.2e-16
reg2<-lm(formula=Calorias~Grasas_totales+Carbohidratos+Proteina+Grasas_saturadas+Colesterol,data=base)
summary(reg2)
## 
## Call:
## lm(formula = Calorias ~ Grasas_totales + Carbohidratos + Proteina + 
##     Grasas_saturadas + Colesterol, data = base)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -16.5208  -3.1742   0.4894   3.8020  10.7904 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      -3.091430   0.797169  -3.878 0.000143 ***
## Grasas_totales    8.886381   0.073531 120.852  < 2e-16 ***
## Carbohidratos     3.942266   0.017258 228.426  < 2e-16 ***
## Proteina          4.132007   0.062510  66.101  < 2e-16 ***
## Grasas_saturadas  0.579136   0.152834   3.789 0.000200 ***
## Colesterol       -0.009919   0.005482  -1.810 0.071877 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.449 on 199 degrees of freedom
##   (55 observations deleted due to missingness)
## Multiple R-squared:  0.9996, Adjusted R-squared:  0.9996 
## F-statistic: 9.095e+04 on 5 and 199 DF,  p-value: < 2.2e-16
pred1<-predict(reg1)
predicciones1<-data.table(RMSE=RMSE(pred1,base$Calorias),MAE=MAE(pred1,base$Calorias))
predicciones1
##        RMSE      MAE
## 1: 166.3149 107.9306
pred2<-predict(reg2)
predicciones2<-data.table(RMSE=RMSE(pred2,base$Calorias),MAE=MAE(pred2,base$Calorias))
predicciones2
##        RMSE      MAE
## 1: 277.5326 176.9549
# El primer modelo predice mejor la cantidad de calorías debido a que su RMSE y MAE son menores que el segundo modelo.

P3

Realice validación cruzada (CV) a los modelos de la pregunta anterior por el método K-folds con 5 folds. ¿Se mantienen las conclusiones anteriores? Pista1: Recuerde setear la semilla set.seed(12345). Pista2: Si existen variables con NA recuerde que puede excluirlas esas observaciones del análisis, pero no las elimine.

set.seed(12345)
setupKCV <- trainControl(method = "cv" , number = 5)

base1<-na.omit(base)

predkfolds1<-train(Calorias~Grasas_totales+Carbohidratos+Proteina+Colesterol,data=base1,method="lm",trControl= setupKCV)
print(predkfolds1)
## Linear Regression 
## 
## 179 samples
##   4 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 144, 143, 144, 143, 142 
## Resampling results:
## 
##   RMSE      Rsquared   MAE     
##   5.918641  0.9995044  4.668084
## 
## Tuning parameter 'intercept' was held constant at a value of TRUE
predkfolds2<-train(Calorias~Grasas_totales+Carbohidratos+Proteina+Grasas_saturadas+Colesterol,data=base1,method="lm",trControl= setupKCV)
print(predkfolds2)
## Linear Regression 
## 
## 179 samples
##   5 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 143, 143, 145, 142, 143 
## Resampling results:
## 
##   RMSE      Rsquared  MAE     
##   5.651828  0.999524  4.563516
## 
## Tuning parameter 'intercept' was held constant at a value of TRUE
# En este caso los el segundo modelo es mejor predictor que el primero, al contrario de la pregunta anterior. Esto se puede deber a la omisión de productos que contenían NA's en sus registros.

P4

Proponga dos variables sobre las cuales segmentar la muestra, en orden de hacer análisis de clusters con el método de kmeans. Muestre sus resultados gráficamente.

datos<- base1[,.(Grasas_totales,Calorias)]
k1<-kmeans(x=datos,centers=3, nstart = 20)
fviz_cluster(k1,data=datos,geom="point")

P5

Cree la variable cat2. Pista: La variable cat2 debe ser una variable factor.

base[Categoria=="Desayuno",cat2:="Desayuno"]
base[Categoria=="Café o té",cat2:="Desayuno"]
base[Categoria=="Carne de cerdo",cat2:="Almuerzo"]
base[Categoria=="Pollo y pescado",cat2:="Almuerzo"]
base[Categoria=="Ensaladas",cat2:="Almuerzo"]
base[Categoria=="Aperitivos",cat2:="Almuerzo"]
base[Categoria=="Postres",cat2:="Postres y Líquidos"]
base[Categoria=="Bebidas",cat2:="Postres y Líquidos"]
base[Categoria=="Batidos",cat2:="Postres y Líquidos"]
base$cat2<-as.factor(base$cat2)

tabla<-base[,.(Categoria,cat2)]

P6

Realice dos modelos de árboles de clasificación de la variable Clasificacion. Pruebe cuál modelo clasifica mejor con validación cruzada. Entrene el modelo con un 80% de la muestra y testee con el 20% restante. Explicite qué modelo es mejor y porqué.

#Crear modelos
arb1<-rpart(cat2~Grasas_totales+Carbohidratos+Proteina,data=base,method="class")
rpart.plot(arb1)

arb2<-rpart(cat2~Calorias+Carbohidratos+Proteina+Azucar+Sodio,data=base,method="class")
rpart.plot(arb2)

# Entrenar el modelo
set.seed(12345)
ind<-createDataPartition(base[,cat2],times=1,p=0.8,list=F)

train<-data.frame(base)[ind,]
test<-data.frame(base)[-ind,]

arb3<-rpart(cat2~Grasas_totales+Carbohidratos+Proteina,data=train,method="class")
rpart.plot(arb3)

set.seed(12345)
ind2<-createDataPartition(base[,cat2],times=1,p=0.8,list=F)

train<-data.frame(base)[ind,]
test<-data.frame(base)[-ind,]

arb4<-rpart(cat2~Calorias+Carbohidratos+Proteina+Azucar+Sodio,data=train,method="class")
rpart.plot(arb4)

prec<-function(x,y,z){
  pred<-predict(x,y,type="class") 
  matconf<-table(y[,z],pred) 
  prueba<-sum(diag(matconf))/sum(matconf)
}
prec(arb3,test,"cat2")
prec(arb4,test,"cat2")