library(data.table)
library(ggplot2)
library(caret)
library(jtools)
library(scales)
library(corrplot)
library(plotly)
library(tidyverse)
library(lubridate)
library(texreg)
library(corrgram)
library(knitr)
library(moderndive)
El formato de respuesta es el siguiente:
Abajo del encabezado, debe estar escrita la pregunta. Agregar los códigos en chunks e incluir el output de ser necesario.
La explicación de las respuestas (si es que hay análisis) debe ir como texto, fuera del chunk.
El título del informe debe ser “Tarea 5” y el nombre de todos los integrantes debe ir en autor. La actividad deberá ser entregado en formato HTML. Agregue el número del grupo.
También debe enviar su archivo en formato R Markdown como respaldo.
Recuerde que puede usar todo el material visto para apoyarse.
Todos los integrantes del grupo deben enviar el archivo de Rmarkdown
Tienen hasta el final de la clase para enviar la actividad
El formato tiene puntaje.(3 ptos)
Suprimir warning y mensajes(3 ptos)
Cargue las librerias y base de datos correspondientes.
cargamos base de datos
path <- 'C:/Users/matir/OneDrive/Escritorio/Mati/Universidad/2021/Segundo Semestre/Data Science/Tarea 5/'
base <- fread(paste0(path,'CarPrice_Assignment.csv'))
Tuvimos una breve reunion con la profe y nos dio permiso de hacer un grafico para realizar los valores predichos. De todas maneras, sabemos cómo hacerlo (creando una nueva variable en la base con los valores predichos)
Muestre un histograma de distribución del precio.(4 ptos)
base <- data.frame(base)
ggplot(base, aes(x=price)) +
geom_histogram(bindwidth=0.2, color="black", fill="white") + scale_x_continuous(n.breaks = 10) + scale_y_continuous(n.breaks = 20)+ labs(x="Precio", y="Numero", title= "Distribucion del precio")
Realice un gráfico de correlación entre las variables númericas, estas son, “wheelbase”, “carlength” “carwidth”,“carheight”, “curbweight”, “enginesize”,“boreratio”,“stroke”, “compressionratio”, “horsepower”, “peakrpm”,“citympg”, “highwaympg”,“price” (4 ptos)
correlacion <- cor(base[,c("wheelbase", "carlength", "carwidth","carheight", "curbweight", "enginesize","boreratio","stroke", "compressionratio", "horsepower", "peakrpm","citympg", "highwaympg","price")])
corrplot(correlacion, method = 'color')
Realice dos gráficos de puntos, uno que relacione el precio price, el rendimiento en ciudad citympg y que se diferencie por tipo de tracción drivewheel , el segundo entre precio price, el rendimiento en carretera highwaympgy que se diferencie por tipo de tracción drivewheel (8 ptos)
ggplot(base, aes(x=price, y=citympg,color=drivewheel)) +
geom_point() + facet_wrap(facets="drivewheel", scales = "free_y", "free_x") +
scale_y_continuous(n.breaks = 20)+ geom_smooth(colour="black", size=0.7)+
scale_color_brewer(palette="Set1") +
labs(x="Precio", y="Rendimiento en Ciudad en KM", title= "Precio y Rendmiento en Ciudad", subtitle= "por tipo de Traccion", fill= "Tipo de Causal")
ggplot(base, aes(x=price, y=highwaympg,color=drivewheel)) +
geom_point() + facet_wrap(facets="drivewheel", scales = "free_y", "free_x") +
scale_y_continuous(n.breaks = 20)+ geom_smooth(colour="black", size=0.7)+
scale_color_brewer(palette="Set1") +
labs(x="Precio", y="Rendimiento en Carretera en KM", title= "Precio y Rendmiento en Carretera", subtitle= "por tipo de Traccion", fill= "Tipo de Causal")
Con linea de tendencia
ggplot(base, aes(x=price, y=citympg,color=drivewheel)) +
geom_point() + facet_wrap(facets="drivewheel", scales = "free_y", "free_x") +
scale_y_continuous(n.breaks = 20)+ geom_smooth(aes(colour= drivewheel, fill = drivewheel), method = "lm", fullrange=TRUE) + scale_color_brewer(palette="Set1") + labs(x="Precio", y="Rendimiento en Ciudad en KM", title= "Precio y Rendmiento en Ciudad", subtitle= "por tipo de Traccion")
ggplot(base, aes(x=price, y=highwaympg,color=drivewheel)) +
geom_point() + facet_wrap(facets="drivewheel", scales = "free_y", "free_x") +
scale_y_continuous(n.breaks = 20)+ geom_smooth(aes(colour= drivewheel, fill = drivewheel), method = "lm", fullrange=TRUE) + scale_color_brewer(palette="Set1") + labs(x="Precio", y="Rendimiento en Carretera en KM", title= "Precio y Rendmiento en Carretera", subtitle= "por tipo de Traccion")
Hicimos un plotly, por si se quiere saber exactamenteel precio y marca-modelo de cada auto.
grafico1 <- ggplot(base, aes(x=price, y=citympg,color=drivewheel, text=paste("Marca y modelo del auto:",CarName,"\n","Precio:",price))) +
geom_point() + facet_wrap(facets="drivewheel") +
scale_y_continuous(n.breaks = 20)+
scale_color_brewer(palette="Set1") +
labs(x="Precio", y="Rendimiento en Ciudad en KM", title= "Precio y Rendmiento en Ciudad", subtitle= "por tipo de Traccion", fill= "Tipo de Causal")
ggplotly(grafico1, tooltip = "text")
grafico2 <- ggplot(base, aes(x=price, y=highwaympg,color=drivewheel, text=paste("Marca y modelo del auto:",CarName,"\n","Precio:",price))) +
geom_point() + facet_wrap(facets="drivewheel") +
scale_y_continuous(n.breaks = 20)+
scale_color_brewer(palette="Set1") +
labs(x="Precio", y="Rendimiento en Carretera en KM", title= "Precio y Rendmiento en Ciudad", subtitle= "por tipo de Traccion", fill= "Tipo de Causal")
ggplotly(grafico2, tooltip = "text")
Realice una regresión múltiple entre precio con las variables enginetype y fuelsystem. ¿Qué podrian decir de la significacia de las variables?(5 ptos)
Calcule el predicho para cada observación.(2 ptos)
base <- data.table(base)
f <- formula(price ~ enginetype + fuelsystem)
reg1 <- lm(formula = f, data = base)
sum1 <- summary(reg1)
prediccion.todas1 <- predict(reg1, newdata = base)
base[,predicciont1:= prediccion.todas1]
gg2 <- ggplot(base, aes(price, predicciont1)) +
geom_point() + geom_abline(colour="red") +
labs(title = "Regresión lineal múltiple del precio", subtitle = "Variables: enginetype y fuelsystem", x = "Precio Actual",
y = "Predicción del precio") +
theme(plot.title = element_text(family = "Helvetica", face = "bold", size = (15)),
axis.title = element_text(family = "Helvetica", size = (10)))
gg2
Tabla ordenada:
regresion <- lm(formula = price ~ enginetype + fuelsystem,
data = base)
sum <- summary(regresion)
sum
##
## Call:
## lm(formula = price ~ enginetype + fuelsystem, data = base)
##
## Residuals:
## Min 1Q Median 3Q Max
## -11599.4 -2871.7 -399.4 1660.6 25431.8
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9788.7 2682.8 3.649 0.000340 ***
## enginetypedohcv 13284.1 6391.2 2.078 0.039002 *
## enginetypel -2804.7 2602.7 -1.078 0.282566
## enginetypeohc -2233.2 1941.6 -1.150 0.251503
## enginetypeohcf 261.6 2446.3 0.107 0.914966
## enginetypeohcv 6982.0 2458.2 2.840 0.004996 **
## enginetyperotor -2471.4 6391.2 -0.387 0.699418
## fuelsystem2bbl -371.1 2010.6 -0.185 0.853751
## fuelsystem4bbl 4827.7 7370.9 0.655 0.513276
## fuelsystemidi 8425.5 2354.8 3.578 0.000439 ***
## fuelsystemmfi 5408.5 6413.6 0.843 0.400124
## fuelsystemmpfi 8327.7 2013.8 4.135 5.31e-05 ***
## fuelsystemspdi 3434.9 2760.0 1.245 0.214823
## fuelsystemspfi 3492.5 6413.6 0.545 0.586703
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6141 on 191 degrees of freedom
## Multiple R-squared: 0.4468, Adjusted R-squared: 0.4092
## F-statistic: 11.87 on 13 and 191 DF, p-value: < 2.2e-16
get_regression_table(regresion) %>% kable()
| term | estimate | std_error | statistic | p_value | lower_ci | upper_ci |
|---|---|---|---|---|---|---|
| intercept | 9788.723 | 2682.816 | 3.649 | 0.000 | 4496.971 | 15080.475 |
| enginetype: dohcv | 13284.083 | 6391.247 | 2.078 | 0.039 | 677.591 | 25890.576 |
| enginetype: l | -2804.675 | 2602.677 | -1.078 | 0.283 | -7938.358 | 2329.007 |
| enginetype: ohc | -2233.177 | 1941.569 | -1.150 | 0.252 | -6062.849 | 1596.495 |
| enginetype: ohcf | 261.554 | 2446.301 | 0.107 | 0.915 | -4563.682 | 5086.790 |
| enginetype: ohcv | 6981.968 | 2458.172 | 2.840 | 0.005 | 2133.317 | 11830.619 |
| enginetype: rotor | -2471.417 | 6391.247 | -0.387 | 0.699 | -15077.909 | 10135.076 |
| fuelsystem: 2bbl | -371.127 | 2010.611 | -0.185 | 0.854 | -4336.981 | 3594.728 |
| fuelsystem: 4bbl | 4827.694 | 7370.879 | 0.655 | 0.513 | -9711.085 | 19366.472 |
| fuelsystem: idi | 8425.479 | 2354.816 | 3.578 | 0.000 | 3780.695 | 13070.263 |
| fuelsystem: mfi | 5408.455 | 6413.555 | 0.843 | 0.400 | -7242.040 | 18058.949 |
| fuelsystem: mpfi | 8327.694 | 2013.788 | 4.135 | 0.000 | 4355.573 | 12299.814 |
| fuelsystem: spdi | 3434.899 | 2759.955 | 1.245 | 0.215 | -2009.007 | 8878.805 |
| fuelsystem: spfi | 3492.455 | 6413.555 | 0.545 | 0.587 | -9158.040 | 16142.949 |
screenreg(regresion)
##
## =============================
## Model 1
## -----------------------------
## (Intercept) 9788.72 ***
## (2682.82)
## enginetypedohcv 13284.08 *
## (6391.25)
## enginetypel -2804.68
## (2602.68)
## enginetypeohc -2233.18
## (1941.57)
## enginetypeohcf 261.55
## (2446.30)
## enginetypeohcv 6981.97 **
## (2458.17)
## enginetyperotor -2471.42
## (6391.25)
## fuelsystem2bbl -371.13
## (2010.61)
## fuelsystem4bbl 4827.69
## (7370.88)
## fuelsystemidi 8425.48 ***
## (2354.82)
## fuelsystemmfi 5408.45
## (6413.56)
## fuelsystemmpfi 8327.69 ***
## (2013.79)
## fuelsystemspdi 3434.90
## (2759.95)
## fuelsystemspfi 3492.45
## (6413.56)
## -----------------------------
## R^2 0.45
## Adj. R^2 0.41
## Num. obs. 205
## =============================
## *** p < 0.001; ** p < 0.01; * p < 0.05
En cuanto a la significancia, podemos ver que principalmente si los estadisticos serán significativos si su valor p´se encuentra debajo de los niveles de significancia detallados en la parte “Signif. codes: 0 ‘’ 0.001 ‘’ 0.01 ‘’ 0.05 ‘.’ 0.1 ‘ ’ 1”, entonces si su valor p estar bajo: 0,1 - 0,05 - 0,01 - 0,001 , el estadistico será significativo.
Ahora, en este caso: podemos decir que en cuanto a el tipo de motor –> “dohcv”, “pel”y “ohcv” son significativos. En cuanto al sistema de combustible del coche: “idi” y “mpfi” son significativos.
Dado el modelo anterior, calcule la predicción del precio con un tipo de motor rotor y sistema de gasolina igual a idi (5 puntos)
prediccion <- predict(reg1, data.table(enginetype = "rotor", fuelsystem = "idi"))
prediccion
## 1
## 15742.79
El precio será de 15.743 dolares.
Realice usted un modelo a su preferencia, este debe predecir de mejor manera de mejor manera(*) (7 ptos)
Calcule el predicho para cada observación.(2 ptos)
f2 <- formula(price ~ enginesize + stroke + cylindernumber + horsepower + enginelocation + compressionratio + peakrpm + enginetype + curbweight + carbody + carwidth + carlength)
reg2 <- lm(formula = f2, data = base)
summary(reg2)
##
## Call:
## lm(formula = f2, data = base)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6021.1 -1113.2 -80.8 1028.8 10074.5
##
## Coefficients: (1 not defined because of singularities)
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2.673e+04 1.162e+04 -2.300 0.022568 *
## enginesize 9.616e+01 1.770e+01 5.433 1.78e-07 ***
## stroke -4.674e+03 7.697e+02 -6.072 7.30e-09 ***
## cylindernumberfive -1.071e+04 2.294e+03 -4.670 5.88e-06 ***
## cylindernumberfour -1.243e+04 2.345e+03 -5.300 3.36e-07 ***
## cylindernumbersix -8.564e+03 1.843e+03 -4.648 6.47e-06 ***
## cylindernumberthree -4.548e+03 3.697e+03 -1.230 0.220249
## cylindernumbertwelve -1.563e+04 3.020e+03 -5.174 6.06e-07 ***
## cylindernumbertwo -4.562e+03 3.072e+03 -1.485 0.139259
## horsepower 3.486e+01 1.345e+01 2.591 0.010345 *
## enginelocationrear 6.660e+03 2.209e+03 3.015 0.002942 **
## compressionratio 1.878e+02 5.664e+01 3.316 0.001103 **
## peakrpm 1.580e+00 5.033e-01 3.139 0.001979 **
## enginetypedohcv -1.343e+04 3.520e+03 -3.816 0.000186 ***
## enginetypel 1.029e+03 1.269e+03 0.810 0.418752
## enginetypeohc 3.539e+03 8.464e+02 4.182 4.51e-05 ***
## enginetypeohcf 2.606e+02 1.240e+03 0.210 0.833713
## enginetypeohcv -6.168e+03 1.127e+03 -5.472 1.47e-07 ***
## enginetyperotor NA NA NA NA
## curbweight 4.436e+00 1.361e+00 3.259 0.001338 **
## carbodyhardtop -2.766e+03 1.290e+03 -2.145 0.033333 *
## carbodyhatchback -2.699e+03 1.088e+03 -2.479 0.014080 *
## carbodysedan -1.459e+03 1.135e+03 -1.285 0.200398
## carbodywagon -2.480e+03 1.232e+03 -2.013 0.045561 *
## carwidth 6.710e+02 2.129e+02 3.152 0.001899 **
## carlength -8.632e+01 3.983e+01 -2.167 0.031536 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2208 on 180 degrees of freedom
## Multiple R-squared: 0.9326, Adjusted R-squared: 0.9236
## F-statistic: 103.8 on 24 and 180 DF, p-value: < 2.2e-16
sum2 <- summary(reg2)
prediccion.todas <- predict(reg2, newdata = base)
base[,predicciont:=prediccion.todas]
gg2 <- ggplot(base, aes(price, predicciont)) +
geom_point() + geom_abline(colour="red") +
labs(title = "Regresión lineal múltiple del precio", subtitle = "Variables mas significativas", x = "Precio Actual",
y = "Predicción del precio") +
theme(plot.title = element_text(family = "Helvetica", face = "bold", size = (15)),
axis.title = element_text(family = "Helvetica", size = (10)))
gg2
# si añadieramos la variable "CarName" , no tendría sentido dado que ya el hecho de introducir la marca y modelo del auto se puede obtener el precio exacto. Es como si se quisiera predecir algo en una persona "x" y usaramos como variable el nombre de la persona.
(*)al parecer el enunciado estaba mal redactado, por lo tanto supondremos que se quiere preguntar por el modelo que mejor predice el precio.
En este modelo se incluyeron unicamente variables significativas, por lo tanto segun el R cuadrado ajustado que se logró, que la prediccion se ecerca mucho a la realidad. El modelo se ajusta un 92% app a sus datos.
Interprete la diferencia en los errores de predicción entre el Modelo 1 y el Modelo 2. ¿Qué modelo hace una mejor predicción dentro de muestra? (5 puntos)
base <- data.table(base)
base[,price_predict1 := predict(reg1)]
base[,price_predict2 := predict(reg2)]
MAE1 <- sum(abs(base$price_predict1-base$price))/nrow(base)
MAE2 <- sum(abs(base$price_predict2-base$price))/nrow(base)
data.table(MAE1,MAE2)
## MAE1 MAE2
## 1: 3936.92 1499.11
RMSE1 <- (sum((base$price_predict1-base$price)^2)/nrow(base))^(1/2)
RMSE2 <- (sum((base$price_predict2-base$price)^2)/nrow(base))^(1/2)
data.table(regresion=c('Modelo 01','Modelo 02'),
`R2`=c(sum1$r.squared,sum2$r.squared),
`R2 ajustado`=c(sum1$adj.r.squared,sum2$adj.r.squared),
`Mean Absolute Error` = c(MAE(reg1$fitted.values,base$price),
MAE(reg2$fitted.values,base$price)),
`Root Mean Squared Error`=c(RMSE(reg1$fitted.values,base$price),
RMSE(reg2$fitted.values,base$price)))
## regresion R2 R2 ajustado Mean Absolute Error Root Mean Squared Error
## 1: Modelo 01 0.4468492 0.4092002 3936.92 5927.128
## 2: Modelo 02 0.9326171 0.9236327 1499.11 2068.699
Claramente, el modelo 02 (el que hicimos nosotros) puede explicar de mejor manera el modelo con creces. Esto se debe principalmente por su R2 ajustado, donde es mas del doble que el modelo 01. Esta diferencia se debe a que incorporamos mas variables pero que tambien son significativas.
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 obtenidas en el análisis dentro de muestra? (9 puntos)
set.seed(12345)
setupKCV <- trainControl(method = "cv" , number = 5)
predkfolds1<-train(f,data=base,method="lm",trControl= setupKCV)
print(predkfolds1)
## Linear Regression
##
## 205 samples
## 2 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 164, 165, 164, 164, 163
## Resampling results:
##
## RMSE Rsquared MAE
## 6355.632 0.4070385 4375.004
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
predkfolds2<-train(f2,data=base,method="lm",trControl= setupKCV)
print(predkfolds2)
## Linear Regression
##
## 205 samples
## 12 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 162, 165, 164, 164, 165
## Resampling results:
##
## RMSE Rsquared MAE
## 3086.703 0.8776497 2037.523
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
Si, a pesar de usar pocos folds, las conclusiones se mantienen (quizas nuestro modelo no tiene un R2 tan alto pero supera nuevamente al del primer modelo con menos variables).