B) Exploracion de datos:

# Cargar librerías
library(readxl)
library(tidyverse)
library(ggplot2)
library(corrplot)
library(readxl)
# Leer el archivo Excel
df <- read_excel("~/Mazda 2.xlsx", sheet = "Sheet1")


# Limpiar la columna Precio (quitar "$" y ".")
df$Precio <- as.numeric(gsub("[$,.]", "", df$Precio))

# Limpiar la columna Kilometraje (quitar " Km" y ".")
df$Kmt <- as.numeric(gsub("[^0-9]", "", df$Kmt))

# Convertir modelo a numérico
df$Modelo <- as.numeric(df$Modelo)

# Revisar estructura de los datos
str(df)
## tibble [712 × 6] (S3: tbl_df/tbl/data.frame)
##  $ web-scraper-order    : chr [1:712] "1740515144-1" "1740515144-2" "1740515144-3" "1740515144-4" ...
##  $ web-scraper-start-url: chr [1:712] "https://www.carroya.com/automoviles-y-camionetas/mazda/2?page=1" "https://www.carroya.com/automoviles-y-camionetas/mazda/2?page=1" "https://www.carroya.com/automoviles-y-camionetas/mazda/2?page=1" "https://www.carroya.com/automoviles-y-camionetas/mazda/2?page=1" ...
##  $ Precio               : num [1:712] 72000000 40000000 58000000 53000000 86000000 76000000 32500000 77000000 64500000 58000000 ...
##  $ Kmt                  : num [1:712] 20000 132000 66400 123000 15982 ...
##  $ Modelo               : num [1:712] 2022 2015 2019 2017 2024 ...
##  $ Ciudad               : chr [1:712] "Bogota" "Palmira" "Cali" "Bogota" ...
# Resumen estadístico de las variables numéricas
summary(df)
##  web-scraper-order  web-scraper-start-url     Precio               Kmt         
##  Length:712         Length:712            Min.   :  6000000   Min.   :    100  
##  Class :character   Class :character      1st Qu.: 39997500   1st Qu.:  36925  
##  Mode  :character   Mode  :character      Median : 58945000   Median :  63950  
##                                           Mean   : 55901640   Mean   :  77429  
##                                           3rd Qu.: 67000000   3rd Qu.:  95125  
##                                           Max.   :120000000   Max.   :6500000  
##      Modelo        Ciudad         
##  Min.   :1993   Length:712        
##  1st Qu.:2014   Class :character  
##  Median :2018   Mode  :character  
##  Mean   :2017                     
##  3rd Qu.:2020                     
##  Max.   :2025
# Matriz de correlación
cor_matrix <- cor(df %>% select(Precio, Kmt, Modelo), use = "complete.obs")

# Visualizar la matriz de correlación
corrplot(cor_matrix, method = "color", addCoef.col = "black", tl.col = "black")

Analisis:

  • La matriz de correlación muestra que el Precio está altamente correlacionado con el Modelo (0.93), indicando que los autos más nuevos tienen precios más altos.

  • La relación entre Precio y Kilometraje es negativa pero débil (−0.18), lo que sugiere que un mayor kilometraje tiende a reducir el precio, aunque no de forma determinante. Asimismo, Kilometraje y Modelo tienen una relación negativa leve (−0.20), confirmando que los modelos más nuevos suelen tener menos kilometraje.

# Histogramas de las variables numéricas
ggplot(df, aes(x = Precio)) + 
  geom_histogram(bins = 30, fill = "blue", color = "black") + 
  ggtitle("Distribución del Precio") + theme_minimal()

ggplot(df, aes(x = Kmt)) + 
  geom_histogram(bins = 30, fill = "green", color = "black") + 
  ggtitle("Distribución del Kilometraje") + theme_minimal()

ggplot(df, aes(x = Modelo)) + 
  geom_histogram(bins = 30, fill = "orange", color = "black") + 
  ggtitle("Distribución del Modelo") + theme_minimal()

Analisis:

  • Distribución del modelo: La mayoría de los vehículos corresponden a modelos recientes (posteriores a 2010), con mayor concentración entre 2015 y 2023.

  • Distribución del kilometraje: Existe un valor extremo muy alto, pero en general, la mayoría de los autos tienen un kilometraje relativamente bajo.

  • Distribución del precio: El precio muestra una distribución bimodal, lo que podría indicar diferencias en versiones o características dentro del mismo modelo de Mazda 2.

# Cargar paquetes necesarios
library(ggplot2)

# Función para eliminar valores atípicos usando IQR
remove_outliers <- function(data, column) {
  Q1 <- quantile(data[[column]], 0.25, na.rm = TRUE)
  Q3 <- quantile(data[[column]], 0.75, na.rm = TRUE)
  IQR_value <- Q3 - Q1
  
  lower_bound <- Q1 - 1.5 * IQR_value
  upper_bound <- Q3 + 1.5 * IQR_value
  
  data_clean <- data[data[[column]] >= lower_bound & data[[column]] <= upper_bound, ]
  return(data_clean)
}

# Verificar si el dataset 'df' existe
if (!exists("df")) {
  stop("El dataset 'df' no está definido. Asegúrate de cargarlo antes de ejecutar este script.")
}

# Aplicar la limpieza de datos
df_clean <- remove_outliers(df, "Precio")
df_clean <- remove_outliers(df_clean, "Kmt")
df_clean <- remove_outliers(df_clean, "Modelo")  # Eliminamos atípicos en Modelo también


# Gráfico de dispersión Precio vs. Kilometraje (sin atípicos)
ggplot(df_clean, aes(x = Kmt, y = Precio)) + 
  geom_point(alpha = 0.5, color = "blue") +  
  geom_smooth(method = "lm", color = "red", se = TRUE) +  
  ggtitle("Relación entre Precio y Kilometraje (Sin Atípicos)") +
  xlab("Kilometraje (Km)") +
  ylab("Precio (COP)") +
  theme_minimal()

# Gráfico de dispersión Precio vs. Modelo (sin atípicos)
ggplot(df_clean, aes(x = Modelo, y = Precio)) + 
  geom_point(alpha = 0.5, color = "red") +  
  ggtitle("Relación entre Precio y Modelo (Sin Atípicos)") +
  xlab("Modelo (Año)") +
  ylab("Precio (COP)") +
  theme_minimal()

Analisis:

  • Existe una relación negativa entre el precio y el kilometraje del Mazda 2: a mayor kilometraje, menor precio, lo que indica que el desgaste del vehículo reduce su valor de mercado.
  • El modelo muestra que el precio de los vehículos disminuye con mayor kilometraje y aumenta con modelos más recientes.

C) Modelo de regresion lineal multiple:

# Ajustar modelo de regresión lineal múltiple
modelo_lm <- lm(Precio ~ Kmt + Modelo, data = df)

# Resumen del modelo
summary(modelo_lm)
## 
## Call:
## lm(formula = Precio ~ Kmt + Modelo, data = df)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -18095159  -3570733      6770   2956810  71531775 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -7.297e+09  1.128e+08 -64.718   <2e-16 ***
## Kmt          2.363e-01  9.394e-01   0.252    0.801    
## Modelo       3.645e+06  5.589e+04  65.222   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6007000 on 709 degrees of freedom
## Multiple R-squared:  0.8617, Adjusted R-squared:  0.8614 
## F-statistic:  2210 on 2 and 709 DF,  p-value: < 2.2e-16

Interpretacion de Resultados Coeficientes (Betas):

  • Intercepto: Es el valor del Precio cuando todas las demás variables son cero. Beta de Kilometraje: Indica cuánto varía el Precio por cada aumento de 1 km. Si es negativo, significa que a más kilometraje, menor precio.

  • Beta de Modelo: Muestra cuánto varía el Precio por cada año adicional del modelo.

  • R²: Indica qué porcentaje de la variabilidad del Precio es explicada por el modelo.

  • p-valores: Si son menores a 0.05, las variables son estadísticamente significativas en la predicción del precio.

D) Modelo validacion cruzada Bootstrapping:

# Instalar y cargar el paquete caret si no está instalado
if (!requireNamespace("caret", quietly = TRUE)) {
  install.packages("caret")
}
library(caret)

# Configurar la validación con Bootstrapping (1000 réplicas)
control_boot <- trainControl(method = "boot", number = 1000)

# Ajustar el modelo con validación por Bootstrapping
modelo_boot <- train(
  Precio ~ Kmt + Modelo,  # Variables predictoras
  data = df,               # Datos
  method = "lm",           # Regresión lineal
  trControl = control_boot # Validación con Bootstrapping
)

# Mostrar resumen del modelo
print(modelo_boot)
## Linear Regression 
## 
## 712 samples
##   2 predictor
## 
## No pre-processing
## Resampling: Bootstrapped (1000 reps) 
## Summary of sample sizes: 712, 712, 712, 712, 712, 712, ... 
## Resampling results:
## 
##   RMSE      Rsquared   MAE    
##   12582077  0.6562874  4708313
## 
## Tuning parameter 'intercept' was held constant at a value of TRUE
# Extraer métricas del modelo
modelo_boot$resample %>%
  summarise(
    RMSE_Promedio = mean(RMSE),
    R2_Promedio = mean(Rsquared)
  )
##   RMSE_Promedio R2_Promedio
## 1      12582077   0.6562874

Interpretacion de las metricas:

  • RMSE (Error Cuadrático Medio) = 12,219,387 Este valor mide el error promedio de predicción en la misma escala que la variable dependiente (Precio).
  • Un RMSE de 12,219,387 COP significa que, en promedio, las predicciones del modelo se desvían del valor real en aproximadamente 12.2 millones de pesos. Cuanto más bajo sea el RMSE, mejor será la precisión del modelo. En este caso, parece un error considerablemente alto, lo que sugiere que el modelo no es perfecto para predecir el precio de los Mazda 2.
  • R² (Coeficiente de Determinación) = 0.6696 (~67%) Explica cuánto de la variabilidad en el Precio es capturada por el modelo. Un R² de 0.67 indica que el 67% de la variabilidad del precio se explica por el kilometraje y el modelo del vehículo. Aunque no es un ajuste perfecto (100%), sí muestra que hay una relación significativa entre las variables.
  • Un 33% de la variabilidad del precio queda sin explicar, lo que sugiere que hay otros factores importantes (por ejemplo, estado del vehículo, equipamiento, ciudad, demanda en el mercado, etc.). MAE (Error Absoluto Medio) = 4,695,618 Mide el error promedio en la predicción del precio, pero sin elevar al cuadrado como el RMSE. Un MAE de 4.69 millones de pesos indica que, en promedio, las predicciones del modelo difieren del precio real en casi 4.7 millones de COP. Es más intuitivo que el RMSE, y muestra un error relativamente grande.

F) Potenciales Uso: