Pregunta orientadora:

¿Cómo estimar el precio anunciado de un vehículo Mazda2 usado en Colombia a partir de su año de modelo, kilometraje y tipo de transmisión?

Objetivo:

Desarrollar y evaluar modelos de regresión lineal simple y múltiple que permitan estimar el precio anunciado de vehículos Mazda2 usados en Colombia, considerando características como el año del modelo, el kilometraje y el tipo de transmisión.

Punto 1:

Descripción de las variables y revisión de la base de datos:

Primero, se debe cargar la base de datos:

library(readxl)

datos <- read_excel("C:/Users/user/Downloads/base1_mazdacol.xlsx")
View(datos)

Se debe identifica la estructura de la base de datos:

# Visualizar las primeras observaciones
head(datos)
precio kilometraje transmision modelo color ciudad departamento web-scraper-order web-scraper-start-url link link-href
34000000 140000 Automática 2008 Gris Medellín Antioquia 1662991183-54 https://www.olx.com.co/items/q-mazda-2 $ 34.000.0002008 - 140.000 kmMAZDA 2 2008San Bernardo, Medellín13 ago https://www.olx.com.co/item/mazda-2-2008-iid-1116580834
26400000 112000 Automática 2012 Gris Medellín Antioquia 1662991216-64 https://www.olx.com.co/items/q-mazda-2 $ 26.400.0002012 - 112.000 kmVencambio Renault STEPWAY automático RECIBO TWINGO KIA PICANTO SPARK GT MAZDA 3 MAZDA 2 CX5 CX30 CX3 logan CLIO DMAX EONEl Poblado, Medellín14 ago https://www.olx.com.co/item/vencambio-renault-stepway-automatico-recibo-twingo-kia-picanto-spark-gt-mazda-3-mazda-2-cx5-cx30-cx3-logan-clio-dmax-eon-iid-1116591635
42500000 102222 Automática 2013 Gris Itagüí Antioquia 1662991275-85 https://www.olx.com.co/items/q-mazda-2 $ 42.500.0002013 - 102.222 kmMazda 2 2013 automáticoLos Naranjos, Itagüí17 ago https://www.olx.com.co/item/mazda-2-2013-automatico-iid-1116622734
91000000 1000 Automática 2022 Gris Envigado Antioquia 1662991284-88 https://www.olx.com.co/items/q-mazda-2 $ 91.000.0002022 - 1.000 kmMazda 2 grand touring LX 2022Mesa, Envigado17 ago https://www.olx.com.co/item/mazda-2-grand-touring-lx-2022-iid-1116627180
35000000 134500 Automática 2012 Blanco Medellín Antioquia 1662991287-89 https://www.olx.com.co/items/q-mazda-2 $ 35.000.0002012 - 134.500 kmMazda 2 automáticoSanta Fé, Medellín17 ago https://www.olx.com.co/item/mazda-2-automatico-iid-1116628639
67000000 61997 Automática 2017 Gris Medellín Antioquia 1662991300-94 https://www.olx.com.co/items/q-mazda-2 $ 67.000.0002017 - 61.997 kmMazda 2 Gran touringEl Poblado, Medellín18 ago https://www.olx.com.co/item/mazda-2-gran-touring-iid-1116640612
# Identificar la estructura de las variables
str(datos)
## tibble [314 × 11] (S3: tbl_df/tbl/data.frame)
##  $ 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" ...
##  $ departamento         : chr [1:314] "Antioquia" "Antioquia" "Antioquia" "Antioquia" ...
##  $ 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" ...
# Identificar los nombres de las columnas
names(datos)
##  [1] "precio"                "kilometraje"           "transmision"          
##  [4] "modelo"                "color"                 "ciudad"               
##  [7] "departamento"          "web-scraper-order"     "web-scraper-start-url"
## [10] "link"                  "link-href"

En base a los datos, se utilizara como variable dependiente el precio y como variables independientes el kilometraje, modelo, transmisión, color, ciudad y departamento.

Se identifican los valores faltantes:

colSums(is.na(datos))
##                precio           kilometraje           transmision 
##                     0                     0                     0 
##                modelo                 color                ciudad 
##                     0                     0                     0 
##          departamento     web-scraper-order web-scraper-start-url 
##                     0                     0                     0 
##                  link             link-href 
##                     0                     0

La revisión de los valores faltantes permitió identificar que ninguna de las variables presenta datos ausentes. En las 314 observaciones se cuenta con información completa para las 11 variables de la base de datos.

Revisión de registros duplicados:

sum(duplicated(datos))
## [1] 0

Verificar anuncios duplicados:

sum(duplicated(datos$`link-href`))
## [1] 0

La revisión de registros duplicados permitió identificar que no existen filas completamente repetidas ni anuncios duplicados según su enlace de publicación.

Identificar valores atipicos:

boxplot(datos$precio,
        main = "Distribución del precio anunciado",
        ylab = "Precio (COP)",
        col = "lightblue")

En el gráfico se puede observar:

Concentración de precios: la mayor parte de los anuncios se encuentra aproximadamente entre $35 y $63 millones.

Asimetría positiva: se observa una mayor extensión hacia los precios altos, lo que indica que algunos vehículos tienen precios considerablemente superiores al resto.

Valores atípicos: aparecen cuatro observaciones por encima del límite superior del bigote, que podrían representar precios inusualmente elevados.

Revisar esas cuatro observaciones:

boxplot.stats(datos$precio)$out
## [1] 119900000 159900000 169800000 107500000

Revisar a que vehiculo corresponden:

datos[datos$precio %in% boxplot.stats(datos$precio)$out,
      c("precio", "kilometraje", "modelo", "transmision",
        "ciudad", "departamento", "link-href")]
precio kilometraje modelo transmision ciudad departamento link-href
119900000 29000 2021 Automática Medellín Antioquia https://www.olx.com.co/item/vencambio-mazda-cx30-modelo-2021-grand-touring-lx-refull-42-solo-29000-km-motor-25excelente-estadosonido-bosse-iid-1114593582
159900000 0 2022 Automática Cali ValledelCauca https://www.olx.com.co/item/mazda-cx5-grand-touring-42-plata-2023-iid-1115898104
169800000 36026 2019 Automática Cali ValledelCauca https://www.olx.com.co/item/mazda-cx-9-2019-cl-25-4x4-7-psj-blindaje-2-iid-1116691851
107500000 17909 2021 Automática Cali ValledelCauca https://www.olx.com.co/item/venta-hermosa-camioneta-mazda-touring-2o-at-iid-1116893504

Revisar los titulos de esos anuncios:

datos[datos$precio %in% boxplot.stats(datos$precio)$out,
      c("precio", "modelo", "link")]
precio modelo link
119900000 2021 $ 119.900.0002021 - 29.000 kmVencambio mazda cx30 modelo 2021 grand touring lx refull 4×2 solo 29.000 km, motor 2.5,excelente estado,sonido bosseLaureles, Medellín29 ago
159900000 2022 $ 159.900.0002022 - 0 kmMazda Cx5 Grand Touring 4*2 Plata | 2023Ciudad Campestre, Cali22 ago
169800000 2019 $ 169.800.0002019 - 36.026 kmMAZDA CX-9 2019 cl 2.5 4x4 7 psj Blindaje 2Prados del Limonar, Cali23 ago
107500000 2021 $ 107.500.0002021 - 17.909 kmVenta Hermosa Camioneta Mazda Touring 2.o ATSan Pedro, CaliAyer

Se excluyen los anuncios atipicos que no corresponden a la categoria Mazda2:

datos_mazda2 <- datos[-which(datos$precio %in% c(119900000, 159900000, 169800000, 107500000)), ]
dim(datos_mazda2)
## [1] 310  11

Revisión de valores atípicos en kilometraje

boxplot(datos_mazda2$kilometraje,
        main = "Distribución del kilometraje",
        ylab = "Kilómetros recorridos",
        col = "lightblue")

Identificar el valor atipico:

boxplot.stats(datos_mazda2$kilometraje)$out
## [1] 280000

Identificar el vehiculo con ese valor:

datos_mazda2[datos_mazda2$kilometraje == 280000,
             c("precio", "kilometraje", "modelo",
               "transmision", "ciudad", "departamento", "link")]
precio kilometraje modelo transmision ciudad departamento link
29900000 280000 1995 Mecánica Chía Cundinamarca $ 29.900.0001995 - 280.000 kmMazda Estacas 4 x 2, buen estado gas gasolinaÁrea Urbana, Chía17 ago

En la variable kilometraje se identificó una observación atípica correspondiente a 280.000 kilómetros. Al revisar sus características, se encontró que pertenece a un vehículo modelo 1995, con un precio anunciado de $29.900.000. Aunque presenta un recorrido considerablemente superior al de los demás vehículos, este valor puede ser coherente con la antigüedad del automóvil.

Revisión de valores atípicos en el año del modelo:

boxplot(datos_mazda2$modelo,
        main = "Distribución del año del modelo",
        ylab = "Año del vehículo",
        col = "lightblue")

Identificar el valor atipico:

boxplot.stats(datos_mazda2$modelo)$out
## [1] 1995

Verificar el anuncio:

datos_mazda2[datos_mazda2$modelo == 1995,
             c("precio", "kilometraje", "modelo",
               "ciudad", "departamento", "link")]
precio kilometraje modelo ciudad departamento link
29900000 280000 1995 Chía Cundinamarca $ 29.900.0001995 - 280.000 kmMazda Estacas 4 x 2, buen estado gas gasolinaÁrea Urbana, Chía17 ago

Este vehiculo corresponde a un Mazda Estacas 4x2, no cumple con el criterio de selección de la investigación: estudiar exclusivamente vehículos Mazda2.

Se excluye este anuncio:

datos_mazda2 <- datos_mazda2[
  !(datos_mazda2$modelo == 1995 &
    datos_mazda2$kilometraje == 280000), ]
dim(datos_mazda2)
## [1] 309  11

Estadísticas descriptivas de las variables cuantitativas:

summary(datos_mazda2[, c("precio", "kilometraje", "modelo")])
##      precio          kilometraje         modelo    
##  Min.   : 6800000   Min.   :     0   Min.   :2007  
##  1st Qu.:35000000   1st Qu.: 39500   1st Qu.:2011  
##  Median :42000000   Median : 79000   Median :2014  
##  Mean   :49384466   Mean   : 75035   Mean   :2015  
##  3rd Qu.:63000000   3rd Qu.:107500   3rd Qu.:2018  
##  Max.   :98500000   Max.   :200000   Max.   :2022

La descripción estadística de las variables cuantitativas muestra que los 309 anuncios presentan un precio promedio de $49.384.466 COP, mientras que la mediana se ubica en $42.000.000 COP. Esta diferencia sugiere que algunos vehículos con precios elevados incrementan el promedio de la muestra.

En cuanto al kilometraje, los vehículos registran un promedio de 75.053 kilómetros y una mediana de 79.000 kilómetros. Por su parte, el año promedio del modelo es 2015, con una mediana de 2014.

Verificar dato de kilometraje 0:

datos_mazda2[datos_mazda2$kilometraje == 0,
             c("precio", "kilometraje", "modelo",
               "ciudad", "departamento", "link")]
precio kilometraje modelo ciudad departamento link
93000000 0 2022 Medellín Antioquia $ 93.000.0002022 - 0 kmse vende mazda 2 grand touring 2023La Candelaria, Medellín22 ago
98000000 0 2022 Medellín Antioquia $ 98.000.0002022 - 0 kmMazda 2 grand touring Lx modelo 2023 0 kmtLos Balsos No.1, Medellínhace 6 días
89800000 0 2022 Bogotá Bogotá $ 89.800.0002022 - 0 kmMazda 2 sedan entrega inmediata septiembre 2023Santa Inés, Santa Féhace 4 días
28000000 0 2009 Villavicencio Meta $ 28.000.0002009 - 0 kmSe vende Mazda 2Remanso, Villavicencio16 ago
81500000 0 2022 Cali ValledelCauca $ 81.500.0002022 - 0 kmMazda 2 Sport Carbon Edition Machine Grey - 2023Ciudad Campestre, Cali29 ago
89800000 0 2022 Cali ValledelCauca $ 89.800.0002022 - 0 kmMazda 2 Sedan Grand Touring Lx Machine | 2023Ciudad Campestre, Calihace 5 días
89800000 0 2022 Cali ValledelCauca $ 89.800.0002022 - 0 kmMazda 2 Sedan Grand Touring Lx - 2023Ciudad Campestre, Calihace 5 días

Verificar el registro de 2009:

datos_mazda2[datos_mazda2$modelo == 2009 &
             datos_mazda2$kilometraje == 0, ]
precio kilometraje transmision modelo color ciudad departamento web-scraper-order web-scraper-start-url link link-href
2.8e+07 0 Mecánica 2009 Verde Villavicencio Meta 1662991256-78 https://www.olx.com.co/items/q-mazda-2 $ 28.000.0002009 - 0 kmSe vende Mazda 2Remanso, Villavicencio16 ago https://www.olx.com.co/item/se-vende-mazda-2-iid-1116612789

Al revisar los anuncios, seis corresponden a vehículos modelo 2022, cuyos títulos presentan características compatibles con vehículos nuevos o de entrega inmediata. Sin embargo, se encontró un Mazda2 modelo 2009 cuyo kilometraje también aparece registrado en cero. Debido a que no se cuenta con evidencia suficiente para determinar si este valor corresponde a un error de publicación o extracción, se decidió conservar provisionalmente la observación y señalarla como un posible problema de calidad de los datos.

Descripción de las variables categóricas:

Frecuencia de los tipos de transmisión:

table(datos_mazda2$transmision)
## 
## Automática   Mecánica 
##        170        139

La transmisión automática representa el 55,02 % de los anuncios.

La transmisión mecánica representa el 44,98 %.

Existe una distribución relativamente equilibrada, aunque predominan los vehículos automáticos.

Frecuencia de vehículos por departamento:

table(datos_mazda2$departamento)
## 
##        Antioquia        Atlántico           Bogotá           Caldas 
##               82               13               51               22 
##         Casanare            Cauca            Cesar          Córdoba 
##                1                1                2                1 
##     Cundinamarca            Huila        Magdalena             Meta 
##                7               10                1                7 
##           Nariño NortedeSantander          Quindío        Risaralda 
##                3                5               11               10 
##        Santander            Sucre           Tolima    ValledelCauca 
##               21                1                8               52

Los anuncios de Mazda2 se concentran principalmente en Antioquia, con 82 registros (26,54 %), seguido del Valle del Cauca, con 52 (16,83 %), y Bogotá, con 51 (16,50 %). En conjunto, estos tres territorios representan aproximadamente el 59,87 % de las observaciones.

Frecuencia de vehículos por ciudad:

table(datos_mazda2$ciudad)
## 
##         Acacías            Aipe    Ansermanuevo         Armenia Barrancabermeja 
##               1               1               1              11               2 
##    Barranquilla           Bello          Bogotá     Bucaramanga            Cali 
##              13              10              51               8              46 
##         Cartago            Chía          Cúcuta        Envigado   Floridablanca 
##               1               2               5               5               8 
##           Funza      Fusagasugá        Girardot           Girón          Ibagué 
##               1               2               1               1               8 
##          Itagüí         La Ceja       Manizales        Medellín        Montería 
##               4               1              21              54               1 
##           Neiva       Palestina         Palmira         Pereira     Piedecuesta 
##               8               1               1              10               1 
##        Pitalito         Popayán      Río de Oro        Rionegro        Sabaneta 
##               1               1               1               5               2 
##         San Gil  SanJuandePasto      SantaMarta       Sincelejo           Tuluá 
##               1               3               1               1               2 
##      Valledupar   Villavicencio         Yarumal           Yopal           Yumbo 
##               1               6               1               1               1 
##       Zipaquirá 
##               1

En cuanto a la distribución por ciudad, se identificaron 46 ciudades en la muestra. Medellín concentra la mayor cantidad de anuncios, con 54 registros (17,48 %), seguida de Bogotá, con 51 (16,50 %), y Cali, con 46 (14,89 %). En conjunto, estas tres ciudades representan aproximadamente el 48,87 % de las observaciones.

Distribución de vehículos en las 10 principales ciudades:

par(mar = c(5, 11, 4, 2))

barplot(tail(sort(table(datos_mazda2$ciudad)), 10),
        main = "Distribución de vehículos por ciudad",
        xlab = "Número de vehículos",
        col = "lightblue",
        horiz = TRUE,
        las = 1,
        cex.names = 0.8)

El gráfico evidencia una concentración geográfica de los anuncios de vehículos Mazda2 en Medellín, Bogotá y Cali, ciudades que reúnen aproximadamente el 48,9 % de las observaciones. Medellín presenta la mayor frecuencia, con 54 anuncios, seguida de Bogotá (51) y Cali (46). Por otra parte, ciudades como Manizales, Barranquilla y Armenia registran una participación menor.

Distribución por color:

table(datos_mazda2$color)
## 
##      Azul     Beige    Blanco     Crema    Dorado      Gris    Marrón    Morado 
##        18         4        76         1         1       103         2         1 
##     Negro      Otro  Plateado      Rojo     Verde Vinotinto 
##        19         6        25        44         3         6

La distribución de los vehículos según su color muestra una concentración importante en tres categorías: gris (103 vehículos), blanco (76) y rojo (44), que representan conjuntamente el 72,2 % de la muestra. El gris es el color predominante, con una participación del 33,3 %, seguido del blanco, con un 24,6 %. Por su parte, colores como crema, dorado, morado y marrón presentan frecuencias muy bajas.

Análisis exploratorio:

Estadisticas descriptivas de las variables cuantitativas base ya filtrada:

summary(datos_mazda2[, c("precio", "kilometraje", "modelo")])
##      precio          kilometraje         modelo    
##  Min.   : 6800000   Min.   :     0   Min.   :2007  
##  1st Qu.:35000000   1st Qu.: 39500   1st Qu.:2011  
##  Median :42000000   Median : 79000   Median :2014  
##  Mean   :49384466   Mean   : 75035   Mean   :2015  
##  3rd Qu.:63000000   3rd Qu.:107500   3rd Qu.:2018  
##  Max.   :98500000   Max.   :200000   Max.   :2022

Precio: Los vehículos tienen un precio promedio de $49.384.466 COP, superior a la mediana de $42.000.000, lo que sugiere una distribución sesgada hacia valores altos. El 50% de los vehículos tiene precios entre $35.000.000 y $63.000.000.

Kilometraje: El promedio es de 75.035 km, mientras que la mediana es de 79.000 km. La mitad de los vehículos registra entre 39.500 y 107.500 km recorridos.

Modelo: Los vehículos corresponden a años entre 2007 y 2022, con un año promedio de 2015 y una mediana de 2014. Esto indica que la muestra reúne principalmente modelos de años intermedios dentro del periodo analizado.

Histograma del precio:

hist(datos_mazda2$precio,
     main = "Distribución del precio anunciado",
     xlab = "Precio (COP)",
     ylab = "Frecuencia",
     col = "lightblue",
     breaks = 10)

La mayor concentración de vehículos se encuentra entre $30 y $40 millones, siendo este el intervalo con mayor frecuencia.

La mayoría de los precios se ubica entre $30 y $70 millones, lo que evidencia una concentración de anuncios en ese rango.

La distribución presenta una asimetría hacia la derecha, debido a que existen algunos vehículos con precios considerablemente superiores al resto.

Se observa una frecuencia muy baja de vehículos con precios inferiores a $20 millones y superiores a $90 millones.

Histograma del kilometraje:

hist(datos_mazda2$kilometraje,
     main = "Distribución del kilometraje",
     xlab = "Kilometraje (km)",
     ylab = "Frecuencia",
     col = "lightblue",
     breaks = 10)

La mayor concentración de vehículos se encuentra entre 80.000 y 100.000 km, intervalo que presenta la frecuencia más alta.

También se observa una cantidad importante de vehículos con kilometrajes inferiores a 20.000 km.

La mayoría de los Mazda2 registra kilometrajes inferiores a 140.000 km.

La distribución presenta una ligera asimetría hacia la derecha, debido a que hay pocos vehículos con kilometrajes superiores a 150.000 km.

Histograma del año del modelo:

hist(datos_mazda2$modelo,
     main = "Distribución por año del modelo",
     xlab = "Año del modelo",
     ylab = "Frecuencia",
     col = "lightblue",
     breaks = 10)

La mayor concentración de vehículos se encuentra entre los años 2010 y 2012, siendo este el intervalo con mayor frecuencia.

La muestra incluye vehículos fabricados entre 2007 y 2022, lo que evidencia variedad en la antigüedad de los automóviles.

También se observa una presencia importante de modelos recientes, especialmente entre 2016 y 2022.

La distribución no presenta una concentración exclusiva en un solo periodo, sino que muestra participación de vehículos de diferentes años.

Relación entre la respuesta y los predictores mediante dispersión y correlación para variables cuantitativas, o comparaciones entre grupos para categóricas:

Relación entre el precio y las variables cuantitativas:

# Gráficos de dispersión
par(mfrow = c(1, 2))

plot(datos_mazda2$kilometraje, datos_mazda2$precio,
     main = "Precio vs. kilometraje",
     xlab = "Kilometraje (km)",
     ylab = "Precio (COP)",
     col = "lightblue",
     pch = 19)

plot(datos_mazda2$modelo, datos_mazda2$precio,
     main = "Precio vs. año del modelo",
     xlab = "Año del modelo",
     ylab = "Precio (COP)",
     col = "lightblue",
     pch = 19)

par(mfrow = c(1, 1))

# Matriz de correlaciones
cor(datos_mazda2[, c("precio", "kilometraje", "modelo")])
##                 precio kilometraje     modelo
## precio       1.0000000   -0.700330  0.9073828
## kilometraje -0.7003300    1.000000 -0.7198010
## modelo       0.9073828   -0.719801  1.0000000

Precio y kilometraje: presentan una relación negativa fuerte. La correlación es de -0,7003, lo que indica que, en general, los vehículos con mayor kilometraje tienden a tener precios anunciados más bajos.

Precio y año del modelo: presentan una relación positiva muy fuerte, con una correlación de 0,9074. Esto indica que los vehículos de modelos más recientes tienden a registrar precios más elevados.

Kilometraje y año del modelo: la correlación es de -0,7198, lo que sugiere que los vehículos más recientes tienden a registrar menores kilometrajes.

Comparación del precio según variables categóricas:

# Precio según tipo de transmisión
boxplot(precio ~ transmision,
        data = datos_mazda2,
        main = "Precio según tipo de transmisión",
        xlab = "Tipo de transmisión",
        ylab = "Precio (COP)",
        col = "lightblue")

# Precio según departamento
boxplot(precio ~ departamento,
        data = datos_mazda2,
        main = "Precio según departamento",
        xlab = "Departamento",
        ylab = "Precio (COP)",
        col = "lightblue",
        las = 2,
        cex.axis = 0.7)

Interpretación precio según tipo de transmisión:

Los vehículos de transmisión automática presentan una mediana de precio superior a los de transmisión mecánica.

La mediana de los automáticos se ubica aproximadamente en $56 millones, mientras que la de los mecánicos está cerca de $38 millones.

Los automáticos también presentan una mayor dispersión de precios.

Esto sugiere que el tipo de transmisión puede ser una característica relevante para explicar las diferencias en los precios anunciados.

Interpretación precio según departamento:

Se observan diferencias en las medianas de precios entre departamentos.

Santander presenta una de las medianas más altas, mientras que Meta y Atlántico muestran medianas relativamente bajas.

Antioquia, Bogotá y Valle del Cauca presentan una dispersión considerable de precios, lo que indica heterogeneidad entre los vehículos publicados en estas ubicaciones.

Algunos departamentos tienen muy pocas observaciones.

Conclusión:

El análisis exploratorio evidencia que el precio anunciado de los Mazda2 presenta relaciones importantes con las características técnicas y geográficas del vehículo. En particular, el año del modelo tiene una correlación positiva fuerte con el precio (0,9074), mientras que el kilometraje presenta una correlación negativa (-0,7003). Asimismo, los vehículos automáticos muestran precios medianos superiores a los mecánicos y existen diferencias entre departamentos. Estos hallazgos permiten identificar variables potencialmente relevantes para la construcción del modelo de regresión.

Modelo 1. Regresión lineal simple: precio y año del modelo:

Se definen las variables del modelo:

# Definir las variables del modelo 1
y1 = datos_mazda2$precio
x1 = datos_mazda2$modelo

Explorar la relación entre las variables:

plot(x1,y1,
     main = "Relación entre precio y año del modelo",
     xlab = "Año del modelo",
     ylab = "Precio (COP)",
     col = "lightblue",
     pch = 19)

El gráfico evidencia una relación positiva y fuerte entre el año del modelo y el precio anunciado. En general, los vehículos más recientes presentan precios más elevados, mientras que los modelos antiguos tienden a registrar precios inferiores.

Calcular la correlación:

# Coeficiente de correlación
cor(x1,y1)
## [1] 0.9073828

El coeficiente de correlación obtenido es 0,9073828, lo que indica una correlación positiva muy fuerte entre el año del modelo y el precio anunciado. Por lo tanto, los vehículos de años más recientes tienden a presentar precios más elevados. El resultado coincide con la tendencia observada en el gráfico de dispersión.

Se estima el modelo:

modelo1 = lm(y1 ~ x1)
summary(modelo1)
## 
## Call:
## lm(formula = y1 ~ x1)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -70268831  -3316707    191789   4087541  21431169 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -7.760e+09  2.065e+08  -37.59   <2e-16 ***
## x1           3.876e+06  1.025e+05   37.83   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7471000 on 307 degrees of freedom
## Multiple R-squared:  0.8233, Adjusted R-squared:  0.8228 
## F-statistic:  1431 on 1 and 307 DF,  p-value: < 2.2e-16

Interpretaciones del modelo 1:

Por cada año adicional de antigüedad del modelo (es decir, un año más reciente), el precio anunciado aumenta en promedio aproximadamente $38.760.000 COP.

El 82,33% de la variación observada en los precios anunciados se explica estadísticamente por el año del modelo.

Teniendo en cuenta el valor p se rechaza la hipótesis nula de que el coeficiente sea igual a cero.

El estadístico F es 1431, con un valor p inferior a 0,001, lo que indica que el modelo es estadísticamente significativo en su conjunto.

El año del modelo presenta una asociación positiva y estadísticamente significativa con el precio anunciado de los Mazda2. Además, el modelo explica el 82,33% de la variación observada en los precios, lo que evidencia una elevada capacidad explicativa dentro de la muestra.

Modelo 2. Regresión lineal simple: precio y kilometraje:

Se definen las variables:

# Definir las variables del modelo 2
y2 = datos_mazda2$precio
x2 = datos_mazda2$kilometraje

Explorar la relación entre las variables:

# Gráfico de dispersión: precio y kilometraje
plot(x2, y2,
     main = "Relación entre precio y kilometraje",
     xlab = "Kilometraje (km)",
     ylab = "Precio (COP)",
     col = "lightblue",
     pch = 19)

El gráfico muestra una relación negativa entre el kilometraje y el precio anunciado. En general, a medida que aumenta la cantidad de kilómetros recorridos, el precio de los vehículos tiende a disminuir.

Los vehículos con menor kilometraje suelen presentar precios más elevados. A medida que el kilometraje aumenta, los precios tienden a concentrarse en valores inferiores.

Se observa una tendencia descendente relativamente marcada, aunque existen algunas observaciones que se alejan del comportamiento general.

Calcular la correlación:

# Coeficiente de correlación
cor(x2,y2)
## [1] -0.70033

Existe una asociación lineal negativa fuerte entre ambas variables. Esto significa que, en la muestra, los vehículos con mayor kilometraje tienden a presentar precios anunciados más bajos. El resultado coincide con la tendencia descendente observada en el gráfico de dispersión.

Se estima el modelo:

# Estimación del modelo de regresión simple
modelo2 = lm(y2 ~ x2)

# Resultados del modelo
summary(modelo2)
## 
## Call:
## lm(formula = y2 ~ x2)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -58676694  -6155557     18118   7622921  28240274 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  7.026e+07  1.413e+06   49.73   <2e-16 ***
## x2          -2.782e+02  1.619e+01  -17.19   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 12690000 on 307 degrees of freedom
## Multiple R-squared:  0.4905, Adjusted R-squared:  0.4888 
## F-statistic: 295.5 on 1 and 307 DF,  p-value: < 2.2e-16

Interpretaciones del modelo:

El intercepto representa el precio estimado de un vehículo con cero kilómetros. En este contexto, equivale aproximadamente a $70.260.000 COP.

Por cada kilómetro adicional recorrido, el precio anunciado disminuye en promedio aproximadamente $27.820 COP.

El kilometraje explica el 49,05% de la variación observada en los precios anunciados.

El coeficiente del kilometraje presenta un valor p inferior a 0,001 (p < 2e-16), por lo que, se rechaza la hipótesis nula de que el coeficiente sea igual a cero.

El estadístico F es 295,5, con un valor p inferior a 0,001, por tanto, el modelo es estadísticamente significativo en conjunto.

El kilometraje presenta una asociación negativa y estadísticamente significativa con el precio anunciado de los Mazda2. El modelo explica el 49,05% de la variación de los precios, por lo que tiene capacidad explicativa, aunque inferior a la del primer modelo, cuyo predictor era el año del modelo (R² = 82,33%).

Modelo 3. Regresión lineal simple: precio y tipo de transmisión:

Se definen las variables:

# Definir las variables del modelo 3
y3 = datos_mazda2$precio
x3 = datos_mazda2$transmision

Definir la caregoria de referencia:

# Definir la categoría de referencia
x3 = relevel(as.factor(x3), ref = "Automática")

Explorar la relación de las variables:

# Gráfico de cajas: precio y tipo de transmisión
boxplot(y3 ~ x3,
        main = "Relación entre precio y tipo de transmisión",
        xlab = "Tipo de transmisión",
        ylab = "Precio (COP)",
        col = "lightblue")

Transmisión automática: presenta una mediana de precio aproximada de $56 millones COP, superior a la de los vehículos mecánicos.

Transmisión mecánica: registra una mediana cercana a $38 millones COP, lo que evidencia una diferencia importante frente a los automáticos.

Dispersión: los vehículos automáticos presentan una mayor amplitud en el rango intercuartílico, indicando una mayor variabilidad de precios dentro del 50% central de las observaciones.

Diferencias entre grupos: aunque existe cierto solapamiento en los rangos de precios, los vehículos automáticos tienden a presentar precios anunciados más elevados.

Estadísticas descriptivas:

# Estadísticas descriptivas del precio por transmisión
tapply(y3, x3, summary)
## $Automática
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## 22000000 36000000 56000000 54085177 70000000 98500000 
## 
## $Mecánica
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##  6800000 34800000 38500000 43635396 54750000 80000000

Vehículos automáticos: presentan un precio promedio de $54.085.177 COP y una mediana de $56.000.000 COP.

Vehículos mecánicos: registran un precio promedio de $43.635.396 COP y una mediana de $38.500.000 COP.

Diferencia de precios: en promedio, los automáticos presentan un precio anunciado aproximadamente $10.449.781 COP superior al de los mecánicos.

Dispersión: ambos grupos presentan variabilidad en sus precios, aunque los automáticos alcanzan valores máximos superiores.

Se estima el modelo:

modelo3 = lm(y3 ~ x3)
summary(modelo3)
## 
## Call:
## lm(formula = y3 ~ x3)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -36835396 -12135396  -4135396  13364604  44414823 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  54085177    1303286  41.499  < 2e-16 ***
## x3Mecánica  -10449781    1943174  -5.378  1.5e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 16990000 on 307 degrees of freedom
## Multiple R-squared:  0.08609,    Adjusted R-squared:  0.08311 
## F-statistic: 28.92 on 1 and 307 DF,  p-value: 1.497e-07

Interpretaciones del modelo:

El intercepto representa el precio promedio estimado de los vehículos Mazda2 con transmisión automática, que es la categoría de referencia. En promedio, estos vehículos tienen un precio anunciado de aproximadamente $54.085.177 COP.

Los Mazda2 con transmisión mecánica tienen un precio anunciado aproximadamente $10.449.781 COP menor que los vehículos con transmisión automática.

El coeficiente de transmisión mecánica es estadísticamente significativo (p-valor = 1,5 × 10⁻⁷, menor a 0,01). Por tanto, existe evidencia estadística de diferencias en los precios anunciados según el tipo de transmisión.

El tipo de transmisión explica aproximadamente el 8,61 % de la variación observada en los precios anunciados.

El modelo es estadísticamente significativo en conjunto (p-valor = 1,497 × 10⁻⁷), lo que indica que el tipo de transmisión aporta información relevante para explicar las diferencias de precios.

El modelo muestra que los vehículos Mazda2 con transmisión automática presentan precios anunciados superiores a los de transmisión mecánica. Aunque esta diferencia es estadísticamente significativa, el bajo R² indica que el tipo de transmisión, por sí solo, tiene una capacidad limitada para explicar el precio.

Validación Cruzada modelos de regresión lineal simple:

# Establecer semilla para reproducibilidad
set.seed(123)

# Crear cinco particiones
folds = sample(rep(1:5, length.out = nrow(datos_mazda2)))

# Verificar la distribución de las particiones
table(folds)
## folds
##  1  2  3  4  5 
## 62 62 62 62 61
# Crear vectores para almacenar las predicciones
pred1 = rep(NA, nrow(datos_mazda2))
pred2 = rep(NA, nrow(datos_mazda2))
pred3 = rep(NA, nrow(datos_mazda2))

# Realizar validacion cruzada de cinco particiones
for (i in 1:5) {

  # Separar datos de entrenamiento y validacion
  train = datos_mazda2[folds != i, ]
  test = datos_mazda2[folds == i, ]

  # Modelo 1: precio y año del modelo
  m1_cv = lm(precio ~ modelo, data = train)
  pred1[folds == i] = predict(m1_cv, newdata = test)

  # Modelo 2: precio y kilometraje
  m2_cv = lm(precio ~ kilometraje, data = train)
  pred2[folds == i] = predict(m2_cv, newdata = test)

  # Modelo 3: precio y tipo de transmision
  train$transmision = factor(train$transmision,
                             levels = c("Automática", "Mecánica"))
  test$transmision = factor(test$transmision,
                            levels = c("Automática", "Mecánica"))

  m3_cv = lm(precio ~ transmision, data = train)
  pred3[folds == i] = predict(m3_cv, newdata = test)
}

MAE para los 3 modelos de regresión lineal simple:

# Calcular el MAE de cada modelo
mae1_cv = mean(abs(datos_mazda2$precio - pred1))
mae2_cv = mean(abs(datos_mazda2$precio - pred2))
mae3_cv = mean(abs(datos_mazda2$precio - pred3))

# Mostrar los resultados
mae1_cv
## [1] 4837525
mae2_cv
## [1] 9214972
mae3_cv
## [1] 14682009

Conclusión:

Los resultados de la validación cruzada de cinco particiones muestran que el modelo que utiliza el año del vehículo presenta el menor error absoluto medio (MAE), con un valor de $4.837.525 COP. En segundo lugar, se encuentra el modelo basado en el kilometraje, con un MAE de $9.214.972 COP, mientras que el modelo que utiliza el tipo de transmisión registra el mayor error, con $14.682.009 COP.

Por lo tanto, el modelo basado en el año del vehículo presenta el mejor desempeño predictivo entre las tres especificaciones de regresión lineal simple evaluadas.

Punto 2:

Modelo Múltiple 1: precio y características técnicas del Mazda 2:

# Definir la categoria de referencia
datos_mazda2$transmision = as.factor(datos_mazda2$transmision)

datos_mazda2$transmision = relevel(
  datos_mazda2$transmision,
  ref = "Automática"
)

# Estimar el modelo de regresion lineal multiple 1
mod_multiple1 = lm(precio ~ modelo + kilometraje + transmision,
                   data = datos_mazda2)

# Mostrar los resultados
summary(mod_multiple1)
## 
## Call:
## lm(formula = precio ~ modelo + kilometraje + transmision, data = datos_mazda2)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -67181235  -3005923        45   3823108  19398454 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         -6.965e+09  2.839e+08 -24.534  < 2e-16 ***
## modelo               3.484e+06  1.405e+05  24.789  < 2e-16 ***
## kilometraje         -3.761e+01  1.298e+01  -2.898  0.00403 ** 
## transmisionMecánica -4.474e+06  8.225e+05  -5.439  1.1e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7062000 on 305 degrees of freedom
## Multiple R-squared:  0.8432, Adjusted R-squared:  0.8416 
## F-statistic: 546.6 on 3 and 305 DF,  p-value: < 2.2e-16

Interpretaciones del modelo:

Modelo: por cada año más reciente del vehículo, el precio anunciado aumenta en promedio $3.484.000 COP, manteniendo constantes las demás variables.

Kilometraje: por cada kilómetro adicional, el precio disminuye en promedio $37.610 COP, manteniendo constantes las demás variables.

Transmisión: los vehículos mecánicos presentan un precio promedio $4.474.000 COP inferior al de los automáticos, que son la categoría de referencia, manteniendo constantes las demás variables.

Los tres coeficientes son estadísticamente significativos (p < 0.001).

El modelo explica el 84.16 % de la variabilidad, considerando el número de predictores.

El modelo es globalmente significativo (p < 0.001).

Selección de variables mediante AIC:

# Seleccion paso a paso mediante AIC
mod_multiple1_step = step(mod_multiple1)
## Start:  AIC=9749.99
## precio ~ modelo + kilometraje + transmision
## 
##               Df  Sum of Sq        RSS     AIC
## <none>                      1.5211e+16  9750.0
## - kilometraje  1 4.1878e+14 1.5630e+16  9756.4
## - transmision  1 1.4756e+15 1.6687e+16  9776.6
## - modelo       1 3.0648e+16 4.5859e+16 10089.0
# Resumen del modelo seleccionado
summary(mod_multiple1_step)
## 
## Call:
## lm(formula = precio ~ modelo + kilometraje + transmision, data = datos_mazda2)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -67181235  -3005923        45   3823108  19398454 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         -6.965e+09  2.839e+08 -24.534  < 2e-16 ***
## modelo               3.484e+06  1.405e+05  24.789  < 2e-16 ***
## kilometraje         -3.761e+01  1.298e+01  -2.898  0.00403 ** 
## transmisionMecánica -4.474e+06  8.225e+05  -5.439  1.1e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7062000 on 305 degrees of freedom
## Multiple R-squared:  0.8432, Adjusted R-squared:  0.8416 
## F-statistic: 546.6 on 3 and 305 DF,  p-value: < 2.2e-16

Interpretación AIC:

Variables conservadas: año del modelo, kilometraje y transmisión.

Variables eliminadas: ninguna.

Resultado: el modelo seleccionado mantiene la misma especificación del modelo inicial.

Conclusión: los tres predictores aportan información relevante y se mantienen en el modelo según el procedimiento de selección AIC.

Gráfico de validación de supuestos:

# Graficas de diagnostico del modelo multiple 1
par(mfrow = c(2,2))
plot(mod_multiple1_step)

Interpretación:

Residuals vs Fitted (linealidad):

Se observa cierta curvatura en la línea roja, lo que sugiere posibles desviaciones del supuesto de linealidad.

También se identifican algunos residuos considerablemente alejados de cero.

Normal Q-Q (normalidad):

Los puntos se alejan de la línea de referencia en los extremos, especialmente en la cola izquierda.

Esto sugiere que los errores podrían no seguir una distribución normal.

Se destacan las observaciones 122, 295 y 276 como posibles valores atípicos.

Scale-Location (homocedasticidad):

La línea roja presenta variaciones y una ligera tendencia creciente.

Esto sugiere una posible varianza no constante de los errores (heterocedasticidad).

Residuals vs Leverage (observaciones influyentes):

Se identifican las observaciones 122, 295 y 276 con residuos estandarizados elevados y cierto apalancamiento.

Estas observaciones podrían ser influyentes y afectar los resultados de la regresión, por lo que requieren una revisión específica.

Identificar la observaciones influyentes:

# Identificar las observaciones señaladas
datos_mazda2[c(122, 295, 276),
             c("precio", "modelo", "kilometraje",
               "transmision", "departamento")]
precio modelo kilometraje transmision departamento
28900000 2017 12345 Mecánica Bogotá
25800000 2019 129000 Automática ValledelCauca
6800000 2022 17200 Mecánica ValledelCauca

Las observaciones 122, 295 y 276 fueron identificadas como potencialmente influyentes en el diagnóstico gráfico. Aunque presentan características diferentes, no existe evidencia suficiente para eliminarlas únicamente por sus residuos. Se requiere revisar su influencia estadística y verificar la información de los anuncios antes de tomar una decisión sobre su permanencia en la muestra.

Medir la influencia de las observaciones:

# Calcular la distancia de Cook
cook = cooks.distance(mod_multiple1_step)

# Identificar las 5 observaciones con mayor distancia de Cook
orden_cook = order(cook, decreasing = TRUE)

datos_mazda2[orden_cook[1:5],
             c("precio", "modelo", "kilometraje",
               "transmision", "departamento")]
precio modelo kilometraje transmision departamento
6800000 2022 17200 Mecánica ValledelCauca
25800000 2019 129000 Automática ValledelCauca
28900000 2017 12345 Mecánica Bogotá
98500000 2022 10 Automática Antioquia
35000000 2007 148000 Mecánica ValledelCauca
# Valor de referencia
4/nrow(datos_mazda2)
## [1] 0.01294498

Obtener valores exactos:

# Mostrar las cinco observaciones con mayor distancia de Cook
data.frame(
  observacion = orden_cook[1:5],
  distancia_cook = cook[orden_cook[1:5]]
)
observacion distancia_cook
276 276 0.4647382
295 295 0.2589428
122 122 0.0657141
18 18 0.0296301
281 281 0.0295467
# Contar observaciones que superan el umbral
sum(cook > 4/nrow(datos_mazda2))
## [1] 12

Interpretación: Se identificaron 12 observaciones con distancia de Cook superior al umbral de referencia (4/n).

Las observaciones 276, 295 y 122 presentan los valores más elevados, lo que indica una posible influencia importante sobre los coeficientes estimados.

Estos registros requieren revisión, ya que podrían afectar la estabilidad de las estimaciones. Sin embargo, no se eliminan automáticamente, pues su influencia estadística no implica necesariamente errores en los datos.

Se realiza una prueba de normalidad de los errores prueba de Shapiro-Wilk.

  • H₀: los residuos siguen una distribución normal.
  • H₁: los residuos no siguen una distribución normal. Si el valor p es menor a 0.05, rechazamos la hipótesis de normalidad.
# Prueba de normalidad de los residuos
shapiro.test(residuals(mod_multiple1_step))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(mod_multiple1_step)
## W = 0.78224, p-value < 2.2e-16

El estadístico obtenido fue \(W = 0.78224\), con un valor p inferior a 0.001.

Como el valor p es menor a 0.05, se rechaza H₀.

Por tanto, existe evidencia estadística de que los residuos no presentan una distribución normal.

Evaluar homocedasticidad:

  • H₀: existe homocedasticidad (varianza constante de los errores).
  • H₁: existe heterocedasticidad (varianza no constante). Si el valor p es menor a 0.05, rechazamos H₀.
# Cargar el paquete
library(lmtest)

# Prueba de homocedasticidad
bptest(mod_multiple1_step)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_multiple1_step
## BP = 6.9522, df = 3, p-value = 0.07344

El estadístico obtenido fue \(BP = 6.9522\), con 3 grados de libertad y un valor p de 0.07344.

Como el valor p es mayor a 0.05, no se rechaza H₀.

Por tanto, no existe evidencia estadística suficiente para afirmar que el modelo presenta heterocedasticidad.

Evaluar multicolinealidad:

# Calcular factores de inflacion de varianza (VIF)
# Sin instalar paquetes adicionales

X <- model.matrix(mod_multiple1_step)[, -1, drop = FALSE]

vif_resultados <- sapply(seq_len(ncol(X)), function(i) {

  datos_aux <- data.frame(
    variable = X[, i],
    X[, -i, drop = FALSE]
  )

  modelo_aux <- lm(variable ~ ., data = datos_aux)

  1 / (1 - summary(modelo_aux)$r.squared)
})

# Mostrar resultados
round(vif_resultados, 3)
## [1] 2.105 2.076 1.037

Modelo: VIF = 2.105. Presenta un nivel bajo de multicolinealidad.

Kilometraje: VIF = 2.076. Presenta un nivel bajo de multicolinealidad.

Transmisión: VIF = 1.037. Presenta una relación muy baja con los demás predictores.

Todos los valores VIF son inferiores a 5, por lo que no se evidencia un problema importante de multicolinealidad.

En consecuencia, las variables explicativas pueden mantenerse en el modelo sin que exista una inflación preocupante de sus varianzas por colinealidad.

Evaluar la independencia de los errores:

# Prueba de independencia de los errores
dwtest(mod_multiple1_step)
## 
##  Durbin-Watson test
## 
## data:  mod_multiple1_step
## DW = 1.9872, p-value = 0.4527
## alternative hypothesis: true autocorrelation is greater than 0

H₀: no existe autocorrelación positiva de primer orden en los errores.

H₁: existe autocorrelación positiva de primer orden en los errores.

El estadístico Durbin-Watson obtenido fue 1.9872, cercano a 2.

El valor p fue 0.4527, superior al nivel de significancia del 5 %.

Por tanto, no se rechaza H₀ y no se encuentra evidencia estadística de autocorrelación positiva de primer orden.

Revisar linealidad:

H₀: la forma funcional del modelo está correctamente especificada.

H₁: existen indicios de una posible especificación funcional incorrecta.

# Prueba RESET de Ramsey
resettest(mod_multiple1_step)
## 
##  RESET test
## 
## data:  mod_multiple1_step
## RESET = 26.597, df1 = 2, df2 = 303, p-value = 2.28e-11

Como el valor p es inferior a 0.05, se rechaza H₀.

Por tanto, existe evidencia de una posible especificación funcional incorrecta, lo que sugiere que la relación entre el precio y las variables explicativas podría no estar representada adecuadamente mediante una forma lineal.

Se evalua posible transformación logaritmica para la variable dependiente precio:

# Modelo multiple 1 con transformacion logaritmica
mod_multiple1_log = lm(log(precio) ~ modelo + kilometraje + transmision,
                       data = datos_mazda2)

# Mostrar resultados
summary(mod_multiple1_log)
## 
## Call:
## lm(formula = log(precio) ~ modelo + kilometraje + transmision, 
##     data = datos_mazda2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.40635 -0.04646  0.00707  0.08098  0.34292 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         -1.250e+02  7.215e+00 -17.325  < 2e-16 ***
## modelo               7.083e-02  3.572e-03  19.831  < 2e-16 ***
## kilometraje         -3.700e-07  3.299e-07  -1.122  0.26292    
## transmisionMecánica -7.230e-02  2.090e-02  -3.459  0.00062 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1795 on 305 degrees of freedom
## Multiple R-squared:  0.7569, Adjusted R-squared:  0.7545 
## F-statistic: 316.6 on 3 and 305 DF,  p-value: < 2.2e-16

Interpretación:

Modelo: por cada año más reciente del vehículo, el precio anunciado aumenta aproximadamente un 7.08 %, manteniendo constantes las demás variables.

Kilometraje: el coeficiente es negativo, pero no es estadísticamente significativo (p = 0.2629). Por tanto, no encontramos evidencia suficiente de una relación entre el kilometraje y el precio en esta especificación.

Transmisión: los vehículos mecánicos presentan un precio anunciado aproximadamente 7.0 % inferior al de los automáticos, manteniendo constantes las demás variables. La diferencia es estadísticamente significativa (p = 0.00062).

El modelo explica el 75.45 % considerando el número de predictores.

Conclusión: La transformación logarítmica mantiene la significancia del año del modelo y la transmisión, pero el kilometraje deja de ser estadísticamente significativo.

Revisar supuestos en el modelo transformado:

# Graficas de diagnostico del modelo transformado
par(mfrow = c(2,2))
plot(mod_multiple1_log)

Residuals vs Fitted (linealidad):

Los residuos se distribuyen alrededor de cero y la línea roja presenta una tendencia relativamente horizontal.

Sin embargo, se observan algunas desviaciones y valores atípicos, especialmente en las observaciones 122, 295 y 276.

Normal Q-Q (normalidad):

Los puntos se alejan considerablemente de la línea de referencia en el extremo izquierdo. Esto sugiere que los residuos no siguen una distribución normal, principalmente por la presencia de valores atípicos.

Scale-Location (homocedasticidad):

La línea roja presenta una tendencia relativamente estable, lo que sugiere una varianza aproximadamente constante. No obstante, se observan observaciones con residuos considerablemente elevados.

Residuals vs Leverage (observaciones influyentes):

Se identifican las observaciones 276, 295 y 104 con residuos estandarizados elevados y cierto apalancamiento. Estas observaciones podrían tener una influencia importante sobre los resultados del modelo.

Prueba de normalidad:

# Prueba de normalidad de los residuos
shapiro.test(residuals(mod_multiple1_log))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(mod_multiple1_log)
## W = 0.50135, p-value < 2.2e-16

Se obtuvo un estadístico \(W = 0.50135\), con un valor p inferior a 0.001, como el valor p es menor a 0.05, se rechaza H₀. Por tanto, los residuos no presentan una distribución normal.

Comapración: la transformación logarítmica no solucionó el problema de normalidad; incluso el estadístico W disminuyó respecto al modelo original (0.78224).

Prueba de homocedasticidad:

# Prueba de homocedasticidad
bptest(mod_multiple1_log)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_multiple1_log
## BP = 5.0838, df = 3, p-value = 0.1658

Se obtuvo un estadístico \(BP = 5.0838\), con un valor p de 0.1658. Como el valor p es mayor a 0.05, no se rechaza H₀. Por tanto, no se encuentra evidencia estadística de heterocedasticidad.

Comparación: la transformación logarítmica mejora el resultado frente al modelo original (valor p pasó de 0.07344 a 0.1658), proporcionando mayor evidencia a favor de la homocedasticidad.

Prueba de multicolinealidad:

# Calcular factores de inflación de varianza (VIF)
X <- model.matrix(mod_multiple1_log)[, -1, drop = FALSE]

vif_resultados <- sapply(seq_len(ncol(X)), function(i) {
  modelo_aux <- lm(X[, i] ~ X[, -i, drop = FALSE])
  1 / (1 - summary(modelo_aux)$r.squared)
})

round(vif_resultados, 3)
## [1] 2.105 2.076 1.037

Todos los valores son inferiores a 5, por lo que no se evidencia un problema importante de multicolinealidad. Las variables explicativas pueden mantenerse en el modelo.

Comparación: los valores VIF son exactamente iguales a los del modelo original. Esto es esperable porque la transformación del precio no modifica las relaciones entre las variables explicativas.

Prueba de independencia de los errores:

# Prueba de independencia de los errores
dwtest(mod_multiple1_log)
## 
##  Durbin-Watson test
## 
## data:  mod_multiple1_log
## DW = 1.9605, p-value = 0.3615
## alternative hypothesis: true autocorrelation is greater than 0

DW = 1.9605 y p = 0.3615; no se rechaza H₀, por lo que no se encuentra evidencia de autocorrelación positiva de primer orden.

Comparación: el resultado es similar al modelo original (DW = 1.9872; p = 0.4527), por lo que la transformación logarítmica no genera cambios relevantes en esta prueba.

Verificar si la transformación logarítmica mejoró la especificación funcional respecto al modelo original:

# Prueba de especificacion funcional
resettest(mod_multiple1_log)
## 
##  RESET test
## 
## data:  mod_multiple1_log
## RESET = 4.8697, df1 = 2, df2 = 303, p-value = 0.008287

RESET = 4.8697 y p = 0.008287; se rechaza H₀, por lo que persisten indicios de una posible especificación funcional incorrecta.

Comparación: la transformación logarítmica mejora la especificación frente al modelo original (p pasó de 2.28e-11 a 0.008287), pero no soluciona completamente el problema.

Comparar si las observaciones influyentes del modelo original siguen teniendo influencia después de la transformación:

# Calcular distancia de Cook del modelo transformado
cook_log = cooks.distance(mod_multiple1_log)

# Identificar las cinco observaciones mas influyentes
orden_cook_log = order(cook_log, decreasing = TRUE)

data.frame(
  observacion = orden_cook_log[1:5],
  distancia_cook = cook_log[orden_cook_log[1:5]]
)
observacion distancia_cook
276 276 0.9231464
295 295 0.2205981
104 104 0.0658658
112 112 0.0658658
122 122 0.0483615
# Umbral de referencia
4/nrow(datos_mazda2)
## [1] 0.01294498
# Contar observaciones que superan el umbral
sum(cook_log > 4/nrow(datos_mazda2))
## [1] 6

6 observaciones superan el umbral de referencia de 0.01294, por lo que presentan posible influencia sobre los resultados del modelo transformado.

Comparación: frente a las 12 observaciones del modelo original, la transformación logarítmica reduce a la mitad el número de observaciones potencialmente influyentes.

Conclusión: la transformación mejora el comportamiento respecto a la influencia de observaciones, aunque todavía persisten algunos registros que requieren revisión.

Identificar observaciones con mayor influencia:

data.frame(
  observacion = orden_cook_log[1:5],
  distancia_cook = cook_log[orden_cook_log[1:5]]
)
observacion distancia_cook
276 276 0.9231464
295 295 0.2205981
104 104 0.0658658
112 112 0.0658658
122 122 0.0483615

La observación 276 presenta la mayor distancia de Cook (0.9231), indicando una influencia considerable.

Le siguen las observaciones 295, 104, 112 y 122.

Las observaciones 276, 295 y 122 también aparecían entre las más influyentes del modelo original.

Comparación del MAE:

# Predicciones del modelo original
pred_original = predict(mod_multiple1_step)

# Predicciones del modelo transformado en pesos
pred_log = exp(predict(mod_multiple1_log))

# Calcular MAE de ambos modelos
mae_original = mean(abs(datos_mazda2$precio - pred_original))
mae_log = mean(abs(datos_mazda2$precio - pred_log))

# Comparar resultados
mae_original
## [1] 4461553
mae_log
## [1] 4027108

El modelo original presenta un error absoluto medio de aproximadamente $4.461.553 COP.

El modelo transformado presenta un MAE de aproximadamente $4.027.108 COP.

La transformación logarítmica reduce el error promedio de predicción en aproximadamente $434.445 COP (9,74 %).

Por tanto, el modelo transformado muestra un mejor desempeño predictivo dentro de la muestra.

Validación Cruzada:

# Crear vectores para almacenar las predicciones
pred_multiple1_original_cv = rep(NA, nrow(datos_mazda2))
pred_multiple1_log_cv = rep(NA, nrow(datos_mazda2))
# Validacion cruzada de 5 particiones - Modelo multiple 1

for (i in 1:5) {

  # Separar datos de entrenamiento y validacion
  train = datos_mazda2[folds != i, ]
  test = datos_mazda2[folds == i, ]

  # Definir categoria de referencia
  train$transmision = factor(train$transmision,
                             levels = c("Automática", "Mecánica"))
  test$transmision = factor(test$transmision,
                            levels = c("Automática", "Mecánica"))

  # Modelo original con seleccion AIC
  modelo_original_cv = lm(precio ~ modelo + kilometraje + transmision,
                          data = train)

  modelo_original_step_cv = step(modelo_original_cv,
                                 direction = "both", trace = 0)

  pred_multiple1_original_cv[folds == i] =
    predict(modelo_original_step_cv, newdata = test)

  # Modelo transformado con seleccion AIC
  modelo_log_cv = lm(log(precio) ~ modelo + kilometraje + transmision,
                     data = train)

  modelo_log_step_cv = step(modelo_log_cv,
                            direction = "both", trace = 0)

  pred_multiple1_log_cv[folds == i] =
    exp(predict(modelo_log_step_cv, newdata = test))
}
# Calcular MAE de validacion cruzada
mae_multiple1_original_cv =
  mean(abs(datos_mazda2$precio - pred_multiple1_original_cv))

mae_multiple1_log_cv =
  mean(abs(datos_mazda2$precio - pred_multiple1_log_cv))

# Mostrar resultados
mae_multiple1_original_cv
## [1] 4565883
mae_multiple1_log_cv
## [1] 4256822

Interpretación MAE: El modelo original presenta un MAE de $4.565.883 COP.

El modelo transformado presenta un MAE de $4.256.822 COP.

La transformación logarítmica reduce el error promedio de predicción en aproximadamente $309.061 COP (6,77 %).

Por tanto, el modelo transformado presenta mejor desempeño predictivo en validación cruzada.

Conclusión:

Aunque la transformación no solucionó todos los problemas de los supuestos, obtuvo un menor MAE tanto dentro de la muestra como en validación cruzada, por lo cual se utilizará para la comparación final.

Modelo Múltiple 2: precio e interaccion entre modelo y kilometraje

Definir variables:

# Variable dependiente
y_multiple2 = datos_mazda2$precio

# Variables independientes
x_modelo_multiple2 = datos_mazda2$modelo
x_kilometraje_multiple2 = datos_mazda2$kilometraje

# Variable categorica
x_transmision_multiple2 = datos_mazda2$transmision

Estimar el modelo:

# Modelo multiple 2: interaccion entre modelo y kilometraje

mod_multiple2_interaccion = lm(
  y_multiple2 ~ x_modelo_multiple2 +
    x_kilometraje_multiple2 +
    x_transmision_multiple2 +
    x_modelo_multiple2:x_kilometraje_multiple2
)

# Resultados
summary(mod_multiple2_interaccion)
## 
## Call:
## lm(formula = y_multiple2 ~ x_modelo_multiple2 + x_kilometraje_multiple2 + 
##     x_transmision_multiple2 + x_modelo_multiple2:x_kilometraje_multiple2)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -70255442  -2988494    211539   3571514  16477738 
## 
## Coefficients:
##                                              Estimate Std. Error t value
## (Intercept)                                -8.219e+09  3.398e+08 -24.189
## x_modelo_multiple2                          4.106e+06  1.684e+05  24.387
## x_kilometraje_multiple2                     2.627e+04  4.363e+03   6.021
## x_transmision_multiple2Mecánica            -3.850e+06  7.854e+05  -4.902
## x_modelo_multiple2:x_kilometraje_multiple2 -1.307e+01  2.168e+00  -6.029
##                                            Pr(>|t|)    
## (Intercept)                                 < 2e-16 ***
## x_modelo_multiple2                          < 2e-16 ***
## x_kilometraje_multiple2                    5.00e-09 ***
## x_transmision_multiple2Mecánica            1.55e-06 ***
## x_modelo_multiple2:x_kilometraje_multiple2 4.77e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6685000 on 304 degrees of freedom
## Multiple R-squared:  0.8599, Adjusted R-squared:  0.8581 
## F-statistic: 466.6 on 4 and 304 DF,  p-value: < 2.2e-16

Interpretaciones del modelo:

Modelo: el coeficiente es positivo (4.106.000), pero su interpretación debe considerar la interacción con el kilometraje.

Kilometraje: el coeficiente es positivo (26.270), pero tampoco debe interpretarse aisladamente debido a la interacción.

Transmisión mecánica: los vehículos mecánicos presentan un precio estimado $3.850.000 COP menor que los automáticos, manteniendo constantes las demás variables y considerando el año de referencia de la interacción.

Interacción modelo × kilometraje: el coeficiente es negativo (-0,1307) y estadísticamente significativo (p menor a 0,001). Esto indica que el efecto del kilometraje sobre el precio disminuye a medida que aumenta el año del vehículo.

El modelo explica aproximadamente el 85,81 % de la variabilidad del precio anunciado.

El modelo es estadísticamente significativo (p menor a 0,001).

Validación AIC:

# Seleccion paso a paso mediante AIC

mod_multiple2_interaccion_step = step(
  mod_multiple2_interaccion,
  direction = "both"
)
## Start:  AIC=9717.09
## y_multiple2 ~ x_modelo_multiple2 + x_kilometraje_multiple2 + 
##     x_transmision_multiple2 + x_modelo_multiple2:x_kilometraje_multiple2
## 
##                                              Df  Sum of Sq        RSS    AIC
## <none>                                                     1.3587e+16 9717.1
## - x_transmision_multiple2                     1 1.0738e+15 1.4661e+16 9738.6
## - x_modelo_multiple2:x_kilometraje_multiple2  1 1.6246e+15 1.5211e+16 9750.0
# Resultados del modelo seleccionado
summary(mod_multiple2_interaccion_step)
## 
## Call:
## lm(formula = y_multiple2 ~ x_modelo_multiple2 + x_kilometraje_multiple2 + 
##     x_transmision_multiple2 + x_modelo_multiple2:x_kilometraje_multiple2)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -70255442  -2988494    211539   3571514  16477738 
## 
## Coefficients:
##                                              Estimate Std. Error t value
## (Intercept)                                -8.219e+09  3.398e+08 -24.189
## x_modelo_multiple2                          4.106e+06  1.684e+05  24.387
## x_kilometraje_multiple2                     2.627e+04  4.363e+03   6.021
## x_transmision_multiple2Mecánica            -3.850e+06  7.854e+05  -4.902
## x_modelo_multiple2:x_kilometraje_multiple2 -1.307e+01  2.168e+00  -6.029
##                                            Pr(>|t|)    
## (Intercept)                                 < 2e-16 ***
## x_modelo_multiple2                          < 2e-16 ***
## x_kilometraje_multiple2                    5.00e-09 ***
## x_transmision_multiple2Mecánica            1.55e-06 ***
## x_modelo_multiple2:x_kilometraje_multiple2 4.77e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6685000 on 304 degrees of freedom
## Multiple R-squared:  0.8599, Adjusted R-squared:  0.8581 
## F-statistic: 466.6 on 4 and 304 DF,  p-value: < 2.2e-16

El modelo inicial presentó un AIC de 9717,09. La selección paso a paso indicó que eliminar la variable de transmisión o la interacción entre año y kilometraje aumenta el AIC (9738,6 y 9750,0, respectivamente). Por tanto, se conserva el modelo completo, ya que presenta el menor AIC.

Validación de supuestos:

# Gráficos de diagnóstico del Modelo Múltiple 2
par(mfrow = c(2, 2))

plot(mod_multiple2_interaccion)

par(mfrow = c(1, 1))

Residuals vs Fitted (linealidad):

Se observa cierta curvatura en la línea roja, lo que sugiere que podrían persistir problemas de especificación funcional o falta de linealidad.

Q-Q Residuals (normalidad):

Los puntos se alejan considerablemente de la línea de referencia en las colas, especialmente las observaciones 122, 295 y 276. Esto indica que los residuos no siguen una distribución normal.

Scale-Location (homocedasticidad):

La dispersión de los residuos presenta algunas variaciones y la línea roja muestra una ligera tendencia ascendente, lo que sugiere posible heterocedasticidad.

Residuals vs Leverage (observaciones influyentes):

Se identifican las observaciones 122, 295 y 276 con residuos estandarizados elevados. La observación 276 destaca por su mayor influencia potencial y debe revisarse mediante la distancia de Cook.

Conclusión general:

El modelo presenta posibles problemas de linealidad, normalidad y observaciones influyentes. La homocedasticidad también debe verificarse mediante su prueba estadística.

Pruebas estadísticas de los supuestos:

Prueba de normalidad – Shapiro-Wilk: H₀: Los residuos siguen una distribución normal.

H₁: Los residuos no siguen una distribución normal.

# Prueba de normalidad de los residuos
shapiro.test(residuals(mod_multiple2_interaccion_step))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(mod_multiple2_interaccion_step)
## W = 0.73926, p-value < 2.2e-16

El valor p es menor a 0,05, por lo tanto, se rechaza la hipótesis nula. Se concluye que los residuos no siguen una distribución normal, lo cual coincide con lo observado en la gráfica Q-Q.

Prueba de homocedasticidad – Breusch-Pagan:

H₀: Existe homocedasticidad (la varianza de los errores es constante).

H₁: Existe heterocedasticidad (la varianza de los errores no es constante).

# Prueba de homocedasticidad
bptest(mod_multiple2_interaccion_step)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_multiple2_interaccion_step
## BP = 8.8586, df = 4, p-value = 0.06473

El valor p = 0,06473 es mayor a 0,05, por lo tanto, no se rechaza la hipótesis nula. No existe evidencia estadísticamente significativa de heterocedasticidad; se considera que el supuesto de homocedasticidad se cumple al 5 %.

Prueba de multicolinealidad – Factor de inflación de varianza (VIF):

# Calcular factores de inflación de varianza (VIF)
X <- model.matrix(mod_multiple2_interaccion_step)[, -1, drop = FALSE]

vif_resultados <- sapply(seq_len(ncol(X)), function(i) {
  modelo_aux <- lm(X[, i] ~ X[, -i, drop = FALSE])
  1 / (1 - summary(modelo_aux)$r.squared)
})

# Mostrar resultados
round(vif_resultados, 3)
## [1]      3.371 261680.100      1.056 260872.081

Los resultados evidencian multicolinealidad elevada entre el kilometraje y el término de interacción. Esto puede incrementar los errores estándar y dificultar la interpretación individual de sus coeficientes.

Prueba de independencia de los errores – Durbin-Watson:

H₀: No existe autocorrelación de primer orden en los errores.

H₁: Existe autocorrelación positiva de primer orden en los errores.

# Prueba de independencia de los errores
dwtest(mod_multiple2_interaccion_step)
## 
##  Durbin-Watson test
## 
## data:  mod_multiple2_interaccion_step
## DW = 1.9258, p-value = 0.2537
## alternative hypothesis: true autocorrelation is greater than 0

El valor p = 0,2537 es mayor a 0,05, por lo tanto, no se rechaza la hipótesis nula. No se encuentra evidencia de autocorrelación positiva de primer orden en los errores.

Prueba RESET de Ramsey:

# Prueba RESET de Ramsey
resettest(mod_multiple2_interaccion_step)
## 
##  RESET test
## 
## data:  mod_multiple2_interaccion_step
## RESET = 4.8637, df1 = 2, df2 = 302, p-value = 0.008337

El valor p = 0,008337 es menor a 0,05, por lo tanto, se rechaza la hipótesis nula. Existe evidencia de una posible especificación funcional incorrecta o de variables relevantes omitidas en el modelo.

Prueba de distancia de Cook:

# Identificar observaciones influyentes
cook_multiple2 = cooks.distance(mod_multiple2_interaccion_step)

# Ordenar las observaciones por distancia de Cook
orden_cook_multiple2 = order(cook_multiple2, decreasing = TRUE)

# Mostrar las cinco observaciones más influyentes
data.frame(
  observacion = orden_cook_multiple2[1:5],
  distancia_cook = cook_multiple2[orden_cook_multiple2[1:5]]
)
observacion distancia_cook
276 276 0.5944696
295 295 0.3396018
122 122 0.0691925
18 18 0.0291914
281 281 0.0291705
# Criterio de referencia
4 / nrow(datos_mazda2)
## [1] 0.01294498
# Número de observaciones que superan el criterio
sum(cook_multiple2 > 4 / nrow(datos_mazda2))
## [1] 12

El criterio de referencia es 0,0129 y se identificaron 12 observaciones que superan este valor. Esto indica que existen observaciones potencialmente influyentes que podrían afectar los resultados y la estimación de los coeficientes del modelo.

MAE:

# Validación cruzada de cinco particiones:
# Modelo Múltiple 2 sin transformaciones

# Crear vector para almacenar las predicciones
pred_multiple2_original_cv = rep(NA, nrow(datos_mazda2))

for (i in 1:5) {

  # Separar datos de entrenamiento y validación
  train = datos_mazda2[folds != i, ]
  test = datos_mazda2[folds == i, ]

  # Establecer la misma categoría de referencia
  train$transmision = factor(
    train$transmision,
    levels = c("Automática", "Mecánica")
  )

  test$transmision = factor(
    test$transmision,
    levels = c("Automática", "Mecánica")
  )

  # Estimar el modelo original con interacción
  modelo_cv = lm(
    precio ~ modelo + kilometraje +
      transmision + modelo:kilometraje,
    data = train
  )

  # Predecir precios para los datos de validación
  pred_multiple2_original_cv[folds == i] =
    predict(modelo_cv, newdata = test)
}

# Calcular el error absoluto medio (MAE)
mae_multiple2_original_cv = mean(
  abs(datos_mazda2$precio - pred_multiple2_original_cv)
)

# Mostrar resultado
mae_multiple2_original_cv
## [1] 4183291

En promedio, las predicciones del precio anunciado presentan una desviación absoluta de aproximadamente $4,18 millones respecto a los valores observados.

Transformación logaritmica:

# Definir variables transformadas del Modelo Múltiple 2

y_multiple2_log = log(datos_mazda2$precio)

x_modelo_multiple2_log = datos_mazda2$modelo

x_kilometraje_multiple2_log = log1p(datos_mazda2$kilometraje)

x_transmision_multiple2_log = factor(
  datos_mazda2$transmision,
  levels = c("Automática", "Mecánica")
)

Estimar el modelo con interacción transformado:

# Estimar el Modelo Múltiple 2 transformado

datos_multiple2_log = data.frame(
  y_multiple2_log,
  x_modelo_multiple2_log,
  x_kilometraje_multiple2_log,
  x_transmision_multiple2_log
)

mod_multiple2_log = lm(
  y_multiple2_log ~
    x_modelo_multiple2_log +
    x_kilometraje_multiple2_log +
    x_transmision_multiple2_log +
    x_modelo_multiple2_log:x_kilometraje_multiple2_log,
  data = datos_multiple2_log
)

# Mostrar resultados
summary(mod_multiple2_log)
## 
## Call:
## lm(formula = y_multiple2_log ~ x_modelo_multiple2_log + x_kilometraje_multiple2_log + 
##     x_transmision_multiple2_log + x_modelo_multiple2_log:x_kilometraje_multiple2_log, 
##     data = datos_multiple2_log)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.40010 -0.04834  0.00752  0.08067  0.31687 
## 
## Coefficients:
##                                                      Estimate Std. Error
## (Intercept)                                        -1.560e+02  1.738e+01
## x_modelo_multiple2_log                              8.621e-02  8.614e-03
## x_kilometraje_multiple2_log                         2.707e+00  1.665e+00
## x_transmision_multiple2_logMecánica                -6.948e-02  2.094e-02
## x_modelo_multiple2_log:x_kilometraje_multiple2_log -1.344e-03  8.258e-04
##                                                    t value Pr(>|t|)    
## (Intercept)                                         -8.976  < 2e-16 ***
## x_modelo_multiple2_log                              10.008  < 2e-16 ***
## x_kilometraje_multiple2_log                          1.625  0.10513    
## x_transmision_multiple2_logMecánica                 -3.318  0.00102 ** 
## x_modelo_multiple2_log:x_kilometraje_multiple2_log  -1.628  0.10454    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1791 on 304 degrees of freedom
## Multiple R-squared:  0.7587, Adjusted R-squared:  0.7556 
## F-statistic:   239 on 4 and 304 DF,  p-value: < 2.2e-16

Interpretaciones modelo estimado:

Año del modelo: presenta un coeficiente positivo y significativo (p < 0,001). Su efecto sobre el precio depende del kilometraje debido a la interacción incluida.

Kilometraje: el coeficiente es positivo, pero no es estadísticamente significativo (p = 0,105). No encontramos evidencia suficiente de un efecto individual del kilometraje en esta especificación.

Transmisión mecánica: manteniendo constantes las demás variables, los vehículos mecánicos presentan un precio anunciado aproximadamente 6,7 % menor que los automáticos.

Interacción año × kilometraje: tiene signo negativo, pero no es estadísticamente significativa (p = 0,1045). No encontramos evidencia suficiente de que el efecto del año sobre el precio cambie según el kilometraje.

El modelo explica aproximadamente el 75,56 % de la variabilidad del logaritmo del precio.

El modelo es estadísticamente significativo (p < 0,001).

Validación de supuestos:

par(mfrow = c(2, 2))
plot(mod_multiple2_log)

par(mfrow = c(1, 1))

Residuals vs Fitted:

Los residuos se distribuyen alrededor de cero, aunque se observa cierta curvatura en la línea roja y algunos valores atípicos. La relación lineal no queda completamente garantizada.

Q-Q Residuals:

Los puntos se alejan considerablemente de la línea de referencia en la cola izquierda, lo que evidencia que los residuos no siguen una distribución normal.

Scale-Location:

La línea roja presenta una ligera tendencia descendente y la dispersión no es completamente uniforme. Esto sugiere posibles indicios de heterocedasticidad.

Residuals vs Leverage:

Se identifican observaciones con residuos estandarizados elevados, especialmente las 276, 295 y 122. La observación 276 presenta una influencia potencial importante y debe revisarse.

En conclusión, el modelo transformado logartimicamente permite observar una distribución de residuos más concentrada alrededor de cero, pero no soluciona completamente los problemas de normalidad ni los valores atípicos e influyentes. Por tanto, todavía debemos revisar las pruebas estadísticas antes de decidir cuál especificación conservar.

Prueba de normalidad – Shapiro-Wilk:

# Prueba de normalidad de los residuos
shapiro.test(residuals(mod_multiple2_log))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(mod_multiple2_log)
## W = 0.50157, p-value < 2.2e-16

Se rechaza la hipótesis nula de normalidad, por lo que existe evidencia estadística de que los residuos no siguen una distribución normal.

Prueba de homocedasticidad:

# Prueba de homocedasticidad
bptest(mod_multiple2_log)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_multiple2_log
## BP = 5.382, df = 4, p-value = 0.2503

Como el valor p es mayor a 0,05, no se rechaza la hipótesis nula de homocedasticidad. No se encuentra evidencia estadística de heterocedasticidad; por tanto, la varianza de los errores puede considerarse constante.

Prueba de multicolinealidad:

# Calcular factores de inflación de varianza (VIF)
X <- model.matrix(mod_multiple2_log)[, -1, drop = FALSE]

vif_resultados <- sapply(seq_len(ncol(X)), function(i) {
  modelo_aux <- lm(X[, i] ~ X[, -i, drop = FALSE])
  1 / (1 - summary(modelo_aux)$r.squared)
})

round(vif_resultados, 3)
## [1]     12.295 136131.733      1.046 135302.808

NOTA:

Debido a la alta multicolinealidad identificada, se decide centrar las variables de año y kilometraje antes de construir la interacción:

# Centrar las variables cuantitativas

x_modelo_multiple2_c = 
  x_modelo_multiple2_log - mean(x_modelo_multiple2_log)

x_kilometraje_multiple2_c = 
  x_kilometraje_multiple2_log - mean(x_kilometraje_multiple2_log)

Estimar el nuevo modelo:

# Crear base de datos del nuevo modelo

datos_multiple2_c = data.frame(
  y_multiple2_log,
  x_modelo_multiple2_c,
  x_kilometraje_multiple2_c,
  x_transmision_multiple2_log
)

# Estimar modelo con interacción y variables centradas

mod_multiple2_c = lm(
  y_multiple2_log ~
    x_modelo_multiple2_c +
    x_kilometraje_multiple2_c +
    x_transmision_multiple2_log +
    x_modelo_multiple2_c:x_kilometraje_multiple2_c,
  data = datos_multiple2_c
)

summary(mod_multiple2_c)
## 
## Call:
## lm(formula = y_multiple2_log ~ x_modelo_multiple2_c + x_kilometraje_multiple2_c + 
##     x_transmision_multiple2_log + x_modelo_multiple2_c:x_kilometraje_multiple2_c, 
##     data = datos_multiple2_c)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.40010 -0.04834  0.00752  0.08067  0.31687 
## 
## Coefficients:
##                                                  Estimate Std. Error  t value
## (Intercept)                                    17.6782009  0.0142179 1243.379
## x_modelo_multiple2_c                            0.0720533  0.0026924   26.762
## x_kilometraje_multiple2_c                      -0.0022738  0.0050253   -0.452
## x_transmision_multiple2_logMecánica            -0.0694804  0.0209417   -3.318
## x_modelo_multiple2_c:x_kilometraje_multiple2_c -0.0013445  0.0008258   -1.628
##                                                Pr(>|t|)    
## (Intercept)                                     < 2e-16 ***
## x_modelo_multiple2_c                            < 2e-16 ***
## x_kilometraje_multiple2_c                       0.65126    
## x_transmision_multiple2_logMecánica             0.00102 ** 
## x_modelo_multiple2_c:x_kilometraje_multiple2_c  0.10454    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1791 on 304 degrees of freedom
## Multiple R-squared:  0.7587, Adjusted R-squared:  0.7556 
## F-statistic:   239 on 4 and 304 DF,  p-value: < 2.2e-16

Interpretación del modelo:

Año del modelo: presenta un efecto positivo y estadísticamente significativo (β = 0,0721; p < 0,001). Manteniendo las demás variables constantes, un año más reciente se relaciona con un aumento aproximado del 7,47 % en el precio anunciado.

Kilometraje: presenta un coeficiente negativo, pero no es estadísticamente significativo (p = 0,6513). No encontramos evidencia suficiente de un efecto individual sobre el precio.

Transmisión mecánica: manteniendo constantes las demás variables, los vehículos mecánicos presentan un precio aproximadamente 6,7 % menor que los automáticos (p = 0,001).

Interacción año × kilometraje: presenta signo negativo, pero no es estadísticamente significativa (p = 0,1045). No hay evidencia suficiente de que el efecto del año sobre el precio dependa del kilometraje.

El modelo explica el 75,56 % de la variabilidad del logaritmo del precio.

El modelo es estadísticamente significativo (p < 0,001).

Ejecutar prueba de multicolinealidad:

# Calcular factores de inflación de varianza (VIF)
X <- model.matrix(mod_multiple2_c)[, -1, drop = FALSE]

vif_resultados <- sapply(seq_len(ncol(X)), function(i) {
  modelo_aux <- lm(X[, i] ~ X[, -i, drop = FALSE])
  1 / (1 - summary(modelo_aux)$r.squared)
})

round(vif_resultados, 3)
## [1] 1.201 1.240 1.046 1.195

Interpretación multicolinealidad.

Todos los factores de inflación de varianza son cercanos a 1 y están por debajo de 5. Por tanto, no se evidencia multicolinealidad preocupante en el modelo centrado.

Comparación: El centrado redujo los VIF del kilometraje y la interacción, que anteriormente superaban los 100. Ahora podemos continuar con el diagnóstico del modelo.

Se realizan las demás pruebas estadisticas:

Validación de supuestos:

par(mfrow = c(2, 2))
plot(mod_multiple2_c)

par(mfrow = c(1, 1))

Residuals vs Fitted:

Los residuos se distribuyen alrededor de cero, aunque se observa una ligera curvatura y algunos valores atípicos. La relación lineal no parece cumplirse perfectamente.

Q-Q Residuals:

Los puntos se alejan de la línea de referencia, especialmente en la cola izquierda. Esto sugiere que los residuos no siguen una distribución normal.

Scale-Location:

La dispersión de los residuos no es completamente uniforme y la línea roja presenta una ligera tendencia descendente. Se deben verificar posibles problemas de heterocedasticidad mediante la prueba estadística.

Residuals vs Leverage:

Se identifican observaciones potencialmente influyentes, especialmente la 276, seguida de la 295 y la 122. Es necesario revisar estos registros antes de tomar decisiones sobre su permanencia.

Prueba de normalidad:

shapiro.test(residuals(mod_multiple2_c))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(mod_multiple2_c)
## W = 0.50157, p-value < 2.2e-16

Teniendo en cuenta que W = 0,50157 y valor p < 0,001. Se rechaza la hipótesis nula de normalidad. Por tanto, existe evidencia estadística de que los residuos no siguen una distribución normal.

Prueba de homocedasticidad:

bptest(mod_multiple2_c)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_multiple2_c
## BP = 5.382, df = 4, p-value = 0.2503

Como el valor p es mayor a 0,05, no rechazamos la hipótesis nula de homocedasticidad. No encontramos evidencia estadística de heterocedasticidad; por tanto, la varianza de los errores puede considerarse constante.

Prueba de Durbin Watson:

dwtest(mod_multiple2_c)
## 
##  Durbin-Watson test
## 
## data:  mod_multiple2_c
## DW = 1.9827, p-value = 0.4344
## alternative hypothesis: true autocorrelation is greater than 0

Como el valor p es mayor a 0,05, no se rechaza la hipótesis nula de ausencia de autocorrelación positiva. No se encuentra evidencia estadística de autocorrelación positiva en los errores.

Prueba Reset de Ramsey:

resettest(mod_multiple2_c)
## 
##  RESET test
## 
## data:  mod_multiple2_c
## RESET = 7.1476, df1 = 2, df2 = 302, p-value = 0.000927

Como el valor p es menor a 0,05, se rechaza la hipótesis nula de correcta especificación funcional. Esto indica que existen evidencias de posibles errores en la forma funcional del modelo o de variables relevantes omitidas.

Prueba de distancia de Cook:

# Calcular distancias de Cook del modelo centrado
cook_multiple2_c = cooks.distance(mod_multiple2_c)

# Criterio de referencia
limite_cook_multiple2_c = 4 / nrow(datos_mazda2)

# Contar observaciones que superan el límite
sum(cook_multiple2_c > limite_cook_multiple2_c)
## [1] 7

Indentificar observaciones de mayor distancia:

# Ordenar las distancias de mayor a menor
orden_cook_multiple2_c = order(cook_multiple2_c,
                               decreasing = TRUE)

# Mostrar las cinco observaciones más influyentes
data.frame(
  observacion = orden_cook_multiple2_c[1:5],
  distancia_cook = cook_multiple2_c[orden_cook_multiple2_c[1:5]]
)
observacion distancia_cook
276 276 0.7448914
295 295 0.0691951
104 104 0.0427565
112 112 0.0427565
122 122 0.0216076

Revisar las observaciones:

# Revisar las observaciones más influyentes
datos_mazda2[c(276, 295, 104, 112, 122),
             c("precio", "modelo", "kilometraje",
               "transmision", "ciudad")]
precio modelo kilometraje transmision ciudad
6800000 2022 17200 Mecánica Cali
25800000 2019 129000 Automática Cali
22000000 2008 136 Automática Bogotá
22000000 2008 136 Automática Bogotá
28900000 2017 12345 Mecánica Bogotá

Verificar anuncios:

# Revisar información completa de las observaciones influyentes
datos_mazda2[c(276, 295, 104, 112, 122), ]
precio kilometraje transmision modelo color ciudad departamento web-scraper-order web-scraper-start-url link link-href
6800000 17200 Mecánica 2022 Plateado Cali ValledelCauca 1662991596-194 https://www.olx.com.co/items/q-mazda-2 $ 6.800.0002022 - 17.200 kmSe vende hermoso Mazda 2 turing como nuevoLa Playa, Cali28 ago https://www.olx.com.co/item/se-vende-hermoso-mazda-2-turing-como-nuevo-iid-1116749715
25800000 129000 Automática 2019 Blanco Cali ValledelCauca 1662991966-325 https://www.olx.com.co/items/q-mazda-2 $ 25.800.0002019 - 129.000 kmMAZDA 2 2009 Hatchback Automatico 1.500Vipasa, Calihace 6 días https://www.olx.com.co/item/mazda-2-2009-hatchback-automatico-1500-iid-1116851172
22000000 136 Automática 2008 Negro Bogotá Bogotá 1662991583-190 https://www.olx.com.co/items/q-mazda-2 $ 22.000.0002008 - 136 kmHERMOSO MAZDA 2 EN VETA PARA USO PERSONAL (SALVAMENTO)Los Pinos De Marsella, Kennedy28 ago https://www.olx.com.co/item/hermoso-mazda-2-en-veta-para-uso-personal-salvamento-iid-1116744500
22000000 136 Automática 2008 Negro Bogotá Bogotá 1662991743-245 https://www.olx.com.co/items/q-mazda-2 $ 22.000.0002008 - 136 kmVendo hermoso Mazda 2 modelo 2008 (SALVAMENMarsella Aloha Sector Sur, Kennedy01 sept https://www.olx.com.co/item/vendo-hermoso-mazda-2-modelo-2008-salvamen-iid-1116790017
28900000 12345 Mecánica 2017 Rojo Bogotá Bogotá 1662991994-335 https://www.olx.com.co/items/q-mazda-2 $ 28.900.0002017 - 12.345 kmMAZDA 2 TOURING MECANICOQuinta Mutis, Barrios Unidoshace 5 días https://www.olx.com.co/item/mazda-2-touring-mecanico-iid-1116859392

Verificar enlaces originales:

# Revisar los enlaces de las observaciones seleccionadas
datos_mazda2[c(276, 295, 104, 112, 122),
             c("link", "link-href")]
link link-href
$ 6.800.0002022 - 17.200 kmSe vende hermoso Mazda 2 turing como nuevoLa Playa, Cali28 ago https://www.olx.com.co/item/se-vende-hermoso-mazda-2-turing-como-nuevo-iid-1116749715
$ 25.800.0002019 - 129.000 kmMAZDA 2 2009 Hatchback Automatico 1.500Vipasa, Calihace 6 días https://www.olx.com.co/item/mazda-2-2009-hatchback-automatico-1500-iid-1116851172
$ 22.000.0002008 - 136 kmHERMOSO MAZDA 2 EN VETA PARA USO PERSONAL (SALVAMENTO)Los Pinos De Marsella, Kennedy28 ago https://www.olx.com.co/item/hermoso-mazda-2-en-veta-para-uso-personal-salvamento-iid-1116744500
$ 22.000.0002008 - 136 kmVendo hermoso Mazda 2 modelo 2008 (SALVAMENMarsella Aloha Sector Sur, Kennedy01 sept https://www.olx.com.co/item/vendo-hermoso-mazda-2-modelo-2008-salvamen-iid-1116790017
$ 28.900.0002017 - 12.345 kmMAZDA 2 TOURING MECANICOQuinta Mutis, Barrios Unidoshace 5 días https://www.olx.com.co/item/mazda-2-touring-mecanico-iid-1116859392

Nota:

Se identificaron siete observaciones que superan el criterio de referencia de la distancia de Cook. Entre ellas, las observaciones 276 y 295 presentan la mayor influencia potencial sobre las estimaciones. Tras revisar sus características, se encontraron posibles inconsistencias en el precio de la observación 276 y en el año del modelo de la observación 295. Sin embargo, al no contar con evidencia suficiente para confirmar errores en los registros, se decidió conservar las observaciones y mantener la muestra original.

MAE:

# Crear vector para almacenar predicciones del Modelo Múltiple 2
pred_multiple2_c_cv = rep(NA, nrow(datos_mazda2))

Estimar el modelo en cada parte:

# Validación cruzada de cinco particiones: Modelo Múltiple 2 centrado

for (i in 1:5) {

  # Separar datos de entrenamiento y validación
  train = datos_mazda2[folds != i, ]
  test = datos_mazda2[folds == i, ]

  # Transformar las variables
  train$y_log = log(train$precio)
  test$y_log = log(test$precio)

  train$x_modelo_log = train$modelo
  test$x_modelo_log = test$modelo

  train$x_kilometraje_log = log1p(train$kilometraje)
  test$x_kilometraje_log = log1p(test$kilometraje)

  train$x_transmision = factor(
    train$transmision,
    levels = c("Automática", "Mecánica")
  )

  test$x_transmision = factor(
    test$transmision,
    levels = c("Automática", "Mecánica")
  )

  # Centrar usando únicamente los datos de entrenamiento
  media_modelo = mean(train$x_modelo_log)
  media_kilometraje = mean(train$x_kilometraje_log)

  train$x_modelo_c = train$x_modelo_log - media_modelo
  test$x_modelo_c = test$x_modelo_log - media_modelo

  train$x_kilometraje_c = train$x_kilometraje_log - media_kilometraje
  test$x_kilometraje_c = test$x_kilometraje_log - media_kilometraje

  # Estimar el modelo con interacción
  modelo_cv = lm(
    y_log ~ x_modelo_c + x_kilometraje_c +
      x_transmision + x_modelo_c:x_kilometraje_c,
    data = train
  )

  # Predecir y convertir las predicciones a pesos
  pred_multiple2_c_cv[folds == i] =
    exp(predict(modelo_cv, newdata = test))
}

Se calcula el MAE

# Calcular el error absoluto medio (MAE)
mae_multiple2_c_cv = mean(
  abs(datos_mazda2$precio - pred_multiple2_c_cv),
  na.rm = TRUE
)

# Mostrar resultado
mae_multiple2_c_cv
## [1] 4160432

Interpretación MAE:

En promedio, las predicciones del modelo se desvían aproximadamente $4,16 millones del precio anunciado real de los vehículos.

Comparación de los dos modelos múltiples según el MAE:

Al comparar los resultados de la validación cruzada de cinco particiones, se observa que el Modelo Múltiple 2 transformado y centrado obtuvo un MAE de $4.160.432 COP, inferior al del modelo sin transformaciones, que fue de $4.183.291 COP. Esto representa una reducción del error absoluto medio de $22.859 COP (0,55 %). Por tanto, la transformación de las variables mejora ligeramente la capacidad predictiva del modelo; sin embargo, la diferencia entre ambos resultados es pequeña, lo que indica que su desempeño predictivo es muy similar.

MAE del modelo de referencia (mediana):

# Modelo de referencia: predecir la mediana del entrenamiento

pred_mediana_cv = rep(NA, nrow(datos_mazda2))

for (i in 1:5) {

  # Separar entrenamiento y validación
  train = datos_mazda2[folds != i, ]
  test = datos_mazda2[folds == i, ]

  # Calcular la mediana únicamente con entrenamiento
  mediana_train = median(train$precio)

  # Predecir la mediana para las observaciones de validación
  pred_mediana_cv[folds == i] = mediana_train
}

# Calcular MAE de referencia
mae_mediana_cv = mean(
  abs(datos_mazda2$precio - pred_mediana_cv)
)

# Mostrar resultado
mae_mediana_cv
## [1] 14872201

Tabla comparativa de modelos:

# Tabla comparativa del desempeño predictivo

comparacion_mae = data.frame(
  Modelo = c(
    "Simple 1: Año del modelo",
    "Simple 2: Kilometraje",
    "Simple 3: Transmisión",
    "Múltiple 1: Original",
    "Múltiple 1: Logarítmico",
    "Múltiple 2: Original",
    "Múltiple 2: Logarítmico y centrado",
    "Referencia: Mediana"
  ),

  MAE_COP = c(
    mae1_cv,
    mae2_cv,
    mae3_cv,
    mae_multiple1_original_cv,
    mae_multiple1_log_cv,
    mae_multiple2_original_cv,
    mae_multiple2_c_cv,
    mae_mediana_cv
  )
)

# Calcular reducción porcentual frente al modelo de referencia
comparacion_mae$Reduccion_error = (
  1 - comparacion_mae$MAE_COP / mae_mediana_cv
) * 100

# Ordenar modelos de menor a mayor MAE
comparacion_mae = comparacion_mae[
  order(comparacion_mae$MAE_COP), ]

# Asignar posición según desempeño predictivo
comparacion_mae$Posicion = 
  seq_len(nrow(comparacion_mae))

# Redondear reducción porcentual
comparacion_mae$Reduccion_error = round(
  comparacion_mae$Reduccion_error, 2
)

# Crear tabla de presentación
tabla_final = data.frame(
  Posicion = comparacion_mae$Posicion,
  Modelo = comparacion_mae$Modelo,
  `MAE (COP)` = format(
    round(comparacion_mae$MAE_COP, 0),
    big.mark = ".",
    decimal.mark = ",",
    scientific = FALSE
  ),
  `Reducción del error (%)` = paste0(
    format(
      comparacion_mae$Reduccion_error,
      decimal.mark = ",",
      nsmall = 2
    ), "%"
  ),
  check.names = FALSE
)

# Presentar tabla profesional
knitr::kable(
  tabla_final,
  format = "html",
  caption = "Comparación del desempeño predictivo mediante validación cruzada de cinco particiones",
  align = c("c", "l", "r", "r"),
  row.names = FALSE
)
Comparación del desempeño predictivo mediante validación cruzada de cinco particiones
Posicion Modelo MAE (COP) Reducción del error (%)
1 Múltiple 2: Logarítmico y centrado 4.160.432 72,03%
2 Múltiple 2: Original 4.183.291 71,87%
3 Múltiple 1: Logarítmico 4.256.822 71,38%
4 Múltiple 1: Original 4.565.883 69,30%
5 Simple 1: Año del modelo 4.837.525 67,47%
6 Simple 2: Kilometraje 9.214.972 38,04%
7 Simple 3: Transmisión 14.682.009 1,28%
8 Referencia: Mediana 14.872.201 0,00%

Mejor modelo: el Modelo Múltiple 2 logarítmico y centrado obtiene el menor MAE, de $4.160.432 COP, con una reducción del error del 72,03 % frente al modelo de referencia.

Efecto de las transformaciones: en ambos modelos múltiples, la transformación mejora ligeramente la capacidad predictiva. El Modelo Múltiple 2 transformado reduce el MAE en $22.859 COP respecto a su versión original.

Modelos simples: el modelo basado en el año del vehículo presenta el mejor resultado (MAE de $4.837.525 COP), mientras que el de transmisión registra el mayor error entre las regresiones ($14.682.009 COP).

Modelo de referencia: predecir siempre la mediana genera un MAE de $14.872.201 COP. Todos los modelos de regresión superan esta referencia, aunque el modelo simple de transmisión apenas consigue una reducción del 1,28 %.

Conclusión: el Modelo Múltiple 2 logarítmico y centrado presenta el mejor desempeño predictivo, seguido muy de cerca por el Modelo Múltiple 2 original y el Modelo Múltiple 1 logarítmico. Sin embargo, las diferencias entre estos tres modelos son pequeñas, por lo que la selección definitiva también debe considerar la significancia estadística, la interpretación de los coeficientes y el cumplimiento de los supuestos econométricos.

Comparación AIC:

# Comparación del AIC entre modelos múltiples
# Solo se comparan modelos con la misma escala de respuesta

# AIC de los modelos con precio original
aic_original = c(
  AIC(mod_multiple1_step),
  AIC(mod_multiple2_interaccion_step)
)

# AIC de los modelos con logaritmo del precio
aic_log = c(
  AIC(mod_multiple1_log),
  AIC(mod_multiple2_c)
)

# Construir tabla comparativa
comparacion_aic = data.frame(
  Escala = c(
    "Precio original",
    "Precio original",
    "Logaritmo del precio",
    "Logaritmo del precio"
  ),

  Modelo = c(
    "Múltiple 1 original",
    "Múltiple 2 original",
    "Múltiple 1 logarítmico",
    "Múltiple 2 logarítmico y centrado"
  ),

  AIC = c(aic_original, aic_log)
)

# Calcular diferencia de AIC dentro de cada escala
comparacion_aic$Diferencia_AIC = c(
  aic_original - min(aic_original),
  aic_log - min(aic_log)
)

# Redondear resultados
comparacion_aic$AIC = round(comparacion_aic$AIC, 2)
comparacion_aic$Diferencia_AIC = round(
  comparacion_aic$Diferencia_AIC, 2
)

# Presentar tabla
knitr::kable(
  comparacion_aic,
  caption = "Comparación del criterio de información de Akaike (AIC)",
  col.names = c(
    "Escala de respuesta",
    "Modelo",
    "AIC",
    "Diferencia de AIC"
  ),
  row.names = FALSE
)
Comparación del criterio de información de Akaike (AIC)
Escala de respuesta Modelo AIC Diferencia de AIC
Precio original Múltiple 1 original 10628.89 32.90
Precio original Múltiple 2 original 10595.99 0.00
Logaritmo del precio Múltiple 1 logarítmico -178.66 0.32
Logaritmo del precio Múltiple 2 logarítmico y centrado -178.98 0.00

Precio original: el Modelo Múltiple 2 presenta el menor AIC (10.595,99), frente a 10.628,89 del Modelo Múltiple 1. La diferencia de 32,90 puntos favorece al Modelo Múltiple 2.

Logaritmo del precio: el Modelo Múltiple 2 logarítmico y centrado presenta el menor AIC (-178,98), frente a -178,66 del Modelo Múltiple 1 logarítmico. Sin embargo, la diferencia de apenas 0,32 puntos indica que ambos modelos tienen un respaldo prácticamente equivalente según este criterio.

Selección del modelo REVISAR

Selección del modelo múltiple definitivo

A partir de la comparación de los resultados, se selecciona el Modelo Múltiple 1 logarítmico para realizar las predicciones. Aunque el Modelo Múltiple 2 logarítmico y centrado presenta un MAE ligeramente inferior ($4.160.432 COP frente a $4.256.822 COP), la diferencia es de apenas $96.390 COP (2,26 %), por lo que su ventaja predictiva es reducida. Asimismo, ambos modelos presentan valores de R² ajustado muy similares: 75,45 % para el Modelo 1 y 75,56 % para el Modelo 2. La comparación del AIC también evidencia un respaldo prácticamente equivalente, con valores de -178,66 y -178,98, respectivamente, y una diferencia de apenas 0,32 puntos.

Se prioriza el Modelo Múltiple 1 logarítmico porque presenta una especificación más sencilla, sin incorporar el término de interacción entre año del vehículo y kilometraje, el cual no resultó estadísticamente significativo en el Modelo 2 (p = 0,1045). Además, en el Modelo 1, el año del vehículo y la transmisión mantienen significancia estadística, mientras que el kilometraje no presenta evidencia de un efecto individual significativo (p = 0,2629). Por tanto, incorporar una interacción adicional no representa una mejora sustancial que justifique la mayor complejidad del segundo modelo.

Verificar los rangos de las variables del modelo:

# Verificar rangos de las variables del modelo

summary(datos_mazda2$modelo)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2007    2011    2014    2015    2018    2022
summary(datos_mazda2$kilometraje)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0   39500   79000   75035  107500  200000
# Verificar categorías de transmisión
table(datos_mazda2$transmision)
## 
## Automática   Mecánica 
##        170        139
# Verificar valores de los dos escenarios
escenarios = data.frame(
  Escenario = c("Mazda2 reciente", "Mazda2 antiguo"),
  Modelo = c(2020, 2012),
  Kilometraje = c(35000, 100000),
  Transmision = c("Automática", "Mecánica")
)

escenarios
Escenario Modelo Kilometraje Transmision
Mazda2 reciente 2020 35000 Automática
Mazda2 antiguo 2012 100000 Mecánica

Escenarios hipotéticos:

# ==========================================================
# ESCENARIOS HIPOTÉTICOS: PREDICCIONES E INTERVALOS DEL 95 %
# Modelo Múltiple 1 logarítmico
# ==========================================================

# 1. Definir los dos escenarios
escenarios = data.frame(
  Escenario = c("Mazda2 reciente", "Mazda2 antiguo"),
  modelo = c(2020, 2012),
  kilometraje = c(35000, 100000),
  transmision = factor(
    c("Automática", "Mecánica"),
    levels = c("Automática", "Mecánica")
  )
)

# 2. Calcular predicciones e intervalos de predicción del 95 %
predicciones_log = predict(
  mod_multiple1_log,
  newdata = escenarios,
  interval = "prediction",
  level = 0.95
)

# 3. Transformar los resultados a pesos colombianos
predicciones_pesos = exp(predicciones_log)

# 4. Construir tabla de resultados
resultados_escenarios = data.frame(
  Escenario = escenarios$Escenario,
  Modelo = escenarios$modelo,
  Kilometraje = escenarios$kilometraje,
  Transmision = escenarios$transmision,
  Precio_estimado = predicciones_pesos[, "fit"],
  Limite_inferior_95 = predicciones_pesos[, "lwr"],
  Limite_superior_95 = predicciones_pesos[, "upr"]
)

# 5. Mostrar resultados en pesos colombianos
resultados_escenarios$Precio_estimado = round(
  resultados_escenarios$Precio_estimado, 0
)

resultados_escenarios$Limite_inferior_95 = round(
  resultados_escenarios$Limite_inferior_95, 0
)

resultados_escenarios$Limite_superior_95 = round(
  resultados_escenarios$Limite_superior_95, 0
)

resultados_escenarios
Escenario Modelo Kilometraje Transmision Precio_estimado Limite_inferior_95 Limite_superior_95
Mazda2 reciente 2020 35000 Automática 69918185 49030348 99704625
Mazda2 antiguo 2012 100000 Mecánica 36029525 25273518 51363118

Interpretación escenario 1:

El modelo estima que un Mazda2 modelo 2020, con 35.000 kilómetros y transmisión automática, tendría un precio anunciado aproximado de $69,9 millones COP. Para una observación individual con estas características, el intervalo de predicción del 95 % se encuentra entre $49,03 y $99,70 millones COP.

Interpretación escenario 2:

Para un Mazda2 modelo 2012, con 100.000 kilómetros y transmisión mecánica, el precio anunciado estimado es de $36,03 millones COP. Su intervalo de predicción del 95 % se ubica entre $25,27 y $51,36 millones COP.

Al comparar ambos escenarios, se observa una diferencia de aproximadamente $33,89 millones COP en los precios estimados. Esto evidencia que las características del vehículo consideradas por el modelo permiten obtener estimaciones diferenciadas de los precios anunciados. No obstante, los intervalos de predicción presentan una ligera superposición, lo que refleja la incertidumbre asociada a la predicción de precios individuales.

Análisis crítico

¿Quién utilizaría el modelo y para qué decisión?

El modelo podría ser utilizado por compradores y vendedores de vehículos usados, concesionarios y plataformas de comercialización de automóviles como una herramienta de referencia para estimar precios anunciados de Mazda2 en Colombia. Para los vendedores, permitiría establecer un precio inicial de publicación considerando el año del vehículo, su kilometraje y tipo de transmisión. Para los compradores, serviría como punto de comparación al evaluar si el precio solicitado por un vehículo es razonable frente a sus características.

¿Qué significa su error de predicción en la práctica? ¿Sería aceptable?

El modelo seleccionado presenta un error absoluto medio (MAE) de $4.256.822 COP, lo que significa que sus predicciones se desvían, en promedio, aproximadamente $4,26 millones de los precios anunciados observados en la validación cruzada. Aunque este error representa una reducción del 71,38 % frente al modelo de referencia basado en la mediana ($14.872.201 COP), su magnitud sigue siendo relevante al tratarse de una decisión de compra o venta de un vehículo.

Por tanto, el modelo puede considerarse aceptable como herramienta de orientación y comparación inicial.

¿Qué consecuencias tendría sobreestimar o subestimar?

Una sobreestimación del precio podría llevar a los vendedores a publicar sus vehículos por encima de su valor competitivo, reduciendo las posibilidades de venta. Para los compradores, podría generar la percepción de que un vehículo tiene un precio justo cuando realmente está sobrevalorado.

Por otro lado, una subestimación podría ocasionar que los vendedores pierdan ingresos al aceptar precios inferiores a los que podrían obtener en el mercado. Para los compradores, podría representar una oportunidad de negociación, aunque también podría llevarlos a desconfiar de vehículos cuyo precio sea considerablemente inferior al estimado.

¿Cuáles son sus principales limitaciones y cuándo no debería utilizarse?

Inicialmente, la base contiene 309 anuncios de OLX y representa precios publicados, no necesariamente precios finales de transacción. Por tanto, las estimaciones no garantizan el valor efectivo al que se venderá un vehículo.

Además, el modelo considera únicamente el año, el kilometraje y la transmisión, dejando por fuera características relevantes como el estado mecánico, los antecedentes de accidentes, el mantenimiento, la versión del vehículo, los accesorios y las condiciones específicas de cada ciudad.

Adicionalmente, los diagnósticos muestran que los residuos no siguen una distribución normal (Shapiro-Wilk, p < 0,001) y que persisten indicios de una posible especificación funcional incorrecta (RESET, p = 0,008287). Aunque no se encontró evidencia de heterocedasticidad (Breusch-Pagan, p = 0,1658) ni de multicolinealidad preocupante (VIF inferiores a 5), se identificaron seis observaciones potencialmente influyentes según el criterio de Cook. La observación 276 presentó la mayor influencia, con una distancia de Cook de 0,9231.

Por estas razones, el modelo no debería utilizarse como único criterio para fijar precios, realizar avalúos oficiales, aprobar créditos o tomar decisiones de compra de alto valor sin una inspección adicional. Tampoco debería aplicarse automáticamente a otros modelos Mazda, otras marcas o vehículos cuyas características estén fuera de los rangos observados en la muestra.

¿Recomendaría aplicarlo? ¿Qué información adicional necesitaría?

Se recomienda aplicar el modelo como una herramienta complementaria de orientación para estimar precios anunciados de vehículos Mazda2 usados en Colombia, debido a que presenta un R² ajustado de 75,45 % y un MAE de $4.256.822 COP, inferior al error del modelo de referencia. Sin embargo, su utilización debe acompañarse de una evaluación individual de cada vehículo y no debe interpretarse como una estimación exacta de su precio de mercado.

Sería muy útil obtener información adicional sobre el estado mecánico y estético, los antecedentes de accidentes, el historial de mantenimiento, los accesorios y la ubicación geográfica. También sería importante contar con precios efectivos de compraventa y fechas de publicación de los anuncios, con el propósito de analizar la evolución de los precios y evaluar el desempeño del modelo con información más reciente.