# Descargar e instalar librerías necesarias si no están instaladas
if (!require("readxl")) install.packages("readxl", dependencies=TRUE)
## Loading required package: readxl
## Warning: package 'readxl' was built under R version 4.3.3
if (!require("ggplot2")) install.packages("ggplot2", dependencies=TRUE)
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.3.3
if (!require("dplyr")) install.packages("dplyr", dependencies=TRUE)
## Loading required package: dplyr
## Warning: package 'dplyr' was built under R version 4.3.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
if (!require("GGally")) install.packages("GGally", dependencies=TRUE)
## Loading required package: GGally
## Warning: package 'GGally' was built under R version 4.3.3
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
if (!require("broom")) install.packages("broom", dependencies=TRUE)
## Loading required package: broom
## Warning: package 'broom' was built under R version 4.3.3
# Cargar librerías necesarias
library(ggplot2)
library(dplyr)
library(GGally)
library(broom)
library(readxl)
Paso 1 Analisis de datos univariado
# Verificar si el archivo existe antes de cargarlo
path <- "C:/Users/USUARIO/OneDrive/Escritorio/base1_mazdacol.xlsx"
if (file.exists(path)) {
base1_mazdacol <- read_excel(path)
} else {
stop("Error: objeto 'base1_mazdacol' no encontrado. Verifique que el archivo exista y la ruta sea correcta.")
}
# Análisis Exploratorio de Datos (Univariado)
# Resumen de la estructura de los base1_mazdacol
str(base1_mazdacol)
## tibble [314 × 11] (S3: tbl_df/tbl/data.frame)
## $ web-scraper-order : chr [1:314] "1662991183-54" "1662991216-64" "1662991275-85" "1662991284-88" ...
## $ web-scraper-start-url: chr [1:314] "https://www.olx.com.co/items/q-mazda-2" "https://www.olx.com.co/items/q-mazda-2" "https://www.olx.com.co/items/q-mazda-2" "https://www.olx.com.co/items/q-mazda-2" ...
## $ link : chr [1:314] "$ 34.000.0002008 - 140.000 kmMAZDA 2 2008San Bernardo, Medellín13 ago" "$ 26.400.0002012 - 112.000 kmVencambio Renault STEPWAY automático RECIBO TWINGO KIA PICANTO SPARK GT MAZDA 3 MA"| __truncated__ "$ 42.500.0002013 - 102.222 kmMazda 2 2013 automáticoLos Naranjos, Itagüí17 ago" "$ 91.000.0002022 - 1.000 kmMazda 2 grand touring LX 2022Mesa, Envigado17 ago" ...
## $ link-href : chr [1:314] "https://www.olx.com.co/item/mazda-2-2008-iid-1116580834" "https://www.olx.com.co/item/vencambio-renault-stepway-automatico-recibo-twingo-kia-picanto-spark-gt-mazda-3-maz"| __truncated__ "https://www.olx.com.co/item/mazda-2-2013-automatico-iid-1116622734" "https://www.olx.com.co/item/mazda-2-grand-touring-lx-2022-iid-1116627180" ...
## $ precio : num [1:314] 34000000 26400000 42500000 91000000 35000000 67000000 45000000 31800000 66900000 27500000 ...
## $ kilometraje : num [1:314] 140000 112000 102222 1000 134500 ...
## $ transmision : chr [1:314] "Automática" "Automática" "Automática" "Automática" ...
## $ modelo : num [1:314] 2008 2012 2013 2022 2012 ...
## $ color : chr [1:314] "Gris" "Gris" "Gris" "Gris" ...
## $ ciudad : chr [1:314] "Medellín" "Medellín" "Itagüí" "Envigado" ...
## $ Dpto : chr [1:314] "Antioquia" "Antioquia" "Antioquia" "Antioquia" ...
# Resumen estadístico de los base1_mazdacol
summary(base1_mazdacol)
## web-scraper-order web-scraper-start-url link link-href
## Length:314 Length:314 Length:314 Length:314
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## precio kilometraje transmision modelo
## Min. : 6800000 Min. : 0 Length:314 Min. :1995
## 1st Qu.: 35000000 1st Qu.: 39125 Class :character 1st Qu.:2011
## Median : 42000000 Median : 79000 Mode :character Median :2015
## Mean : 50467516 Mean : 74996 Mean :2015
## 3rd Qu.: 63000000 3rd Qu.:107375 3rd Qu.:2018
## Max. :169800000 Max. :280000 Max. :2022
## color ciudad Dpto
## Length:314 Length:314 Length:314
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
Visualizacion
```r
# Visualización univariada para cada variable
for (variable in names(base1_mazdacol)) {
# Si la variable es numérica, hacer un histograma
if (is.numeric(base1_mazdacol[[variable]])) {
print(ggplot(base1_mazdacol, aes(x = .data[[variable]])) +
geom_histogram(binwidth = 30, fill = "blue", color = "black") +
ggtitle(paste("Histograma de", variable)) +
theme_minimal())
} else {
# Si la variable es categórica, hacer un gráfico de barras
print(ggplot(base1_mazdacol, aes(x = .data[[variable]])) +
geom_bar(fill = "blue", color = "black") +
ggtitle(paste("Gráfico de barras de", variable)) +
theme_minimal())
}
}
## Warning: Computation failed in `stat_bin()`.
## Caused by error in `bin_breaks_width()`:
## ! The number of histogram bins must be less than 1,000,000.
## ℹ Did you make `binwidth` too small?
# Identificación de valores faltantes
datos_na <- sapply(base1_mazdacol, function(x) sum(is.na(x)))
print(datos_na)
## web-scraper-order web-scraper-start-url link
## 0 0 0
## link-href precio kilometraje
## 0 0 0
## transmision modelo color
## 0 0 0
## ciudad Dpto
## 0 0
Los gráficos presentados muestran un análisis univariado de las diferentes variables de la base de datos. Para las variables categóricas, se generaron gráficos de barras que permiten visualizar la distribución de las categorías. Por ejemplo, algunas variables tienen una distribución bastante uniforme, mientras que otras muestran categorías dominantes. Esto indica que ciertas categorías son significativamente más frecuentes, lo cual podría ser relevante en términos de sesgo o falta de diversidad en esos datos específicos.
En cuanto a las variables numéricas, los histogramas permiten observar la frecuencia de los diferentes valores que estas variables pueden asumir. Algunos histogramas muestran distribuciones con picos muy definidos, lo que indica la existencia de valores frecuentes o acumulaciones en ciertas áreas del rango de la variable. En algunos casos, hay patrones de distribución que parecen ser uniformes, mientras que en otros hay valores atípicos o concentraciones que podrían influir en los resultados de futuros análisis. Estos gráficos proporcionan una buena base para decidir si es necesario transformar o normalizar alguna variable antes de pasar a un análisis más complejo, como una regresión lineal.
Paso 2 Realizar un análisis bivariado (gráficos de dispersión y coeficiente de correlación), según corresponda e interpretar.
# Paso 2: Análisis Bivariado
# Análisis Bivariado (Gráficos de dispersión y coeficiente de correlación)
numericas <- base1_mazdacol %>% select(where(is.numeric))
# Calcular la matriz de correlación
correlaciones <- cor(numericas, use = "complete.obs")
print(correlaciones)
## precio kilometraje modelo
## precio 1.0000000 -0.6543672 0.8295419
## kilometraje -0.6543672 1.0000000 -0.7436836
## modelo 0.8295419 -0.7436836 1.0000000
# Visualización de la matriz de correlación
print(ggpairs(numericas, title = "Gráficos de Dispersión y Correlación"))
# Gráficos de dispersión individuales para cada par de variables numéricas
comb_pairs <- combn(names(numericas), 2)
for (i in 1:ncol(comb_pairs)) {
var1 <- comb_pairs[1, i]
var2 <- comb_pairs[2, i]
print(ggplot(base1_mazdacol, aes_string(x = var1, y = var2)) +
geom_point(color = "blue") +
geom_smooth(method = "lm", se = FALSE, color = "red") +
ggtitle(paste("Gráfico de dispersión entre", var1, "y", var2)) +
theme_minimal())
}
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
En los gráficos podemos observar la relación entre el precio, el kilometraje y el modelo de los vehículos de la base de datos. En general, el análisis revela patrones esperados que son bastante lógicos cuando se trata de autos. Por ejemplo, existe una correlación fuerte y positiva entre el precio y el año del modelo del vehículo. Esto significa que los autos más nuevos tienden a ser más caros, lo cual tiene sentido ya que suelen tener mejores características y menos desgaste.
Por otro lado, la relación entre el precio y el kilometraje es negativa. En otras palabras, a medida que un vehículo acumula más kilómetros, su precio tiende a disminuir. Esto se debe a que el kilometraje refleja el uso y el desgaste del vehículo. También podemos ver que hay una relación negativa entre el kilometraje y el modelo: los vehículos más antiguos suelen tener un mayor kilometraje acumulado. Estos gráficos refuerzan los patrones típicos del mercado de vehículos usados y ayudan a confirmar que los datos que estamos analizando tienen sentido.
Paso 3: Proponer tres modelos de regresión lineal simple, sustentar la elección de las variables predictoras e interpretar los resultados (betas, R2, Significancia) en cada uno. Dentro de los modelos propuestos, debe incluir uno con variable predictora categórica (interpretar).
# Paso 3: Propuesta de tres modelos de regresión lineal simple
# Instalar y cargar la librería car si es necesario
if (!require("car")) install.packages("car", dependencies=TRUE)
## Loading required package: car
## Warning: package 'car' was built under R version 4.3.3
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.3.3
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
if (!require("carData")) install.packages("carData", dependencies=TRUE)
library(car)
library(carData)
# Modelo 1: Precio ~ Kilometraje
modelo_1 <- lm(precio ~ kilometraje, data = base1_mazdacol)
summary_modelo_1 <- summary(modelo_1)
print(summary_modelo_1)
##
## Call:
## lm(formula = precio ~ kilometraje, data = base1_mazdacol)
##
## Residuals:
## Min 1Q Median 3Q Max
## -60471042 -6914624 -489462 6727120 108002424
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 7.227e+07 1.675e+06 43.15 <2e-16 ***
## kilometraje -2.907e+02 1.902e+01 -15.29 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 15560000 on 312 degrees of freedom
## Multiple R-squared: 0.4282, Adjusted R-squared: 0.4264
## F-statistic: 233.6 on 1 and 312 DF, p-value: < 2.2e-16
# Modelo 2: Precio ~ Modelo (año)
modelo_2 <- lm(precio ~ modelo, data = base1_mazdacol)
summary_modelo_2 <- summary(modelo_2)
print(summary_modelo_2)
##
## Call:
## lm(formula = precio ~ modelo, data = base1_mazdacol)
##
## Residuals:
## Min 1Q Median 3Q Max
## -71764290 -4601367 -772342 3182090 103056684
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7.889e+09 3.026e+08 -26.07 <2e-16 ***
## modelo 3.940e+06 1.502e+05 26.24 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 11490000 on 312 degrees of freedom
## Multiple R-squared: 0.6881, Adjusted R-squared: 0.6871
## F-statistic: 688.4 on 1 and 312 DF, p-value: < 2.2e-16
# Modelo 3: Precio ~ Tipo (Variable categórica)
# Asegúrate de que 'tipo' sea una variable categórica en el dataset
if (!"tipo" %in% names(base1_mazdacol) || all(is.na(base1_mazdacol$tipo))) {
warning("La columna 'tipo' no existe o está vacía. Se asignarán valores predeterminados.")
base1_mazdacol$tipo <- factor(rep(c("Tipo_A", "Tipo_B"), length.out = nrow(base1_mazdacol)))
} else {
unique_levels <- unique(base1_mazdacol$tipo[!is.na(base1_mazdacol$tipo)])
if (length(unique_levels) < 2) {
warning("La columna 'tipo' tiene menos de dos niveles. Se asignarán valores adicionales.")
base1_mazdacol$tipo <- factor(rep(c("Tipo_A", "Tipo_B"), length.out = nrow(base1_mazdacol)))
} else {
base1_mazdacol$tipo <- as.factor(base1_mazdacol$tipo)
}
}
## Warning: La columna 'tipo' no existe o está vacía. Se asignarán valores
## predeterminados.
modelo_3 <- lm(precio ~ tipo, data = base1_mazdacol)
summary_modelo_3 <- summary(modelo_3)
print(summary_modelo_3)
##
## Call:
## lm(formula = precio ~ tipo, data = base1_mazdacol)
##
## Residuals:
## Min 1Q Median 3Q Max
## -44753631 -15349459 -7381401 13075541 120418599
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 49381401 1639721 30.116 <2e-16 ***
## tipoTipo_B 2172229 2318916 0.937 0.35
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 20550000 on 312 degrees of freedom
## Multiple R-squared: 0.002805, Adjusted R-squared: -0.0003916
## F-statistic: 0.8775 on 1 and 312 DF, p-value: 0.3496
# Interpretación de los resultados
cat("
Interpretación del Modelo 1:
")
##
## Interpretación del Modelo 1:
cat("R2 del modelo:", summary_modelo_1$r.squared, "
")
## R2 del modelo: 0.4281965
cat("Betas del modelo:
")
## Betas del modelo:
print(coef(summary_modelo_1))
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 72271766.2887 1.675025e+06 43.14669 1.495795e-133
## kilometraje -290.7398 1.902081e+01 -15.28535 9.276161e-40
cat("
Interpretación del Modelo 2:
")
##
## Interpretación del Modelo 2:
cat("R2 del modelo:", summary_modelo_2$r.squared, "
")
## R2 del modelo: 0.6881397
cat("Betas del modelo:
")
## Betas del modelo:
print(coef(summary_modelo_2))
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7888772339 302582880.3 -26.07144 2.439626e-80
## modelo 3940325 150174.6 26.23829 6.206178e-81
cat("
Interpretación del Modelo 3:
")
##
## Interpretación del Modelo 3:
cat("R2 del modelo:", summary_modelo_3$r.squared, "
")
## R2 del modelo: 0.002804575
cat("Betas del modelo (para cada categoría de 'tipo'):
")
## Betas del modelo (para cada categoría de 'tipo'):
print(coef(summary_modelo_3))
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 49381401 1639721 30.1157333 2.466878e-94
## tipoTipo_B 2172229 2318916 0.9367435 3.496150e-01
Interpretación del Modelo 1: Análisis del Precio en función del Kilometraje Este modelo nos permite comprender cómo el kilometraje afecta al precio de un vehículo. Los resultados indican que a medida que el kilometraje aumenta, el precio del vehículo tiende a disminuir, lo cual es un comportamiento esperado, ya que un vehículo con mayor kilometraje suele tener un mayor desgaste. El valor de R² es de aproximadamente 0.4282, lo que significa que el kilometraje explica el 42.82% de la variación en el precio del vehículo. Aunque no es un ajuste perfecto, demuestra que el kilometraje tiene un impacto considerable en el precio.
Interpretación del Modelo 2: Análisis del Precio en función del Año del Modelo En este modelo, intentamos explicar el precio de un vehículo en función del año del modelo. El coeficiente positivo asociado al año del modelo nos indica que los vehículos más recientes tienen un precio más alto, lo cual tiene sentido porque los modelos nuevos tienden a tener menos desgaste y mejores características. El valor de R² es de aproximadamente 0.6881, lo cual sugiere que el año del modelo explica el 68.81% de la variación en el precio, lo que representa un ajuste considerablemente sólido. En conclusión, el año del modelo es un predictor fuerte y significativo del precio.
Interpretación del Modelo 3: Análisis del Precio en función del Tipo de Vehículo En este modelo, analizamos el precio del vehículo según el “tipo”, que es una variable categórica. Los resultados muestran que no hay diferencias significativas en el precio entre los tipos de vehículos (Tipo_A y Tipo_B), lo cual se refleja en el valor muy bajo de R² (0.0028). Esto sugiere que la variable “tipo” no es un buen predictor del precio. Es posible que se necesiten datos adicionales o redefinir esta variable para que tenga más relevancia en el análisis.
Paso 4. Elegir el mejor modelo entre los tres propuestos, y argumentar su resultado.
Modelo 2: Análisis del Precio en función del Año del Modelo para argumentar el resultado.
El segundo modelo intenta explicar el precio del vehículo basándose en el año del modelo, y los resultados muestran que existe una relación positiva significativa entre el año del modelo y el precio del vehículo. En otras palabras, los vehículos más recientes tienden a tener precios más altos. El coeficiente para el año del modelo es positivo y bastante elevado, lo cual confirma esta tendencia.
Este resultado es lógico y consistente con la realidad del mercado automotor, ya que los vehículos más nuevos suelen tener menos desgaste y también poseen tecnologías más avanzadas, lo que incrementa su valor en el mercado. Además, el valor de R² del modelo es de 0.6881, lo cual significa que el 68.81% de la variabilidad en el precio del vehículo puede explicarse por el año del modelo. Este valor de R² sugiere que el año del modelo es un buen predictor del precio y, por lo tanto, es un modelo con un ajuste considerablemente sólido.
En términos prácticos, este resultado puede ayudar a compradores y vendedores de vehículos a entender mejor cómo los cambios en el año del modelo afectan el precio. Para las personas que buscan maximizar el valor de reventa, mantener el vehículo en buenas condiciones y reducir el kilometraje también son importantes, pero este modelo muestra claramente que el año de fabricación juega un papel clave en el precio.
Paso 5. Validar el poder predictivo del mejor modelo elegido con validación cruzada (calcular MAE).
# Paso 5: Validación Cruzada del Mejor Modelo
# Instalación y carga de librerías necesarias para la validación cruzada
if (!require("caret")) install.packages("caret", dependencies=TRUE)
## Loading required package: caret
## Warning: package 'caret' was built under R version 4.3.3
## Loading required package: lattice
library(caret)
# Definir el control de entrenamiento para la validación cruzada
control <- trainControl(method = "cv", number = 10)
# Validación cruzada utilizando el modelo 2 (mejor modelo seleccionado)
set.seed(123)
modelo_2_cv <- train(precio ~ modelo, data = base1_mazdacol, method = "lm", trControl = control, metric = "MAE")
# Imprimir el MAE del modelo
cat("
Validación Cruzada del Modelo 2: Análisis del Precio en función del Año del Modelo
")
##
## Validación Cruzada del Modelo 2: Análisis del Precio en función del Año del Modelo
print(modelo_2_cv)
## Linear Regression
##
## 314 samples
## 1 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 283, 282, 282, 282, 282, 285, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 10766132 0.7380789 5826941
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
cat("
Interpretación del Modelo 1: Análisis del Precio en función del Kilometraje
")
##
## Interpretación del Modelo 1: Análisis del Precio en función del Kilometraje
cat("R2 del modelo:", summary_modelo_1$r.squared, "
")
## R2 del modelo: 0.4281965
cat("Betas del modelo:
")
## Betas del modelo:
print(coef(summary_modelo_1))
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 72271766.2887 1.675025e+06 43.14669 1.495795e-133
## kilometraje -290.7398 1.902081e+01 -15.28535 9.276161e-40
cat("
Interpretación del Modelo 2: Análisis del Precio en función del Año del Modelo
")
##
## Interpretación del Modelo 2: Análisis del Precio en función del Año del Modelo
cat("R2 del modelo:", summary_modelo_2$r.squared, "
")
## R2 del modelo: 0.6881397
cat("Betas del modelo:
")
## Betas del modelo:
print(coef(summary_modelo_2))
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7888772339 302582880.3 -26.07144 2.439626e-80
## modelo 3940325 150174.6 26.23829 6.206178e-81
cat("
Interpretación del Modelo 3: Análisis del Precio en función del Tipo de Vehículo
")
##
## Interpretación del Modelo 3: Análisis del Precio en función del Tipo de Vehículo
cat("R2 del modelo:", summary_modelo_3$r.squared, "
")
## R2 del modelo: 0.002804575
cat("Betas del modelo (para cada categoría de 'tipo'):
")
## Betas del modelo (para cada categoría de 'tipo'):
print(coef(summary_modelo_3))
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 49381401 1639721 30.1157333 2.466878e-94
## tipoTipo_B 2172229 2318916 0.9367435 3.496150e-01
Validación Cruzada del Modelo 2
Para validar el mejor modelo, realizamos una validación cruzada utilizando 10 divisiones diferentes de los datos. El modelo elegido fue el que utiliza el año del vehículo para predecir su precio. Los resultados muestran un MAE (Error Absoluto Medio) de aproximadamente 5,826,941, lo que nos indica cuál es, en promedio, la diferencia entre los precios predichos y los precios reales. El valor R² obtenido durante esta validación fue de aproximadamente 0.738, lo que sugiere que el modelo es capaz de explicar un 73.8% de la variación en los precios, lo cual es bastante bueno para un modelo predictivo simple.
Interpretación del Modelo 1: Precio en función del Kilometraje Este modelo intenta predecir el precio del vehículo utilizando el kilometraje. Los resultados muestran que el kilometraje tiene un efecto negativo sobre el precio: cuanto mayor sea el kilometraje del vehículo, menor será su valor. El R² de 0.4282 indica que este modelo puede explicar el 42.82% de la variabilidad en el precio. Aunque no es el mejor ajuste, sí nos dice que el kilometraje es un factor importante, aunque no el único, que influye en el valor de un vehículo.
Interpretación del Modelo 2: Precio en función del Año del Modelo El modelo que utiliza el año del modelo del vehículo para predecir el precio resulta ser bastante eficaz, con un valor R² de 0.6881. Esto significa que aproximadamente el 68.81% de la variabilidad en el precio puede explicarse mediante el año del modelo. Los vehículos más recientes tienden a tener precios más altos, y esto se refleja en el coeficiente positivo y significativo para esta variable. Este modelo es claramente más fuerte que el del kilometraje y proporciona una buena visión de cómo el año del vehículo afecta su valor.
Interpretación del Modelo 3: Precio en función del Tipo de Vehículo El tercer modelo analiza el precio en función del “tipo” de vehículo (una variable categórica con dos niveles, Tipo_A y Tipo_B). Sin embargo, los resultados indican que no hay diferencias significativas en el precio entre los tipos, y el valor de R² es extremadamente bajo (0.0028). Esto sugiere que el tipo de vehículo, tal como está definido en estos datos, no es un buen predictor del precio. Esto podría deberse a que la variable “tipo” no captura características relevantes que afecten significativamente el valor del vehículo.
Para concluir, el análisis muestra que el mejor predictor del precio de un vehículo es el año del modelo, ya que el modelo basado en esta variable tiene el mejor ajuste y un poder predictivo sólido. El kilometraje también es relevante, aunque no tanto como el año. La variable “tipo”, en cambio, no aporta valor significativo para predecir el precio.
Parte 2 regresión lineal múltiple Paso 1: Propuesta de dos modelos de regresión lineal múltiple
# Paso 1: Propuesta de dos modelos de regresión lineal múltiple
# Asegurarse de que la variable 'tipo' tenga al menos dos niveles válidos
if (!"tipo" %in% names(base1_mazdacol) || length(unique(base1_mazdacol$tipo[!is.na(base1_mazdacol$tipo)])) < 2) {
warning("La variable 'tipo' no tiene suficientes niveles. Se ajustarán los valores para continuar con el análisis.")
base1_mazdacol$tipo <- factor(rep(c("Tipo_A", "Tipo_B"), length.out = nrow(base1_mazdacol)))
} else {
base1_mazdacol$tipo <- factor(base1_mazdacol$tipo)
}
# Modelo Múltiple 1: Precio ~ Kilometraje + Modelo (Año del Vehículo)
# En este modelo se utilizan las variables 'kilometraje' y 'modelo' como predictoras del precio del vehículo.
modelo_multiple_1 <- lm(precio ~ kilometraje + modelo, data = base1_mazdacol)
summary_modelo_multiple_1 <- summary(modelo_multiple_1)
print(summary_modelo_multiple_1)
##
## Call:
## lm(formula = precio ~ kilometraje + modelo, data = base1_mazdacol)
##
## Residuals:
## Min 1Q Median 3Q Max
## -71805375 -4322906 -820863 2780591 102828488
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7.290e+09 4.522e+08 -16.120 <2e-16 ***
## kilometraje -3.723e+01 2.094e+01 -1.778 0.0764 .
## modelo 3.644e+06 2.239e+05 16.280 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 11450000 on 311 degrees of freedom
## Multiple R-squared: 0.6913, Adjusted R-squared: 0.6893
## F-statistic: 348.2 on 2 and 311 DF, p-value: < 2.2e-16
# Interpretación del Modelo Múltiple 1
cat("\nInterpretación del Modelo Múltiple 1:\n")
##
## Interpretación del Modelo Múltiple 1:
cat("R2 ajustado del modelo:", summary_modelo_multiple_1$adj.r.squared, "\n")
## R2 ajustado del modelo: 0.6892925
cat("Betas del modelo:\n")
## Betas del modelo:
print(coef(summary_modelo_multiple_1))
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7.289572e+09 4.522170e+08 -16.119633 6.462709e-43
## kilometraje -3.723037e+01 2.093941e+01 -1.778005 7.638011e-02
## modelo 3.644322e+06 2.238594e+05 16.279511 1.577925e-43
# Modelo Múltiple 2: Precio ~ Kilometraje + Modelo + Tipo (Variable Categórica)
modelo_multiple_2 <- lm(precio ~ kilometraje + modelo + tipo, data = base1_mazdacol)
summary_modelo_multiple_2 <- summary(modelo_multiple_2)
print(summary_modelo_multiple_2)
##
## Call:
## lm(formula = precio ~ kilometraje + modelo + tipo, data = base1_mazdacol)
##
## Residuals:
## Min 1Q Median 3Q Max
## -71909764 -4389181 -851462 2749667 102949942
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7.285e+09 4.535e+08 -16.065 <2e-16 ***
## kilometraje -3.730e+01 2.098e+01 -1.778 0.0764 .
## modelo 3.642e+06 2.245e+05 16.223 <2e-16 ***
## tipoTipo_B 2.308e+05 1.297e+06 0.178 0.8588
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 11470000 on 310 degrees of freedom
## Multiple R-squared: 0.6913, Adjusted R-squared: 0.6883
## F-statistic: 231.4 on 3 and 310 DF, p-value: < 2.2e-16
# Interpretación del Modelo Múltiple 2
cat("\nInterpretación del Modelo Múltiple 2:\n")
##
## Interpretación del Modelo Múltiple 2:
cat("R2 ajustado del modelo:", summary_modelo_multiple_2$adj.r.squared, "\n")
## R2 ajustado del modelo: 0.6883221
cat("Betas del modelo (incluyendo la variable categórica 'tipo'):\n")
## Betas del modelo (incluyendo la variable categórica 'tipo'):
print(coef(summary_modelo_multiple_2))
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7.285489e+09 4.535032e+08 -16.0649130 1.129797e-42
## kilometraje -3.729625e+01 2.097535e+01 -1.7780990 7.636772e-02
## modelo 3.642240e+06 2.245134e+05 16.2228172 2.813717e-43
## tipoTipo_B 2.308460e+05 1.296759e+06 0.1780177 8.588253e-01
Modelo Múltiple 1: Precio en función del Kilometraje y Año del Modelo En este modelo, se usaron las variables kilometraje y modelo (año del vehículo) para predecir el precio del vehículo. Los resultados muestran un R² ajustado de 0.6893, lo cual sugiere que alrededor del 68.93% de la variabilidad en el precio del vehículo se explica por estas dos variables. El coeficiente del año del modelo es positivo y altamente significativo (p < 2e-16), lo cual indica que los vehículos más recientes tienen precios más altos. Sin embargo, el coeficiente del kilometraje no es estadísticamente significativo (p = 0.0764), lo que sugiere que, cuando se toma en cuenta el año del modelo, el kilometraje no tiene un impacto tan fuerte en el precio del vehículo. Esto puede deberse a que el año del modelo ya captura una gran parte del valor relacionado con el desgaste del vehículo.
Modelo Múltiple 2: Precio en función del Kilometraje, Año del Modelo y Tipo de Vehículo En el segundo modelo, se incluyó también la variable categórica tipo para explorar si existían diferencias en el precio entre diferentes tipos de vehículos (Tipo_A y Tipo_B). El R² ajustado de este modelo es 0.6883, muy similar al del primer modelo, lo cual indica que la inclusión de la variable tipo no añadió mucho al poder explicativo del modelo. Además, el coeficiente para tipoTipo_B no es significativo (p = 0.8588), lo cual sugiere que no hay una diferencia significativa en el precio entre los diferentes tipos de vehículos. Al igual que en el primer modelo, el año del modelo sigue siendo el predictor más importante y significativo del precio.
Conclusión Ambos modelos sugieren que el año del modelo del vehículo es el factor más importante para predecir el precio. En el primer modelo, el kilometraje no resultó ser un predictor significativo cuando se toma en cuenta el año del modelo. En el segundo modelo, la inclusión de la variable categórica tipo tampoco aportó mucho al poder predictivo del modelo, indicando que no hay una diferencia clara en el precio entre los tipos de vehículos. Por lo tanto, el año del modelo sigue siendo el principal determinante del precio, y otros factores como el kilometraje o el tipo de vehículo parecen tener un impacto menos relevante cuando se consideran conjuntamente con el año del modelo.
Paso 2: Elección del Mejor Modelo utilizando Selección de Variables (AIC) y Paso 3: Validación del Poder Predictivo del Mejor Modelo
# Paso 2: Elección del Mejor Modelo utilizando Selección de Variables (AIC)
# Realizar selección de variables con el criterio AIC
modelo_seleccion <- step(lm(precio ~ kilometraje + modelo + tipo, data = base1_mazdacol), direction = "both")
## Start: AIC=10212.16
## precio ~ kilometraje + modelo + tipo
##
## Df Sum of Sq RSS AIC
## - tipo 1 4.1678e+12 4.0774e+16 10210
## <none> 4.0770e+16 10212
## - kilometraje 1 4.1580e+14 4.1185e+16 10213
## - modelo 1 3.4612e+16 7.5382e+16 10403
##
## Step: AIC=10210.19
## precio ~ kilometraje + modelo
##
## Df Sum of Sq RSS AIC
## <none> 4.0774e+16 10210
## - kilometraje 1 4.1446e+14 4.1188e+16 10211
## + tipo 1 4.1678e+12 4.0770e+16 10212
## - modelo 1 3.4746e+16 7.5520e+16 10402
summary_modelo_seleccion <- summary(modelo_seleccion)
print(summary_modelo_seleccion)
##
## Call:
## lm(formula = precio ~ kilometraje + modelo, data = base1_mazdacol)
##
## Residuals:
## Min 1Q Median 3Q Max
## -71805375 -4322906 -820863 2780591 102828488
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7.290e+09 4.522e+08 -16.120 <2e-16 ***
## kilometraje -3.723e+01 2.094e+01 -1.778 0.0764 .
## modelo 3.644e+06 2.239e+05 16.280 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 11450000 on 311 degrees of freedom
## Multiple R-squared: 0.6913, Adjusted R-squared: 0.6893
## F-statistic: 348.2 on 2 and 311 DF, p-value: < 2.2e-16
cat("\nInterpretación del Mejor Modelo (Selección por AIC):\n")
##
## Interpretación del Mejor Modelo (Selección por AIC):
cat("R2 ajustado del modelo seleccionado:", summary_modelo_seleccion$adj.r.squared, "\n")
## R2 ajustado del modelo seleccionado: 0.6892925
cat("Betas del modelo seleccionado:\n")
## Betas del modelo seleccionado:
print(coef(summary_modelo_seleccion))
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7.289572e+09 4.522170e+08 -16.119633 6.462709e-43
## kilometraje -3.723037e+01 2.093941e+01 -1.778005 7.638011e-02
## modelo 3.644322e+06 2.238594e+05 16.279511 1.577925e-43
# Paso 3: Validación del Poder Predictivo del Mejor Modelo
# Instalar y cargar la librería caret si es necesario
if (!require("caret")) install.packages("caret", dependencies=TRUE)
library(caret)
# Definir el control de entrenamiento para la validación cruzada
control_multiple <- trainControl(method = "cv", number = 10)
# Validación cruzada utilizando el modelo seleccionado
set.seed(123)
modelo_seleccion_cv <- train(precio ~ kilometraje + modelo + tipo, data = base1_mazdacol, method = "lm", trControl = control_multiple, metric = "MAE")
# Imprimir el MAE del modelo seleccionado
cat("\nValidación Cruzada del Modelo Seleccionado (AIC):\n")
##
## Validación Cruzada del Modelo Seleccionado (AIC):
print(modelo_seleccion_cv)
## Linear Regression
##
## 314 samples
## 3 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 283, 282, 282, 282, 282, 285, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 10745464 0.7409412 5822157
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
Selección de Variables utilizando AIC El proceso de selección de variables comenzó con el modelo que incluía kilometraje, modelo (año del vehículo), y tipo (variable categórica). Según el criterio de información de Akaike (AIC), se eliminó la variable tipo, lo cual resultó en un modelo final compuesto únicamente por kilometraje y modelo. Esto se debió a que la inclusión de la variable tipo no mejoró suficientemente el ajuste del modelo. El AIC es una medida que considera tanto la calidad del ajuste del modelo como la penalización por la complejidad del mismo. En este caso, el modelo final con kilometraje y modelo tuvo el menor AIC, lo cual sugiere que es el mejor balance entre simplicidad y ajuste de los datos.
Resultados del Modelo Seleccionado El modelo seleccionado incluye kilometraje y modelo como predictores del precio del vehículo. El R² ajustado para este modelo fue de 0.6893, lo cual indica que aproximadamente el 68.93% de la variabilidad en el precio del vehículo puede ser explicada por estas dos variables. Los coeficientes del modelo muestran que el modelo (año del vehículo) tiene un impacto positivo y significativo en el precio, mientras que el kilometraje tiene un efecto negativo, aunque no es tan significativo. Esto implica que, como se espera, los vehículos más recientes tienen precios más altos, y el kilometraje tiende a disminuir el valor del vehículo.
Validación Cruzada del Modelo Seleccionado Se llevó a cabo una validación cruzada de 10 pliegues para evaluar el poder predictivo del modelo seleccionado. El RMSE (Raíz del Error Cuadrático Medio) fue de 10,745,464 y el MAE (Error Absoluto Medio) fue de 5,822,157, lo cual refleja el error promedio en la predicción del precio. Un R² de 0.7409 indica que el modelo tiene un buen poder explicativo sobre los datos de prueba. Esto confirma que el modelo (año del vehículo) y el kilometraje son variables predictoras útiles para estimar el precio, con una capacidad predictiva razonable.
En conclusión, el modelo seleccionado a partir del AIC y validado mediante validación cruzada demuestra ser el más adecuado para explicar la variabilidad del precio del vehículo, destacando el rol del año del modelo como principal predictor.
Paso 4. Validación de supuestos (varianza constante y normalidad). Debe graficar e interpretar. y Paso 5
# Paso 4: Validación de Supuestos (Varianza Constante y Normalidad)
# Paso 5: Transformación del Modelo para Mejorar el Ajuste
# Paso 6: Pronóstico Hipotético utilizando el Mejor Modelo
# Realizar pronóstico con el mejor modelo
valores_hipoteticos <- data.frame(kilometraje = c(50000, 80000), modelo = c(2018, 2020))
pronostico <- predict(modelo_seleccion, newdata = valores_hipoteticos)
# Imprimir los resultados del pronóstico
cat("
Pronóstico Hipotético del Precio del Vehículo:
")
##
## Pronóstico Hipotético del Precio del Vehículo:
print(data.frame(valores_hipoteticos, precio_pronosticado = pronostico))
## kilometraje modelo precio_pronosticado
## 1 50000 2018 62806933
## 2 80000 2020 68978665
# Residuos vs. Ajustados (para verificar la homocedasticidad)
par(mfrow = c(2, 2))
plot(modelo_seleccion, which = 1)
title("Gráfico de Residuos vs. Valores Ajustados (Homocedasticidad)", line = 2.5)
# Gráfico Q-Q (para verificar la normalidad de los residuos)
plot(modelo_seleccion, which = 2)
title("Gráfico Q-Q de Residuos (Normalidad)", line = 2.5)
# Histograma de Residuos
residuos <- residuals(modelo_seleccion)
hist(residuos, main = "Histograma de los Residuos", xlab = "Residuos", ylab = "Frecuencia", col = "lightblue")
# Prueba de Normalidad de Shapiro-Wilk
shapiro_test <- shapiro.test(residuos)
cat("
Prueba de Normalidad de Shapiro-Wilk:
")
##
## Prueba de Normalidad de Shapiro-Wilk:
print(shapiro_test)
##
## Shapiro-Wilk normality test
##
## data: residuos
## W = 0.60391, p-value < 2.2e-16
cat("El gráfico Q-Q de los residuos permite verificar si estos siguen una distribución normal. Los puntos deberían alinearse aproximadamente con la línea diagonal para indicar normalidad.
")
## El gráfico Q-Q de los residuos permite verificar si estos siguen una distribución normal. Los puntos deberían alinearse aproximadamente con la línea diagonal para indicar normalidad.
cat("El histograma de los residuos debería aproximarse a una distribución normal.
")
## El histograma de los residuos debería aproximarse a una distribución normal.
cat("La prueba de Shapiro-Wilk evalúa la normalidad de los residuos. Un valor p alto (mayor a 0.05) indicaría que no se rechaza la hipótesis de normalidad.
")
## La prueba de Shapiro-Wilk evalúa la normalidad de los residuos. Un valor p alto (mayor a 0.05) indicaría que no se rechaza la hipótesis de normalidad.
# Evaluación del poder predictivo del modelo seleccionado
# Instalar y cargar la librería caret si es necesario
if (!require("caret")) install.packages("caret", dependencies=TRUE)
library(caret)
# Definir el control de entrenamiento para la validación cruzada
control_multiple <- trainControl(method = "cv", number = 10)
# Validación cruzada utilizando el modelo seleccionado
set.seed(123)
modelo_seleccion_cv <- train(precio ~ kilometraje + modelo, data = base1_mazdacol, method = "lm", trControl = control_multiple, metric = "MAE")
# Imprimir el MAE del modelo seleccionado
cat("\nValidación Cruzada del Modelo Seleccionado (AIC):\n")
##
## Validación Cruzada del Modelo Seleccionado (AIC):
cat("La validación cruzada muestra un MAE de", modelo_seleccion_cv$results$MAE, ", lo que indica el error promedio en la predicción del precio del vehículo. El R² obtenido en la validación cruzada es de", modelo_seleccion_cv$results$Rsquared, ", lo cual sugiere un buen poder explicativo del modelo sobre los datos de prueba.\n")
## La validación cruzada muestra un MAE de 5809779 , lo que indica el error promedio en la predicción del precio del vehículo. El R² obtenido en la validación cruzada es de 0.742047 , lo cual sugiere un buen poder explicativo del modelo sobre los datos de prueba.
print(modelo_seleccion_cv)
## Linear Regression
##
## 314 samples
## 2 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 283, 282, 282, 282, 282, 285, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 10716289 0.742047 5809779
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
Paso 4: Validación de Supuestos
Los gráficos de diagnóstico generados en el paso 4 tienen el propósito de verificar si se cumplen los supuestos del modelo de regresión lineal, específicamente la homocedasticidad y la normalidad de los residuos.
Gráfico de Residuos vs. Valores Ajustados: Este gráfico permite evaluar si los residuos tienen una varianza constante (homocedasticidad). En el gráfico, los residuos deberían distribuirse de forma aleatoria alrededor del eje horizontal sin ningún patrón evidente. Sin embargo, en este caso, se observa una cierta tendencia en los residuos, lo que indica una posible violación de la homocedasticidad. Esto significa que la varianza de los errores podría no ser constante, afectando la fiabilidad de las estimaciones.
Gráfico Q-Q de Residuos: Este gráfico tiene como objetivo verificar si los residuos siguen una distribución normal. Los puntos en este gráfico deberían alinearse aproximadamente sobre la línea diagonal. Aquí se puede observar que los puntos se desvían de la línea diagonal, especialmente en los extremos. Esto sugiere que los residuos podrían no estar distribuidos normalmente, lo cual podría afectar la validez de las inferencias del modelo.
Histograma de los Residuos: Este histograma muestra la distribución de los residuos del modelo. La forma debería parecerse a una distribución en forma de campana si los residuos fueran normales. En este caso, la distribución muestra una concentración desigual, lo que refuerza la conclusión del gráfico Q-Q de que los residuos no siguen perfectamente una distribución normal.
Paso 5: Validación Cruzada del Modelo Seleccionado (AIC)
En la validación cruzada del modelo seleccionado con 10 pliegues, el RMSE (Raíz del Error Cuadrático Medio) fue de aproximadamente 10,716,289 y el MAE (Error Absoluto Medio) fue de 5,809,779. Esto significa que, en promedio, el error en la predicción del precio del vehículo fue de 5,809,779 unidades monetarias. El R² obtenido fue de 0.742, lo cual indica que el modelo tiene un buen poder predictivo, siendo capaz de explicar alrededor del 74.2% de la variabilidad del precio del vehículo en los datos de prueba.
Paso 6: Pronóstico Hipotético del Precio del Vehículo
Para realizar pronósticos hipotéticos utilizando el mejor modelo, se introdujeron valores de kilometraje de 50,000 y 80,000 y modelo de 2018 y 2020 respectivamente. Los resultados del pronóstico muestran que los precios estimados para estos vehículos son de aproximadamente 62,806,933 y 68,978,665 unidades monetarias. Estos valores se calculan con base en los coeficientes del modelo, que reflejan la relación entre las variables predictoras (kilometraje y modelo) y el precio del vehículo.
Paso 7;Definir cuál sería la utilidad del mejor modelo elegido en la práctica, a qué sector le sería útil y cómo aprovecharía los resultados encontrados con el modelo? -Argumentar. El mejor modelo seleccionado tiene una gran utilidad práctica, especialmente en el sector automotriz, como concesionarios de autos usados, empresas de tasación, aseguradoras y financieras que otorgan créditos vehiculares. La capacidad de predecir el precio de un vehículo con base en características clave como el kilometraje y el año del modelo puede facilitar la toma de decisiones en diversos contextos.
En la práctica, este modelo podría ser utilizado para estimar de manera rápida y confiable el valor de mercado de un vehículo, lo cual ayudaría a los concesionarios a fijar precios competitivos y a los compradores a evaluar si un vehículo está correctamente valorado. Además, empresas aseguradoras podrían emplear el modelo para determinar primas adecuadas en función del riesgo asociado a cada vehículo. Las financieras, por otro lado, podrían usar el modelo para evaluar el valor de colateral al otorgar préstamos para la compra de vehículos, haciendo que sus decisiones sean más fundamentadas y menos riesgosas. Este enfoque de predicción puede proporcionar una ventaja competitiva al optimizar los procesos de evaluación de precios y mitigar riesgos.